Public/Connect-PipelineLogging.ps1

<#
.SYNOPSIS
Connects to Azure DevOps Pipeline Logging module.

.EXAMPLE
Connect-PipelineLogging
#>

function Connect-PipelineLogging {
    [CmdletBinding(DefaultParameterSetName = "default")]

    Param
    (
        [Parameter(Mandatory = $true)]
        [SecureString] $PAT,

        [Parameter(Mandatory = $true, ParameterSetName = "default")]
        [string] $Organization,

        [Parameter(Mandatory = $true, ParameterSetName = "default")]
        [string] $Project,

        [Parameter(Mandatory = $true, ParameterSetName = "url")]
        [string] $Url
    )
    
    Process {
        if ($PSCmdlet.ParameterSetName -eq "url") {
            $uri = [System.Uri]$Url
            if ($uri.Host -ne "dev.azure.com") {
                throw "Invalid Azure DevOps URL: $Url"
            }

            $segments = $uri.Segments | ForEach-Object { $_.TrimEnd('/') }
            
            if ($segments[2] -eq "_git") {
                if ($segments.Length -lt 4) {
                    throw "Invalid Azure DevOps URL (must include project): $Url"
                }

                $Organization = $segments[1]?.TrimEnd('/')
                $Project = $segments[3]?.TrimEnd('/')
            }
            else {
                $Organization = $segments[1]?.TrimEnd('/')
                $Project = $segments[2]?.TrimEnd('/')

                if ($segments.Length -lt 3) {
                    throw "Invalid Azure DevOps URL (must include project): $Url"
                }
            }
        }
        $Script:Headers = @{
            Authorization = "Basic $([System.Convert]::ToBase64String([System.Text.Encoding]::ASCII.GetBytes(":$([Runtime.InteropServices.Marshal]::PtrToStringAuto([Runtime.InteropServices.Marshal]::SecureStringToBSTR($PAT)))")))"
        }
        $Script:Organization = $Organization
        $Script:Project = $Project
        $Script:ProjectResource = Get-PipelineLoggingResource -Url "https://dev.azure.com/$($Organization)/_apis/projects/$($Project)" -Single

        if (!$Script:ProjectResource) {
            throw "Unable to get project '$Project' in organization '$Organization'"
        }
        else {
            Write-Verbose "Connected to project '$Project' ($($Script:ProjectResource.id)) in organization '$Organization'"
        }
    }
}