Private/CP/Invoke-CPPaginatedGet.ps1

function Invoke-CPPaginatedGet {
    [CmdletBinding()]
    param(
        [Parameter(Mandatory)]
        [String]$ResourcePath,

        [Hashtable]$QueryParameters = @{},

        [String]$ItemPropertyName,

        [ValidateRange(1, 100)]
        [Int]$PageSize = 100,

        [Nullable[int]]$PageNumber,

        [System.Management.Automation.PSCmdlet]$CallerPSCmdlet,

        [System.Management.Automation.InvocationInfo]$Command
    )

    $headers = New-CPHeader -Auth $Script:CPAuth -Method GET
    $enableDebugLogging = $DebugPreference -ne 'SilentlyContinue'
    $results = New-Object System.Collections.Generic.List[object]
    $currentPage = if ($PageNumber) { [int]$PageNumber } else { 1 }
    $singlePage = $null -ne $PageNumber -and $PageNumber -gt 0
    $nextUri = $null

    do {
        $query = @{} + $QueryParameters
        $query['pageNumber'] = $currentPage
        $query['pageSize'] = $PageSize

        $uri = if ($nextUri) {
            $nextUri
        }
        else {
            Join-CPUri -PortalUrl $Script:CPAuth.PortalUrl -ResourcePath $ResourcePath -QueryString (New-CPQueryString -Parameters $query)
        }

        if ($Command) {
            Resolve-CPDebugInfo -Url $uri -Headers $headers -Command $Command
        }

        $response = Invoke-CPRestMethod -Uri $uri -Method GET -Headers $headers -Auth $Script:CPAuth `
            -CallerPSCmdlet $CallerPSCmdlet -EnableDebugLogging:$enableDebugLogging

        $page = Get-CPResponseItems -Response $response -ItemPropertyName $ItemPropertyName
        foreach ($item in $page.Items) {
            $results.Add($item)
        }

        if ($singlePage) {
            break
        }

        $nextUri = $null
        if ($page.Next -and $page.Next -match '^https?://') {
            $nextUri = $page.Next
        }
        elseif ($page.HasMore) {
            $currentPage++
        }
        else {
            break
        }
    }
    while ($true)

    return @($results.ToArray())
}