const Slider = require('../models/Slider'); const { body, validationResult } = require('express-validator'); const { _sr } = require('../plugins/serverResponses'); const { res404, res500, hasWhiteSpaces, isLatinCharactersWithSymbol, generateRandomDigits } = require('../plugins/controllersHelperFunctions'); const { deleteSliderImage, uploadProcessedImage, } = require('../plugins/sliderImageStorage'); ////// variables const profileWidth = 880; const profileHeight = 450; const profileQuality = 100; /////////////////////////////////////////////////////////////////////// admin module.exports.addSlider = [ [ body('title') .notEmpty().withMessage(_sr['fa'].required.title), // body('summaryTitle') // .notEmpty().withMessage(_sr['fa'].required.field), body('url') .notEmpty().withMessage(_sr['fa'].required.field), body('index') .optional().isNumeric().withMessage(_sr['fa'].format.number), body('isLocal') .optional().isBoolean().withMessage(_sr['fa'].format.boolean), body('siteMap') .optional().isBoolean().withMessage(_sr['fa'].format.boolean), body('modelType') .custom((value, { req }) => { if (req.user.portals.join() === portal.join()) { if (!portal.includes(value)) { return Promise.reject(_sr['fa'].required.field); } else { return true } } else { return true } }) ], async (req, res) => { const errors = validationResult(req) if (!errors.isEmpty()) return res.status(422).json({ validation: errors.mapped() }); try { var { title, summaryTitle, isLocal, url, index, siteMap, modelType, } = req.body; /** set portals */ modelType = (req.user.portals.join() === portal.join()) ? modelType : req.user.portals[0]; const sliderData = { title: title.trim(), summaryTitle: summaryTitle.trim(), url: url.trim(), isLocal, index, siteMap, _creator: req.user._id, _updatedBy: req.user._id, modelType, }; var createSlider = await Slider.create(sliderData); if (!createSlider) { res500(res, `error in add slider to data base`); } /** * if we have pic upload to server */ if (req.files && req.files.cover) { const image = req.files.cover; if (!_sr.supportedImageFormats.includes(image.mimetype.split('/')[1])) { return res.status(422).json({ validation: { cover: { msg: _sr['fa'].format.image } } }); } const imageName = `slider_${Date.now()}_${createSlider._id}.${image.mimetype.split('/')[1]}`; try { await uploadProcessedImage( image.data, imageName, profileWidth, profileHeight, profileQuality ); createSlider.cover = imageName; await createSlider.save(); } catch (e) { return res500(res, e?.message); } } /** * show result */ return res.json(createSlider); } catch (error) { console.log(error); /** * if we got unkown error show to client */ res500(res, error.message); } } ] module.exports.updateSlider = [ [ body('title') .notEmpty().withMessage(_sr['fa'].required.title), // body('summaryTitle') // .notEmpty().withMessage(_sr['fa'].required.field), body('url') .notEmpty().withMessage(_sr['fa'].required.field), body('isLocal') .optional().isBoolean().withMessage(_sr['fa'].format.boolean), body('index') .optional().isNumeric().withMessage(_sr['fa'].format.number), body('siteMap') .optional().isBoolean().withMessage(_sr['fa'].format.boolean), body('modelType') .custom((value, { req }) => { if (req.user.portals.join() === portal.join()) { if (!portal.includes(value)) { return Promise.reject(_sr['fa'].required.field); } else { return true } } else { return true } }) ], async (req, res) => { const errors = validationResult(req) if (!errors.isEmpty()) return res.status(422).json({ validation: errors.mapped() }); try { /** * get data from input */ var { title, summaryTitle, url, isLocal, index, siteMap, modelType, } = req.body; /** * get id */ var sliderId = req.params.id; var targetSlider = await Slider.findOne({ _id: sliderId }); /** check slider exist or not */ if (!targetSlider) { return res404(res, `اسلایدر مورد نظر پیدا نشد`); } /** check access portal */ if (!req.user.portals.includes(targetSlider.modelType)) { return res500(res, `شما اجازه آپدیت این اسلایدر را ندارید`); } if (targetSlider.title !== title) { var checkDuppTitle = await Slider.findOne({ title: title }); if (checkDuppTitle) { return res.status(422).json({ validation: { title: { msg: _sr['fa'].duplicated.title } } }); } } /** * if we have pic upload to server */ if (req.files && req.files.cover) { const image = req.files.cover; if (!_sr.supportedImageFormats.includes(image.mimetype.split('/')[1])) { return res.status(422).json({ validation: { cover: { msg: _sr['fa'].format.image } } }); } const imageName = `slider_${Date.now()}_${targetSlider._id}.${image.mimetype.split('/')[1]}`; try { await deleteSliderImage(targetSlider, "cover"); await uploadProcessedImage( image.data, imageName, profileWidth, profileHeight, profileQuality ); targetSlider.cover = imageName; } catch (e) { return res500(res, e?.message); } } targetSlider.title = title.trim(); targetSlider.summaryTitle = summaryTitle.trim(); targetSlider.url = url.trim(); targetSlider.isLocal = isLocal targetSlider.index = index; targetSlider.siteMap = siteMap; targetSlider.modelType = modelType; await targetSlider.save(); /** * show result */ return res.json(targetSlider); } catch (error) { return res500(res, error.message); } } ] module.exports.deletOneSlider = [ async (req, res) => { try { var sliderId = req.params.id; var targetSlider = await Slider.findOne({ _id: sliderId }); /** check slider exist or not */ if (!targetSlider) { return res404(res, `اسلایدر مورد نظر پیدا نشد`); } /** check access portal */ if (!req.user.portals.includes(targetSlider.modelType)) { return res500(res, `شما اجازه حذف این اسلایدر را ندارید`); } await deleteSliderImage(targetSlider, "cover"); /** delete slider */ await targetSlider.deleteOne(); /** * show result */ return res.json(targetSlider); } catch (error) { /** * if we got unkown error show to client */ res500(res, error); } } ] module.exports.getOneSlider = [ async (req, res) => { try { var sliderId = req.params.id; var findQuery = { _id: sliderId }; var slider = await Slider.findOne(findQuery); if (!slider) { return res404(res, `اسلایدر مورد نظر پیدا نشد`); } /** check access portal */ if (!req.user.portals.includes(slider.modelType)) { return res.status(403).json({ message: `شما اجازه دسترسی به اطلاعات این اسلایدر را ندارید` }); } /** * show result */ return res.json(slider); } catch (error) { /** * if we got unkown error show to client */ res500(res, error); } } ] module.exports.getAllSliderByAdmin = [ async (req, res) => { try { var findQuery = {}; if (req.user.portals.length) { findQuery.modelType = { $in: req.user.portals }; } /** get all slider */ var allSlider = await Slider.find(findQuery).sort({ index: 1 }); /** if null we have error */ if (!allSlider) { return res500(res, `مشکلی در گرفتن اطلاعات پیش آمده است`); } /** show result to client */ return res.json(allSlider); } catch (error) { /** if we have unkown error show it */ return res500(res, error?.message); } } ] module.exports.search = [ async (req, res) => { try { var findQuery = {}; findQuery['$and'] = []; findQuery['$or'] = []; if (req.user.portals.length) { findQuery.modelType = { $in: req.user.portals }; } var { term, portals, galleryStatus, publish, galleryType, date } = req.body; /** search by term */ if (term && !_.isEmpty(term)) { findQuery['$or'].push( { title: { $regex: '.*' + term + '.*' }, } ); } /** search by galleryType */ if (galleryType && !_.isEmpty(galleryType)) { findQuery['$and'].push({ galleryType }); } /** search by publish */ if (!_.isUndefined(publish) && _.isBoolean(publish)) { findQuery['$and'].push({ publish }); } /** search by portals */ if (portals && !_.isEmpty(portals)) { findQuery['$and'].push({ modelType: { $in: portals } }) } /** search by galleryStatus */ if (!_.isUndefined(galleryStatus) && _.isBoolean(galleryStatus)) { findQuery['$and'].push({ galleryStatus }) } /** search by date */ if (date && !_.isEmpty(date)) { if (date.length === 1) { findQuery['$and'].push({ created_at: { $gte: moment(date[0]).startOf('days'), $lt: moment(date[0]).endOf('days') } }); } else { findQuery['$and'].push({ created_at: { $gte: new Date(date[0]), $lt: new Date(date[1]) } }); } } _.isEmpty(findQuery['$and']) && delete findQuery['$and']; _.isEmpty(findQuery['$or']) && delete findQuery['$or']; /** get gallery */ var gallery = await Gallery.paginate(findQuery, { page: req.query.page, limit, populate: [{ path: '_creator', select: { firstName: 1, lastName: 1, profilePic: 1 } }], sort: { index: -1 } }); /** show result */ return res.json(gallery); } catch (error) { return res500(res, error?.message) } } ] /////////////////////////////////////////////////////////////////////// public module.exports.getAllSliderByUser = [ async (req, res) => { try { let { portal, } = req.query; let findQuery = {}; let setSort = {index: -1}; findQuery.modelType = !portal ? 'ostandari' : portal; let getSlider = await Slider.find(findQuery).sort(setSort); return res.json(getSlider); } catch (error) { return res500(res, error?.message); } } ]