require('dotenv').config(); const express = require('express'); const cors = require('cors'); const morgan = require('morgan'); const compression = require('compression'); const fs = require('fs'); const path = require('path'); const { closeAllConnections } = require('./db/connection'); const app = express(); const PORT = process.env.ACOT_PORT || 3012; // Create logs directory if it doesn't exist const logDir = path.join(__dirname, 'logs/app'); if (!fs.existsSync(logDir)) { fs.mkdirSync(logDir, { recursive: true }); } // Create a write stream for access logs const accessLogStream = fs.createWriteStream( path.join(logDir, 'access.log'), { flags: 'a' } ); // Middleware app.use(compression()); app.use(cors()); app.use(express.json()); app.use(express.urlencoded({ extended: true })); // Logging middleware if (process.env.NODE_ENV === 'production') { app.use(morgan('combined', { stream: accessLogStream })); } else { app.use(morgan('dev')); } // Health check endpoint app.get('/health', (req, res) => { res.json({ status: 'healthy', service: 'acot-server', timestamp: new Date().toISOString(), uptime: process.uptime() }); }); // Routes app.use('/api/acot/test', require('./routes/test')); app.use('/api/acot/events', require('./routes/events')); // Error handling middleware app.use((err, req, res, next) => { console.error('Unhandled error:', err); res.status(500).json({ success: false, error: process.env.NODE_ENV === 'production' ? 'Internal server error' : err.message }); }); // 404 handler app.use((req, res) => { res.status(404).json({ success: false, error: 'Route not found' }); }); // Start server const server = app.listen(PORT, () => { console.log(`ACOT Server running on port ${PORT}`); console.log(`Environment: ${process.env.NODE_ENV}`); }); // Graceful shutdown const gracefulShutdown = async () => { console.log('SIGTERM signal received: closing HTTP server'); server.close(async () => { console.log('HTTP server closed'); // Close database connections try { await closeAllConnections(); console.log('Database connections closed'); } catch (error) { console.error('Error closing database connections:', error); } process.exit(0); }); }; process.on('SIGTERM', gracefulShutdown); process.on('SIGINT', gracefulShutdown); module.exports = app;