ByteStore é uma API RESTful completa para gerenciamento de e-commerce, desenvolvida em Java 17 com Spring Boot 3.5.6. O sistema oferece autenticação JWT, CRUD de produtos, gerenciamento de pedidos e relatórios administrativos.
- Sobre o Projeto
- Objetivo
- Stack Tecnológica
- Funcionalidades
- Arquitetura
- Pré-requisitos
- Instalação
- Testes
- Configuração do Banco de Dados
- Usando o Postman
- Documentação da API
- Autenticação
- Perfis de Usuário
- Dados Iniciais
- Autor
O ByteStore é um sistema de e-commerce simplificado voltado para a venda de produtos de tecnologia e informática. Desenvolvido como projeto de portfólio, demonstra habilidades práticas em:
- Desenvolvimento Back-end com Java e Spring Boot
- Arquitetura em Camadas (Clean Architecture)
- Autenticação e Autorização com JWT
- APIs RESTful seguindo boas práticas
- Banco de Dados Relacional com MySQL
- Consultas SQL Otimizadas para relatórios
- Tratamento de Exceções centralizado
- Validações de dados e regras de negócio
O projeto implementa um sistema completo de gestão de produtos e pedidos, com controle de estoque, pagamentos e relatórios administrativos, utilizando as melhores práticas do ecossistema Spring.
Construir uma aplicação RESTful que demonstre habilidades em desenvolvimento back-end, implementando:
- ✅ Autenticação segura com JWT (JSON Web Tokens)
- ✅ Dois perfis de usuário (ADMIN e USER) com controle de acesso
- ✅ CRUD completo de produtos (acesso exclusivo do perfil ADMIN)
- ✅ Gerenciamento de pedidos com:
- Criação de pedidos com múltiplos produtos
- Controle de status (PENDENTE, PAGO, CANCELADO)
- Cálculo automático do valor total
- Atualização de estoque após pagamento
- Cancelamento automático por falta de estoque
- ✅ Consultas SQL otimizadas para relatórios administrativos:
- Top 5 usuários que mais compraram
- Ticket médio de pedidos por usuário
- Valor total faturado no mês
- Demonstrar conhecimento em Spring Boot e suas dependências
- Aplicar arquitetura em camadas de forma prática
- Implementar segurança JWT do zero
- Criar APIs RESTful bem estruturadas
- Otimizar consultas SQL para performance
- Aplicar boas práticas de desenvolvimento Java
| Tecnologia | Versão | Descrição |
|---|---|---|
| Java | 17+ | Linguagem de programação |
| Spring Boot | 3.5.6 | Framework Java para aplicações web |
| MySQL | 8.0+ | Banco de dados relacional |
| Maven | 3.6+ | Gerenciador de dependências |
- spring-boot-starter-web - Framework web REST
- spring-boot-starter-data-jpa - Persistência de dados com JPA
- spring-boot-starter-security - Segurança e autenticação
- spring-boot-starter-validation - Validação de dados
- mysql-connector-j - Driver JDBC para MySQL
- jjwt-api - Biblioteca JWT para Java
- jjwt-impl - Implementação JWT
- jjwt-jackson - Serialização Jackson para JWT
- lombok (Latest) - Redução de boilerplate
- spring-boot-starter-test - Testes
- spring-security-test - Testes de segurança
- Maven - Build e gerenciamento de dependências
- MySQL Workbench - Gerenciamento do banco de dados (opcional)
- Postman - Testes de API (opcional)
- Registro de usuários com validação de dados
- Login com email e senha
- Geração de token JWT com expiração configurável (1 hora)
- Validação de token JWT
- Criptografia de senhas com BCrypt
- Controle de acesso por perfis (ADMIN e USER)
- Filtro JWT para autenticação automática
- Listagem de produtos (acesso público)
- Busca de produto por ID (acesso público)
- Criação de produtos (apenas ADMIN)
- Atualização de produtos (apenas ADMIN)
- Exclusão de produtos (apenas ADMIN)
- Validações:
- Nome único
- Preço não negativo
- Estoque não negativo
- Campos obrigatórios
- Criação de pedidos com múltiplos produtos
- Listagem de pedidos do usuário autenticado
- Busca de pedido por ID
- Realização de pagamento de pedidos
- Controle de status:
PENDENTE- Pedido criado, aguardando pagamentoPAGO- Pedido pago, estoque atualizadoCANCELADO- Pedido cancelado
- Regras de negócio:
- Cálculo automático de totais
- Atualização de estoque apenas após pagamento
- Cancelamento automático por falta de estoque
- Validação de propriedade (usuário só vê seus pedidos)
- Top 5 usuários que mais compraram (apenas ADMIN)
- Ordenado por quantidade de pedidos
- Filtro por status PAGO
- Retorna nome, email, total de pedidos e valor total
- Ticket médio por usuário (apenas ADMIN)
- Média de valor por pedido
- Filtro por status PAGO
- Ordenado por ticket médio decrescente
- Faturamento mensal (apenas ADMIN)
- Valor total faturado no mês
- Parâmetros opcionais: ano e mês (padrão: mês atual)
- Filtro por status PAGO
O projeto segue o modelo Clean Layers (Arquitetura em Camadas), organizando o código em camadas bem definidas com responsabilidades específicas:
┌─────────────────────────────────────┐
│ Controller Layer │
│ (AuthController, ProductController,│
│ OrderController, ReportController)│
│ - Recebe requisições HTTP │
│ - Valida entrada │
│ - Chama services │
└──────────────┬──────────────────────┘
│
▼
┌─────────────────────────────────────┐
│ Service Layer │
│ (AuthService, ProductService, │
│ OrderService, ReportService) │
│ - Lógica de negócio │
│ - Orquestração │
│ - Validações de negócio │
└──────────────┬──────────────────────┘
│
▼
┌─────────────────────────────────────┐
│ Repository Layer │
│ (UserRepository, ProductRepository,│
│ OrderRepository, OrderItemRepo) │
│ - Acesso ao banco de dados │
│ - Queries SQL │
└──────────────┬──────────────────────┘
│
▼
┌─────────────────────────────────────┐
│ Database (MySQL) │
│ (tb_users, tb_products, tb_orders, │
│ tb_order_items) │
└─────────────────────────────────────┘
| Camada | Responsabilidade | Componentes |
|---|---|---|
| Controller | Exposição de endpoints REST, validação de entrada | 4 Controllers |
| Service | Regras de negócio, orquestração, validações | 5 Services |
| Repository | Acesso ao banco de dados, queries | 4 Repositories |
| DTO | Transporte de dados, padronização de respostas | 15 DTOs |
| Entity | Mapeamento JPA das tabelas | 6 Entities |
| Security | Configuração JWT, controle de perfis | JwtService, JwtFilter, SecurityConfig |
| Exception | Tratamento global de exceções | GlobalExceptionHandler, 17 Exceptions |
| Mapper | Conversão Entity ↔ DTO | 3 Mappers |
- DTO (Data Transfer Object) - Transferência de dados entre camadas
- Repository Pattern - Abstração de acesso a dados
- Service Layer Pattern - Separação de lógica de negócio
- Exception Handler Pattern - Tratamento centralizado de exceções
- Mapper Pattern - Conversão entre entidades e DTOs
Antes de começar, certifique-se de ter instalado:
-
Java 17 ou superior
- Verificar instalação:
java -version - Download: Oracle JDK ou OpenJDK
- Verificar instalação:
-
Maven 3.6 ou superior
- Verificar instalação:
mvn -version - Download: Apache Maven
- Verificar instalação:
-
MySQL 8.0 ou superior
- Verificar instalação:
mysql --version - Download: MySQL Community Server
- Verificar instalação:
-
Git
- Verificar instalação:
git --version - Download: Git
- Verificar instalação:
- IDE (IntelliJ IDEA, Eclipse, VS Code)
- MySQL Workbench - Gerenciamento visual do banco de dados
- Postman - Testes de API
Siga os passos abaixo para instalar e executar o projeto:
git clone https://github.com/ManoelRabelo/byte-store-backend.git
cd byte-store-backendO schema.sql já cria o banco de dados automaticamente quando a aplicação é executada. No entanto, se você encontrar
problemas de permissão, crie o banco manualmente antes:
CREATE DATABASE bytestore_db
CHARACTER SET utf8mb4
COLLATE utf8mb4_unicode_ci;Nota: Se o usuário MySQL tiver permissões adequadas, o Spring Boot criará e populará o banco automaticamente na
primeira execução através do schema.sql. Caso contrário, crie o banco manualmente primeiro.
Crie um arquivo .env na raiz do projeto (opcional, se preferir usar variáveis de ambiente):
DB_URL=jdbc:mysql://localhost:3306/bytestore_db?useTimezone=true&serverTimezone=UTC
DB_USERNAME=root
DB_PASSWORD=admin123
JWT_SECRET=hHghwETDATHC8QMpA4MQPu8LUrcUsXNyDeKH/qSwVpU9cFKmNO/lWsRO7iuyv/Hg
JWT_EXPIRATION=3600000Nota: As configurações também podem ser feitas diretamente no arquivo application.properties.
Edite o arquivo bytestore/src/main/resources/application.properties e ajuste as credenciais do banco de dados:
spring.application.name=ByteStore
# Server Configuration
server.port=8080
# Datasource Configuration
spring.datasource.url=jdbc:mysql://localhost:3306/bytestore_db?useTimezone=true&serverTimezone=UTC
spring.datasource.username=root
spring.datasource.password=admin123
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
# Hibernate
spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.MySQL8Dialect
spring.jpa.hibernate.ddl-auto=update
spring.jpa.show-sql=true
spring.jpa.properties.hibernate.format_sql=true
# Configuração para carregar dados iniciais (schema.sql)
spring.jpa.defer-datasource-initialization=true
spring.sql.init.mode=always
# JWT Configuration
jwt.secret=hHghwETDATHC8QMpA4MQPu8LUrcUsXNyDeKH/qSwVpU9cFKmNO/lWsRO7iuyv/Hg
jwt.expiration=3600000Importante:
- Altere
spring.datasource.usernameespring.datasource.passwordconforme suas credenciais do MySQL - As propriedades
spring.jpa.defer-datasource-initialization=trueespring.sql.init.mode=alwaysjá estão configuradas para executar oschema.sqlautomaticamente na inicialização da aplicação
cd bytestore
mvn clean installmvn spring-boot:runOu execute a classe ByteStoreApplication.java diretamente na sua IDE.
A aplicação estará disponível em:
http://localhost:8080
Teste o endpoint de listagem de produtos (público):
curl http://localhost:8080/productsSe retornar uma lista (mesmo que vazia), a aplicação está funcionando!
O projeto possui testes unitários implementados para garantir a qualidade e confiabilidade do código.
Para executar todos os testes:
cd bytestore
mvn testPara executar testes de uma classe específica:
mvn test -Dtest=ProductServiceTestO projeto possui ~72 testes unitários cobrindo:
- ✅ Services (AuthService, ProductService, OrderService, ReportService)
- ✅ Entities (Product, Order)
- ✅ Validações e regras de negócio
- ✅ Casos de sucesso e erros
- ✅ Casos de borda e valores limites
- JUnit 5 - Framework de testes
- Mockito - Framework de mocking
- AssertJ - Assertions fluentes
- Spring Boot Test - Testes de integração
- Spring Security Test - Testes de segurança
O projeto está configurado para criar automaticamente o banco de dados e carregar os dados iniciais quando a aplicação é iniciada.
O arquivo application.properties já possui as seguintes configurações:
spring.jpa.defer-datasource-initialization=true
spring.sql.init.mode=alwaysEssas propriedades fazem com que o Spring Boot execute automaticamente o arquivo schema.sql localizado em
src/main/resources/schema.sql toda vez que a aplicação inicia.
O arquivo schema.sql contém:
- DROP DATABASE IF EXISTS - Deleta o banco de dados se ele já existir
- CREATE DATABASE - Cria o banco de dados
bytestore_db - CREATE TABLE - Cria todas as tabelas (tb_users, tb_products, tb_orders, tb_order_items)
- INSERT - Insere dados iniciais (4 usuários, 26 produtos, 6 pedidos)
-
Configure as credenciais no
application.properties(veja seção Instalação) -
Execute a aplicação - O Spring Boot irá automaticamente:
- Deletar o banco de dados
bytestore_db(se existir) - Recriar o banco de dados
bytestore_db - Criar todas as tabelas (tb_users, tb_products, tb_orders, tb_order_items)
- Inserir dados iniciais (4 usuários, 26 produtos, 6 pedidos)
- Deletar o banco de dados
Nota: Se o usuário MySQL não tiver permissões para criar/deletar bancos de dados, crie o banco manualmente primeiro (veja passo opcional na seção Instalação).
Após iniciar a aplicação, você pode verificar se tudo foi criado corretamente:
USE bytestore_db;
SHOW TABLES;
SELECT COUNT(*) FROM tb_users; -- Deve retornar 4
SELECT COUNT(*) FROM tb_products; -- Deve retornar 26
SELECT COUNT(*) FROM tb_orders; -- Deve retornar 6Como alternativa à execução automática do schema.sql, você pode importar o arquivo bytestore_db_dump.sql diretamente
no MySQL. Este dump contém a estrutura completa do banco de dados e todos os dados iniciais.
- Desabilite a execução automática no
application.properties:
spring.sql.init.mode=never-
Abra o MySQL Workbench e conecte-se ao servidor
-
Importe o dump:
- Clique em
Server→Data Import - Selecione
Import from Self-Contained File - Escolha o arquivo
bytestore_db_dump.sql - Selecione
bytestore_dbcomo banco de destino (ou crie o banco se não existir) - Clique em
Start Import
- Clique em
O banco de dados possui 4 tabelas principais:
- tb_users - Usuários do sistema (id, name, email, password, role, created_at)
- tb_products - Produtos cadastrados (id, name, description, price, category, stock_quantity, created_at, updated_at)
- tb_orders - Pedidos realizados (id, user_id, status, total_amount, created_at, paid_at)
- tb_order_items - Itens de cada pedido (id, order_id, product_id, quantity, unit_price, subtotal)
O schema.sql inclui automaticamente:
- 4 usuários (2 ADMIN, 2 USER) com senhas criptografadas
- 26 produtos em 5 categorias (Computadores, Periféricos, Componentes, Monitores, Áudio)
- 6 pedidos de exemplo com diferentes status
Veja a seção Dados Iniciais para credenciais de acesso.
O projeto inclui uma collection do Postman completa com todos os endpoints da API, além de um **ambiente configurado ** com automação para gerenciar tokens de autenticação.
ByteStore Paths.postman_collection.json- Collection com todos os endpoints da APIByteStore Local.postman_environment.json- Ambiente local com variáveis configuradas
- Abra o Postman
- Clique em Import (canto superior esquerdo)
- Arraste o arquivo
ByteStore Paths.postman_collection.jsonou clique em Upload Files - Clique em Import
- No Postman, clique em Import novamente
- Arraste o arquivo
ByteStore Local.postman_environment.jsonou clique em Upload Files - Clique em Import
- No canto superior direito do Postman, clique no dropdown de ambientes
- Selecione ByteStore Local
Após importar o ambiente, configure a variável de ambiente:
- Clique no ícone de engrenagem (⚙️) ao lado do dropdown de ambientes
- Selecione ByteStore Local
- Defina o valor da variável
baseUrl:http://localhost:8080
A collection possui automação configurada que salva automaticamente o token JWT após registro ou login:
-
Execute a requisição de Register ou Login:
- Vá para a pasta
User Athentication - Execute
RegisterouLogin
- Vá para a pasta
-
O token é salvo automaticamente:
- A collection possui scripts de teste que capturam o token da resposta
- O token é automaticamente salvo na variável
accessTokendo ambiente - Todas as outras requisições usam automaticamente esse token
As requisições Register e Login possuem o seguinte script de teste:
if (pm.response.code >= 200 && pm.response.code < 300) {
const jsonData = pm.response.json();
pm.environment.set("accessToken", jsonData.accessToken);
} else {
console.log("Falha na requisição, código:", pm.response.code);
}Nota: O script verifica se a resposta foi bem-sucedida (código 200-299) e salva o token na variável de ambiente.
- Abra a pasta User Athentication
- Execute a requisição Login (ou Register para criar um novo usuário)
- O token será automaticamente salvo no ambiente
Após fazer login, todas as requisições que requerem autenticação usarão automaticamente o token salvo:
- Product - Endpoints de produtos (criar, atualizar, deletar)
- Order - Endpoints de pedidos (criar, listar, pagar)
- Report - Endpoints de relatórios (apenas ADMIN)
Para verificar se o token foi salvo:
- Clique no ícone de engrenagem (⚙️) ao lado do dropdown de ambientes
- Selecione ByteStore Local
- Verifique se a variável
accessTokenpossui um valor (será um token JWT longo)
A collection está organizada em pastas:
-
User Athentication
- Register - Registrar novo usuário
- Login - Fazer login e obter token
-
Product
- Product Create - Criar produto (ADMIN)
- Product Update - Atualizar produto (ADMIN)
- Product Delete - Deletar produto (ADMIN)
- Product Get All - Listar todos os produtos (público)
- Product Get By Id - Buscar produto por ID (público)
-
Order
- Order Create - Criar pedido (USER/ADMIN)
- Order Get All - Listar pedidos do usuário (USER/ADMIN)
- Order Get By Id - Buscar pedido por ID (USER/ADMIN)
- Order Payment - Realizar pagamento (USER/ADMIN)
-
Report
- Top Users - Top 5 usuários que mais compraram (ADMIN)
- Average Ticket - Ticket médio por usuário (ADMIN)
- Monthly Revenue - Faturamento mensal (ADMIN)
- Trocar entre usuários: Execute Login com diferentes credenciais para trocar o token
- Testar permissões: Use um usuário USER para testar endpoints que não requerem ADMIN
- Visualizar respostas: Todas as requisições mostram a resposta completa no Postman
- Debugging: Use o console do Postman (View → Show Postman Console) para ver logs
O ambiente ByteStore Local possui as seguintes variáveis:
| Variável | Descrição | Valor Padrão |
|---|---|---|
baseUrl |
URL base da API | http://localhost:8080 (deve ser configurado) |
accessToken |
Token JWT de autenticação | (preenchido automaticamente após login/register) |
http://localhost:8080
A maioria dos endpoints requer autenticação via JWT. Consulte a seção Autenticação para obter o token.
| Método | Endpoint | Descrição | Autenticação |
|---|---|---|---|
POST |
/auth/register |
Registrar novo usuário | ❌ Público |
POST |
/auth/login |
Login e obter token JWT | ❌ Público |
GET |
/auth/validate?token={token} |
Validar token JWT | ❌ Público |
| Método | Endpoint | Descrição | Autenticação | Perfil |
|---|---|---|---|---|
GET |
/products |
Listar todos os produtos | ❌ Público | - |
GET |
/products/{id} |
Buscar produto por ID | ❌ Público | - |
POST |
/products |
Criar produto | ✅ Requerida | ADMIN |
PUT |
/products/{id} |
Atualizar produto | ✅ Requerida | ADMIN |
DELETE |
/products/{id} |
Deletar produto | ✅ Requerida | ADMIN |
| Método | Endpoint | Descrição | Autenticação | Perfil |
|---|---|---|---|---|
POST |
/orders |
Criar pedido | ✅ Requerida | USER/ADMIN |
GET |
/orders |
Listar pedidos do usuário | ✅ Requerida | USER/ADMIN |
GET |
/orders/{id} |
Buscar pedido por ID | ✅ Requerida | USER/ADMIN |
POST |
/orders/{id}/payment |
Realizar pagamento | ✅ Requerida | USER/ADMIN |
| Método | Endpoint | Descrição | Autenticação | Perfil |
|---|---|---|---|---|
GET |
/reports/top-users |
Top 5 usuários que mais compraram | ✅ Requerida | ADMIN |
GET |
/reports/average-ticket |
Ticket médio por usuário | ✅ Requerida | ADMIN |
GET |
/reports/monthly-revenue?year=2025&month=1 |
Faturamento mensal | ✅ Requerida | ADMIN |
curl -X POST http://localhost:8080/auth/register \
-H "Content-Type: application/json" \
-d '{
"name": "John Doe",
"email": "[email protected]",
"password": "Senha123",
"role": "USER"
}'curl -X POST http://localhost:8080/auth/login \
-H "Content-Type: application/json" \
-d '{
"email": "[email protected]",
"password": "Senha123"
}'curl -X GET http://localhost:8080/productscurl -X POST http://localhost:8080/products \
-H "Authorization: Bearer {token}" \
-H "Content-Type: application/json" \
-d '{
"name": "Mouse Logitech MX Master 3",
"description": "Mouse sem fio Logitech MX Master 3",
"price": 549.99,
"category": "Periféricos",
"stockQuantity": 50
}'curl -X POST http://localhost:8080/orders \
-H "Authorization: Bearer {token}" \
-H "Content-Type: application/json" \
-d '{
"items": [
{
"productId": "123e4567-e89b-12d3-a456-426614174000",
"quantity": 2
}
]
}'curl -X POST http://localhost:8080/orders/{id}/payment \
-H "Authorization: Bearer {token}"curl -X GET http://localhost:8080/reports/top-users \
-H "Authorization: Bearer {token_admin}"| Código | Descrição |
|---|---|
200 |
OK - Requisição bem-sucedida |
201 |
Created - Recurso criado com sucesso |
204 |
No Content - Recurso deletado com sucesso |
400 |
Bad Request - Erro de validação |
401 |
Unauthorized - Token inválido ou ausente |
403 |
Forbidden - Acesso negado (sem permissão) |
404 |
Not Found - Recurso não encontrado |
409 |
Conflict - Conflito (ex: nome duplicado) |
500 |
Internal Server Error - Erro interno do servidor |
Todas as respostas de erro seguem o formato padronizado:
{
"timestamp": "2025-01-27T10:00:00",
"status": 400,
"error": "Bad Request",
"message": "Mensagem de erro descritiva",
"path": "/endpoint",
"fieldErrors": [
{
"field": "campo",
"message": "Mensagem de erro do campo"
}
]
}O sistema utiliza JWT (JSON Web Tokens) para autenticação. Todas as requisições que requerem autenticação devem
incluir o token no header Authorization.
- Registrar usuário ou fazer login
- Receber token JWT na resposta
- Incluir token no header
Authorizationdas requisições - Token válido por 1 hora (configurável)
curl -X POST http://localhost:8080/auth/register \
-H "Content-Type: application/json" \
-d '{
"name": "John Doe",
"email": "[email protected]",
"password": "Senha123",
"role": "USER"
}'Resposta:
{
"token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...",
"user": {
"id": "123e4567-e89b-12d3-a456-426614174000",
"name": "John Doe",
"email": "[email protected]",
"role": "USER"
}
}curl -X POST http://localhost:8080/auth/login \
-H "Content-Type: application/json" \
-d '{
"email": "[email protected]",
"password": "Senha123"
}'Resposta:
{
"token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...",
"user": {
"id": "123e4567-e89b-12d3-a456-426614174000",
"name": "John Doe",
"email": "[email protected]",
"role": "USER"
}
}Inclua o token no header Authorization com o prefixo Bearer:
curl -X GET http://localhost:8080/orders \
-H "Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9..."curl -X GET "http://localhost:8080/auth/validate?token=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9..."Resposta:
Token válido
ou
Token inválido ou expirado
O token JWT está configurado no application.properties:
jwt.secret=hHghwETDATHC8QMpA4MQPu8LUrcUsXNyDeKH/qSwVpU9cFKmNO/lWsRO7iuyv/Hg
jwt.expiration=3600000 # 1 hora em milissegundosImportante: Em produção, use uma chave secreta forte e armazene-a em variáveis de ambiente.
O sistema possui dois perfis de usuário com diferentes níveis de acesso:
Permissões completas:
- ✅ Gerenciar produtos (criar, atualizar, deletar, listar)
- ✅ Visualizar relatórios administrativos
- ✅ Criar e gerenciar pedidos
- ✅ Visualizar todos os pedidos
Endpoints exclusivos:
POST /products- Criar produtoPUT /products/{id}- Atualizar produtoDELETE /products/{id}- Deletar produtoGET /reports/top-users- Top 5 usuáriosGET /reports/average-ticket- Ticket médioGET /reports/monthly-revenue- Faturamento mensal
Permissões limitadas:
- ✅ Visualizar produtos (listagem pública)
- ✅ Criar pedidos
- ✅ Visualizar próprios pedidos
- ✅ Realizar pagamento de pedidos
- ❌ Gerenciar produtos
- ❌ Visualizar relatórios
- ❌ Visualizar pedidos de outros usuários
Endpoints permitidos:
GET /products- Listar produtosGET /products/{id}- Buscar produtoPOST /orders- Criar pedidoGET /orders- Listar próprios pedidosGET /orders/{id}- Buscar próprio pedidoPOST /orders/{id}/payment- Realizar pagamento
*Usuários USER só podem acessar seus próprios pedidos.
O arquivo schema.sql inclui dados iniciais para testes. Utilize as credenciais abaixo para acessar o sistema:
| Nome | Senha | Perfil | Descrição | |
|---|---|---|---|---|
| Roronoa Zoro | [email protected] |
Santoryu123 |
ADMIN | Administrador do sistema |
| Monkey D Luffy | [email protected] |
GomuGomu123 |
USER | Usuário comum |
| Tony Tony Chopper | [email protected] |
RumbleBall123 |
USER | Usuário comum |
| Nico Robin | [email protected] |
HanaHana123 |
ADMIN | Administradora do sistema |
O sistema inclui 26 produtos organizados em 5 categorias:
- Computadores (4 produtos): Notebooks e desktops
- Periféricos (6 produtos): Mouses, teclados, webcams
- Componentes (8 produtos): Placas de vídeo, processadores, memórias, SSDs
- Monitores (4 produtos): Monitores diversos
- Áudio (4 produtos): Headsets e fones de ouvido
O sistema inclui 6 pedidos de exemplo com diferentes status.
-
Execute a aplicação - O Spring Boot criará automaticamente o banco de dados e carregará os dados iniciais do
schema.sqlna primeira execução (veja seção Configuração do Banco de Dados) -
Faça login com um usuário ADMIN:
curl -X POST http://localhost:8080/auth/login \
-H "Content-Type: application/json" \
-d '{
"email": "[email protected]",
"password": "Santoryu123"
}'- Use o token retornado para acessar endpoints administrativos:
curl -X GET http://localhost:8080/reports/top-users \
-H "Authorization: Bearer {token}"- Faça login com um usuário USER:
curl -X POST http://localhost:8080/auth/login \
-H "Content-Type: application/json" \
-d '{
"email": "[email protected]",
"password": "GomuGomu123"
}'- Use o token para criar pedidos e visualizar produtos:
curl -X GET http://localhost:8080/products \
-H "Authorization: Bearer {token}"- As senhas estão criptografadas com BCrypt no banco de dados
- Os valores de senha acima são as senhas originais antes da criptografia
- Use essas credenciais apenas para testes locais
Manoel Rabelo
💼 Desenvolvedor Back-End
📧 Projeto desenvolvido como desafio técnico demonstrando habilidades em:
- Java e Spring Boot
- Arquitetura em camadas
- APIs RESTful
- Autenticação JWT
- Banco de dados MySQL
- Consultas SQL otimizadas