const express = require('express'); const cors = require('cors'); const helmet = require('helmet'); const morgan = require('morgan'); const config = require('./config/environment'); const { pool } = require('./config/database'); const { errorHandler, notFoundHandler } = require('./middleware/errorHandler'); const { ensureAdminExists } = require('./utils/initAdmin'); // Import routes const participantRoutes = require('./routes/participant.routes'); const adminRoutes = require('./routes/admin.routes'); const lessonRoutes = require('./routes/lesson.routes'); // Initialize Express app const app = express(); // Security middleware app.use(helmet()); // CORS configuration app.use(cors({ origin: config.corsOrigin, credentials: true })); // Body parsing middleware app.use(express.json({ limit: '10mb' })); app.use(express.urlencoded({ extended: true, limit: '10mb' })); // Logging middleware if (config.nodeEnv === 'development') { app.use(morgan('dev')); } else { app.use(morgan('combined')); } // Health check endpoint app.get('/health', async (req, res) => { try { // Check database connection await pool.query('SELECT 1'); res.status(200).json({ status: 'healthy', timestamp: new Date().toISOString(), environment: config.nodeEnv, database: 'connected' }); } catch (error) { res.status(503).json({ status: 'unhealthy', timestamp: new Date().toISOString(), environment: config.nodeEnv, database: 'disconnected', error: error.message }); } }); // API routes app.get('/api', (req, res) => { res.json({ message: 'Security Awareness Learning Platform API', version: '1.0.0', endpoints: { participant: '/api/participant', admin: '/api/admin', lessons: '/api/lessons' } }); }); // Mount routes app.use('/api/participant', participantRoutes); app.use('/api/admin', adminRoutes); app.use('/api/lesson', lessonRoutes); // 404 handler app.use(notFoundHandler); // Error handling middleware app.use(errorHandler); // Initialize and start server const PORT = config.port; (async () => { try { // Ensure admin user exists before starting server await ensureAdminExists(); // Start server app.listen(PORT, () => { console.log(` ======================================== Security Awareness Learning Platform ======================================== Environment: ${config.nodeEnv} Server running on port: ${PORT} Database: ${config.database.host}:${config.database.port}/${config.database.name} ======================================== `); }); } catch (error) { console.error('Failed to start server:', error); process.exit(1); } })(); // Graceful shutdown process.on('SIGTERM', () => { console.log('SIGTERM signal received: closing HTTP server'); pool.end(() => { console.log('Database pool closed'); process.exit(0); }); }); module.exports = app;