Public/Work/TeamSettings/Set-AdoTeamSettings.ps1

# cSpell: ignore teamsettings
function Set-AdoTeamSettings {
    <#
    .SYNOPSIS
        Update the settings for a team in Azure DevOps.
 
    .DESCRIPTION
        Update the settings for a team in Azure DevOps by sending a PATCH request to the Azure DevOps REST API.
 
    .PARAMETER ProjectId
        The ID or name of the project containing the team.
 
    .PARAMETER TeamId
        The ID or name of the team to update.
 
    .PARAMETER TeamSettings
        A string representing the team settings to be updated in JSON format.
 
    .PARAMETER ApiVersion
        The API version to use for the request. Default is '7.1'.
 
    .LINK
        https://learn.microsoft.com/en-us/rest/api/azure/devops/work/teamsettings/update
 
        .EXAMPLE
        $params = @{
            bugsBehavior = 'asRequirements'
            backlogVisibilities = @{
                'Microsoft.EpicCategory' = $false
                'Microsoft.FeatureCategory' = $true
                'Microsoft.RequirementCategory' = $true
            }
            defaultIterationMacro = '@currentIteration'
            workingDays = @(
                'monday'
                'tuesday'
                'wednesday'
                'thursday'
                'friday'
            )
        } | ConvertTo-Json -Depth 5 -Compress
 
        Set-AdoTeamSettings -ProjectId 'my-project' -TeamId 'my-other-team' -TeamSettings $params
 
        Updates the settings for the team "my-other-team" in the project "my-project" with the specified parameters.
 
        The backlogIteration is set to the root iteration, bugs are treated as requirements, and working days are set to Monday through Friday.
    #>

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

        [Parameter(Mandatory)]
        [string]$TeamId,

        [Parameter(Mandatory)]
        [string]$TeamSettings,

        [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 (' ProjectId : {0}' -f $ProjectId)
        Write-Debug (' TeamId : {0}' -f $TeamId)
        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.'
            }

            if (-not (Test-Json $TeamSettings)) {
                throw 'Invalid JSON for team settings string.'
            }

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

            $params = @{
                Method      = 'PATCH'
                Uri         = $azDevOpsUri
                ContentType = 'application/json'
                Headers     = @{
                    'Accept'        = 'application/json'
                    'Authorization' = (ConvertFrom-SecureString -SecureString $AzDevOpsAuth -AsPlainText)
                }
                Body        = $TeamSettings
            }

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

            return $response

        } catch {
            throw $_
        }
    }

    end {
        Write-Debug ('{0} exited' -f $MyInvocation.MyCommand)
    }
}