Private/New-HaloGETRequest.ps1

function New-HaloGETRequest {
    <#
        .SYNOPSIS
            Builds a request for the Halo API.
        .DESCRIPTION
            Wrapper function to build web requests for the Halo API.
        .EXAMPLE
            PS C:\> New-HaloGETRequest -Method "GET" -Resource "/api/Articles"
            Gets all Knowledgebase Articles
        .OUTPUTS
            Outputs an object containing the response from the web request.
    #>

    [CmdletBinding()]
    [OutputType([Object])]
    [Diagnostics.CodeAnalysis.SuppressMessageAttribute('PSUseShouldProcessForStateChangingFunctions', '', Justification = 'Private function - no need to support.')]
    param (
        # The HTTP request method.
        [Parameter(
            Mandatory = $True
        )]
        [String]$Method,
        # The resource to send the request to.
        [Parameter(
            Mandatory = $True
        )]
        [String]$Resource,
        # Returns the Raw result. Useful for file downloads
        [Switch]$RawResult,
        # A hashtable used to build the query string.
        [Hashtable]$QSCollection,
        # Disables auto pagination.
        [Switch]$AutoPaginateOff,
        # The key for the results object.
        [String]$ResourceType
    )
    Invoke-HaloPreFlightChecks
    try {
        if (($null -ne $QSCollection) -and ($QSCollection.pageinate -eq 'true') -and (-not($AutoPaginateOff))) {
            Write-Verbose 'Automatically paginating.'
            $PageNum = $QSCollection.page_no
            $PageSize = $QSCollection.page_size
        } elseif ((-not $QSCollection.pageinate) -and ($QSCollection.page_size)) {
            $QSCollection.Remove('page_size')
        }
        if ($QSCollection) {
            Write-Debug "Query string in New-HaloGETRequest contains: $($QSCollection | Out-String)"
            $QueryStringCollection = [system.web.httputility]::ParseQueryString([string]::Empty)
            Write-Verbose 'Building [HttpQSCollection] for New-HaloGETRequest'
            foreach ($Key in $QSCollection.Keys) {
                $QueryStringCollection.Add($Key, $QSCollection.$Key)
            }
        } else {
            Write-Debug 'Query string collection not present...'
        }
        $QSBuilder = [System.UriBuilder]::new()
        if ($AutoPaginateOff) {
            Write-Debug 'Automatic pagination is off.'
            $QSBuilder.Query = $QueryStringCollection.ToString()
            $Query = $QSBuilder.Query.ToString()
            $WebRequestParams = @{
                Method = $Method
                Uri = "$($Script:HAPIConnectionInformation.URL)$($Resource)$($Query)"
            }
            Write-Debug "Building new HaloRequest with params: $($WebRequestParams | Out-String)"
            $Response = Invoke-HaloRequest -WebRequestParams $WebRequestParams -RawResult:$RawResult
            Write-Debug "Halo request returned $($Response | Out-String)"
            if (($Response.PSObject.Properties.name -match $ResourceType) -and ($Response.$ResourceType -is [Object])) {
                $Result = $Response.$ResourceType
            } else {
                $Result = $Response
            }
        } elseif ($PageNum) {
            $Result = do {
                Write-Verbose "Processing page $PageNum"
                $QueryStringCollection.Remove('page_no')
                $QueryStringCollection.Add('page_no', $PageNum)
                $QSBuilder.Query = $QueryStringCollection.ToString()
                $Query = $QSBuilder.Query.ToString()
                $WebRequestParams = @{
                    Method = $Method
                    Uri = "$($Script:HAPIConnectionInformation.URL)$($Resource)$($Query)"
                }
                Write-Debug "Building new HaloRequest with params: $($WebRequestParams | Out-String)"
                $Response = Invoke-HaloRequest -WebRequestParams $WebRequestParams -RawResult:$RawResult
                Write-Debug "Halo request returned $($Response | Out-String)"
                $NumPages = [Math]::Ceiling($Response.record_count / $PageSize)
                Write-Verbose "Total number of pages to process: $NumPages"
                $PageNum++
                if (($Response.PSObject.Properties.name -match $ResourceType) -and ($Response.$ResourceType -is [Object])) {
                    $Response.$ResourceType
                } else {
                    $Response
                }
            } while ($PageNum -lt $NumPages)
        }
        Return $Result
    } catch {
        $ErrorRecord = @{
            ExceptionType = 'System.Net.Http.HttpRequestException'
            ErrorMessage = 'GET request sent to the Halo API failed.'
            InnerException = $_.Exception
            ErrorID = 'HaloGETRequestFailed'
            ErrorCategory = 'ProtocolError'
            TargetObject = $_.TargetObject
            ErrorDetails = $_.ErrorDetails
            BubbleUpDetails = $True
        }
        $RequestError = New-HaloErrorRecord @ErrorRecord
        $PSCmdlet.ThrowTerminatingError($RequestError)
    }
}