Modules/businessdev.ALbuild.Marketplace/Public/Submit-BcMarketplaceApp.ps1

function Submit-BcMarketplaceApp {
    <#
    .SYNOPSIS
        Submits an AL app to Microsoft Marketplace (AppSource) end to end.
 
    .DESCRIPTION
        Orchestrates a Marketplace submission: authenticates (Partner Center and product-ingestion
        scopes), resolves the product by name, uploads the app (and library apps) and creates a
        submission, waits for validation, and optionally promotes it to live. Requires a valid
        ALbuild license.
 
    .PARAMETER ProductName
        The Marketplace product (offer) name.
 
    .PARAMETER AppFile
        The main .app file.
 
    .PARAMETER LibraryAppFile
        Optional dependent/library .app files.
 
    .PARAMETER TenantId
        Azure AD tenant id for the Partner Center service principal.
 
    .PARAMETER ClientId
        Service principal client id.
 
    .PARAMETER ClientSecret
        Service principal client secret.
 
    .PARAMETER AutoPromote
        Promote to live after successful validation.
 
    .PARAMETER TimeoutMinutes
        Validation timeout. Default 40.
 
    .OUTPUTS
        PSCustomObject with ProductId, SubmissionId, Validation, Promoted.
    #>

    [CmdletBinding(SupportsShouldProcess)]
    [OutputType([PSCustomObject])]
    param(
        [Parameter(Mandatory)] [string] $ProductName,
        [Parameter(Mandatory)] [string] $AppFile,
        [string[]] $LibraryAppFile = @(),
        [Parameter(Mandatory)] [string] $TenantId,
        [Parameter(Mandatory)] [string] $ClientId,
        [Parameter(Mandatory)] [object] $ClientSecret,
        [switch] $AutoPromote,
        [int] $TimeoutMinutes = 40
    )

    Assert-ALbuildLicensed -Feature 'Marketplace'

    $graphAuth = New-BcMarketplaceAuthContext -TenantId $TenantId -ClientId $ClientId -ClientSecret $ClientSecret -Scope 'https://graph.microsoft.com/.default'
    $partnerAuth = New-BcMarketplaceAuthContext -TenantId $TenantId -ClientId $ClientId -ClientSecret $ClientSecret -Scope 'https://api.partner.microsoft.com/.default'

    Write-ALbuildLog "Resolving product '$ProductName' ..."
    $products = @(Get-BcMarketplaceProduct -AuthContext $graphAuth -Name $ProductName)
    if ($products.Count -eq 0) { throw "Marketplace product '$ProductName' was not found." }
    if ($products.Count -gt 1) { throw "Multiple products match '$ProductName'; use a more specific name." }
    $product = $products[0]

    if (-not $PSCmdlet.ShouldProcess($product.name, 'Create and validate Marketplace submission')) { return }

    $submission = New-BcMarketplaceSubmission -AuthContext $partnerAuth -ProductId $product.id -AppFile $AppFile -LibraryAppFile $LibraryAppFile
    $validation = Wait-BcMarketplaceValidation -AuthContext $partnerAuth -ProductId $product.id -SubmissionId $submission.id -TimeoutMinutes $TimeoutMinutes

    $promoted = $false
    if ($AutoPromote -and $validation.Completed) {
        Invoke-BcMarketplacePromotion -AuthContext $partnerAuth -ProductId $product.id -SubmissionId $submission.id | Out-Null
        $promoted = $true
    }

    return [PSCustomObject]@{
        ProductId    = $product.id
        SubmissionId = $submission.id
        Validation   = $validation
        Promoted     = $promoted
    }
}