Files
ostandari/server/controllers/homeController.js
2024-10-21 10:22:26 +03:30

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