# 🔐 TASK MANAGER - API Backend Documentation ## 📌 Base URL ``` http://localhost:3000/api ``` ## 🔑 Autenticação Todas as requisições protegidas devem incluir o header: ``` Authorization: Bearer {token} ``` --- ## 📋 Endpoints da API ### 1. Autenticação (Auth) #### 1.1 Registrar (Signup) ```http POST /auth/signup Content-Type: application/json { "email": "user@example.com", "password": "securepassword123", "name": "João Silva" } ``` **Response (201 Created):** ```json { "access_token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...", "user": { "id": "550e8400-e29b-41d4-a716-446655440000", "email": "user@example.com", "email_confirmed_at": "2025-12-01T10:00:00Z" } } ``` **Erros:** - `400 Bad Request` - Dados inválidos - `409 Conflict` - Email já registrado --- #### 1.2 Login ```http POST /auth/login Content-Type: application/json { "email": "user@example.com", "password": "securepassword123" } ``` **Response (200 OK):** ```json { "access_token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...", "user": { "id": "550e8400-e29b-41d4-a716-446655440000", "email": "user@example.com", "email_confirmed_at": "2025-12-01T10:00:00Z" } } ``` **Erros:** - `401 Unauthorized` - Email ou senha incorretos - `400 Bad Request` - Dados inválidos --- #### 1.3 Logout ```http POST /auth/logout Authorization: Bearer {token} ``` **Response (200 OK):** ```json { "message": "Logout realizado com sucesso" } ``` **Erros:** - `401 Unauthorized` - Token inválido ou expirado --- #### 1.4 Obter Perfil Atual ```http GET /auth/me Authorization: Bearer {token} ``` **Response (200 OK):** ```json { "userId": "550e8400-e29b-41d4-a716-446655440000", "email": "user@example.com", "iat": 1701427200, "exp": 1702032000 } ``` **Erros:** - `401 Unauthorized` - Token inválido ou expirado --- #### 1.5 Recuperar Senha ```http POST /auth/forgot-password Content-Type: application/json { "email": "user@example.com" } ``` **Response (200 OK):** ```json { "message": "Email de recuperação enviado. Verifique sua caixa de entrada." } ``` --- ### 2. Tarefas (Tasks) #### 2.1 Criar Tarefa ```http POST /tasks Authorization: Bearer {token} Content-Type: application/json { "title": "Fazer compras", "description": "Ir ao supermercado", "dueDate": "2025-12-25T00:00:00Z", "category": "compras", "priority": "high", "completed": false } ``` **Response (201 Created):** ```json { "success": true, "message": "Tarefa criada com sucesso", "data": { "id": "6b1f2c3d-4e5f-6a7b-8c9d-0e1f2a3b4c5d", "user_id": "550e8400-e29b-41d4-a716-446655440000", "title": "Fazer compras", "description": "Ir ao supermercado", "completed": false, "due_date": "2025-12-25T00:00:00Z", "category": "compras", "priority": "high", "created_at": "2025-12-01T10:00:00Z", "updated_at": "2025-12-01T10:00:00Z" } } ``` **Validações:** - `title`: Obrigatório, mínimo 3 caracteres, máximo 255 - `description`: Opcional, máximo 2000 caracteres - `priority`: low | medium (default) | high - `dueDate`, `category`: Opcionais **Erros:** - `400 Bad Request` - Validação falhou - `401 Unauthorized` - Token inválido --- #### 2.2 Listar Tarefas ```http GET /tasks Authorization: Bearer {token} # Query params opcionais: ?completed=true|false ?category=compras ?priority=low|medium|high ?sortBy=created_at|due_date|priority ?order=asc|desc ``` **Response (200 OK):** ```json { "success": true, "message": "Tarefas recuperadas com sucesso", "count": 5, "data": [ { "id": "6b1f2c3d-4e5f-6a7b-8c9d-0e1f2a3b4c5d", "user_id": "550e8400-e29b-41d4-a716-446655440000", "title": "Fazer compras", "description": "Ir ao supermercado", "completed": false, "due_date": "2025-12-25T00:00:00Z", "category": "compras", "priority": "high", "created_at": "2025-12-01T10:00:00Z", "updated_at": "2025-12-01T10:00:00Z" } ] } ``` **Query Exemplos:** - `GET /tasks?completed=false` - Tarefas pendentes - `GET /tasks?priority=high&sortBy=due_date` - Prioridade alta, ordenadas por vencimento - `GET /tasks?category=trabalho&order=asc` - Categoria trabalho, ordem ascendente **Erros:** - `400 Bad Request` - Query inválida - `401 Unauthorized` - Token inválido --- #### 2.3 Obter Tarefa Específica ```http GET /tasks/:id Authorization: Bearer {token} ``` **Response (200 OK):** ```json { "success": true, "message": "Tarefa recuperada com sucesso", "data": { "id": "6b1f2c3d-4e5f-6a7b-8c9d-0e1f2a3b4c5d", "user_id": "550e8400-e29b-41d4-a716-446655440000", "title": "Fazer compras", "description": "Ir ao supermercado", "completed": false, "due_date": "2025-12-25T00:00:00Z", "category": "compras", "priority": "high", "created_at": "2025-12-01T10:00:00Z", "updated_at": "2025-12-01T10:00:00Z" } } ``` **Erros:** - `404 Not Found` - Tarefa não encontrada ou não pertence ao usuário - `401 Unauthorized` - Token inválido --- #### 2.4 Atualizar Tarefa ```http PATCH /tasks/:id Authorization: Bearer {token} Content-Type: application/json { "title": "Fazer compras (atualizado)", "description": "Ir ao supermercado e padaria", "completed": true, "dueDate": "2025-12-20T00:00:00Z", "priority": "medium" } ``` **Response (200 OK):** ```json { "success": true, "message": "Tarefa atualizada com sucesso", "data": { "id": "6b1f2c3d-4e5f-6a7b-8c9d-0e1f2a3b4c5d", "user_id": "550e8400-e29b-41d4-a716-446655440000", "title": "Fazer compras (atualizado)", "description": "Ir ao supermercado e padaria", "completed": true, "due_date": "2025-12-20T00:00:00Z", "category": "compras", "priority": "medium", "created_at": "2025-12-01T10:00:00Z", "updated_at": "2025-12-01T10:30:00Z" } } ``` **Campos opcionais:** - Todos os campos de CreateTaskDto são opcionais em PATCH **Erros:** - `404 Not Found` - Tarefa não encontrada - `400 Bad Request` - Dados inválidos - `401 Unauthorized` - Token inválido --- #### 2.5 Deletar Tarefa ```http DELETE /tasks/:id Authorization: Bearer {token} ``` **Response (200 OK):** ```json { "success": true, "message": "Tarefa deletada com sucesso" } ``` **Erros:** - `404 Not Found` - Tarefa não encontrada - `401 Unauthorized` - Token inválido --- #### 2.6 Obter Estatísticas ```http GET /tasks/stats Authorization: Bearer {token} ``` **Response (200 OK):** ```json { "success": true, "message": "Estatísticas recuperadas com sucesso", "data": { "total": 10, "completed": 6, "pending": 4, "completionPercentage": 60 } } ``` **Erros:** - `401 Unauthorized` - Token inválido --- ## 🔄 Real-time (WebSocket) ### Conectar ao Realtime ```javascript const subscription = supabase .channel('tasks') .on('postgres_changes', { event: '*', schema: 'public', table: 'tasks' }, (payload) => console.log(payload) ) .subscribe(); ``` ### Eventos - `INSERT` - Nova tarefa criada - `UPDATE` - Tarefa atualizada - `DELETE` - Tarefa deletada --- ## ⚠️ Códigos de Erro | Código | Significado | |--------|-------------| | `200` | OK - Requisição bem-sucedida | | `201` | Created - Recurso criado | | `400` | Bad Request - Dados inválidos | | `401` | Unauthorized - Token inválido/expirado | | `404` | Not Found - Recurso não encontrado | | `409` | Conflict - Recurso já existe | | `500` | Internal Server Error - Erro do servidor | --- ## 🛠️ Exemplo Completo (cURL) ### 1. Registrar ```bash curl -X POST http://localhost:3000/api/auth/signup \ -H "Content-Type: application/json" \ -d '{ "email": "user@example.com", "password": "securepassword123", "name": "João" }' ``` ### 2. Login ```bash curl -X POST http://localhost:3000/api/auth/login \ -H "Content-Type: application/json" \ -d '{ "email": "user@example.com", "password": "securepassword123" }' ``` ### 3. Criar Tarefa (com token) ```bash curl -X POST http://localhost:3000/api/tasks \ -H "Content-Type: application/json" \ -H "Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9..." \ -d '{ "title": "Fazer compras", "description": "Ir ao supermercado" }' ``` --- ## 📚 Referências - **Supabase Docs**: https://supabase.com/docs - **NestJS Docs**: https://docs.nestjs.com - **JWT**: https://jwt.io --- **API Status**: ✅ Pronta para Desenvolvimento **Última Atualização**: 1 de dezembro de 2025