Saltar al contenido principal

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​

FuncionalidadPuntos
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​

TareaHoras
Configuración del proyecto y DB2
Entidades y repositorios4
Servicios de negocio6
Controladores REST4
Seguridad JWT4
Pruebas6
Documentación2
Bonus4-8
Total28-36

Volver al Proyecto Final