API REST para gestão financeira pessoal com autenticação JWT, categorias, recorrências, transações e resumo financeiro por período.
- Node.js 20
- TypeScript
- Fastify
- Drizzle ORM
- PostgreSQL
- Zod
- Docker + Docker Compose
- Node test runner com
tsx
- Cadastro e login com JWT
- Categorias separadas por tipo:
incomeeexpense - Políticas de recorrência semanais e mensais
- Transações com chave de idempotência
- Resumo financeiro consolidado com filtro por período
- Isolamento por usuário autenticado
- Validação de payloads com mensagens claras
- Documentação interativa com Swagger
- O usuário autenticado é a fonte de verdade para
userId - Categorias, recorrências e transações são sempre filtradas por usuário
- Uma recorrência só pode ser criada usando categoria do próprio usuário
- Uma transação só pode usar categoria do próprio usuário
- O tipo da transação ou recorrência precisa combinar com o tipo da categoria
- Se
recurrenceIdfor informado na transação, ele precisa pertencer ao mesmo usuário, mesma categoria e mesmo tipo endDatede recorrência não pode ser menor questartDateidempotencyKeyé única por usuário
src/
app.ts
server.ts
db/
modules/
auth/
categories/
recurrences/
transactions/
shared/
types/
tests/
drizzle/
Copie .env.example para .env e preencha:
DATABASE_URL=postgresql://postgres:postgres@localhost:5432/finance_wallet
JWT_SECRET=uma_chave_segura
DB_USER=postgres
DB_PASSWORD=postgres
DB_DATABASE=finance_walletpnpm install
pnpm db:migrate
pnpm devdocker compose up --buildSe você adicionar ou atualizar dependências, prefira subir novamente com rebuild:
docker compose up --buildSe o volume de dependências do container estiver desatualizado, recrie os containers:
docker compose down -v
docker compose up --buildCom a aplicação em execução, a documentação interativa fica disponível em:
http://localhost:3000/docs
Ela inclui autenticação via Bearer token e exemplos de contrato para as rotas principais.
pnpm dev
pnpm build
pnpm start
pnpm lint
pnpm format
pnpm format:check
pnpm test
pnpm test:watch
pnpm db:migratePOST /auth/signupPOST /auth/signin
GET /categoriesGET /categories/:idPOST /categoriesPATCH /categories/:idDELETE /categories/:id
GET /recurrencesGET /recurrences/:idPOST /recurrencesPATCH /recurrences/:idDELETE /recurrences/:id
GET /transactionsGET /transactions/:idPOST /transactionsDELETE /transactions/:id
GET /financial/summary
{
"name": "Salario",
"type": "income"
}{
"categoryId": "uuid-da-categoria",
"amount": 1500,
"description": "Aluguel",
"type": "expense",
"frequency": "monthly",
"step": 1,
"startDate": "2026-04-01",
"endDate": "2026-12-01"
}{
"categoryId": "uuid-da-categoria",
"recurrenceId": "uuid-da-recorrencia",
"amount": 1500,
"description": "Aluguel abril",
"type": "expense",
"transactionDate": "2026-04-05",
"idempotencyKey": "expense-rent-2026-04"
}GET /financial/summary?startDate=2026-04-01&endDate=2026-04-30
Authorization: Bearer <token>- Build TypeScript
- Testes automatizados para contrato e proteção de rota
- Padronização de resposta com
{ success, data | error } - Migrações versionadas com Drizzle
- Swagger/OpenAPI em
/docs
- Adicionar paginação e filtros por período
- Expor resumo mensal de receitas, despesas e saldo
- Criar seed de dados de demonstração
- Adicionar testes de integração com banco dedicado
- Fastify foi escolhido pela simplicidade e performance para APIs
- Drizzle deixa o schema explícito no código e facilita versionamento com SQL
- Zod mantém validação próxima do contrato HTTP
- A separação por módulos ajuda a escalar a API por domínio