Skip to main content

API de Usuários

A API de Usuários do FitLocus fornece endpoints para gerenciamento de contas de usuário, autenticação, perfis e preferências.

Visão Geral

A API de Usuários permite:

  • Registro e autenticação de usuários
  • Gerenciamento de perfis de usuário
  • Recuperação e atualização de informações pessoais
  • Gerenciamento de preferências e configurações
  • Consulta de métricas e estatísticas de usuário

Tipos de Usuário

O FitLocus possui dois tipos principais de usuário:
public enum EnumUserType {
    ALUNO,    // Estudante/cliente
    PERSONAL  // Personal trainer
}
Cada tipo de usuário tem acesso a diferentes funcionalidades e endpoints, conforme detalhado na documentação de tipos de usuário.

Modelo de Dados

UserDTO

O objeto UserDTO é utilizado para transferência de dados de usuário entre o cliente e o servidor:
{
  "id": 123,
  "name": "Nome Completo",
  "email": "[email protected]",
  "userType": "ALUNO",
  "profilePicture": "https://storage.googleapis.com/fitlocus-app-50458.appspot.com/profile/123.jpg",
  "phone": "+5511999999999",
  "birthDate": "1990-01-01",
  "gender": "MASCULINO",
  "height": 175,
  "weight": 70.5,
  "subscriptionType": "PREMIUM_MENSAL",
  "subscriptionExpirationDate": "2023-12-31T23:59:59Z",
  "createdAt": "2023-01-01T10:00:00Z",
  "updatedAt": "2023-01-15T14:30:00Z"
}

RegisterRequest

Objeto utilizado para registro de novos usuários:
{
  "name": "Nome Completo",
  "email": "[email protected]",
  "password": "senha123",
  "userType": "ALUNO",
  "requestLocation": "APP",
  "confirmed": true
}

LoginRequest

Objeto utilizado para autenticação de usuários:
{
  "email": "[email protected]",
  "password": "senha123"
}

AuthResponse

Resposta retornada após autenticação bem-sucedida:
{
  "user": {
    "id": 123,
    "name": "Nome Completo",
    "email": "[email protected]",
    "userType": "ALUNO",
    // outros campos do UserDTO
  },
  "token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...",
  "userId": 123,
  "success": true
}

Endpoints Principais

MétodoEndpointDescrição
POST/users/registerRegistra um novo usuário
POST/users/loginAutentica um usuário existente
POST/users/firebase-loginAutentica usando token do Firebase
GET/users/profileObtém o perfil do usuário autenticado
PUT/users/profileAtualiza o perfil do usuário autenticado
GET/users/{id}Obtém informações de um usuário específico
PUT/users/{id}Atualiza informações de um usuário específico
DELETE/users/{id}Remove um usuário
POST/users/refresh-tokenRenova o token JWT
POST/users/logoutRealiza logout (invalida o token)
POST/users/forgot-passwordInicia o processo de recuperação de senha
POST/users/reset-passwordRedefine a senha com token de recuperação
GET/users/metricsObtém métricas do usuário autenticado

Detalhes de Implementação

Autenticação

Todos os endpoints, exceto /users/register, /users/login, /users/firebase-login, /users/forgot-password e /users/reset-password, requerem autenticação via token JWT no cabeçalho Authorization:
Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...
Para mais detalhes sobre autenticação, consulte a documentação de autenticação.

Controle de Acesso

O acesso aos endpoints é controlado com base no tipo de usuário:
@PreAuthorize("hasRole('PERSONAL')")
@GetMapping("/students")
public ResponseEntity<List<UserDTO>> getStudents() {
    // Implementação...
}
Alguns endpoints, como /users/{id}, implementam verificações adicionais para garantir que um usuário só possa acessar seus próprios dados ou dados de usuários relacionados (no caso de personal trainers e seus alunos).

Validação de Dados

Todos os endpoints que recebem dados do cliente implementam validação rigorosa:
@PostMapping("/register")
public ResponseEntity<AuthResponse> register(@Valid @RequestBody RegisterRequest request) {
    // Implementação...
}
A anotação @Valid ativa a validação baseada em anotações como @NotNull, @Email, @Size, etc., definidas no objeto RegisterRequest.

Exemplos de Uso

Registro de Usuário

curl -X POST \
  'http://localhost:8080/api/users/register' \
  -H 'Content-Type: application/json' \
  -d '{
    "name": "João Silva",
    "email": "[email protected]",
    "password": "senha123",
    "userType": "ALUNO",
    "requestLocation": "APP",
    "confirmed": true
  }'

Login

curl -X POST \
  'http://localhost:8080/api/users/login' \
  -H 'Content-Type: application/json' \
  -d '{
    "email": "[email protected]",
    "password": "senha123"
  }'

Obter Perfil

curl -X GET \
  'http://localhost:8080/api/users/profile' \
  -H 'Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...'

Atualizar Perfil

curl -X PUT \
  'http://localhost:8080/api/users/profile' \
  -H 'Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...' \
  -H 'Content-Type: application/json' \
  -d '{
    "name": "João Silva",
    "phone": "+5511999999999",
    "birthDate": "1990-01-01",
    "gender": "MASCULINO",
    "height": 175,
    "weight": 70.5
  }'

Códigos de Status

CódigoDescrição
200OK - A requisição foi bem-sucedida
201Created - Um novo usuário foi criado com sucesso
400Bad Request - A requisição contém dados inválidos
401Unauthorized - Autenticação necessária
403Forbidden - Sem permissão para acessar o recurso
404Not Found - Usuário não encontrado
409Conflict - Email já registrado
500Internal Server Error - Erro interno do servidor

Considerações de Segurança

  1. Senhas: As senhas são armazenadas utilizando o algoritmo BCrypt para hash seguro.
  2. Dados Sensíveis: Informações sensíveis como senha nunca são retornadas nas respostas da API.
  3. Rate Limiting: A API implementa limitação de taxa para prevenir ataques de força bruta.
  4. Validação: Todos os dados de entrada são validados rigorosamente para prevenir injeção de dados maliciosos.
  5. HTTPS: Todas as comunicações com a API devem ser realizadas através de HTTPS.

Próximos Passos

Para mais detalhes sobre endpoints específicos, consulte: