Public/Start-DuneActionAssignment.ps1

<#
.SYNOPSIS
Start an action-assignment run.
 
.DESCRIPTION
POSTs to the `/start` endpoint for an action-assignment. Optional `Parameters` override assignment defaults; when omitted, the user is prompted for each parameter. ShouldProcess is observed.
 
.PARAMETER ActionAssignment
A `DuneActionAssignment` object to start. Accepts pipeline input.
 
.PARAMETER ActionAssignmentId
The GUID of the action assignment to start.
 
.PARAMETER Parameters
An array of parameter objects to pass to the run. If omitted, prompts for each parameter interactively.
 
.PARAMETER Force
If `$true`, forces execution even if conditions would normally prevent it. Defaults to `$false`.
 
.EXAMPLE
PS> Start-DuneActionAssignment -ActionAssignmentId $id -Parameters @(@{Name="target";Value="prod"})
Starts an action assignment with explicit parameters.
 
.EXAMPLE
PS> Get-DuneActionAssignment -Name "backup" | Start-DuneActionAssignment
Starts an assignment via pipeline, prompting for parameters.
#>

function Start-DuneActionAssignment {
    [CmdletBinding(
        SupportsShouldProcess,
        ConfirmImpact = 'High',
        DefaultParameterSetName = 'Object'
    )]
    param(
        [Parameter(ParameterSetName = 'Object', ValueFromPipeline)]
        [DuneActionAssignment]$ActionAssignment,

        [Parameter(ParameterSetName = 'Id')]
        [guid]$ActionAssignmentId,

        [Parameter()]
        [object[]]$Parameters,

        [Parameter()]
        [bool]$Force = $False
    )

    begin {}

    process {
        if ($PSCmdlet.ParameterSetName -eq 'Id') {
            $ActionAssignment = Get-DuneActionAssignment -Id $ActionAssignmentId
        }
        $Method = 'POST'
        $Uri = 'action-assignments/{0}/start' -f $ActionAssignment.Id
        $Body = @{
            Force      = $Force
            Parameters = @()
        }
        if ($PSBoundParameters.ContainsKey('Parameters')) {
            $Body.Parameters = $Parameters
        }
        else {
            foreach ($ActionParameter in $ActionAssignment.Parameters) {
                $Parameter = @{
                    Name        = $ActionParameter.Name
                    Description = $ActionParameter.Description
                    Type        = $ActionParameter.Type
                }
                $Value = $Null
                while (-not $Value) {
                    $Value = if ($Parameters.($ActionParameter.Name)) {
                        $Parameters.($ActionParameter.Name)
                    }
                    else {
                        $ReadHost = @{
                            Prompt = if ($ActionParameter.value) {
                                "{0} (Description: {1}, Type: {2}, Default: {3})" -f $ActionParameter.Name, $ActionParameter.Description, $ActionParameter.Type, $ActionParameter.value
                            }
                            else {
                                "{0} (Description: {1}, Type: {2})" -f $ActionParameter.Name, $ActionParameter.Description, $ActionParameter.Type
                            }
                        }
                        if ($ActionParameter.Type -eq 'securestring') {
                            $Readhost.MaskInput = $True
                        }
                        $ReadHostValue = Read-Host @ReadHost
                        if (-not $ReadHostValue -and $ActionParameter.value) {
                            $ActionParameter.value
                        }
                        else {
                            $ReadHostValue
                        }
                    }
                }
                $Parameter.Value = if ($ActionParameter.Type -eq 'Number') {
                    $Value
                }
                else {
                    ConvertTo-Json -InputObject $Value
                }
                $Body.Parameters += $Parameter
            }
        }
        if ($PSCmdlet.ShouldProcess(($Body | ConvertTo-Json -Depth 16))) {
            $Return = Invoke-DuneApiRequest -Uri $Uri -Method $Method -Body $Body
            $ReturnObject = if ($Return.Content) { $Return.Content | ConvertFrom-Json | ConvertTo-DuneClassObject -Class DuneJob }
            return $ReturnObject
        }
    }

    end {}
}