public/Get-MoodleCourseCategory.ps1

<#
.SYNOPSIS
Gets a course category.
 
.DESCRIPTION
Gets a course category from the connected Moodle instance.
 
.PARAMETER Id
Specifies the unique ID of a course category.
 
.PARAMETER Name
Specifies the name of a course category to search for.
 
.PARAMETER Parent
Specifies The unique id of the parent course category.
 
.PARAMETER IdNumber
Specifies the free-text ID Number of a course category.
 
.PARAMETER Visible
If specified, only visible course categories are returned.
 
.PARAMETER Recurse
If specified, child course categories are also returned.
 
.EXAMPLE
 
Get-MoodleCourseCategory -Id 1 -Recurse
 
Gets course category #1 and all its child categories.
 
.EXAMPLE
 
PS C:\Get-MoodleCourseCategory -IdNumber foo -Visible
 
Gets visible course categories whose ID Number is 'foo'
#>

function Get-MoodleCourseCategory {
    # [OutputType([MoodleCourseCategory])]
    [CmdletBinding()]
    param (
        [Parameter(Position=0)][int] $Id,
        [string] $Name,
        [int] $Parent,
        [string] $IdNumber,
        [switch][bool] $Visible,
        [switch][bool] $Recurse = $false
    )

    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_get_categories'
    }
    
    Process {
        $path = "/webservice/rest/server.php?wstoken=$Token&wsfunction=$function&moodlewsrestformat=json"
        $path = $path + "&addsubcategories=$(if ($Recurse) { 1 } else { 0 })"

        $params = @{
            id = $Id
            name = $Name
            parent = $Parent
            idnumber = $IdNumber
            visible = if ($Visible) { 1 } else { 0 }
        }

        $index = 0
        foreach ($key in $params.Keys) {
            if ($PSBoundParameters.ContainsKey($key)) {
                $path = $path + "&criteria[$index][key]=$key&criteria[$index][value]=$($params[$key])"
                $index++
            }
        }
        $results = Invoke-RestMethod -Uri ([uri]::new($Url, $path)) 
        $results | ForEach-Object { 
            New-Object -TypeName MoodleCourseCategory -Property @{
                Id = $_.id
                Name = $_.name
                IdNumber = $_.idnumber
                Description = $_.description
                DescriptionFormat = $_.descriptionformat
                Parent = $_.parent
                Visible = $_.visible
            }
        }
    }
}