const express = require('express'); const cors = require('cors'); const helmet = require('helmet'); const compression = require('compression'); const morgan = require('morgan'); const path = require('path'); require('dotenv').config(); const { sequelize } = require('./config/database'); const logger = require('./utils/logger'); //const rateLimiter = require('./middleware/rateLimiter'); const errorHandler = require('./middleware/errorHandler'); // Import routes const authRoutes = require('./routes/auth'); const modelRoutes = require('./routes/models'); const chatRoutes = require('./routes/chat'); const documentRoutes = require('./routes/documents'); const feedbackRoutes = require('./routes/feedback'); const toolRoutes = require('./routes/tools'); const app = express(); const PORT = process.env.PORT || 8000; // Security middleware app.use(helmet()); app.use(cors({ origin: process.env.NODE_ENV === 'production' ? ['https://yourdomain.com'] : ['http://localhost:8000'], credentials: true })); // Compression and logging app.use(compression()); app.use(morgan('combined', { stream: { write: message => logger.info(message.trim()) } })); // Body parsing app.use(express.json({ limit: '50mb' })); app.use(express.urlencoded({ extended: true, limit: '50mb' })); // Rate limiting // app.use(rateLimiter); // Static files app.use('/uploads', express.static(path.join(__dirname, '../uploads'))); // API routes app.use('/api/auth', authRoutes); app.use('/api/models', modelRoutes); app.use('/api/chat', chatRoutes); app.use('/api/documents', documentRoutes); app.use('/api/feedback', feedbackRoutes); app.use('/api/tools', toolRoutes); // Health check app.get('/api/health', (req, res) => { res.json({ status: 'OK', timestamp: new Date().toISOString(), version: '1.0.0' }); }); // Error handling app.use(errorHandler); // 404 handler app.use('*', (req, res) => { res.status(404).json({ error: 'Route not found' }); }); // Database connection and server start const startServer = async () => { try { await sequelize.authenticate(); logger.info('Database connection established successfully'); // Sync database in development if (process.env.NODE_ENV === 'development') { await sequelize.sync({ alter: true }); logger.info('Database synchronized'); } app.listen(PORT, () => { logger.info(`Server running on port ${PORT}`); logger.info(`Environment: ${process.env.NODE_ENV}`); }); } catch (error) { logger.error('Failed to start server:', error); process.exit(1); } }; // Graceful shutdown process.on('SIGTERM', async () => { logger.info('SIGTERM received, shutting down gracefully'); await sequelize.close(); process.exit(0); }); process.on('SIGINT', async () => { logger.info('SIGINT received, shutting down gracefully'); await sequelize.close(); process.exit(0); }); startServer(); module.exports = app;