Pular para conteúdo

Control Plane — integrações administrativas

O mapa do Control Plane distingue os serviços que administram configurações dos serviços de apoio. Esta página detalha todos os destinos HTTP identificados no BFF: 16 entradas em DownstreamServiceConfig, mais Accounts e Authenticator. A classificação é funcional; não define isolamento físico ou deployment.

Critério de inclusão

O núcleo administrativo inclui BFF, Core, Template Service, Global Registry, Importer, Security, IP Policy, Rate Limit e Tunnel. São a entrada administrativa e os serviços que mantêm ou alteram configurações da plataforma. JSON Handler, Monitoring, Auth Provider, Object Storage, OpenAPI Doc e Web Pages aparecem no mapa de apoio, sem serem classificados como proprietários de configuração. Scheduler é apoio indireto, chamado por outros serviços administrativos.

Accounts, Authenticator e os dois destinos iPaaS são dependências de outros domínios, representadas fora do núcleo. Uma chamada do BFF não torna seu destino parte exclusiva do Control Plane. Em particular, o BFF também expõe fachadas públicas, e Auth Provider possui contratos separados de Control Plane e Data Plane.

Inventário das integrações do BFF

Os caminhos são relativos à base de cada destino; não são os endpoints externos do BFF. CRUD significa criação, leitura, alteração e exclusão. As classes vinculadas mostram métodos, verbos e composição dos caminhos. A ficha do BFF descreve sua fronteira de entrada.

Destino Responsabilidade e natureza da integração Cliente / contratos utilizados Lugar na visão geral e justificativa
Core Configuração de gateways, rotas, categorias e revisões; publicação/rollback, wizard, favoritos e consulta de vínculos GatewayForwardingService, RouteForwardingService, CategoryForwardingService; /api/v1/gateways, rotas/categorias/revisões subordinadas; CatalogForwardingService usa /v1/catalog/items/state e /v1/catalog/{catalogItemId}/favorite Núcleo: proprietário das configurações de APIs
Template Service Modelos, publicação e instanciação; revisões, categorias, teste, upgrade, retry e acompanhamento de operações GatewayTemplateForwardingService, RouteTemplateForwardingService, categorias, OperationForwardingService e OperationStreamService; /api/v1/gateway-templates, /api/v1/gateways/{gatewayId}/template-upgrade, /api/v1/operations/gateways/{gatewayId}/retry e /events Núcleo: ciclo de vida dos modelos e materialização em instâncias
Global Registry Consulta do catálogo e resolução de template/owner/versão; configuração e validação de aliases de tenant CatalogForwardingService e GlobalRegistryForwardingService; /v1/catalog/templates, /v1/tenant-aliases Núcleo: catálogo global e aliases; favoritos e estado de aquisição são consultados no Core
Importer Operação de importação/reprocessamento e consulta/stream de progresso GatewayForwardingService e GatewayImportStreamService; /api/v1/import, /api/v1/import/reprocess, /api/v1/gateways/status e /{gatewayId}/stream Núcleo: cria configurações a partir da importação
Security Configuração de autorizações e regeneração de segredos AuthorizationForwardingService; /api/v1/authorizations, /{id}/regenerate-secret Núcleo: mantém autorizações configuradas; não é o Security Checker
IP Policy Configuração e consulta de regras de IP IpPolicyForwardingService; /api/v1/ip-policies; enriquece consultas com contagens do Core Núcleo: políticas de acesso por IP
Rate Limit Configuração e consulta de limites de consumo RateLimitForwardingService; /api/v1/rate-limits; enriquece consultas com contagens do Core Núcleo: define quotas; não representa a contabilização por requisição
Tunnel Configuração de túneis, rotação de token e instruções de instalação TunnelForwardingService; /api/v1/tunnels, /{tunnelId}/token/rotate, /{tunnelId}/{operatingSystem} Núcleo: administra conectividade; não executa o encaminhamento HTTP das APIs
JSON Handler Apoio à autoria: geração de variáveis, schemas e transformação de modelos JsonHandlerService v1 e v2; /api/variables/generate-input, /api/json-schema/generate, /api/formly/transform, /api/v2/variables/generate Apoio: transforma representações; não é proprietário de gateways/rotas
Monitoring Consulta de logs e métricas de execução MonitoringForwardingService; /api/v1/logs, /api/v1/metrics; destino metricsService() Apoio / observabilidade: consulta administrativa de dados operacionais
Auth Provider Testes OAuth/OIDC administrativos e emissão/JWKS públicos AuthProviderForwardingService; /v1/control-plane/oauth2/{emit-token,test-token,test-discovery} e /v1/data-plane/oauth2/{emit-token,certs} Compartilhado / identidade: possui contratos dos dois planos
Object Storage Upload, leitura e exclusão de arquivos; leitura pública ObjectStorageForwardingService; /v1/object-storage/files, /v1/object-storage/public/files/{fileId} Compartilhado / arquivos: atende autoria e distribuição pública
OpenAPI Doc Consulta da documentação de template usando seu owner CatalogForwardingService.documentation; /api/v1/documentation/{gatewayId} Compartilhado / documentação: gera/publica documentos e atende consulta; não administra a configuração original
Web Pages Obtenção da apresentação documental do catálogo CatalogForwardingService.staticPage; /openapi Compartilhado / documentação: serviço backend documental, sem detalhamento de implementação de interface
iPaaS — Connector Service Core Consulta de aplicações, serviços, recursos, ambientes, contas, projetos e diagramas IpaasForwardingService v1 e v2; famílias /api/internal/v1/{applications,services,resources,environments,accounts,projects,diagrams}/tenants/{tenantId}/… Externo ao núcleo Gateway: domínio de integração iPaaS; accounts nesta API não é o serviço Accounts de identidade
iPaaS — Connector Auth Consulta do nome do tenant por código ConnectorAuthService; /api/v1/tenants/{tenantId}/by-code Externo ao núcleo Gateway: metadados do tenant iPaaS
Accounts Token técnico de aplicação e chaves para validar JWT AccountsAdapter.getAppAccessToken() nos clientes iPaaS; AccountsClient no teste de contrato faz POST /oauth/token; parser JWT usa a URL JWKS configurada Externo / identidade corporativa: provê identidade, não configura APIs Gateway
Authenticator Consulta de permissões por usuário/tenant, quando o mecanismo de autorização é acionado AuthenticatorClient.findRole, GET /v1/roles/by-user-tenant; ResourceAuthorizationService Externo / autorização corporativa: mecanismo implementado não equivale a RBAC aplicado em todos os endpoints

