Skip to content

Latest commit

 

History

2 Commits

Folders and files

NameName
Last commit message
Last commit date
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

🏪 Sistema de Inventario con Express, TypeScript y Prisma

Un sistema completo de gestión de inventario construido con Express.js, TypeScript, Prisma ORM y PostgreSQL. Incluye autenticación JWT, roles de usuario y un CRUD completo para inventarios y artículos.

🚀 Características

  • 🔐 Autenticación JWT: Sistema de login/registro con tokens JWT
  • 👥 Roles de Usuario: ADMIN, MANAGER, USER con diferentes permisos
  • 📦 Gestión de Inventarios: CRUD completo para inventarios
  • 📋 Gestión de Artículos: CRUD completo para artículos con control de stock
  • 🔗 Relación Maestro-Esclavo: Inventarios (maestro) → Artículos (esclavos)
  • 📊 Estadísticas: Dashboard con métricas de inventario
  • 🔍 Filtros Avanzados: Búsqueda, paginación y filtros por categoría, marca, etc.
  • 🛡️ Seguridad: Helmet, CORS, validación de datos
  • 📝 TypeScript: Código completamente tipado
  • 🗄️ PostgreSQL: Base de datos robusta con Prisma ORM

🛠️ Tecnologías Utilizadas

  • Backend: Express.js, TypeScript
  • Base de Datos: PostgreSQL
  • ORM: Prisma
  • Autenticación: JWT, bcryptjs
  • Seguridad: Helmet, CORS
  • Validación: express-validator

📋 Requisitos Previos

  • Node.js (v16 o superior)
  • PostgreSQL
  • npm o yarn

🚀 Instalación

  1. Clonar el repositorio
git clone <tu-repositorio>
cd node-practices
  1. Instalar dependencias
npm install
  1. Configurar variables de entorno Crea un archivo .env en la raíz del proyecto:
# Database
DATABASE_URL="postgresql://postgres:password@localhost:5432/inventory_db"

# JWT
JWT_SECRET="tu_super_secreto_jwt_muy_seguro_2024"
JWT_EXPIRES_IN="24h"

# Server
PORT=3000
NODE_ENV=development
  1. Configurar la base de datos
# Generar el cliente de Prisma
npm run prisma:generate

# Crear las migraciones y aplicar a la base de datos
npm run prisma:migrate

# Poblar la base de datos con datos de ejemplo
npm run prisma:seed
  1. Iniciar el servidor
# Modo desarrollo
npm run dev

# Modo producción
npm run build
npm start

📊 Estructura de la Base de Datos

Modelos Principales

Usuario (User)

  • id: Identificador único
  • email: Email único del usuario
  • password: Contraseña encriptada
  • name: Nombre del usuario
  • role: Rol (ADMIN, MANAGER, USER)
  • createdAt, updatedAt: Timestamps

Inventario (Inventory) - MAESTRO

  • id: Identificador único
  • name: Nombre del inventario
  • description: Descripción opcional
  • location: Ubicación física
  • status: Estado (ACTIVE, INACTIVE, MAINTENANCE, ARCHIVED)
  • userId: Propietario del inventario
  • createdAt, updatedAt: Timestamps

Artículo (Article) - ESCLAVO

  • id: Identificador único
  • name: Nombre del artículo
  • sku: Código SKU único
  • barcode: Código de barras opcional
  • category: Categoría del artículo
  • brand, model: Marca y modelo
  • unit: Unidad de medida (PIEZA, CAJA, etc.)
  • price, cost: Precio de venta y costo
  • stock, minStock, maxStock: Control de inventario
  • weight, dimensions: Características físicas
  • color, material: Características adicionales
  • supplier, supplierCode: Información del proveedor
  • notes: Notas adicionales
  • status: Estado (ACTIVE, INACTIVE, DISCONTINUED, OUT_OF_STOCK)
  • inventoryId: Inventario al que pertenece
  • createdAt, updatedAt: Timestamps

🔐 Autenticación y Autorización

Roles de Usuario

  • ADMIN: Acceso completo a todos los recursos
  • MANAGER: Puede gestionar inventarios y artículos
  • USER: Solo puede ver y gestionar sus propios inventarios

Endpoints de Autenticación

# Registrar usuario
POST /api/auth/register
{
  "email": "user@example.com",
  "password": "password123",
  "name": "Usuario Ejemplo",
  "role": "USER"
}

# Iniciar sesión
POST /api/auth/login
{
  "email": "user@example.com",
  "password": "password123"
}

# Obtener perfil
GET /api/auth/profile
Authorization: Bearer <token>

# Cambiar contraseña
PUT /api/auth/change-password
Authorization: Bearer <token>
{
  "currentPassword": "password123",
  "newPassword": "newpassword123"
}

📦 API de Inventarios

Endpoints

# Crear inventario
POST /api/inventories
Authorization: Bearer <token>
{
  "name": "Almacén Principal",
  "description": "Almacén principal de la empresa",
  "location": "Edificio A, Nivel 1",
  "status": "ACTIVE"
}

