API REST para gerenciamento de e-commerce, com autenticação JWT, controle de estoque e pedidos, desenvolvida com Spring Boot e arquitetura em camadas.
A E-commerce API centraliza as operações essenciais de uma loja virtual: cadastro de produtos, controle de estoque, criação de pedidos e autenticação de usuários. O projeto foi desenvolvido com foco em:
- Segurança: Autenticação JWT com controle de acesso por roles (USER e ADMIN)
- Integridade de dados: Validações de entrada e regras de negócio bem definidas
- Consistência de estoque: Baixa automática ao criar pedidos e movimentações manuais auditáveis
- Documentação: Swagger/OpenAPI cobrindo todos os endpoints
- Versionamento de banco: Controle de schema via Flyway
O projeto segue uma arquitetura em camadas:
src/main/java/dev/matheus/
├── config/ # Configurações do Spring Security e OpenAPI
├── controller/ # Controllers REST
├── doc/ # Interfaces de documentação Swagger dos controllers
├── dto/ # Objetos de transferência de dados (requests/responses)
├── exceptions/ # Exceções customizadas e tratamento global de erros
├── mapper/ # Conversão entre entidades e DTOs
├── model/ # Entidades JPA
├── repository/ # Repositórios Spring Data
└── security/ # Geração/validação de JWT, filtros e autenticação
- Java 17
- Spring Boot: framework principal da aplicação
- Spring Security: autenticação e autorização
- Spring Data JPA / Hibernate: persistência de dados
- JWT (java-jwt / jjwt): tokens para autenticação stateless
- Bean Validation: validação de DTOs
- PostgreSQL 16: banco de dados relacional
- Flyway: migrations para controle do schema
- Maven: gerenciamento de dependências e build
- Docker Compose: orquestração do banco de dados
- Springdoc OpenAPI: documentação da API (Swagger)
- Registro e login de usuários
- Autenticação via JWT (HMAC256, expiração configurável)
- Proteção de rotas por role (
USER,ADMIN) com@PreAuthorize - Consulta do próprio usuário autenticado (
/auth/me)
- CRUD completo de produtos
- Validação de dados (nome, preço positivo, quantidade)
- Acesso de escrita restrito a
ADMIN
- Criação de pedidos com múltiplos itens
- Cálculo automático do valor total
- Baixa automática de estoque ao criar o pedido
- Registro manual de entradas (
PURCHASE) e saídas (SALE) - Histórico de movimentações por produto
- Consulta administrativa de todos os usuários (
ADMIN)
Clone o repositório:
git clone https://github.com/Matheuslpr/e-commerce.git
cd e-commerceCrie um arquivo .env na raiz do projeto:
JWT_SECRET=SUBSTITUA_POR_UMA_CHAVE_SECRETA_FORTE_E_ALEATORIASuba o banco de dados com Docker:
docker compose up -dExecute a aplicação:
./mvnw spring-boot:runOu, no Windows:
mvnw.cmd spring-boot:runA API estará disponível em http://localhost:8080
| JWT_SECRET | Chave secreta usada para assinar e validar os tokens JWT |
Com a aplicação em execução, a documentação interativa (Swagger) fica disponível em:
http://localhost:8080/swagger-ui/index.html
Especificação OpenAPI em JSON:
http://localhost:8080/v3/api-docs
Para testar endpoints protegidos, clique em Authorize e informe o token no formato Bearer <seu_token_jwt>.
POST /auth/login— Login e geração de token JWTPOST /auth/register— Registrar novo usuárioGET /auth/me— Consultar o próprio usuário autenticado
GET /user— Listar todos os usuários (ADMIN)GET /user/{id}— Buscar usuário por ID (ADMIN)
GET /products— Listar produtosGET /products/{id}— Buscar produto por IDPOST /products— Criar produto (ADMIN)PUT /products/{id}— Atualizar produto (ADMIN)DELETE /products/{id}— Remover produto (ADMIN)
GET /orders— Listar pedidosGET /orders/{id}— Buscar pedido por IDPOST /orders— Criar pedido (com baixa automática de estoque)
GET /stock_movements— Listar movimentaçõesGET /stock_movements/{id}— Buscar movimentação por IDPOST /stock_movements— Registrar movimentação (PURCHASEouSALE)
Os erros são centralizados no GlobalExceptionHandler e retornam sempre um JSON padronizado com timestamp, status, error e message.
| Status | Cenário |
|---|---|
400 Bad Request |
Validação falhou ou regra de negócio violada (ex.: e-mail já cadastrado) |
401 Unauthorized |
Token ausente/inválido ou credenciais incorretas |
403 Forbidden |
Usuário autenticado sem a role necessária |
404 Not Found |
Recurso não encontrado (produto, pedido, etc.) |
O docker-compose.yml sobe apenas o banco de dados PostgreSQL:
services:
db:
image: postgres:16-alpine
container_name: ecommerce
environment:
POSTGRES_USER: postgres
POSTGRES_PASSWORD: postgres
POSTGRES_DB: ecommerce_db
ports:
- "5431:5434"docker compose up -d # subir o banco
docker compose down # parar
docker logs -f ecommerce # ver logsA preencher: ainda não existe um
Dockerfilepara a aplicação — apenas o banco é containerizado.
Este projeto está sob a licença Apache 2.0 — veja https://www.apache.org/licenses/LICENSE-2.0 para detalhes.e](https://github.com/Matheuslpr/e-commerce)