Notes.psm1

# https://docs.gitlab.com/ee/api/notes.html

function Get-GitlabIssueNote {
    [CmdletBinding()]
    [OutputType('Gitlab.Note')]
    param (
        [Parameter(ValueFromPipelineByPropertyName)]
        [string]
        $ProjectId = '.',

        [Parameter(Position=0, Mandatory, ValueFromPipelineByPropertyName)]
        [string]
        $IssueId,

        [Parameter(Position=1)]
        [string]
        $NoteId,

        [Parameter()]
        [string]
        $SiteUrl
    )

    $ProjectId = Resolve-GitlabProjectId $ProjectId

    # https://docs.gitlab.com/ee/api/notes.html#list-project-issue-notes
    $Url = "projects/$ProjectId/issues/$IssueId/notes"
    if ($NoteId) {
        # https://docs.gitlab.com/ee/api/notes.html#retrieve-an-issue-note
        $Url += "/$NoteId"
    }

    Invoke-GitlabApi GET $Url | New-GitlabObject 'Gitlab.Note'
}

function New-GitlabIssueNote {
    [Alias('Add-GitlabIssueNote')]
    [CmdletBinding(SupportsShouldProcess)]
    [OutputType('Gitlab.Note')]
    param (
        [Parameter(ValueFromPipelineByPropertyName)]
        [string]
        $ProjectId = '.',

        [Parameter(ValueFromPipelineByPropertyName)]
        [string]
        $IssueId,

        [Parameter(Position=0, Mandatory)]
        [string]
        $Note,

        [Parameter()]
        [string]
        $SiteUrl
    )

    $ProjectId = Resolve-GitlabProjectId $ProjectId

    if ($PSCmdlet.ShouldProcess("issue #$IssueId", "Create new issue note ($Note)")) {
        # https://docs.gitlab.com/ee/api/notes.html#create-new-issue-note
        Invoke-GitlabApi POST "projects/$ProjectId/issues/$IssueId/notes" -Body @{body = $Note} | New-GitlabObject 'Gitlab.Note'
    }
}

function Update-GitlabIssueNote {
    [CmdletBinding(SupportsShouldProcess)]
    [OutputType('Gitlab.Note')]
    param (
        [Parameter(ValueFromPipelineByPropertyName)]
        [string]
        $ProjectId = '.',

        [Parameter(ValueFromPipelineByPropertyName)]
        [string]
        $IssueId,

        [Parameter(Mandatory, ValueFromPipelineByPropertyName)]
        [string]
        $NoteId,

        [Parameter(Position=0, Mandatory)]
        [string]
        $Note,

        [Parameter()]
        [string]
        $SiteUrl
    )

    $ProjectId = Resolve-GitlabProjectId $ProjectId

    if ($PSCmdlet.ShouldProcess("issue #$IssueId note $NoteId", "Update issue note ($Note)")) {
        # https://docs.gitlab.com/ee/api/notes.html#update-an-issue-note
        Invoke-GitlabApi PUT "projects/$ProjectId/issues/$IssueId/notes/$NoteId" -Body @{body = $Note} | New-GitlabObject 'Gitlab.Note'
    }
}

function Remove-GitlabIssueNote {
    [CmdletBinding(SupportsShouldProcess, ConfirmImpact='High')]
    [OutputType([void])]
    param (
        [Parameter(ValueFromPipelineByPropertyName)]
        [string]
        $ProjectId = '.',

        [Parameter(ValueFromPipelineByPropertyName)]
        [string]
        $IssueId,

        [Parameter(Position=0, Mandatory, ValueFromPipelineByPropertyName)]
        [string]
        $NoteId,

        [Parameter()]
        [string]
        $SiteUrl
    )

    $ProjectId = Resolve-GitlabProjectId $ProjectId

    if ($PSCmdlet.ShouldProcess("issue #$IssueId note $NoteId", "Delete issue note")) {
        # https://docs.gitlab.com/ee/api/notes.html#delete-an-issue-note
        Invoke-GitlabApi DELETE "projects/$ProjectId/issues/$IssueId/notes/$NoteId" | Out-Null
    }
}

