index.js•2.54 kB
const express = require('express');
const mongoose = require('mongoose');
const cors = require('cors');
const helmet = require('helmet');
const compression = require('compression');
const morgan = require('morgan');
const rateLimit = require('express-rate-limit');
const { logger } = require('./utils/logger');
const config = require('./config/config');
// Import routes
const authRoutes = require('./routes/auth.routes');
const contextRoutes = require('./routes/context.routes');
const integrationRoutes = require('./routes/integration.routes');
const userRoutes = require('./routes/user.routes');
// Initialize express app
const app = express();
// Apply middleware
app.use(helmet()); // Security headers
app.use(compression()); // Compress responses
app.use(cors()); // Enable CORS
app.use(express.json()); // Parse JSON bodies
app.use(express.urlencoded({ extended: true })); // Parse URL-encoded bodies
app.use(morgan('combined', { stream: { write: message => logger.info(message.trim()) } }));
// Apply rate limiting
const limiter = rateLimit({
windowMs: 15 * 60 * 1000, // 15 minutes
max: 100, // Limit each IP to 100 requests per windowMs
standardHeaders: true,
legacyHeaders: false,
});
app.use(limiter);
// Health check endpoint
app.get('/health', (req, res) => {
res.status(200).json({ status: 'healthy', timestamp: new Date() });
});
// API routes
app.use('/api/auth', authRoutes);
app.use('/api/context', contextRoutes);
app.use('/api/integration', integrationRoutes);
app.use('/api/users', userRoutes);
// Error handling middleware
app.use((err, req, res, next) => {
logger.error(err.stack);
res.status(err.status || 500).json({
message: err.message || 'An unexpected error occurred',
error: process.env.NODE_ENV === 'development' ? err : {}
});
});
// Connect to MongoDB and start server
const startServer = async () => {
try {
await mongoose.connect(config.database.uri, {
useNewUrlParser: true,
useUnifiedTopology: true,
});
logger.info('Connected to MongoDB');
const PORT = config.server.port || 5000;
app.listen(PORT, () => {
logger.info(`Server running on port ${PORT}`);
});
} catch (error) {
logger.error('Failed to connect to MongoDB', error);
process.exit(1);
}
};
startServer();
// Handle unhandled promise rejections
process.on('unhandledRejection', (err) => {
logger.error('Unhandled Promise Rejection:', err);
// Close server & exit process
process.exit(1);
});
module.exports = app; // Export for testing