API de gerenciamento de tarefas (todos) construída com Fastify, TypeScript e Zod.
O projeto segue uma estrutura simples e organizada por domínio, com validação de entrada nos handlers e um repositório em memória para persistência durante a execução.
- Node.js
- TypeScript
- Fastify
- Zod
- Vitest
- Supertest
- Health check com ping
- Criar todo
- Listar todos os todos
- Buscar todo por ID
- Atualizar todo por ID
- Remover todo por ID
Base URL local: http://localhost:3000
- GET /api/ping
Resposta esperada:
{
"message": "pong"
}- GET /api/todos
- POST /api/todos
- GET /api/todos/:id
- PUT /api/todos/:id
- DELETE /api/todos/:id
Payload de criacao e atualizacao:
{
"title": "Minha tarefa",
"description": "Descricao opcional"
}As variaveis sao lidas e validadas em tempo de inicializacao.
- PORT: porta da aplicacao (padrao: 3000)
- NODE_ENV: development, production ou test (padrao: development)
Exemplo de arquivo .env:
PORT=3000
NODE_ENV=developmentnpm installnpm run devServidor disponivel em:
npm run build
npm startnpm testnpm run test:watchOs testes sao e2e usando Vitest + Supertest e ficam ao lado dos handlers, com sufixo .spec.ts.
A API e organizada por dominio em src/api/controllers.
Exemplo:
- src/api/controllers/ping
- src/api/controllers/todos
Cada arquivo de handler contem um caso de uso HTTP (por exemplo: create.ts, get-by-id.ts, update-by-id.ts).
As rotas sao registradas em camadas:
- src/app.ts registra o modulo principal da API com prefixo /api.
- src/api/routes.ts agrupa os modulos por dominio (ping e todos).
- Cada dominio possui seu proprio arquivo routes.ts, que conecta paths aos handlers.
Fluxo de registro:
- app.ts -> api/routes.ts -> controllers/<dominio>/routes.ts -> handler
Isso facilita escalar o projeto: para adicionar um novo dominio, basta criar uma pasta em controllers com seu routes.ts e registrar no agregador de rotas da API.
Os handlers validam params e body usando Zod.
Em caso de payload invalido, a API retorna status 400 com mensagem de erro.
A camada core concentra regras de acesso a dados:
- src/core/repositories/todos/index.ts define o contrato (interface)
- src/core/repositories/todos/in-memory-todo-repository.ts implementa o contrato
- src/core/factories/repositories.ts centraliza a criacao e reutilizacao da instancia
Esse padrao permite trocar a implementacao em memoria por banco de dados no futuro sem alterar os handlers.
O projeto usa alias @ para apontar para src, configurado no tsconfig.
Exemplo:
- import { app } from "@/app"