Private/Get-IDNWEnvironment.ps1

<#
    .SYNOPSIS
        Get the environment details for the specified IdentityNow instance.

    .DESCRIPTION
        This function gets the environment details for the specified IdentityNow instance. The function will return the base URL, the base API URL, the session token data, the session token, and the API version.

    .EXAMPLE
        Get-IDNWEnvironment -Instance "Sandbox"

    .PARAMETER Instance
        The IdentityNow instance to get the environment details for.

    .INPUTS
        None

    .OUTPUTS
        PSCustomObject
#>


function Get-IDNWEnvironment {
    [CmdletBinding(
        SupportsShouldProcess = $False,
        ConfirmImpact = "None",
        SupportsPaging = $False,
        PositionalBinding = $True)
    ]
    param (
        [Parameter(Mandatory = $true)]
        [Alias("Environment")]
        [ValidateSet("Sandbox", "ACC", "PRD")]
        [String]
        $Instance,

        [Parameter(Mandatory = $true)]
        [ValidateSet("v3", "v2024", "beta")]
        [String]
        $APIVersion
    )

    # Determine correct set of secrets for session
    switch ($Instance.ToLower()) {
        { "sandbox", "acc" -contains $_ } {
            $sail_base_url = $env:IDNW_ACC_BASE_URL
            $sail_client_id = $env:IDNW_ACC_CLIENT_ID
            $sail_client_secret = $env:IDNW_ACC_CLIENT_SECRET
        }
        'prd' {
            $sail_base_url = $env:IDNW_PRD_BASE_URL
            $sail_client_id = $env:IDNW_PRD_CLIENT_ID
            $sail_client_secret = $env:IDNW_PRD_CLIENT_SECRET
        }
    }

    # Checking for empty values
    # Define a hashtable with variable names and their corresponding values
    $variables = @{
        "sail_base_url"      = $sail_base_url
        "sail_client_id"     = $sail_client_id
        "sail_client_secret" = $sail_client_secret
    }
    # Collect missing variables
    $missing = @()
    foreach ($key in $variables.Keys) {
        if ([string]::IsNullOrEmpty($variables[$key])) {
            $missing += $key
        }
    }
    # Collect missing variables
    $missing = @()
    foreach ($key in $variables.Keys) {
        if ([string]::IsNullOrEmpty($variables[$key])) {
            $missing += $key
        }
    }
    # Throw an error if any variables are missing
    if ($missing.Count -gt 0) {
        throw "The following variables are missing: $($missing -join ', ')"
    }

    # Variables are passed from Azure DevOps to Powershell via environment variables
    $sessiontokendata = @{
        token_url           = "$sail_base_url/oauth/token"
        token_client_id     = $sail_client_id
        token_client_secret = $sail_client_secret
    }

    $Params = @{
        token_url           = $sessiontokendata.token_url
        token_client_id     = $sessiontokendata.token_client_id
        token_client_secret = $sessiontokendata.token_client_secret
    }
    $SessionToken = Get-IDNWSessionToken @Params
    $SessionTokenDetails = Get-IDNWTokenDetail -Token $SessionToken

    $output = [PSCustomObject]@{
        Instance            = $Instance
        BaseUrl             = $sail_base_url -replace '.api', ''
        BaseAPIUrl          = ('{0}/{1}' -f $sail_base_url, $APIVersion)
        SessionTokenData    = $sessiontokendata
        SessionToken        = $SessionToken
        SessionTokenDetails = $SessionTokenDetails
        APIVersion          = $APIVersion
    }

    return $output
}