public/Set-CTUserRole.ps1

function Set-CTUserRole {
    [CmdletBinding(SupportsShouldProcess)]
    param (
        [Parameter(Mandatory, Position=0, ValueFromPipelineByPropertyName)]
        [int] $UserId,

        [Parameter(Mandatory, Position=1, ValueFromPipelineByPropertyName)]
        [int] $RoleId,

        [Parameter(Mandatory, Position=2, ValueFromPipelineByPropertyName)]
        [Alias('Default')]
        [Alias('IsDefault')]
        [bool] $DefaultRole,

        [switch] $PassThru
    )

    begin {
        $url = $Script:_ctUri
        $token = $Script:_ctApiCode
        
        if (!$url -or !$token) {
            throw 'You must call the Connect-CT cmdlet before calling any other cmdlets.'
        }
    
        $headers = @{
            ApiCode = $token
        }

        if ($Script:_ctTimetableId) {
            $headers.TimetableId = $Script:_ctTimetableId
        }
    }

    process {
        $path = "/api/user-roles/$UserId-$RoleId"

        $uri = [uri]::new($url, $path)
        
        $body = [PSCustomObject]@{
            userId = $UserId
            roleId = $RoleId
            defaultRole = $DefaultRole
        }

        if ($PSCmdlet.ShouldProcess("$UserId-$RoleId", 'Update user role.')) {
            Invoke-RestMethod -Uri $uri -Headers $headers -Method Put -Body (ConvertTo-Json $body) -ContentType 'application/json' | Out-Null
        }
        
        if ($PassThru) {
            return $body
        }
    }
}