Public/ConnectedSystems/Set-JIMConnectedSystemStructuralCarrierClass.ps1

# Copyright (c) Tetron Limited. All rights reserved.
# Licensed under the Tetron Commercial License. See LICENSE file in the project root.

function Set-JIMConnectedSystemStructuralCarrierClass {
    <#
    .SYNOPSIS
        Sets the Structural Carrier Class of an auxiliary Connected System Object Type.
 
    .DESCRIPTION
        An entry in a directory carries exactly one structural class, so an Object Type that is
        itself an auxiliary class has to name the structural class JIM writes alongside it when
        creating an entry. Until one is named, JIM can import objects of that type but cannot
        create them.
 
        Only an auxiliary Object Type takes a carrier, and only a structural Object Type in the same
        Connected System can be one.
 
    .PARAMETER ConnectedSystemId
        The ID of the Connected System.
 
    .PARAMETER ObjectTypeId
        The ID of the auxiliary Object Type.
 
    .PARAMETER StructuralCarrierObjectTypeId
        The structural Object Type JIM writes alongside the auxiliary class when creating an object.
 
    .PARAMETER Clear
        Clears the carrier, so objects of the type can be imported but not created.
 
    .PARAMETER PassThru
        Returns the Object Type as changed.
 
    .OUTPUTS
        With -PassThru, the Object Type as changed, whose StructuralCarrierObjectTypeId names its carrier; otherwise
        nothing.
 
    .EXAMPLE
        Set-JIMConnectedSystemStructuralCarrierClass -ConnectedSystemId 1 -ObjectTypeId 12 -StructuralCarrierObjectTypeId 3
 
        Creates objects of the auxiliary Object Type as the structural Object Type 3 carrying it.
 
    .EXAMPLE
        Get-JIMConnectedSystemObjectType -ConnectedSystemId 1 |
            Where-Object { $_.isAuxiliary -and $_.selected -and -not $_.structuralCarrierObjectTypeId } |
            Select-Object -Property id, name
 
        Finds the selected auxiliary Object Types JIM cannot yet create objects for.
 
    .EXAMPLE
        Set-JIMConnectedSystemStructuralCarrierClass -ConnectedSystemId 1 -ObjectTypeId 12 -Clear
 
        Clears the carrier. JIM will keep importing objects of this type and stop creating them.
 
    .LINK
        Get-JIMConnectedSystemObjectType
        Set-JIMConnectedSystemAuxiliaryClass
    #>

    [CmdletBinding(SupportsShouldProcess, ConfirmImpact = 'Medium', DefaultParameterSetName = 'Set')]
    [OutputType('JIM.ConnectedSystemObjectTypeDto')]
    param(
        [Parameter(Mandatory)]
        [int]$ConnectedSystemId,

        [Parameter(Mandatory, ValueFromPipelineByPropertyName)]
        [int]$ObjectTypeId,

        [Parameter(Mandatory, ParameterSetName = 'Set')]
        [int]$StructuralCarrierObjectTypeId,

        [Parameter(Mandatory, ParameterSetName = 'Clear')]
        [switch]$Clear,

        [switch]$PassThru
    )

    process {
        # Check connection first
        if (-not $script:JIMConnection) {
            Write-Error "You are not connected to JIM. Run Connect-JIM -Url <your JIM URL> to authenticate, then try again."
            return
        }

        $carrierId = if ($Clear) { $null } else { $StructuralCarrierObjectTypeId }
        $body = @{ structuralCarrierObjectTypeId = $carrierId }

        $description = if ($null -eq $carrierId) {
            "Clear the Structural Carrier Class"
        }
        else {
            "Set the Structural Carrier Class to Object Type $carrierId"
        }

        if ($PSCmdlet.ShouldProcess("Object Type $ObjectTypeId in Connected System $ConnectedSystemId", $description)) {
            Write-Verbose "Setting the Structural Carrier Class for Object Type: $ObjectTypeId in Connected System: $ConnectedSystemId"

            try {
                $result = Invoke-JIMApi -Endpoint "/api/v1/synchronisation/connected-systems/$ConnectedSystemId/object-types/$ObjectTypeId/structural-carrier" -Method 'PUT' -Body $body

                Write-Verbose "Set the Structural Carrier Class for Object Type: $ObjectTypeId"

                if ($PassThru) {
                    $result
                }
            }
            catch {
                Write-Error "Failed to set the Structural Carrier Class: $_"
            }
        }
    }
}