- Complete Express.js API server - MongoDB integration with Mongoose - Admin authentication and authorization - Room management (CRUD operations) - Booking management system - Guest management - Payment processing (Stripe integration) - Content management (pages, blog, gallery) - Media upload and management - Integration services (Booking.com, Expedia, Opera PMS, Trip.com) - Email notifications - Comprehensive logging and error handling
146 lines
4.2 KiB
JavaScript
146 lines
4.2 KiB
JavaScript
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; |