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:
208
routes/settings.js
Normal file
208
routes/settings.js
Normal file
@@ -0,0 +1,208 @@
|
||||
const express = require('express');
|
||||
const router = express.Router();
|
||||
const SiteSettings = require('../models/SiteSettings');
|
||||
const adminAuth = require('../middleware/adminAuth');
|
||||
|
||||
// @route GET /api/settings
|
||||
// @desc Get site settings
|
||||
// @access Public
|
||||
router.get('/', async (req, res) => {
|
||||
try {
|
||||
const settings = await SiteSettings.getSiteSettings();
|
||||
|
||||
res.json({
|
||||
success: true,
|
||||
data: { settings }
|
||||
});
|
||||
} catch (error) {
|
||||
console.error('Get settings error:', error);
|
||||
res.status(500).json({
|
||||
success: false,
|
||||
message: 'Error fetching settings'
|
||||
});
|
||||
}
|
||||
});
|
||||
|
||||
// @route PUT /api/settings
|
||||
// @desc Update site settings
|
||||
// @access Private (Admin)
|
||||
router.put('/', adminAuth, async (req, res) => {
|
||||
try {
|
||||
let settings = await SiteSettings.findOne();
|
||||
|
||||
if (!settings) {
|
||||
settings = new SiteSettings(req.body);
|
||||
} else {
|
||||
// Update all provided fields
|
||||
Object.keys(req.body).forEach(key => {
|
||||
if (key !== '_id' && key !== '__v') {
|
||||
if (typeof req.body[key] === 'object' && !Array.isArray(req.body[key]) && req.body[key] !== null) {
|
||||
// Deep merge for nested objects
|
||||
settings[key] = { ...settings[key], ...req.body[key] };
|
||||
} else {
|
||||
settings[key] = req.body[key];
|
||||
}
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
if (req.admin && req.admin.id) {
|
||||
settings.lastModifiedBy = req.admin.id;
|
||||
}
|
||||
await settings.save();
|
||||
|
||||
res.json({
|
||||
success: true,
|
||||
message: 'Settings updated successfully',
|
||||
data: { settings }
|
||||
});
|
||||
} catch (error) {
|
||||
console.error('Update settings error:', error);
|
||||
res.status(500).json({
|
||||
success: false,
|
||||
message: 'Error updating settings'
|
||||
});
|
||||
}
|
||||
});
|
||||
|
||||
// @route GET /api/settings/public
|
||||
// @desc Get public settings (subset for frontend)
|
||||
// @access Public
|
||||
router.get('/public', async (req, res) => {
|
||||
try {
|
||||
const settings = await SiteSettings.getSiteSettings();
|
||||
|
||||
// Return only public-facing settings
|
||||
const publicSettings = {
|
||||
hotel: {
|
||||
name: settings.hotel.name,
|
||||
tagline: settings.hotel.tagline,
|
||||
phone: settings.hotel.phone,
|
||||
email: settings.hotel.email,
|
||||
whatsapp: settings.hotel.whatsapp,
|
||||
address: settings.hotel.address,
|
||||
socialMedia: settings.hotel.socialMedia,
|
||||
businessHours: settings.hotel.businessHours
|
||||
},
|
||||
theme: settings.theme,
|
||||
features: settings.features,
|
||||
languages: settings.languages,
|
||||
booking: {
|
||||
enabled: settings.booking.enabled,
|
||||
minNights: settings.booking.minNights,
|
||||
maxNights: settings.booking.maxNights,
|
||||
currency: settings.booking.currency,
|
||||
currencySymbol: settings.booking.currencySymbol
|
||||
}
|
||||
};
|
||||
|
||||
res.json({
|
||||
success: true,
|
||||
data: { settings: publicSettings }
|
||||
});
|
||||
} catch (error) {
|
||||
console.error('Get public settings error:', error);
|
||||
res.status(500).json({
|
||||
success: false,
|
||||
message: 'Error fetching settings'
|
||||
});
|
||||
}
|
||||
});
|
||||
|
||||
// @route PUT /api/settings/hotel
|
||||
// @desc Update hotel information
|
||||
// @access Private (Admin)
|
||||
router.put('/hotel', adminAuth, async (req, res) => {
|
||||
try {
|
||||
const settings = await SiteSettings.getSiteSettings();
|
||||
|
||||
settings.hotel = { ...settings.hotel, ...req.body };
|
||||
settings.lastModifiedBy = req.admin.id;
|
||||
await settings.save();
|
||||
|
||||
res.json({
|
||||
success: true,
|
||||
message: 'Hotel information updated successfully',
|
||||
data: { hotel: settings.hotel }
|
||||
});
|
||||
} catch (error) {
|
||||
console.error('Update hotel info error:', error);
|
||||
res.status(500).json({
|
||||
success: false,
|
||||
message: 'Error updating hotel information'
|
||||
});
|
||||
}
|
||||
});
|
||||
|
||||
// @route PUT /api/settings/theme
|
||||
// @desc Update theme settings
|
||||
// @access Private (Admin)
|
||||
router.put('/theme', adminAuth, async (req, res) => {
|
||||
try {
|
||||
const settings = await SiteSettings.getSiteSettings();
|
||||
|
||||
settings.theme = { ...settings.theme, ...req.body };
|
||||
if (req.body.colors) {
|
||||
settings.theme.colors = { ...settings.theme.colors, ...req.body.colors };
|
||||
}
|
||||
if (req.body.fonts) {
|
||||
settings.theme.fonts = { ...settings.theme.fonts, ...req.body.fonts };
|
||||
}
|
||||
if (req.body.layout) {
|
||||
settings.theme.layout = { ...settings.theme.layout, ...req.body.layout };
|
||||
}
|
||||
|
||||
settings.lastModifiedBy = req.admin.id;
|
||||
await settings.save();
|
||||
|
||||
res.json({
|
||||
success: true,
|
||||
message: 'Theme updated successfully',
|
||||
data: { theme: settings.theme }
|
||||
});
|
||||
} catch (error) {
|
||||
console.error('Update theme error:', error);
|
||||
res.status(500).json({
|
||||
success: false,
|
||||
message: 'Error updating theme'
|
||||
});
|
||||
}
|
||||
});
|
||||
|
||||
// @route PUT /api/settings/maintenance
|
||||
// @desc Toggle maintenance mode
|
||||
// @access Private (Admin)
|
||||
router.put('/maintenance', adminAuth, async (req, res) => {
|
||||
try {
|
||||
const settings = await SiteSettings.getSiteSettings();
|
||||
const { enabled, message, allowedIPs } = req.body;
|
||||
|
||||
if (typeof enabled !== 'undefined') {
|
||||
settings.maintenance.enabled = enabled;
|
||||
}
|
||||
if (message) {
|
||||
settings.maintenance.message = message;
|
||||
}
|
||||
if (allowedIPs) {
|
||||
settings.maintenance.allowedIPs = allowedIPs;
|
||||
}
|
||||
|
||||
settings.lastModifiedBy = req.admin.id;
|
||||
await settings.save();
|
||||
|
||||
res.json({
|
||||
success: true,
|
||||
message: 'Maintenance mode updated successfully',
|
||||
data: { maintenance: settings.maintenance }
|
||||
});
|
||||
} catch (error) {
|
||||
console.error('Update maintenance mode error:', error);
|
||||
res.status(500).json({
|
||||
success: false,
|
||||
message: 'Error updating maintenance mode'
|
||||
});
|
||||
}
|
||||
});
|
||||
|
||||
module.exports = router;
|
||||
|
||||
Reference in New Issue
Block a user