Files
todolist-fullstack/backend-api/API.md

8.3 KiB

🔐 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)

POST /auth/signup
Content-Type: application/json

{
  "email": "user@example.com",
  "password": "securepassword123",
  "name": "João Silva"
}

Response (201 Created):

{
  "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

POST /auth/login
Content-Type: application/json

{
  "email": "user@example.com",
  "password": "securepassword123"
}

Response (200 OK):

{
  "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

POST /auth/logout
Authorization: Bearer {token}

Response (200 OK):

{
  "message": "Logout realizado com sucesso"
}

Erros:

  • 401 Unauthorized - Token inválido ou expirado

1.4 Obter Perfil Atual

GET /auth/me
Authorization: Bearer {token}

Response (200 OK):

{
  "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

POST /auth/forgot-password
Content-Type: application/json

{
  "email": "user@example.com"
}

Response (200 OK):

{
  "message": "Email de recuperação enviado. Verifique sua caixa de entrada."
}

2. Tarefas (Tasks)

2.1 Criar Tarefa

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):

{
  "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

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):

{
  "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

GET /tasks/:id
Authorization: Bearer {token}

Response (200 OK):

{
  "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

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):

{
  "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

DELETE /tasks/:id
Authorization: Bearer {token}

Response (200 OK):

{
  "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

GET /tasks/stats
Authorization: Bearer {token}

Response (200 OK):

{
  "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

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

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

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)

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


API Status: Pronta para Desenvolvimento
Última Atualização: 1 de dezembro de 2025