O levantamento percorreu os usos de DownstreamServiceConfig, os forwarders, o parser JWT, o cliente Authenticator e a integração Accounts. Redis e exportação OpenTelemetry são dependências técnicas, descritas na ficha do BFF; não são microserviços administrativos. Broker, Builder, Router, Discovery e Security Checker não possuem chamada direta identificada no BFF e ficam nas visões de Data Plane e resolução. O test-discovery do Auth Provider é teste de descoberta OIDC, não chamada ao microserviço Discovery.

Apoio indireto e efeitos de configuração

Componente Relação com a administração Decisão de escopo
Scheduler Template Service agenda expiração de instâncias de teste; Rate Limit agenda reposição Incluído no mapa de apoio, sem criar uma seta BFF → Scheduler. Evidências: agendamento de limpeza e cliente Rate Limit
Outbox Dispatcher Transporta eventos persistidos de configuração Fora dos recortes HTTP do BFF; representado na visão assíncrona
Cache Invalidator / Cache Monitor Invalidação e recuperação de caches Fora do núcleo de autoria; preservados na visão de invalidação e no inventário

Comunicações por domínio

Para chamadas originadas nos demais serviços, consulte o inventário de dependências por origem.

Cada desenho é um recorte de chamadas diretas do BFF. Setas indicam dependências HTTP, não ordem temporal nem todas as chamadas entre os destinos. As relações downstream complementares permanecem na matriz geral. SSE identifica acompanhamento de progresso, sem equiparar resposta HTTP inicial a conclusão da operação.

Entrada / APIDomínio / processamentoSegurançaDados / arquivosSistema externo

Retângulos identificam serviços backend; formas arredondadas, serviços de outros domínios. As mesmas classes e cores são usadas na arquitetura lógica.

Autoria, revisões e importação

O BFF encaminha a configuração ao Core, os modelos ao Template Service e a importação ao Importer. A listagem de gateways combina Core com status do Importer. Evidências: gateways, templates, operações e stream de importação.

