Public/Get-iPilotTeamsDomain.ps1

Function Get-iPilotTeamsDomain {
    <#
        .Synopsis
        Displays a list of available iPilot domains.

        .Description
        Returns available iPilot domains based on supplied credentials.

        .Parameter ApiVersion
        Version of the NuWave iPilot to use. Defaults to version 1.

        .Parameter Credential
        iPilot credential

        .Example
        # Get avilable iPilot domains
        Get-iPilotTeamsDomain -Credential $Credential

    #>

    Param (
        [System.String]
            $ApiUrl = $global:IP_ApiUrl,
        [System.String]
            $ApiVersion = "v1",
        [System.String]
            $ApiKey, 
        [System.Int16]
            $NumberOfRecords = 100,
        [System.Management.Automation.PSCredential]
            $Credential,
        [Switch] 
            $RefreshToken,
        [Switch]
            $Verbose,
        [Switch]
            $Debug
    )

    Begin {

    }

    Process {
        # Verbose Switch
        if($PSBoundParameters.containskey("Verbose")) {
            $PreviousVerbosePreference = $VerbosePreference
            $VerbosePreference = "continue"
        }

        # Debug Switch
        if($PSBoundParameters.containskey("Debug")) {
            $PreviousDebugPreference = $DebugPreference
            $DebugPreference = "continue"
        }

        # Force refresh OAuth Token
        if ($RefreshToken.IsPresent) {
            $global:IP_iPilotOAuthToken = $null
            $global:IP_iPilotDomain = $null
        }

        Initialize-iPilotSession -ApiUrl $ApiUrl -ApiVersion $ApiVersion

        # Build iPilot API Request
        $GetiPilotDomainRequestUri = "$ApiUrl/$ApiVersion/msteams?limit=$NumberOfRecords&page=1"
        Write-Verbose "GetiPilotDomainRequestUri: $GetiPilotDomainRequestUri"

        # Splat Invoke-RestMethod parameters
        Write-Verbose "Request Method: Get"
        $GetiPilotDomainInvokeParams = @{
            Uri = $GetiPilotDomainRequestUri
            Method = "Get"
            ContentType = "application/json"
            Headers = @{
                "X-Access-Token" = $global:IP_iPilotOAuthToken.access_token
                "x-api-key"      = $global:IP_iPilotApiKey
            }
        }

        # Specify Instance
        if ($global:IP_Instance) {
            $GetiPilotDomainInvokeParams.Body = @{
                "instance"= $global:IP_instance
            }
        }
        Write-Verbose "GetiPilotDomainInvokeParams(JSON): $($GetiPilotDomainInvokeParams |ConvertTo-Json)"

        # Execute the REST API
        Try {
            $GetiPilotDomainResponse = Invoke-RestMethod @GetiPilotDomainInvokeParams -ErrorAction Stop

            Write-Debug "User has access to $($GetiPilotDomainResponse.domains.count) domain(s)."

            if ($GetiPilotDomainResponse.domains.count -gt 1) {
                # Get domain selection from grid view
                $global:IP_iPilotDomain = $GetiPilotDomainResponse.domains | Out-GridView -Title "Select the domain:" -PassThru
                return $global:IP_iPilotDomain
            } elseif ($GetiPilotDomainResponse.domains.count -eq 1) {
                $global:IP_iPilotDomain = $GetiPilotDomainResponse.domains -replace "`n",", " -replace "`r",", "
                return $global:IP_iPilotDomain
            } else {
                throw "No iPilot Domain(s) available. Response: $($GetiPilotDomainResponse)"
            }
            Write-Verbose "iPilot Domain: $global:IP_iPilotDomain"
        } Catch {
            Write-Error "No iPilot Domain(s) available.`n
                URL: $($GetiPilotDomainRequestUri).`n
                Error: $($_)"

        }

        # Verbose Switch
        if($PSBoundParameters.containskey("Verbose")) {
            $VerbosePreference = $PreviousVerbosePreference
        }

        # Debug Switch
        if($PSBoundParameters.containskey("Debug")) {
            $DebugPreference = $PreviousDebugPreference
        }
    }
}