91 lines
2.4 KiB
JavaScript
91 lines
2.4 KiB
JavaScript
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;
|