internal/functions/Convert-RiskData.ps1

function Convert-HawkRiskData {
    <#
    .SYNOPSIS
        Parses and flattens risk detection additional information data.
 
    .DESCRIPTION
        Internal helper function that processes additional information from risk detection
        data, converting nested JSON structures into a flat format suitable for
        Get-SimpleUnifiedAuditLog processing.
 
        Handles common risk data fields including:
        - riskReasons (array)
        - userAgent
        - alertUrl
        - mitreTechniques
 
    .PARAMETER RiskData
        Risk detection or user data containing AdditionalInfo property with JSON data.
 
    .EXAMPLE
        $parsedData = Convert-HawkRiskData -RiskData $riskDetections
        $parsedData | Get-SimpleUnifiedAuditLog
 
        Parses risk detection data before passing to Get-SimpleUnifiedAuditLog.
 
    .NOTES
        Internal function for use by Hawk risk analysis functions.
    #>

    [CmdletBinding()]
    param (
        [Parameter(Mandatory = $true, ValueFromPipeline = $true)]
        [object[]]$RiskData
    )

    begin {
        $processedData = @()
    }

    process {
        foreach ($record in $RiskData) {
            # Create copy of original record excluding AdditionalInfo
            $processedRecord = $record | Select-Object * -ExcludeProperty AdditionalInfo

            if ($record.AdditionalInfo) {
                try {
                    # Parse JSON if string, otherwise use as-is
                    if ($record.AdditionalInfo -is [string]) {
                        $additionalInfo = $record.AdditionalInfo | ConvertFrom-Json
                    }
                    else {
                        $additionalInfo = $record.AdditionalInfo
                    }

                    # Convert each key-value pair to a property
                    foreach ($item in $additionalInfo) {
                        $propertyName = "AdditionalInfo_$($item.Key)"
                        if ($item.Value -is [array]) {
                            # Join array values with pipe delimiter
                            $propertyValue = $item.Value -join '|'
                        }
                        else {
                            $propertyValue = $item.Value
                        }

                        # Add as new property to processed record
                        Add-Member -InputObject $processedRecord -MemberType NoteProperty -Name $propertyName -Value $propertyValue -Force
                    }
                }
                catch {
                    Write-Warning "Error processing AdditionalInfo for record: $_"
                }
            }

            $processedData += $processedRecord
        }
    }

    end {
        return $processedData
    }
}