public/Set-MoodleCourseCategory.ps1

<#
.SYNOPSIS
Updates a Moodle course category.
 
.PARAMETER Id
Specifies the unique ID of the course category to update.
 
.PARAMETER Category
Specifies the course category to update.
 
.PARAMETER Name
Specifies the name of the course category.
 
.PARAMETER Description
Specifies the description of the course category.
 
.PARAMETER DescriptionFormat
Specifies the format of the given description.
 
.PARAMETER Parent
Specifies the unique id of the parent category.
 
.PARAMETER Theme
Specifies the theme of the course category.
 
.PARAMETER IdNumber
Specifies a free-text ID Number for the course category.
 
.EXAMPLE
Set-MoodleCourseCategory -Id 1 -Name 'My Category' -Description 'Just a category!'
 
Updates course category #1's name and description.
#>

function Set-MoodleCourseCategory {
    [CmdletBinding(SupportsShouldProcess)]
    param (
        [Parameter(Mandatory,ParameterSetName='id',ValueFromPipelineByPropertyName)]
        [int] $Id,

        [Parameter(Mandatory,ParameterSetName='category',ValueFromPipeline)]
        [MoodleCourseCategory] $Category,

        [Parameter(Mandatory,ValueFromPipelineByPropertyName)]
        [string] $Name,

        [Parameter(ValueFromPipelineByPropertyName)]
        [string] $Description,

        [Parameter(ValueFromPipelineByPropertyName)]
        [MoodleDescriptionFormat] $DescriptionFormat,

        [Parameter(ValueFromPipelineByPropertyName)]
        [Alias('ParentId')]
        [int] $Parent,

        [Parameter(ValueFromPipelineByPropertyName)]
        [string] $Theme,

        [Parameter(ValueFromPipelineByPropertyName)]
        [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_update_categories'
        $path = "webservice/rest/server.php?wstoken=$Token&wsfunction=$function&moodlewsrestformat=json"
    }

    Process {
        if ($Category) {
            $Id = $Category.Id
        }

        $params = @{
            name = $Name
            idnumber = $IdNumber
            description = $Description
            descriptionformat = [int]$DescriptionFormat
            parent = $Parent
            theme = $Theme
        }

        $body = @{
            'categories[0][id]' = $Id
        }

        foreach ($key in $params.Keys) {
            if ($PSBoundParameters.ContainsKey($key)) {
                $body["categories[0][$key]"] = $params[$key]
            }
        }

        if ($PSCmdlet.ShouldProcess($Id, "Update")) {
            $result = Invoke-RestMethod -Method Post -Uri ([uri]::new($Url, $path)) -Body $body -ContentType 'application/x-www-form-urlencoded' 
            if ($result.errorcode) {
                Write-Error $result.message
            }
        }
    }
}