const express = require('express'); const mongoose = require('mongoose'); const cors = require('cors'); const helmet = require('helmet'); const rateLimit = require('express-rate-limit'); const compression = require('compression'); const morgan = require('morgan'); require('dotenv').config(); // Import routes const authRoutes = require('./routes/auth'); const roomRoutes = require('./routes/rooms'); const bookingRoutes = require('./routes/bookings'); const guestRoutes = require('./routes/guests'); const paymentRoutes = require('./routes/payments'); const adminRoutes = require('./routes/admin'); const integrationRoutes = require('./routes/integrations'); const contactRoutes = require('./routes/contact'); const galleryRoutes = require('./routes/gallery'); const contentRoutes = require('./routes/content'); const blogRoutes = require('./routes/blog'); const mediaRoutes = require('./routes/media'); const settingsRoutes = require('./routes/settings'); const uploadRoutes = require('./routes/upload'); const roomCategoryRoutes = require('./routes/roomCategories'); const galleryCategoryRoutes = require('./routes/galleryCategories'); // Import middleware const errorHandler = require('./middleware/errorHandler'); const logger = require('./utils/logger'); const app = express(); const PORT = process.env.PORT || 5080; // Security middleware app.use(helmet()); app.use(compression()); // Rate limiting const limiter = rateLimit({ windowMs: 15 * 60 * 1000, // 15 minutes max: 100, // limit each IP to 100 requests per windowMs message: 'Too many requests from this IP, please try again later.', }); app.use('/api/', limiter); // CORS configuration app.use(cors({ origin: process.env.CLIENT_URL || 'http://localhost:3000', credentials: true, })); // Body parsing middleware app.use(express.json({ limit: '10mb' })); app.use(express.urlencoded({ extended: true, limit: '10mb' })); // Logging if (process.env.NODE_ENV !== 'test') { app.use(morgan('combined', { stream: { write: message => logger.info(message.trim()) } })); } // Database connection mongoose.connect(process.env.MONGODB_URI || 'mongodb://localhost:27017/oldvinehotel', { useNewUrlParser: true, useUnifiedTopology: true, }) .then(() => { logger.info('Connected to MongoDB'); }) .catch((error) => { logger.error('MongoDB connection error:', error); }); // Health check endpoint app.get('/health', (req, res) => { res.status(200).json({ status: 'OK', timestamp: new Date().toISOString(), uptime: process.uptime(), version: process.env.npm_package_version || '1.0.0' }); }); // API routes app.use('/api/auth', authRoutes); app.use('/api/rooms', roomRoutes); app.use('/api/room-categories', roomCategoryRoutes); app.use('/api/gallery-categories', galleryCategoryRoutes); app.use('/api/bookings', bookingRoutes); app.use('/api/guests', guestRoutes); app.use('/api/payments', paymentRoutes); app.use('/api/admin', adminRoutes); app.use('/api/integrations', integrationRoutes); app.use('/api/contact', contactRoutes); app.use('/api/gallery', galleryRoutes); app.use('/api/content', contentRoutes); app.use('/api/blog', blogRoutes); app.use('/api/media', mediaRoutes); app.use('/api/settings', settingsRoutes); app.use('/api/upload', uploadRoutes); // Welcome route app.get('/', (req, res) => { res.json({ message: 'Welcome to The Old Vine Hotel API', version: '1.0.0', documentation: '/api/docs', endpoints: { rooms: '/api/rooms', bookings: '/api/bookings', auth: '/api/auth', payments: '/api/payments', integrations: '/api/integrations' } }); }); // Error handling middleware (must be last) app.use(errorHandler); // 404 handler app.use('*', (req, res) => { res.status(404).json({ success: false, message: 'Route not found', path: req.originalUrl }); }); // Graceful shutdown process.on('SIGTERM', () => { logger.info('SIGTERM received, shutting down gracefully'); mongoose.connection.close(() => { logger.info('Database connection closed'); process.exit(0); }); }); if (process.env.NODE_ENV !== 'test') { app.listen(PORT, () => { logger.info(`Server running on port ${PORT}`); logger.info(`Environment: ${process.env.NODE_ENV || 'development'}`); }); } module.exports = app;