Public/Set-IAMCoreSyncRule.ps1

function Set-IAMCoreSyncRule {
    [CmdletBinding(SupportsShouldProcess = $true)]
    param (
        [Parameter(Mandatory = $true)]
        [ValidatePattern("^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$")] # Is a guid connector object id
        [string]$Id,

        [Parameter(Mandatory = $false)]
        [string]$Description,

        [Parameter(Mandatory = $false)]
        [boolean]$ProvisioningEnabled,

        [Parameter(Mandatory = $false)]
        [boolean]$ScheduleEnabled,

        [Parameter(Mandatory = $false)]
        [ValidateSet("Identity", "Relationship", "OrgUnit")]
        [string]$CoreObjectType,

        [Parameter(Mandatory = $false)]
        [string]$ConnectorObjectType,

        [Parameter(Mandatory = $false)]
        [System.Collections.Specialized.OrderedDictionary[]] $Scope = $null,

        [Parameter(Mandatory = $false)]
        [System.Collections.Specialized.OrderedDictionary] $JoinValueExpression,

        [Parameter(Mandatory = $false)]
        [ValidateSet("Anchor1", "Anchor2", "Anchor3", "Anchor4", "Anchor5", "Anchor6", "Anchor7", "Anchor8", "Anchor9")]
        [string] $JoinAttribute,

        [Parameter(Mandatory = $false)]
        [System.Collections.Specialized.OrderedDictionary[]] $InboundAttributeFlows,

        [Parameter(Mandatory = $false)]
        [int] $Priority = (Get-Random -Minimum 100 -Maximum 1000)
    )

    $Existing = Get-IAMCoreSyncRule -Id $Id

    if (!$Existing.Id) {
        throw "IAM Core Sync Rule $Id not found"
    }

    $Existing = $Existing | ConvertTo-Json -Depth 100 | ConvertFrom-Json -Depth 100 -AsHashtable

    
    if ($PSCmdlet.MyInvocation.BoundParameters.ContainsKey("Description")) {
        $Existing.Description = $Description
    }

    if ($PSCmdlet.MyInvocation.BoundParameters.ContainsKey("ProvisioningEnabled")) {
        $Existing.ProvisioningEnabled = $ProvisioningEnabled
    }

    if ($PSCmdlet.MyInvocation.BoundParameters.ContainsKey("ScheduleEnabled")) {
        $Existing.ScheduleEnabled = $ScheduleEnabled
    }

    if ($PSCmdlet.MyInvocation.BoundParameters.ContainsKey("CoreObjectType")) {
        $Existing.CoreObjectType = $CoreObjectType
    }

    if ($PSCmdlet.MyInvocation.BoundParameters.ContainsKey("ConnectorObjectType")) {
        $Existing.ConnectorObjectType = $ConnectorObjectType
    }

    if ($PSCmdlet.MyInvocation.BoundParameters.ContainsKey("Scope")) {
        $Existing.Scope = $Scope
    }

    if ($PSCmdlet.MyInvocation.BoundParameters.ContainsKey("JoinValueExpression")) {
        $Existing.JoinValueExpression = $JoinValueExpression
    }

    if ($PSCmdlet.MyInvocation.BoundParameters.ContainsKey("JoinAttribute")) {
        $Existing.JoinAttribute = $JoinAttribute
    }

    if ($PSCmdlet.MyInvocation.BoundParameters.ContainsKey("InboundAttributeFlows")) {
        $Existing.InboundAttributeFlows = $InboundAttributeFlows
    }

    if ($PSCmdlet.MyInvocation.BoundParameters.ContainsKey("Priority")) {
        $Existing.Priority = $Priority
    }

    if ($PSCmdlet.ShouldProcess("Updating IAM Core sync rule '$Id'")) {
        $Body = $Existing | ConvertTo-Json -Depth 100

        $Result = Invoke-RestMethod -Uri "$Script:APIRoot/sync/syncrules/$Id" -Headers (Get-IAMCoreHeader) -Method Put -Body $Body -ContentType "application/json"

        if ($Result.IsSuccess) {
            return $Result.Data
        }
        else {
            throw "Failed to create IAM Core sync rule: $($Result.ErrorMessage)"
        }
    
        
    }
}