property/Set-PropertyRuleTree.ps1
Function Set-PropertyRuleTree { Param( [Parameter(ParameterSetName="name", Mandatory=$true)] [string] $PropertyName, [Parameter(ParameterSetName="id", Mandatory=$true)] [string] $PropertyId, [Parameter(Mandatory=$true)] [string] $PropertyVersion, [Parameter(Mandatory=$false, ValueFromPipeline)] [System.Object] $RuleTree, [Parameter(Mandatory=$false)] [string] $InputFile, [Parameter(Mandatory=$false)] [string] $Body, [Parameter(Mandatory=$false)] [string] $VersionNotes, [Parameter(Mandatory=$false)] [string] $SetRuleFormat, [Parameter(Mandatory=$false)] [switch] $DryRun, [Parameter(Mandatory=$false)] [string] [ValidateSet('fast','full')] $ValidateMode, [Parameter(Mandatory=$false)] [switch] $ValidateRules, [Parameter(Mandatory=$false)] [string] $GroupID, [Parameter(Mandatory=$false)] [string] $ContractId, [Parameter(Mandatory=$false)] [string] $EdgeRCFile = '~\.edgerc', [Parameter(Mandatory=$false)] [string] $Section = 'papi', [Parameter(Mandatory=$false)] [string] $AccountSwitchKey ) # Must use Process block as using ValueFromPipeline process { # Check vars if(!$Body -and !$InputFile -and !$RuleTree){ throw "You must specify one of the following: Rules object, POST body or input filename" } # nullify false switches $DryRunString = $DryRun.IsPresent.ToString().ToLower() if(!$DryRun){ $DryRunString = '' } $ValidateRulesString = $ValidateRules.IsPresent.ToString().ToLower() if(!$ValidateRules){ $ValidateRulesString = '' } if($SetRuleFormat){ $AdditionalHeaders = @{ 'Content-Type' = "application/vnd.akamai.papirules.$SetRuleFormat+json" } } if($InputFile){ if(!(Test-Path $InputFile)){ throw "Input file $Inputfile does not exist" } $Body = Get-Content $InputFile -Raw } elseif($RuleTree){ $Body = $RuleTree | ConvertTo-Json -Depth 100 } # Check body length if($Body.length -eq 0 -or $Body -eq 'null'){ # if ConvertTo-Json gets a $null object, it converts it to a string that is literally 'null' throw 'Request body or input object is invalid. Please check' } # Add notes if required if($VersionNotes){ $BodyObj = $Body | ConvertFrom-Json -Depth 100 if($BodyObj.comments){ $BodyObj.comments = $VersionNotes } else{ $BodyObj | Add-Member -MemberType NoteProperty -Name 'comments' -Value $VersionNotes } $Body = $BodyObj | ConvertTo-Json -Depth 100 } # Find property if user has specified PropertyName or version = "latest" if($PropertyName){ try{ $Property = Find-Property -PropertyName $PropertyName -latest -EdgeRCFile $EdgeRCFile -Section $Section -AccountSwitchKey $AccountSwitchKey $PropertyID = $Property.propertyId if($PropertyID -eq ''){ throw "Property '$PropertyName' not found" } } catch{ throw $_.Exception } } #Sanitize body to remove NO-BREAK SPACE Unicode character, which breaks PAPI $Body = $Body -replace "[\u00a0]", "" if($PropertyVersion.ToLower() -eq "latest"){ try{ if($PropertyName){ $PropertyVersion = $Property.propertyVersion } else{ $Property = Get-Property -PropertyId $PropertyID -GroupID $GroupID -ContractId $ContractId -EdgeRCFile $EdgeRCFile -Section $Section -AccountSwitchKey $AccountSwitchKey $PropertyVersion = $Property.latestVersion } } catch{ throw $_.Exception } } $Path = "/papi/v1/properties/$PropertyId/versions/$PropertyVersion/rules?validateRules=$ValidateRulesString&validateMode=$ValidateMode&dryRun=$DryRunString&contractId=$ContractId&groupId=$GroupID&accountSwitchKey=$AccountSwitchKey" try { $Result = Invoke-AkamaiRestMethod -Method PUT -Path $Path -Body $Body -AdditionalHeaders $AdditionalHeaders -EdgeRCFile $EdgeRCFile -Section $Section return $Result } catch { throw $_.Exception } } } |