src/cmdlets/Get-GraphConnection.ps1

# Copyright 2021, Adam Edwards
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.

. (import-script ../client/GraphConnection)
. (import-script ../client/GraphContext)

<#
.SYNOPSIS
Gets the list of named connections.

.DESCRIPTION
Commands such as `New-GraphConnection` may be used to create connections to the Grapi API; such connections may also be defined through profile settings. The Get-GraphConnection enumerates the named connections and / or the current connection; these connections may be subsequently selected as the active connection using the Select-GraphConnection command.

Note that Get-GraphConnection emits only named connections EXCEPT that it also emits the currently active connection whether or not it is named; unless a name is explicitly specified to commands such as New-GraphConnection or Connect-GraphApi, the resulting connections are 'ad-hoc' and do not have a name; they are still valid as the current connection.

For more information on how connections may be specified using profiles, see the documentation at https://github.com/adamedx/autographps-sdk/tree/main/docs/settings.

.PARAMETER ConnectionName
The name of a named connection to retrieve. By default, if no parameters are specified to the command, all named connections are emitted. To limit output to a specific connection, specify its name with this parameter.

.PARAMETER Current
If specified, only the currently active connection is emitted. The current active connection may be configured through profile settings, or through the Connect-GraphApi and Select-GraphApi commands. Even if the current connection has no name, it is emitted

.OUTPUTS
Graph connection object.

.EXAMPLE
Get-GraphConnection

AppId ConnectionName Organization AuthType
----- -------------- ------------ --------
8eee1da3-3610-45ce-8c1a-48fadfc21048 DevAccountAuto 8d10e713-08b5-425d-a3c7-7f89e316a92d AppOnly
600700fd-6097-44f0-a286-4b350bcec988 DevAccount 8d10e713-08b5-425d-a3c7-7f89e316a92d Delegated
7663bc10-5a47-4eac-b0f2-4ac3627f9227 Corp Delegated
9821af78-5e32-4040-bd24-38bb07942c7c LinuxClient 8d10e713-08b5-425d-a3c7-7f89e316a92d AppOnly
6fd5d1dc-e06b-4b7d-8aee-339aa8035221 Personal Delegated

In this example, no parameters are specified so all named connections, including the active connection, are emitted

.EXAMPLE
Get-GraphConnection -Current | Format-List

Id : 11f87424-41c1-4312-9d97-0d2608db22ab
Name : (Unnamed)
Status : Online
Connected : True
OrganizationId : 7e23c95a-76f2-434e-9433-c095493255e9
User : raheem@newjustice.org
AppID : ac70e3e2-a821-4d19-839c-b8af4515254b
AuthType : Delegated
AuthProtocol : v2
Endpoint : https://graph.microsoft.com/
AuthEndpoint : https://login.microsoftonline.com/
ConsistencyLevel : Eventual

In this example the Current option is specified to limit output to the current active connection, and the output is piped to
Format-List so that the detail given by the additional fields not shown in table view is visible. Note that since the
connection was an ad-hoc connection with no name, the name field shows as "(Unnamed)".

.LINK
Connect-GraphApi
New-GraphConnection
Select-GraphConnection
Get-GraphCurrentConnection
Remove-GraphConnection
Get-GraphProfile
#>

function Get-GraphConnection {
    [cmdletbinding(positionalbinding=$false)]
    param(
        [parameter(position=0, parametersetname='byname', mandatory=$true)]
        [ArgumentCompleter({
        param ( $commandName,
                $parameterName,
                $wordToComplete,
                $commandAst,
                $fakeBoundParameters )
                               $::.GraphConnection |=> GetNamedConnection | where Name -like "$($wordToComplete)*" | select-object -expandproperty Name
                           })]
        [string] $ConnectionName,

        [parameter(parametersetname='bylist')]
        [switch] $Current
    )

    $currentConnection = $::.GraphContext |=> GetCurrentConnection

    $connections = if ( $Current.IsPresent ) {
        if ( $currentConnection ) {
            $currentConnection
        }
    } else {
        $connections = $::.GraphConnection |=> GetNamedConnection $ConnectionName $true

        $namedConnections = foreach ( $connection in $connections ) {
            if ( $currentConnection -and $connection.id -eq $currentConnection.id ) {
                $currentConnection = $null
            }
            $connection
        }

        if ( ! $ConnectionName -and $currentConnection ) {
            $currentConnection
        }

        $namedConnections
    }

    $connections
}