Files
wallabicher/web/backend/server.js
Omar Sánchez Pizarro cc6ffdc5a5 payments with stripe
Signed-off-by: Omar Sánchez Pizarro <omar.sanchez@pistacero.net>
2026-01-21 02:20:13 +01:00

91 lines
3.0 KiB
JavaScript

import express from 'express';
import cors from 'cors';
import { createServer } from 'http';
import { PATHS, SERVER } from './config/constants.js';
import { rateLimitMiddleware } from './middlewares/rateLimit.js';
import { initMongoDB } from './services/mongodb.js';
import { initVAPIDKeys } from './services/webPush.js';
import { initWebSocket } from './services/websocket.js';
import { startArticleMonitoring } from './services/articleMonitor.js';
import { initFileWatcher } from './services/fileWatcher.js';
import { initStripe } from './services/stripe.js';
import routes from './routes/index.js';
import workersRouter from './routes/workers.js';
import articlesRouter from './routes/articles.js';
import favoritesRouter from './routes/favorites.js';
import logsRouter from './routes/logs.js';
import configRouter from './routes/config.js';
import telegramRouter from './routes/telegram.js';
import pushRouter from './routes/push.js';
import usersRouter from './routes/users.js';
import adminRouter from './routes/admin.js';
import subscriptionRouter from './routes/subscription.js';
import paymentsRouter from './routes/payments.js';
const app = express();
const server = createServer(app);
// Configurar Express para confiar en proxies (necesario para obtener IP real)
app.set('trust proxy', true);
// Middlewares globales
app.use(cors());
// ⚠️ IMPORTANTE: Webhook de Stripe necesita el body RAW (sin parsear)
// Por eso usamos express.raw() SOLO para esta ruta, ANTES de express.json()
app.use('/api/payments/webhook', express.raw({ type: 'application/json' }));
// Ahora sí, parseamos JSON para todas las demás rutas
app.use(express.json());
// Aplicar rate limiting a todas las rutas API
app.use('/api', rateLimitMiddleware);
// Inicializar VAPID keys para Web Push
initVAPIDKeys();
// Inicializar Stripe
initStripe();
// Inicializar WebSocket
initWebSocket(server);
// Rutas API
app.use('/api', routes);
app.use('/api/workers', workersRouter);
app.use('/api/articles', articlesRouter);
app.use('/api/favorites', favoritesRouter);
app.use('/api/logs', logsRouter);
app.use('/api/config', configRouter);
app.use('/api/telegram', telegramRouter);
app.use('/api/push', pushRouter);
app.use('/api/users', usersRouter);
app.use('/api/admin', adminRouter);
app.use('/api/subscription', subscriptionRouter);
app.use('/api/payments', paymentsRouter);
// Inicializar servidor
async function startServer() {
try {
// Inicializar MongoDB
await initMongoDB();
// Iniciar monitoreo de artículos nuevos
await startArticleMonitoring();
// Inicializar file watcher
initFileWatcher();
// Iniciar servidor HTTP
server.listen(SERVER.PORT, () => {
console.log(`🚀 Servidor backend ejecutándose en http://localhost:${SERVER.PORT}`);
console.log(`📡 WebSocket disponible en ws://localhost:${SERVER.PORT}/ws`);
});
} catch (error) {
console.error('Error al iniciar el servidor:', error);
process.exit(1);
}
}
startServer().catch(console.error);