const express = require('express'); const mongoose = require('mongoose'); const cors = require('cors'); const morgan = require('morgan'); const dotenv = require('dotenv'); const rateLimit = require('express-rate-limit'); const path = require('path'); // Load environment variables dotenv.config(); // Import routes const authRoutes = require('./routes/auth'); const userRoutes = require('./routes/users'); const companyRoutes = require('./routes/companies'); const productRoutes = require('./routes/products'); // Import seed functions const seedSuperAdmin = require('./utils/seedSuperAdmin'); const seedTestData = require('./utils/seedTestData'); // Initialize Express app const app = express(); // Trust proxy for requests coming through Nginx app.set('trust proxy', true); // Configure rate limiting based on environment const limiter = rateLimit({ windowMs: 1 * 60 * 1000, // 1 minute in development, 15 minutes in production max: process.env.NODE_ENV === 'development' ? 1000 : 100, // Higher limit in development message: 'Too many requests, please try again later', standardHeaders: true, legacyHeaders: false, // Trust the X-Forwarded-For header from our reverse proxy trustProxy: true }); // Apply rate limiting to all requests except in development mode if (process.env.NODE_ENV !== 'development') { app.use(limiter); } // Middleware app.use(cors()); app.use(express.json()); app.use(morgan('dev')); // Database connection mongoose.connect(process.env.MONGO_URI, { useNewUrlParser: true, useUnifiedTopology: true }) .then(async () => { console.log('MongoDB connected'); // Seed superadmin user await seedSuperAdmin(); // Seed test data await seedTestData(); }) .catch(err => console.error('MongoDB connection error:', err)); // Routes app.use('/api/auth', authRoutes); app.use('/api/users', userRoutes); app.use('/api/companies', companyRoutes); app.use('/api/products', productRoutes); // Health check endpoint app.get('/health', (req, res) => { res.status(200).json({ status: 'ok' }); }); // Error handling middleware app.use((err, req, res, next) => { console.error(err.stack); res.status(500).json({ success: false, message: 'Server error', error: process.env.NODE_ENV === 'development' ? err.message : {} }); }); // Start server const PORT = process.env.PORT || 5000; app.listen(PORT, () => console.log(`Server running on port ${PORT}`)); module.exports = app;