Initial commit: CMS backend for Old Vine Hotel
- 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
This commit is contained in:
146
index.js
Normal file
146
index.js
Normal file
@@ -0,0 +1,146 @@
|
||||
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;
|
||||
Reference in New Issue
Block a user