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.
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.