From ce91aa24de2c807484a428886a0394d8f852e6ac Mon Sep 17 00:00:00 2001 From: Swift Date: Sun, 20 Aug 2023 13:50:30 +0330 Subject: [PATCH 1/3] #1 --- server/controllers/announcementController.js | 18 +++++++++++++++++- server/models/Announcement.js | 5 +++++ 2 files changed, 22 insertions(+), 1 deletion(-) diff --git a/server/controllers/announcementController.js b/server/controllers/announcementController.js index f5d3d56..3ba17b1 100644 --- a/server/controllers/announcementController.js +++ b/server/controllers/announcementController.js @@ -5,6 +5,7 @@ const { res404, res500, checkValidations } = require('../plugins/controllersHelp const { notifyAllUsers } = require('../WebSocket/controllers/user_EventsController') const { notifyAllAgents } = require('../WebSocket/controllers/agent_EventsController') const _faSr = _sr.fa +const maxAttachmentSize = 2048 module.exports.create = [ [ @@ -31,10 +32,25 @@ module.exports.create = [ .withMessage(_faSr.format.boolean) ], checkValidations(validationResult), - (req, res) => { + async (req, res) => { const { title, caption, expireDate, isForAgents } = req.body const { user_id } = req const data = { title, caption, expireDate, isForAgents, _creator: user_id } + + if (req.files?.image) { + const image = req.files.image + const fileName = 'TicketAttachment_' + Date.now() + '.' + image.mimetype.split('/')[1] + const acceptableFormats = ['png', 'jpg', 'jpeg', 'webp'] + if (!acceptableFormats.includes(image.mimetype.split('/')[1])) + return res.status(422).json({ validation: { image: { msg: _faSr.format.image } } }) + if (image.size / 1024 > maxAttachmentSize) + return res + .status(422) + .json({ validation: { image: { msg: `حجم تصویر نباید بیشتر از ${maxAttachmentSize} KB باشد.` } } }) + data.image = fileName + await image.mv(`./static/uploads/images/announcement/${fileName}`) + } + const announcement = new Announcement(data) announcement.save(err => { if (err) return res500(res, err) diff --git a/server/models/Announcement.js b/server/models/Announcement.js index 3f31525..76d61f7 100644 --- a/server/models/Announcement.js +++ b/server/models/Announcement.js @@ -1,5 +1,9 @@ const mongoose = require('mongoose') +function image(img) { + if (img) return '/uploads/images/announcement/' + img +} + const AnnouncementSchema = mongoose.Schema({ title: String, caption: String, @@ -7,6 +11,7 @@ const AnnouncementSchema = mongoose.Schema({ expireDate: Number, expired: { type: Boolean, default: false }, isForAgents: { type: Boolean, default: false }, + image: { type: String, get: image }, _creator: { type: mongoose.ObjectId, ref: 'User' } }) From 8767328a3683a4c5c04692f49631dddeb56ae02e Mon Sep 17 00:00:00 2001 From: Swift Date: Fri, 8 Sep 2023 23:11:17 +0330 Subject: [PATCH 2/3] Update User --- server/controllers/userController.js | 186 +++++++++++++++++++++++++++ server/routes/admin.js | 1 + 2 files changed, 187 insertions(+) diff --git a/server/controllers/userController.js b/server/controllers/userController.js index c8679dc..bc5d7f8 100644 --- a/server/controllers/userController.js +++ b/server/controllers/userController.js @@ -1217,3 +1217,189 @@ module.exports.getUser = [ } } ] + + +module.exports.updateUserByAdmin = [ + [ + body('first_name') + .notEmpty() + .withMessage(_faSr.required.first_name) + .bail() + .isLength({ min: 2 }) + .withMessage(_faSr.min_char.min2) + .bail() + .custom((value, { req }) => { + if (removeWhiteSpaces(value).length < 2) return Promise.reject(_faSr.min_char.min2) + if (!isPersian(value)) return Promise.reject(new Error('لطفا با حروف فارسی تایپ کنید')) + else return true + }), + + body('last_name') + .notEmpty() + .withMessage(_faSr.required.first_name) + .bail() + .isLength({ min: 2 }) + .withMessage(_faSr.min_char.min2) + .bail() + .custom((value, { req }) => { + if (removeWhiteSpaces(value).length < 2) return Promise.reject(_faSr.min_char.min2) + if (!isPersian(value)) return Promise.reject(new Error('لطفا با حروف فارسی تایپ کنید')) + else return true + }), + + body('national_code') + .notEmpty() + .withMessage(_faSr.required.national_code) + .bail() + .custom((value, { req }) => { + if (checkNationalCode(value)) return true + else return Promise.reject(_faSr.format.national_code) + }) + .custom((value, { req }) => { + const nationalCode = value.trim() + return User.findOne({ national_code: nationalCode }).then(user => { + if (user && user.national_code === nationalCode && user._id.toString() !== req.body._id) + return Promise.reject(new Error('کاربر با این کد ملی از قبل وجود دارد')) + else return true + }) + }), + + body('province_id').notEmpty().withMessage(_faSr.required.province), + + body('city_id').notEmpty().withMessage(_faSr.required.city), + + body('address') + .notEmpty() + .withMessage(_faSr.required.address) + .bail() + .custom((value, { req }) => { + if (!isPersianWithDigits(value)) return Promise.reject(new Error('لطفا با حروف فارسی تایپ کنید')) + else return true + }), + + body('postal_code') + .notEmpty() + .withMessage(_faSr.required.postal_code) + .bail() + .isNumeric() + .withMessage(_faSr.format.number), + + body('tel_number') + .notEmpty() + .withMessage(_faSr.required.phone_number) + .bail() + .isNumeric() + .withMessage(_faSr.format.phone_number), + + body('mobile_number') + .notEmpty() + .withMessage(_faSr.required.phone_number) + .bail() + .custom((value, { req }) => { + const mobileNStatus = checkMobileNumber(value) + if (!mobileNStatus) return Promise.reject(_faSr.format.phone_number) + else return Promise.resolve() + }) + .bail() + .custom((value, { req }) => { + const mobileNumber = value.trim() + return User.findOne({ mobile_number: mobileNumber }).then(user => { + if (user && user.mobile_number === mobileNumber && user._id.toString() !== req.body._id) + return Promise.reject(new Error('کاربر با این شماره موبایل از قبل وجود دارد')) + else return true + }) + }), + + body('email') + .notEmpty() + .withMessage(_faSr.required.email) + .bail() + .isEmail() + .withMessage(_faSr.format.email) + .bail() + .custom((value, { req }) => { + const email = value.trim().toLowerCase() + return User.findOne({ email }).then(user => { + if (user && user.email === email && user._id.toString() !== req.body._id) + return Promise.reject(_faSr.duplicated.email) + else return true + }) + }) + ], + checkValidations(validationResult), + async (req, res) => { + const { + first_name, + last_name, + national_code, + province_id, + province_name, + city_id, + city_name, + address, + postal_code, + tel_number, + mobile_number, + email, + store_name + } = req.body + + const MongoData = { + last_name, + province_id, + province_name, + city_id, + city_name, + address, + postal_code, + tel_number, + store_name + } + MongoData.first_name = nameOptimizer(first_name) + MongoData.national_code = national_code.trim() + MongoData.mobile_number = normalizeMobileNumber(mobile_number) + MongoData.email = email.trim().toLowerCase() + + try { + const user_id = req.params.id + const user = await User.findById(user_id) + if (!user) return res404(res, _faSr.not_found.user_id) + + // check if need to ferify email or mobile + const newEmail = user.email !== MongoData.email + const newMobile = user.mobile_number !== MongoData.mobile_number + if (newEmail) user.email_confirmed = false + if (newMobile) user.mobile_confirmed = false + + // save new info to arpa + await updateUserOnArpa(MongoData, user.verity_businessID, 'verity') + await updateUserOnArpa(MongoData, user.panatech_businessID, 'panatech') + + // save new info to user + user.first_name = MongoData.first_name + user.last_name = MongoData.last_name + user.national_code = MongoData.national_code + user.province_id = MongoData.province_id + user.province_name = MongoData.province_name + user.city_id = MongoData.city_id + user.city_name = MongoData.city_name + user.address = MongoData.address + user.postal_code = MongoData.postal_code + user.tel_number = MongoData.tel_number + user.store_name = MongoData.store_name + user.mobile_number = MongoData.mobile_number + user.email = MongoData.email + + await user.save() + + // send confirmation key after user saved + if (newEmail) await sendConfirmationEmail(user_id) + if (newMobile) await sendConfirmationSMS(user_id) + + return res.json({ message: _faSr.response.success_save }) + } catch (e) { + console.log('Arpa Error during update user --', e) + return res500(res, _faSr.response.problem) + } + } +] diff --git a/server/routes/admin.js b/server/routes/admin.js index d75a0d7..afa0a3b 100644 --- a/server/routes/admin.js +++ b/server/routes/admin.js @@ -82,6 +82,7 @@ router.get('/permissions', hasPermission('admins'), userController.permissions) /// ///////////// manage users router.get('/users', hasPermission('customers'), userController.get_all_users_for_admin) router.get('/user/:id', hasPermission('customers'), userController.get_one_user_for_admin) +router.put('/user/:id', hasPermission('customers'), userController.updateUserByAdmin) router.put('/user/changeVerityInfo/:id', hasPermission('customers'), userController.change_verity_info_by_admin) router.put('/user/changePanatechInfo/:id', hasPermission('customers'), userController.change_panatech_info_by_admin) From 435ab7842433ee7b30c7fc607b74bfbf2f5d3450 Mon Sep 17 00:00:00 2001 From: Swift Date: Sun, 10 Sep 2023 12:49:07 +0330 Subject: [PATCH 3/3] User --- server/controllers/userController.js | 185 --------------------------- server/routes/admin.js | 1 - 2 files changed, 186 deletions(-) diff --git a/server/controllers/userController.js b/server/controllers/userController.js index bc5d7f8..afa6c06 100644 --- a/server/controllers/userController.js +++ b/server/controllers/userController.js @@ -1218,188 +1218,3 @@ module.exports.getUser = [ } ] - -module.exports.updateUserByAdmin = [ - [ - body('first_name') - .notEmpty() - .withMessage(_faSr.required.first_name) - .bail() - .isLength({ min: 2 }) - .withMessage(_faSr.min_char.min2) - .bail() - .custom((value, { req }) => { - if (removeWhiteSpaces(value).length < 2) return Promise.reject(_faSr.min_char.min2) - if (!isPersian(value)) return Promise.reject(new Error('لطفا با حروف فارسی تایپ کنید')) - else return true - }), - - body('last_name') - .notEmpty() - .withMessage(_faSr.required.first_name) - .bail() - .isLength({ min: 2 }) - .withMessage(_faSr.min_char.min2) - .bail() - .custom((value, { req }) => { - if (removeWhiteSpaces(value).length < 2) return Promise.reject(_faSr.min_char.min2) - if (!isPersian(value)) return Promise.reject(new Error('لطفا با حروف فارسی تایپ کنید')) - else return true - }), - - body('national_code') - .notEmpty() - .withMessage(_faSr.required.national_code) - .bail() - .custom((value, { req }) => { - if (checkNationalCode(value)) return true - else return Promise.reject(_faSr.format.national_code) - }) - .custom((value, { req }) => { - const nationalCode = value.trim() - return User.findOne({ national_code: nationalCode }).then(user => { - if (user && user.national_code === nationalCode && user._id.toString() !== req.body._id) - return Promise.reject(new Error('کاربر با این کد ملی از قبل وجود دارد')) - else return true - }) - }), - - body('province_id').notEmpty().withMessage(_faSr.required.province), - - body('city_id').notEmpty().withMessage(_faSr.required.city), - - body('address') - .notEmpty() - .withMessage(_faSr.required.address) - .bail() - .custom((value, { req }) => { - if (!isPersianWithDigits(value)) return Promise.reject(new Error('لطفا با حروف فارسی تایپ کنید')) - else return true - }), - - body('postal_code') - .notEmpty() - .withMessage(_faSr.required.postal_code) - .bail() - .isNumeric() - .withMessage(_faSr.format.number), - - body('tel_number') - .notEmpty() - .withMessage(_faSr.required.phone_number) - .bail() - .isNumeric() - .withMessage(_faSr.format.phone_number), - - body('mobile_number') - .notEmpty() - .withMessage(_faSr.required.phone_number) - .bail() - .custom((value, { req }) => { - const mobileNStatus = checkMobileNumber(value) - if (!mobileNStatus) return Promise.reject(_faSr.format.phone_number) - else return Promise.resolve() - }) - .bail() - .custom((value, { req }) => { - const mobileNumber = value.trim() - return User.findOne({ mobile_number: mobileNumber }).then(user => { - if (user && user.mobile_number === mobileNumber && user._id.toString() !== req.body._id) - return Promise.reject(new Error('کاربر با این شماره موبایل از قبل وجود دارد')) - else return true - }) - }), - - body('email') - .notEmpty() - .withMessage(_faSr.required.email) - .bail() - .isEmail() - .withMessage(_faSr.format.email) - .bail() - .custom((value, { req }) => { - const email = value.trim().toLowerCase() - return User.findOne({ email }).then(user => { - if (user && user.email === email && user._id.toString() !== req.body._id) - return Promise.reject(_faSr.duplicated.email) - else return true - }) - }) - ], - checkValidations(validationResult), - async (req, res) => { - const { - first_name, - last_name, - national_code, - province_id, - province_name, - city_id, - city_name, - address, - postal_code, - tel_number, - mobile_number, - email, - store_name - } = req.body - - const MongoData = { - last_name, - province_id, - province_name, - city_id, - city_name, - address, - postal_code, - tel_number, - store_name - } - MongoData.first_name = nameOptimizer(first_name) - MongoData.national_code = national_code.trim() - MongoData.mobile_number = normalizeMobileNumber(mobile_number) - MongoData.email = email.trim().toLowerCase() - - try { - const user_id = req.params.id - const user = await User.findById(user_id) - if (!user) return res404(res, _faSr.not_found.user_id) - - // check if need to ferify email or mobile - const newEmail = user.email !== MongoData.email - const newMobile = user.mobile_number !== MongoData.mobile_number - if (newEmail) user.email_confirmed = false - if (newMobile) user.mobile_confirmed = false - - // save new info to arpa - await updateUserOnArpa(MongoData, user.verity_businessID, 'verity') - await updateUserOnArpa(MongoData, user.panatech_businessID, 'panatech') - - // save new info to user - user.first_name = MongoData.first_name - user.last_name = MongoData.last_name - user.national_code = MongoData.national_code - user.province_id = MongoData.province_id - user.province_name = MongoData.province_name - user.city_id = MongoData.city_id - user.city_name = MongoData.city_name - user.address = MongoData.address - user.postal_code = MongoData.postal_code - user.tel_number = MongoData.tel_number - user.store_name = MongoData.store_name - user.mobile_number = MongoData.mobile_number - user.email = MongoData.email - - await user.save() - - // send confirmation key after user saved - if (newEmail) await sendConfirmationEmail(user_id) - if (newMobile) await sendConfirmationSMS(user_id) - - return res.json({ message: _faSr.response.success_save }) - } catch (e) { - console.log('Arpa Error during update user --', e) - return res500(res, _faSr.response.problem) - } - } -] diff --git a/server/routes/admin.js b/server/routes/admin.js index afa0a3b..d75a0d7 100644 --- a/server/routes/admin.js +++ b/server/routes/admin.js @@ -82,7 +82,6 @@ router.get('/permissions', hasPermission('admins'), userController.permissions) /// ///////////// manage users router.get('/users', hasPermission('customers'), userController.get_all_users_for_admin) router.get('/user/:id', hasPermission('customers'), userController.get_one_user_for_admin) -router.put('/user/:id', hasPermission('customers'), userController.updateUserByAdmin) router.put('/user/changeVerityInfo/:id', hasPermission('customers'), userController.change_verity_info_by_admin) router.put('/user/changePanatechInfo/:id', hasPermission('customers'), userController.change_panatech_info_by_admin)