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) eingest↔push(a nota aplicada dispara push). Resolvidos assim:- a auditoria (
ApiHealthRequestRecorder) foi paracomum→comum→core(permitido); ingest→pushquebrado por evento: oXadmServicepublica umNotaAplicadaEvent(emcore) e oNotaAplicadaPushListener(empush) reage —ingestnão conhecepush.
- a auditoria (
- 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.