Public/Core/Projects/Set-AdoProject.ps1

function Set-AdoProject {
    <#
    .SYNOPSIS
        Updates an existing Azure DevOps project through REST API.
 
    .DESCRIPTION
        This function updates an existing Azure DevOps project through REST API.
 
    .PARAMETER ProjectId
        Optional. Project ID or project name.
 
    .PARAMETER Name
        Optional. The name of the project to update.
 
    .PARAMETER Description
        Optional. The description of the project to update.
 
    .PARAMETER Visibility
        Optional. The visibility of the project to update. Default is 'Private'.
 
    .PARAMETER ApiVersion
        Optional. The API version to use. Default is '7.1'.
 
    .OUTPUTS
        System.Object
 
        The updated project object.
    .LINK
        https://learn.microsoft.com/en-us/rest/api/azure/devops/core/projects/update
 
    .EXAMPLE
        Set-AdoProject -ProjectId 'my-project-002' -Name 'my-project-updated-name'
 
        Updates the name of the Azure DevOps project with ID 'my-project-002' to 'my-project-updated-name'.
    #>

    [CmdletBinding()]
    [OutputType([object])]
    param (
        [Parameter(Mandatory)]
        [string]$ProjectId,

        [Parameter(Mandatory = $false)]
        [string]$Name,

        [Parameter(Mandatory = $false)]
        [string]$Description,

        [Parameter(Mandatory = $false)]
        [ValidateSet('Private', 'Public')]
        [string]$Visibility,

        [Parameter(Mandatory = $false)]
        [Alias('Api')]
        [ValidateSet('7.1', '7.2-preview.1')]
        [string]$ApiVersion = '7.1'
    )

    begin {
        Write-Debug ('Command : {0}' -f $MyInvocation.MyCommand.Name)
        Write-Debug (' Name : {0}' -f $Name)
        Write-Debug (' Description : {0}' -f $Description)
        Write-Debug (' Visibility : {0}' -f $Visibility)
        Write-Debug (' ApiVersion : {0}' -f $ApiVersion)
    }

    process {
        try {
            $ErrorActionPreference = 'Stop'

            if (-not $global:AzDevOpsIsConnected) {
                throw 'Not connected to Azure DevOps. Please connect using Connect-AdoOrganization.'
            }

            $uriFormat = '{0}/_apis/projects/{1}?api-version={2}'
            $azDevOpsUri = ($uriFormat -f [uri]::new($AzDevOpsOrganization), $ProjectId, $ApiVersion)

            $bodyObject = @{}

            if ($PSBoundParameters.ContainsKey('Name')) {
                $bodyObject['name'] = $Name
            }
            if ($PSBoundParameters.ContainsKey('Description')) {
                $bodyObject['description'] = $Description
            }
            if ($PSBoundParameters.ContainsKey('Visibility')) {
                $bodyObject['visibility'] = $Visibility
            }

            $body = $bodyObject | ConvertTo-Json -Depth 3 -Compress

            $params = @{
                Method      = 'PATCH'
                Uri         = $azDevOpsUri
                ContentType = 'application/json'
                Headers     = ((ConvertFrom-SecureString -SecureString $global:AzDevOpsHeaders -AsPlainText) | ConvertFrom-Json -AsHashtable)
                Body        = $body
            }

            $response = Invoke-RestMethod @params -Verbose:$VerbosePreference

            $status = $response.status

            while ($status -ne 'succeeded') {
                Write-Verbose 'Checking project update status...'
                Start-Sleep -Seconds 2

                $response = Invoke-RestMethod -Method GET -Uri $response.url -Headers $params.Headers
                $status = $response.status

                if ($status -eq 'failed') {
                    Write-Error -Message ('Project update failed {0}' -f $PSItem.Exception.Message)
                }
            }

            return $response

        } catch {
            throw $_
        }
    }

    end {
        Write-Debug ('Exit : {0}' -f $MyInvocation.MyCommand.Name)
    }
}