Public/Get-CollectionObject.ps1

<#
.SYNOPSIS
    Gets core objects from the Fortytwo Collections API.

.DESCRIPTION
    This function retrieves collection objects from the Fortytwo Collections API. It supports pagination to handle large result sets.

#>

function Get-CollectionObject {
    [CmdletBinding(DefaultParameterSetName = "Default")]
    param (
        [Parameter(Mandatory = $true)]
        [ValidateSet("collections", "collections-criteria", "collections-joinable")]
        [String] $CollectionType,

        [Parameter(Mandatory = $true, ParameterSetName = "Single", ValueFromPipeline = $true)]
        [ValidatePattern("^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$", ErrorMessage = "Id must be a valid GUID.")] # Is a guid connector object id
        [string] $Id
    )

    process {
        if (-not $Script:APIRoot -or -not $Script:AccessTokenProfile) {
            throw "Not connected to Fortytwo Collections. Please run Connect-Collections first."
        }

        $Uri = "$Script:APIRoot"

        switch ($CollectionType) {
            "collections" { $Uri = ($Uri -f "collections", (([string]::IsNullOrEmpty($Id)) ? "?azureTenantId=$($Script:TenantId)" : "")) }
            "collections-criteria" { $Uri = ($Uri -f "collections-criteria", "") }
            "collections-joinable" { $Uri = ($Uri -f "collections-joinable", "") }
        }

        if ($PSCmdlet.ParameterSetName -eq "Single") {
            $Uri += "/$Id"
            Write-Verbose "Getting Single Fortytwo Collections object from URI: $Uri"
            $Result = Invoke-RestMethod -Uri $Uri -Headers (Get-CollectionHeader) -SkipHttpErrorCheck -StatusCodeVariable StatusCode -Verbose:$false -ConnectionTimeoutSeconds 60 -OperationTimeoutSeconds 60

            if ($Result.IsSuccess) {
                return $Result.Data | ConvertTo-Json -Depth 10 | ConvertFrom-Json -AsHashtable
            }
            else {
                throw "Failed to get Fortytwo Collections object: $($Result.Errors -join '; ')"
            }
        }       

        try {
            Write-Verbose "Getting All Fortytwo Collections object from URI: $Uri"
            $Result = Invoke-RestMethod -Uri $Uri -Headers (Get-CollectionHeader) -SkipHttpErrorCheck -StatusCodeVariable StatusCode -Verbose:$false -ConnectionTimeoutSeconds 60 -OperationTimeoutSeconds 60
        
            $Uri = $null

            if ($Result.IsSuccess) {
                $Result.Data | ConvertTo-Json -Depth 10 | ConvertFrom-Json -AsHashtable
            }
            else {
                throw $($Result.Errors -join '; ')
            }
        } catch {
            throw "Failed to get Fortytwo Collections objects: $($_.Exception.Message)"
        }
    }
}