Private/Get-ZoomPaginatedData.ps1

<#

.SYNOPSIS
Iterate through paginated pages to consolidate data or locate records.

.PARAMETER URI
The full URL that needs to be queried.

.PARAMETER ObjectId
ID used to preform a detailed lookup.

.PARAMETER PageSize
Amount of records to be retried for a single query (1 - 100).

.PARAMETER NextPageToken
Next_Page_Token returned from previous query.

.PARAMETER AdditionalQueryStatements
Allows adding additional URl Query statements.

.EXAMPLE
$AllData = Get-ZoomPaginatedData

.EXAMPLE
$SomeData = Get-ZoomPaginatedData -ObjectId $SpecificIDsToQuery

.EXAMPLE
$RawData = Get-ZoomPaginatedData -PageSize 50 -NextPageToken $reponse.next_page_token

.EXAMPLE
$RawData = Get-ZoomPaginatedData -PageSize 50

.OUTPUTS
Array of objects.

#>


function Get-ZoomPaginatedData {
    [CmdletBinding(DefaultParameterSetName="AllData")]
    param (
        [parameter(ParameterSetName="NextRecords")]
        [parameter(ParameterSetName="AllData")]
        [parameter(ParameterSetName="SelectedRecord")]
        [Parameter(Mandatory = $True)]
        [string]$URI,

        [Parameter(
            ParameterSetName="SelectedRecord",
            Mandatory = $True, 
            Position = 0, 
            ValueFromPipeline = $True,
            ValueFromPipelineByPropertyName = $True
        )]
        [Alias('id')]
        [string[]]$ObjectId,

        [parameter(ParameterSetName="NextRecords")]
        [parameter(ParameterSetName="AllData")]
        [ValidateRange(1, 100)]
        [Alias('page_size')]
        [int]$PageSize = 30,
        
        # The next page token is used to paginate through large result sets. A next page token will be returned whenever the set of available results exceeds the current page size. The expiration period for this token is 15 minutes.
        [parameter(ParameterSetName="NextRecords")]
        [Alias('next_page_token')]
        [string]$NextPageToken,

        [parameter(ParameterSetName="NextRecords")]
        [parameter(ParameterSetName="AllData")]
        [hashtable]$AdditionalQueryStatements

    )
    
    process {

        switch ($PSCmdlet.ParameterSetName) {
        
            "NextRecords" {
        
                $request = [System.UriBuilder]$URI
                $query = [System.Web.HttpUtility]::ParseQueryString([String]::Empty)
                $query.Add('page_size', $PageSize)
                if ($AdditionalQueryStatements) {

                    foreach ($Statement in $AdditionalQueryStatements.GetEnumerator() ) {
    
                        $query.Add($Statement.Name, $Statement.Value)
                    }
                }
                if ($NextPageToken) {
                    $query.Add('next_page_token', $NextPageToken)
                }
                $request.Query = $query.ToString()
                
                $AggregatedResponse = Invoke-ZoomRestMethod -Uri $request.Uri -Method GET -ErrorAction Stop
            }

            "SelectedRecord" {
                $AggregatedResponse = @()
        
                foreach ($id in $ObjectId) {
                    $request = [System.UriBuilder]$URI
                    $request.path = "{0}/{1}" -f $request.path, $id
                    $AggregatedResponse += Invoke-ZoomRestMethod -Uri $request.Uri -Method GET -ErrorAction Stop
                }

            }
            "AllData" {
                $AggregatedResponse = @()
        
                do {
                    $request = [System.UriBuilder]$URI
                    $query = [System.Web.HttpUtility]::ParseQueryString([String]::Empty)
                    $query.Add('page_size', $PageSize)

                    if ($AdditionalQueryStatements) {

                        foreach ($Statement in $AdditionalQueryStatements.GetEnumerator() ) {
    
                            $query.Add($Statement.Name, $Statement.Value)
                        }
                    }

                    if ($response.next_page_token) {
                        $query.Add('next_page_token', $response.next_page_token)
                    }

                    $request.Query = $query.ToString()
                    
                    $response = Invoke-ZoomRestMethod -Uri $request.Uri -Method GET -ErrorAction Stop
            
                    if ($response.total_records -ne 0) {
                        $TargetProperty =  $response.PSobject.Properties.name | Where-Object {($_ -ne "next_page_token") -and ($_ -ne "page_size") -and ($_ -ne "total_records")}
                        $AggregatedResponse += $response | Select-Object -ExpandProperty $TargetProperty
                    }
            
                } until (-not ($response.next_page_token))
            }
        }

        Write-Output $AggregatedResponse
    }
}