API de portfólio para simular um backend de matrícula com fluxo completo de checkout:
catálogo -> lead -> pagamento -> operação interna.
O objetivo deste repositório não é mostrar volume de código. É mostrar critérios de engenharia em um fluxo sensível: idempotência, tratamento de falha operacional, segurança de dados, documentação útil e validação automatizada.
Idempotency-KeyemPOST /api/payments- persistência operacional de checkout sem expor dados sensíveis
- separação entre erro de negócio e indisponibilidade do provider
- endpoint interno autenticado para operação
- contrato OpenAPI utilizável sem abrir o código
- CI com lint, build, testes e integração com Postgres
Fluxo principal:
GET /api/courses
-> catálogo
POST /api/leads
-> valida payload
-> persiste lead
-> gera lead_code
POST /api/payments
-> valida idempotência
-> cria checkout
-> chama provider (mock/rede)
-> persiste estado operacional
-> atualiza lead
GET /api/leads
-> rota interna autenticada
-> consulta operação por lead_code
Arquivos centrais para leitura:
api/payments.tsapi/leads.tslib/apiHandler.tslib/paymentsDomain.tslib/paymentsStore.tslib/leadsDomain.tsdocs/openapi.yaml
- Node.js + TypeScript
- Express com handlers compatíveis com Vercel
- PostgreSQL
pinopara logs estruturados- provider de pagamento com modo
mockpara demonstração local eredepara integração real
GET /api/healthGET /api/coursesPOST /api/leadsGET /api/leadsinterno, protegido por tokenPOST /api/payments
Se a ideia for avaliar o projeto em poucos minutos, este é o caminho mais direto:
- Ler docs/case.md para entender o problema técnico e as decisões.
- Ler docs/portfolio-checklist.md para validar o repositório sem tentativa e erro.
- Abrir docs/openapi.yaml para ver o contrato HTTP.
- Conferir api/payments.ts e lib/paymentsStore.ts para o fluxo mais sensível.
Pré-requisitos:
- Node.js
20.20.0ou compatível com .nvmrc epackage.json > engines - npm
10+ - PostgreSQL acessível
psqlinstalado se você quiser aplicar migrations fora do Docker
npm ci
cp .env.example .env.local
docker compose up -d db
npm run db:setup
npm run devnpm ci
cp .env.example .env.local
npm run db:apply
npm run devnpm run db:apply funciona de dois jeitos:
- usando o container
dbdodocker compose, se ele estiver rodando - usando
DATABASE_URL+psql, se você já tiver um Postgres fora do Docker
API local: http://localhost:3000
Validação estática:
npm run lint
npm run build
npm run check
npm run docs:openapiIntegração com banco:
docker compose up -d db
npm run db:setup
DATABASE_URL=postgres://demo:demo@127.0.0.1:5432/enrollment_demo \
MATRICULADOR_TOKEN=integration-token \
PAYMENT_PROVIDER_MODE=mock \
npm run test:integrationO teste de integração cobre:
- criação de lead
- pagamento aprovado em modo
mock - reuso por
Idempotency-Key - consulta interna autenticada
- envelope padronizado para rota inexistente
X-Request-Idem todas as respostas- erros padronizados no formato
{ code, error, message, requestId, details? } - CORS restritivo em produção
- logs com redaction de
cardNumber,cvv,Authorizatione tokens internos provider_responsepersistido com sanitização- falha operacional do provider é tratada como indisponibilidade, não como recusa de negócio
- inicialização da aplicação desacoplada do banco para rotas não dependentes de DB
No .env.local:
PAYMENT_PROVIDER_MODE=mockPAYMENT_PROVIDER_MODE=rede
Cartões de exemplo no modo mock:
- aprovado:
5448280000000007 - negado:
5448280000070000 - requer autenticação:
5448280000011111
Este repositório é uma demonstração técnica. A intenção foi priorizar:
- clareza de contrato
- comportamento confiável no fluxo sensível
- documentação executável
- legibilidade para revisão técnica
Ele não tenta cobrir tudo que existiria em um produto real, como autenticação de usuários finais, filas assíncronas, observabilidade externa ou infraestrutura completa de produção.
MIT (LICENSE)