diff --git a/src/functions/public/Auth/Connect-GitHubApp.ps1 b/src/functions/public/Auth/Connect-GitHubApp.ps1 index 96f0d73d0..836e2e1c1 100644 --- a/src/functions/public/Auth/Connect-GitHubApp.ps1 +++ b/src/functions/public/Auth/Connect-GitHubApp.ps1 @@ -41,25 +41,19 @@ [CmdletBinding(DefaultParameterSetName = '__AllParameterSets')] param( # The user account to connect to. - [Parameter( - Mandatory, - ParameterSetName = 'User' - )] - [string] $User, + [Parameter()] + [SupportsWildcards()] + [string[]] $User = '*', # The organization to connect to. - [Parameter( - Mandatory, - ParameterSetName = 'Organization' - )] - [string] $Organization, + [Parameter()] + [SupportsWildcards()] + [string[]] $Organization = '*', # The enterprise to connect to. - [Parameter( - Mandatory, - ParameterSetName = 'Enterprise' - )] - [string] $Enterprise, + [Parameter()] + [SupportsWildcards()] + [string[]] $Enterprise = '*', # Passes the context object to the pipeline. [Parameter()] @@ -86,38 +80,40 @@ $Context | Assert-GitHubContext -AuthType 'App' $installations = Get-GitHubAppInstallation -Context $Context + $selectedInstallations = @() Write-Verbose "Found [$($installations.Count)] installations." - switch ($PSCmdlet.ParameterSetName) { - 'User' { - Write-Verbose "Filtering installations for user [$User]." - $installations = $installations | Where-Object { $_.target_type -eq 'User' -and $_.account.login -in $User } - } - 'Organization' { - Write-Verbose "Filtering installations for organization [$Organization]." - $installations = $installations | Where-Object { $_.target_type -eq 'Organization' -and $_.account.login -in $Organization } - } - 'Enterprise' { - Write-Verbose "Filtering installations for enterprise [$Enterprise]." - $installations = $installations | Where-Object { $_.target_type -eq 'Enterprise' -and $_.account.slug -in $Enterprise } - } + $User | ForEach-Object { + $userItem = $_ + Write-Verbose "Adding installation based on user [$userItem]." + $selectedInstallations += $installations | Where-Object { $_.target_type -eq 'User' -and $_.account.login -like $userItem } + } + $Organization | ForEach-Object { + $organizationItem = $_ + Write-Verbose "Filtering installations for organization [$organizationItem]." + $installations = $installations | Where-Object { $_.target_type -eq 'Organization' -and $_.account.login -in $organizationItem } + } + $Enterprise | ForEach-Object { + $enterpriseItem = $_ + Write-Verbose "Filtering installations for enterprise [$enterpriseItem]." + $installations = $installations | Where-Object { $_.target_type -eq 'Enterprise' -and $_.account.slug -in $enterpriseItem } } Write-Verbose "Found [$($installations.Count)] installations for the target." - $installations | ForEach-Object { + $installations | ForEach-Object -ThrottleLimit ([Environment]::ProcessorCount * 2) -Parallel { $installation = $_ Write-Verbose "Processing installation [$($installation.account.login)] [$($installation.id)]" - $token = New-GitHubAppInstallationAccessToken -Context $Context -InstallationID $installation.id + $token = New-GitHubAppInstallationAccessToken -Context $using:Context -InstallationID $installation.id $contextParams = @{ AuthType = [string]'IAT' TokenType = [string]'ghs' - DisplayName = [string]$Context.DisplayName - ApiBaseUri = [string]$Context.ApiBaseUri - ApiVersion = [string]$Context.ApiVersion - HostName = [string]$Context.HostName - HttpVersion = [string]$Context.HttpVersion - PerPage = [int]$Context.PerPage - ClientID = [string]$Context.ClientID + DisplayName = [string]$using:Context.DisplayName + ApiBaseUri = [string]$using:Context.ApiBaseUri + ApiVersion = [string]$using:Context.ApiVersion + HostName = [string]$using:Context.HostName + HttpVersion = [string]$using:Context.HttpVersion + PerPage = [int]$using:Context.PerPage + ClientID = [string]$using:Context.ClientID InstallationID = [string]$installation.id Permissions = [pscustomobject]$installation.permissions Events = [string[]]$installation.events @@ -140,9 +136,9 @@ $contextParams['Enterprise'] = [string]$installation.account.slug } } - Write-Verbose 'Logging in using a managed installation access token...' - Write-Verbose ($contextParams | Format-Table | Out-String) - $contextObj = [InstallationGitHubContext]::new((Set-GitHubContext -Context $contextParams.Clone() -PassThru -Default:$Default)) + $contextParams + } | ForEach-Object { + $contextObj = [InstallationGitHubContext]::new((Set-GitHubContext -Context $_ -PassThru -Default:$Default)) Write-Verbose ($contextObj | Format-List | Out-String) if (-not $Silent) { $name = $contextObj.name @@ -153,7 +149,6 @@ Write-Debug "Passing context [$contextObj] to the pipeline." Write-Output $contextObj } - $contextParams.Clear() } } catch { Write-Error $_