111 lines
2.9 KiB
JavaScript
111 lines
2.9 KiB
JavaScript
|
|
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;
|