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 } } } |