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

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