414 lines
12 KiB
JavaScript
414 lines
12 KiB
JavaScript
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, 'مشکلی در گرفتن اطلاعات پیش آمده است');
|
|
}
|
|
|
|
}
|
|
]
|