public/issues/Add-ProjectSubIssue.ps1

Set-MyInvokeCommandAlias -Alias AddSubIssue -Command 'Invoke-AddSubIssue -IssueId {contentid} -SubIssueUrl {subissueurl} -ReplaceParent {replaceparent}'

function Add-ProjectSubIssueDirect {
    [cmdletbinding()]
    param(
        [Parameter()][string]$Owner,
        [Parameter()][string]$ProjectNumber,
        # [Parameter(Mandatory)][string]$IssueId,
        [Parameter(Mandatory, ValueFromPipelineByPropertyName, ValueFromPipeline, Position = 0)][Alias("id")][string]$ItemId,
        [Parameter(Mandatory, Position = 1)][string]$SubIssueUrl,
        [Parameter()][switch]$ReplaceParent
    )

    $Owner, $ProjectNumber = Get-OwnerAndProjectNumber -Owner $Owner -ProjectNumber $ProjectNumber
    if([string]::IsNullOrWhiteSpace($owner) -or [string]::IsNullOrWhiteSpace($ProjectNumber)){ throw "Owner and ProjectNumber are required"}

    # Get Parent Issue
    $parent = Get-ProjectItem -ItemId $ItemId -Owner $Owner -ProjectNumber $ProjectNumber
    if( ! $parent ){
        "Parent ItemId [$ItemId] not found on project $Owner/$ProjectNumber" | Write-MyError
        return $null
    }

    # Check if Subissue already has parent

    $parameters = @{
        contentid = $parent.contentId
        subissueurl = $SubIssueUrl
        replaceparent = $ReplaceParent.IsPresent
        # replaceparent = $false
    }

    # Call API
    try{
        $response = Invoke-MyCommand -Command AddSubIssue -Parameters $parameters
    } catch {
        $errorMessage = $_.Exception.Message
        "Failed to add SubIssue [$SubIssueUrl] to ItemId [$ItemId] - $errorMessage" | Write-MyError
        return $null
    }

    # check for errors
    $responseParentId = $response.data.addSubIssue.issue.id
    $responseSubIssueId = $response.data.addSubIssue.subIssue.id

    if( $null -eq $responseParentId -or $null -eq $responseSubIssueId ){
        "Failed to add SubIssue [$SubIssueUrl] to ItemId [$ItemId]" | Write-MyError
        return $null
    }

    $db = Get-Project -Owner $Owner -ProjectNumber $ProjectNumber

    # Add subissue to parent
    addSubIssue -Item $parent -SubIssue $response.data.addSubIssue.subIssue

    Set-Item $db $parent
    Save-ProjectDatabaseSafe -Database $db

    return $true

} Export-ModuleMember -Function Add-ProjectSubIssueDirect

function addSubIssue {
    [cmdletbinding()]
    param(
        [Parameter(Mandatory)][object]$Item,
        [Parameter(Mandatory)][object]$SubIssue
    )
    if($null -eq $item.subIssues){
        $item.subIssues = @()
    }

    $item.subIssues += $SubIssue

}