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, }); } };