Private/Add-IDBridgeGoogleBatchResult.ps1

<#
.SYNOPSIS
Record write results for one Google batch from its requests and responses.

.DESCRIPTION
Internal helper: after Invoke-GoogleBatchRequest runs, matches each request descriptor to
its response part by ContentId and records one write result per request via
Add-IDBridgeWriteResult:

  - no matching response part ⇒ failure ("No batch response - batch chunk failed"; this is
    what a whole-chunk HTTP failure looks like, since a failed chunk produces no parts),
  - response StatusCode >= 400 ⇒ failure with the API error message,
  - otherwise ⇒ success.

Who the request was for comes from the IdentityMap built while collecting the descriptors -
the ContentId alone only carries a Google user ID or "<PersonID>|<group>" pair.

.PARAMETER Action
The write type these requests represent (Create, Update, Deactivate, GroupAdd, GroupRemove).

.PARAMETER Requests
The request descriptors that were passed to Invoke-GoogleBatchRequest (each has a ContentId).

.PARAMETER Responses
The response objects Invoke-GoogleBatchRequest returned (@{ ContentId; StatusCode; Body }).

.PARAMETER IdentityMap
Hashtable of ContentId -> @{ PersonID; Target } identifying who/what each request was for.

.OUTPUTS
None. Appends one result per request to $script:WriteResults.

.EXAMPLE
Add-IDBridgeGoogleBatchResult -Action Update -Requests $googleBatchRequests -Responses $responses -IdentityMap $identityMap

.NOTES
   Created by: Sam Cattanach
   Modified: 2026-07-12
#>

function Add-IDBridgeGoogleBatchResult {
    [CmdletBinding()]
    param (
        [Parameter(Mandatory = $true)]
        [ValidateSet("Create", "Update", "Deactivate", "GroupAdd", "GroupRemove")]
        [string]$Action,

        [Parameter(Mandatory = $true)]
        [object[]]$Requests,

        [Parameter(Mandatory = $false)]
        [AllowNull()]
        [object[]]$Responses,

        [Parameter(Mandatory = $true)]
        [hashtable]$IdentityMap
    )

    # Index responses by ContentId for the lookup below
    $responsesById = @{}
    foreach ($response in @($Responses)) {
        if ($null -ne $response -and $null -ne $response.ContentId) {
            $responsesById["$($response.ContentId)"] = $response
        }
    }

    foreach ($request in $Requests) {
        $contentId = "$($request.ContentId)"
        $identity = $IdentityMap[$contentId]

        $resultSplat = @{
            Directory = 'Google'
            Action    = $Action
            PersonID  = "$($identity.PersonID)"
            Target    = "$($identity.Target)"
        }

        $response = $responsesById[$contentId]
        if ($null -eq $response) {
            Add-IDBridgeWriteResult @resultSplat -Success $false -ErrorMessage "No batch response - batch chunk failed"
        }
        elseif ($response.StatusCode -ge 400) {
            Add-IDBridgeWriteResult @resultSplat -Success $false -ErrorMessage "($($response.StatusCode)) $($response.Body.error.message)"
        }
        else {
            Add-IDBridgeWriteResult @resultSplat -Success $true
        }
    }
}