medienkompetenz-lernplattform/backend/src/index.js
Marius Rometsch a439873394 Add lessons
2026-02-08 19:47:21 +01:00

120 lines
2.9 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');
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;