public/New-ICUser.ps1

function New-IcUser {
    [CmdletBinding(SupportsShouldProcess)]
    param (
        [Parameter(Mandatory, ValueFromPipelineByPropertyName)]
        [string] $FirstName,
        
        [Parameter(Mandatory, ValueFromPipelineByPropertyName)]
        [string] $LastName,
        
        [Parameter(Mandatory, ValueFromPipelineByPropertyName)]
        [string] $EmailAddress,

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

        [Parameter(ValueFromPipelineByPropertyName)]
        [string] $AssignedGroup,
        
        [Parameter(ValueFromPipelineByPropertyName)]
        [int] $Rank,
        
        [Parameter(ValueFromPipelineByPropertyName)]
        [string] $Country,
        
        [Parameter(ValueFromPipelineByPropertyName)]
        [string] $TimeZone,
        
        [Parameter(ValueFromPipelineByPropertyName)]
        [string] $Role,
        
        [Parameter(ValueFromPipelineByPropertyName)]
        [string] $TeamId,

        [Parameter(ValueFromPipelineByPropertyName)]
        [datetime] $HireDate,
        
        [Parameter(Mandatory, ValueFromPipelineByPropertyName)]
        [string] $Username,

        [Parameter(ValueFromPipelineByPropertyName)]
        [string] $ExternalIdentity 
    )

    Begin {
        $url = $Script:_IcUri
        $token = $Script:_IcToken
        
        if (!$url -or !$token) {
            Throw "You must call the Connect-IC cmdlet before calling any other cmdlets."
        }

        $headers = @{
            Authorization = "Bearer $token"
            Accept = 'application/json'
        }
    }

    Process {
        $user = @{
            firstName = $FirstName
            lastName = $LastName
            emailAddress = $EmailAddress
            mobileNumber = $MobileNumber
            assignedGroup = $AssignedGroup
            rank = $Rank
            country = $Country
            timeZone = $TimeZone
            role = $Role
            teamId = $TeamId
            hireDate = $HireDate
            userName = $Username
            externalIdentity = $ExternalIdentity
        }

        # strip out all the properties that weren't provided as parameters
        $k = @($user.Keys)
        $k | ForEach-Object {
            if (-not $PSBoundParameters.ContainsKey($_)) {
                $user.Remove($_)
            }
        }

        $path = "/user-management/v1/users"
        $uri = [uri]::new($url, $path)

        ConvertTo-Json $user

        if ($PSCmdlet.ShouldProcess($Username, "Adding user")) {
            Invoke-RestMethod -Method Post -Uri $uri -Headers $headers -Body (ConvertTo-Json $user) -ContentType 'application/json' 
        }
     }
}