107 lines
2.6 KiB
JavaScript
107 lines
2.6 KiB
JavaScript
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');
|
|
|
|
// 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);
|
|
|
|
// Start server
|
|
const PORT = config.port;
|
|
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}
|
|
========================================
|
|
`);
|
|
});
|
|
|
|
// 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;
|