Public/Get-3CXResult.ps1

function Get-3CXResult {
    [CmdletBinding()]
    param(

        [Parameter(Mandatory=$True, ParameterSetName="Simple")]
        [Parameter(Mandatory=$True, ParameterSetName="Paginate")]
        [string]$Endpoint,

        [Parameter(Mandatory=$False, ParameterSetName="Simple")]
        [Parameter(Mandatory=$False, ParameterSetName="Paginate")]
        [object]$Body = $null,

        [Parameter(Mandatory=$False, ParameterSetName="Simple")]
        [string]$Method = 'GET',
        
        [Parameter(Mandatory=$True, ParameterSetName="Paginate")]
        [switch]$Paginate,

        [Parameter(Mandatory=$False, ParameterSetName="Paginate")]
        [int]$PageSize = 50,
        
        [Parameter(Mandatory=$False, ParameterSetName="Paginate")]
        [string]$PageFilter = '',

        [Parameter(Mandatory=$False, ParameterSetName="Paginate")]
        [string]$PageOrderBy = '',

        [Parameter(Mandatory=$False, ParameterSetName="Paginate")]
        [string]$PageSelect = '',
        
        [Parameter(Mandatory=$False, ParameterSetName="Paginate")]
        [string]$PageExpand = ''
    )

    if($null -eq $script:3CXSession){
        throw "3CX session not established - Please run Connect-3CX"
    }

    switch($PSCmdlet.ParameterSetName){

        "Simple" {
            $params = @{
                Uri = ("https://{0}:{1}{2}" -f $script:3CXSession.APIHost, $script:3CXSession.APIPort, $Endpoint)
                Method = $Method
                Headers = @{
                    Authorization = "Bearer $($script:3CXSession.AccessToken)"
                } 
                Body = $Body
            }
            Write-Debug "Parameter $($params | ConvertTo-Json)"

            $result = Invoke-WebRequest @params 
            Write-Debug "Raw Content Result $($result.Content)"

            return ($result.Content | ConvertFrom-Json)
        }

        "Paginate" {

            $targetCount = -1
            $values = New-Object Collections.Generic.List[object]

            while($targetCount -le 0 -or $values.Count -lt $targetCount){
                Write-Verbose "Retrieving SIP Devices from Top $PageSize and Skip $($values.Count)"
                $body = @{
                    '$top' = $PageSize
                    '$skip' = $values.Count
                    '$count' = 'true'
                    '$orderby' = $PageOrderBy
                }
                
                if(-not [string]::IsNullOrEmpty($PageFilter)){
                    $body.'$filter' = $PageFilter
                }

                if(-not [string]::IsNullOrEmpty($PageExpand)){
                    $body.'$expand' = $PageExpand
                }
                
                if(-not [string]::IsNullOrEmpty($PageSelect)){
                    $body.'$select' = $PageSelect
                }
                
                $result =  Get-3CXResult -Endpoint $Endpoint -Body $body
                $targetCount = $result.'@odata.count'
                $result.value | ForEach-Object {$values.Add($_)}
            }
            
            return $values
        }
    }
}