Private/ConvertTo-RoleAssignmentDriftDocuments.ps1

# Converts a ManagementGroup/Subscription drift result into displayName/description/resources documents for Json export
function ConvertTo-RoleAssignmentDriftDocuments {
    <#
    .SYNOPSIS
        Converts a drift result into document objects with displayName/description/resources.
    #>

    [CmdletBinding()]
    param(
        [Parameter(Mandatory)]
        [System.Collections.IDictionary]$DriftResult,

        [string]$Description = 'Role assignment drift detected against the reference export.'
    )

    $drift_documents = @()

    foreach ($section in 'ManagementGroup', 'Subscription') {
        $resources = @()
        foreach ($scope_id in $DriftResult[$section].Keys) {
            foreach ($entry in $DriftResult[$section][$scope_id]) {
                $assignment = $entry.Assignment
                $resources += [PSCustomObject]@{
                    displayName  = "AzRole-$($assignment.DisplayName)"
                    resourceType = $assignment.ObjectType
                    properties   = [PSCustomObject]@{
                        SignInName         = $assignment.SignInName
                        ObjectId           = $assignment.ObjectId
                        RoleDefinitionName = $assignment.RoleDefinitionName
                        Ensure             = if ($entry.Status -eq 'Removed') { 'Present' } else { 'Absent' }
                        DisplayName        = $assignment.DisplayName
                        Scope              = $section
                        ScopeId            = $scope_id
                        Inherited          = $assignment.Inherited
                        InheritedFrom      = $assignment.InheritedFrom
                        Status             = $entry.Status
                        SuggestedAction    = $entry.SuggestedAction
                    }
                }
            }
        }

        $drift_documents += [PSCustomObject]@{
            displayName = if ($section -eq 'ManagementGroup') { 'ManagementGroups' } else { 'Subscriptions' }
            description = $Description
            resources   = $resources
        }
    }

    return $drift_documents
}