Deployments.psm1

# https://docs.gitlab.com/ee/api/deployments.html#list-project-deployments
function Get-GitlabDeployment {
    [CmdletBinding(DefaultParameterSetName='ProjectId')]
    [Alias('deploys')]
    param (
        [Parameter(Mandatory=$false, ValueFromPipelineByPropertyName=$true)]
        [string]
        $ProjectId = '.',

        [Parameter(Mandatory=$false, ValueFromPipelineByPropertyName=$true)]
        [string]
        $EnvironmentName,

        [Parameter(Mandatory=$false)]
        [ValidateSet('created', 'running', 'success', 'failed', 'canceled', 'all')]
        [string]
        $Status = 'success',

        [Parameter(Mandatory=$false)]
        [switch]
        $Latest,

        [Parameter(Mandatory=$false)]
        [string]
        $UpdatedBefore,

        [Parameter(Mandatory=$false)]
        [string]
        $UpdatedAfter,

        [Parameter(Mandatory=$false)]
        [int]
        $MaxPages = 1,

        [Parameter(Mandatory=$false)]
        [switch]
        $Pipeline,

        [Parameter(Mandatory=$false)]
        [string]
        $SiteUrl,

        [switch]
        [Parameter(Mandatory=$false)]
        $WhatIf
    )

    $Project = Get-GitlabProject -ProjectId $ProjectId

    $GitlabApiArguments = @{
        HttpMethod = 'GET'
        Path = "projects/$($Project.Id)/deployments"
        Query = @{
            sort='desc'
        }
        MaxPages = $MaxPages
        SiteUrl = $SiteUrl
    }

    if ($EnvironmentName) {
        $GitlabApiArguments.Query['environment'] = $EnvironmentName
    }
    if ($Status -and $Status -ne 'all') {
        $GitlabApiArguments.Query['status'] = $Status
    }
    if ($UpdatedBefore) {
        $GitlabApiArguments.Query['updated_before'] = $UpdatedBefore
    }
    if ($UpdatedAfter) {
        $GitlabApiArguments.Query['updated_after'] = $UpdatedAfter
    }

    $Result = Invoke-GitlabApi @GitlabApiArguments -WhatIf:$WhatIf | New-WrapperObject 'Gitlab.Deployment'

    if ($Latest) {
        $Result = $Result | Select-Object -First 1
    }
    if ($Pipeline) {
        $Result = $Result.Pipeline
    }

    $Result
}