Modules/businessdev.ALbuild.Marketplace/Public/Wait-BcMarketplaceValidation.ps1

function Wait-BcMarketplaceValidation {
    <#
    .SYNOPSIS
        Waits for a Marketplace submission to finish validation.
 
    .DESCRIPTION
        Polls the submission until it reaches a publishable state (Published/ReadyToPublish),
        fails, or the timeout elapses. The auth token is refreshed when -AuthContextFactory is
        supplied (useful for long validations).
 
    .PARAMETER AuthContext
        Auth context (Partner Center scope).
 
    .PARAMETER ProductId
        The product id.
 
    .PARAMETER SubmissionId
        The submission id to monitor.
 
    .PARAMETER TimeoutMinutes
        Maximum minutes to wait. Default 40.
 
    .PARAMETER IntervalSeconds
        Polling interval. Default 30.
 
    .OUTPUTS
        PSCustomObject with State, Substate, Completed, TimedOut.
    #>

    [CmdletBinding()]
    [OutputType([PSCustomObject])]
    param(
        [Parameter(Mandatory)] [PSCustomObject] $AuthContext,
        [Parameter(Mandatory)] [string] $ProductId,
        [Parameter(Mandatory)] [string] $SubmissionId,
        [int] $TimeoutMinutes = 40,
        [int] $IntervalSeconds = 30
    )

    $cleanProductId = $ProductId -replace '^product/', ''
    $headers = @{ Authorization = "Bearer $($AuthContext.AccessToken)" }
    $statusUrl = "https://api.partner.microsoft.com/v1.0/ingestion/products/$cleanProductId/submissions/$SubmissionId"
    $deadline = (Get-Date).AddMinutes($TimeoutMinutes)

    while ((Get-Date) -lt $deadline) {
        Start-Sleep -Seconds $IntervalSeconds
        try {
            $status = Invoke-RestMethod -Uri $statusUrl -Method Get -Headers $headers -ErrorAction Stop
        }
        catch {
            Write-ALbuildLog -Level Warning "Error polling submission status: $($_.Exception.Message)"
            continue
        }
        Write-ALbuildLog "Submission state: $($status.state)/$($status.substate)"

        if ($status.state -eq 'Published' -and $status.substate -eq 'ReadyToPublish') {
            Write-ALbuildLog -Level Success 'Validation completed successfully.'
            return [PSCustomObject]@{ State = $status.state; Substate = $status.substate; Completed = $true; TimedOut = $false }
        }
        if ($status.state -eq 'Failed') {
            throw "Marketplace validation failed (state $($status.state)/$($status.substate))."
        }
    }

    Write-ALbuildLog -Level Warning "Validation did not complete within $TimeoutMinutes minutes; check Partner Center."
    return [PSCustomObject]@{ State = 'Unknown'; Substate = 'Unknown'; Completed = $false; TimedOut = $true }
}