API RESTful completa para gerenciamento de tarefas desenvolvida com TypeScript, Express, Prisma ORM e PostgreSQL. Inclui validação robusta, testes automatizados, paginação, documentação interativa e recursos de segurança.
- Node.js - Runtime JavaScript
- TypeScript - Tipagem estática
- Express - Framework web minimalista
- Prisma ORM - ORM moderno para TypeScript
- PostgreSQL - Banco de dados relacional
- Zod - Validação de schemas com type inference
- Vitest - Framework de testes ultrarrápido
- Supertest - Testes de integração HTTP
- Helmet - Segurança com headers HTTP
- CORS - Cross-Origin Resource Sharing
- Express Rate Limit - Proteção contra rate limiting
- Swagger/OpenAPI - Documentação interativa da API
- Docker - Containerização do PostgreSQL
- ESLint - Linter para código TypeScript
- Prettier - Formatação de código
- ✅ CRUD completo de tarefas
- ✅ Paginação e filtros avançados
- ✅ Busca por título ou descrição
- ✅ Filtrar por status (concluídas/pendentes)
- ✅ Marcar como concluída/pendente
- ✅ Validação robusta com Zod
- ✅ Testes automatizados com Vitest
- ✅ Documentação interativa com Swagger
- ✅ Rate limiting para proteção
- ✅ Importação em massa via CSV
- ✅ Tratamento global de erros
tasks-api/
├── prisma/
│ ├── migrations/ # Migrações do banco de dados
│ └── schema.prisma # Schema do Prisma
├── src/
│ ├── config/
│ │ ├── database.ts # Configuração do Prisma Client
│ │ ├── env.ts # Variáveis de ambiente
│ │ └── swagger.ts # Configuração do Swagger
│ ├── controllers/
│ │ └── task.controller.ts
│ ├── middlewares/
│ │ ├── error-handler.ts # Tratamento global de erros
│ │ ├── rate-limit.ts # Rate limiting
│ │ └── validate.ts # Validação com Zod
│ ├── repositories/
│ │ └── task.repository.ts
│ ├── routes/
│ │ ├── index.ts
│ │ └── task.routes.ts
│ ├── schemas/
│ │ └── task.schema.ts # Schemas Zod
│ ├── services/
│ │ └── task.service.ts
│ ├── types/
│ │ └── task.types.ts
│ └── server.ts # Servidor Express
├── import-csv.js # Script de importação CSV
├── docker-compose.yml # PostgreSQL containerizado
├── vitest.config.ts # Configuração de testes
├── tsconfig.json # Configuração TypeScript
└── package.json
- Node.js 20+
- Docker e Docker Compose (ou PostgreSQL instalado)
- npm ou yarn
git clone https://github.com/seu-usuario/tasks-api.git
cd tasks-apinpm installCrie um arquivo .env na raiz do projeto:
# Server
PORT=3333
NODE_ENV=development
CORS_ORIGIN=*
# Database
DATABASE_URL="postgresql://postgres:postgres@localhost:5432/tasks_db?schema=public"docker-compose up -dnpm run prisma:migratenpm run devO servidor estará rodando em:
- 🚀 API: http://localhost:3333
- 📚 Documentação: http://localhost:3333/api-docs
Acesse a documentação interativa completa em:
http://localhost:3333/api-docs
{
"id": "uuid",
"title": "Título da tarefa",
"description": "Descrição detalhada",
"completed_at": null | "2026-02-02T20:00:00.000Z",
"created_at": "2026-02-02T20:00:00.000Z",
"updated_at": "2026-02-02T20:00:00.000Z"
}GET /healthResposta:
{
"status": "ok",
"timestamp": "2026-02-02T20:00:00.000Z",
"environment": "development"
}POST /api/tasks
Content-Type: application/json
{
"title": "Minha tarefa",
"description": "Descrição da tarefa"
}Resposta: 201 Created
GET /api/tasks?page=1&limit=10&search=teste&completed=falseQuery Parameters:
page(opcional) - Número da página (padrão: 1)limit(opcional) - Itens por página (padrão: 10, máx: 100)search(opcional) - Buscar por título ou descriçãocompleted(opcional) - Filtrar por status (true/false)
Resposta: 200 OK
{
"data": [
{
"id": "uuid",
"title": "Tarefa 1",
"description": "Descrição",
"completed_at": null,
"created_at": "2026-02-02T20:00:00.000Z",
"updated_at": "2026-02-02T20:00:00.000Z"
}
],
"pagination": {
"page": 1,
"limit": 10,
"total": 50,
"totalPages": 5
}
}GET /api/tasks/:idResposta: 200 OK
PUT /api/tasks/:id
Content-Type: application/json
{
"title": "Título atualizado",
"description": "Descrição atualizada"
}Resposta: 200 OK
Validações:
- Pelo menos um campo é obrigatório
- O ID deve existir
DELETE /api/tasks/:idResposta: 204 No Content
PATCH /api/tasks/:id/completeAlterna o status entre concluída e pendente.
Resposta: 200 OK
Crie um arquivo tasks.csv:
title,description
Tarefa 01,Descrição da tarefa 01
Tarefa 02,Descrição da tarefa 02
Tarefa 03,Descrição da tarefa 03node import-csv.jsnpm testnpm run test:uinpm run test:coverage- ✅ Testes unitários - Services, Repositories
- ✅ Testes de validação - Schemas Zod
- ✅ Testes de integração - Endpoints HTTP
- ✅ Helmet - Proteção de headers HTTP
- ✅ CORS - Configuração de origens permitidas
- ✅ Rate Limiting - 100 requisições por 15 minutos
- ✅ Validação de entrada - Zod schemas
- ✅ Variáveis de ambiente - Credenciais protegidas
- ✅ UUID - IDs não sequenciais
npm run prisma:studioAbre interface visual em http://localhost:5555
npm run prisma:migratenpx prisma migrate reset# Iniciar PostgreSQL
docker-compose up -d
# Parar
docker-compose down
# Ver logs
docker-compose logs -f postgres
# Resetar dados
docker-compose down -v
# Acessar PostgreSQL
docker-compose exec postgres psql -U postgres -d tasks_db{
"dev": "Iniciar servidor em modo desenvolvimento",
"build": "Compilar TypeScript para JavaScript",
"start": "Iniciar servidor de produção",
"test": "Executar testes",
"test:ui": "Executar testes com UI",
"test:coverage": "Executar testes com cobertura",
"lint": "Verificar erros de linting",
"lint:fix": "Corrigir erros de linting",
"format": "Formatar código com Prettier",
"prisma:generate": "Gerar Prisma Client",
"prisma:migrate": "Executar migrações",
"prisma:studio": "Abrir Prisma Studio"
}- ✅ Clean Architecture - Separação em camadas
- ✅ Repository Pattern - Abstração de acesso a dados
- ✅ Dependency Injection - Inversão de dependências
- ✅ DTOs - Data Transfer Objects
- ✅ Validation Layer - Validação em middleware
- ✅ Error Handling - Tratamento centralizado
- ✅ Type Safety - TypeScript strict mode
- ✅ Path Aliases - Imports organizados (@/)
NODE_ENV=production
PORT=3333
CORS_ORIGIN=https://seu-frontend.com
DATABASE_URL=postgresql://user:password@host:5432/databasenpm run build
npm start- Fork o projeto
- Crie uma branch (
git checkout -b feat/nova-feature) - Commit suas mudanças (
git commit -m 'feat: adiciona nova feature') - Push para a branch (
git push origin feat/nova-feature) - Abra um Pull Request
Usamos Conventional Commits:
feat:Nova funcionalidadefix:Correção de bugdocs:Documentaçãotest:Testesrefactor:Refatoraçãochore:Tarefas de manutenção
Este projeto está sob a licença MIT.
Bruno Miho - Full Stack Developer
Projeto desenvolvido como desafio de aprendizado, aplicando conceitos modernos de desenvolvimento backend com TypeScript e Node.js.
⭐ Se este projeto te ajudou, considere dar uma estrela!