Un sistema backend completo para e-commerce desarrollado con Node.js y arquitectura por capas, que incluye autenticación JWT, roles de usuario, gestión de productos, carrito de compras, generación de tickets para transacciones y sistema de mocking para datos de prueba.
Este proyecto implementa un backend robusto para plataformas de comercio electrónico siguiendo una arquitectura profesional por capas. El sistema gestiona productos, carritos de compra, usuarios con diferentes roles, proceso de checkout completo con generación de tickets y funcionalidades de mocking para facilitar el desarrollo y testing.
-
Autenticación y Autorización
- Sistema completo basado en JWT
- Roles de usuario (admin/usuario regular)
- Restricción de rutas según rol
- Recuperación de contraseña
-
Gestión de Productos
- CRUD completo de productos
- Filtrado y ordenamiento
- Paginación de resultados
- Categorización
-
Carrito de Compras
- Creación de carritos
- Añadir/quitar productos
- Modificar cantidades
- Proceso de compra con validación de stock
-
Sistema de Mocking ⭐ Nuevo
- Generación de usuarios mock con contraseñas hasheadas
- Generación de productos mock con datos realistas
- Inserción masiva de datos de prueba en MongoDB
- Integración completa con la arquitectura del proyecto
-
Tickets de Compra
- Generación de tickets con código único
- Cálculo de totales
- Registro de productos comprados
-
Funcionalidades Adicionales
- Envío de emails (confirmación de registro, compras, etc.)
- Manejo centralizado de errores
- Sistema de logging avanzado
El proyecto sigue una arquitectura por capas profesional:
└───src
├───config # Configuración (DB, passport, variables de entorno)
├───controllers # Controladores para manejar solicitudes HTTP
├───dao # Acceso a datos (modelos y DAOs)
│ ├───models # Esquemas de MongoDB
│ └───mongo # Implementaciones específicas para MongoDB
├───dto # Objetos de transferencia de datos
├───middlewares # Middleware para autenticación, autorización, etc.
├───repository # Patrón repositorio, abstracción de DAOs
├───routes # Definición de rutas (incluye mocks.router.js)
├───services # Lógica de negocio
└───utils # Utilidades (errores, logger, mocking.utils.js)
- Backend: Node.js, Express
- Base de Datos: MongoDB, Mongoose
- Autenticación: Passport.js, JWT
- Seguridad: bcrypt para hash de contraseñas
- Email: Nodemailer
- Tiempo Real: Socket.IO
- Mocking: @faker-js/faker ⭐ Nuevo
- Otros: dotenv para variables de entorno, express-validator para validaciones
- Node.js (v16 o superior)
- MongoDB (v5 o superior)
- npm (v8 o superior)
-
Clonar el repositorio:
git clone https://github.com/eugeniaarias16/Backend-III.git cd Backend-III
-
Instalar dependencias:
npm install
-
Configurar variables de entorno:
- Crear un archivo
.env
en la raíz del proyecto - Configurar credenciales de MongoDB y otras variables necesarias:
PORT=8080 MONGO_URI=tu_conexion_mongodb JWT_SECRET=tu_clave_secreta JWT_EXPIRES_IN=1h # Otras variables necesarias...
- Crear un archivo
-
Iniciar la aplicación:
npm run dev # Para desarrollo npm start # Para producción
POST /api/sessions/register
- Registro de usuarioPOST /api/sessions/login
- Inicio de sesiónGET /api/sessions/current
- Obtener usuario actualGET /api/sessions/logout
- Cerrar sesiónPOST /api/sessions/forgot-password
- Solicitar restauración de contraseñaPOST /api/sessions/reset-password
- Restablecer contraseña
GET /api/products
- Listar productos (con filtros, paginación)GET /api/products/:pid
- Obtener producto por IDPOST /api/products
- Crear producto (admin)PUT /api/products/:pid
- Actualizar producto (admin)DELETE /api/products/:pid
- Eliminar producto (admin)
POST /api/carts
- Crear carritoGET /api/carts/:cid
- Obtener carrito por IDPOST /api/carts/:cid/product/:pid
- Agregar producto al carritoPUT /api/carts/:cid
- Actualizar carrito completoPUT /api/carts/:cid/product/:pid
- Actualizar cantidad de productoDELETE /api/carts/:cid/product/:pid
- Eliminar producto del carritoDELETE /api/carts/:cid
- Vaciar carritoPOST /api/carts/:cid/purchase
- Finalizar compra y generar ticket
GET /api/mocks/mockingusers
- Generar 50 usuarios mock con contraseñas hasheadasGET /api/mocks/mockingproducts
- Generar productos mock (por defecto 50, personalizable con query paramcount
)POST /api/mocks/generateData
- Insertar usuarios y productos mock en MongoDB
curl -X GET http://localhost:8080/api/mocks/mockingusers
# Generar 50 productos (por defecto)
curl -X GET http://localhost:8080/api/mocks/mockingproducts
# Generar cantidad personalizada
curl -X GET http://localhost:8080/api/mocks/mockingproducts?count=20
curl -X POST http://localhost:8080/api/mocks/generateData \
-H "Content-Type: application/json" \
-d '{
"users": 10,
"products": 25
}'
curl -X POST http://localhost:8080/api/sessions/register \
-H "Content-Type: application/json" \
-d '{
"first_name": "Juan",
"last_name": "Pérez",
"email": "juan@ejemplo.com",
"age": 30,
"password": "contraseña123",
"role": "user"
}'
curl -X POST http://localhost:8080/api/sessions/login \
-H "Content-Type: application/json" \
-d '{
"email": "juan@ejemplo.com",
"password": "contraseña123"
}'
curl -X POST http://localhost:8080/api/products \
-H "Content-Type: application/json" \
-H "Cookie: authToken=tu-jwt-token" \
-d '{
"title": "Smartphone XYZ",
"description": "Último modelo con 128GB",
"price": 999.99,
"stock": 50,
"category": "electronics"
}'
- Contraseña: Todos los usuarios mock tienen la contraseña
coder123
(hasheada con bcrypt) - Roles: Distribución 50/50 entre
admin
yuser
- Datos: Nombres, apellidos y emails realistas generados con Faker.js
- Edad: Entre 18 y 80 años
- Carritos: Se crean automáticamente para cada usuario
- Categorías: Electronics, Clothing, Books, Home, Sports, Beauty, Toys, Automotive, Music, Health
- Precios: Rango realista entre $10 y $1000
- Stock: Entre 0 y 100 unidades
- Estado: 90% de productos activos
- Imágenes: URLs de placeholder realistas
El sistema implementa un manejo de errores centralizado con diferentes tipos de errores personalizados:
ValidationError
: Errores de validación de datos (400)AuthError
: Errores de autenticación (401)ForbiddenError
: Errores de permisos (403)NotFoundError
: Recursos no encontrados (404)ConflictError
: Conflictos con recursos existentes (409)
La aplicación está containerizada y disponible públicamente:
🐳 Imagen: eugeniaarias16/backend-ecommerce:latest
📍 DockerHub: https://hub.docker.com/r/eugeniaarias16/backend-ecommerce
docker run -p 8080:8080 eugeniaarias16/backend-ecommerce:latest
docker run -p 8080:8080 \
-e MONGODB_URI="tu-conexion-mongodb" \
-e JWT_SECRET="tu-clave-secreta" \
eugeniaarias16/backend-ecommerce:latest
docker run -p 8080:8080 --env-file .env eugeniaarias16/backend-ecommerce:latest
Si prefieres construir la imagen localmente:
# Clonar el repositorio
git clone https://github.com/eugeniaarias16/Backend-III.git
cd Backend-III
# Construir la imagen
docker build -t backend-ecommerce .
# Ejecutar
docker run -p 8080:8080 backend-ecommerce
- ✅ Imagen base: Node.js 18 Alpine Linux (optimizada)
- ✅ Usuario no-root: Ejecuta con usuario
nodejs
para seguridad - ✅ Puerto: 8080 (configurable con variable
PORT
) - ✅ Healthcheck: Verificación automática de estado
- ✅ Tamaño optimizado: Solo dependencias de producción
Una vez ejecutado el contenedor, la aplicación estará disponible en:
- API: http://localhost:8080
- Documentación: http://localhost:8080/api-docs
- Mocking: http://localhost:8080/api/mocks/mockingusers
npm test
- Tests unitarios: Controladores con mocks (cart.controller.test.js)
- Tests de integración: Sistema de mocking (purchase.test.js)
- Framework: Jest con ES modules
- Cobertura: 5 tests pasando exitosamente
tests/
├── cart.controller.test.js # Tests unitarios con mocks
└── purchase.test.js # Tests de integración
```iar en modo desarrollo con nodemon
npm start # Iniciar en modo producción
npm run lint # Ejecutar linter
npm run lint:fix # Corregir errores de linting automáticamente
Para probar la funcionalidad de mocking, se recomienda usar herramientas como Postman, Thunder Client o curl con los ejemplos proporcionados anteriormente.
- ✅ Sistema de mocking completo implementado
- ✅ Generación de usuarios y productos mock
- ✅ Inserción masiva de datos de prueba
- ✅ Integración con arquitectura existente
- ✅ Autenticación JWT completa
- ✅ CRUD de productos con roles
- ✅ Sistema de carritos y checkout
- ✅ Generación de tickets
- ✅ Envío de emails
- Crea un fork del repositorio
- Crea una rama para tu funcionalidad:
git checkout -b feature/nueva-funcionalidad
- Realiza tus cambios y haz commit:
git commit -m 'Añade nueva funcionalidad'
- Sube tus cambios:
git push origin feature/nueva-funcionalidad
- Envía un pull request
Este proyecto está licenciado bajo ISC License.
Eugenia M. Arias
Desarrollado como proyecto final para el curso de Backend de Coderhouse.
Este README se actualiza constantemente conforme se añaden nuevas funcionalidades al proyecto.