Public/Misc/Environment/New-ApiProjectConnection.ps1

function New-ApiProjectConnection {

    <#
        .SYNOPSIS
            Creates a new API project connection object.

        .DESCRIPTION
            The `New-ApiProjectConnection` function creates a new API project connection object that
            represents a connection to an Azure DevOps project.

        .PARAMETER ApiCollectionConnection
            The API collection connection object that provides the base connection details.

        .PARAMETER ProjectName
            The name of the Azure DevOps project.

        .PARAMETER ProjectId
            The ID of the Azure DevOps project.

        .PARAMETER ProjectUri
            The URI of the Azure DevOps project.

        .PARAMETER ProjectBaseUri
            The base URI of the Azure DevOps project.

        .PARAMETER Verified
            Indicates whether the project connection has been verified.

        .OUTPUTS
            A `PSCustomObject` representing the API project connection.
    #>


    [CmdletBinding()]
    param (
        [Parameter(Mandatory)]
        [Alias('Connection')]
        [PSTypeName('PSTypeNames.AzureDevOpsApi.ApiCollectionConnection')]
        $ApiCollectionConnection,

        [Parameter()]
        [Alias('Name')]
        [string] $ProjectName,

        [Parameter()]
        [Alias('Id')]
        [string] $ProjectId,

        [Parameter()]
        [Alias('Uri')]
        [string] $ProjectUri,

        [Parameter()]
        [Alias('BaseUri')]
        [string] $ProjectBaseUri,

        [Parameter()]
        [bool] $Verified = $false
    )

    process {

        if ($ProjectId -and $ApiCollectionConnection.CollectionUri) {
            if (!$ProjectUri) {
                $ProjectUri = Join-Uri `
                    -Base $ApiCollectionConnection.CollectionUri `
                    -Relative "_apis/projects/$($ProjectId)" `
                    -NoTrailingSlash
            }
            if (!$ProjectBaseUri) {
                $ProjectBaseUri = Join-Uri `
                    -Base $ApiCollectionConnection.CollectionUri `
                    -Relative $ProjectId
            }
        }

        if ($ProjectName -and $ApiCollectionConnection.CollectionUri) {
            $ProjectNameBaseUri = Join-Uri `
                -Base $ApiCollectionConnection.CollectionUri `
                -Relative $ProjectName
        }

        # Determine the base URI
        $baseUri = $ApiCollectionConnection.CollectionUri
        if ($ProjectNameBaseUri) {
            $baseUri = $ProjectNameBaseUri
        }
        if ($ProjectBaseUri) {
            $baseUri = $ProjectBaseUri
        }

        return [PSCustomObject] @{
            PSTypeName         = $global:PSTypeNames.AzureDevOpsApi.ApiProjectConnection
            Verified           = $Verified
            CollectionUri      = $ApiCollectionConnection.CollectionUri
            ApiVersion         = $ApiCollectionConnection.ApiVersion
            ApiCredential      = $ApiCollectionConnection.ApiCredential
            BaseUri            = $baseUri
            ProjectUri         = $ProjectUri
            ProjectBaseUri     = $ProjectBaseUri
            ProjectId          = $ProjectId
            ProjectIdBaseUri   = $ProjectBaseUri
            ProjectName        = $ProjectName
            ProjectNameBaseUri = $ProjectNameBaseUri
        }
    }
}