Public/History/Get-JIMDeletedObject.ps1

function Get-JIMDeletedObject {
    <#
    .SYNOPSIS
        Gets deleted objects (CSOs or MVOs) from the deleted objects view.
 
    .DESCRIPTION
        Retrieves deleted Connected System Objects (CSOs) or Metaverse Objects (MVOs)
        from the JIM deleted objects audit trail. When objects are deleted, their identity
        and change history are preserved for audit and compliance purposes.
 
        By default, retrieves deleted MVOs. Use -ObjectType CSO to retrieve deleted CSOs.
 
    .PARAMETER ObjectType
        The type of deleted objects to retrieve: 'MVO' (default) or 'CSO'.
 
    .PARAMETER ConnectedSystemId
        Filter deleted CSOs by Connected System ID. Only valid when ObjectType is 'CSO'.
 
    .PARAMETER MetaverseObjectTypeId
        Filter deleted MVOs by Metaverse Object Type ID. Only valid when ObjectType is 'MVO'.
 
    .PARAMETER Search
        Search term for filtering results. For CSOs, searches by External ID.
        For MVOs, searches by Display Name.
 
    .PARAMETER FromDate
        Filter for deletions on or after this date (UTC).
 
    .PARAMETER ToDate
        Filter for deletions on or before this date (UTC).
 
    .PARAMETER Page
        Page number for paginated results (default: 1).
 
    .PARAMETER PageSize
        Number of items per page (default: 50, max: 1000).
 
    .OUTPUTS
        PSCustomObject containing:
        - items: Array of deleted object records
        - totalCount: Total number of matching records
        - page: Current page number
        - pageSize: Items per page
 
        Each deleted CSO item contains: id, externalId, displayName, objectTypeName,
        connectedSystemId, connectedSystemName, changeTime, initiatedByType, initiatedByName.
 
        Each deleted MVO item contains: id, displayName, objectTypeName, objectTypeId,
        changeTime, initiatedByType, initiatedByName.
 
    .EXAMPLE
        Get-JIMDeletedObject
 
        Gets all deleted MVOs (default).
 
    .EXAMPLE
        Get-JIMDeletedObject -ObjectType MVO -Search "John"
 
        Gets deleted MVOs with display name containing "John".
 
    .EXAMPLE
        Get-JIMDeletedObject -ObjectType CSO -ConnectedSystemId 1
 
        Gets deleted CSOs from Connected System ID 1.
 
    .EXAMPLE
        Get-JIMDeletedObject -ObjectType CSO -Search "EMP001"
 
        Gets deleted CSOs with external ID containing "EMP001".
 
    .EXAMPLE
        Get-JIMDeletedObject -ObjectType MVO -MetaverseObjectTypeId 1 -PageSize 100
 
        Gets deleted MVOs of a specific object type, 100 per page.
 
    .LINK
        Get-JIMMetaverseObject
        Get-JIMConnectedSystem
        Invoke-JIMHistoryCleanup
    #>

    [CmdletBinding()]
    [OutputType([PSCustomObject])]
    param(
        [Parameter()]
        [ValidateSet('MVO', 'CSO')]
        [string]$ObjectType = 'MVO',

        [Parameter()]
        [int]$ConnectedSystemId,

        [Parameter()]
        [int]$MetaverseObjectTypeId,

        [Parameter()]
        [string]$Search,

        [Parameter()]
        [DateTime]$FromDate,

        [Parameter()]
        [DateTime]$ToDate,

        [Parameter()]
        [ValidateRange(1, [int]::MaxValue)]
        [int]$Page = 1,

        [Parameter()]
        [ValidateRange(1, 1000)]
        [int]$PageSize = 50
    )

    process {
        # Build query string parameters
        $queryParams = @()
        $queryParams += "page=$Page"
        $queryParams += "pageSize=$PageSize"

        if ($ObjectType -eq 'CSO') {
            $endpoint = "/api/v1/history/deleted-objects/cso"

            if ($PSBoundParameters.ContainsKey('ConnectedSystemId')) {
                $queryParams += "connectedSystemId=$ConnectedSystemId"
            }
            if ($PSBoundParameters.ContainsKey('Search')) {
                $queryParams += "externalIdSearch=$([System.Uri]::EscapeDataString($Search))"
            }
        }
        else {
            $endpoint = "/api/v1/history/deleted-objects/mvo"

            if ($PSBoundParameters.ContainsKey('MetaverseObjectTypeId')) {
                $queryParams += "objectTypeId=$MetaverseObjectTypeId"
            }
            if ($PSBoundParameters.ContainsKey('Search')) {
                $queryParams += "displayNameSearch=$([System.Uri]::EscapeDataString($Search))"
            }
        }

        if ($PSBoundParameters.ContainsKey('FromDate')) {
            $queryParams += "fromDate=$($FromDate.ToUniversalTime().ToString('o'))"
        }
        if ($PSBoundParameters.ContainsKey('ToDate')) {
            $queryParams += "toDate=$($ToDate.ToUniversalTime().ToString('o'))"
        }

        $queryString = $queryParams -join '&'
        $fullEndpoint = "${endpoint}?${queryString}"

        Write-Verbose "Getting deleted ${ObjectType}s from: $fullEndpoint"

        try {
            $result = Invoke-JIMApi -Endpoint $fullEndpoint
            $result
        }
        catch {
            Write-Error "Failed to get deleted ${ObjectType}s: $_"
            throw
        }
    }
}