Public/Set-MITFolderAcl.ps1

function Set-MITFolderAcl {
    <#
    .SYNOPSIS
        Change a MOVEit Transfer Folder Acl
    .LINK
        Change the Access Controls for a given folder
        https://docs.ipswitch.com/MOVEit/Transfer2023/Api/Rest/#operation/PUTapi/v1/folders/{Id}/acls-1.0
    .LINK
        Change the single user Access Controls for a given folder
        https://docs.ipswitch.com/MOVEit/Transfer2023/Api/Rest/#operation/PATCHapi/v1/folders/{Id}/acls/{entryId}-1.0
    #>

    [OutputType('MITFolderAcl')]
    [CmdletBinding()]
    param (
        [Parameter(Mandatory,
                    Position=0,
                    ValueFromPipelineByPropertyName)]
        [Alias('Id')]                    
        [string]$FolderId,

        [Parameter(Mandatory,
            ParameterSetName = 'ByTypeHashtable')]
        [Parameter(Mandatory,                    
            ParameterSetName = 'ByTypeSwitches')]
        [Parameter(Mandatory,                    
            ParameterSetName = 'ByTypeStringArray')]
        [ValidateSet('None','User','Group','Email')]
        [string]$Type,

        [Parameter(Mandatory,
            ParameterSetName = 'ByTypeHashtable')]
        [Parameter(Mandatory,
            ParameterSetName = 'ByTypeSwitches')]
        [Parameter(Mandatory,
            ParameterSetName = 'ByTypeStringArray')]
        [string]$TypeId,

        [Parameter(Mandatory,
            ParameterSetName = 'ByEntryHashtable')]
        [Parameter(Mandatory,
            ParameterSetName = 'ByEntrySwitches')]
        [Parameter(Mandatory,
            ParameterSetName = 'ByEntryStringArray')]
        [string]$EntryId,
        
        [Parameter()]
        [ValidateSet('AddToInherited', 'OverrideInherited')]
        [string]$OverrideBehaviourType,

        # The caller can pass-in a hashtable that will be passed straight
        # to the REST API...
        [Parameter(Mandatory, 
                ParameterSetName = 'ByTypeHashtable')]
        [Parameter(Mandatory,
                ParameterSetName = 'ByEntryHashtable')]
        [hashtable]$Permissions,

        # ...or, the caller can pass-in a StringArray
        [Parameter(Mandatory,
                ParameterSetName = 'ByTypeStringArray')]
        [Parameter(Mandatory,
                ParameterSetName = 'ByEntryStringArray')]
        [ValidateSet('ReadFiles','WriteFiles','DeleteFiles','ListFiles',
                     'Notify','AddDeleteSubfolders','Share','Admin','ListUsers')]
        [string[]]$FolderPermissions,

        # ...or, the caller can use switches to specify the permissions
        [Parameter(ParameterSetName = 'ByTypeSwitches')]
        [Parameter(ParameterSetName = 'ByEntrySwitches')]
        [switch]$ReadFiles,

        [Parameter(ParameterSetName = 'ByTypeSwitches')]
        [Parameter(ParameterSetName = 'ByEntrySwitches')]
        [switch]$WriteFiles,

        [Parameter(ParameterSetName = 'ByTypeSwitches')]
        [Parameter(ParameterSetName = 'ByEntrySwitches')]
        [switch]$DeleteFiles,

        [Parameter(ParameterSetName = 'ByTypeSwitches')]
        [Parameter(ParameterSetName = 'ByEntrySwitches')]
        [switch]$ListFiles,

        [Parameter(ParameterSetName = 'ByTypeSwitches')]
        [Parameter(ParameterSetName = 'ByEntrySwitches')]
        [switch]$Notify,

        [Parameter(ParameterSetName = 'ByTypeSwitches')]
        [Parameter(ParameterSetName = 'ByEntrySwitches')]
        [switch]$AddDeleteSubfolders,

        [Parameter(ParameterSetName = 'ByTypeSwitches')]
        [Parameter(ParameterSetName = 'ByEntrySwitches')]
        [switch]$Share,

        [Parameter(ParameterSetName = 'ByTypeSwitches')]
        [Parameter(ParameterSetName = 'ByEntrySwitches')]
        [switch]$Admin,

        [Parameter(ParameterSetName = 'ByTypeSwitches')]
        [Parameter(ParameterSetName = 'ByEntrySwitches')]
        [switch]$ListUsers 
    )

    try {
        # Set the resource for this request
        $resource = "folders/$FolderId/acls"
                    
        # Build up the permissions hashtable from the switch parameters or the [MITFolderAcl] parameters
        switch -Wildcard ($PSCmdlet.ParameterSetName) {
            '*Switches' {
                $Permissions = [ordered]@{
                    readFiles           = "$ReadFiles"
                    writeFiles          = "$WriteFiles"
                    deleteFiles         = "$DeleteFiles"
                    listFiles           = "$ListFiles"
                    notify              = "$Notify"
                    addDeleteSubfolders = "$AddDeleteSubfolders"
                    share               = "$Share"
                    admin               = "$Admin"
                    listUsers           = "$ListUsers"
                }
            }

            '*StringArray' {
                $Permissions = [ordered]@{
                    readFiles           = "$($FolderPermissions -contains 'ReadFiles')"
                    writeFiles          = "$($FolderPermissions -contains 'WriteFiles')"
                    deleteFiles         = "$($FolderPermissions -contains 'DeleteFiles')"
                    listFiles           = "$($FolderPermissions -contains 'ListFiles')"
                    notify              = "$($FolderPermissions -contains 'Notify')"
                    addDeleteSubfolders = "$($FolderPermissions -contains 'AddDeleteSubfolders')"
                    share               = "$($FolderPermissions -contains 'Share')"
                    admin               = "$($FolderPermissions -contains 'Admin')"
                    listUsers           = "$($FolderPermissions -contains 'ListUsers')"
                }
            }
        }

        switch -Wildcard ($PSCmdlet.ParameterSetName) {
            'ByType*' {
                $body = @{
                    type                = $Type
                    id                  = $TypeId
                    permissions         = $Permissions
                }
                
                if ($PSBoundParameters.ContainsKey('OverrideBehaviourType')) {
                    $body['overrideBehaviourType'] = $OverrideBehaviourType
                }
                                
                # Setup the params to splat to IRM
                $irmParams = @{
                    Resource    = $resource
                    Method      = 'Put'
                    ContentType = 'application/json'
                    Body        = ($body | ConvertTo-Json)
                }
            }

            'ByEntry*' {
                $body = @{
                    permissions = $Permissions
                }
                
                if ($PSBoundParameters.ContainsKey('OverrideBehaviourType')) {
                    $body['overrideBehaviourType'] = $OverrideBehaviourType
                }
                                
                # Setup the params to splat to IRM
                $irmParams = @{
                    Resource    = "$resource/$EntryId"
                    Method      = 'Patch'
                    ContentType = 'application/json'
                    Body        = ($body | ConvertTo-Json)
                }
            }
        }

        # Send the request and output the response
        Invoke-MITRequest @irmParams |
            Write-MITResponse -TypeName 'MITFolderAcl'
    }
    catch {
        $PSCmdlet.ThrowTerminatingError($PSItem)
    }
}