const express = require('express'); const cors = require('cors'); const helmet = require('helmet'); const morgan = require('morgan'); require('dotenv').config(); const { testConnection } = require('./config/database'); const { generalLimiter } = require('./middleware/rateLimiter'); const errorHandler = require('./middleware/errorHandler'); const authRouter = require('./routes/auth'); const chatRouter = require('./routes/chat'); const assistantsRouter = require('./routes/assistants'); const usersRouter = require('./routes/users'); const analyticsRouter = require('./routes/analytics'); const vectorStoresRouter = require('./routes/vectorStores'); const filesRouter = require('./routes/files'); const app = express(); const PORT = process.env.PORT || 3000; // Security middleware app.use(helmet()); // CORS middleware - permissive for development app.use(cors({ origin: process.env.NODE_ENV === 'development' ? true : ['http://localhost:8080', 'https://ai-sandbox.oliver.solutions'], credentials: true })); // Request logging app.use(morgan('combined')); // Body parsing middleware app.use(express.json({ limit: '10mb' })); app.use(express.urlencoded({ extended: true, limit: '10mb' })); // Rate limiting app.use(generalLimiter); // Health check endpoint app.get('/health', (req, res) => { res.json({ status: 'ok', timestamp: new Date().toISOString(), environment: process.env.NODE_ENV, version: '1.0.0', service: 'Ideas Generator 2025 Backend' }); }); // API routes app.use('/api/auth', authRouter); app.use('/api/chat', chatRouter); app.use('/api/assistants', assistantsRouter); app.use('/api/users', usersRouter); app.use('/api/analytics', analyticsRouter); app.use('/api/vector-stores', vectorStoresRouter); app.use('/api/files', filesRouter); // API info endpoint app.get('/api', (req, res) => { res.json({ message: 'Ideas Generator 2025 API', version: '1.0.0', status: 'Active', endpoints: { health: '/health', api: '/api', auth: '/api/auth', chat: '/api/chat/completions', assistants: '/api/assistants', conversations: '/api/chat/conversations/:id/messages' } }); }); // Error handling middleware app.use(errorHandler); // 404 handler app.use((req, res) => { res.status(404).json({ error: 'Not Found', message: `Route ${req.originalUrl} not found`, availableRoutes: ['/health', '/api'] }); }); // Start server app.listen(PORT, async () => { console.log(`šŸš€ Ideas Gen 2025 Server running on port ${PORT}`); console.log(`šŸ„ Health check: http://localhost:${PORT}/health`); console.log(`šŸ”§ API endpoint: http://localhost:${PORT}/api`); console.log(`šŸ’¬ Chat endpoint: http://localhost:${PORT}/api/chat/completions`); console.log(`šŸ¤– Assistants endpoint: http://localhost:${PORT}/api/assistants`); console.log(`šŸ“Š Environment: ${process.env.NODE_ENV}`); console.log(`šŸ“ Database: ${process.env.DATABASE_NAME || 'Not configured'}`); // Test database connection await testConnection(); // Auto-initialize database in Docker environment if (process.env.NODE_ENV === 'production' && process.env.DATABASE_HOST) { try { console.log('šŸ”§ Auto-initializing database for Docker deployment...'); const initDatabase = require('./scripts/init-database'); await initDatabase(); } catch (error) { console.warn('āš ļø Database auto-initialization failed:', error.message); } } // Log important environment status if (!process.env.OPENAI_API_KEY || process.env.OPENAI_API_KEY.includes('your-actual')) { console.warn('āš ļø WARNING: OpenAI API key not configured! Update .env file.'); } else { console.log('āœ… OpenAI API key configured'); } }); // Graceful shutdown process.on('SIGINT', () => { console.log('\nšŸ›‘ Received SIGINT. Graceful shutdown...'); process.exit(0); }); process.on('SIGTERM', () => { console.log('\nšŸ›‘ Received SIGTERM. Graceful shutdown...'); process.exit(0); });