ProjectDeployKeys.psm1

function Get-GitlabProjectDeployKey {
    param(
        [Parameter(Mandatory, ValueFromPipelineByPropertyName,Position=0)]
        [string]
        $ProjectId,

        [Parameter()]
        [string]
        $DeployKeyId,

        [Parameter()]
        [string]
        $SiteUrl
    ) 

    $Project = Get-GitlabProject -ProjectId $ProjectId -SiteUrl $SiteUrl

    $GitlabAPIParams = @{
        Method = 'Get'
        Path   = "projects/$($Project.Id)/deploy_keys"
    }

    if($PSBoundParameters.ContainsKey('DeployKeyId')) {
        $GitlabAPIParams.Path += "/$DeployKeyId"
    }

    Invoke-GitlabApi @GitlabAPIParams -SiteUrl $SiteUrl -Verbose:$VerbosePreference | New-WrapperObject 'Gitlab.DeployKey'
}

function Add-GitlabProjectDeployKey {
    param(
        [Parameter(Mandatory, ValueFromPipelineByPropertyName,Position=0)]
        [string]
        $ProjectId,

        [Parameter(Mandatory)]
        [string]
        $Title,

        [Parameter(Mandatory)]
        [string]
        $Key,

        [Parameter()]
        [switch]
        $CanPush,

        [Parameter()]
        [string]
        $SiteUrl
    ) 

    $Project = Get-GitlabProject -ProjectId $ProjectId -SiteUrl $SiteUrl

    $Body = @{
        title    = $Title
        key      = $Key
        can_push = $CanPush.IsPresent
    }

    $GitlabAPIParams = @{
        Method = 'POST'
        Path   = "projects/$($Project.Id)/deploy_keys"
        Body   = $Body
    }

    Invoke-GitlabApi @GitlabAPIParams -SiteUrl $SiteUrl -Verbose:$VerbosePreference -WhatIf:$WhatIfPreference | New-WrapperObject 'Gitlab.DeployKey'

}

function Update-GitlabProjectDeployKey {
    [CmdletBinding(SupportsShouldProcess,ConfirmImpact='High')]
    param(
        [Parameter(Mandatory, ValueFromPipelineByPropertyName,Position=0)]
        [string]
        $ProjectId,

        [Parameter(Mandatory)]
        [string]
        $DeployKeyId,

        [Parameter()]
        [string]
        $Title,

        [Parameter()]
        [boolean]
        $CanPush,

        [Parameter()]
        [string]
        $SiteUrl,

        [Parameter()]
        [switch]
        $Force
    ) 

    $Project = Get-GitlabProject -ProjectId $ProjectId -SiteUrl $SiteUrl

    $Body = @{
    }

    if($PSBoundParameters.ContainsKey('CanPush')) {
        $Body.can_push = $CanPush
    }

    $GitlabAPIParams = @{
        Method = 'PUT'
        Path   = "projects/$($Project.Id)/deploy_keys/$DeployKeyId"
        Body   = $Body
    }

    # https://learn.microsoft.com/en-us/powershell/scripting/learn/deep-dives/everything-about-shouldprocess?view=powershell-7.5#implementing--force
    if ($Force -and -not $PSBoundParameters.ContainsKey('Confirm')) {
        $ConfirmPreference = 'None'
    }
    

    if($PSCmdlet.ShouldProcess("Update deploy key for project '$($Project.PathWithNamespace)'","Update-GitlabProjectDeployKey")) {
        Invoke-GitlabApi @GitlabAPIParams -SiteUrl $SiteUrl -Verbose:$VerbosePreference -WhatIf:$WhatIfPreference | New-WrapperObject 'Gitlab.DeployKey'
    }
}

function Remove-GitlabProjectDeployKey {
    [CmdletBinding(SupportsShouldProcess,ConfirmImpact='High')]
    param(
        [Parameter(Mandatory, ValueFromPipelineByPropertyName,Position=0)]
        [string]
        $ProjectId,

        [Parameter(Mandatory)]
        [string]
        $DeployKeyId,

        [Parameter()]
        [string]
        $SiteUrl,

        [Parameter()]
        [switch]
        $Force
    ) 

    $Project = Get-GitlabProject -ProjectId $ProjectId -SiteUrl $SiteUrl

    $GitlabAPIParams = @{
        Method = 'DELETE'
        Path   = "projects/$($Project.Id)/deploy_keys/$DeployKeyId"
    }

    # https://learn.microsoft.com/en-us/powershell/scripting/learn/deep-dives/everything-about-shouldprocess?view=powershell-7.5#implementing--force
    if ($Force -and -not $PSBoundParameters.ContainsKey('Confirm')) {
        $ConfirmPreference = 'None'
    }

    if($PSCmdlet.ShouldProcess("Remove deploy key for project '$($Project.PathWithNamespace)'","Remove-GitlabProjectDeployKey")) {
        Invoke-GitlabApi @GitlabAPIParams -SiteUrl $SiteUrl -Verbose:$VerbosePreference -WhatIf:$WhatIfPreference | Out-Null
    }
}

function Enable-GitlabProjectDeployKey {
    [CmdletBinding(SupportsShouldProcess,ConfirmImpact='High')]
    param(
        [Parameter(Mandatory, ValueFromPipelineByPropertyName,Position=0)]
        [string]
        $ProjectId,

        [Parameter(Mandatory)]
        [string]
        $DeployKeyId,

        [Parameter()]
        [string]
        $SiteUrl,

        [Parameter()]
        [switch]
        $Force
    ) 

    $Project = Get-GitlabProject -ProjectId $ProjectId -SiteUrl $SiteUrl

    $GitlabAPIParams = @{
        Method = 'POST'
        Path   = "projects/$($Project.Id)/deploy_keys/$DeployKeyId/enable"
    }

    # https://learn.microsoft.com/en-us/powershell/scripting/learn/deep-dives/everything-about-shouldprocess?view=powershell-7.5#implementing--force
    if ($Force -and -not $PSBoundParameters.ContainsKey('Confirm')) {
        $ConfirmPreference = 'None'
    }

    if($PSCmdlet.ShouldProcess("Enable deploy key for project '$($Project.PathWithNamespace)'","Enable-GitlabProjectDeployKey")) {
        Invoke-GitlabApi @GitlabAPIParams -SiteUrl $SiteUrl -Verbose:$VerbosePreference -WhatIf:$WhatIfPreference | New-WrapperObject 'Gitlab.DeployKey'
    }
}