Uma API REST robusta para gerenciamento de tarefas (Todo List) construída com NestJS, implementando autenticação JWT, CRUD completo e arquitetura limpa.
Este projeto implementa arquiteturas híbridas intencionalmente:
- Auth/User Modules: Seguem Clean Architecture com separação core/infrastructure
- Todo Module: Utiliza MVC tradicional do NestJS para simplicidade
O sistema de autenticação foi reutilizado de outro serviço (clean architecture) enquanto o módulo TODO foi desenvolvido especificamente para este desafio usando MVC comum. Esta abordagem demonstra flexibilidade arquitetural baseada no contexto e complexidade de cada domínio.
# Clonar repositório
git clone git@github.com:244Walyson/TODO-List.git take-home
cd take-home
# Subir aplicação com Docker
docker compose up --build -d
Aplicação estara disponivel em http://localhost:5173 Backend disponivel em http://localhost:3000
- Backend: NestJS + TypeScript
- Banco de Dados: PostgreSQL (Neon Cloud + Docker para desenvolvimento)
- ORM: Prisma
- Autenticação: JWT + OAuth2 (Google/GitHub)
- Containerização: Docker & Docker Compose
- Testes: Jest
- Validação: class-validator
- Login com email/senha
- Refresh tokens
- OAuth2 com Google e GitHub
- Recuperação de senha via email
- Middleware de autenticação JWT
- CRUD Completo: Criar, listar, atualizar e deletar tarefas
- Toggle Status: Marcar/desmarcar como concluída
- Filtros: Por usuário e sessão
- Validação: DTOs com validação automática
- Criação de usuários
- Atualização de perfil
- Busca paginada
- Hash seguro de senhas
backend/
├── src/
│ ├── auth/ # Clean Architecture (reutilizado)
│ │ ├── core/ # Domínio: entities, use-cases, interfaces
│ │ └── infrastructure/ # Framework: controllers, DTOs, repositories
│ ├── user/ # Clean Architecture (reutilizado)
│ │ ├── core/ # Domínio: entities, use-cases, interfaces
│ │ └── infrastructure/ # Framework: controllers, DTOs, repositories
│ ├── todo/ # MVC Tradicional (desenvolvido para o desafio)
│ │ ├── controllers/ # Rotas e validação HTTP
│ │ ├── service/ # Lógica de negócio
│ │ ├── repository/ # Acesso a dados
│ │ └── dtos/ # Validação de entrada
│ └── utils/ # Utilitários compartilhados
├── prisma/ # Schema e migrações
└── docker-compose.yml # Configuração Docker
POST /auth/token # Login com credenciais
POST /auth/refresh-token # Renovar access token
POST /auth/recover-password/token/:email # Solicitar recuperação de senha
POST /auth/reset-password # Redefinir senha
POST /auth/redirect/google # Login OAuth2 Google
POST /auth/redirect/github # Login OAuth2 GitHubPOST /users # Criar usuário
GET /users # Listar usuários (paginado)
GET /users/:id # Buscar usuário por ID
PUT /users/:id # Atualizar usuárioPOST /tasks # Criar tarefa
GET /tasks # Listar tarefas do usuário
GET /tasks/:id # Buscar tarefa específica
PATCH /tasks/:id # Atualizar tarefa
PATCH /tasks/:id/toggle # Alternar status de conclusão
DELETE /tasks/:id # Deletar tarefa- Node.js 18+
- Docker & Docker Compose
- Git
# Clonar repositório
git clone <repository-url>
cd backend
# Configurar variáveis de ambiente
cp .env.example .env
# Subir aplicação com Docker
docker-compose up -d
# Executar migrações (se necessário)
docker-compose exec app npx prisma migrate dev# Instalar dependências
npm install
# Configurar banco de dados no .env
# DATABASE_URL="postgresql://user:password@localhost:5432/todoapi"
# Executar migrações
npx prisma migrate dev
# Iniciar em modo desenvolvimento
npm run start:dev- API Base: http://localhost:3000
- Health Check: http://localhost:3000/health
- Documentação: Endpoints listados acima
Crie um arquivo .env na raiz do projeto:
# Database
DATABASE_URL="postgresql://user:password@localhost:5432/todoapi"
# JWT
JWT_SECRET="your-super-secret-jwt-key"
JWT_EXPIRES_IN="1h"
REFRESH_TOKEN_SECRET="your-refresh-token-secret"
REFRESH_TOKEN_EXPIRES_IN="7d"
# OAuth2 Google
GOOGLE_CLIENT_ID="your-google-client-id"
GOOGLE_CLIENT_SECRET="your-google-client-secret"
# OAuth2 GitHub
GITHUB_CLIENT_ID="your-github-client-id"
GITHUB_CLIENT_SECRET="your-github-client-secret"
# Email Service
SMTP_HOST="smtp.gmail.com"
SMTP_PORT=587
SMTP_USER="your-email@gmail.com"
SMTP_PASSWORD="your-app-password"# Testes unitários
npm run test
# Testes e2e
npm run test:e2e
# Coverage
npm run test:covcurl -X POST http://localhost:3000/users \
-H "Content-Type: application/json" \
-d '{
"name": "João Silva",
"username": "João Silva"
"email": "joao@email.com",
"password": "123456"
}'curl -X POST http://localhost:3000/auth/token \
-H "Content-Type: application/json" \
-d '{
"email": "joao@email.com",
"password": "123456"
}'curl -X POST http://localhost:3000/tasks \
-H "Content-Type: application/json" \
-H "Authorization: Bearer YOUR_JWT_TOKEN" \
-d '{
"title": "Estudar NestJS",
"description": "Completar tutorial de NestJS",
"completed": false
}'- Senhas criptografadas com bcrypt
- JWT tokens com expiração configurável
- Refresh tokens para renovação segura
- Middleware de autenticação global
- Validação de entrada com class-validator
- CORS configurado adequadamente
O projeto inclui configuração completa do Docker:
- Dockerfile: Imagem otimizada da aplicação
- docker-compose.yml: Orquestração com PostgreSQL
- Multi-stage build: Build otimizado para produção
- ✅ API REST funcional com NestJS
- ✅ CRUD completo de tarefas
- ✅ Sistema de autenticação JWT
- ✅ Integração com banco PostgreSQL
- ✅ Validação de dados
- ✅ Tratamento de erros
- ✅ Documentação completa
- ✅ Docker support
- ✅ Testes unitários
- ✅ Clean code e arquitetura
A aplicação está preparada para deploy em:
- Heroku: Dockerfile + PostgreSQL addon
- Railway: Configuração automática
- DigitalOcean: Docker droplet
- AWS: ECS + RDS
- Vercel: Integração com Neon PostgreSQL
Para dúvidas ou problemas:
- Verifique os logs:
docker-compose logs app - Health check:
curl http://localhost:3000/health - Prisma studio:
npx prisma studio
Desenvolvido como desafio take-home - Demonstração de habilidades em NestJS, PostgreSQL, Docker e Clean Architecture 🎯