From 29e2e2a1b8d1d1f9abff33777dc103b43198e2aa Mon Sep 17 00:00:00 2001 From: Mr Swift Date: Wed, 2 Oct 2024 18:51:15 +0330 Subject: [PATCH] add new endpoint for add user by admin --- layouts/admin.vue | 8 ++ pages/admin/gps/users/_user.vue | 210 ++++++++++++++++++++++++++++++++ pages/admin/gps/users/index.vue | 7 +- server/controllers/GPS.User.js | 128 +++++++++++++++++++ server/routes/admin.js | 2 + 5 files changed, 353 insertions(+), 2 deletions(-) create mode 100644 pages/admin/gps/users/_user.vue diff --git a/layouts/admin.vue b/layouts/admin.vue index e279048..82f91f1 100644 --- a/layouts/admin.vue +++ b/layouts/admin.vue @@ -42,7 +42,13 @@ export default { title: 'آسان سرویس | مدیریت سایت' } }, + async mounted() { + try { + await this.$axios.get('/api/admin/permissions') + } catch (error) { + this.$router.push('/auth/login-register') + } /// /////////////////////////////////////////////////// get products list | provinces | cities try { // verity request info @@ -79,6 +85,8 @@ export default { } catch (e) { this.$arpaError() } + + } } diff --git a/pages/admin/gps/users/_user.vue b/pages/admin/gps/users/_user.vue new file mode 100644 index 0000000..dc3b715 --- /dev/null +++ b/pages/admin/gps/users/_user.vue @@ -0,0 +1,210 @@ + + + diff --git a/pages/admin/gps/users/index.vue b/pages/admin/gps/users/index.vue index f6618fe..a41fe56 100644 --- a/pages/admin/gps/users/index.vue +++ b/pages/admin/gps/users/index.vue @@ -5,8 +5,8 @@ {{ user.first_name +" "+ user.last_name }} {{ user.mobile_number }} - {{ user.province_name }} - {{ user.city_name }} + {{ user.province_name?.provinceName }} + {{ user.city_name?.cityName }} {{ user.national_code }} {{ user.shopName }} {{ user.cell_number }} @@ -32,6 +32,9 @@ کاربران جی پی اس + افزودن diff --git a/server/controllers/GPS.User.js b/server/controllers/GPS.User.js index 5d0aab3..7cda92d 100644 --- a/server/controllers/GPS.User.js +++ b/server/controllers/GPS.User.js @@ -429,4 +429,132 @@ module.exports.activeUser = [ res.status(200).json(data) } +] + +module.exports.addUserByAdmin = [ + [ + 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) + }) + .bail() + .custom((value, { req }) => { + const nationalCode = value.trim() + return User.findOne({ national_code: nationalCode }).then(user => { + if (user && user.national_code === nationalCode) + return Promise.reject(new Error('کاربر با این کد ملی از قبل وجود دارد')) + else return true + }) + }), + + body('province_name').notEmpty().withMessage(_faSr.required.province), + + body('city_name').notEmpty().withMessage(_faSr.required.city), + + body('shopName') + .notEmpty() + .withMessage(_faSr.required.address), + + + 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) + return Promise.reject(new Error('کاربر با این شماره موبایل از قبل وجود دارد')) + else return true + }) + }), + + body('password') + .isLength({ min: 4 }) + .withMessage(_faSr.min_char.min4) + .custom((value, { req }) => { + if (value === req.body.password_confirmation) return true + else return Promise.reject(_faSr.response.passwords_not_match) + }) + ], + checkValidations(validationResult), + async (req, res) => { + try { + const provinceId = uid.v4() + const cityId = uid.v4() + + const { + first_name, + last_name, + national_code, + province_name, + city_name, + mobile_number, + password, + shopName + } = req.body + + const data = { + last_name, + province_name:{id:provinceId,provinceName:province_name}, + city_name:{id:cityId,cityName:city_name}, + shopName, + active:true + } + data.first_name = nameOptimizer(first_name) + data.national_code = national_code.trim() + data.mobile_number = normalizeMobileNumber(mobile_number) + + + // hash user password and done + const salt = await bcrypt.genSalt(10) + const hash = await bcrypt.hash(password, salt) + data.password = hash + + const user = new User(data) + await user.save() + + + return res.status(200).json({ message: _faSr.response.success_save }) + } catch (err) { + const registerFailurMsg = 'مشکلی در ثبت نام پیش آمده، لطفا مجددا تلاش کنید' + res500(res, registerFailurMsg) + } + } ] \ No newline at end of file diff --git a/server/routes/admin.js b/server/routes/admin.js index 1de8c77..3e87017 100644 --- a/server/routes/admin.js +++ b/server/routes/admin.js @@ -45,6 +45,8 @@ router.get('/gps/users',hasPermission('gps'), userGPS.getUsersForAdmin) router.get('/gps/users/pending',hasPermission('gps'), userGPS.getPendingUsersForAdmin) router.get('/gps/users/:id',hasPermission('gps'), userGPS.getUserForAdmin) +router.post('/gps/users',hasPermission('gps'), userGPS.addUserByAdmin) + router.patch('/gps/users/:id/:status',hasPermission('gps'), userGPS.activeUser)