Public/Security/Remove-JIMRoleMember.ps1

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

function Remove-JIMRoleMember {
    <#
    .SYNOPSIS
        Removes a Metaverse Object from a security Role in JIM.
 
    .DESCRIPTION
        Removes a Metaverse Object from the specified security Role. This revokes
        the permissions associated with that Role for the object.
 
        Safety checks prevent removing yourself from the Administrator role and
        removing the last Administrator, as either action would cause a lockout.
 
    .PARAMETER RoleId
        The unique identifier (integer) of the Role to remove the member from.
 
    .PARAMETER MetaverseObjectId
        The unique identifier (GUID) of the Metaverse Object to remove.
 
    .PARAMETER Force
        Suppresses confirmation prompts.
 
    .OUTPUTS
        None.
 
    .EXAMPLE
        Remove-JIMRoleMember -RoleId 1 -MetaverseObjectId "a1b2c3d4-e5f6-7890-abcd-ef1234567890"
 
        Removes the specified metaverse object from the role (prompts for confirmation).
 
    .EXAMPLE
        Remove-JIMRoleMember -RoleId 1 -MetaverseObjectId "a1b2c3d4-..." -Force
 
        Removes the member without confirmation.
 
    .EXAMPLE
        Get-JIMRoleMember -RoleId 2 | Where-Object { $_.displayName -eq "Bob" } | Remove-JIMRoleMember -RoleId 2 -Force
 
        Removes a specific member from a role by name.
 
    .LINK
        Get-JIMRole
        Get-JIMRoleMember
        Add-JIMRoleMember
    #>

    [CmdletBinding(SupportsShouldProcess, ConfirmImpact = 'High', DefaultParameterSetName = 'ById')]
    param(
        [Parameter(Mandatory)]
        [int]$RoleId,

        [Parameter(Mandatory, ParameterSetName = 'ById', ValueFromPipelineByPropertyName)]
        [Alias('Id')]
        [Guid]$MetaverseObjectId,

        [Parameter(Mandatory, ParameterSetName = 'ByInputObject', ValueFromPipeline)]
        [PSCustomObject]$InputObject,

        [switch]$Force
    )

    process {
        # Check connection first
        if (-not $script:JIMConnection) {
            Write-Error "Not connected to JIM. Use Connect-JIM first."
            return
        }

        $objectId = if ($InputObject) { $InputObject.id } else { $MetaverseObjectId }

        if ($Force -or $PSCmdlet.ShouldProcess($objectId, "Remove from Role $RoleId")) {
            Write-Verbose "Removing metaverse object $objectId from role $RoleId"

            try {
                $null = Invoke-JIMApi -Endpoint "/api/v1/security/roles/$RoleId/members/$objectId" -Method 'DELETE'
                Write-Verbose "Removed metaverse object $objectId from role $RoleId"
            }
            catch {
                Write-Error "Failed to remove role member: $_"
            }
        }
    }
}