feat(api): foundation canon JCS — Pino+CLS+RFC9457+health+ping (Frente A)
Estabelece a fundação operacional de apps/api conforme STACK.md v2.2 e
CODING-RULES.md v2.0, substituindo o hello-world scaffolded.
- tracing.ts primeiro import (PGD-OBS-001) — stub OTel ativável por env
- EnvSchema Zod 4 com fail-fast (superRefine guarda prod) + EnvModule global
- nestjs-pino com redact LGPD (*.cpf|*.cardNumber|*.password|auth|cookie)
- main.ts hardenizado: helmet, CORS por env, compression, versionamento URI
/api/v1, graceful shutdown
- ProblemDetailsFilter global (RFC 9457 application/problem+json), Zod -> 422
- Health endpoints /api/v1/health/{live,ready} com memory.checkHeap(350MB)
(ready skeleton documenta K=3 LRU pool conforme PGD-OBS-003)
- WorkspaceModule via ClsModule.forRootAsync — requestId+workspaceId no CLS,
idGenerator alinhado com pino-http para mesmo UUID em header e body
- GET /api/v1/ping retornando workspaceId+requestId (alvo de smoke test e
futuro healthcheck do docker compose)
- ZodValidationPipe (nestjs-zod) como APP_PIPE global
- tsconfig.app.json target ES2023 (alinhado ao base)
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -250,6 +250,46 @@
|
||||
4. Implementar multi-tenant BD-por-workspace via Prisma factory + cls
|
||||
5. Primeira tela viva: login + painel Rafael (vazio)
|
||||
|
||||
### 2026-05-27 — Foundation API (Frente A) CONCLUÍDA ✅
|
||||
- **10 tarefas executadas (A1-A10):** tsconfig hardening · tracing stub · Zod env · Pino+redact LGPD · main.ts hardening · RFC 9457 filter · health endpoints · CLS workspace · /api/v1/ping · build+lint+smoke
|
||||
- **Estrutura `apps/api/src/`:**
|
||||
- `tracing.ts` — primeiro import (PGD-OBS-001), OTel SDK ativável por env
|
||||
- `main.ts` — helmet · CORS por env · compression · versionamento URI `/api/v1` · graceful shutdown · Pino logger global
|
||||
- `app/config/` — EnvSchema Zod 4 com `superRefine` (fail-fast prod, defaults dev) + EnvModule global
|
||||
- `app/logger/` — nestjs-pino com redact `*.cpf|*.cardNumber|*.password|authorization|cookie`, ignora `/health/*`, pretty em dev
|
||||
- `app/filters/problem-details.filter.ts` — RFC 9457 `application/problem+json`, Zod → 422 com array `errors`, type URIs em `https://docs.sar.jcs.com.br/errors/*`
|
||||
- `app/health/` — `/health/live` e `/health/ready` (skeleton, K=3 LRU pool placeholder documentado)
|
||||
- `app/workspace/` — ClsModule.forRootAsync com `setup` populando requestId+workspaceId; idGenerator alinha com pino-http (mesmo UUID header+body)
|
||||
- `app/ping/` — `GET /api/v1/ping` retornando status+service+version+workspaceId+requestId+uptime+now
|
||||
- `app.module.ts` — APP_PIPE: ZodValidationPipe (nestjs-zod) · APP_FILTER: ProblemDetailsFilter
|
||||
- **Dependências instaladas (root):** @nestjs/config 4.0 · @nestjs/terminus 11.1 · nestjs-pino 4.6 · pino 9.14 · pino-http 10.5 · pino-pretty 13.1 · nestjs-zod 4.3 · nestjs-cls 5.4 · helmet 8.2 · compression 1.8 · zod (catalog) · @types/express · @types/compression
|
||||
- **Smoke test verde:** `GET /api/v1/ping` → 200 com workspaceId+requestId · `/health/live` + `/health/ready` → 200 (heap OK) · `/api/v1/nope` → 404 application/problem+json · CORS preflight: localhost:4200 permitido, evil.com bloqueado · helmet headers todos presentes (HSTS, X-CTO, X-Frame-Options, etc.) · `x-request-id` propagado em todas as responses
|
||||
- **Hello-world boilerplate removido** (app.controller/service/specs)
|
||||
- **Pendente próxima sessão:**
|
||||
1. **Frente C — Zod contracts compartilhados** (`libs/shared/api-interface`): primeiro DTO real (createZodDto) consumido por API + Web
|
||||
2. **Frente D — ESLint boundaries** (3 tags Nx canônicas) + Husky+gitleaks
|
||||
3. **Web → API integração:** `apps/web` chamar `/api/v1/ping` via TanStack Query (validar fundação ponta-a-ponta no browser)
|
||||
4. **OpenTelemetry SDK** plugar quando entrar em catálogo (stub atual mantém posição correta)
|
||||
5. **Master-login + WorkspacePrismaPool** (próxima frente arquitetural pesada)
|
||||
6. **Docker compose dev**: subir e validar healthcheck (`pnpm dev:up`)
|
||||
|
||||
### 2026-05-27 — Foundation Web (Frente B) CONCLUÍDA ✅
|
||||
- **Commit:** `3a42723 feat(web): foundation com brand JCS + AntD theme + Rafael painel placeholder`
|
||||
- **Tokens CSS** em `apps/web/src/styles/tokens.css` espelhando brand.md (paleta, tipografia, layout, motion, spacing, type scale)
|
||||
- **Plus Jakarta Sans Variable** self-host via `@fontsource-variable/plus-jakarta-sans` (LGPD + performance)
|
||||
- **AntD ConfigProvider tema JCS** em `apps/web/src/lib/theme.ts` — colorPrimary #004a99, radius 12/20, sombra canon, motion sutil
|
||||
- **TanStack Query + Router** setup com defaults conservadores (no refetchOnFocus, retry 5xx, no mutation retry — Idempotency-Key cobre)
|
||||
- **Layout shell:** Topbar 80px + Sidebar 260px com 9 itens cockpit Rafael (FA outline icons)
|
||||
- **RafaelPainel placeholder** com copy canônica + mock data:
|
||||
- "Bom dia, Rafael" + agenda do dia
|
||||
- Meta de maio (R$ 47.600 / R$ 60.000 = 79%) com Progress JCS Blue
|
||||
- "Pedidos no mês" (28, +18% vs abril) · "Comissão" (R$ 2.540, FLEX R$ 380)
|
||||
- "Clientes esfriando" — OPENFRIOS 47 dias, etc. — vocabulário canon
|
||||
- "Próxima visita" OPENFRIOS 14:30
|
||||
- **Build OK:** 878KB JS (~250KB gzip) — vai code-splitar quando cockpits virarem rotas separadas
|
||||
- **Dev server:** http://localhost:4200/ servindo com title, theme-color, lang pt-BR corretos
|
||||
- **Pendentes próxima sessão:** Frente A (API foundation), C (Zod contracts), D (ESLint+boundaries), Docker permissions, **abrir browser e validar visualmente**
|
||||
|
||||
---
|
||||
|
||||
## About This Folder
|
||||
|
||||
Reference in New Issue
Block a user