%%{init: {"theme":"base","themeVariables":{"fontFamily":"Arial, sans-serif","fontSize":"16px","lineColor":"#64748b","primaryTextColor":"#172b4d"},"flowchart":{"htmlLabels":true,"useMaxWidth":true,"nodeSpacing":28,"rankSpacing":38,"padding":14,"curve":"linear","subGraphTitleMargin":{"top":12,"bottom":16}},"sequence":{"useMaxWidth":true,"actorMargin":28,"width":145,"height":45,"diagramMarginX":32,"diagramMarginY":12,"messageMargin":24,"wrap":true,"mirrorActors":false},"themeCSS":".edgeLabel, .edgeLabel p {background-color:var(--diagram-surface)!important;color:var(--diagram-text)!important}\n.cluster rect {fill:var(--diagram-group)!important;stroke:var(--diagram-line)!important}\n.cluster-label span, .cluster-label text {color:var(--diagram-text)!important;fill:var(--diagram-text)!important}\n.flowchart-link, .actor-line {stroke:var(--diagram-line)!important}\nmarker path {fill:var(--diagram-line)!important;stroke:var(--diagram-line)!important}\n.actor {fill:var(--diagram-domain)!important;stroke:var(--diagram-domain-border)!important}\ntext.actor, .messageText, .loopText, .labelText {fill:var(--diagram-text)!important}\n.messageLine0, .messageLine1, .loopLine {stroke:var(--diagram-line)!important}\n.labelBox {fill:var(--diagram-surface)!important;stroke:var(--diagram-line)!important}\n.note {fill:var(--diagram-async)!important;stroke:var(--diagram-async-border)!important}\n.noteText {fill:var(--diagram-text)!important}\n.nodeLabel, .nodeLabel p, .nodeLabel span {color:var(--diagram-text)!important}\n.node .nodeLabel, .node .nodeLabel p {font-size:17px;font-weight:600;line-height:1.4;text-align:center}\n.nodeLabel small {display:inline-block;margin-top:4px;font-size:15px;font-weight:400;line-height:1.4;color:var(--diagram-description)!important}\ntext.actor, text.actor tspan {font-size:17px;font-weight:600}\n.node.entry rect, .node.entry polygon, .node.entry path, .node.entry circle {fill:var(--diagram-entry)!important;stroke:var(--diagram-entry-border)!important}\n.node.domain rect, .node.domain polygon, .node.domain path, .node.domain circle {fill:var(--diagram-domain)!important;stroke:var(--diagram-domain-border)!important}\n.node.security rect, .node.security polygon, .node.security path, .node.security circle {fill:var(--diagram-security)!important;stroke:var(--diagram-security-border)!important}\n.node.store rect, .node.store polygon, .node.store path, .node.store circle {fill:var(--diagram-store)!important;stroke:var(--diagram-store-border)!important}\n.node.async rect, .node.async polygon, .node.async path, .node.async circle {fill:var(--diagram-async)!important;stroke:var(--diagram-async-border)!important}\n.node.external rect, .node.external polygon, .node.external path, .node.external circle {fill:var(--diagram-external)!important;stroke:var(--diagram-external-border)!important}\n text.actor tspan, .loopText tspan, .labelText tspan, .messageText tspan, .noteText tspan {fill:var(--diagram-text)!important}\n\n"}}%%
flowchart TB
    bff["BFF"]:::entry
    core["Core<br/><small>Gateways e rotas</small>"]:::domain
    templates["Template Service<br/><small>Modelos e instâncias</small>"]:::domain
    importer["Importer<br/><small>Importação iPaaS</small>"]:::domain
    bff -->|Configuração| core
    bff -->|Modelos / operações / SSE| templates
    bff -->|Importar / status / SSE| importer
    classDef entry stroke-width:1.5px;
    classDef domain stroke-width:1.5px;

Políticas de acesso e consumo

Security mantém autorizações; IP Policy, regras de IP; Rate Limit, quotas. As contagens de rotas usadas no enriquecimento de IP Policy e Rate Limit são consultadas pelo BFF no Core. Evidências: autorizações, IP, quotas e contagens de rotas.

