- Backend migrado a estructura VPS (src/ subfolder) - Frontend con estructura Vite + React 19 + Tailwind - Configuración PostgreSQL con Pool - API service con interceptores JWT - Ambos servidores funcionando (backend:3001, frontend:5173)
OfertaWeb Backend
Backend API para tienda web multi-canal con integración a MercadoLibre, Instagram Shopping y BlueExpress.
📁 Estructura del Proyecto
backend/
├── server.js # Punto de entrada del servidor
├── package.json # Dependencias y scripts
├── .env # Variables de entorno
├── .gitignore # Archivos ignorados por git
├── src/ # Código fuente
│ ├── config/ # Configuraciones (DB, etc)
│ ├── controllers/ # Controladores de rutas
│ ├── middlewares/ # Middlewares (auth, validation, etc)
│ ├── models/ # Modelos de datos
│ ├── routes/ # Definición de rutas
│ ├── services/ # Lógica de negocio
│ └── utils/ # Utilidades (logger, helpers)
├── migrations/ # Migraciones de base de datos
├── scripts/ # Scripts de utilidad
├── public/ # Archivos públicos
│ └── uploads/ # Imágenes subidas
├── logs/ # Logs del servidor
└── tests/ # Tests unitarios e integración
🚀 Inicio Rápido
Requisitos Previos
- Node.js >= 18.x
- PostgreSQL >= 12
- npm o yarn
Instalación
- Instalar dependencias:
npm install
- Configurar variables de entorno:
cp .env.example .env
# Editar .env con tus credenciales
- Ejecutar migraciones:
psql -U postgres -d ofertaweb -f migrations/001_schema_completo.sql
psql -U postgres -d ofertaweb -f migrations/002_initial_data.sql
psql -U postgres -d ofertaweb -f migrations/003_create_admin_user.sql
psql -U postgres -d ofertaweb -f migrations/004_add_codigo_to_categories.sql
- Iniciar servidor:
# Desarrollo
npm run dev
# Producción
npm start
El servidor estará disponible en http://localhost:3001
📋 Variables de Entorno
# Puerto del servidor
PORT=3001
# Entorno
NODE_ENV=development
# Base de datos
DB_HOST=localhost
DB_PORT=5432
DB_NAME=ofertaweb
DB_USER=ofertaweb_user
DB_PASSWORD=tu_password
# JWT
JWT_SECRET=tu_clave_secreta
JWT_EXPIRES_IN=7d
# CORS
FRONTEND_URL=http://localhost:5173
ADMIN_URL=http://localhost:5174
🛣️ API Endpoints
Autenticación
POST /api/auth/login- Iniciar sesiónPOST /api/auth/register- Registrar usuarioGET /api/auth/me- Obtener usuario actual
Productos
GET /api/products- Listar productosGET /api/products/:id- Obtener productoPOST /api/products- Crear producto (admin)PUT /api/products/:id- Actualizar producto (admin)DELETE /api/products/:id- Eliminar producto (admin)
Categorías
GET /api/categories- Listar categoríasGET /api/categories/tree- Árbol de categoríasPOST /api/categories- Crear categoría (admin)PUT /api/categories/:id- Actualizar categoría (admin)
Inventario
GET /api/inventory/:productId- Ver inventarioPOST /api/inventory/adjust- Ajustar stock (admin)GET /api/inventory/movements/:productId- Historial de movimientos
Órdenes
GET /api/orders- Listar órdenesGET /api/orders/:id- Detalle de ordenPOST /api/orders- Crear ordenPATCH /api/orders/:id/status- Actualizar estado (admin)
Carrito
GET /api/cart- Ver carritoPOST /api/cart/items- Agregar productoPUT /api/cart/items/:productId- Actualizar cantidadDELETE /api/cart/items/:productId- Eliminar del carrito
Uploads
POST /api/upload/product/:productId- Subir imagen de productoDELETE /api/upload/image/:imageId- Eliminar imagen
🗄️ Base de Datos
Módulos
- Usuarios y Autenticación - users, user_addresses
- Catálogo - categories, products, product_images
- Multi-Canal - channels, channel_products
- Inventario - inventory, inventory_movements
- Carrito - carts, cart_items
- Órdenes - orders, order_items, order_status_history
- Pagos - payments
- Envíos - shipments
🔧 Scripts Disponibles
# Desarrollo con auto-reload
npm run dev
# Iniciar en producción
npm start
# Ejecutar tests
npm test
# Generar hash de contraseña
node scripts/generate_password_hash.js
📝 Logs
Los logs se almacenan en la carpeta logs/:
error.log- Solo errorescombined.log- Todos los logs
🔐 Seguridad
- Autenticación mediante JWT
- Contraseñas hasheadas con bcrypt
- Validación de datos con Joi
- Protección CORS configurada
- Rate limiting implementado
- SQL injection prevention con prepared statements
🚧 Desarrollo
Agregar nueva ruta
- Crear controlador en
src/controllers/ - Crear modelo en
src/models/(si aplica) - Definir ruta en
src/routes/ - Registrar en
server.js
Ejemplo:
// src/controllers/ejemploController.js
const db = require('../config/db');
exports.getEjemplo = async (req, res) => {
const result = await db.query('SELECT * FROM tabla');
res.json(result.rows);
};
// src/routes/ejemploRoutes.js
const router = require('express').Router();
const controller = require('../controllers/ejemploController');
router.get('/', controller.getEjemplo);
module.exports = router;
// server.js
const ejemploRoutes = require('./src/routes/ejemploRoutes');
app.use('/api/ejemplo', ejemploRoutes);
📦 Dependencias Principales
- express - Framework web
- pg - Cliente PostgreSQL
- jsonwebtoken - Autenticación JWT
- bcryptjs - Hash de contraseñas
- multer - Upload de archivos
- winston - Sistema de logs
- joi - Validación de datos
- cors - Configuración CORS
🤝 Contribuir
- Crear rama feature:
git checkout -b feature/nueva-funcionalidad - Hacer cambios y commit:
git commit -m 'Agregar nueva funcionalidad' - Push a la rama:
git push origin feature/nueva-funcionalidad - Crear Pull Request
📄 Licencia
ISC