Este proyecto es un sistema de gestión de inventarios que permite a los usuarios gestionar productos, categorías, proveedores, clientes, compras y ventas. El backend está construido con Node.js, Express y Prisma ORM para interactuar con la base de datos.
- Clona el repositorio:
git clone https://github.com/danyrez/vaultify.git- Navega al directorio del proyecto:
cd gestor-inventario- Instala las dependencias:
pnpm install- Adicionalmente tambien usa el comando
npx prisma generate- Configura las variables de entorno: Crea un archivo .env en la raíz del proyecto y añade las siguientes variables:
DATABASE_URL="file:./dev.db"
PORT=3000
TOKEN_SECRET="supersecret@jwt-secret"
FRONTEND_URL="http://localhost:5173"- Ejecuta el comando de Prisma:
npx prisma generate- Inicia el servidor:
pnpm run dev- express: Framework web para Node.js que facilita la creación de aplicaciones web y APIs.
- prisma: ORM (Object-Relational Mapping) para Node.js y TypeScript que facilita la interacción con la base de datos.
- jsonwebtoken: Biblioteca para generar y verificar JSON Web Tokens (JWT) para autenticación.
- bcryptjs: Biblioteca para encriptar y comparar contraseñas de manera segura.
- cors: Middleware para habilitar CORS (Cross-Origin Resource Sharing) en aplicaciones Express.
- morgan: Middleware de registro de solicitudes HTTP para Node.js.
- zod: Biblioteca de validación y análisis de esquemas para TypeScript y JavaScript.
- nodemon: Herramienta que reinicia automáticamente la aplicación Node.js cuando se detectan cambios en el código fuente (usada en desarrollo).
- @prisma/client: Cliente de Prisma para interactuar con la base de datos.
- standart: Usada como linter de código.
src/
├── app.js
├── config/
│ ├── db.js
│ └── variables.js
├── controllers/
│ ├── auth.controller.js
│ ├── category.controller.js
│ ├── customer.controller.js
│ ├── product.controller.js
│ ├── purchase.controller.js
│ ├── purchaseDetail.controller.js
│ ├── sale.controller.js
│ ├── saleDetail.controller.js
│ └── supplier.controller.js
├── index.js
├── libs/
│ └── jwt.js
├── middlewares/
│ ├── validateToken.js
│ └── validator.middleware.js
├── routes/
│ ├── auth.routes.js
│ ├── category.routes.js
│ ├── customer.routes.js
│ ├── index.js
│ ├── product.routes.js
│ ├── purchase.routes.js
│ ├── purchaseDetail.routes.js
│ ├── sale.routes.js
│ ├── saleDetail.routes.js
│ ├── stats.routes.js
│ └── supplier.routes.js
└── schemas/
├── auth.schema.js
├── category.schema.js
├── product.schema.js
└── purchase.schema.js
- POST /api/auth/register
- Body:
{
"name": "user1",
"email": "user1@gmail.com",
"password": "user123"
}- POST /api/auth/login
- Body:¨
{
"email": "user1@gmail.com",
"password": "user123"
}- GET /api/auth/profile
- Headers: Authorization: Bearer
- POST /api/auth/logout
Obtener todas las categorías
- GET /api/categories
- POST /api/categories
- Body:
{
"name": "category1"
}- PUT /api/categories/:id
- Body:
{
"name": "Componentes"
}- DELETE /api/categories/:id
Obtener todos los productos
- GET /api/products
- POST /api/products
- Body:
{
"name": "Iphone 16",
"description": "Descripción del Iphone 16",
"price": 100,
"stock": 50,
"categoryId": 1
}- PUT /api/products/:id
- Body:
{
"name": "Laptop",
"description": "Laptop lenovo",
"price": 100,
"stock": 30,
"categoryId": 1
}DELETE /api/products/:id
Obtener todos los clientes
- GET /api/customers
- POST /api/customers
- Body:
{
"firstName": "customer1",
"lastName": "LastName1",
"email": "custormer1@gmail.com",
"phone": "123456789"
}- PUT /api/customers/:id
- Body:
{
"firstName": "customer1",
"lastName": "LastName1",
"email": "custormer1@gmail.com",
"phone": "123456789"
}- DELETE /api/customers/:id
Obtener todos los proveedores
- GET /api/suppliers
- POST /api/suppliers
- Body:
{
"name": "supplier1",
"email": "supplier1@gmail.com",
"phone": "123456789",
"address": "Dirección del proveedor"
}- PUT /api/suppliers/:id
- Body:
{
"name": "supplier1",
"email": "supplier1@gmail.com",
"phone": "123456789",
"address": "Dirección del proveedor"
}- DELETE /api/suppliers/:id
Obtener todas las compras
- GET /api/purchases
- POST /api/purchases
- Body:
{
"supplierId": 1,
"purchaseDate": "2024-10-25T00:00:00Z",
"purchaseDetails": [
{
"productId": 1,
"quantity": 3,
"price": 100
}
]
}- PUT /api/purchases/:id
- Body:
{
"supplierId": 1,
"purchaseDate": "2024-10-25T00:00:00Z",
"purchaseDetails": [
{
"productId": 1,
"quantity": 3,
"price": 100
}
]
}- DELETE /api/purchases/:id
Obtener todas las ventas
- GET /api/sales
- POST /api/sales
- Body:
{
"customerId": 1,
"saleDate": "2024-10-25T00:00:00Z",
"saleDetails": [
{
"productId": 1,
"quantity": 3,
"price": 100
}
]
}- PUT /api/sales/:id
- Body:
{
"customerId": 1,
"saleDate": "2024-10-25T00:00:00Z",
"saleDetails": [
{
"productId": 1,
"quantity": 3,
"price": 100
}
]
}- DELETE /api/sales/:id
- GET /api/stats
- Response:
{
"categoriesCount": 10,
"productsCount": 50,
"suppliersCount": 5,
"customersCount": 20,
"purchasesCount": 15,
"salesCount": 25
}