Functions/Invoke-BambooRestMethod.ps1

<#
.SYNOPSIS
    Generic helper cmdlet to invoke Rest methods agains a target Bamboo server.
.DESCRIPTION
    This cmdlet extends the original Invoke-RestMethod cmdlet with Bamboo REST
    API specific parameters, so it does user authorization and provides easier
    resource access.

.PARAMETER Resource
    Mandatory - Bamboo REST API Resource that needs to be accessed
.PARAMETER Method
    Optional - REST method to be used for the call. (Default is GET)
.PARAMETER ApiVersion
    Optional - REST API version that needs to be targeted for the call,
    for future purposes. Default is the latest.

.PARAMETER AuthenticationMode
    Optional - Authentication Mode to access Bamboo Server
.PARAMETER AuthenticationToken
    Optional - Authentication Token to access Bamboo Server

.PARAMETER UriParams
    Optional - Parameters that needs to be appended to the GET url.
.PARAMETER Headers
    Optional - HTTP Headers that needs to be added for the REST call.
.PARAMETER Body
    Optional - HTTP Body payload

.EXAMPLE
    Invoke-BambooRestMethod -Resource "plan"
.EXAMPLE
    Invoke-BambooRestMethod -Resource "plan/PRJ-PLAN/enable" -Method Delete

.LINK
    https://developer.atlassian.com/bamboodev/rest-apis
#>

function Invoke-BambooRestMethod {
    [CmdletBinding()]
    param(
        [Parameter(Mandatory)]
        [string]$Resource,

        [ValidateSet('Get','Put','Post','Delete')]
        [string]$Method = 'Get',

        [ValidateSet('latest')]
        [string]$ApiVersion='latest',
        [string]$Server = $script:BambooServer,
        [string]$Uri="$Server/rest/api/$ApiVersion/$Resource",

        [string]$AuthenticationMode=$script:AuthenticationMode,
        [string]$AuthenticationToken = $script:AuthenticationToken,

        [string]$Expand,
        [string]$ContentType='application/xml',
        
        [psobject]$UriParams=@{},
        [psobject]$Headers=@{},
        [psobject]$Body
    )

    if (-Not $UriParams) { $UriParams = @{} }

    if ($Expand) { $UriParams.expand=$Expand }

    switch ($AuthenticationMode) {
        "BASIC" {
            $UriParams.os_authType='basic'
            $Headers.Authorization = "$AuthenticationMode $AuthenticationToken"
        }
        default {
            Write-Verbose "Accessing Bamboo without credentials."
        }
    }

    if ($ContentType -eq 'application/json'){
        $Uri = -Join ($Uri, '.json')
    }

    if ($UriParams -and $UriParams.Keys) {
        $Params = ''
        foreach($key in $UriParams.Keys) {
            $Params+="$key=$($UriParams.$key)&"
        }
        if ($Params) {
            $Uri = "$($Uri)?$Params"
        }
    }
    $response = $null

    try {
        Write-Verbose "$Method : $Uri"
        $response = Invoke-RestMethod -Uri $Uri -Method:$Method -Headers:$Headers -DisableKeepAlive -ContentType $ContentType
    } catch {
        if ($_.ErrorDetails) {
            Write-Error $_.ErrorDetails.Message
        } else {
            Write-Error $_
        }
    }

    Write-Verbose "Response: $response"
    if ($response -is [xml]) {
        Write-Debug ($response.OuterXml -replace '><',">`n<")
    }
    $response
}