Private/Invoke-NBRestMethod.ps1

function Invoke-NBRestMethod {
    [CmdletBinding()]
    param(
        [Parameter(Mandatory)]
        [string]$ObjectType,

        [Parameter()]
        [int]$ID,

        [Parameter(Mandatory)]
        [Microsoft.PowerShell.Commands.WebRequestMethod]$Method,

        [Parameter()]
        [hashtable]$Body,

        [Parameter()]
        [hashtable]$Filter
    )

    $config = Get-NBServerConfig

    $scheme = if ($config.UseInsecureHttp) { 'http' } else { 'https' }
    $baseUrl = "${scheme}://$($config.Host)/api/$ObjectType/"

    if ($ID) {
        $baseUrl = "${baseUrl}${ID}/"
    }

    if ($Filter -and $Filter.Count -gt 0) {
        $queryParts = foreach ($key in $Filter.Keys) {
            $encodedKey = [System.Uri]::EscapeDataString($key)
            $encodedValue = [System.Uri]::EscapeDataString($Filter[$key])
            "${encodedKey}=${encodedValue}"
        }
        $baseUrl = "${baseUrl}?$($queryParts -join '&')"
    }

    $params = @{
        Uri         = $baseUrl
        Method      = $Method
        Headers     = @{ Authorization = "Token $($config.APIToken)" }
        ContentType = 'application/json'
        ErrorAction = 'Stop'
    }

    if ($config.IgnoreCertErrors) {
        $params['SkipCertificateCheck'] = $true
    }

    if ($Body) {
        $params['Body'] = $Body | ConvertTo-Json -Depth 20
    }

    $response = Invoke-RestMethod @params

    # Handle pagination for GET requests
    if ($Method -eq 'Get' -and $response.PSObject.Properties.Name -contains 'results') {
        $allResults = [System.Collections.Generic.List[object]]::new()
        $allResults.AddRange([object[]]$response.results)

        $nextUrl = $response.next
        while ($nextUrl) {
            $nextParams = @{
                Uri         = $nextUrl
                Method      = 'Get'
                Headers     = @{ Authorization = "Token $($config.APIToken)" }
                ContentType = 'application/json'
                ErrorAction = 'Stop'
            }
            if ($config.IgnoreCertErrors) {
                $nextParams['SkipCertificateCheck'] = $true
            }
            $response = Invoke-RestMethod @nextParams
            $allResults.AddRange([object[]]$response.results)
            $nextUrl = $response.next
        }

        return $allResults
    }

    return $response
}