Pax8API/Private/New-Pax8RequestUri.ps1

function New-Pax8RequestUri {
    [CmdletBinding()]
    param (
        [Parameter(Mandatory)]
        [pscustomobject]$Operation,

        [Parameter(Mandatory)]
        [hashtable]$Parameters
    )

    $serverUrl = [string]$Operation.ServerUrl
    if ($script:Pax8Session.BaseUri) {
        $serverUrl = $serverUrl -replace '^https://api\.pax8\.com', ([string]$script:Pax8Session.BaseUri).TrimEnd('/')
    }

    $path = [string]$Operation.Path
    foreach ($parameter in @($Operation.Parameters | Where-Object In -eq 'path')) {
        $parameterName = [string]$parameter.ParameterName
        if (-not $Parameters.ContainsKey($parameterName) -or $null -eq $Parameters[$parameterName]) {
            throw "Missing required path parameter '$parameterName' for $($Operation.CommandName)."
        }

        $encoded = [System.Uri]::EscapeDataString([string](ConvertTo-Pax8WireValue -Value $Parameters[$parameterName]))
        $path = $path.Replace("{$($parameter.WireName)}", $encoded)
    }

    $queryPairs = [System.Collections.Generic.List[string]]::new()
    foreach ($parameter in @($Operation.Parameters | Where-Object In -eq 'query')) {
        $parameterName = [string]$parameter.ParameterName
        if (-not $Parameters.ContainsKey($parameterName) -or $null -eq $Parameters[$parameterName]) {
            continue
        }

        $value = ConvertTo-Pax8WireValue -Value $Parameters[$parameterName]
        if ($parameter.WireName -eq 'sort' -and $Parameters.ContainsKey('Direction') -and -not [string]::IsNullOrWhiteSpace([string]$Parameters.Direction) -and [string]$value -notmatch ',') {
            $value = "$value,$($Parameters.Direction)"
        }

        foreach ($item in @($value)) {
            if ($null -eq $item) {
                continue
            }

            $queryPairs.Add(('{0}={1}' -f [System.Uri]::EscapeDataString([string]$parameter.WireName), [System.Uri]::EscapeDataString([string]$item)))
        }
    }

    $uriText = "$($serverUrl.TrimEnd('/'))/$($path.TrimStart('/'))"
    if ($queryPairs.Count -gt 0) {
        $uriText = "$uriText`?$($queryPairs -join '&')"
    }

    [uri]$uriText
}