- 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)
230 lines
5.9 KiB
Markdown
230 lines
5.9 KiB
Markdown
# 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
|
|
|
|
1. **Instalar dependencias:**
|
|
```bash
|
|
npm install
|
|
```
|
|
|
|
2. **Configurar variables de entorno:**
|
|
```bash
|
|
cp .env.example .env
|
|
# Editar .env con tus credenciales
|
|
```
|
|
|
|
3. **Ejecutar migraciones:**
|
|
```bash
|
|
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
|
|
```
|
|
|
|
4. **Iniciar servidor:**
|
|
```bash
|
|
# Desarrollo
|
|
npm run dev
|
|
|
|
# Producción
|
|
npm start
|
|
```
|
|
|
|
El servidor estará disponible en `http://localhost:3001`
|
|
|
|
## 📋 Variables de Entorno
|
|
|
|
```env
|
|
# 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ón
|
|
- `POST /api/auth/register` - Registrar usuario
|
|
- `GET /api/auth/me` - Obtener usuario actual
|
|
|
|
### Productos
|
|
- `GET /api/products` - Listar productos
|
|
- `GET /api/products/:id` - Obtener producto
|
|
- `POST /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ías
|
|
- `GET /api/categories/tree` - Árbol de categorías
|
|
- `POST /api/categories` - Crear categoría (admin)
|
|
- `PUT /api/categories/:id` - Actualizar categoría (admin)
|
|
|
|
### Inventario
|
|
- `GET /api/inventory/:productId` - Ver inventario
|
|
- `POST /api/inventory/adjust` - Ajustar stock (admin)
|
|
- `GET /api/inventory/movements/:productId` - Historial de movimientos
|
|
|
|
### Órdenes
|
|
- `GET /api/orders` - Listar órdenes
|
|
- `GET /api/orders/:id` - Detalle de orden
|
|
- `POST /api/orders` - Crear orden
|
|
- `PATCH /api/orders/:id/status` - Actualizar estado (admin)
|
|
|
|
### Carrito
|
|
- `GET /api/cart` - Ver carrito
|
|
- `POST /api/cart/items` - Agregar producto
|
|
- `PUT /api/cart/items/:productId` - Actualizar cantidad
|
|
- `DELETE /api/cart/items/:productId` - Eliminar del carrito
|
|
|
|
### Uploads
|
|
- `POST /api/upload/product/:productId` - Subir imagen de producto
|
|
- `DELETE /api/upload/image/:imageId` - Eliminar imagen
|
|
|
|
## 🗄️ Base de Datos
|
|
|
|
### Módulos
|
|
1. **Usuarios y Autenticación** - users, user_addresses
|
|
2. **Catálogo** - categories, products, product_images
|
|
3. **Multi-Canal** - channels, channel_products
|
|
4. **Inventario** - inventory, inventory_movements
|
|
5. **Carrito** - carts, cart_items
|
|
6. **Órdenes** - orders, order_items, order_status_history
|
|
7. **Pagos** - payments
|
|
8. **Envíos** - shipments
|
|
|
|
## 🔧 Scripts Disponibles
|
|
|
|
```bash
|
|
# 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 errores
|
|
- `combined.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
|
|
|
|
1. Crear controlador en `src/controllers/`
|
|
2. Crear modelo en `src/models/` (si aplica)
|
|
3. Definir ruta en `src/routes/`
|
|
4. Registrar en `server.js`
|
|
|
|
### Ejemplo:
|
|
```javascript
|
|
// 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
|
|
|
|
1. Crear rama feature: `git checkout -b feature/nueva-funcionalidad`
|
|
2. Hacer cambios y commit: `git commit -m 'Agregar nueva funcionalidad'`
|
|
3. Push a la rama: `git push origin feature/nueva-funcionalidad`
|
|
4. Crear Pull Request
|
|
|
|
## 📄 Licencia
|
|
|
|
ISC
|