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:
Talal Sharabi
2026-01-06 12:21:56 +04:00
commit a3308a26e2
48 changed files with 15294 additions and 0 deletions

146
index.js Normal file
View 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;