Private/Get-FleetPaginatedData.ps1
function Get-FleetPaginatedData { <# .SYNOPSIS Extracts data from FleetDM paginated responses .DESCRIPTION Internal helper function that extracts the actual data collection from FleetDM API responses, handling various response formats and reducing repetitive pagination code. .PARAMETER Response The response object from the FleetDM API .PARAMETER ReturnMetadata If specified, returns an object with both data and metadata #> [CmdletBinding()] param( [Parameter(Mandatory)] [object]$Response, [switch]$ReturnMetadata ) # Known collection property names in FleetDM responses $collectionProperties = @( 'hosts', 'policies', 'queries', 'software', 'users', 'teams', 'labels', 'targets', 'results', 'vulnerabilities' ) $result = @{ Data = $null HasMore = $false Metadata = $null } if ($null -eq $Response) { if ($ReturnMetadata) { return $result } return $null } # If response is already an array, return it directly if ($Response -is [array]) { $result.Data = $Response if ($ReturnMetadata) { return $result } return $Response } # If response is an object, look for known collection properties if ($Response -is [System.Management.Automation.PSCustomObject]) { # Check for collection properties foreach ($prop in $collectionProperties) { if ($Response.PSObject.Properties.Name -contains $prop) { $result.Data = $Response.$prop break } } # If no collection found, return the whole response as data if ($null -eq $result.Data) { $result.Data = $Response } # Check for pagination metadata if ($Response.PSObject.Properties.Name -contains 'meta') { $result.Metadata = $Response.meta if ($Response.meta.PSObject.Properties.Name -contains 'has_next_results') { $result.HasMore = $Response.meta.has_next_results } } } else { # For other types, return as-is $result.Data = $Response } if ($ReturnMetadata) { return $result } return $result.Data } |