003 — Plan · Stack da Aplicação: OpenAPI, Estado, UI e Testes
003 — Plan · Stack da Aplicação: OpenAPI, Estado, UI e Testes
Seção intitulada “003 — Plan · Stack da Aplicação: OpenAPI, Estado, UI e Testes”Data: 2026-06-29
Contexto
Seção intitulada “Contexto”Sobre a fundação (ADR 001), falta a stack que o app de fato usa: contrato de API, estado, componentes, testes e banco. Tudo já é regra no Manifesto — aqui ela é instalada e exercitada por um fluxo ponta a ponta.
Decisão
Seção intitulada “Decisão”- OpenAPI derivado de Zod 4 nativo (
z.toJSONSchema), com paths por domínio, servido em/openapi.jsone testável em/reference(Scalar). Tipos gerados do spec. - Zustand no padrão store + sync; shadcn/ui completo; Sonner para toasts.
- Vitest com teste de contrato (TDD); Prisma + Postgres em Docker.
Consequências
Seção intitulada “Consequências”- Positivas: documentação, validação e tipos a partir de uma única fonte (Zod); base testável.
- Custos: manter o spec/paths à mão (corpos vêm do Zod; rotas/summaries são escritas).
Tarefas e subtarefas
Seção intitulada “Tarefas e subtarefas”- OpenAPI:
document.ts,domains/*, schemas Zod, rotas/openapi.jsone/reference. - Tipos:
gen-openapi-types.ts(pnpm openapi) + clienteopenapi-fetch. - Zustand: store
tasks+ sync + página demo. - shadcn/ui completo em
packages/ui; Sonner no layout. - Vitest + teste de contrato.
- Prisma +
docker-compose+ seed + scriptsdb:*.
Quiz de decisões
Seção intitulada “Quiz de decisões”Tema: Contrato de API (OpenAPI)
Seção intitulada “Tema: Contrato de API (OpenAPI)”P1. Como gerar o spec OpenAPI?
- ( ) A) Biblioteca zod-to-openapi (
@asteasolutions/...). - (X) B)
z.toJSONSchema()NATIVO do Zod 4 + paths escritos à mão por domínio. - ( ) C) YAML/JSON mantido à mão.
Justificativa: padrão dos projetos de referência — zero biblioteca intermediária, Zod como
fonte única, infra enxuta. Cada domínio exporta { tag, schemas, paths }.
P2. Como o front consome a API?
- ( ) A)
fetchcru com tipos escritos à mão. - (X) B) Tipos gerados do spec (
openapi-typescript) + clienteopenapi-fetch. - ( ) C) tRPC.
Justificativa: o manifesto exige tipos gerados — o front nunca escreve tipos da API à mão.
pnpm openapi materializa o spec e regenera lib/shared/api-types.ts.
Tema: Estado
Seção intitulada “Tema: Estado”P3. Padrão de store?
- (X) A)
stores/[nome]/{store.ts, sync.tsx}(manifesto, inegociável). - ( ) B) Hooks soltos / Context.
Justificativa: regra do manifesto. A store tasks consome a API tipada; o sync.tsx carrega os
dados ao montar.
Tema: Testes
Seção intitulada “Tema: Testes”P4. Estratégia de testes?
- (X) A) Desenvolvimento orientado a testes: schema Zod → teste de contrato → implementação.
- ( ) B) Testes só no fim, manuais.
Justificativa: manifesto/architecture/08. O teste de contrato (schemas.test.ts) é o ponto de
partida — valida o contrato antes da rota.
Tema: Banco
Seção intitulada “Tema: Banco”P5. Qual versão do Prisma?
- ( ) A) Prisma 6 (
urlno schema, fluxo clássico). - (X) B) Prisma 7 (última versão):
prisma.config.ts+ driver adapter@prisma/adapter-pg- o novo generator
prisma-client.
- o novo generator
Justificativa: pedido explícito de usar a última versão. A v7 tira a url do schema (vai para
prisma.config.ts), usa driver adapter (pg) e gera o client em pasta própria (generated/).
P6. Como organizar o schema?
- ( ) A) Um único
schema.prisma. - (X) B) Schema multi-arquivo por domínio (
prismaSchemaFolder):prisma/schema.prismacarregagenerator+datasource; cada domínio vive emprisma/models/<dominio>.prisma.
Justificativa: pedido de “controle de domínios”. Cada domínio cresce no seu arquivo (ex.:
models/tasks.prisma, models/users.prisma), com relações entre eles. Espelha a separação de
domínios da API/OpenAPI.
Pós-plan
Seção intitulada “Pós-plan”- Riscos: paths do OpenAPI mantidos à mão podem divergir de summaries; os corpos não divergem (vêm do Zod).
- Dependências: Docker para o banco.
- Fora de escopo: dados reais, auth (ADRs futuras).
Criado por Joseph Trupel