Projeto A: Plataforma E-Commerce
Descrição
Desenvolva uma API RESTful completa para uma plataforma de comércio eletrônico permitindo a gestão de produtos, usuários, carrinho e pedidos.
Funcionalidades Requeridas
1. Gestão de Usuários
POST /api/auth/register - Cadastro
POST /api/auth/login - Login (retorna JWT)
GET /api/users/me - Perfil do usuário
PUT /api/users/me - Editar perfil
Entidade User:
- id, email, password, firstName, lastName
- role (CUSTOMER, ADMIN)
- createdAt, updatedAt
2. Catálogo de Produtos
GET /api/products - Lista de produtos (paginação)
GET /api/products/{id} - Detalhe de um produto
GET /api/products/search - Busca por nome/categoria
POST /api/products - Criar produto (ADMIN)
PUT /api/products/{id} - Editar produto (ADMIN)
DELETE /api/products/{id} - Remover produto (ADMIN)
Entidade Product:
- id, name, description, price, stock
- category (relação ManyToOne)
- imageUrl, active
Entidade Category:
- id, name, description
3. Carrinho
GET /api/cart - Ver carrinho
POST /api/cart/items - Adicionar produto
PUT /api/cart/items/{id} - Alterar quantidade
DELETE /api/cart/items/{id} - Remover do carrinho
DELETE /api/cart - Esvaziar carrinho
Entidade CartItem:
- id, cart, product, quantity, price
4. Pedidos
POST /api/orders - Criar pedido (a partir do carrinho)
GET /api/orders - Lista de pedidos (usuário)
GET /api/orders/{id} - Detalhe do pedido
PUT /api/orders/{id}/status - Alterar status (ADMIN)
GET /api/admin/orders - Todos os pedidos (ADMIN)
Entidade Order:
- id, user, items, totalAmount
- status (PENDING, CONFIRMED, SHIPPED, DELIVERED, CANCELLED)
- shippingAddress, createdAt
Esquema do Banco de Dados
users
├── id (PK)
├── email (UNIQUE)
├── password
├── first_name
├── last_name
├── role
└── created_at
categories
├── id (PK)
├── name
└── description
products
├── id (PK)
├── name
├── description
├── price
├── stock
├── category_id (FK)
├── image_url
└── active
carts
├── id (PK)
└── user_id (FK, UNIQUE)
cart_items
├── id (PK)
├── cart_id (FK)
├── product_id (FK)
├── quantity
└── price
orders
├── id (PK)
├── user_id (FK)
├── total_amount
├── status
├── shipping_address
└── created_at
order_items
├── id (PK)
├── order_id (FK)
├── product_id (FK)
├── quantity
├── price
└── product_name
Regras de Negócio
Estoque
- Verificar disponibilidade antes de adicionar ao carrinho
- Decrementar o estoque ao criar pedido
- Restaurar o estoque se o pedido for cancelado
Preço
- O preço no carrinho deve ser o atual
- O preço no pedido é fixado
Carrinho
- Um usuário possui apenas um carrinho
- O carrinho é criado automaticamente
- O carrinho é esvaziado após um pedido
Pedidos
- Apenas o usuário pode ver seus pedidos
- Admin pode ver todos os pedidos
- Transições de status válidas:
- PENDING -> CONFIRMED -> SHIPPED -> DELIVERED
- PENDING -> CANCELLED
- CONFIRMED -> CANCELLED
Endpoints Detalhados
Autenticação
POST /api/auth/register
Content-Type: application/json
{
"email": "john@example.com",
"password": "Password123!",
"firstName": "John",
"lastName": "Doe"
}
Response 201:
{
"id": 1,
"email": "john@example.com",
"firstName": "John",
"lastName": "Doe",
"role": "CUSTOMER"
}
POST /api/auth/login
Content-Type: application/json
{
"email": "john@example.com",
"password": "Password123!"
}
Response 200:
{
"token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...",
"type": "Bearer",
"expiresIn": 86400
}
Produtos
GET /api/products?page=0&size=10&category=electronics
Authorization: Bearer <token>
Response 200:
{
"content": [
{
"id": 1,
"name": "Laptop Pro",
"description": "High-performance laptop",
"price": 999.99,
"stock": 50,
"category": {
"id": 1,
"name": "Electronics"
},
"imageUrl": "https://..."
}
],
"page": 0,
"size": 10,
"totalElements": 100,
"totalPages": 10
}
Carrinho
POST /api/cart/items
Authorization: Bearer <token>
Content-Type: application/json
{
"productId": 1,
"quantity": 2
}
Response 200:
{
"items": [
{
"id": 1,
"product": { "id": 1, "name": "Laptop Pro", ... },
"quantity": 2,
"price": 999.99,
"subtotal": 1999.98
}
],
"totalItems": 2,
"totalAmount": 1999.98
}
Pedidos
POST /api/orders
Authorization: Bearer <token>
Content-Type: application/json
{
"shippingAddress": "123 Main St, City, 12345"
}
Response 201:
{
"id": 1,
"status": "PENDING",
"items": [...],
"totalAmount": 1999.98,
"shippingAddress": "123 Main St, City, 12345",
"createdAt": "2024-01-15T10:30:00"
}
Testes Requeridos
Testes Unitários
- ProductService: operações CRUD
- CartService: adicionar, atualizar, remover itens
- OrderService: criar pedido, validar estoque
Testes de Integração
- ProductController: todos os endpoints
- CartController: operações do carrinho
- OrderController: fluxo de pedidos
Pontos Bônus
| Funcionalidade | Pontos |
|---|---|
| Cache Redis nos produtos | +5 |
| Notificação por email (simulação) | +3 |
| Busca full-text | +3 |
| Exportar pedidos CSV | +2 |
| Docker Compose completo | +5 |
| Documentação Swagger | +5 |
Estimativa de Tempo
| Tarefa | Horas |
|---|---|
| Setup do projeto e DB | 2 |
| Entidades e repositórios | 4 |
| Serviços de negócio | 6 |
| Controllers REST | 4 |
| Segurança JWT | 4 |
| Testes | 6 |
| Documentação | 2 |
| Bônus | 4-8 |
| Total | 28-36 |