Esta documentação define os endpoints, modelos de dados e rotas para a API da plataforma.
/api/auth)
Rotas para registro, login e gerenciamento de sessão. A autenticação será baseada em JWT (JSON Web Token).
POST /api/auth/register
Descrição: Registra um novo usuário. É um alias para
POST /api/users, mas focado no fluxo de autenticação.
Corpo da Requisição: User Model (sem id,
role padrão “client” ou “freelancer”).
Resposta de Sucesso (201): { user, token }
POST /api/auth/login
Descrição: Autentica um usuário e retorna um token de acesso.
Corpo da Requisição:
{ "email": "user@email.com", "password": "123" }
Resposta de Sucesso (200):
{ "token": "jwt_token_aqui" }
/api/users)Rotas para gerenciar informações dos usuários. A maioria das ações aqui exige autenticação e, em alguns casos, permissão de administrador.
GET /api/users -> Lista todos os
usuários. (Requer permissão de Admin)
GET /api/users/me -> Retorna os
dados do usuário autenticado (usando o token).
GET /api/users/:id -> Retorna um
usuário específico.
POST /api/users -> Cria um novo
usuário. (O mesmo que auth/register)
PUT /api/users/:id -> Modifica um
usuário. (Usuário só pode modificar a si mesmo, ou admin pode
modificar qualquer um).
DELETE /api/users/:id -> Deleta um
usuário. (Usuário só pode deletar a si mesmo, ou admin pode deletar
qualquer um).
{
"id": "uuid-gerado-automaticamente",
"role": "freelancer", // "client" || "admin"
"email": "user@email.com", // Adicionado para login
"username": "cool-user",
"passwordHash": "hash_da_senha_com_bcrypt", // NUNCA armazene a senha em texto plano
"name": "João Silva",
"avatarUrl": "https://url-da-imagem.com/avatar.png",
"createdAt": "2025-09-15T18:00:00Z", // Adicionado
"updatedAt": "2025-09-15T18:00:00Z" // Adicionado
}
/api/profiles)Rotas para os detalhes do perfil, que são mais extensos que o modelo de usuário. Um perfil é criado automaticamente com o usuário.
GET /api/profiles/:userId ->
Retorna o perfil detalhado de um usuário.
PUT /api/profiles/:userId ->
Atualiza o perfil de um usuário. (Apenas o próprio usuário pode
fazer isso).
{
"userId": "uuid-do-usuario-vinculado",
"title": "Desenvolvedor Web Sênior | React & Node.js", // Título profissional
"bio": "10 anos de experiência em desenvolvimento de aplicações web de alta performance...",
"skills": ["React", "Node.js", "TypeScript", "PostgreSQL", "Docker"], // Array de strings
"portfolio": [
// Array de projetos no portfólio
{
"title": "E-commerce de Roupas",
"description": "Desenvolvimento completo do front-end e back-end.",
"url": "https://link-do-projeto.com"
}
],
"hourlyRate": 150, // Valor/hora em R$ (BRL)
"country": "Brasil",
"city": "Blumenau"
}
/api/projects)
Rotas para criar e gerenciar projetos postados por clientes.
GET /api/projects -> Lista todos os
projetos (pode ter filtros, ex:
/api/projects?status=open&skill=React).
GET /api/projects/:id -> Retorna um
projeto específico.
POST /api/projects -> Cria um novo
projeto. (Requer autenticação como “client”).
PUT /api/projects/:id -> Modifica
um projeto. (Apenas o criador do projeto pode modificar).
DELETE /api/projects/:id -> Deleta
um projeto. (Apenas o criador do projeto pode deletar).
{
"id": "uuid-gerado-automaticamente",
"clientId": "uuid-do-usuario-cliente", // Renomeado para clareza
"freelancerId": null, // Preenchido quando uma proposta é aceita
"title": "Desenvolvimento de Landing Page",
"description": "Preciso de uma landing page responsiva com React e formulário de contato...", // Pode ser string longa ou markdown
"budget": 1500, // Orçamento em R$ (BRL)
"deadline": "2025-10-30T23:59:59Z", // Prazo final
"skillsRequired": ["React", "HTML5", "CSS3", "UI/UX Design"],
"status": "open", // "open", "in_progress", "completed", "cancelled"
"createdAt": "2025-09-15T18:30:00Z",
"updatedAt": "2025-09-15T18:30:00Z"
}
/api/proposals)
Rotas para que freelancers enviem propostas para projetos. As rotas são aninhadas dentro dos projetos para uma melhor organização.
GET /api/projects/:projectId/proposals
-> Lista todas as propostas para um projeto. (Apenas o dono do
projeto pode ver).
POST /api/projects/:projectId/proposals
-> Envia uma nova proposta para um projeto. (Requer autenticação
como “freelancer”).
PUT /api/proposals/:proposalId ->
Modifica uma proposta. (Freelancer pode editar, cliente pode
aceitar/recusar).
DELETE /api/proposals/:proposalId
-> Deleta (retira) uma proposta. (Apenas o freelancer que a criou
pode deletar).
{
"id": "uuid-gerado-automaticamente",
"projectId": "uuid-do-projeto",
"freelancerId": "uuid-do-freelancer",
"coverLetter": "Olá, tenho vasta experiência com React e posso entregar sua landing page em 10 dias...",
"proposedPrice": 1400, // Valor proposto pelo freelancer
"estimatedDays": 10, // Prazo estimado pelo freelancer
"status": "pending", // "pending", "accepted", "rejected"
"createdAt": "2025-09-16T09:00:00Z"
}
/api/reviews)
Rotas para permitir que clientes e freelancers se avaliem após a conclusão de um projeto.
POST /api/projects/:projectId/reviews
-> Cria uma nova avaliação para um projeto concluído.
GET /api/users/:userId/reviews ->
Lista todas as avaliações recebidas por um usuário.
{
"id": "uuid-gerado-automaticamente",
"projectId": "uuid-do-projeto-concluido",
"reviewerId": "uuid-de-quem-avalia", // Pode ser o cliente ou o freelancer
"revieweeId": "uuid-de-quem-e-avaliado", // Pode ser o freelancer ou o cliente
"rating": 5, // Nota de 1 a 5
"comment": "Ótimo trabalho! Entregou antes do prazo e com muita qualidade.",
"createdAt": "2025-11-10T14:00:00Z"
}
Você tem toda a razão! Peço desculpas, a parte de mensagens é absolutamente crucial.
Aqui está a seção que faltava, completando a especificação da API com o sistema de chat.
/api/conversations e
/api/messages)
Rotas para gerenciar a comunicação direta entre usuários. A estrutura é baseada em “Conversas” (ou chats), que contêm as “Mensagens”. Uma conversa é tipicamente iniciada entre um cliente e um freelancer dentro do contexto de um projeto.
POST /api/conversations
Descrição: Inicia uma nova conversa com outro usuário, geralmente associada a um projeto. O sistema deve verificar se já existe uma conversa entre esses usuários para o mesmo projeto antes de criar uma nova.
Corpo da Requisição:
{ "recipientId": "uuid-do-destinatario", "projectId":
"uuid-do-projeto-opcional" }
Resposta de Sucesso (201):
Conversation Model
GET /api/conversations
Descrição: Retorna todas as conversas do usuário autenticado. Ideal para a página de “Caixa de Entrada”.
Resposta de Sucesso (200):
[Conversation Model] (uma lista de conversas)
GET /api/conversations/:conversationId/messages
Descrição: Busca todas as mensagens de uma conversa
específica. Deve incluir paginação para carregar o histórico sob
demanda (ex: ?page=1&limit=50).
Resposta de Sucesso (200):
{ messages: [Message Model], totalPages: 5 }
POST /api/conversations/:conversationId/messages
Descrição: Envia uma nova mensagem em uma conversa
existente. O senderId é identificado pelo token de
autenticação.
Corpo da Requisição:
{ "content": "Olá, gostaria de saber mais sobre o projeto."
}
Resposta de Sucesso (201):
Message Model (a mensagem recém-criada)
{
"id": "uuid-gerado-automaticamente",
"projectId": "uuid-do-projeto-relacionado",
"participants": ["uuid-do-usuario-1", "uuid-do-usuario-2"],
"lastMessage": {
"content": "Ok, combinado! Começo amanhã.",
"senderId": "uuid-do-usuario-1",
"timestamp": "2025-09-18T10:30:00Z"
},
"createdAt": "2025-09-17T14:20:00Z",
"updatedAt": "2025-09-18T10:30:00Z"
}
{
"id": "uuid-gerado-automaticamente",
"conversationId": "uuid-da-conversa-pai",
"senderId": "uuid-de-quem-enviou",
"content": "Claro, podemos discutir os detalhes. Qual o melhor horário para você?",
"isRead": false,
"createdAt": "2025-09-17T14:25:10Z"
}
Nota Importante sobre Real-Time:
Enquanto a API REST é excelente para criar conversas e buscar o histórico, a entrega de mensagens em tempo real (a experiência de “chat”) deve ser implementada com WebSockets (usando bibliotecas como Socket.IO ou um serviço como Pusher). O fluxo seria:
- O usuário envia uma mensagem via
POST /api/.../messages.- O servidor salva a mensagem no banco de dados.
- O servidor emite um evento via WebSocket para o destinatário com os dados da nova mensagem.
- O frontend do destinatário recebe esse evento e exibe a mensagem instantaneamente, sem precisar fazer uma nova requisição GET.