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 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'; 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()); app.use(express.json()); // Aplicar rate limiting a todas las rutas API app.use('/api', rateLimitMiddleware); // Inicializar VAPID keys para Web Push initVAPIDKeys(); // 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); // 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);