function Get-GitlabMergeRequestNote {
    [CmdletBinding()]
    [OutputType('Gitlab.Note')]
    param (
        [Parameter(ValueFromPipelineByPropertyName)]
        [string]
        $ProjectId = '.',

        [Parameter(Position=0, Mandatory, ValueFromPipelineByPropertyName)]
        [string]
        $MergeRequestId,

        [Parameter(Position=1)]
        [string]
        $NoteId,

        [Parameter()]
        [string]
        $SiteUrl
    )

    $ProjectId = Resolve-GitlabProjectId $ProjectId

    # https://docs.gitlab.com/ee/api/notes.html#list-all-merge-request-notes
    $Url = "projects/$ProjectId/merge_requests/$MergeRequestId/notes"
    if ($NoteId) {
        # https://docs.gitlab.com/ee/api/notes.html#retrieve-a-merge-request-note
        $Url += "/$NoteId"
    }

    Invoke-GitlabApi GET $Url | New-GitlabObject 'Gitlab.Note'
}

function New-GitlabMergeRequestNote {
    [Alias('Add-GitlabMergeRequestNote')]
    [CmdletBinding(SupportsShouldProcess)]
    [OutputType('Gitlab.Note')]
    param (
        [Parameter(ValueFromPipelineByPropertyName)]
        [string]
        $ProjectId = '.',

        [Parameter(ValueFromPipelineByPropertyName)]
        [string]
        $MergeRequestId,

        [Parameter(Position=0, Mandatory)]
        [string]
        $Note,

        [Parameter()]
        [string]
        $SiteUrl
    )

    $ProjectId = Resolve-GitlabProjectId $ProjectId

    if ($PSCmdlet.ShouldProcess("MR #$MergeRequestId", "Create new merge request note ($Note)")) {
        # https://docs.gitlab.com/ee/api/notes.html#create-a-merge-request-note
        Invoke-GitlabApi POST "projects/$ProjectId/merge_requests/$MergeRequestId/notes" -Body @{body = $Note} | New-GitlabObject 'Gitlab.Note'
    }
}

function Update-GitlabMergeRequestNote {
    [CmdletBinding(SupportsShouldProcess)]
    [OutputType('Gitlab.Note')]
    param (
        [Parameter(ValueFromPipelineByPropertyName)]
        [string]
        $ProjectId = '.',

        [Parameter(ValueFromPipelineByPropertyName)]
        [string]
        $MergeRequestId,

        [Parameter(Mandatory, ValueFromPipelineByPropertyName)]
        [string]
        $NoteId,

        [Parameter(Position=0, Mandatory)]
        [string]
        $Note,

        [Parameter()]
        [string]
        $SiteUrl
    )

    $ProjectId = Resolve-GitlabProjectId $ProjectId

    if ($PSCmdlet.ShouldProcess("MR #$MergeRequestId note $NoteId", "Update merge request note ($Note)")) {
        # https://docs.gitlab.com/ee/api/notes.html#update-a-merge-request-note
        Invoke-GitlabApi PUT "projects/$ProjectId/merge_requests/$MergeRequestId/notes/$NoteId" -Body @{body = $Note} | New-GitlabObject 'Gitlab.Note'
    }
}

function Remove-GitlabMergeRequestNote {
    [CmdletBinding(SupportsShouldProcess, ConfirmImpact='High')]
    [OutputType([void])]
    param (
        [Parameter(ValueFromPipelineByPropertyName)]
        [string]
        $ProjectId = '.',

        [Parameter(ValueFromPipelineByPropertyName)]
        [string]
        $MergeRequestId,

        [Parameter(Position=0, Mandatory, ValueFromPipelineByPropertyName)]
        [string]
        $NoteId,

        [Parameter()]
        [string]
        $SiteUrl
    )

    $ProjectId = Resolve-GitlabProjectId $ProjectId

    if ($PSCmdlet.ShouldProcess("MR #$MergeRequestId note $NoteId", "Delete merge request note")) {
        # https://docs.gitlab.com/ee/api/notes.html#delete-a-merge-request-note
        Invoke-GitlabApi DELETE "projects/$ProjectId/merge_requests/$MergeRequestId/notes/$NoteId" | Out-Null
    }
}