Áreas por rota
1. Introdução¶
Nesta opção, mantemos a mesma aplicação (um único projeto e, normalmente, um único deploy), porém a API é organizada em áreas por rota, separando claramente o acesso por público:
/cliente/*/corretor/*/superapp/*/partners/*/webhooks/*/ia/*
A ideia é reduzir o risco de “mistura” entre públicos e permitir políticas específicas por área (permissão, rate limit, logs, contratos), sem precisar criar novos serviços agora.
2. Visão estratégica¶
2.1. O que esta opção resolve¶
- Organiza a superfície pública por público: cada consumidor acessa uma “faixa” de rotas própria, evitando o cenário de “tudo no mesmo lugar”.
- Reduz risco de endpoint comum cair no público errado: a própria estrutura de rotas e módulos força separação.
- Facilita governança e documentação: fica natural manter documentação por público (cliente, corretor, superapp, parceiros, webhooks).
- Permite implantação incremental: dá para migrar e endurecer segurança área por área sem precisar refatorar tudo de uma vez.
2.2. O que esta opção não resolve sozinha¶
- Ainda é um mesmo bolo: um bug crítico, uma falha de configuração ou um problema de deploy pode afetar todas as áreas.
- Rota não protege sozinha: a autorização real ainda precisa existir (vínculo do recurso, permissões, regras por consumidor). Se a aplicação “confia demais” na rota, o risco continua.
- Risco de duplicação: se não houver padrão, pode acontecer duplicação de controller/DTO/contratos entre áreas
3. Visão de negócio¶
3.1. Benefícios¶
- Clareza de contrato por público: portal do cliente, portal do corretor e superapp podem ter endpoints semelhantes, mas com contratos e restrições bem posicionados.
- Evolução controlada: o negócio consegue evoluir funcionalidades do superapp sem “puxar junto” mudanças desnecessárias do portal, por exemplo.
- Parceiros com contrato separado:
/partners/*permite criar um conjunto controlado de operações (subset) sem expor o que é interno. - Webhooks tratados como exceção:
/webhooks/*é naturalmente o lugar de endpoints públicos e com validações específicas, ao invés de espalharAllowAnonymousna API toda.
3.2. Pontos de atenção para o negócio¶
- É necessário definir, por área:
- quais funcionalidades entram (e quais não entram),
- quais dados podem ser retornados,
- qual nível de limite e auditoria será aplicado.
- A separação por rota não pode virar só “organização estética”. Ela precisa vir acompanhada de regras de autorização e vínculo para garantir que cada público só acesse o que deve.
4. Fluxo de funcionamento¶
%%{init:{
"theme":"neutral",
"fontSize":22,
"flowchart":{"curve":"basis","htmlLabels":true,"nodeSpacing":50,"rankSpacing":70}
}}%%
flowchart TB
A["Consumidor faz requisicao"]:::ui_input --> B["API Unica com Areas<br/>rotas separadas por publico"]:::ui_input
B --> C{Selecionar area pela rota}:::decision
C -- Cliente --> D["Area Cliente<br/>cliente endpoints"]:::ui_input
C -- Corretor --> E["Area Corretor<br/>corretor endpoints"]:::ui_input
C -- Superapp --> F["Area Superapp<br/>app endpoints"]:::ui_input
C -- Parceiros --> G["Area Parceiros<br/>public api"]:::ui_input
C -- Webhooks --> H["Area Webhooks<br/>integracoes externas"]:::ui_input
C -- IA --> I1["Area IA<br/>agentes automacoes"]:::ui_input
D --> J["Politicas da area<br/>token cors limites"]:::ui_input
E --> J
F --> J
I1 --> J
G --> K["Politicas parceiros<br/>chave quota limites"]:::ui_input
H --> L["Politicas webhooks<br/>assinatura idempotencia"]:::ui_input
J --> M{Autenticacao ok}:::decision
M -- Nao --> N["Negar acesso<br/>401 ou 403"]:::ui_button
M -- Sim --> O["Autorizacao por vinculo<br/>dados do solicitante"]:::ui_input
O --> P{Vinculo permitido}:::decision
P -- Nao --> N
P -- Sim --> Q["Chamar modulos de dominio compartilhados<br/>contratos cobranca documentos"]:::endpoint_post
Q --> R["Registrar auditoria por area<br/>logs e metricas"]:::ui_input
R --> S["Resposta para consumidor<br/>contrato da area"]:::endpoint_get
K --> T{Chave e quota ok}:::decision
T -- Nao --> N
T -- Sim --> U["Autorizacao do parceiro<br/>escopos do contrato"]:::ui_input
U --> V["Operacoes permitidas para parceiro<br/>somente subset"]:::endpoint_post
V --> R
L --> W{Webhook valido}:::decision
W -- Nao --> N
W -- Sim --> X["Normalizar evento e roteamento interno<br/>sem expor dominio"]:::endpoint_post
X --> R
classDef endpoint_get fill:#e0f2fe,stroke:#0284c7,color:#0f172a,stroke-width:1px;
classDef endpoint_post fill:#dcfce7,stroke:#16a34a,color:#052e16,stroke-width:1px;
classDef endpoint_put fill:#fef9c3,stroke:#a16207,color:#3b2f0b,stroke-width:1px;
classDef endpoint_delete fill:#fee2e2,stroke:#ef4444,color:#7f1d1d,stroke-width:1px;
classDef ui_input fill:#eef2ff,stroke:#6366f1,color:#111827,stroke-width:1px;
classDef ui_button fill:#ede9fe,stroke:#7c3aed,color:#1f2937,stroke-width:1px;
classDef decision fill:#fff7ed,stroke:#f59e0b,color:#78350f,stroke-width:1px;
5. Manutenção e longo prazo¶
5.1. Manutenção do código¶
- Melhor organização do monólito: a separação por rotas tende a incentivar separação por módulos/pacotes (ex.:
Cliente,Corretor,Superapp,Partners,Webhooks). - Menos risco de “misturar público”: o desenvolvedor naturalmente escolhe “onde colocar” o endpoint conforme o público-alvo.
- Disciplina necessária para evitar duplicação:
- Controllers por área podem crescer e duplicar lógica se não houver módulos compartilhados bem definidos.
- DTOs podem se multiplicar se cada área inventar um “contrato” diferente sem padrão.
Boas práticas para manter sustentável:
- Módulos de domínio compartilhados (contratação, documentos, financeiro) com serviços reutilizáveis.
- “Camada de política” por área (autorização, limites, validações) padronizada, evitando lógica repetida em controller.
- Testes focados em: “endpoint está na área certa?” + “permissão e vínculo continuam valendo?”.
5.2. Escalabilidade¶
- Escala horizontal do mesmo deploy (aumento de réplicas), porém com uma vantagem:
- é mais fácil aplicar políticas diferenciadas por rota (ex.: limitar
/partners/*e/webhooks/*mais agressivamente).
- é mais fácil aplicar políticas diferenciadas por rota (ex.: limitar
- Rate limit e quotas por área:
/partners/*: quotas e limites por parceiro./webhooks/*: limites fortes, idempotência e validação./superapp/*: limites por usuário/device.
- Observabilidade por área:
- métricas, logs e alarmes por rota/área facilitam detectar problemas e abusos (ex.: pico em webhooks sem derrubar o resto).
6. Adaptação ao legado do PASI¶
Esta opção é especialmente útil no contexto atual do PASI (onde há grande superfície pública e fragilidades de autenticação), porque permite organizar e endurecer sem explodir a topologia.
6.1. Caminho de adaptação recomendado¶
- Criar as áreas e mover rotas
- Mapear endpoints existentes e realocar para:
/cliente/*,/corretor/*,/superapp/*,/partners/*,/webhooks/*.
- Mapear endpoints existentes e realocar para:
- Tratar webhooks como exceção
- Confinar tudo que for “público por natureza” em
/webhooks/*. - Aplicar assinatura, validação e idempotência nessa área, evitando
AllowAnonymousespalhado.
- Confinar tudo que for “público por natureza” em
- Endurecer autenticação por área
- Cliente/corretor/superapp exigem token e políticas de CORS por área.
- Parceiros exigem chave/token com quotas e escopos limitados.
- Padronizar autorização por vínculo em todas as áreas
- Independente de rota, toda operação que acessa dados sensíveis deve validar vínculo (cliente só vê seu dado, corretor só vê sua carteira, parceiro só vê seu escopo).
- Documentação e governança por público
- Publicar documentação separada por área, evitando que “o parceiro veja endpoints internos” por engano.
6.2. Por que esta opção é boa para transição¶
- Permite migrar área por área, com entregas claras e comunicáveis para a diretoria:
- primeiro
/webhooks/*(reduz superfície pública rapidamente), - depois
/partners/*(contrato controlado), - depois
/superapp/*(lançamento), - e por fim
/cliente/*e/corretor/*(consolidação).
- primeiro
- Mantém baixo custo operacional (um deploy), enquanto melhora governança e organização.
7. Principais prós e contras¶
7.1. Prós¶
- Organiza e reduz risco de “endpoint comum” cair no público errado.
- Facilita documentação e governança por público.
- Dá para implantar em etapas (migrar área por área) sem criar novos serviços.
7.2. Contras¶
- Ainda é um mesmo deploy; um bug pode afetar tudo.
- Ainda precisa de disciplina na autorização real (rota sozinha não protege).
- Pode duplicar controller/DTO se não houver padrão.
8. Quando esta opção faz sentido¶
- Quando você quer segmentar já, melhorar governança e segurança, sem criar novos serviços agora.
- Quando há múltiplos consumidores com necessidades diferentes, mas o time quer manter a operação simples no curto prazo.
- Quando a estratégia é evoluir em fases, reduzindo risco e organizando contratos antes de uma separação mais profunda.