API REST profesional para la gestión de inventario con control de usuarios, roles y movimientos de stock. Diseñada con arquitectura escalable y buenas prácticas de backend.
- 🔐 Autenticación con JWT
- 👥 Control de roles (ADMIN, EDITOR, VIEWER)
- 📦 CRUD de productos
- 🔄 Movimientos de inventario (IN / OUT)
- ⚙️ Arquitectura modular (Controller, Service, Repository)
- 🧾 Validaciones con Zod
- 📘 Documentación con Swagger
- 🐳 Contenerización con Docker
- 🔁 Transacciones con Prisma para consistencia de datos
- Node.js
- Express
- TypeScript
- PostgreSQL
- Prisma ORM
- Zod
- JWT
- Swagger
- Docker
src/
├── modules/
├── middlewares/
├── config/
├── utils/
├── app.ts
Disponible en:
👉 http://localhost:3000/api/docs
git clone https://github.com/JacobPalomo/inventory-management-system
cd inventory-management-system
npm installEl sistema permite configurar valores iniciales mediante variables de entorno.
Puedes definir las credenciales del usuario administrador inicial:
ADMIN_EMAIL=admin@test.com
ADMIN_PASSWORD=123456Si no se especifican variables de entorno, el sistema utilizará:
- Email:
admin@test.com - Password:
123456
Ejecuta:
npx prisma db seedEsto creará el usuario administrador si no existe previamente.
El seeder es idempotente:
- No duplica usuarios
- Puede ejecutarse múltiples veces sin generar conflictos
NODE_ENV=development
DATABASE_URL=postgresql://user:password@localhost:5432/inventory_db
JWT_SECRET=supersecret
ADMIN_EMAIL=admin@test.com
ADMIN_PASSWORD=123456
NODE_ENV=production
DATABASE_URL=postgresql://user:password@db:5432/inventory_db
JWT_SECRET=supersecret
ADMIN_EMAIL=admin@test.com
ADMIN_PASSWORD=123456
| .env, uno para docker y otro para desarrollo local, para mantener configuraciones separadas y evitar conflictos. Existen dos archivos env: .env.example y .env.docker.example para facilitar la configuración inicial. Nótese que para la DATABASE_URL para docker se utiliza db como hostname, que es el nombre del servicio de base de datos definido en docker-compose.yml.
npm run devdocker-compose up --buildAl iniciar el contenedor, el sistema ejecuta:
- Migraciones de base de datos
- Seeder inicial
Se reitera que seeder es idempotente, por lo que:
- No genera duplicados
- No sobrescribe datos existentes
- Puede ejecutarse múltiples veces de forma segura
| El proceso de inicialización de datos se mantiene explícito para mayor control en entornos de desarrollo y producción.
| Método | Endpoint | Descripción |
|---|---|---|
| POST | /api/auth/login | Login |
| POST | /api/products | Crear producto |
| POST | /api/movements/in | Entrada |
| POST | /api/movements/out | Salida |
La API implementa limitación de solicitudes para prevenir abuso:
- Global: 100 requests / 15 minutos
- Auth: 5 intentos por minuto
- Movimientos: 20 operaciones por minuto
Esto ayuda a proteger contra ataques de fuerza bruta y uso excesivo del sistema.
El registro de usuarios ya no se realiza desde el módulo de autenticación.
Ahora, los usuarios son gestionados a través del módulo de usuarios, permitiendo un mayor control y alineación con roles administrativos.
POST /api/usersRequiere autenticación y permisos de administrador.
El sistema soporta dos flujos:
PATCH /api/users/me/passwordRequiere:
- contraseña actual
- nueva contraseña
PATCH /api/users/:id/passwordPermite cambiar la contraseña de cualquier usuario sin requerir la contraseña actual.
Este enfoque mejora la seguridad y el control de usuarios dentro del sistema, evitando registros abiertos y centralizando la gestión en usuarios con permisos adecuados.
El sistema incluye dos herramientas de documentación:
-
Swagger UI (documentación interactiva): 👉
/api/docs -
Redoc (documentación limpia): 👉
/docs
Desarrollado por Jacob Palomo.