Public/Settings.ps1

function New-TMSetting {
    [CmdletBinding()]
    param (
        [Parameter(Mandatory = $false, Position = 0)]
        [PSObject]$TMSession = 'Default',

        [Parameter(Mandatory = $true, ValueFromPipelineByPropertyName = $true)]
        [Alias('Key')]
        [String]$Name,

        [Parameter(Mandatory = $false, ValueFromPipelineByPropertyName = $true)]
        [AllowNull()]
        [Alias('Project')]
        [Object]$ProjectId,

        [ArgumentCompleter({ [TMSetting]::ValidCategories })]
        [ValidateScript( { $_ -in [TMSetting]::ValidCategories } )]
        [Parameter(Mandatory = $false, ValueFromPipelineByPropertyName = $true)]
        [String]$Category = 'SCRIPT_SETTING',

        [Parameter(Mandatory = $true, ValueFromPipelineByPropertyName = $true)]
        [Object]$Value,

        [Parameter(Mandatory = $false)]
        [Switch]$Passthru
    )

    begin {
        # Get the session configuration
        Write-Verbose 'Checking for cached TMSession'
        $TMSession = Get-TMSession $TMSession
        Write-Debug 'TMSession:'
        Write-Debug ($TMSession | ConvertTo-Json -Depth 5)

        ## Check for an existing setting
        $GetSettingSplat = @{
            TMSession = $TMSession
            Name      = $Name
            ProjectId = $ProjectId
            Category  = $Category
        }
        $ExistingSetting = Get-TMSetting @GetSettingSplat
        if ($ExistingSetting) {
            throw "Setting named [$Name] already exists, use Get-TMSetting and Set-TMSetting to update it."
        }

        if ($ProjectId -is [TMReference]) {
            $ProjectId = $ProjectId.Id
        } else {
            $ProjectId = $TMSession.Project.Id
        }
        $bodyParams = @{
            category = $Category
            key      = $Name
            type     = $Value -is [string] ? 'text' : 'json'
            value    = $Value
        }
    }

    process {
        $Response = Invoke-TMRestMethod -Api setting -BodyParams $bodyParams -Method Post
        if ($Passthru) {
            ## Workaround for 5.0.4 bug identified
            $Response.project = $TMSession.UserContext.Project
            [TMSetting]::new($Response)
        }
    }
}
function Set-TMSetting {
    [CmdletBinding()]
    param (
        [Parameter(Mandatory = $false, Position = 0)]
        [PSObject]$TMSession = 'Default',

        [Parameter(ParameterSetName = "ByValue", Mandatory, Position = 0)]
        [TMSetting] $TMSetting,

        [Parameter(ParameterSetName = "ByProperty", Mandatory = $true, ValueFromPipelineByPropertyName = $true)]
        [Object]$Id,

        [Parameter(ParameterSetName = "ByProperty", Mandatory = $true, ValueFromPipelineByPropertyName = $true)]
        [Alias('Key')]
        [String]$Name,

        [Parameter(ParameterSetName = "ByProperty", Mandatory = $false, ValueFromPipelineByPropertyName = $true)]
        [AllowNull()]
        [Alias('Project')]
        [Object]$ProjectId,

        [ArgumentCompleter({ [TMSetting]::ValidCategories })]
        [ValidateScript( { $_ -in [TMSetting]::ValidCategories } )]
        [Parameter(ParameterSetName = "ByProperty", Mandatory = $true, ValueFromPipelineByPropertyName = $true)]
        [String]$Category = 'SCRIPT_SETTING',

        [Parameter(ParameterSetName = "ByProperty", Mandatory = $true, ValueFromPipelineByPropertyName = $true)]
        [Object]$Value,

        [Parameter(Mandatory = $false, ValueFromPipelineByPropertyName = $true)]
        [ValidateSet('json', 'text')]
        [String]$Format = 'json',

        [Parameter(Mandatory = $false)]
        [Switch]$Passthru
    )

    begin {

        if ($PSCmdlet.ParameterSetName -eq "ByValue") {
            $Id = $TMSetting.Id
            $ProjectId = $TMSetting.Project
            $Category = $TMSetting.Category
            $Name = $TMSetting.Key
            $Value = $TMSetting.Value
        }

        # Get the session configuration
        Write-Verbose "Checking for cached TMSession"
        $TMSession = Get-TMSession $TMSession
        Write-Debug "TMSession:"
        Write-Debug ($TMSession | ConvertTo-Json -Depth 5)
        $bodyParams = @{
            id       = $Id
            category = $Category
            key      = $Name
            type     = $Value -is [String] ? 'text' : 'json'
            value    = $Value
        }

        if ($ProjectId -is [TMReference]) {
            $ProjectId = $ProjectId.Id
        } else {
            $ProjectId = $TMSession.Project.Id
        }
    }

    process {
        $Response = Invoke-TMRestMethod -Api "setting/$Id.$Format" -ApiParams "project=$ProjectId" -BodyParams $bodyParams -Method Put
        if ($Passthru) {
            [TMSetting]::new($Response)
        }
    }
}


function Get-TMSetting {
    [CmdletBinding(DefaultParameterSetName = 'ByProperty')]
    param (
        [Parameter(Mandatory = $false, Position = 0)]
        [PSObject]$TMSession = 'Default',

        [Parameter(ParameterSetName = "ByValue", Mandatory, Position = 0)]
        [TMSetting] $TMSetting,

        [Parameter(Mandatory = $true,
            ParameterSetName = 'ById',
            ValueFromPipelineByPropertyName = $true)]
        [Int]$Id,

        [Parameter(ParameterSetName = 'ByProperty', Mandatory = $true, ValueFromPipelineByPropertyName = $true)]
        [Alias('Key')]
        [String]$Name,

        [Parameter(Mandatory = $false, ValueFromPipelineByPropertyName = $true)]
        [ArgumentCompleter({ [TMSetting]::ValidCategories })]
        [ValidateScript( { $_ -in [TMSetting]::ValidCategories } )]
        [String]$Category = 'SCRIPT_SETTING',

        [Parameter(Mandatory = $false, ValueFromPipelineByPropertyName = $true)]
        [AllowNull()]
        [Alias('Project')]
        [Object]$ProjectId = $TMSessions[$TMSession].UserContext.Project.id,

        [Parameter(Mandatory = $false, ValueFromPipelineByPropertyName = $true)]
        [ValidateSet('json', 'text')]
        [String]$Format = 'json',

        [Parameter(Mandatory = $false)]
        [Switch]$ValueOnly
    )

    begin {

        if ($PSCmdlet.ParameterSetName -eq "ByValue") {
            $Id = $TMSetting.Id
            $ProjectId = $TMSetting.Project
            $Category = $TMSetting.Category
            $Name = $TMSetting.Key
        }

        # Get the session configuration
        Write-Verbose "Checking for cached TMSession"
        $TMSession = Get-TMSession $TMSession
        Write-Debug "TMSession:"
        Write-Debug ($TMSession | ConvertTo-Json -Depth 5)

    }

    process {

        if ($ProjectId -is [TMReference]) {
            $ProjectId = $ProjectId.Id
        }
        $Response = Invoke-TMRestMethod -Api setting -Method Get

        ## Handle an array of messages
        if ($Response.GetType().Name -eq 'Object[]') {
            $Response = $Response
        }

        ## Handle something that is not a PS Custom Object
        elseif ($Response.GetType().Name -ne 'PSCustomObject') {
            $ResponseHash = $Response | ConvertFrom-Json -AsHashtable -ErrorAction 'SilentlyContinue'
            if ($ResponseHash) {
                $Response = $ResponseHash
            }
        }

        $Setting = [TMSetting]::new($Response)
        $ValueOnly.IsPresent ? $Setting.Value : $Setting
    }
}

function Remove-TMSetting {
    [CmdletBinding()]
    param (
        [Parameter(Mandatory = $false, Position = 0)]
        [PSObject]$TMSession = 'Default',

        [Parameter(Mandatory = $true, ValueFromPipelineByPropertyName = $true)]
        [Object]$Id,

        [Parameter(Mandatory = $true, ValueFromPipelineByPropertyName = $true)]
        [Alias('Key')]
        [String]$Name,

        [Parameter(Mandatory = $false, ValueFromPipelineByPropertyName = $true)]
        [AllowNull()]
        [Alias('Project')]
        [Object]$ProjectId,

        [ArgumentCompleter({ [TMSetting]::ValidCategories })]
        [ValidateScript( { $_ -in [TMSetting]::ValidCategories } )]
        [Parameter(Mandatory = $true, ValueFromPipelineByPropertyName = $true)]
        [String]$Category,

        [Parameter(Mandatory = $true, ValueFromPipelineByPropertyName = $true)]
        [Object]$Value

    )

    begin {
        # Get the session configuration
        Write-Verbose "Checking for cached TMSession"
        $TMSession = Get-TMSession $TMSession
        Write-Debug 'TMSession:'
        Write-Debug ($TMSession | ConvertTo-Json -Depth 5)
        $bodyParams = @{
            id       = $Id
            category = $Category
            key      = $Name
            type     = $Value -is [string] ? 'text' : 'json'
            value    = $Value
        }
    }

    process {
        if ($ProjectId -is [TMReference]) {
            $ProjectId = $ProjectId.Id
        } else {
            $ProjectId = $TMSession.Project.Id
        }

        $Response = Invoke-TMRestMethod -Api setting/$Id -Method Delete -BodyParams $bodyParams
        if ($Response.deleted -eq 1) {
            return
        }
    }
}