JobParams.psm1

function Format-ParamAsString() {
    [CmdletBinding()]
    param (
        [Parameter(Mandatory=$true, ValueFromPipeline=$true)]
        [hashtable]
        $Parameters
    )
    @(
        (($Parameters.ProjectId) -match "\d") ? $Parameters.ProjectId : ($Parameters.ProjectId).Split('/')[-1] 
        $Parameters.Branch
        $Parameters.HostEnv
        $Parameters.PipelineStage
        (Get-Date -Date $Parameters.CompletedAfter -Format d)
    ) -join "_"
}

class JobParam {
    [string] $ProjectId
    [string] $Branch = 'main'
    [datetime] $CompletedAfter = (Get-Date).AddDays(-30)
    [string] $HostEnv = 'test'
    [string] $PipelineStage = 'test'
    JobParam([string] $projectId) {
        $this.ProjectId = $projectId
    }
    [string] ToString() { return ($this.Build() | Format-ParamAsString) }
    [hashtable] Build() {
        return @{ 
            ProjectId = $this.ProjectId
            Branch = $this.Branch
            CompletedAfter = $this.CompletedAfter
            HostEnv = $this.HostEnv
            PipelineStage = $this.PipelineStage
        }
    }
}

function New-JobParam() {
    param (
        [Parameter(Mandatory=$false)]
        [string] $ProjectId = '',
        [Parameter(Mandatory=$false)]
        [string] $Branch = $null,
        [Parameter(Mandatory=$false)]
        [string] $HostEnv = $null,
        [Parameter(Mandatory=$false)]
        [string] $PipelineStage = $null,
        [Parameter(Mandatory=$false)]
        [nullable[datetime]] $CreatedAfter = $null
    )
    $JobParam = [JobParam]::new($ProjectId)
    if(-not [string]::IsNullOrEmpty($Branch)){
        $JobParam.Branch = $Branch
    }
    if(-not [string]::IsNullOrEmpty($HostEnv)){
        $JobParam.HostEnv = $HostEnv
    }
    if(-not [string]::IsNullOrEmpty($PipelineStage)){
        $JobParam.PipelineStage = $PipelineStage
    }
    if(($null -ne $CreatedAfter)){
        $JobParam.CompletedAfter = $CreatedAfter
    }
    $JobParam.Build()
}