# Obtener inventarios (con filtros)
GET /api/inventories?page=1&limit=10&status=ACTIVE&search=almacén

# Obtener inventario por ID
GET /api/inventories/:id

# Actualizar inventario
PUT /api/inventories/:id
Authorization: Bearer <token>
{
  "name": "Almacén Actualizado",
  "description": "Nueva descripción"
}

# Eliminar inventario
DELETE /api/inventories/:id
Authorization: Bearer <token>

# Obtener estadísticas
GET /api/inventories/stats
Authorization: Bearer <token>

📋 API de Artículos

Endpoints

# Crear artículo
POST /api/articles
Authorization: Bearer <token>
{
  "name": "Laptop Dell XPS 13",
  "description": "Laptop de alta gama",
  "sku": "LAP-DELL-XPS13-001",
  "category": "Electrónicos",
  "brand": "Dell",
  "model": "XPS 13",
  "price": 1299.99,
  "cost": 1100.00,
  "stock": 15,
  "minStock": 5,
  "maxStock": 50,
  "inventoryId": "inventory_id_here"
}

# Obtener artículos (con filtros)
GET /api/articles?page=1&limit=10&category=Electrónicos&brand=Dell&inStock=true

# Obtener artículo por ID
GET /api/articles/:id

# Actualizar artículo
PUT /api/articles/:id
Authorization: Bearer <token>
{
  "price": 1199.99,
  "stock": 20
}

# Eliminar artículo
DELETE /api/articles/:id
Authorization: Bearer <token>

# Actualizar stock
PATCH /api/articles/:id/stock
Authorization: Bearer <token>
{
  "quantity": 5,
  "operation": "add" // "add", "subtract", "set"
}

# Obtener estadísticas
GET /api/articles/stats
Authorization: Bearer <token>

🔍 Filtros y Búsqueda

Inventarios

  • page: Número de página
  • limit: Elementos por página
  • status: Filtrar por estado
  • search: Búsqueda en nombre, descripción y ubicación

Artículos

  • page: Número de página
  • limit: Elementos por página
  • category: Filtrar por categoría
  • brand: Filtrar por marca
  • status: Filtrar por estado
  • inventoryId: Filtrar por inventario
  • search: Búsqueda en nombre, descripción, SKU y código de barras
  • minPrice, maxPrice: Rango de precios
  • inStock: Solo artículos con stock > 0

📊 Datos de Ejemplo

El sistema incluye datos de ejemplo con:

Usuarios

Inventarios

  • Almacén Principal (ADMIN)
  • Inventario de Oficina (MANAGER)
  • Inventario de Mantenimiento (USER)

Artículos

  • Laptops, monitores, teclados (Electrónicos)
  • Papel, bolígrafos (Papelería)
  • Herramientas, taladros (Herramientas)

🛠️ Scripts Disponibles

# Desarrollo
npm run dev          # Iniciar servidor en modo desarrollo

# Producción
npm run build        # Compilar TypeScript
npm start           # Iniciar servidor en modo producción

# Base de datos
npm run prisma:generate    # Generar cliente Prisma
npm run prisma:migrate     # Ejecutar migraciones
npm run prisma:seed        # Poblar base de datos
npm run prisma:studio      # Abrir Prisma Studio

🔧 Configuración de Desarrollo

Estructura del Proyecto

src/
├── controllers/     # Controladores de la API
├── middleware/      # Middlewares (auth, validación)
├── routes/          # Definición de rutas
├── types/           # Tipos TypeScript
└── index.ts         # Archivo principal

Variables de Entorno

DATABASE_URL="postgresql://usuario:password@localhost:5432/nombre_db"
JWT_SECRET="tu_secreto_jwt"
JWT_EXPIRES_IN="24h"
PORT=3000
NODE_ENV=development

🧪 Testing

Para probar la API, puedes usar herramientas como:

  • Postman
  • Insomnia
  • curl

Ejemplo con curl

# Login
curl -X POST http://localhost:3000/api/auth/login \
  -H "Content-Type: application/json" \
  -d '{"email":"admin@inventory.com","password":"password123"}'

# Obtener inventarios (con token)
curl -X GET http://localhost:3000/api/inventories \
  -H "Authorization: Bearer <token>"

🚀 Despliegue

Requisitos de Producción

  • Node.js 16+
  • PostgreSQL 12+
  • Variables de entorno configuradas
  • Base de datos migrada y poblada

Pasos de Despliegue

  1. Configurar variables de entorno de producción
  2. Ejecutar npm run build
  3. Ejecutar npm run prisma:migrate
  4. Iniciar con npm start

📝 Licencia

Este proyecto está bajo la Licencia ISC.

🤝 Contribución

  1. Fork el proyecto
  2. Crea una rama para tu feature (git checkout -b feature/AmazingFeature)
  3. Commit tus cambios (git commit -m 'Add some AmazingFeature')
  4. Push a la rama (git push origin feature/AmazingFeature)
  5. Abre un Pull Request

📞 Soporte

Si tienes alguna pregunta o problema, por favor abre un issue en el repositorio.

About

Proyecto para practicar NodeJs

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages