Assessment/ProductionGate.ps1

function Get-AzDevOpsProductionGateAssessment {
    [CmdletBinding()]
    param([Parameter(Mandatory)][object]$TargetObject)
    if ($null -eq $TargetObject.Checks) {
        return [pscustomobject]@{ Outcome = 'Unknown'; ReasonCode = 'ChecksUnavailable' }
    }
    if (@($TargetObject.Checks).Count -eq 0) {
        return [pscustomobject]@{ Outcome = 'Fail'; ReasonCode = 'MissingProductionGate' }
    }
    $active = @($TargetObject.Checks | Where-Object { $_.isDisabled -ne $true })
    if ($active.Count -eq 0) {
        return [pscustomobject]@{ Outcome = 'Fail'; ReasonCode = 'DisabledProductionGate' }
    }
    $incomplete = $false
    foreach ($check in $active) {
        if (-not $check.type.name -or $null -eq $check.settings) { $incomplete = $true; continue }
        if ($check.type.name -eq 'Approval') {
            if ($null -eq $check.settings.approvers) { $incomplete = $true; continue }
            if (@($check.settings.approvers).Count -eq 0) { continue }
        } else {
            $fields = if ($check.settings -is [System.Collections.IDictionary]) { @($check.settings.Keys) } else { @($check.settings.psobject.Properties.Name) }
            if ($fields.Count -eq 0) { $incomplete = $true; continue }
        }
        return [pscustomobject]@{ Outcome = 'Pass'; ReasonCode = 'ConfiguredProductionGate' }
    }
    if ($incomplete) { return [pscustomobject]@{ Outcome = 'Unknown'; ReasonCode = 'CheckConfigurationUnavailable' } }
    return [pscustomobject]@{ Outcome = 'Fail'; ReasonCode = 'InvalidProductionGate' }
}