API backend de comercio eletronico desenvolvida com Spring Boot, Spring Security, OAuth2 Authorization Server, JWT, JPA e H2.
O projeto expoe recursos para:
- cadastro e consulta de produtos
- listagem de categorias
- criacao e consulta de pedidos
- consulta do perfil do usuario autenticado
- autenticacao via password grant customizado com emissao de JWT
O sistema foi estruturado com uma separacao classica em camadas:
controllersexpoe os endpoints RESTservicesconcentra as regras de negociorepositoriesacessa o banco via Spring Data JPAentitiesmodela o dominio e o mapeamento ORMDTOdefine os contratos de entrada e saida da APIconfigcentraliza as configuracoes de segurancacontrollers/handlerstrata erros padronizados da API
O banco utilizado no perfil padrao e o H2 em memoria, populado via import.sql com dados iniciais de categorias, produtos, usuarios, perfis, pedidos e pagamentos.
- Java 21
- Spring Boot 3.3.5
- Spring Web
- Spring Data JPA
- Spring Validation
- Spring Security
- Spring Authorization Server 1.3.2
- Spring Resource Server
- H2 Database
- Maven Wrapper
- Autenticacao OAuth2 com grant type customizado
password - Emissao de access token JWT com claims customizadas
- Autorizacao por roles em nivel de metodo com
@PreAuthorize - CRUD parcial de produtos
- Consulta de produtos com paginacao e filtro por nome
- Consulta de categorias
- Criacao de pedidos com itens
- Consulta de pedido com validacao de acesso ao proprio recurso ou perfil admin
- Consulta dos dados do usuario autenticado em
/users/me - Tratamento padronizado de erros e validacao
Principais entidades do projeto:
Userrepresenta o cliente ou administradorRolerepresenta os perfis de acessoProductrepresenta os produtos do catalogoCategoryrepresenta as categorias dos produtosOrderrepresenta o pedidoOrderItemrepresenta os itens do pedidoPaymentrepresenta o pagamento associado ao pedidoOrderStatusrepresenta o estado do pedido
Relacionamentos principais:
Userpossui variasOrderUserpossui variasRoleProductpertence a variasCategoryOrderpossui variosOrderItemOrderpode possuir umPaymentOrderItemrelacionaOrdereProductpor chave composta
O projeto usa OAuth2 Authorization Server com um cliente registrado em memoria.
Os valores abaixo podem ser definidos por variaveis de ambiente:
CLIENT_IDpadrao:myclientidCLIENT_SECRETpadrao:myclientsecretJWT_DURATIONpadrao:86400segundosCORS_ORIGINSpadrao:http://localhost:3000,http://localhost:5173
O token e emitido pelo endpoint padrao do Spring Authorization Server:
POST /oauth2/token
O grant type usado no projeto e password, implementado de forma customizada.
Exemplo de requisicao x-www-form-urlencoded:
grant_type=password
username=maria@gmail.com
password=123456
scope=read writeO cliente OAuth deve ser autenticado com client_id e client_secret, normalmente via Basic Auth ou pelos campos aceitos pelo cliente HTTP que voce estiver usando.
O access token inclui claims customizadas:
usernameauthorities
Essas claims sao usadas pelo resource server para converter permissao e identificar o usuario logado.
O acesso aos recursos e controlado por roles:
ROLE_ADMINROLE_CLIENT
Regras principais:
GET /products/**eGET /categoriessao publicosPOST /products,PUT /products/{id}eDELETE /products/{id}exigemROLE_ADMINGET /orders/{id}exigeROLE_ADMINou acesso ao proprio pedidoPOST /ordersexigeROLE_CLIENTGET /users/meexigeROLE_ADMINouROLE_CLIENT
Retorna os dados do usuario autenticado.
Resposta exemplo:
{
"id": 1,
"name": "Maria Brown",
"email": "maria@gmail.com",
"phone": "988888888",
"birthDate": "2001-07-25",
"roles": ["ROLE_CLIENT"]
}Lista todas as categorias cadastradas.
Resposta exemplo:
[
{ "id": 1, "name": "Livros" },
{ "id": 2, "name": "Eletronicos" },
{ "id": 3, "name": "Computadores" }
]Retorna um produto completo.
Lista produtos com paginacao e filtro por nome.
Parametros aceitos:
namefiltro textual opcionalpagepaginasizetamanho da paginasortordenacao
Exemplo:
GET /products?size=12&page=0&sort=name,desc&name=pc%20gamerResposta exemplo:
{
"content": [
{
"id": 4,
"name": "PC Gamer",
"price": 1200.0,
"imgUrl": "https://..."
}
],
"pageable": {
"pageNumber": 0,
"pageSize": 12
}
}Cria um produto novo. Requer ROLE_ADMIN.
Observacao importante: o backend valida que exista pelo menos uma categoria em categories.
Exemplo de corpo:
{
"name": "Meu produto",
"description": "Descricao com pelo menos 10 caracteres",
"imgUrl": "https://example.com/imagem.jpg",
"price": 50.0,
"categories": [
{ "id": 1, "name": "Livros" }
]
}Atualiza um produto existente. Requer ROLE_ADMIN.
Remove um produto. Requer ROLE_ADMIN.
Retorna um pedido. O acesso e liberado para admin ou para o proprio dono do pedido.
Resposta exemplo:
{
"id": 1,
"moment": "2022-07-25T13:00:00Z",
"status": "PAID",
"client": {
"id": 1,
"name": "Maria Brown"
},
"payment": {
"id": 1,
"moment": "2022-07-25T15:00:00Z"
},
"items": [
{
"productId": 1,
"name": "The Lord of the Rings",
"price": 90.5,
"quantity": 2,
"imgUrl": "https://..."
}
],
"total": 181.0
}Cria um pedido novo. Requer ROLE_CLIENT.
Exemplo de corpo:
{
"items": [
{ "productId": 1, "quantity": 2 },
{ "productId": 3, "quantity": 1 }
]
}O sistema define automaticamente:
- data/hora atual
- status inicial
WAITING_PAYMENT - cliente com base no usuario autenticado
- preco unitario do item com base no produto selecionado
O projeto padroniza as respostas de erro.
{
"timestamp": "2026-07-04T12:00:00Z",
"status": 404,
"error": "Recurso nao encontrado",
"path": "/products/999"
}{
"timestamp": "2026-07-04T12:00:00Z",
"status": 422,
"error": "Dados invalidos",
"path": "/products",
"errors": [
{
"fieldName": "name",
"message": "Nome precisa ter de 3 a 80 caracteres"
}
]
}Status tratados pelo ControllerAdvice:
404para recurso nao encontrado400para erro de integridade de dados403para acesso negado422para validacao
O arquivo src/main/resources/import.sql carrega dados de exemplo automaticamente no perfil padrao.
Conteudo inicial inclui:
- 3 categorias
- 25 produtos
- usuarios de exemplo
- perfis
ROLE_CLIENTeROLE_ADMIN - pedidos, itens e pagamentos
O banco vem com usuarios de teste cadastrados no seed. Eles sao uteis para validar a API e o fluxo de autenticacao.
- Java 21
- Maven Wrapper incluso no projeto
No Windows PowerShell:
.\mvnw spring-boot:runOu, se preferir, gere o pacote:
.\mvnw clean packageA aplicacao sobe em:
http://localhost:8080
Com o perfil atual, o H2 esta habilitado:
http://localhost:8080/h2-console
Parametros:
- JDBC URL:
jdbc:h2:mem:testdb - usuario:
sa - senha: vazia
Existe um teste basico de contexto em:
src/test/java/com/devjulio/dscommerce/DscommerceApplicationTests.java
Execute com:
.\mvnw testO repositorio inclui a colecao:
DSCommerce Cap04.postman_collection.json
Ela contem exemplos de consultas e operacoes em produtos. Para usar os endpoints protegidos, configure antes o token JWT obtido em POST /oauth2/token.
src/main/java/com/devjulio/dscommerce
config
controllers
controllers/handlers
DTO
entities
projections
repositories
services
services/exceptions
- O banco padrao e em memoria, entao os dados sao recriados a cada inicializacao.
- A aplicacao usa CORS liberado apenas para as origens configuradas em
cors.origins. - O resource server aplica JWT, mas a liberacao efetiva dos recursos acontece principalmente via
@PreAuthorize. - O projeto foi montado com uma abordagem didatica, ideal para estudo de autenticao, autorizacao e modelagem JPA.