Files
ostandari/server/controllers/sliderController.js
2026-06-19 15:47:02 +03:30

523 lines
12 KiB
JavaScript

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);
}
}
]