Pular para conteúdo

0010 — Package-by-feature + core + evento de domínio

Status: Aprovado · Responsável: Gustavo Madruga · Atualizado em: 2026-07-07 · Decidido em: 2026-07-07

Contexto. O código era package-by-layer (controller/service/repository/domain/...) — a geração anterior. A constituição prefere package-by-feature.

Decisão. Reorganizar em features (ingest, views, powersync, push, export) sobre uma fundação de dados core (entidades, repositórios, enums, conversores, ParsedXadmPayload, eventos) e um kernel comum (config, auth, exceção, observabilidade, auditoria). Detalhe: estrutura de código.

Consequências / trade-offs.

  • A decomposição ingênua teria dois acoplamentos: comum→ingest (auditoria) e ingest↔push (a nota aplicada dispara push). Resolvidos assim:
    • a auditoria (ApiHealthRequestRecorder) foi para comum → comum→core (permitido);
    • ingest→push quebrado por evento: o XadmService publica um NotaAplicadaEvent (em core) e o NotaAplicadaPushListener (em push) reage — ingest não conhece push.
  • Resultado: o grafo de pacotes é um DAG. Guarda ArchUnit no gate: core puro, comum só depende de core, sem ciclos.
  • §6 (destilado para a constituição): package-by-feature num app com entidades compartilhadas só fecha em DAG com core separado + eventos de domínio para as reações cross-feature.

Verificação. Suíte completa verde; arch/ArchitectureTest valida as três regras.