Skip to content

Repository files navigation

DSCommerce

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

Visao geral

O sistema foi estruturado com uma separacao classica em camadas:

  • controllers expoe os endpoints REST
  • services concentra as regras de negocio
  • repositories acessa o banco via Spring Data JPA
  • entities modela o dominio e o mapeamento ORM
  • DTO define os contratos de entrada e saida da API
  • config centraliza as configuracoes de seguranca
  • controllers/handlers trata 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.

Stack

  • 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

Funcionalidades

  • 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

Dominio

Principais entidades do projeto:

  • User representa o cliente ou administrador
  • Role representa os perfis de acesso
  • Product representa os produtos do catalogo
  • Category representa as categorias dos produtos
  • Order representa o pedido
  • OrderItem representa os itens do pedido
  • Payment representa o pagamento associado ao pedido
  • OrderStatus representa o estado do pedido

Relacionamentos principais:

  • User possui varias Order
  • User possui varias Role
  • Product pertence a varias Category
  • Order possui varios OrderItem
  • Order pode possuir um Payment
  • OrderItem relaciona Order e Product por chave composta

Seguranca

O projeto usa OAuth2 Authorization Server com um cliente registrado em memoria.

Configuracao do cliente

Os valores abaixo podem ser definidos por variaveis de ambiente:

  • CLIENT_ID padrao: myclientid
  • CLIENT_SECRET padrao: myclientsecret
  • JWT_DURATION padrao: 86400 segundos
  • CORS_ORIGINS padrao: http://localhost:3000,http://localhost:5173

Fluxo de autenticacao

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 write

O 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.

Claims do JWT

O access token inclui claims customizadas:

  • username
  • authorities

Essas claims sao usadas pelo resource server para converter permissao e identificar o usuario logado.

Autorizacao

O acesso aos recursos e controlado por roles:

  • ROLE_ADMIN
  • ROLE_CLIENT

Regras principais:

  • GET /products/** e GET /categories sao publicos
  • POST /products, PUT /products/{id} e DELETE /products/{id} exigem ROLE_ADMIN
  • GET /orders/{id} exige ROLE_ADMIN ou acesso ao proprio pedido
  • POST /orders exige ROLE_CLIENT
  • GET /users/me exige ROLE_ADMIN ou ROLE_CLIENT

Endpoints

Usuarios

GET /users/me

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"]
}

Categorias

GET /categories

Lista todas as categorias cadastradas.

Resposta exemplo:

[
  { "id": 1, "name": "Livros" },
  { "id": 2, "name": "Eletronicos" },
  { "id": 3, "name": "Computadores" }
]

Produtos

GET /products/{id}

Retorna um produto completo.

GET /products

Lista produtos com paginacao e filtro por nome.

Parametros aceitos:

  • name filtro textual opcional
  • page pagina
  • size tamanho da pagina
  • sort ordenacao

Exemplo:

GET /products?size=12&page=0&sort=name,desc&name=pc%20gamer

Resposta exemplo:

{
  "content": [
    {
      "id": 4,
      "name": "PC Gamer",
      "price": 1200.0,
      "imgUrl": "https://..."
    }
  ],
  "pageable": {
    "pageNumber": 0,
    "pageSize": 12
  }
}

POST /products

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" }
  ]
}

PUT /products/{id}

Atualiza um produto existente. Requer ROLE_ADMIN.

DELETE /products/{id}

Remove um produto. Requer ROLE_ADMIN.

Pedidos

GET /orders/{id}

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
}

POST /orders

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

Formato de erros

O projeto padroniza as respostas de erro.

Erro generico

{
  "timestamp": "2026-07-04T12:00:00Z",
  "status": 404,
  "error": "Recurso nao encontrado",
  "path": "/products/999"
}

Erro de validacao

{
  "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:

  • 404 para recurso nao encontrado
  • 400 para erro de integridade de dados
  • 403 para acesso negado
  • 422 para validacao

Dados iniciais

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_CLIENT e ROLE_ADMIN
  • pedidos, itens e pagamentos

Usuarios de exemplo

O banco vem com usuarios de teste cadastrados no seed. Eles sao uteis para validar a API e o fluxo de autenticacao.

Como executar

Pre requisitos

  • Java 21
  • Maven Wrapper incluso no projeto

Rodando a aplicacao

No Windows PowerShell:

.\mvnw spring-boot:run

Ou, se preferir, gere o pacote:

.\mvnw clean package

A aplicacao sobe em:

  • http://localhost:8080

H2 Console

Com o perfil atual, o H2 esta habilitado:

  • http://localhost:8080/h2-console

Parametros:

  • JDBC URL: jdbc:h2:mem:testdb
  • usuario: sa
  • senha: vazia

Testes

Existe um teste basico de contexto em:

  • src/test/java/com/devjulio/dscommerce/DscommerceApplicationTests.java

Execute com:

.\mvnw test

Colecao Postman

O 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.

Estrutura do projeto

src/main/java/com/devjulio/dscommerce
  config
  controllers
  controllers/handlers
  DTO
  entities
  projections
  repositories
  services
  services/exceptions

Observacoes

  • 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.

About

No description, website, or topics provided.

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages