Private/Invoke-GCApiRequest.ps1

function Invoke-GCApiRequest {
    [CmdletBinding()]
    param(
        [Parameter(Mandatory = $true)]
        [string]$Endpoint,

        [Parameter(Mandatory = $false)]
        [ValidateSet('GET', 'POST', 'PUT', 'PATCH', 'DELETE')]
        [string]$Method = 'GET',

        [Parameter(Mandatory = $false)]
        [object]$Body,

        [Parameter(Mandatory = $false)]
        [hashtable]$QueryParameters
    )

    $AccessToken = [Environment]::GetEnvironmentVariable('GC_ACCESS_TOKEN')
    $BaseURL     = [Environment]::GetEnvironmentVariable('GC_BASE_URL')

    if ([string]::IsNullOrEmpty($AccessToken)) {
        throw "Not authenticated. Run Connect-GenesysCloud first."
    }
    if ([string]::IsNullOrEmpty($BaseURL)) {
        throw "Base URL not set. Run Connect-GenesysCloud first."
    }

    $headers = @{
        'Authorization' = "Bearer $AccessToken"
        'Content-Type'  = 'application/json'
    }

    $uri = "https://api.$BaseURL/api/v2/$Endpoint"

    if ($QueryParameters -and $QueryParameters.Count -gt 0) {
        $queryString = New-GCQueryString -Parameters $QueryParameters
        $uri = "$uri$queryString"
    }

    $invokeParams = @{
        Method  = $Method
        Uri     = $uri
        Headers = $headers
    }

    if ($Body) {
        if ($Body -is [string]) {
            $invokeParams['Body'] = $Body
        } else {
            $invokeParams['Body'] = ($Body | ConvertTo-Json -Depth 10)
        }
    }

    try {
        $response = Invoke-RestMethod @invokeParams
        return $response
    } catch {
        Write-Debug $_
        throw $_
    }
}