Modelagem de dados¶
O backend distribui os dados entre configuração por tenant, registros globais, estado de processamento, projeções e caches/contadores. MongoDB mantém documentos; Redis também guarda estado operacional, não apenas dados descartáveis. Arquivos ficam em object storage e Monitoring consulta Elasticsearch.
Esta seção cobre os 23 repositórios backend do workspace, incluindo serviços sem persistência própria. As definições de collections/índices vêm do código; não são inventário físico de DEV, STAGING ou PROD. Defaults de configuração pertencem ao código, e manifests do ambiente local não comprovam a topologia corporativa.
Modelo consolidado da plataforma¶
Explore todas as collections, campos, tipos embutidos e relações entre domínios em um único desenho vetorial, com zoom, pesquisa e navegação livre.
Organização dos dados¶
Os blocos representam domínios, não instâncias de banco compartilhadas. Setas indicam referências/projeções lógicas. IDs de origem e owner permitem relacionar dados globais e de tenants sem foreign keys físicas.
%%{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
global["Registros globais<br/><small>Registry · catálogo e aliases</small>"]:::store
models["Modelos reutilizáveis<br/><small>Template Service · banco do autor</small>"]:::domain
instance["Instâncias e políticas<br/><small>Core / Security / IP / Rate Limit</small>"]:::domain
operation["Operações por tenant<br/><small>Templates / Importer · progresso</small>"]:::async
global -->|Owner / modelo / versão| models
models -->|Instanciação / proveniência| instance
operation -->|IDs e checkpoints| instance
classDef domain stroke-width:1.5px;
classDef store stroke-width:1.5px;
classDef async stroke-width:1.5px;
Arquivos, jobs e projeções documentais complementam estes domínios: possuem modelos próprios vinculados na tabela abaixo. A visão de eventos explica a outbox compartilhada; Redis mantém seus diagramas separados.
Retângulos identificam collections, tipos embutidos ou serviços conforme o rótulo; cilindros identificam armazenamentos nos diagramas de cache. Toda seta informa se é referência, snapshot, embedding ou interação por serviço.
Modelos por domínio¶
O atlas dos diagramas reúne os modelos visuais de todos os proprietários Mongo, com resumos nas páginas de domínio e detalhes com zoom. As relações entre domínios, eventos e contratos Redis possuem visões complementares.
Cada página contém escopo do banco, collections, relacionamentos, índices declarados, consultas, ciclo de vida, dicionário de campos/tipos, estruturas embutidas, enums e fragmentos JSON sanitizados derivados dos modelos.
| Domínio | Principais dados |
|---|---|
| Core | Gateways, rotas, revisões, categorias, wizard e favoritos de catálogo |
| Template Service | Modelos, revisões, snapshots e operações de instanciação/upgrade |
| Global Registry | Catálogo global e aliases |
| Security | Autorizações e configuração OAuth/OIDC |
| IP Policy | Regras ALLOW/DENY e CIDRs |
| Rate Limit | Configuração de quotas e identidade idempotente |
| Importer | Importações e resultado por recurso |
| Object Storage | Metadados por tenant, registro global e blobs |
| Scheduler | Atividades HTTP/quotas, resultados e checkpoints |
| OpenAPI Doc | Documentos derivados e Inbox |
| Tunnel | Identidades locais e recursos Cloudflare |
Inventário completo por microserviço¶
“Tenant/biblioteca” significa seleção de database delegada a totvs-gateway-mongo-tenant-scoped. Os casos de seleção explícita estão na visão de ownership. Collections lógicas de IP Policy/Rate Limit têm nome físico delegado; não foram nomeadas por suposição.
| Serviço | Banco / escopo e collections | Persistência complementar / decisão |
|---|---|---|
| Core | Tenant/biblioteca: gateways, gateway_revisions, routes, route_revisions, categories, gateway_wizard, catalog_item_state, outbox_events |
Autor de configuração; hooks de invalidação |
| Template Service | Tenant/biblioteca e leitura do owner: gateway_templates, gateway_template_revisions, route_templates, route_template_revisions, route_template_categories, operations, outbox_events |
Snapshots embutidos, checkpoints e leases de upgrade |
| Global Registry | Global gateway-globals: catalog, tenant-aliases |
Escritor do cache Redis de aliases |
| Security | Database tenantId: authorizations |
Clients/credenciais também mantidos em Keycloak |
| IP Policy | Tenant/biblioteca: documento IpPolicy, nome físico delegado |
Sem cache próprio identificado; invalidação por hooks |
| Rate Limit | Tenant/biblioteca: documento RateLimit, nome físico delegado |
Scheduler escreve o contador Redis; política Mongo não é contador |
| Importer | Tenant/biblioteca: gateway_import, gateway_import_status |
RabbitMQ para trabalho; DTOs iPaaS não são collections |
| Object Storage | Tenant: object_storage; global configurável, default gateway-globals: global_file_registry |
MinIO/GCS; arquivo binário fora do Mongo |
| Scheduler | MONGODB_DATABASE (default default): rate_limit_activities, http_calls_activities, scheduler_reconciliation_checkpoints |
JobRunr em JOBRUNR_DATABASE (default scheduler_jobrunr_v2); Redis quotas/locks |
| OpenAPI Doc | Tenant/biblioteca: gateway_openapi, inbox_processed |
Projeções derivadas; consumidor RabbitMQ |
| Tunnel | Tenant/biblioteca: tunnels |
Recursos Cloudflare; token persistido no documento |
| Outbox Dispatcher | Varre databases Mongo visíveis, excluindo admin, local, config; lê/atualiza outbox_events (configurável) |
Não cria domínio de negócio próprio; publica RabbitMQ e controla lease/retry |
| Auth Provider | Sem collections próprias | Redis/memória para tokens/OIDC/JWK; JWKS de realm em memória |
| BFF | Sem collections próprias | Redis para buckets de limites e leitura de alias; DTOs/VOs são transporte |
| Broker | Sem collections próprias | Redis para concorrência; JWKS em memória; envelopes de request/response transitórios |
| Builder | Sem collections próprias | Redis para configuração de rota e recursos iPaaS via CacheUtil |
| Security Checker | Sem collections próprias | Redis/memória para políticas/tokens; consome quotas Redis |
| Discovery | Sem collections próprias | Mapa de rotas por tenant em memória, invalidação RabbitMQ |
| Cache Invalidator | Sem collections próprias | Remove chaves Redis e publica invalidação; Cache Monitor no mesmo repositório pode executar recuperação ampla |
| Monitoring | Sem Mongo próprio; lê Elasticsearch logs-{tenant}.otel-gateway e metrics-{tenant}.otel-gateway |
Consultas _search; não define mappings/retention desses índices |
| Web Pages | Sem collections próprias; lê artefato em GCS | Cache Caffeine openapi-doc-cache, TTL de escrita 3 min; consulta documentos via OpenAPI Doc |
| Router | Sem banco/cache de negócio identificado | Request, envelope e corpo de resposta em memória |
| JSON Handler | Sem banco/cache de negócio identificado | Transformações e validação de schemas em memória |
São 30 contratos de documento raiz em 11 serviços proprietários, contando outbox_events em cada produtor e os dois modelos de nome físico delegado. O Dispatcher acessa a outbox existente. O dicionário inclui 128 modelos/enums alcançáveis pelos campos desses documentos; tipos auxiliares não viram collections por terem uma classe Java.
Persistência complementar e limites¶
- Elasticsearch: Monitoring seleciona os índices por tenant em LogQueryVO/MetricsQueryVO e lê logs/métricas. Ingestão, mappings e retenção não são implementados por esse serviço. Consultas.
- Web Pages/GCS:
GcpOpenApiServicelê um blob HTML UTF-8 do bucket/caminho configurados; não grava entidades Mongo. O cache local guarda a apresentação documental, não a configuração original. Leitor, configuração. - Keycloak/Cloudflare: contratos externos mantêm identidade e conectividade; suas bases internas não estão modeladas nos repositórios Gateway. Security, Tunnel.
- JobRunr: armazenamento interno da biblioteca separado das atividades de domínio; nomes de collections internas não são declarados no código de aplicação. Scheduler.
- SQL: nenhum dos 23 serviços analisados declara persistência de domínio SQL; bancos de dependências do ambiente local não são bancos de negócio Gateway. Infraestrutura por ambiente.
Evidências e manutenção¶
Os links dos modelos, repositories, índices, serviços e testes apontam para commits do checkout analisado. Relacionamentos, versionamento, multi-tenancy, Redis e eventos concentram contratos transversais sem repetir todos os campos. Possíveis problemas de consistência ficam em Análises de dados.
Cobertura dos repositórios¶
Código e configuração foram inspecionados nos commits abaixo. Modelos, repositories, consultas e testes específicos estão vinculados nas páginas de domínio.
| Repositório | Commit | Código / dependências |
|---|---|---|
| totvs-gateway-auth-provider | 51fd6513f82d |
Código · Dependências |
| totvs-gateway-bff | 2f16f060de64 |
Código · Dependências |
| totvs-gateway-broker | d419481fbf7a |
Código · Dependências |
| totvs-gateway-builder | fe44ac95d218 |
Código · Dependências |
| totvs-gateway-cacheinvalidator | 13abb76112a1 |
Código · Dependências |
| totvs-gateway-core | 4138c7539324 |
Código · Dependências |
| totvs-gateway-discovery | 0f962a284892 |
Código · Dependências |
| totvs-gateway-globalregistry | 45a7d6dc16bf |
Código · Dependências |
| totvs-gateway-importer | feb15d4b8816 |
Código · Dependências |
| totvs-gateway-ippolicy | ca79becbd061 |
Código · Dependências |
| totvs-gateway-jsonhandler | cc52b48774b1 |
Código · Dependências |
| totvs-gateway-monitoring | 4c967b473073 |
Código · Dependências |
| totvs-gateway-object-storage | 06a37462d6a7 |
Código · Dependências |
| totvs-gateway-openapi-doc | 703494186f3a |
Código · Dependências |
| totvs-gateway-outbox-dispatcher | e46f47d54a4c |
Código · Dependências |
| totvs-gateway-ratelimit | a72eb4e7ce73 |
Código · Dependências |
| totvs-gateway-router | 1e6c4fa7adfc |
Código · Dependências |
| totvs-gateway-scheduler | 4ff6a2ec923a |
Código · Dependências |
| totvs-gateway-security | 85ce9ec0e4a2 |
Código · Dependências |
| totvs-gateway-securitychecker | ab1bb6146477 |
Código · Dependências |
| totvs-gateway-template-service | b84abeaa22b0 |
Código · Dependências |
| totvs-gateway-tunnel | c4eb448d1f1a |
Código · Dependências |
| totvs-gateway-webpages | 27d8a0f1f754 |
Código · Dependências |