98 lines
2.4 KiB
JavaScript
98 lines
2.4 KiB
JavaScript
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;
|