const express = require('express');
const cors = require('cors');
const morgan = require('morgan');
const { logger } = require('./utils/logger');
const routes = require('./routes');
const { notFound, errorHandler } = require('./middlewares/errorHandler');
const config = require('./config');
// Create Express app
const app = express();
const port = config.port;
// Middleware
app.use(cors({
origin: config.cors.origin
}));
app.use(express.json());
app.use(express.urlencoded({ extended: true }));
app.use(morgan(config.env === 'development' ? 'dev' : 'combined'));
// Routes
app.use('/api', routes);
// Health check endpoint
app.get('/health', (req, res) => {
res.status(200).json({
status: 'ok',
environment: config.env,
timestamp: new Date().toISOString()
});
});
// Error handling middleware
app.use(notFound);
app.use(errorHandler);
// Start server
app.listen(port, () => {
logger.info(`Server running on port ${port}`);
logger.info(`Environment: ${config.env}`);
});
// Handle unhandled promise rejections
process.on('unhandledRejection', (reason, promise) => {
logger.error('Unhandled Rejection at:', promise, 'reason:', reason);
});
// Handle uncaught exceptions
process.on('uncaughtException', (err) => {
logger.error('Uncaught Exception:', err);
// Give the logger time to log the error before exiting
setTimeout(() => {
process.exit(1);
}, 1000);
});
module.exports = app;