samoulla-backend / controllers /contentController.js
Samoulla Sync Bot
Auto-deploy Samoulla Backend: b68e45770de26ed39feb4b1c0925e5345eb3a61d
634b9bb
const HeroSlide = require('../models/heroSlideModel');
const SiteSettings = require('../models/siteSettingsModel');
const AnnouncementBar = require('../models/announcementBarModel');
const SalesBanner = require('../models/salesBannerModel');
const FeaturedBanner = require('../models/featuredBannerModel');
const WhyChooseUs = require('../models/whyChooseUsModel');
// ============================================
// HERO SLIDES SECTION
// ============================================
/**
* @desc Get all active hero slides (Public)
* @route GET /api/content/hero-slides
* @access Public
*/
exports.getHeroSlides = async (req, res) => {
try {
const slides = await HeroSlide.find({ isActive: true }).sort({ order: 1 });
res.status(200).json({
status: 'success',
results: slides.length,
data: slides,
});
} catch (error) {
res.status(500).json({
status: 'fail',
message: error.message,
});
}
};
/**
* @desc Get all hero slides including inactive (Admin)
* @route GET /api/content/hero-slides/admin/all
* @access Private/Admin
*/
exports.getAllHeroSlidesAdmin = async (req, res) => {
try {
const slides = await HeroSlide.find().sort({ order: 1 });
res.status(200).json({
status: 'success',
results: slides.length,
data: slides,
});
} catch (error) {
res.status(500).json({
status: 'fail',
message: error.message,
});
}
};
/**
* @desc Get single hero slide by ID
* @route GET /api/content/hero-slides/:id
* @access Public
*/
exports.getHeroSlideById = async (req, res) => {
try {
const slide = await HeroSlide.findById(req.params.id);
if (!slide) {
return res.status(404).json({
status: 'fail',
message: 'Slide not found',
});
}
res.status(200).json({
status: 'success',
data: slide,
});
} catch (error) {
res.status(500).json({
status: 'fail',
message: error.message,
});
}
};
/**
* @desc Create a new hero slide
* @route POST /api/content/hero-slides
* @access Private/Admin
*/
exports.createHeroSlide = async (req, res) => {
try {
const {
_id,
type,
imageSrc,
videoSrc,
poster,
title,
description,
buttonText,
buttonLink,
order,
isActive,
} = req.body;
const slide = await HeroSlide.create({
_id,
type,
imageSrc,
videoSrc,
poster,
title,
description,
buttonText,
buttonLink,
order: order || 0,
isActive: isActive !== undefined ? isActive : true,
});
res.status(201).json({
status: 'success',
data: slide,
});
} catch (error) {
res.status(400).json({
status: 'fail',
message: error.message,
});
}
};
/**
* @desc Update a hero slide
* @route PUT /api/content/hero-slides/:id
* @access Private/Admin
*/
exports.updateHeroSlide = async (req, res) => {
try {
const {
type,
imageSrc,
videoSrc,
poster,
title,
description,
buttonText,
buttonLink,
order,
isActive,
} = req.body;
const slide = await HeroSlide.findById(req.params.id);
if (!slide) {
return res.status(404).json({
status: 'fail',
message: 'Slide not found',
});
}
// Update fields
slide.type = type || slide.type;
slide.imageSrc = imageSrc !== undefined ? imageSrc : slide.imageSrc;
slide.videoSrc = videoSrc !== undefined ? videoSrc : slide.videoSrc;
slide.poster = poster !== undefined ? poster : slide.poster;
slide.title = title !== undefined ? title : slide.title;
slide.description =
description !== undefined ? description : slide.description;
slide.buttonText = buttonText !== undefined ? buttonText : slide.buttonText;
slide.buttonLink = buttonLink !== undefined ? buttonLink : slide.buttonLink;
slide.order = order !== undefined ? order : slide.order;
slide.isActive = isActive !== undefined ? isActive : slide.isActive;
const updatedSlide = await slide.save();
res.status(200).json({
status: 'success',
data: updatedSlide,
});
} catch (error) {
res.status(400).json({
status: 'fail',
message: error.message,
});
}
};
/**
* @desc Delete a hero slide
* @route DELETE /api/content/hero-slides/:id
* @access Private/Admin
*/
exports.deleteHeroSlide = async (req, res) => {
try {
const slide = await HeroSlide.findById(req.params.id);
if (!slide) {
return res.status(404).json({
status: 'fail',
message: 'Slide not found',
});
}
await HeroSlide.findByIdAndDelete(req.params.id);
res.status(200).json({
status: 'success',
message: 'Slide deleted successfully',
});
} catch (error) {
res.status(500).json({
status: 'fail',
message: error.message,
});
}
};
// ============================================
// SITE SETTINGS SECTION
// ============================================
/**
* @desc Get site settings
* @route GET /api/content/settings
* @access Public
*/
exports.getSiteSettings = async (req, res) => {
try {
const settings = await SiteSettings.getSettings();
res.status(200).json({
status: 'success',
data: settings,
});
} catch (error) {
res.status(500).json({
status: 'fail',
message: error.message,
});
}
};
// ============================================
// ANNOUNCEMENT BAR SECTION
// ============================================
/**
* @desc Get announcement bar settings
* @route GET /api/content/announcement-bar
* @access Public
*/
exports.getAnnouncementBar = async (req, res) => {
try {
const settings = await AnnouncementBar.getSettings();
res.status(200).json({
status: 'success',
data: settings,
});
} catch (error) {
console.error('ERROR in getAnnouncementBar:', error);
res.status(500).json({
status: 'fail',
message: error.message,
});
}
};
/**
* @desc Update announcement bar settings
* @route PUT /api/content/announcement-bar
* @access Private/Admin
*/
exports.updateAnnouncementBar = async (req, res) => {
try {
const settings = await AnnouncementBar.getSettings();
// Update permitted fields
const restrictedFields = ['_id', '__v', 'createdAt', 'updatedAt'];
Object.keys(req.body).forEach((key) => {
if (!restrictedFields.includes(key)) {
settings[key] = req.body[key];
}
});
const updatedSettings = await settings.save();
res.status(200).json({
status: 'success',
data: updatedSettings,
});
} catch (error) {
console.error('ERROR in updateAnnouncementBar:', error);
res.status(400).json({
status: 'fail',
message: error.message,
});
}
};
/**
* @desc Update site settings
* @route PUT /api/content/settings
* @access Private/Admin
*/
exports.updateSiteSettings = async (req, res) => {
try {
const settings = await SiteSettings.getSettings();
// Update fields if provided
if (req.body.topBar) {
settings.topBar = { ...settings.topBar, ...req.body.topBar };
}
if (req.body.footer) {
settings.footer = { ...settings.footer, ...req.body.footer };
}
if (req.body.legalPages) {
if (req.body.legalPages.termsAndConditions) {
settings.legalPages.termsAndConditions = {
...settings.legalPages.termsAndConditions,
...req.body.legalPages.termsAndConditions,
lastUpdated: Date.now(),
};
}
if (req.body.legalPages.privacyPolicy) {
settings.legalPages.privacyPolicy = {
...settings.legalPages.privacyPolicy,
...req.body.legalPages.privacyPolicy,
lastUpdated: Date.now(),
};
}
}
const updatedSettings = await settings.save();
res.status(200).json({
status: 'success',
data: updatedSettings,
});
} catch (error) {
res.status(400).json({
status: 'fail',
message: error.message,
});
}
};
// ============================================
// SALES BANNERS SECTION
// ============================================
/**
* @desc Get all active sales banners
* @route GET /api/content/sales-banners
* @access Public
*/
exports.getSalesBanners = async (req, res) => {
try {
const banners = await SalesBanner.find({ isActive: true }).sort({
order: 1,
});
res.status(200).json({
status: 'success',
results: banners.length,
data: banners,
});
} catch (error) {
res.status(500).json({
status: 'fail',
message: error.message,
});
}
};
/**
* @desc Get all sales banners including inactive (Admin)
* @route GET /api/content/sales-banners/admin/all
* @access Private/Admin
*/
exports.getAllSalesBannersAdmin = async (req, res) => {
try {
const banners = await SalesBanner.find().sort({ order: 1 });
res.status(200).json({
status: 'success',
results: banners.length,
data: banners,
});
} catch (error) {
res.status(500).json({
status: 'fail',
message: error.message,
});
}
};
/**
* @desc Create a new sales banner
* @route POST /api/content/sales-banners
* @access Private/Admin
*/
exports.createSalesBanner = async (req, res) => {
try {
const banner = await SalesBanner.create(req.body);
res.status(201).json({
status: 'success',
data: banner,
});
} catch (error) {
res.status(400).json({
status: 'fail',
message: error.message,
});
}
};
/**
* @desc Update a sales banner
* @route PUT /api/content/sales-banners/:id
* @access Private/Admin
*/
exports.updateSalesBanner = async (req, res) => {
try {
const banner = await SalesBanner.findByIdAndUpdate(
req.params.id,
req.body,
{
new: true,
runValidators: true,
},
);
if (!banner) {
return res.status(404).json({
status: 'fail',
message: 'Banner not found',
});
}
res.status(200).json({
status: 'success',
data: banner,
});
} catch (error) {
res.status(400).json({
status: 'fail',
message: error.message,
});
}
};
/**
* @desc Delete a sales banner
* @route DELETE /api/content/sales-banners/:id
* @access Private/Admin
*/
exports.deleteSalesBanner = async (req, res) => {
try {
const banner = await SalesBanner.findByIdAndDelete(req.params.id);
if (!banner) {
return res.status(404).json({
status: 'fail',
message: 'Banner not found',
});
}
res.status(200).json({
status: 'success',
message: 'Banner deleted successfully',
});
} catch (error) {
res.status(500).json({
status: 'fail',
message: error.message,
});
}
};
/**
* @desc Delete all sales banners
* @route DELETE /api/content/sales-banners
* @access Private/Admin
*/
exports.deleteAllSalesBanners = async (req, res) => {
try {
await SalesBanner.deleteMany({});
res.status(200).json({
status: 'success',
message: 'All banners deleted successfully',
});
} catch (error) {
res.status(500).json({
status: 'fail',
message: error.message,
});
}
};
// ============================================
// FEATURED BANNERS SECTION
// ============================================
/**
* @desc Get all active featured banners
* @route GET /api/content/featured-banners
* @access Public
*/
exports.getFeaturedBanners = async (req, res) => {
try {
const banners = await FeaturedBanner.find({ isActive: true });
res.status(200).json({
status: 'success',
results: banners.length,
data: banners,
});
} catch (error) {
res.status(500).json({
status: 'fail',
message: error.message,
});
}
};
/**
* @desc Get all featured banners including inactive (Admin)
* @route GET /api/content/featured-banners/admin/all
* @access Private/Admin
*/
exports.getAllFeaturedBannersAdmin = async (req, res) => {
try {
const banners = await FeaturedBanner.find();
res.status(200).json({
status: 'success',
results: banners.length,
data: banners,
});
} catch (error) {
res.status(500).json({
status: 'fail',
message: error.message,
});
}
};
/**
* @desc Create a new featured banner
* @route POST /api/content/featured-banners
* @access Private/Admin
*/
exports.createFeaturedBanner = async (req, res) => {
try {
const banner = await FeaturedBanner.create(req.body);
res.status(201).json({
status: 'success',
data: banner,
});
} catch (error) {
res.status(400).json({
status: 'fail',
message: error.message,
});
}
};
/**
* @desc Update a featured banner
* @route PUT /api/content/featured-banners/:id
* @access Private/Admin
*/
exports.updateFeaturedBanner = async (req, res) => {
try {
const banner = await FeaturedBanner.findByIdAndUpdate(
req.params.id,
req.body,
{
new: true,
runValidators: true,
},
);
if (!banner) {
return res.status(404).json({
status: 'fail',
message: 'Banner not found',
});
}
res.status(200).json({
status: 'success',
data: banner,
});
} catch (error) {
res.status(400).json({
status: 'fail',
message: error.message,
});
}
};
/**
* @desc Delete a featured banner
* @route DELETE /api/content/featured-banners/:id
* @access Private/Admin
*/
exports.deleteFeaturedBanner = async (req, res) => {
try {
const banner = await FeaturedBanner.findByIdAndDelete(req.params.id);
if (!banner) {
return res.status(404).json({
status: 'fail',
message: 'Banner not found',
});
}
res.status(200).json({
status: 'success',
message: 'Banner deleted successfully',
});
} catch (error) {
res.status(500).json({
status: 'fail',
message: error.message,
});
}
};
/**
* @desc Delete all featured banners
* @route DELETE /api/content/featured-banners
* @access Private/Admin
*/
exports.deleteAllFeaturedBanners = async (req, res) => {
try {
await FeaturedBanner.deleteMany({});
res.status(200).json({
status: 'success',
message: 'All banners deleted successfully',
});
} catch (error) {
res.status(500).json({
status: 'fail',
message: error.message,
});
}
};
// ============================================
// WHY CHOOSE US SECTION
// ============================================
/**
* @desc Get Why Choose Us settings
* @route GET /api/content/why-choose-us
* @access Public
*/
exports.getWhyChooseUs = async (req, res) => {
try {
const settings = await WhyChooseUs.getSettings();
res.status(200).json({
status: 'success',
data: settings,
});
} catch (error) {
res.status(500).json({
status: 'fail',
message: error.message,
});
}
};
/**
* @desc Update Why Choose Us settings
* @route PUT /api/content/why-choose-us
* @access Private/Admin
*/
exports.updateWhyChooseUs = async (req, res) => {
try {
const settings = await WhyChooseUs.getSettings();
const restrictedFields = ['_id', '__v', 'createdAt', 'updatedAt'];
Object.keys(req.body).forEach((key) => {
if (!restrictedFields.includes(key)) {
settings[key] = req.body[key];
}
});
const updated = await settings.save();
res.status(200).json({
status: 'success',
data: updated,
});
} catch (error) {
res.status(400).json({
status: 'fail',
message: error.message,
});
}
};