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