public/New-MoodleCourseCategory.ps1

<#
.SYNOPSIS
Creates a new Moodle course category.
 
.PARAMETER Name
Specifies the name of the new course catgeory.
 
.PARAMETER Description
Specifies the description of the new course catgeory.
 
.PARAMETER DescriptionFormat
Specifies the format of the given description.
 
.PARAMETER Parent
Specifies the parent course category to which the course category should be added.
 
.PARAMETER ParentId
Specifies the ID of the parent course category to which the course category should be added.
 
.PARAMETER Theme
Specifies the theme for this course catgeory.
 
.PARAMETER IdNumber
Specifies a new free-text ID Number for the course catgeory.
 
.EXAMPLE
New-MoodleCourseCatgeory -ParentId 1 -Name 'My Subcatgeory' -Description 'A subcategory of category 1!'
 
#>

function New-MoodleCourseCategory {
    # [OutputType([MoodleCourseCategory])]
    [CmdletBinding(SupportsShouldProcess)]
    param (
        [Parameter(Mandatory)]
        [string] $Name,
        
        [string] $Description,
        [MoodleDescriptionFormat] $DescriptionFormat = [MoodleDescriptionFormat]::HTML,
        
        [Parameter(Mandatory,ValueFromPipeline,ParameterSetName='parent')]
        [MoodleCourseCategory]
        $Parent,
        
        [Parameter(ParameterSetName='parentid')]
        [int]
        $ParentId = 0,

        [string] $Theme,

        [string] $IdNumber
    )

    Begin {
        $Url = $PsCmdlet.SessionState.PSVariable.GetValue("_MoodleUrl")
        $Token = $PsCmdlet.SessionState.PSVariable.GetValue("_MoodleToken")
        
        if (!$Url -or !$Token) {
            Throw "You must call the Connect-Moodle cmdlet before calling any other cmdlets."
        }

        $function = 'core_course_create_categories'
        $path = "/webservice/rest/server.php?wstoken=$Token&wsfunction=$function&moodlewsrestformat=json"
    }

    Process {
        if ($Parent) {
            $ParentId = $Parent.Id
        }

        $body = @{
            'categories[0][name]' = $Name
            'categories[0][description]' = $Description
            'categories[0][descriptionformat]' = [int]$DescriptionFormat
            'categories[0][parent]' = $ParentId
            'categories[0][theme]' = $Theme
            'categories[0][idnumber]' = $IdNumber
        }

        if ($PSCmdlet.ShouldProcess($UserName, "Create")) {
            $results = Invoke-RestMethod -Method Post -Uri ([uri]::new($Url, $path)) -Body $body -ContentType 'application/x-www-form-urlencoded' 

            if ($results) {
                if ($results.errorcode) {
                    Write-Error $results.message
                    return
                }

                $results | Foreach-Object { 
                    New-Object -TypeName MoodleCourseCategory -Property @{
                        Id=$_.id 
                        Name=$_.name
                        # that's all we get from the web service - populate the rest from the params
                        IdNumber = $IdNumber
                        Description = $Description
                        DescriptionFormat = $Descriptionformat
                        Parent=$ParentId
                        Visible = $true
                    } 
                }
            }
        }
    }
}