Skip to content

jorgezabbaram/PRODUCTS-ORDERS

Repository files navigation

Products & Orders API

API REST desarrollada con NestJS, MongoDB y JWT para gestión de productos y órdenes.

🚀 Características

  • Framework: NestJS con TypeScript
  • Base de Datos: MongoDB con Mongoose
  • Autenticación: JWT (JSON Web Tokens)
  • Validación: Class-validator y validaciones de dominio completas
  • Documentación: Swagger/OpenAPI completamente configurado
  • Testing: Jest con tests de integración usando Testcontainers
  • Containerización: Docker y Docker Compose completamente configurados
  • Arquitectura: Clean Architecture con Domain-Driven Design
  • Subida de Archivos: Multer configurado para imágenes de productos
  • Manejo de Errores: Filtros globales y excepciones personalizadas

📋 Requisitos Implementados

Modelos de Datos

Product

  • name: Nombre del producto
  • sku: Código único del producto
  • picture: Imagen del producto (subida de archivos)
  • price: Precio del producto

Order

  • id: Identificador único
  • clientName: Nombre del cliente
  • total: Total de la orden
  • products: Lista de productos con cantidades

Endpoints

Productos

  • POST /products - Crear producto
  • GET /products - Listar todos los productos
  • GET /products/:id - Obtener producto por ID
  • PUT /products/:id - Actualizar producto
  • DELETE /products/:id - Eliminar producto
  • GET /products/search - Buscar productos con:
    • Paginación (page, limit)
    • Ordenamiento (sortBy, sortOrder)
    • Filtros exactos (sku)
    • Búsqueda por criterios (name, minPrice, maxPrice)

Órdenes

  • POST /orders - Crear orden
  • GET /orders - Listar todas las órdenes
  • GET /orders/:id - Obtener orden por ID
  • PUT /orders/:id - Actualizar orden
  • DELETE /orders/:id - Eliminar orden
  • GET /orders/stats/total-last-month - Total vendido último mes
  • GET /orders/stats/highest-order - Orden con mayor monto

Autenticación

  • POST /auth/register - Registrar usuario
  • POST /auth/login - Iniciar sesión (retorna JWT)

🛠️ Instalación y Configuración

Prerrequisitos

  • Node.js 18+
  • Docker y Docker Compose
  • MongoDB (opcional si usas Docker)

Instalación

  1. Clonar repositorio
git clone <repository-url>
cd PRODUCTS
  1. Instalar dependencias
npm install
  1. Configurar variables de entorno
# Crear archivo .env (opcional, usa valores por defecto)
MONGODB_URI=mongodb://localhost:27017/products_db
JWT_SECRET=your-secret-key-here
JWT_EXPIRES_IN=24h
PORT=3000

🐳 Ejecución con Docker

Opción 1: Solo MongoDB

docker-compose up mongodb
npm run start:dev

Opción 2: Aplicación completa

docker-compose up

💻 Ejecución Local

# Desarrollo
npm run start:dev

# Producción
npm run build
npm run start:prod

🧪 Testing

Tests de Integración

# Todos los tests
npm run test:integration

# Solo autenticación
npm run test:integration:auth

# Solo aplicación completa
npm run test:integration:full-app

# Con cobertura
npm run test:integration:cov

# Modo watch
npm run test:integration:watch

Tests Unitarios

npm run test
npm run test:watch
npm run test:cov

📚 Documentación API

Una vez ejecutada la aplicación, accede a:

Autenticación

  1. Registrar usuario:
POST /auth/register
{
  "username": "usuario",
  "password": "password123"
}
  1. Iniciar sesión:
POST /auth/login
{
  "username": "usuario", 
  "password": "password123"
}
  1. Usar token: Incluir en headers:
Authorization: Bearer <token>

Ejemplos de Uso

Crear Producto

POST /products
Authorization: Bearer <token>
Content-Type: multipart/form-data

name: "Laptop Gaming"
sku: "LAP-001"
price: 1299.99
picture: [archivo]

Listar Todos los Productos

GET /products
Authorization: Bearer <token>

Buscar Productos

GET /products/search?page=1&limit=10&sortBy=price&sortOrder=desc&name=laptop&minPrice=1000
Authorization: Bearer <token>

Listar Todas las Órdenes

GET /orders
Authorization: Bearer <token>

Crear Orden

POST /orders
Authorization: Bearer <token>
{
  "clientName": "Juan Pérez",
  "products": [
    {
      "productId": "64f8a1b2c3d4e5f6a7b8c9d0",
      "quantity": 2
    }
  ]
}

🏗️ Arquitectura

src/
├── common/           # Filtros, guards, excepciones
├── config/          # Configuración de la aplicación
├── domain/          # Entidades de dominio
│   └── entities/    # Product, Order, User, OrderItem
├── modules/         # Módulos de la aplicación
│   ├── auth/        # Autenticación JWT
│   ├── products/    # Gestión de productos
│   └── orders/      # Gestión de órdenes
├── app.module.ts    # Módulo principal
└── main.ts         # Punto de entrada

test/               # Tests de integración
├── auth.integration-spec.ts
├── full-app.integration-spec.ts
└── database-setup.ts

🔧 Scripts Disponibles

npm run build          # Compilar aplicación
npm run start          # Ejecutar en producción
npm run start:dev      # Ejecutar en desarrollo
npm run start:debug    # Ejecutar con debug
npm run lint           # Linter
npm run format         # Formatear código
npm run test           # Tests unitarios
npm run test:integration # Tests de integración

🐛 Troubleshooting

Error de conexión MongoDB

  • Verificar que MongoDB esté ejecutándose
  • Revisar URI de conexión en variables de entorno

Error de autenticación

  • Verificar que el token JWT sea válido
  • Comprobar que el header Authorization esté presente

Error en tests

  • Asegurar que Docker esté ejecutándose
  • Verificar que no haya otros procesos usando los puertos

📝 Notas Técnicas

  • Validaciones: Implementadas tanto a nivel de dominio como de DTO
  • Manejo de Errores: Filtro global con excepciones personalizadas
  • Subida de Archivos: Multer para imágenes de productos
  • Tests: Testcontainers para MongoDB en tests de integración
  • Seguridad: Validación de JWT en rutas protegidas

🤝 Contribución

  1. Fork del proyecto
  2. Crear rama feature (git checkout -b feature/nueva-funcionalidad)
  3. Commit cambios (git commit -am 'Agregar nueva funcionalidad')
  4. Push a la rama (git push origin feature/nueva-funcionalidad)
  5. Crear Pull Request

About

No description, website, or topics provided.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors