Proyecto A: Plataforma E-Commerce
Descripción
Desarrollar una API RESTful completa para una plataforma de comercio electrónico que permita la gestión de productos, usuarios, carrito y pedidos.
Funcionalidades Requeridas
1. Gestión de Usuarios
POST /api/auth/register - Registro
POST /api/auth/login - Inicio de sesión (devuelve JWT)
GET /api/users/me - Perfil de usuario
PUT /api/users/me - Modificar perfil
Entidad User:
- id, email, password, firstName, lastName
- role (CUSTOMER, ADMIN)
- createdAt, updatedAt
2. Catálogo de Productos
GET /api/products - Lista de productos (paginación)
GET /api/products/{id} - Detalle de un producto
GET /api/products/search - Búsqueda por nombre/categoría
POST /api/products - Crear producto (ADMIN)
PUT /api/products/{id} - Modificar producto (ADMIN)
DELETE /api/products/{id} - Eliminar producto (ADMIN)
Entidad Product:
- id, name, description, price, stock
- category (relación ManyToOne)
- imageUrl, active
Entidad Category:
- id, name, description
3. Carrito
GET /api/cart - Ver el carrito
POST /api/cart/items - Agregar un producto
PUT /api/cart/items/{id} - Modificar cantidad
DELETE /api/cart/items/{id} - Eliminar del carrito
DELETE /api/cart - Vaciar el carrito
Entidad CartItem:
- id, cart, product, quantity, price
4. Pedidos
POST /api/orders - Crear pedido (desde carrito)
GET /api/orders - Lista de pedidos (usuario)
GET /api/orders/{id} - Detalle del pedido
PUT /api/orders/{id}/status - Modificar estado (ADMIN)
GET /api/admin/orders - Todos los pedidos (ADMIN)
Entidad Order:
- id, user, items, totalAmount
- status (PENDING, CONFIRMED, SHIPPED, DELIVERED, CANCELLED)
- shippingAddress, createdAt
Esquema de Base de Datos
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
Reglas de Negocio
Stock
- Verificar la disponibilidad antes de agregar al carrito
- Disminuir el stock al realizar el pedido
- Restaurar el stock si el pedido es cancelado
Precio
- El precio en el carrito debe ser el vigente en ese momento
- El precio en el pedido queda fijo
Carrito
- Un usuario tiene un solo carrito
- El carrito se crea automáticamente
- El carrito se vacía después de un pedido
Pedidos
- Solo el usuario puede ver sus pedidos
- El administrador puede ver todos los pedidos
- Transiciones de estado válidas:
- PENDING -> CONFIRMED -> SHIPPED -> DELIVERED
- PENDING -> CANCELLED
- CONFIRMED -> CANCELLED
Endpoints Detallados
Autenticación
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
}
Productos
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
}
Carrito
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"
}
Pruebas Requeridas
Pruebas Unitarias
- ProductService: operaciones CRUD
- CartService: agregar, actualizar, eliminar ítems
- OrderService: crear pedido, validar stock
Pruebas de Integración
- ProductController: todos los endpoints
- CartController: operaciones de carrito
- OrderController: flujo de pedidos
Puntos Extra
| Funcionalidad | Puntos |
|---|---|
| Cache Redis en productos | +5 |
| Notificación por email (simulación) | +3 |
| Búsqueda full-text | +3 |
| Exportar pedidos a CSV | +2 |
| Docker Compose completo | +5 |
| Documentación Swagger | +5 |
Estimación de Tiempo
| Tarea | Horas |
|---|---|
| Configuración del proyecto y DB | 2 |
| Entidades y repositorios | 4 |
| Servicios de negocio | 6 |
| Controladores REST | 4 |
| Seguridad JWT | 4 |
| Pruebas | 6 |
| Documentación | 2 |
| Bonus | 4-8 |
| Total | 28-36 |