342 lines
10 KiB
JavaScript
342 lines
10 KiB
JavaScript
const Occasion = require('../models/Occasion');
|
|
const {body, validationResult} = require('express-validator');
|
|
const {_sr} = require('../plugins/serverResponses');
|
|
const {res404, res500} = require('../plugins/controllersHelperFunctions');
|
|
const fs = require('fs');
|
|
const sharp = require('sharp');
|
|
const moment = require('moment-jalaali');
|
|
|
|
////// variables
|
|
const occasionWidth = 1920
|
|
const occasionHeight = 180
|
|
const occasionQuality = 100
|
|
|
|
const limit = 5;
|
|
|
|
/////////////////////////////////////////////////////////////////////// admin
|
|
module.exports.addOccasion = [
|
|
[
|
|
body('title')
|
|
.notEmpty().withMessage(_sr['fa'].required.title),
|
|
|
|
body('publish')
|
|
.optional().isBoolean().withMessage(_sr['fa'].format.boolean),
|
|
|
|
body('index')
|
|
.isNumeric().withMessage(_sr['fa'].format.number),
|
|
|
|
body('startDate')
|
|
.notEmpty().withMessage(`لطفا یک تاریخ شروع تعیین کنید`),
|
|
|
|
|
|
body('endDate')
|
|
.notEmpty().withMessage(`لطفا یک تاریخ پایان تعیین کنید`),
|
|
],
|
|
async (req, res) => {
|
|
const errors = validationResult(req)
|
|
if (!errors.isEmpty()) return res.status(422).json({
|
|
validation: errors.mapped()
|
|
});
|
|
|
|
try {
|
|
|
|
const {title, publish, index, startDate, endDate} = req.body;
|
|
|
|
const occasionData = {
|
|
title,
|
|
publish,
|
|
index,
|
|
startDate,
|
|
endDate,
|
|
_creator: req.user._id,
|
|
_updatedBy: req.user._id,
|
|
}
|
|
|
|
const addOccasion = await Occasion.create(occasionData);
|
|
|
|
if (!addOccasion) return res500(res, `مشلی در اجرای درخواست شما پیش امده است`);
|
|
|
|
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 = `occasion_${addOccasion._id}_${Date.now()}.jpg`;
|
|
const target = sharp(image.data)
|
|
await target
|
|
.resize(occasionWidth, occasionHeight, {
|
|
fit: 'cover'
|
|
})
|
|
.toFormat('jpg')
|
|
.jpeg({
|
|
quality: occasionQuality
|
|
})
|
|
.toFile(`./static/uploads/images/occasion/${imageName}`);
|
|
|
|
addOccasion.status = true;
|
|
addOccasion.mainCover = imageName;
|
|
await addOccasion.save();
|
|
}
|
|
|
|
/**
|
|
* show result
|
|
*/
|
|
return res.json(addOccasion);
|
|
} catch (error) {
|
|
return res500(res, `مشکلی در اجرای درخواست پیش آمده است`);
|
|
}
|
|
}
|
|
]
|
|
|
|
module.exports.updateOccasion = [
|
|
[
|
|
body('title')
|
|
.notEmpty().withMessage(_sr['fa'].required.title),
|
|
|
|
body('publish')
|
|
.optional().isBoolean().withMessage(_sr['fa'].format.boolean),
|
|
|
|
body('index')
|
|
.isNumeric().withMessage(_sr['fa'].format.number),
|
|
|
|
body('startDate')
|
|
.notEmpty().withMessage(`لطفا یک تاریخ شروع تعیین کنید`),
|
|
|
|
body('endDate')
|
|
.notEmpty().withMessage(`لطفا یک تاریخ پایان تعیین کنید`),
|
|
],
|
|
async (req, res) => {
|
|
const errors = validationResult(req)
|
|
if (!errors.isEmpty()) return res.status(422).json({
|
|
validation: errors.mapped()
|
|
});
|
|
|
|
|
|
try {
|
|
|
|
const {title, publish, index, startDate, endDate} = req.body;
|
|
|
|
const occasionId = req.params.id;
|
|
|
|
const targetOccasion = await Occasion.findById(occasionId);
|
|
|
|
if (!targetOccasion) {
|
|
return res404(res, `مناسبت مورد نظر پیدا نشد`);
|
|
}
|
|
|
|
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 = `occasion_${targetOccasion._id}_${Date.now()}.jpg`;
|
|
const target = sharp(image.data)
|
|
await target
|
|
.resize(occasionWidth, occasionHeight, {
|
|
fit: 'cover'
|
|
})
|
|
.toFormat('jpg')
|
|
.jpeg({
|
|
quality: occasionQuality
|
|
})
|
|
.toFile(`./static/uploads/images/occasion/${imageName}`);
|
|
|
|
if (targetOccasion.mainCover) {
|
|
var oldPic = `./static${targetOccasion.mainCover}`;
|
|
|
|
if (fs.existsSync(oldPic)) {
|
|
fs.unlink(oldPic, (err) => {
|
|
if (err) return res500(res, err?.message);
|
|
});
|
|
}
|
|
}
|
|
|
|
targetOccasion.status = true;
|
|
targetOccasion.mainCover = imageName;
|
|
}
|
|
|
|
targetOccasion.title = title;
|
|
targetOccasion.publish = publish;
|
|
targetOccasion.index = index;
|
|
targetOccasion.startDate = startDate;
|
|
targetOccasion.endDate = endDate;
|
|
targetOccasion._updatedBy = req.user._id;
|
|
|
|
await targetOccasion.save();
|
|
|
|
return res.json(targetOccasion);
|
|
} catch (error) {
|
|
return res500(res, `مشکلی در اجرای درخواست پیش آمده است`);
|
|
}
|
|
}
|
|
]
|
|
|
|
module.exports.deleteOccasion = [
|
|
async (req, res) => {
|
|
try {
|
|
const occasionId = req.params.id;
|
|
|
|
const targetOccasion = await Occasion.findById(occasionId);
|
|
|
|
if (!targetOccasion) {
|
|
return res404(res, `مناسبت مورد نظر پیدا نشد`);
|
|
}
|
|
|
|
if (targetOccasion.mainCover) {
|
|
var oldPic = `./static${targetOccasion.mainCover}`;
|
|
|
|
if (fs.existsSync(oldPic)) {
|
|
fs.unlink(oldPic, (err) => {
|
|
if (err) return res500(res, err?.message);
|
|
});
|
|
}
|
|
}
|
|
|
|
await targetOccasion.deleteOne();
|
|
|
|
return res.json({message: `مناسبت مورد نظر حذف گرید`});
|
|
} catch (error) {
|
|
return res500(res, `مشکلی در اجرای درخواست پیش آمده است`);
|
|
}
|
|
}
|
|
]
|
|
|
|
module.exports.getOccasionByAdmin = [
|
|
async (req, res) => {
|
|
try {
|
|
const occasionId = req.params.id;
|
|
const getOccasion = await Occasion.findById(occasionId);
|
|
|
|
/**
|
|
* if not exist
|
|
*/
|
|
if (!getOccasion) return res404(res, `اطلاعات مورد نظر پیدا نشد`);
|
|
|
|
/**
|
|
* show result
|
|
*/
|
|
return res.json(getOccasion);
|
|
} catch (error) {
|
|
/**
|
|
* if we got unkown error show to client
|
|
*/
|
|
return res500(res, `مشکلی در اجرای درخواست شما پیش آمده است`);
|
|
}
|
|
}
|
|
]
|
|
|
|
module.exports.getAllOccasionByAdmin = [
|
|
async (req, res) => {
|
|
try {
|
|
const getAllOccasion = await Occasion.paginate({}, {
|
|
page: req.query.page || 1,
|
|
populate: {path: '_creator', select: 'firstName lastName'},
|
|
limit,
|
|
sort: {_id: -1}
|
|
});
|
|
|
|
return res.json(getAllOccasion);
|
|
} catch (error) {
|
|
/**
|
|
* if we got unkown error show to client
|
|
*/
|
|
return res500(res, `مشکلی در اجرای درخواست شما پیش آمده است`);
|
|
}
|
|
}
|
|
]
|
|
|
|
module.exports.getAllOccasionForIndex = [
|
|
async (req, res) => {
|
|
try {
|
|
const getAllOccasion = await Occasion.find();
|
|
|
|
return res.json(getAllOccasion);
|
|
} catch (error) {
|
|
/**
|
|
* if we got unkown error show to client
|
|
*/
|
|
return res500(res, `مشکلی در اجرای درخواست شما پیش آمده است`);
|
|
}
|
|
}
|
|
]
|
|
|
|
module.exports.search = [
|
|
async (req, res) => {
|
|
try {
|
|
let query = {};
|
|
let populate = [{
|
|
path: '_creator',
|
|
select: {firstName: 1, lastName: 1, profilePic: 1}
|
|
}];
|
|
|
|
|
|
query['$and'] = [];
|
|
|
|
const {
|
|
term,
|
|
publish,
|
|
status,
|
|
date
|
|
} = req.body;
|
|
|
|
/** search by term */
|
|
if (term && !_.isEmpty(term)) {
|
|
query['$and'].push({
|
|
$or: [{
|
|
title: {
|
|
$regex: '.*' + term + '.*'
|
|
}
|
|
}]
|
|
});
|
|
}
|
|
|
|
/** search by publish */
|
|
if (!_.isUndefined(publish) && _.isBoolean(publish)) {
|
|
query['$and'].push({
|
|
publish
|
|
});
|
|
}
|
|
|
|
/** search by status */
|
|
if (!_.isUndefined(status) && _.isBoolean(status)) {
|
|
query['$and'].push({
|
|
status
|
|
});
|
|
}
|
|
|
|
/** search by date */
|
|
if (date && !_.isEmpty(date)) {
|
|
if (date.length === 1) {
|
|
query['$and'].push({
|
|
startDate:{$lte : new Date(date[0])},
|
|
endDate: {$gte : new Date(date[0])}
|
|
});
|
|
} else {
|
|
query['$and'].push({
|
|
startDate: {$lte : new Date(date[0])},
|
|
endDate:{$gte : new Date(date[1])}
|
|
});
|
|
}
|
|
}
|
|
|
|
_.isEmpty(query['$and']) && delete query['$and'];
|
|
// _.isEmpty(input['$or']) && delete input['$or'];
|
|
|
|
/** get news */
|
|
const occasion = await Occasion.paginate(query, {
|
|
page: req.query.page || 1,
|
|
limit,
|
|
populate,
|
|
sort: {_id: -1}
|
|
});
|
|
|
|
/** show result */
|
|
return res.json(occasion);
|
|
} catch (error) {
|
|
return res500(res, error?.message)
|
|
}
|
|
}
|
|
]
|