%%{init: {"theme":"base","themeVariables":{"fontFamily":"Arial, sans-serif","fontSize":"16px","lineColor":"#64748b","primaryTextColor":"#172b4d"},"flowchart":{"htmlLabels":true,"useMaxWidth":true,"nodeSpacing":28,"rankSpacing":38,"padding":14,"curve":"linear","subGraphTitleMargin":{"top":12,"bottom":16}},"sequence":{"useMaxWidth":true,"actorMargin":28,"width":145,"height":45,"diagramMarginX":32,"diagramMarginY":12,"messageMargin":24,"wrap":true,"mirrorActors":false},"themeCSS":".edgeLabel, .edgeLabel p {background-color:var(--diagram-surface)!important;color:var(--diagram-text)!important}\n.cluster rect {fill:var(--diagram-group)!important;stroke:var(--diagram-line)!important}\n.cluster-label span, .cluster-label text {color:var(--diagram-text)!important;fill:var(--diagram-text)!important}\n.flowchart-link, .actor-line {stroke:var(--diagram-line)!important}\nmarker path {fill:var(--diagram-line)!important;stroke:var(--diagram-line)!important}\n.actor {fill:var(--diagram-domain)!important;stroke:var(--diagram-domain-border)!important}\ntext.actor, .messageText, .loopText, .labelText {fill:var(--diagram-text)!important}\n.messageLine0, .messageLine1, .loopLine {stroke:var(--diagram-line)!important}\n.labelBox {fill:var(--diagram-surface)!important;stroke:var(--diagram-line)!important}\n.note {fill:var(--diagram-async)!important;stroke:var(--diagram-async-border)!important}\n.noteText {fill:var(--diagram-text)!important}\n.nodeLabel, .nodeLabel p, .nodeLabel span {color:var(--diagram-text)!important}\n.node .nodeLabel, .node .nodeLabel p {font-size:17px;font-weight:600;line-height:1.4;text-align:center}\n.nodeLabel small {display:inline-block;margin-top:4px;font-size:15px;font-weight:400;line-height:1.4;color:var(--diagram-description)!important}\ntext.actor, text.actor tspan {font-size:17px;font-weight:600}\n.node.entry rect, .node.entry polygon, .node.entry path, .node.entry circle {fill:var(--diagram-entry)!important;stroke:var(--diagram-entry-border)!important}\n.node.domain rect, .node.domain polygon, .node.domain path, .node.domain circle {fill:var(--diagram-domain)!important;stroke:var(--diagram-domain-border)!important}\n.node.security rect, .node.security polygon, .node.security path, .node.security circle {fill:var(--diagram-security)!important;stroke:var(--diagram-security-border)!important}\n.node.store rect, .node.store polygon, .node.store path, .node.store circle {fill:var(--diagram-store)!important;stroke:var(--diagram-store-border)!important}\n.node.async rect, .node.async polygon, .node.async path, .node.async circle {fill:var(--diagram-async)!important;stroke:var(--diagram-async-border)!important}\n.node.external rect, .node.external polygon, .node.external path, .node.external circle {fill:var(--diagram-external)!important;stroke:var(--diagram-external-border)!important}\n text.actor tspan, .loopText tspan, .labelText tspan, .messageText tspan, .noteText tspan {fill:var(--diagram-text)!important}\n\n"}}%%
flowchart TB
    bff["BFF"]:::entry
    security["Security<br/><small>Autorizações</small>"]:::security
    ip["IP Policy<br/><small>Regras de IP</small>"]:::security
    rate["Rate Limit<br/><small>Quotas</small>"]:::domain
    core["Core<br/><small>Contagens de rotas</small>"]:::domain
    bff -->|Configurar| security
    bff -->|Configurar| ip
    bff -->|Configurar| rate
    bff -->|Consultar vínculos| core
    classDef entry stroke-width:1.5px;
    classDef domain stroke-width:1.5px;
    classDef security stroke-width:1.5px;

Catálogo e obtenção de modelos

O Registry fornece catálogo e dados para instanciação; o Core fornece favoritos e estado das instâncias. Ao obter um item, o BFF resolve owner/template/versão no Registry e chama o Template Service. Aliases são administrados no Registry pelo mesmo BFF. Evidências: catálogo e aliases.

%%{init: {"theme":"base","themeVariables":{"fontFamily":"Arial, sans-serif","fontSize":"16px","lineColor":"#64748b","primaryTextColor":"#172b4d"},"flowchart":{"htmlLabels":true,"useMaxWidth":true,"nodeSpacing":28,"rankSpacing":38,"padding":14,"curve":"linear","subGraphTitleMargin":{"top":12,"bottom":16}},"sequence":{"useMaxWidth":true,"actorMargin":28,"width":145,"height":45,"diagramMarginX":32,"diagramMarginY":12,"messageMargin":24,"wrap":true,"mirrorActors":false},"themeCSS":".edgeLabel, .edgeLabel p {background-color:var(--diagram-surface)!important;color:var(--diagram-text)!important}\n.cluster rect {fill:var(--diagram-group)!important;stroke:var(--diagram-line)!important}\n.cluster-label span, .cluster-label text {color:var(--diagram-text)!important;fill:var(--diagram-text)!important}\n.flowchart-link, .actor-line {stroke:var(--diagram-line)!important}\nmarker path {fill:var(--diagram-line)!important;stroke:var(--diagram-line)!important}\n.actor {fill:var(--diagram-domain)!important;stroke:var(--diagram-domain-border)!important}\ntext.actor, .messageText, .loopText, .labelText {fill:var(--diagram-text)!important}\n.messageLine0, .messageLine1, .loopLine {stroke:var(--diagram-line)!important}\n.labelBox {fill:var(--diagram-surface)!important;stroke:var(--diagram-line)!important}\n.note {fill:var(--diagram-async)!important;stroke:var(--diagram-async-border)!important}\n.noteText {fill:var(--diagram-text)!important}\n.nodeLabel, .nodeLabel p, .nodeLabel span {color:var(--diagram-text)!important}\n.node .nodeLabel, .node .nodeLabel p {font-size:17px;font-weight:600;line-height:1.4;text-align:center}\n.nodeLabel small {display:inline-block;margin-top:4px;font-size:15px;font-weight:400;line-height:1.4;color:var(--diagram-description)!important}\ntext.actor, text.actor tspan {font-size:17px;font-weight:600}\n.node.entry rect, .node.entry polygon, .node.entry path, .node.entry circle {fill:var(--diagram-entry)!important;stroke:var(--diagram-entry-border)!important}\n.node.domain rect, .node.domain polygon, .node.domain path, .node.domain circle {fill:var(--diagram-domain)!important;stroke:var(--diagram-domain-border)!important}\n.node.security rect, .node.security polygon, .node.security path, .node.security circle {fill:var(--diagram-security)!important;stroke:var(--diagram-security-border)!important}\n.node.store rect, .node.store polygon, .node.store path, .node.store circle {fill:var(--diagram-store)!important;stroke:var(--diagram-store-border)!important}\n.node.async rect, .node.async polygon, .node.async path, .node.async circle {fill:var(--diagram-async)!important;stroke:var(--diagram-async-border)!important}\n.node.external rect, .node.external polygon, .node.external path, .node.external circle {fill:var(--diagram-external)!important;stroke:var(--diagram-external-border)!important}\n text.actor tspan, .loopText tspan, .labelText tspan, .messageText tspan, .noteText tspan {fill:var(--diagram-text)!important}\n\n"}}%%
flowchart TB
    bff["BFF"]:::entry
    registry["Global Registry<br/><small>Catálogo e aliases</small>"]:::domain
    core["Core<br/><small>Favoritos e instâncias</small>"]:::domain
    templates["Template Service<br/><small>Instanciação</small>"]:::domain
    bff -->|Catálogo / aliases| registry
    bff -->|Estado / favoritos| core
    bff -->|Obter modelo| templates
    classDef entry stroke-width:1.5px;
    classDef domain stroke-width:1.5px;

