From 409e48df1ffa3faa04159fc6165543181558fdb9 Mon Sep 17 00:00:00 2001 From: Swift Date: Sun, 10 Sep 2023 12:50:23 +0330 Subject: [PATCH] User update by admin --- server/controllers/userController.js | 185 +++++++++++++++++++++++++++ server/routes/admin.js | 1 + 2 files changed, 186 insertions(+) diff --git a/server/controllers/userController.js b/server/controllers/userController.js index afa6c06..bc5d7f8 100644 --- a/server/controllers/userController.js +++ b/server/controllers/userController.js @@ -1218,3 +1218,188 @@ 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)