Public/Imported/Export-OcelotEntry.ps1


class OcelotEntryKeys {
    [int] $Porta
    [string]$Chave
}

function Export-OcelotEntry {
    param(
        [OcelotEntryKeys[]]$keys,
        [switch]$Prod,
        [string]$SourceFile,
        [switch]$KeepExistingRoutes
    )

    begin {
        if ($KeepExistingRoutes -and -not $SourceFile) {
            throw "Invalid parameters set. KeepExistingRoutes is only available when SourceFile is informed"
        }
        $dictionary = [PSCustomObject]@{
            Routes                = [System.Collections.ArrayList]::new();
            SwaggerEndPoints      = [System.Collections.ArrayList]::new();
            "GlobalConfiguration" = @{
                "AddHeadersToResponse" = @{
                    "X-Paginacao-Total-Itens"   = "X-Paginacao-Total-Itens";
                    "X-Paginacao-Total-Paginas" = "X-Paginacao-Total-Paginas"
                };
                "Cors"                 = @{
                    "ExposedHeaders" = @(
                        "X-Paginacao-Total-Itens",
                        "X-Paginacao-Total-Paginas"
                    )
                };
                "RateLimitOptions"     = @{
                    "QuotaExceededMessage" = "Limite de consultas por segundo excedida! Aguarde e tente novamente mais tarde.";
                    "ClientWhitelist"      = @("internal"); # array of strings
                    "ClientIdHeader"       = "torra-client-id";
                }
            }
        }
        if ($SourceFile) {
            if (Test-Path $SourceFile) {
                try {
                    Write-Host "Carregando rotas do arquivo de origem: $SourceFile"
                    $existingConfig = Get-Content -Path $SourceFile | ConvertFrom-Json
                    $existingRoutes = $existingConfig.Routes | Where-Object { -not $_.SwaggerKey -or $KeepExistingRoutes }
                    $dictionary.Routes.AddRange($existingRoutes) | Out-Null
                    if ($KeepExistingRoutes) {
                        $dictionary.SwaggerEndPoints.AddRange($existingConfig.SwaggerEndPoints) | Out-Null
                    }
                }
                catch {
                    Write-Error "Erro ao carregar o arquivo de origem: $_"
                }
            }
            else {
                Throw "Arquivo de origem não encontrado: $SourceFile"
            }
        }
    }

    process {
        foreach ($key in $keys) {
            try {
                $dict = $(Export-SwaggerAsOcelot -porta $key.porta -chave $key.chave -ReturnAsObject -Prod:$Prod)
                $dictionary.Routes.Add($dict.Routes) | Out-Null
                $dictionary.SwaggerEndPoints.Add($dict.SwaggerEndPoints) | Out-Null
            }
            catch {
                Write-Error "
:: Falha ao consultar $($key.Chave).
$_"

            }
        }

        $dictionary.Routes = ConvertTo-FlattenArray $dictionary.Routes
        $jsonOutput = $dictionary | ConvertTo-Json -Depth 10 -Compress

        # Write the JSON output to a file
        try {
            Set-Content -Path ocelot.json -Value $jsonOutput -Force
            Write-Host "Formatted paths written to ./ocelot.json"
        }
        catch {
            Throw "Failed to write to file: $_"
        }
    }
}