Ferramentas administrativas e operação

São quatro capacidades independentes, não uma cadeia de processamento: transformar schemas, administrar túneis, transportar arquivos e consultar telemetria. Evidências: JSON Handler, Tunnel, Object Storage e Monitoring.

%%{init: {"theme":"base","themeVariables":{"fontFamily":"Arial, sans-serif","fontSize":"16px","lineColor":"#64748b","primaryTextColor":"#172b4d"},"flowchart":{"htmlLabels":true,"useMaxWidth":true,"nodeSpacing":28,"rankSpacing":38,"padding":14,"curve":"linear","subGraphTitleMargin":{"top":12,"bottom":16}},"sequence":{"useMaxWidth":true,"actorMargin":28,"width":145,"height":45,"diagramMarginX":32,"diagramMarginY":12,"messageMargin":24,"wrap":true,"mirrorActors":false},"themeCSS":".edgeLabel, .edgeLabel p {background-color:var(--diagram-surface)!important;color:var(--diagram-text)!important}\n.cluster rect {fill:var(--diagram-group)!important;stroke:var(--diagram-line)!important}\n.cluster-label span, .cluster-label text {color:var(--diagram-text)!important;fill:var(--diagram-text)!important}\n.flowchart-link, .actor-line {stroke:var(--diagram-line)!important}\nmarker path {fill:var(--diagram-line)!important;stroke:var(--diagram-line)!important}\n.actor {fill:var(--diagram-domain)!important;stroke:var(--diagram-domain-border)!important}\ntext.actor, .messageText, .loopText, .labelText {fill:var(--diagram-text)!important}\n.messageLine0, .messageLine1, .loopLine {stroke:var(--diagram-line)!important}\n.labelBox {fill:var(--diagram-surface)!important;stroke:var(--diagram-line)!important}\n.note {fill:var(--diagram-async)!important;stroke:var(--diagram-async-border)!important}\n.noteText {fill:var(--diagram-text)!important}\n.nodeLabel, .nodeLabel p, .nodeLabel span {color:var(--diagram-text)!important}\n.node .nodeLabel, .node .nodeLabel p {font-size:17px;font-weight:600;line-height:1.4;text-align:center}\n.nodeLabel small {display:inline-block;margin-top:4px;font-size:15px;font-weight:400;line-height:1.4;color:var(--diagram-description)!important}\ntext.actor, text.actor tspan {font-size:17px;font-weight:600}\n.node.entry rect, .node.entry polygon, .node.entry path, .node.entry circle {fill:var(--diagram-entry)!important;stroke:var(--diagram-entry-border)!important}\n.node.domain rect, .node.domain polygon, .node.domain path, .node.domain circle {fill:var(--diagram-domain)!important;stroke:var(--diagram-domain-border)!important}\n.node.security rect, .node.security polygon, .node.security path, .node.security circle {fill:var(--diagram-security)!important;stroke:var(--diagram-security-border)!important}\n.node.store rect, .node.store polygon, .node.store path, .node.store circle {fill:var(--diagram-store)!important;stroke:var(--diagram-store-border)!important}\n.node.async rect, .node.async polygon, .node.async path, .node.async circle {fill:var(--diagram-async)!important;stroke:var(--diagram-async-border)!important}\n.node.external rect, .node.external polygon, .node.external path, .node.external circle {fill:var(--diagram-external)!important;stroke:var(--diagram-external-border)!important}\n text.actor tspan, .loopText tspan, .labelText tspan, .messageText tspan, .noteText tspan {fill:var(--diagram-text)!important}\n\n"}}%%
flowchart TB
    bff["BFF"]:::entry
    json["JSON Handler<br/><small>Schemas e variáveis</small>"]:::domain
    tunnel["Tunnel<br/><small>Túneis e tokens</small>"]:::domain
    storage["Object Storage<br/><small>Arquivos</small>"]:::store
    monitor["Monitoring<br/><small>Logs e métricas</small>"]:::domain
    bff -->|Transformar| json
    bff -->|Administrar| tunnel
    bff -->|Upload / leitura| storage
    bff -->|Consultar| monitor
    classDef entry stroke-width:1.5px;
    classDef domain stroke-width:1.5px;
    classDef store stroke-width:1.5px;

