const {body, validationResult} = require('express-validator'); const mongoose = require('mongoose'); const sharp = require('sharp'); const {_sr} = require('../plugins/serverResponses'); const allPortals = require('../plugins/portals'); const {res404, res500} = require('../plugins/controllersHelperFunctions'); const fs = require('fs'); const moment = require('moment-jalaali'); const axios = require('axios'); const HomePage = require('../models/HomePage'); const News = require('./../models/News'); const Gallery = require('./../models/Gallery'); const Category = require('./../models/Category'); const NewsFile = require('./../models/NewsFile'); const Slider = require('./../models/Slider'); const Links = require('./../models/Links'); const Content = require('./../models/Content'); const Occasion = require('./../models/Occasion'); /////////////////////////////////////////////////////// admin module.exports.updateHomePage = [ async (req, res) => { try { const { s2, s3, s4, s5, s6, s2Side, s3Side, s4Side, s5Side, s6Side } = req.body; const portal = req.query.portal ? 'ostandari' : req.query.portal; if (!req.user.portals.includes(portal)) { return res.status(403).json({message: `شما اجازه دسترسی به اطلاعات این صفحه را ندارید`}); } if (!allPortals.some(item => item.value === portal)) { return res.status(403).json(`پرتال ارسال شده وجود ندارد`); } const addHome = await HomePage.findOne({modelType: portal}); if (addHome) { const oldData = addHome oldData.s2 = s2 || null oldData.s3 = s3 || null oldData.s4 = s4 || null oldData.s5 = s5 || null oldData.s6 = s6 || null // side bar oldData.s2Side = s2Side || null oldData.s3Side = s3Side || null oldData.s4Side = s4Side || null oldData.s5Side = s5Side || null oldData.s6Side = s6Side || null await oldData.save(); return res.json({message: _sr['fa'].response.success_save}) } else { const data = { s2: s2 || null, s3: s3 || null, s4: s4 || null, s5: s5 || null, s6: s6 || null, s2Side: s2Side || null, s3Side: s3Side || null, s4Side: s4Side || null, s5Side: s5Side || null, s6Side: s6Side || null, modelType: portal } const addHome = await HomePage.create(data); if (!addHome) return res500(res, `مشکلی در اجرای درخواست شما به وجود آمده است`); return res.json({message: _sr['fa'].response.success_save}) } } catch (e) { console.log(e) return res500(res, 'مشکلی در گرفتن اطلاعات پیش آمده است'); } } ] module.exports.getHomePage = [ async (req, res) => { try { const portal = req?.query?.portal ? req.query.portal : 'ostandari'; if (!req.user.portals.includes(portal)) { return res.status(403).json(`شما اجازه دسترسی به اطلاعات این صفحه را ندارید`); } const getHome = await HomePage.find({modelType: portal}); if (getHome.length) return res.json(getHome[0]) else return res.json({ s2: '', s3: '', s4: '', s5: [], s6: '', s2Side: '', s3Side: '', s4Side: '', s5Side: '', s6Side: '' }) } catch (e) { return res500(res, 'مشکلی در گرفتن اطلاعات پیش آمده است'); } } ] module.exports.changeShowInHome = [ [ body('id') .notEmpty().withMessage(_sr['fa'].required.title), body('modelName') .custom((value, {req}) => { const models = ['news', 'newsFile', 'gallery'] if (!models.includes(value)) { return Promise.reject(_sr['fa'].required.field); } else { return true } }) ], async (req, res) => { const errors = validationResult(req) if (!errors.isEmpty()) return res.status(422).json({ validation: errors.mapped() }); try { const {id, modelName} = req.body; let Model; switch (modelName) { case 'news': Model = News; break; case 'newsFile' : Model = NewsFile; break; case 'gallery': Model = Gallery; break; } const targetModel = await Model.findById(id) if (!targetModel) return res404(res, `اطلاعات مورد یافت نشد`); targetModel.showInHome = !targetModel.showInHome; await targetModel.save(); return res.json(targetModel); } catch (e) { return res500(res, 'مشکلی در گرفتن اطلاعات پیش آمده است'); } } ] module.exports.getAllShowInHomeFalse = [ async (req, res) => { try { const portal = req?.query?.portal ? req.query.portal : 'ostandari'; const requests = [ News.find({modelType: portal, showInHome: false}), NewsFile.find({modelType: portal, showInHome: false}), Gallery.find({modelType: portal, showInHome: false}), ] let fetch = await Promise.all(requests); const [news, newsFile, media] = fetch; return res.json({ news, newsFile, media }) } catch (e) { return res500(res, 'مشکلی در گرفتن اطلاعات پیش آمده است'); } } ] /////////////////////////////////////////////////////// public module.exports.getHomeByUser = [ async (req, res) => { try { const homeSetting = await HomePage.find(); const data = { occasion: [], s1: [], s2: [], s3: [], s4: [], s5: [], s6: [], s2Side: [], s3Side: [], s4Side: [], s5Side: [], s6Side: [], }; const portal = req?.query?.portal ? req.query.portal : 'ostandari' const settings = homeSetting[0] const query = {publish: true, showInHome: true, modelType: portal} const request = [ // Occasion Occasion.find({ publish: true, status: true, startDate: {$lte: new Date()}, endDate: {$gte: new Date()} }), // s1 Slider.find({modelType: portal}), // s2 News.find(settings?.s2 ? { ...query, catId: settings?.s2, newsStatus: true } : {...query, newsStatus: true}).populate('catId', 'title').limit(8).sort({customDate: -1}), // s3 NewsFile.find(settings?.s3 ? { ...query, catId: settings?.s3 } : query).populate('catId', 'title').limit(4).sort({_id: -1}), // s6 News.find(settings?.s6 ? { ...query, catId: settings?.s6, newsStatus: true } : {...query, newsStatus: true}).limit(8).sort({userViews: -1}), // s1Side Content.find({param: 'manager'}), // s2Side Gallery.find(settings?.s2Side ? { ...query, catId: settings?.s2Side, galleryType: 'image', galleryStatus: true } : {...query, galleryType: 'image', galleryStatus: true}).populate('catId', 'title').limit(4).sort({customDate: -1}), // s3Side Gallery.find(settings?.s3Side ? { ...query, catId: settings?.s3Side, galleryType: 'video', galleryStatus: true } : {...query, galleryType: 'video', galleryStatus: true}).populate('catId', 'title').limit(4).sort({customDate: -1}), // s4Side Gallery.find(settings?.s4Side ? { ...query, catId: settings?.s4Side, galleryType: 'graphic', galleryStatus: true } : {...query, galleryType: 'graphic', galleryStatus: true}).populate('catId', 'title').limit(4).sort({customDate: -1}), // s5Side News.find(settings?.s5Side ? { ...query, catId: settings?.s5Side, special: true, newsStatus: true } : {...query, newsStatus: true, special: true}).limit(4).sort({customDate: -1}), // s6Side News.find(settings?.s6Side ? { ...query, catId: settings?.s6Side, newsStatus: true } : {...query, newsStatus: true}).limit(6).sort({customDate: -1}), // s7Side Links.find({modelType: portal, showInHome: true}), // notifications-side News.find(settings?.s6Side ? { ...query, catId: settings?.s5Side, newsStatus: true, notifications: true } : {...query, newsStatus: true, notifications: true}).limit(6).sort({customDate: -1}), ] const fetch = await Promise.all(request) const [occasion, s1, s2, s3, s6, s1Side, s2Side, s3Side, s4Side, s5Side, s6Side, s7Side, notificationsSide] = fetch; data.occasion = occasion data.s1 = s1 data.s2 = s2 data.s3 = s3 data.s6 = s6 data.s1Side = s1Side data.s2Side = s2Side data.s3Side = s3Side data.s4Side = s4Side data.s5Side = s5Side data.s6Side = s6Side data.s7Side = s7Side data.notificationsSide = notificationsSide ////////////////// computed main news const nameTag = await Category.findById(settings?.s4); const s4Categories = await Category.find(settings?.s4 ? {parent: settings?.s4} : {}) const s4Obj = {}; s4Obj.nameTag = nameTag ? nameTag.title : ''; let s4News = []; if (settings?.s4) { for await (const cat of s4Categories) { const getNew = await News.find({...query, catId: cat._id , newsStatus : true}).sort({customDate: -1}) if (getNew.length) s4News.push(getNew[0]) } if (s4Categories.length !== 4) { const getNews = await News.find({...query, catId: settings?.s4 , newsStatus : true}).populate('catId', 'title').limit(4 - s4News.length).sort({customDate: -1}) for (const item of getNews) { s4News.push(item); } } } else { s4News = await News.find({...query,newsStatus : true}).populate('catId', 'title').limit(4).sort({customDate: -1}); } s4Obj.news = s4News data.s4 = s4Obj; //// s5 if (settings?.s5?.length) { const s5News = [] for await (const id of settings?.s5) { const item = {} const nameTag = await Category.findById(id) item.nameTag = nameTag ? nameTag.title : ''; item.news = await News.find({...query, rootParent: id , newsStatus : true}).limit(10).sort({_id: -1}) s5News.push(item) } data.s5 = s5News } return res.json(data); } catch (e) { return res500(res, 'مشکلی در گرفتن اطلاعات پیش آمده است'); } } ] module.exports.search = [ async (req, res) => { const {portal, terms} = req.query; try { const requests = [ News.find({ newsStatus: true, publish: true, $or: [ {title: {$regex: terms, $options: 'i'}}, {summaryTitle: {$regex: terms, $options: 'i'}}, {keywords: {$in: terms}} ] }), Gallery.find({ galleryStatus: true, publish: true, $or: [ {title: {$regex: terms, $options: 'i'}}, {summaryTitle: {$regex: terms, $options: 'i'}}, {keywords: {$in: terms}} ] }), Category.find({ $or: [ {title: {$regex: terms, $options: 'i'}}, {pageContent: {$regex: terms, $options: 'i'}} ] }) ] const getData = await Promise.all(requests); let [news, gallery, category] = getData; return res.json({ news, media: gallery, pages: category }); } catch (e) { return res500(res, 'مشکلی در گرفتن اطلاعات پیش آمده است'); } } ]