From 1c6a44d7183b39211b994a6f01adf767f1bcd559 Mon Sep 17 00:00:00 2001 From: Mr Swift Date: Mon, 5 Aug 2024 17:00:48 +0330 Subject: [PATCH] Fix model & request for gps controller --- server/authentication.js | 18 + server/controllers/GPS.Request.js | 97 ++++++ server/controllers/userController.js | 347 ++++++++++--------- server/models/GPS.Request.js | 23 ++ server/models/User.js | 10 +- server/plugins/controllersHelperFunctions.js | 4 +- server/plugins/permissions.js | 4 + server/plugins/serverResponses.js | 1 + server/routes/admin.js | 6 + server/routes/user.js | 4 + 10 files changed, 339 insertions(+), 175 deletions(-) create mode 100644 server/controllers/GPS.Request.js create mode 100644 server/models/GPS.Request.js diff --git a/server/authentication.js b/server/authentication.js index 7bbf587..a59c145 100644 --- a/server/authentication.js +++ b/server/authentication.js @@ -39,6 +39,24 @@ const authentication = { return res401(res, 'unauthorized') } }, + // check if admin logged in (middleware) + async isGPS(req, res, next) { + try { + const token = req.headers?.authorization + if (!token) throw new Error('err') + + const decoded = jwt.verify(token.replace(/^Bearer\s/, ''), authentication.secretKey) + if (!decoded) throw new Error('err') + + const user = await User.findById(decoded._id) + if (!user || !user.scope.includes('gps')) throw new Error('err') + + req.user_id = decoded._id + return next() + } catch (err) { + return res401(res, 'unauthorized') + } + }, // check if user logged in (middleware) async isUser(req, res, next) { try { diff --git a/server/controllers/GPS.Request.js b/server/controllers/GPS.Request.js new file mode 100644 index 0000000..b8893bf --- /dev/null +++ b/server/controllers/GPS.Request.js @@ -0,0 +1,97 @@ +const { body, param, validationResult } = require('express-validator') +const { _sr } = require('../plugins/serverResponses') +const { checkValidations, res400 } = require('../plugins/controllersHelperFunctions') +const User = require('../models/User') +const RequestGPS = require('../models/GPS.Request') + +module.exports.gpsRequest = [ + [ + body('shopName').notEmpty().isString().withMessage(_sr.fa.required.name), + body('shopNumber').notEmpty().isString().withMessage(_sr.fa.required.store_number), + body('shopAddress').notEmpty().isString().withMessage(_sr.fa.required.address), + body('birthDate').notEmpty().isString().withMessage(_sr.fa.required.date), + ], + checkValidations(validationResult), + async (req, res) => { + const { shopName, shopNumber, shopAddress, birthDate, profilePic } = req.body; + const repeated = await RequestGPS.findOne({ userId: req.user_id }) + if (repeated) { + res400(res, "شما قبلا درخواست ثبت کرده اید") + } else { + const request = await RequestGPS.create({ + shopName, + shopNumber, + shopAddress, + birthDate, + profilePic, + userId: req.user_id, + }) + res.status(201).json({ msg: 'درخواست شما با موفقیت ثبت شد', date: request }) + } + + } +] + + +module.exports.getAllRequest = [ + async (req, res) => { + const data = await RequestGPS.find({}).sort({ status: 1 }) + res.status(200).json(data) + } +] + +module.exports.getOneRequest = [ + [ + param('id').notEmpty().isMongoId().withMessage('این ایدی اشتباه است') + ], + checkValidations(validationResult), + async (req, res) => { + const data = await RequestGPS.findById(req.params.id).populate('userId') + res.status(200).json(data) + } +] + + +module.exports.changeStatus = [ + [ + param('status').notEmpty().isString().withMessage('این استاتوس اشتباه است'), + param('id').notEmpty().isMongoId().withMessage('این ایدی اشتباه است') + ], + checkValidations(validationResult), + async (req, res) => { + switch (req.params.status) { + case "accept": { + const data = await RequestGPS.findByIdAndUpdate(req.params.id, + { + status:1 + }, + { new: true }) + const userData = await User.findByIdAndUpdate( + data.userId, + { + shopName: data.shopName, + shopNumber: data.shopNumber, + shopAddress: data.shopAddress, + birthDate: data.birthDate, + }, + { new: true} + ) + res.status(200).json({ msg: 'با موفقیت به روز شد', data:userData }) + break; + } + case "reject": { + const data = await RequestGPS.findByIdAndUpdate(req.params.id, + { + status:2 + }, + { new: true }) + + res.status(200).json({ msg: 'با موفقیت به روز شد', data }) + break; + } + default: + res.status(400).json({ msg: 'این استاتوس اشتباه است' }) + break; + } + } +] diff --git a/server/controllers/userController.js b/server/controllers/userController.js index 99a1b53..5e04ce3 100644 --- a/server/controllers/userController.js +++ b/server/controllers/userController.js @@ -1238,179 +1238,6 @@ module.exports.update_user_by_admin = [ } ] - -/// //////////////////////////////////////////////////////////////////// authentication - -/// //////// Login - -module.exports.webLogin = [ - [ - body('username') - .isLength({ min: 4 }) - .withMessage(_faSr.min_char.min4) - .bail() - .if((value, { req }) => { - return req.body.password && req.body.password.length >= 4 - }) - .custom((value, { req }) => { - return User.findOne({ - $or: [{ email: value.toLowerCase().trim() }, { national_code: value }, { username: value }] - }).then(user => { - if (!user) return Promise.reject(_faSr.not_found.password) - else return true - }) - }), - - body('password') - .notEmpty() - .withMessage(_faSr.required.password) - .bail() - .isLength({ min: 4 }) - .withMessage(_faSr.min_char.min4), - - body('remember_me') - .exists() - .withMessage(_faSr.required.remember_me) - .bail() - .isBoolean() - .withMessage(_faSr.format.boolean) - ], - checkValidations(validationResult), - async (req, res) => { - try { - const { username, password } = req.body - const user = await User.findOne({ - $or: [{ email: username.toLowerCase().trim() }, { national_code: username }, { username }] - }) - if (!user) throw new Error('err') - const passwordMatch = await bcrypt.compare(password, user.password) - if (!passwordMatch) throw new Error('err') - const token = await jwt.sign({ _id: user._id }, secretKey, { - expiresIn: req.body.remember_me ? '30d' : '7d' - }) - user.token = token - await user.save() - return res.json({ token }) - } catch (err) { - return res.status(422).json({ - validation: { username: { msg: _faSr.not_found.password } } - }) - } - } -] - -module.exports.appLogin = [ - [ - body('username') - .isLength({ min: 4 }) - .withMessage(_faSr.min_char.min4) - .bail() - .if((value, { req }) => { - return req.body.password && req.body.password.length >= 4 - }) - .custom((value, { req }) => { - return User.findOne({ - $or: [{ email: value.toLowerCase().trim() }, { national_code: value }] - }).then(user => { - if (!user) return Promise.reject(_faSr.not_found.password) - else return true - }) - }), - - body('password') - .notEmpty() - .withMessage(_faSr.required.password) - .bail() - .isLength({ min: 4 }) - .withMessage(_faSr.min_char.min4) - ], - checkValidations(validationResult), - async (req, res) => { - try { - const { username, password } = req.body - const user = await User.findOne({ - $or: [{ email: username.toLowerCase().trim() }, { national_code: username }] - }) - if (!user) throw new Error('err') - - const passwordMatch = await bcrypt.compare(password, user.password) - if (!passwordMatch) throw new Error('err') - - const token = await jwt.sign({ _id: user._id }, secretKey, { - expiresIn: '60d' - }) - user.appToken = token - await user.save() - return res.json({ token }) - } catch (err) { - return res.status(422).json({ - validation: { username: { msg: _faSr.not_found.password } } - }) - } - } -] - -/// //////// logout -module.exports.webLogout = [ - async (req, res) => { - try { - const token = req.headers?.authorization - if (!token) throw new Error('err') - - const user = await User.findOne({ token }) - if (!user) throw new Error('err') - - user.token = null - await user.save() - - return res.json({ message: _faSr.response.logged_out }) - } catch (err) { - return res.status(401).json({ message: _faSr.response.not_logged_in }) - } - } -] - -module.exports.appLogout = [ - async (req, res) => { - try { - const token = req.headers?.authorization - if (!token) throw new Error('err') - - const user = await User.findOne({ appToken: token }) - if (!user) throw new Error('err') - - user.appToken = null - await user.save() - - return res.json({ message: _faSr.response.logged_out }) - } catch (err) { - return res.status(401).json({ message: _faSr.response.not_logged_in }) - } - } -] - -/// //////// get user -module.exports.getUser = [ - async (req, res) => { - try { - const token = req.headers?.authorization - if (!token) throw new Error('err') - - const decoded = jwt.verify(token, secretKey) - if (!decoded) throw new Error('err') - - const user = await User.findById(decoded?._id).select( - '-token -appToken -emailConfirmationKey -mobileConfirmationKey -password -resetPassToken' - ) - return res.json({ user }) - } catch (err) { - console.log('🚀 ~ file: userController.js ~ line 1070 ~ err', err) - return res.status(401).json({ message: 'unauthenticated' }) - } - } -] - - module.exports.updateUserByAdmin = [ [ body('first_name') @@ -1595,3 +1422,177 @@ module.exports.updateUserByAdmin = [ } } ] + +/// //////////////////////////////////////////////////////////////////// authentication + +/// //////// Login + +module.exports.webLogin = [ + [ + body('username') + .isLength({ min: 4 }) + .withMessage(_faSr.min_char.min4) + .bail() + .if((value, { req }) => { + return req.body.password && req.body.password.length >= 4 + }) + .custom((value, { req }) => { + return User.findOne({ + $or: [{ email: value.toLowerCase().trim() }, { national_code: value }, { username: value }] + }).then(user => { + if (!user) return Promise.reject(_faSr.not_found.password) + else return true + }) + }), + + body('password') + .notEmpty() + .withMessage(_faSr.required.password) + .bail() + .isLength({ min: 4 }) + .withMessage(_faSr.min_char.min4), + + body('remember_me') + .exists() + .withMessage(_faSr.required.remember_me) + .bail() + .isBoolean() + .withMessage(_faSr.format.boolean) + ], + checkValidations(validationResult), + async (req, res) => { + try { + const { username, password } = req.body + const user = await User.findOne({ + $or: [{ email: username.toLowerCase().trim() }, { national_code: username }, { username }] + }) + if (!user) throw new Error('err') + const passwordMatch = await bcrypt.compare(password, user.password) + if (!passwordMatch) throw new Error('err') + const token = await jwt.sign({ _id: user._id }, secretKey, { + expiresIn: req.body.remember_me ? '30d' : '7d' + }) + user.token = token + await user.save() + return res.json({ token }) + } catch (err) { + return res.status(422).json({ + validation: { username: { msg: _faSr.not_found.password } } + }) + } + } +] + +module.exports.appLogin = [ + [ + body('username') + .isLength({ min: 4 }) + .withMessage(_faSr.min_char.min4) + .bail() + .if((value, { req }) => { + return req.body.password && req.body.password.length >= 4 + }) + .custom((value, { req }) => { + return User.findOne({ + $or: [{ email: value.toLowerCase().trim() }, { national_code: value }] + }).then(user => { + if (!user) return Promise.reject(_faSr.not_found.password) + else return true + }) + }), + + body('password') + .notEmpty() + .withMessage(_faSr.required.password) + .bail() + .isLength({ min: 4 }) + .withMessage(_faSr.min_char.min4) + ], + checkValidations(validationResult), + async (req, res) => { + try { + const { username, password } = req.body + const user = await User.findOne({ + $or: [{ email: username.toLowerCase().trim() }, { national_code: username }] + }) + if (!user) throw new Error('err') + + const passwordMatch = await bcrypt.compare(password, user.password) + if (!passwordMatch) throw new Error('err') + + const token = await jwt.sign({ _id: user._id }, secretKey, { + expiresIn: '60d' + }) + user.appToken = token + await user.save() + return res.json({ token }) + } catch (err) { + return res.status(422).json({ + validation: { username: { msg: _faSr.not_found.password } } + }) + } + } +] + +/// //////// logout +module.exports.webLogout = [ + async (req, res) => { + try { + const token = req.headers?.authorization + if (!token) throw new Error('err') + + const user = await User.findOne({ token }) + if (!user) throw new Error('err') + + user.token = null + await user.save() + + return res.json({ message: _faSr.response.logged_out }) + } catch (err) { + return res.status(401).json({ message: _faSr.response.not_logged_in }) + } + } +] + +module.exports.appLogout = [ + async (req, res) => { + try { + const token = req.headers?.authorization + if (!token) throw new Error('err') + + const user = await User.findOne({ appToken: token }) + if (!user) throw new Error('err') + + user.appToken = null + await user.save() + + return res.json({ message: _faSr.response.logged_out }) + } catch (err) { + return res.status(401).json({ message: _faSr.response.not_logged_in }) + } + } +] + +/// //////// get user +module.exports.getUser = [ + async (req, res) => { + try { + const token = req.headers?.authorization + if (!token) throw new Error('err') + + const decoded = jwt.verify(token, secretKey) + if (!decoded) throw new Error('err') + + const user = await User.findById(decoded?._id).select( + '-token -appToken -emailConfirmationKey -mobileConfirmationKey -password -resetPassToken' + ) + return res.json({ user }) + } catch (err) { + console.log('🚀 ~ file: userController.js ~ line 1070 ~ err', err) + return res.status(401).json({ message: 'unauthenticated' }) + } + } +] + +/// ////////////////////////////////////////////////////////////////////////// GPS Section + diff --git a/server/models/GPS.Request.js b/server/models/GPS.Request.js new file mode 100644 index 0000000..f2253a4 --- /dev/null +++ b/server/models/GPS.Request.js @@ -0,0 +1,23 @@ +const mongoose = require('mongoose') + +const RequestSchema = mongoose.Schema({ + userId:{ + type:String, + ref:'User' + }, + shopName:String, + shopNumber:String, + shopAddress:String, + birthDate:String, + status:{ + type:Number, + enum:[ + 0, // Pending + 1, // Accepted + 2 // Rejected + ], + default:0 + } +}) + +module.exports = mongoose.model('RequestGPS', RequestSchema) diff --git a/server/models/User.js b/server/models/User.js index a7c6de6..a628e71 100644 --- a/server/models/User.js +++ b/server/models/User.js @@ -55,11 +55,19 @@ const UserSchema = mongoose.Schema({ password: String, // for GPS + profilePic:{ + type:String, + default:"noPic" + }, shopName:String, shopNumber:String, shopAddress:String, birthDate:String, - walletBalance:String, + walletBalance:{ + type:Number, + min:0, + default:0 + }, cardBank:[BankSchema], diff --git a/server/plugins/controllersHelperFunctions.js b/server/plugins/controllersHelperFunctions.js index aa64209..bda09fd 100644 --- a/server/plugins/controllersHelperFunctions.js +++ b/server/plugins/controllersHelperFunctions.js @@ -2,7 +2,9 @@ module.exports.res404 = (res, err) => { return res.status(404).json({ message: err }) } - +module.exports.res400 = (res, err) => { + return res.status(404).json({ message: err }) +} module.exports.res406 = (res, err) => { return res.status(406).json({ message: err }) } diff --git a/server/plugins/permissions.js b/server/plugins/permissions.js index 01b3b03..3662d5b 100644 --- a/server/plugins/permissions.js +++ b/server/plugins/permissions.js @@ -114,5 +114,9 @@ module.exports = [ { name: 'برند ها', value: 'brands' + }, + { + name: 'جی پی اس', + value: 'gps' } ] diff --git a/server/plugins/serverResponses.js b/server/plugins/serverResponses.js index 8900a12..267599d 100644 --- a/server/plugins/serverResponses.js +++ b/server/plugins/serverResponses.js @@ -16,6 +16,7 @@ module.exports._sr = { company_name: 'درصورتی که شخص حقوقی هستید، نام کمپانی را وارد کنید', username: 'نام کاربری را وارد کنید', phone_number: 'شماره تماس را وارد کنید', + store_number: 'شماره تماس مغازه را وارد کنید', password: 'پسورد را وارد کنید', birthdate: 'تاریخ تولد را وارد کنید', // addressing validations diff --git a/server/routes/admin.js b/server/routes/admin.js index c40dc20..5c57b94 100644 --- a/server/routes/admin.js +++ b/server/routes/admin.js @@ -26,9 +26,15 @@ const smsBroadcastController = require('../controllers/smsBroadcastController') const surveyController = require('../controllers/surveyController') const complaintController = require('../controllers/complaintController') const brandController = require('../controllers/brandController') +const requestController = require('../controllers/GPS.Request') /// //////////////////////////////////////////////////////// routes +/// ///////////// GPS +router.get('/gps/request',hasPermission('gps'), requestController.getAllRequest) +router.get('/gps/request/:id',hasPermission('gps'), requestController.getOneRequest) +router.patch('/gps/request/:id/:status',hasPermission('gps'), requestController.changeStatus) + /// ///////////// survey router.get('/surveys',hasPermission('surveys'), surveyController.getAllForAdmin) router.get('/surveys/:id',hasPermission('surveys'), surveyController.getOneForAdmin) diff --git a/server/routes/user.js b/server/routes/user.js index a896171..663ee7c 100644 --- a/server/routes/user.js +++ b/server/routes/user.js @@ -6,6 +6,10 @@ const representationController = require('../controllers/representationControlle const transactionDraftsController = require('../controllers/transactionDraftsController') const transactionController = require('../controllers/transactionController') const surveyController = require('../controllers/surveyController') +const requestController = require('../controllers/GPS.Request') + +/// // GPS +router.post('/gps/request', requestController.gpsRequest) /// // profile router.put('/update_profile', userController.update_user)