Consulta de documentação

O BFF resolve o owner documental no Registry, consulta o OpenAPI Doc com esse contexto e obtém a apresentação documental no Web Pages. As fachadas públicas não alteram a propriedade dos modelos. Evidência: documentation, staticPage e resolveDocumentationCatalogItemId.

%%{init: {"theme":"base","themeVariables":{"fontFamily":"Arial, sans-serif","fontSize":"16px","lineColor":"#64748b","primaryTextColor":"#172b4d"},"flowchart":{"htmlLabels":true,"useMaxWidth":true,"nodeSpacing":28,"rankSpacing":38,"padding":14,"curve":"linear","subGraphTitleMargin":{"top":12,"bottom":16}},"sequence":{"useMaxWidth":true,"actorMargin":28,"width":145,"height":45,"diagramMarginX":32,"diagramMarginY":12,"messageMargin":24,"wrap":true,"mirrorActors":false},"themeCSS":".edgeLabel, .edgeLabel p {background-color:var(--diagram-surface)!important;color:var(--diagram-text)!important}\n.cluster rect {fill:var(--diagram-group)!important;stroke:var(--diagram-line)!important}\n.cluster-label span, .cluster-label text {color:var(--diagram-text)!important;fill:var(--diagram-text)!important}\n.flowchart-link, .actor-line {stroke:var(--diagram-line)!important}\nmarker path {fill:var(--diagram-line)!important;stroke:var(--diagram-line)!important}\n.actor {fill:var(--diagram-domain)!important;stroke:var(--diagram-domain-border)!important}\ntext.actor, .messageText, .loopText, .labelText {fill:var(--diagram-text)!important}\n.messageLine0, .messageLine1, .loopLine {stroke:var(--diagram-line)!important}\n.labelBox {fill:var(--diagram-surface)!important;stroke:var(--diagram-line)!important}\n.note {fill:var(--diagram-async)!important;stroke:var(--diagram-async-border)!important}\n.noteText {fill:var(--diagram-text)!important}\n.nodeLabel, .nodeLabel p, .nodeLabel span {color:var(--diagram-text)!important}\n.node .nodeLabel, .node .nodeLabel p {font-size:17px;font-weight:600;line-height:1.4;text-align:center}\n.nodeLabel small {display:inline-block;margin-top:4px;font-size:15px;font-weight:400;line-height:1.4;color:var(--diagram-description)!important}\ntext.actor, text.actor tspan {font-size:17px;font-weight:600}\n.node.entry rect, .node.entry polygon, .node.entry path, .node.entry circle {fill:var(--diagram-entry)!important;stroke:var(--diagram-entry-border)!important}\n.node.domain rect, .node.domain polygon, .node.domain path, .node.domain circle {fill:var(--diagram-domain)!important;stroke:var(--diagram-domain-border)!important}\n.node.security rect, .node.security polygon, .node.security path, .node.security circle {fill:var(--diagram-security)!important;stroke:var(--diagram-security-border)!important}\n.node.store rect, .node.store polygon, .node.store path, .node.store circle {fill:var(--diagram-store)!important;stroke:var(--diagram-store-border)!important}\n.node.async rect, .node.async polygon, .node.async path, .node.async circle {fill:var(--diagram-async)!important;stroke:var(--diagram-async-border)!important}\n.node.external rect, .node.external polygon, .node.external path, .node.external circle {fill:var(--diagram-external)!important;stroke:var(--diagram-external-border)!important}\n text.actor tspan, .loopText tspan, .labelText tspan, .messageText tspan, .noteText tspan {fill:var(--diagram-text)!important}\n\n"}}%%
flowchart TB
    bff["BFF"]:::entry
    registry["Global Registry<br/><small>Owner e versão</small>"]:::domain
    openapi["OpenAPI Doc<br/><small>Documento da API</small>"]:::domain
    pages["Web Pages<br/><small>Apresentação documental</small>"]:::domain
    bff -->|Resolver| registry
    bff -->|Consultar documento| openapi
    bff -->|Obter página| pages
    classDef entry stroke-width:1.5px;
    classDef domain stroke-width:1.5px;

