Pax8API/Public/Test-Pax8OpenApiUpdate.ps1

function Test-Pax8OpenApiUpdate {
    [CmdletBinding()]
    param (
        [switch]$Quiet
    )

    $localManifest = Get-Pax8LocalSpecManifest
    if (-not $localManifest) {
        throw 'No local Pax8 OpenAPI manifest was found in the module data folder.'
    }

    $remoteManifest = Get-Pax8RemoteSpecManifest -SpecFile @($localManifest.specs | ForEach-Object file)
    $differences = @(Compare-Pax8SpecManifest -LocalManifest $localManifest -RemoteManifest $remoteManifest)
    $localSourceOperationCount = [int](($localManifest.specs | Measure-Object -Property operationCount -Sum).Sum)
    $generatedOperationCount = if ($localManifest.PSObject.Properties['generatedOperationCount']) { [int]$localManifest.generatedOperationCount } else { [int]$localManifest.operationCount }
    $result = [pscustomobject]@{
        CheckedAt = [datetimeoffset]::UtcNow
        Source = 'https://devx.pax8.com/openapi'
        LocalGeneratedAt = $localManifest.generatedAt
        GeneratedOperationCount = $generatedOperationCount
        LocalOperationCount = $localSourceOperationCount
        RemoteOperationCount = [int](($remoteManifest.specs | Measure-Object -Property operationCount -Sum).Sum)
        UpdateAvailable = [bool]($differences.Count -gt 0)
        Differences = @($differences)
    }

    $cachePath = Get-Pax8UpdateCheckCachePath
    [pscustomobject]@{
        checkedAt = $result.CheckedAt.ToString('o')
        source = $result.Source
        updateAvailable = $result.UpdateAvailable
        changedSpecs = @($differences | ForEach-Object File)
        localGeneratedAt = $result.LocalGeneratedAt
        generatedOperationCount = $result.GeneratedOperationCount
        localOperationCount = $result.LocalOperationCount
        remoteOperationCount = $result.RemoteOperationCount
    } | ConvertTo-Json -Depth 20 | Set-Content -LiteralPath $cachePath -Encoding utf8NoBOM

    if ($Quiet) {
        return $result.UpdateAvailable
    }

    $result
}