API REST desenvolvida em Spring Boot para gerenciamento de uma barbearia, incluindo clientes, barbeiros, serviços e autenticação.
- Java 17
- Spring Boot 3.5.6
- Spring Data JPA
- Spring Security
- JWT (JSON Web Tokens)
- PostgreSQL (produção)
- H2 Database (desenvolvimento)
- Lombok
- SendGrid (envio de emails)
- Maven
A API está disponível em:
Base URL: https://barbearia-backend-x0st.onrender.com
Todos os endpoints documentados abaixo devem ser acessados usando esta URL base.
Base URL: /api/admin/auth
POST /api/admin/auth/login
Content-Type: application/json
{
"username": "login",
"password": "password"
}Resposta de Sucesso (200):
{
"token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9..."
}Resposta de Erro (401):
"Usuário ou senha inválidos"Base URL: /api/cliente/auth
Envia um código OTP para o email do cliente.
POST /api/cliente/auth/gerarOtp
Content-Type: application/json
{
"email": "cliente@email.com"
}Resposta de Sucesso (200):
"OTP enviado para o email."Valida o código OTP e retorna um token de autenticação.
POST /api/cliente/auth/validarOtp
Content-Type: application/json
{
"email": "cliente@email.com",
"otp": "123456"
}Resposta de Sucesso (200):
{
"token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...",
"valid": true
}Base URL: /api/cliente
POST /api/cliente/criarCliente
Content-Type: application/json
{
"nome": "João Silva",
"email": "joao@email.com",
"telefone": "(99) 99999-9999"
}Resposta de Sucesso (201):
{
"statusCode": "201",
"statusMsg": "Cliente criado com sucesso"
}GET /api/cliente/buscarCliente?email=joao@email.comResposta de Sucesso (200):
{
"nome": "João Silva",
"email": "joao@email.com",
"telefone": "(99) 99999-9999"
}GET /api/cliente/buscarTodosClientesResposta de Sucesso (200):
[
{
"nome": "João Silva",
"email": "joao@email.com",
"telefone": "(99) 99999-9999"
},
{
"nome": "Maria Santos",
"email": "maria@email.com",
"telefone": "(99) 88888-8888"
}
]PUT /api/cliente/atualizarCliente
Content-Type: application/json
{
"nome": "João Silva Atualizado",
"email": "joao@email.com",
"telefone": "(99) 99999-9999"
}Resposta de Sucesso (200):
{
"statusCode": "200",
"statusMsg": "Requisição processada com sucesso"
}Resposta de Erro (417):
{
"statusCode": "417",
"statusMsg": "Falha na atualização. Por favor, tente novamente ou contate o suporte"
}DELETE /api/cliente/deletarCliente?email=joao@email.comResposta de Sucesso (200):
{
"statusCode": "200",
"statusMsg": "Requisição processada com sucesso"
}Resposta de Erro (417):
{
"statusCode": "417",
"statusMsg": "Falha ao deletar. Por favor, tente novamente ou contate o suporte"
}Base URL: /api/barbeiro
POST /api/barbeiro/criarBarbeiro
Content-Type: application/json
{
"nome": "Carlos Barbeiro",
"email": "carlos@barbearia.com",
"telefone": "(99) 77777-7777",
"especialidade": "Corte e Barba"
}Resposta de Sucesso (201):
{
"statusCode": "201",
"statusMsg": "Barbeiro criado com sucesso"
}GET /api/barbeiro/buscarBarbeiro?email=carlos@barbearia.comResposta de Sucesso (200):
{
"nome": "Carlos Barbeiro",
"email": "carlos@barbearia.com",
"telefone": "(99) 77777-7777",
"especialidade": "Corte e Barba"
}GET /api/barbeiro/buscarTodosBarbeirosResposta de Sucesso (200):
[
{
"nome": "Carlos Barbeiro",
"email": "carlos@barbearia.com",
"telefone": "(99) 77777-7777",
"especialidade": "Corte e Barba"
}
]PUT /api/barbeiro/atualizarBarbeiro
Content-Type: application/json
{
"nome": "Carlos Barbeiro Atualizado",
"email": "carlos@barbearia.com",
"telefone": "(99) 77777-7777",
"especialidade": "Corte, Barba e Pigmentação"
}Resposta de Sucesso (200):
{
"statusCode": "200",
"statusMsg": "Requisição processada com sucesso"
}Resposta de Erro (417):
{
"statusCode": "417",
"statusMsg": "Falha na atualização. Por favor, tente novamente ou contate o suporte"
}DELETE /api/barbeiro/deletarBarbeiro?email=carlos@barbearia.comResposta de Sucesso (200):
{
"statusCode": "200",
"statusMsg": "Requisição processada com sucesso"
}Resposta de Erro (417):
{
"statusCode": "417",
"statusMsg": "Falha ao deletar. Por favor, tente novamente ou contate o suporte"
}Base URL: /api/servico
POST /api/servico/criarServico
Content-Type: application/json
{
"nome": "Corte Masculino",
"descricao": "Corte de cabelo masculino tradicional",
"preco": 35.00,
"duracao": 30
}Resposta de Sucesso (201):
{
"statusCode": "201",
"statusMsg": "Serviço criado com sucesso"
}GET /api/servico/buscarServico?servicoId=1Resposta de Sucesso (200):
{
"id": 1,
"nome": "Corte Masculino",
"descricao": "Corte de cabelo masculino tradicional",
"preco": 35.00,
"duracao": 30
}GET /api/servico/buscarTodosServicosResposta de Sucesso (200):
[
{
"id": 1,
"nome": "Corte Masculino",
"descricao": "Corte de cabelo masculino tradicional",
"preco": 35.00,
"duracao": 30
},
{
"id": 2,
"nome": "Barba",
"descricao": "Aparar e modelar barba",
"preco": 25.00,
"duracao": 20
}
]PUT /api/servico/atualizarServico
Content-Type: application/json
{
"id": 1,
"nome": "Corte Masculino Premium",
"descricao": "Corte de cabelo masculino com acabamento premium",
"preco": 45.00,
"duracao": 40
}Resposta de Sucesso (200):
{
"statusCode": "200",
"statusMsg": "Requisição processada com sucesso"
}Resposta de Erro (417):
{
"statusCode": "417",
"statusMsg": "Falha na atualização. Por favor, tente novamente ou contate o suporte"
}DELETE /api/servico/deletarServico?servicoId=1Resposta de Sucesso (200):
{
"statusCode": "200",
"statusMsg": "Requisição processada com sucesso"
}Resposta de Erro (417):
{
"statusCode": "417",
"statusMsg": "Falha ao deletar. Por favor, tente novamente ou contate o suporte"
}-
Administrador (JWT): Login tradicional com username e senha
- Endpoint:
/api/admin/auth/login - Retorna um token JWT
- Role:
ADM
- Endpoint:
-
Cliente (OTP): Autenticação via código enviado por email
- Endpoint:
/api/cliente/auth/gerarOtp(gera código) - Endpoint:
/api/cliente/auth/validarOtp(valida código e retorna token) - Role:
CLIENTE
- Endpoint:
Após autenticação bem-sucedida, inclua o token no header das requisições:
Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...- Email: Todos os endpoints que recebem email validam o formato
- Campos obrigatórios: Validação automática via
@Valid - Respostas padronizadas: Uso de
ResponseDtopara mensagens consistentes
src/main/java/com/ifma/barbearia/
├── controller/ # Controladores REST
├── DTOs/ # Data Transfer Objects
├── entities/ # Entidades JPA
├── services/ # Lógica de negócio
├── repositories/ # Repositórios JPA
├── security/ # Configurações de segurança e JWT
└── constants/ # Constantes da aplicação
- Fazer POST para
/api/admin/auth/logincom credenciais - Armazenar o token retornado
- Incluir o token no header
Authorization: Bearer {token}em todas as requisições
- Fazer POST para
/api/cliente/auth/gerarOtpcom o email - Cliente recebe código por email
- Fazer POST para
/api/cliente/auth/validarOtpcom email e código - Armazenar o token retornado
- Incluir o token no header
Authorization: Bearer {token}em todas as requisições
- 200: Sucesso
- 201: Criado com sucesso
- 401: Não autorizado (credenciais inválidas)
- 417: Expectativa falhou (erro na operação)
- Validação: Retorna detalhes dos campos inválidos
Este projeto está sob a licença MIT.
Desenvolvido para IFMA - 2025.2