Identidade e autorização

Auth Provider oferece testes administrativos e a fachada pública de tokens/JWKS. Accounts fornece token técnico e JWKS para identidade administrativa. Authenticator é consultado quando a autorização por recurso é acionada; não é etapa obrigatória comprovada de todos os endpoints. Evidências: Auth Provider, teste Accounts/Authenticator, parser e serviço de autorização.

%%{init: {"theme":"base","themeVariables":{"fontFamily":"Arial, sans-serif","fontSize":"16px","lineColor":"#64748b","primaryTextColor":"#172b4d"},"flowchart":{"htmlLabels":true,"useMaxWidth":true,"nodeSpacing":28,"rankSpacing":38,"padding":14,"curve":"linear","subGraphTitleMargin":{"top":12,"bottom":16}},"sequence":{"useMaxWidth":true,"actorMargin":28,"width":145,"height":45,"diagramMarginX":32,"diagramMarginY":12,"messageMargin":24,"wrap":true,"mirrorActors":false},"themeCSS":".edgeLabel, .edgeLabel p {background-color:var(--diagram-surface)!important;color:var(--diagram-text)!important}\n.cluster rect {fill:var(--diagram-group)!important;stroke:var(--diagram-line)!important}\n.cluster-label span, .cluster-label text {color:var(--diagram-text)!important;fill:var(--diagram-text)!important}\n.flowchart-link, .actor-line {stroke:var(--diagram-line)!important}\nmarker path {fill:var(--diagram-line)!important;stroke:var(--diagram-line)!important}\n.actor {fill:var(--diagram-domain)!important;stroke:var(--diagram-domain-border)!important}\ntext.actor, .messageText, .loopText, .labelText {fill:var(--diagram-text)!important}\n.messageLine0, .messageLine1, .loopLine {stroke:var(--diagram-line)!important}\n.labelBox {fill:var(--diagram-surface)!important;stroke:var(--diagram-line)!important}\n.note {fill:var(--diagram-async)!important;stroke:var(--diagram-async-border)!important}\n.noteText {fill:var(--diagram-text)!important}\n.nodeLabel, .nodeLabel p, .nodeLabel span {color:var(--diagram-text)!important}\n.node .nodeLabel, .node .nodeLabel p {font-size:17px;font-weight:600;line-height:1.4;text-align:center}\n.nodeLabel small {display:inline-block;margin-top:4px;font-size:15px;font-weight:400;line-height:1.4;color:var(--diagram-description)!important}\ntext.actor, text.actor tspan {font-size:17px;font-weight:600}\n.node.entry rect, .node.entry polygon, .node.entry path, .node.entry circle {fill:var(--diagram-entry)!important;stroke:var(--diagram-entry-border)!important}\n.node.domain rect, .node.domain polygon, .node.domain path, .node.domain circle {fill:var(--diagram-domain)!important;stroke:var(--diagram-domain-border)!important}\n.node.security rect, .node.security polygon, .node.security path, .node.security circle {fill:var(--diagram-security)!important;stroke:var(--diagram-security-border)!important}\n.node.store rect, .node.store polygon, .node.store path, .node.store circle {fill:var(--diagram-store)!important;stroke:var(--diagram-store-border)!important}\n.node.async rect, .node.async polygon, .node.async path, .node.async circle {fill:var(--diagram-async)!important;stroke:var(--diagram-async-border)!important}\n.node.external rect, .node.external polygon, .node.external path, .node.external circle {fill:var(--diagram-external)!important;stroke:var(--diagram-external-border)!important}\n text.actor tspan, .loopText tspan, .labelText tspan, .messageText tspan, .noteText tspan {fill:var(--diagram-text)!important}\n\n"}}%%
flowchart TB
    bff["BFF"]:::entry
    auth["Auth Provider<br/><small>OAuth / OIDC</small>"]:::security
    accounts(["Accounts<br/><small>Identidade corporativa</small>"]):::external
    authenticator(["Authenticator<br/><small>Permissões corporativas</small>"]):::external
    bff -->|Testes / token / JWKS| auth
    bff -->|Token técnico / JWKS| accounts
    bff -->|Permissões, quando acionado| authenticator
    classDef entry stroke-width:1.5px;
    classDef security stroke-width:1.5px;
    classDef external stroke-width:1.5px;

Consulta ao domínio iPaaS

Os forwarders v1/v2 consultam recursos de integração; Connector Auth fornece o nome do tenant. Ambos usam token de aplicação obtido via Accounts, relação representada na visão de identidade. Evidências: iPaaS v1, v2 e ConnectorAuthService.

%%{init: {"theme":"base","themeVariables":{"fontFamily":"Arial, sans-serif","fontSize":"16px","lineColor":"#64748b","primaryTextColor":"#172b4d"},"flowchart":{"htmlLabels":true,"useMaxWidth":true,"nodeSpacing":28,"rankSpacing":38,"padding":14,"curve":"linear","subGraphTitleMargin":{"top":12,"bottom":16}},"sequence":{"useMaxWidth":true,"actorMargin":28,"width":145,"height":45,"diagramMarginX":32,"diagramMarginY":12,"messageMargin":24,"wrap":true,"mirrorActors":false},"themeCSS":".edgeLabel, .edgeLabel p {background-color:var(--diagram-surface)!important;color:var(--diagram-text)!important}\n.cluster rect {fill:var(--diagram-group)!important;stroke:var(--diagram-line)!important}\n.cluster-label span, .cluster-label text {color:var(--diagram-text)!important;fill:var(--diagram-text)!important}\n.flowchart-link, .actor-line {stroke:var(--diagram-line)!important}\nmarker path {fill:var(--diagram-line)!important;stroke:var(--diagram-line)!important}\n.actor {fill:var(--diagram-domain)!important;stroke:var(--diagram-domain-border)!important}\ntext.actor, .messageText, .loopText, .labelText {fill:var(--diagram-text)!important}\n.messageLine0, .messageLine1, .loopLine {stroke:var(--diagram-line)!important}\n.labelBox {fill:var(--diagram-surface)!important;stroke:var(--diagram-line)!important}\n.note {fill:var(--diagram-async)!important;stroke:var(--diagram-async-border)!important}\n.noteText {fill:var(--diagram-text)!important}\n.nodeLabel, .nodeLabel p, .nodeLabel span {color:var(--diagram-text)!important}\n.node .nodeLabel, .node .nodeLabel p {font-size:17px;font-weight:600;line-height:1.4;text-align:center}\n.nodeLabel small {display:inline-block;margin-top:4px;font-size:15px;font-weight:400;line-height:1.4;color:var(--diagram-description)!important}\ntext.actor, text.actor tspan {font-size:17px;font-weight:600}\n.node.entry rect, .node.entry polygon, .node.entry path, .node.entry circle {fill:var(--diagram-entry)!important;stroke:var(--diagram-entry-border)!important}\n.node.domain rect, .node.domain polygon, .node.domain path, .node.domain circle {fill:var(--diagram-domain)!important;stroke:var(--diagram-domain-border)!important}\n.node.security rect, .node.security polygon, .node.security path, .node.security circle {fill:var(--diagram-security)!important;stroke:var(--diagram-security-border)!important}\n.node.store rect, .node.store polygon, .node.store path, .node.store circle {fill:var(--diagram-store)!important;stroke:var(--diagram-store-border)!important}\n.node.async rect, .node.async polygon, .node.async path, .node.async circle {fill:var(--diagram-async)!important;stroke:var(--diagram-async-border)!important}\n.node.external rect, .node.external polygon, .node.external path, .node.external circle {fill:var(--diagram-external)!important;stroke:var(--diagram-external-border)!important}\n text.actor tspan, .loopText tspan, .labelText tspan, .messageText tspan, .noteText tspan {fill:var(--diagram-text)!important}\n\n"}}%%
flowchart TB
    bff["BFF"]:::entry
    ipaas(["iPaaS · Core<br/><small>Recursos de integração</small>"]):::external
    connector(["iPaaS · Connector Auth<br/><small>Nome do tenant</small>"]):::external
    bff -->|Consultar recursos| ipaas
    bff -->|Consultar tenant| connector
    classDef entry stroke-width:1.5px;
    classDef external stroke-width:1.5px;

Nomes e responsabilidades

Template Service — Modelos, publicação e instanciação descreve melhor o domínio do que “Definições e operações”. A expressão anterior condensava as definições versionadas e o mecanismo técnico Operation; porém, não explicitava o ciclo de publicação nem a criação de instâncias. Os contratos de GatewayTemplateResource e os forwarders comprovam essas capacidades. Upgrade, retry e SSE complementam a instanciação e permanecem identificados na tabela.

Core ganha a indicação de revisões; Importer explicita importação iPaaS; Security distingue autorizações configuradas de checagem por requisição; IP Policy explicita regras de IP; Rate Limit explicita quotas; Tunnel explicita administração de túneis. Monitoring, Auth Provider e serviços documentais mantêm seus papéis de apoio/compartilhamento. Os agrupamentos não presumem que todas as funções de um serviço pertençam exclusivamente ao mesmo plano.