require('dotenv').config({ path: require('path').join(__dirname, '..', '.env') }); const express = require('express'); const session = require('express-session'); const helmet = require('helmet'); const compression = require('compression'); const path = require('path'); const fs = require('fs'); const { initDb } = require('./db'); const publicRoutes = require('./routes/public'); const adminRoutes = require('./routes/admin'); const cron = require('node-cron'); const app = express(); const PORT = process.env.PORT || 3000; // Initialisation BDD initDb(); // Middlewares app.use(helmet({ contentSecurityPolicy: false, // simple pour ce projet })); app.use(compression()); app.use(express.json()); app.use(express.urlencoded({ extended: true })); app.use(express.static(path.join(__dirname, 'static'))); app.use(session({ secret: process.env.SESSION_SECRET || 'dev-secret-change-me', resave: false, saveUninitialized: false, cookie: { secure: false, httpOnly: true, sameSite: 'lax', maxAge: 24 * 60 * 60 * 1000 // 24h } })); // Vues app.set('view engine', 'ejs'); app.set('views', path.join(__dirname, 'templates')); // Routes app.use('/', publicRoutes); app.use('/admin', adminRoutes); // Démarrage du collecteur automatique if (process.env.NODE_ENV !== 'test') { const interval = parseInt(process.env.COLLECT_INTERVAL || '60'); // Lancer toutes les X minutes cron.schedule(`*/${interval} * * * *`, () => { console.log('[CRON] Lancement de la collecte automatique...'); const { collect } = require('../collector/index'); collect().catch(err => console.error('[CRON] Erreur collecte:', err.message)); }); // Lancer une première collecte au démarrage après 5 secondes setTimeout(() => { console.log('[STARTUP] Première collecte...'); const { collect } = require('../collector/index'); collect().catch(err => console.error('[STARTUP] Erreur collecte:', err.message)); }, 5000); } app.listen(PORT, () => { console.log(`Serveur démarré sur http://localhost:${PORT}`); console.log(`Admin: http://localhost:${PORT}/admin`); });