Este é o repositório do backend para a aplicação de gerenciamento de frotas. É uma API RESTful completa construída com Spring Boot, projetada para ser consumida por um frontend (Angular). O projeto implementa um fluxo de e-commerce completo, desde a autenticação de usuário até o checkout e criação de pedidos.
O projeto é dividido em quatro módulos principais:
- Autenticação JWT: Sistema de login (
/api/login) que utilizaAuthenticationManagere retorna um token JWT. - Payload Customizado: O token JWT gerado inclui um payload customizado com
id,usernameeroledo usuário, permitindo ao frontend identificar o usuário sem requisições adicionais. - Registro de Usuário: Endpoint público (
/api/auth/register) para criação de novas contas, com criptografia de senha (BCrypt) e atribuição da role "USER" por padrão. - Controle de Acesso (RBAC): Proteção de endpoints baseada em Roles (habilitado via
@EnableMethodSecurity).- Ex: Métodos de
saveedeleteemCarControllerexigemADMINvia@PreAuthorize("hasAuthority('ADMIN')"). - Endpoint para administradores alterarem a
rolede outros usuários (/api/auth/role/{userId}).
- Ex: Métodos de
- Gerenciamento de Carrinho (
/api/cart):- Cada usuário possui um carrinho de compras persistente (
Cart). - Adiciona/Remove carros e seus acessórios selecionados (
CartItem). - Lógica de Preço: O
CartServicecalcula o preço final do item, aplicando um multiplicador (accMultiplier) do carro sobre o preço dos acessórios. - Endpoints para obter o carrinho (
GET /), adicionar item (POST /add), remover item (DELETE /remove/{id}) e limpar o carrinho (DELETE /clear).
- Cada usuário possui um carrinho de compras persistente (
- Fluxo de Checkout (
/api/orders):- Endpoint de checkout (
POST /orders/checkout) que orquestra todo o processo de finalização. - Orquestração de Serviços: O
OrderService(transacional):- Valida o carrinho do usuário.
- Processa o pagamento (simulado) através do
PaymentService. - Cria um "snapshot" da compra: converte
CartItemsemOrderItems, salvando os nomes e preços exatos da transação. - Salva o
Ordercom o status (ex:PAID). - Limpa o carrinho do usuário (
cartService.clearCart()).
- Endpoint de checkout (
- CRUDs Completos:
- Carros: (
/api/car) - Marcas: (
/api/brand) - Acessórios: (
/api/acessory)
- Carros: (
- Exclusão Lógica (Soft Delete): Carros não são deletados; eles são desativados via
carStatus = false(carService.softDelete()). - Busca Avançada e Paginação:
- Paginação: Listagem de Acessórios é paginada (
/api/acessory/findAll/...). - Busca (LIKE): Busca por nome com
ContainingIgnoreCasepara Carros, Marcas e Acessórios. - Filtros: Busca de carros por faixa de preço (
/findByPriceRange), ano (/findByYearGte) e ID da marca (/findByBrand).
- Paginação: Listagem de Acessórios é paginada (
- Global Exception Handler: Um
@ControllerAdvice(GlobalExceptionHandler) centraliza o tratamento de exceções para uma API semântica. - Validação (400): Captura
MethodArgumentNotValidException(para DTOs com@NotBlank, etc.) e retorna um JSON com os campos e mensagens de erro. - Recurso Não Encontrado (404): Captura a exceção customizada
ResourceNotFoundException. - Conflito (409): Captura a exceção customizada
DuplicateEntryException(ex: usuário já existe).
- Java 17
- Spring Boot 3.x.x
- Spring Security: Autenticação JWT e autorização por Roles (
@EnableMethodSecurity). - Spring Data JPA (Hibernate): Persistência de dados e queries customizadas.
- MySQL: Banco de dados relacional.
- Jakarta Bean Validation: Validação de DTOs de entrada (ex:
@NotBlank). - Maven: Gerenciamento de dependências.
- Lombok: Redução de boilerplate.
- SpringDoc OpenAPI (Swagger): Documentação da API.
- io.jsonwebtoken (JJWT): Biblioteca para criação e validação dos tokens JWT.
Este backend foi projetado para se integrar perfeitamente com um frontend Angular:
- CORS: Configurado globalmente (
@CrossOrigin("*")), permitindo requisições delocalhost:4200. - Autenticação:
- O frontend envia
usernameepasswordpara/api/login. - Recebe o token JWT e o armazena (ex:
localStorage). - O frontend pode decodificar este token para obter imediatamente o
id,usernameeroledo usuário logado, eliminando a necessidade de uma chamada extra/me.
- O frontend envia
- Interceptor HTTP: Um
HttpInterceptorFndeve ser usado para anexar automaticamente o token (Authorization: Bearar ...) a todas as requisições, exceto para/logine/register. - Guarda de Rotas: O frontend deve usar
CanActivateFn(Guards) para ler aroledo token decodificado e proteger rotas de admin (ex:/admin/**). - Tratamento de Erros: O frontend pode usar o
HttpErrorResponsedo interceptor para ler as mensagens de erro padronizadas enviadas pela API:- Erro 400 (Validation): Esperar um JSON
Map<String, String>com os erros de campo. - Erro 404 (Not Found): Esperar uma mensagem de texto simples.
- Erro 409 (Conflict): Esperar uma mensagem de texto simples.
- Erro 400 (Validation): Esperar um JSON
O projeto utiliza um arquivo application.properties.
# Configuração do Banco de Dados
spring.datasource.url=jdbc:mysql://localhost:3306/localiza
spring.datasource.username=seu-usuario-mysql
spring.datasource.password=sua-senha-mysql
# Atualiza o schema do banco ao iniciar
spring.jpa.hibernate.ddl-auto=update
# Configuração do JWT (use uma chave longa e aleatória)
jwt.secret=CHAVE_SECRETA_LONGA_E_ALEATORIA_PARA_GERAR_TOKENS_JWT
jwt.expiration-hours=1mvn spring-boot:run
Documentação da API (Swagger) Após iniciar a aplicação, a documentação completa e interativa do Swagger (com os endpoints publicamente liberados no SecurityConfig) pode ser acessada em:
http://localhost:8080/swagger-ui/index.html