Modules/AzureDevOpsDsc.Common/Resources/Functions/Public/AzDoEnvironmentApproval/Set-AzDoEnvironmentApproval.ps1

Function Set-AzDoEnvironmentApproval
{
    [CmdletBinding()]
    param (
        [Parameter(Mandatory = $true)][string]$ProjectName,
        [Parameter(Mandatory = $true)][string]$EnvironmentName,
        [Parameter(Mandatory = $true)][string[]]$Approvers,
        [Parameter()][uint32]$RequiredApproverCount = 1,
        [Parameter()][bool]$AllowApproverToSelf = $false,
        [Parameter()][uint32]$TimeoutInMinutes = 43200,
        [Parameter()][string]$Instructions,
        [Parameter()][HashTable]$LookupResult,
        [Parameter()][Ensure]$Ensure,
        [Parameter()][System.Management.Automation.SwitchParameter]$Force
    )

    Write-Verbose "[Set-AzDoEnvironmentApproval] Updating approval for '$EnvironmentName'."

    $OrgName  = Get-AzDoOrganizationName
    $cacheKey = '{0}\{1}' -f $ProjectName, $EnvironmentName
    $env      = Get-CacheItem -Key $cacheKey -Type 'LivePipelineEnvironments'
    $approval = Get-CacheItem -Key $cacheKey -Type 'LiveEnvironmentApprovals'

    if (-not $env)
    {
        Write-Verbose "[Set-AzDoEnvironmentApproval] Environment '$EnvironmentName' not in cache — falling back to live API lookup."
        $allEnvs = List-DevOpsPipelineEnvironments -ApiUri "https://dev.azure.com/$OrgName" -ProjectName $ProjectName
        $env = $allEnvs | Where-Object { $_.name -eq $EnvironmentName } | Select-Object -First 1
        if ($env) { Add-CacheItem -Key $cacheKey -Value $env -Type 'LivePipelineEnvironments' }
    }

    if (-not $approval)
    {
        Write-Verbose "[Set-AzDoEnvironmentApproval] Approval not in cache — querying API."
        $approvalTypeId = '8c6f20a7-a545-4486-9777-f762fafe0d4d'
        $checks = List-DevOpsEnvironmentApprovals -ApiUri "https://dev.azure.com/$OrgName/" -ProjectName $ProjectName -EnvironmentId $env.id
        $approval = $checks | Where-Object { $_.type.id -eq $approvalTypeId } | Select-Object -First 1
        if ($approval) { Add-CacheItem -Key $cacheKey -Value $approval -Type 'LiveEnvironmentApprovals' }
    }

    if ((-not $env) -or (-not $approval))
    {
        Write-Error "[Set-AzDoEnvironmentApproval] Environment or existing approval not found."
        return
    }

    $approverIds = @()
    foreach ($approver in $Approvers)
    {
        $resolved = Find-AzDoIdentity -Identity $approver
        if ($resolved) { $approverIds += $resolved.originId }
        else            { $approverIds += $approver }
    }

    $params = @{
        ApiUri                        = 'https://dev.azure.com/{0}/' -f $OrgName
        ProjectName                   = $ProjectName
        CheckId                       = $approval.id
        EnvironmentId                 = $env.id
        ApproverIds                   = $approverIds
        RequiredApproverCount         = $RequiredApproverCount
        AllowApproverToApproveOwnRuns = $AllowApproverToSelf
        TimeoutInMinutes              = $TimeoutInMinutes
        Instructions                  = $Instructions
    }

    $value = Set-DevOpsEnvironmentApproval @params
    Write-Verbose "[SetApproval] Set-DevOpsEnvironmentApproval returned: $(if ($null -eq $value) { 'NULL' } else { $value.GetType().Name + ' id=' + $value.id })"

    if ($null -eq $value)
    {
        Write-Error "[Set-AzDoEnvironmentApproval] Set-DevOpsEnvironmentApproval returned null. Check authentication token and organization settings."
        return
    }

    $cacheKey = '{0}\{1}' -f $ProjectName, $EnvironmentName
    Add-CacheItem -Key $cacheKey -Value $value -Type 'LiveEnvironmentApprovals'
    $currentCache = Get-CacheObject -CacheType 'LiveEnvironmentApprovals'
    Write-Verbose "[SetApproval] Cache count after Add-CacheItem: $($currentCache.Count)"
    Export-CacheObject -CacheType 'LiveEnvironmentApprovals' -Content $currentCache
}