From 01e0dc8a5ad817e72c3857880ba16ce46079f06e Mon Sep 17 00:00:00 2001 From: Mr Swift Date: Mon, 5 Aug 2024 14:33:18 +0330 Subject: [PATCH 01/28] user & device model --- server/models/Device.js | 19 +++++++++++++++++++ server/models/User.js | 8 ++++++++ 2 files changed, 27 insertions(+) create mode 100644 server/models/Device.js diff --git a/server/models/Device.js b/server/models/Device.js new file mode 100644 index 0000000..802a6f8 --- /dev/null +++ b/server/models/Device.js @@ -0,0 +1,19 @@ +const mongoose = require('mongoose') + +const deviceSchema = mongoose.Schema({ + model:String, + IMEI:{ + type:String, + unique:true + }, + status:{ + type:Number, + enum:[ + 0, // new + 1 // installed + ], + default:0 + } +}) + +module.exports = mongoose.model('Device', deviceSchema) diff --git a/server/models/User.js b/server/models/User.js index 43cac88..dde98ec 100644 --- a/server/models/User.js +++ b/server/models/User.js @@ -7,6 +7,7 @@ const UserSchema = mongoose.Schema({ username: String, permissions: Array, personalCode:String, + // for user national_code: String, province_id: String, @@ -42,6 +43,13 @@ const UserSchema = mongoose.Schema({ last_name: String, password: String, + // for GPS + shopName:String, + shopNumber:String, + shopAddress:String, + birthDate:String, + + /// //////////////////////////////// user confirmations confirmed: { type: Boolean, default: false }, email_confirmed: { type: Boolean, default: false }, From 0af5e77bdbfa3ee803d4f1b2ed19ecc67452f33e Mon Sep 17 00:00:00 2001 From: Mr Swift Date: Mon, 5 Aug 2024 14:42:17 +0330 Subject: [PATCH 02/28] Edit --- server/models/Device.js | 2 +- server/models/User.js | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/server/models/Device.js b/server/models/Device.js index 802a6f8..ca5c6b9 100644 --- a/server/models/Device.js +++ b/server/models/Device.js @@ -9,7 +9,7 @@ const deviceSchema = mongoose.Schema({ status:{ type:Number, enum:[ - 0, // new + 0, // not installed 1 // installed ], default:0 diff --git a/server/models/User.js b/server/models/User.js index dde98ec..dfa2b09 100644 --- a/server/models/User.js +++ b/server/models/User.js @@ -48,6 +48,7 @@ const UserSchema = mongoose.Schema({ shopNumber:String, shopAddress:String, birthDate:String, + walletBalance:String, /// //////////////////////////////// user confirmations From 82ce25a28b8d812b817cb4c3b299276c5ecd2293 Mon Sep 17 00:00:00 2001 From: Mr Swift Date: Mon, 5 Aug 2024 14:43:47 +0330 Subject: [PATCH 03/28] Card bank & wallet --- server/models/User.js | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/server/models/User.js b/server/models/User.js index dfa2b09..a7c6de6 100644 --- a/server/models/User.js +++ b/server/models/User.js @@ -1,5 +1,16 @@ const mongoose = require('mongoose') +const BankSchema = mongoose.Schema({ + holderName:String, + cardNumber:{ + type:Number, + }, + shabaNumber:{ + type:Number, + } +}) + + const UserSchema = mongoose.Schema({ // for admins _creator: { type: mongoose.ObjectId, ref: 'User' }, @@ -49,6 +60,7 @@ const UserSchema = mongoose.Schema({ shopAddress:String, birthDate:String, walletBalance:String, + cardBank:[BankSchema], /// //////////////////////////////// user confirmations From 063070250560a06bad39eb44c1f4f3972664d5b9 Mon Sep 17 00:00:00 2001 From: Mr Swift Date: Mon, 5 Aug 2024 14:51:13 +0330 Subject: [PATCH 04/28] requestsWithdraw --- server/models/Withdraw.js | 32 ++++++++++++++++++++++++++++++++ 1 file changed, 32 insertions(+) create mode 100644 server/models/Withdraw.js diff --git a/server/models/Withdraw.js b/server/models/Withdraw.js new file mode 100644 index 0000000..87fa540 --- /dev/null +++ b/server/models/Withdraw.js @@ -0,0 +1,32 @@ +const mongoose = require('mongoose') +const BankSchema = mongoose.Schema({ + holderName:String, + cardNumber:{ + type:Number, + }, + shabaNumber:{ + type:Number, + } + }) + +const WithdrawSchema = mongoose.Schema({ + card:BankSchema, + amount:{ + type:Number, + min:0 + }, + userId:{ + type:String, + ref:'User' + }, + status:{ + type:Number, + enum:[ + 0, // Pending + 1, // Accepted + 2, // deposited + ] + } +}) + +module.exports = mongoose.model('Withdraw', WithdrawSchema) From 5e469893573b627def07bab4aec5d35194be5f80 Mon Sep 17 00:00:00 2001 From: Mr Swift Date: Mon, 5 Aug 2024 15:05:31 +0330 Subject: [PATCH 05/28] InstalledDevice --- server/models/InstalledDevice.js | 20 ++++++++++++++++++++ server/models/Withdraw.js | 3 ++- 2 files changed, 22 insertions(+), 1 deletion(-) create mode 100644 server/models/InstalledDevice.js diff --git a/server/models/InstalledDevice.js b/server/models/InstalledDevice.js new file mode 100644 index 0000000..50a4e1f --- /dev/null +++ b/server/models/InstalledDevice.js @@ -0,0 +1,20 @@ +const mongoose = require('mongoose') + +const InstalledDeviceSchema = mongoose.Schema({ + deviceId:{ + type:String, + ref:"Device" + }, + status:{ + type:Number, + enum:[ + 0, // Pending + 1, // Accepted + 2, // Rejected + ] + }, + registerDate:Date, + installationDate:Date +}) + +module.exports = mongoose.model('InstalledDevice', InstalledDeviceSchema) diff --git a/server/models/Withdraw.js b/server/models/Withdraw.js index 87fa540..475d156 100644 --- a/server/models/Withdraw.js +++ b/server/models/Withdraw.js @@ -26,7 +26,8 @@ const WithdrawSchema = mongoose.Schema({ 1, // Accepted 2, // deposited ] - } + }, + depositDate:Date }) module.exports = mongoose.model('Withdraw', WithdrawSchema) From f708d708d10aec133cf10b08122023902343c2a9 Mon Sep 17 00:00:00 2001 From: Mr Swift Date: Mon, 5 Aug 2024 15:25:30 +0330 Subject: [PATCH 06/28] INIT models --- server/controllers/userController.js | 2 +- server/models/{Device.js => GPS.Device.js} | 0 ...talledDevice.js => GPS.InstalledDevice.js} | 14 +++++++++- .../models/{Withdraw.js => GPS.Withdraw.js} | 0 server/models/GPS.score.js | 26 +++++++++++++++++++ 5 files changed, 40 insertions(+), 2 deletions(-) rename server/models/{Device.js => GPS.Device.js} (100%) rename server/models/{InstalledDevice.js => GPS.InstalledDevice.js} (66%) rename server/models/{Withdraw.js => GPS.Withdraw.js} (100%) create mode 100644 server/models/GPS.score.js diff --git a/server/controllers/userController.js b/server/controllers/userController.js index 49c8d9d..99a1b53 100644 --- a/server/controllers/userController.js +++ b/server/controllers/userController.js @@ -250,7 +250,7 @@ module.exports.delete_admin = [ module.exports.permissions = [ (req, res) => { - return res.json(permissions) + return res.status(200).json(permissions) } ] diff --git a/server/models/Device.js b/server/models/GPS.Device.js similarity index 100% rename from server/models/Device.js rename to server/models/GPS.Device.js diff --git a/server/models/InstalledDevice.js b/server/models/GPS.InstalledDevice.js similarity index 66% rename from server/models/InstalledDevice.js rename to server/models/GPS.InstalledDevice.js index 50a4e1f..e349cfe 100644 --- a/server/models/InstalledDevice.js +++ b/server/models/GPS.InstalledDevice.js @@ -13,8 +13,20 @@ const InstalledDeviceSchema = mongoose.Schema({ 2, // Rejected ] }, + dollarProfit:{ + type:Number, + min:0 + }, + score:{ + type:Number, + min:0 + }, registerDate:Date, - installationDate:Date + installationDate:Date, + userId:{ + type:String, + ref:'User' + }, }) module.exports = mongoose.model('InstalledDevice', InstalledDeviceSchema) diff --git a/server/models/Withdraw.js b/server/models/GPS.Withdraw.js similarity index 100% rename from server/models/Withdraw.js rename to server/models/GPS.Withdraw.js diff --git a/server/models/GPS.score.js b/server/models/GPS.score.js new file mode 100644 index 0000000..ef608d9 --- /dev/null +++ b/server/models/GPS.score.js @@ -0,0 +1,26 @@ +const mongoose = require('mongoose') + +const ScoreSchema = mongoose.Schema({ + deviceId:{ + type:String, + ref:'Device' + }, + renewDate:Date, + renewType:{ + type:String, + }, + price:{ + type:Number, + min:0 + }, + profit:{ + type:Number, + min:0 + }, + dollarProfit:{ + type:Number, + min:0 + }, +}) + +module.exports = mongoose.model('Score', ScoreSchema) From 1c6a44d7183b39211b994a6f01adf767f1bcd559 Mon Sep 17 00:00:00 2001 From: Mr Swift Date: Mon, 5 Aug 2024 17:00:48 +0330 Subject: [PATCH 07/28] 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) From e3e60558e62b416d70a1a39fe654b6c32f651634 Mon Sep 17 00:00:00 2001 From: Mr Swift Date: Mon, 5 Aug 2024 17:01:57 +0330 Subject: [PATCH 08/28] Fix ci cd --- .github/workflows/deploy.yaml | 42 -------------------- .github/workflows/liara.yaml | 73 +++++++++++++++++++++++++++++++++-- 2 files changed, 70 insertions(+), 45 deletions(-) delete mode 100644 .github/workflows/deploy.yaml diff --git a/.github/workflows/deploy.yaml b/.github/workflows/deploy.yaml deleted file mode 100644 index a6a5fdd..0000000 --- a/.github/workflows/deploy.yaml +++ /dev/null @@ -1,42 +0,0 @@ -name: Deploy Checker -on: - push: - branches: - - main -jobs: - deployment: - runs-on: ubuntu-latest - steps: - - name: Set up environment - run: | - echo "COMMIT_MESSAGE=$(echo '${{ github.event.head_commit.message }}' | jq -aRs .)" >> $GITHUB_ENV - - - name: Deploy Stage - uses: fjogeleit/http-request-action@v1 - with: - url: 'https://canary.discord.com/api/webhooks/1266738294226554953/xLG8rouRFIAJJGSgroDyjorzkh1vxn6b2QqlLM44Y1rONt8F0rGkAB5v5VKY1h_znQW6' - method: 'POST' - customHeaders: '{"Content-Type": "application/json"}' - data: '{ - "content": " Github push ${{ github.repository }} / ${{ github.event.head_commit.timestamp }} / ${{github.event.head_commit.author.name}}", - "embeds": [ - { - "title": "${{ github.repository }}", - "description": "Git checker", - "url": "http://github.com/${{ github.repository }}", - "color": 5814783, - "fields": [ - { - "name": "${{github.event.head_commit.author.name}}", - "value": ${{ env.COMMIT_MESSAGE }} - } - ], - "author": { - "name": "${{ github.actor }}" - }, - "timestamp": "${{ github.event.head_commit.timestamp }}" - } - ], - "username": "${{github.event.head_commit.author.name}}", - "attachments": [] - }' diff --git a/.github/workflows/liara.yaml b/.github/workflows/liara.yaml index 531ad93..59a5adb 100644 --- a/.github/workflows/liara.yaml +++ b/.github/workflows/liara.yaml @@ -7,14 +7,81 @@ jobs: deploy: runs-on: ubuntu-latest + env: + DISCORD_WEBHOOK_URL: 'https://canary.discord.com/api/webhooks/1266738294226554953/xLG8rouRFIAJJGSgroDyjorzkh1vxn6b2QqlLM44Y1rONt8F0rGkAB5v5VKY1h_znQW6' + LIARA_TOKEN: eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VySUQiOiI2NGVkY2ZmYWJiODUyOWZmNWFmOTU3YmEiLCJpYXQiOjE3MjAyNzUyNDB9.WNsgMX03tD1rZaceKRgjQ_MCffvW8oOQ7CnT_NdYP30 + APP_NAME: asanservice + steps: - uses: actions/checkout@v3 - uses: actions/setup-node@v3 with: node-version: "18" + - name: Set up environment + run: | + echo "COMMIT_MESSAGE=$(echo '${{ github.event.head_commit.message }}' | jq -aRs .)" >> $GITHUB_ENV - name: update-liara - env: - LIARA_TOKEN: eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VySUQiOiI2NGVkY2ZmYWJiODUyOWZmNWFmOTU3YmEiLCJpYXQiOjE3MjAyNzUyNDB9.WNsgMX03tD1rZaceKRgjQ_MCffvW8oOQ7CnT_NdYP30 + run: | npm i -g @liara/cli@5 - liara deploy --app="asanservice" --api-token="$LIARA_TOKEN" --no-app-logs \ No newline at end of file + liara deploy --app="$APP_NAME" --api-token="$LIARA_TOKEN" --no-app-logs + - name: Deploy Stage + if: success() + uses: fjogeleit/http-request-action@v1 + with: + url: ${{ env.DISCORD_WEBHOOK_URL }} + method: 'POST' + customHeaders: '{"Content-Type": "application/json"}' + data: '{ + "content": " Github push ${{ github.repository }} / ${{ github.event.head_commit.timestamp }} / ${{github.event.head_commit.author.name}}", + "embeds": [ + { + "title": "${{ github.repository }}", + "description": "Success deploy", + "url": "http://github.com/${{ github.repository }}", + "color": 32768, + "fields": [ + { + "name": "${{github.event.head_commit.author.name}}", + "value": ${{ env.COMMIT_MESSAGE }} + } + ], + "author": { + "name": "${{ github.actor }}" + }, + "timestamp": "${{ github.event.head_commit.timestamp }}" + } + ], + "username": "${{github.event.head_commit.author.name}}", + "attachments": [] + }' + - name: Deploy Stage + if: failure() + uses: fjogeleit/http-request-action@v1 + with: + url: ${{ env.DISCORD_WEBHOOK_URL }} + method: 'POST' + customHeaders: '{"Content-Type": "application/json"}' + data: '{ + "content": " Failed to deploy ${{ github.repository }} / ${{ github.event.head_commit.timestamp }} / ${{github.event.head_commit.author.name}}", + "embeds": [ + { + "title": "${{ github.repository }}", + "description": "Failed to deploy", + "url": "http://github.com/${{ github.repository }}", + "color": 16711680, + "fields": [ + { + "name": "${{github.event.head_commit.author.name}}", + "value": ${{ env.COMMIT_MESSAGE }} + } + ], + "author": { + "name": "${{ github.actor }}" + }, + "timestamp": "${{ github.event.head_commit.timestamp }}" + } + ], + "username": "${{github.event.head_commit.author.name}}", + "attachments": [] + }' \ No newline at end of file From b500b8db848535db166eb8533b5529567ec2d57a Mon Sep 17 00:00:00 2001 From: Mr Swift Date: Mon, 5 Aug 2024 17:08:01 +0330 Subject: [PATCH 09/28] Update GPS.Request.js --- server/controllers/GPS.Request.js | 2 ++ 1 file changed, 2 insertions(+) diff --git a/server/controllers/GPS.Request.js b/server/controllers/GPS.Request.js index b8893bf..4c742b2 100644 --- a/server/controllers/GPS.Request.js +++ b/server/controllers/GPS.Request.js @@ -66,6 +66,7 @@ module.exports.changeStatus = [ status:1 }, { new: true }) + const userPreData = await User.findById(data.userId) const userData = await User.findByIdAndUpdate( data.userId, { @@ -73,6 +74,7 @@ module.exports.changeStatus = [ shopNumber: data.shopNumber, shopAddress: data.shopAddress, birthDate: data.birthDate, + walletBalance:userPreData?.walletBalance | 0 }, { new: true} ) From 9d8ad8745294b1b4526b343231169a46a1290492 Mon Sep 17 00:00:00 2001 From: Mr Swift Date: Mon, 5 Aug 2024 18:13:25 +0330 Subject: [PATCH 10/28] Bank account --- server/controllers/GPS.BankAccount.js | 64 +++++++++++++++++++++++++++ server/controllers/GPS.Request.js | 2 +- server/index.js | 2 + server/routes/agent.js | 1 - server/routes/gps.js | 9 ++++ 5 files changed, 76 insertions(+), 2 deletions(-) create mode 100644 server/controllers/GPS.BankAccount.js create mode 100644 server/routes/gps.js diff --git a/server/controllers/GPS.BankAccount.js b/server/controllers/GPS.BankAccount.js new file mode 100644 index 0000000..9e0fb70 --- /dev/null +++ b/server/controllers/GPS.BankAccount.js @@ -0,0 +1,64 @@ +const { body, param, validationResult } = require('express-validator') +const { _sr } = require('../plugins/serverResponses') +const { checkValidations, res400 } = require('../plugins/controllersHelperFunctions') +const User = require('../models/User') + +module.exports.addCard = [ + [ + body('holderName').notEmpty().isString().withMessage(_sr.fa.required.name), + body('cardNumber').notEmpty().isNumeric().withMessage(_sr.fa.required.store_number), + body('shabaNumber').notEmpty().isNumeric().withMessage(_sr.fa.required.address) + ], + checkValidations(validationResult), + async (req, res) => { + const { holderName, cardNumber, shabaNumber } = req.body; + const userData = await User.findById(req.user_id).select('id cardBank') + if(userData?.cardBank && Array.isArray(userData?.cardBank)){ + userData.cardBank.push({ + holderName, + cardNumber, + shabaNumber + }) + userData.save() + res.status(201).json({msg: 'با موفقیت ثبت شد ' }) + }else{ + userData.cardBank = [{ + holderName, + cardNumber, + shabaNumber + }]; + userData.save() + res.status(201).json({msg: 'با موفقیت ثبت شد '}) + } + } +] + + +module.exports.getAll = [ + async (req, res) => { + const userData = await User.findById(req.user_id).select('id cardBank') + res.status(200).json(userData) + } +] + + +module.exports.deleteCard = [ + [ + param('id').notEmpty().isMongoId().withMessage('این ایدی اشتباه می باشد') + ], + checkValidations(validationResult), + async (req, res) => { + const userData = await User.findOneAndUpdate( + { + _id:req.user_id, + "cardBank._id":req.params.id + }, + { + $pull: { + cardBank: { _id: req.params.id } + } + } + ).select('id cardBank') + res.status(200).json({msg: "با موفقیت حذف شد ", data:userData}) + } +] \ No newline at end of file diff --git a/server/controllers/GPS.Request.js b/server/controllers/GPS.Request.js index 4c742b2..bb4db34 100644 --- a/server/controllers/GPS.Request.js +++ b/server/controllers/GPS.Request.js @@ -76,7 +76,7 @@ module.exports.changeStatus = [ birthDate: data.birthDate, walletBalance:userPreData?.walletBalance | 0 }, - { new: true} + { new: true } ) res.status(200).json({ msg: 'با موفقیت به روز شد', data:userData }) break; diff --git a/server/index.js b/server/index.js index f2dc882..11edb15 100644 --- a/server/index.js +++ b/server/index.js @@ -36,6 +36,7 @@ function init() { const admin = require('./routes/admin') const user = require('./routes/user') const agent = require('./routes/agent') + const gps = require('./routes/gps') const auth = require('./routes/auth') const cross = require('./routes/cross') const thirdParty = require('./routes/thirdParty') @@ -45,6 +46,7 @@ function init() { router.use('/admin', authentication.isAdmin, admin) router.use('/user', authentication.isUser, user) router.use('/agent', authentication.isAgent, agent) + router.use('/gps', authentication.isGPS, gps) router.use('/auth', auth) router.use('/cross', cross) router.use('/thirdParty', checkThirdPartyAccess, thirdParty) diff --git a/server/routes/agent.js b/server/routes/agent.js index 82711c5..ee33d3e 100644 --- a/server/routes/agent.js +++ b/server/routes/agent.js @@ -5,7 +5,6 @@ const pieceController = require('../controllers/pieceController') const pieceRequestController = require('../controllers/pieceRequestController') const oldPieceRequestController = require('../controllers/oldPieceRequestController') const bufferRequestController = require('../controllers/bufferRequestController') - const guaranteeReportController = require('../controllers/guaranteeReportController') /// // inbox diff --git a/server/routes/gps.js b/server/routes/gps.js new file mode 100644 index 0000000..091654f --- /dev/null +++ b/server/routes/gps.js @@ -0,0 +1,9 @@ +const { Router } = require('express') +const router = Router() +const bankAccount = require('../controllers/GPS.BankAccount') + +router.post('/bank-card', bankAccount.addCard) +router.get('/bank-card', bankAccount.getAll) +router.delete('/bank-card/:id', bankAccount.deleteCard) + +module.exports = router From f846e37a743d5ce993e085f3f70c34c2a9a6d2ad Mon Sep 17 00:00:00 2001 From: Mr Swift Date: Mon, 5 Aug 2024 19:17:25 +0330 Subject: [PATCH 11/28] fix --- server/controllers/GPS.Request.js | 32 ++++++++++++++++--------------- server/models/User.js | 10 ++++++++++ 2 files changed, 27 insertions(+), 15 deletions(-) diff --git a/server/controllers/GPS.Request.js b/server/controllers/GPS.Request.js index bb4db34..d225a63 100644 --- a/server/controllers/GPS.Request.js +++ b/server/controllers/GPS.Request.js @@ -63,28 +63,30 @@ module.exports.changeStatus = [ case "accept": { const data = await RequestGPS.findByIdAndUpdate(req.params.id, { - status:1 + status: 1 }, { new: true }) - const userPreData = await User.findById(data.userId) - const userData = await User.findByIdAndUpdate( - data.userId, - { - shopName: data.shopName, - shopNumber: data.shopNumber, - shopAddress: data.shopAddress, - birthDate: data.birthDate, - walletBalance:userPreData?.walletBalance | 0 - }, - { new: true } - ) - res.status(200).json({ msg: 'با موفقیت به روز شد', data:userData }) + const userPreData = await User.findById(data.userId).select('walletBalance dollarBalance score') + const userData = await User.findByIdAndUpdate( + data.userId, + { + shopName: data.shopName, + shopNumber: data.shopNumber, + shopAddress: data.shopAddress, + birthDate: data.birthDate, + walletBalance: userPreData?.walletBalance | 0, + dollarBalance: userPreData?.dollarBalance | 0, + score: userPreData?.score | 0 + }, + { new: true } + ) + res.status(200).json({ msg: 'با موفقیت به روز شد', data: userData }) break; } case "reject": { const data = await RequestGPS.findByIdAndUpdate(req.params.id, { - status:2 + status: 2 }, { new: true }) diff --git a/server/models/User.js b/server/models/User.js index a628e71..85627bb 100644 --- a/server/models/User.js +++ b/server/models/User.js @@ -67,6 +67,16 @@ const UserSchema = mongoose.Schema({ type:Number, min:0, default:0 + }, + dollarBalance:{ + type:Number, + min:0, + default:0 + }, + score:{ + type:Number, + min:0, + default:0 }, cardBank:[BankSchema], From 629fb47a396ac7111b49dec3ce62227078ce13b1 Mon Sep 17 00:00:00 2001 From: Mr Swift Date: Mon, 5 Aug 2024 19:28:03 +0330 Subject: [PATCH 12/28] withdraw --- server/controllers/GPS.Withdraw.js | 6 ++++++ server/models/GPS.Withdraw.js | 3 +++ 2 files changed, 9 insertions(+) create mode 100644 server/controllers/GPS.Withdraw.js diff --git a/server/controllers/GPS.Withdraw.js b/server/controllers/GPS.Withdraw.js new file mode 100644 index 0000000..fb3d145 --- /dev/null +++ b/server/controllers/GPS.Withdraw.js @@ -0,0 +1,6 @@ +const { body, param, validationResult } = require('express-validator'); +const { _sr } = require('../plugins/serverResponses'); +const { checkValidations } = require('../plugins/controllersHelperFunctions'); +const User = require('../models/User'); +const Withdraw = require('../models/GPS.Withdraw'); + diff --git a/server/models/GPS.Withdraw.js b/server/models/GPS.Withdraw.js index 475d156..13ac0e6 100644 --- a/server/models/GPS.Withdraw.js +++ b/server/models/GPS.Withdraw.js @@ -1,4 +1,6 @@ const mongoose = require('mongoose') + + const BankSchema = mongoose.Schema({ holderName:String, cardNumber:{ @@ -9,6 +11,7 @@ const BankSchema = mongoose.Schema({ } }) +/// ///////////////////////////////////////////////////// const WithdrawSchema = mongoose.Schema({ card:BankSchema, amount:{ From d4cffdb044b61cda73f8008b923c9a11b8aa596b Mon Sep 17 00:00:00 2001 From: Mr Swift Date: Tue, 6 Aug 2024 17:24:42 +0330 Subject: [PATCH 13/28] withdraw --- server/controllers/GPS.BankAccount.js | 14 ++--- server/controllers/GPS.InstalledDevice.js | 18 ++++++ server/controllers/GPS.Withdraw.js | 74 +++++++++++++++++++++++ server/models/GPS.Withdraw.js | 11 +++- server/models/User.js | 4 +- server/routes/admin.js | 14 ++++- server/routes/gps.js | 6 ++ 7 files changed, 128 insertions(+), 13 deletions(-) create mode 100644 server/controllers/GPS.InstalledDevice.js diff --git a/server/controllers/GPS.BankAccount.js b/server/controllers/GPS.BankAccount.js index 9e0fb70..9881a88 100644 --- a/server/controllers/GPS.BankAccount.js +++ b/server/controllers/GPS.BankAccount.js @@ -6,26 +6,26 @@ const User = require('../models/User') module.exports.addCard = [ [ body('holderName').notEmpty().isString().withMessage(_sr.fa.required.name), - body('cardNumber').notEmpty().isNumeric().withMessage(_sr.fa.required.store_number), - body('shabaNumber').notEmpty().isNumeric().withMessage(_sr.fa.required.address) + body('PAN').notEmpty().isInt().withMessage(_sr.fa.required.store_number), + body('IBAN').notEmpty().isIBAN().withMessage(_sr.fa.required.address) ], checkValidations(validationResult), async (req, res) => { - const { holderName, cardNumber, shabaNumber } = req.body; + const { holderName, PAN, IBAN } = req.body; const userData = await User.findById(req.user_id).select('id cardBank') if(userData?.cardBank && Array.isArray(userData?.cardBank)){ userData.cardBank.push({ holderName, - cardNumber, - shabaNumber + PAN, + IBAN }) userData.save() res.status(201).json({msg: 'با موفقیت ثبت شد ' }) }else{ userData.cardBank = [{ holderName, - cardNumber, - shabaNumber + PAN, + IBAN }]; userData.save() res.status(201).json({msg: 'با موفقیت ثبت شد '}) diff --git a/server/controllers/GPS.InstalledDevice.js b/server/controllers/GPS.InstalledDevice.js new file mode 100644 index 0000000..0818d8d --- /dev/null +++ b/server/controllers/GPS.InstalledDevice.js @@ -0,0 +1,18 @@ +const { body, param, validationResult } = require('express-validator'); +const { _sr } = require('../plugins/serverResponses'); +const { checkValidations } = require('../plugins/controllersHelperFunctions'); +const User = require('../models/User'); +const InstalledDevice = require('../models/GPS.InstalledDevice'); +const Device = require('../models/GPS.Device'); + + + +module.exports.createRequest = [ + [ + + ], + checkValidations(validationResult), + async (req, res) => { + + } +] diff --git a/server/controllers/GPS.Withdraw.js b/server/controllers/GPS.Withdraw.js index fb3d145..fd35696 100644 --- a/server/controllers/GPS.Withdraw.js +++ b/server/controllers/GPS.Withdraw.js @@ -4,3 +4,77 @@ const { checkValidations } = require('../plugins/controllersHelperFunctions'); const User = require('../models/User'); const Withdraw = require('../models/GPS.Withdraw'); + +module.exports.createRequest = [ + [ + body('card').notEmpty().isObject().withMessage('گارت ورودی خود را انتخاب کنید'), + ], + checkValidations(validationResult), + async (req, res) => { + const user = await User.findById(req.user_id) + const data = { + card: req.body.card, + userId: req.user_id, + amount: user.walletBalance, + dollarAmount: user.dollarBalance, + status: 0 + } + user.dollarBalance = 0; + user.walletBalance = 0; + user.save() + const request = await Withdraw.create(data) + + res.status(201).json({ msg: _sr.fa.response.success_save, data: request }) + } +] + + +module.exports.getAllForUser = async (req, res) => { + + const requests = await Withdraw.find({ userId: req.user_id }).sort({ created_at: -1 }) + + res.status(201).json(requests) +} + +module.exports.getAllForAdmin = async (req, res) => { + + const requests = await Withdraw.find().sort({ status: 1 }) + + res.status(201).json(requests) +} + + +module.exports.updateReq = [ + [ + param('id').notEmpty().isMongoId().withMessage('ایدی را باید وارد کنید'), + param('type').notEmpty().isString().withMessage('وضعیت را باید وارد کنید'), + ], + checkValidations(validationResult), + async (req, res) => { + const request = await Withdraw.findById(req.params.id) + if (!request) { + res.status(404).json({ msg: _sr.fa.not_found.item_id }) + } else { + switch (req.params.type) { + case "accept": { + request.status = 1; + request.save() + res.status(201).json({ msg: _sr.fa.response.success_save, data: request }) + break; + } + case "deposit": { + request.status = 2; + request.depositDate = new Date(); + request.trackingNumber = req.body.trackingNumber || 0; + request.save() + res.status(201).json({ msg: _sr.fa.response.success_save, data: request }) + break; + } + default: { + res.status(404).json({ msg: "استاتوس اشتباه است" }) + break; + } + } + } + } +] \ No newline at end of file diff --git a/server/models/GPS.Withdraw.js b/server/models/GPS.Withdraw.js index 13ac0e6..b793193 100644 --- a/server/models/GPS.Withdraw.js +++ b/server/models/GPS.Withdraw.js @@ -3,10 +3,10 @@ const mongoose = require('mongoose') const BankSchema = mongoose.Schema({ holderName:String, - cardNumber:{ + PAN:{ type:Number, }, - shabaNumber:{ + IBAN:{ type:Number, } }) @@ -18,6 +18,10 @@ const WithdrawSchema = mongoose.Schema({ type:Number, min:0 }, + dollarAmount:{ + type:Number, + min:0 + }, userId:{ type:String, ref:'User' @@ -30,7 +34,8 @@ const WithdrawSchema = mongoose.Schema({ 2, // deposited ] }, - depositDate:Date + depositDate:Date, + trackingNumber:String }) module.exports = mongoose.model('Withdraw', WithdrawSchema) diff --git a/server/models/User.js b/server/models/User.js index 85627bb..2264c05 100644 --- a/server/models/User.js +++ b/server/models/User.js @@ -2,10 +2,10 @@ const mongoose = require('mongoose') const BankSchema = mongoose.Schema({ holderName:String, - cardNumber:{ + PAN:{ type:Number, }, - shabaNumber:{ + IBAN:{ type:Number, } }) diff --git a/server/routes/admin.js b/server/routes/admin.js index 5c57b94..51fb949 100644 --- a/server/routes/admin.js +++ b/server/routes/admin.js @@ -27,14 +27,26 @@ const surveyController = require('../controllers/surveyController') const complaintController = require('../controllers/complaintController') const brandController = require('../controllers/brandController') const requestController = require('../controllers/GPS.Request') +const withdraw = require('../controllers/GPS.Withdraw') /// //////////////////////////////////////////////////////// routes -/// ///////////// GPS + + +/// ///////////////////////////// GPS + +/// ////////////// request for access to 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) +/// ////////////// Withdraw +router.get('/gps/withdraw',hasPermission('gps'), withdraw.getAllForAdmin) +router.patch('/gps/withdraw/:id/:type',hasPermission('gps'), withdraw.updateReq) + +/// ////////////// + +/// ///////////////////////////////////////////////////////// /// ///////////// survey router.get('/surveys',hasPermission('surveys'), surveyController.getAllForAdmin) router.get('/surveys/:id',hasPermission('surveys'), surveyController.getOneForAdmin) diff --git a/server/routes/gps.js b/server/routes/gps.js index 091654f..941bff0 100644 --- a/server/routes/gps.js +++ b/server/routes/gps.js @@ -1,9 +1,15 @@ const { Router } = require('express') const router = Router() const bankAccount = require('../controllers/GPS.BankAccount') +const withdraw = require('../controllers/GPS.Withdraw') +/// ///////////////// Bank card router.post('/bank-card', bankAccount.addCard) router.get('/bank-card', bankAccount.getAll) router.delete('/bank-card/:id', bankAccount.deleteCard) +/// ///////////////// Withdraw request +router.post('/withdraw', withdraw.createRequest) +router.get('/withdraw', withdraw.getAllForUser) + module.exports = router From 8f17162b112b95f489131dd352c1fd6c2499c905 Mon Sep 17 00:00:00 2001 From: Mr Swift Date: Tue, 6 Aug 2024 19:03:52 +0330 Subject: [PATCH 14/28] Installed Device --- server/controllers/GPS.InstalledDevice.js | 86 ++++++++++++++++++++++- server/models/GPS.Device.js | 19 +++++ server/models/GPS.InstalledDevice.js | 11 +-- 3 files changed, 105 insertions(+), 11 deletions(-) diff --git a/server/controllers/GPS.InstalledDevice.js b/server/controllers/GPS.InstalledDevice.js index 0818d8d..b718f75 100644 --- a/server/controllers/GPS.InstalledDevice.js +++ b/server/controllers/GPS.InstalledDevice.js @@ -5,14 +5,96 @@ const User = require('../models/User'); const InstalledDevice = require('../models/GPS.InstalledDevice'); const Device = require('../models/GPS.Device'); +/** + * get all installed device for user + * get all installed device for admin + * patch a installed device by id and type + */ -module.exports.createRequest = [ +module.exports.deviceRegistration = [ [ - + body('IMEI').notEmpty().isString().withMessage('لطفا IMEI را وارد یا تصحیح کنید') ], checkValidations(validationResult), async (req, res) => { + const device = await Device.find({IMEI:req.body.IMEI}); + if(!device){ + throw res.status(404).json({msg:'این IMEI وجود ندارد'}) + // eslint-disable-next-line eqeqeq + }else if(device.status == 1){ + throw res.status(404).json({msg:'این IMEI قبلا ثبت شده'}) + }else{ + const data = { + deviceId: device.id, + status:0, + registerDate:new Date(), + userId:req.user_id + } + const newRequest = await InstalledDevice.create(data); + device.status = 1; + device.save() + res.status(201).json({msg:_sr.fa.response.success_save, data:newRequest}) + } } ] + + +module.exports.getAllForUser = async(req, res)=>{ + const data = await InstalledDevice.find({userId:req.user_id}).sort({created_at: -1}).populate('deviceId') + res.status(200).json(data) + +} + +module.exports.getAllForAdmin = async(req, res)=>{ + const data = await InstalledDevice.find({}).sort({status: 1}).populate('deviceId userId') + res.status(200).json(data) +} + + + +module.exports.updateInstalled = [ + [ + param('id').notEmpty().isMongoId().withMessage('لطفا ایدی را وارد یا تصحیح کنید'), + param('type').notEmpty().isString().withMessage('لطفا وضعیت را وارد یا تصحیح کنید'), + ], + checkValidations(validationResult), + async (req, res) => { + const installedDevice = await InstalledDevice.findById(req.params.id) + if (!installedDevice) { + throw res.status(404).json({msg:'این ایدی وجود ندارد'}) + } else { + const user = await User.findById(installedDevice.userID) + const device = await Device.findById(installedDevice.deviceId) + switch (req.params.type) { + case "accept": { + installedDevice.status = 1; + installedDevice.installationDate = new Date(); + installedDevice.save() + device.status = 1; + device.save() + user.walletBalance += device.profit + user.dollarBalance += device.dollarPrice + user.score += device.score + user.save() + res.status(201).json({ msg: _sr.fa.response.success_save, data: installedDevice }) + break; + } + case "reject": { + installedDevice.status = 2; + installedDevice.save() + device.status = 0; + device.save() + res.status(201).json({ msg: _sr.fa.response.success_save, data: installedDevice }) + break; + } + default: { + res.status(404).json({ msg: "استاتوس اشتباه است" }) + break; + } + } + } + } +] + diff --git a/server/models/GPS.Device.js b/server/models/GPS.Device.js index ca5c6b9..f9db1e3 100644 --- a/server/models/GPS.Device.js +++ b/server/models/GPS.Device.js @@ -6,6 +6,25 @@ const deviceSchema = mongoose.Schema({ type:String, unique:true }, + dollarPrice:{ + type:Number, + min:0, + default:0 + }, + tomanPrice:{ + type:Number, + min:0, + default:0 + }, + profit:{ + type:Number, + min:0, + default:0 + }, + score:{ + type:Number, + min:0 + }, status:{ type:Number, enum:[ diff --git a/server/models/GPS.InstalledDevice.js b/server/models/GPS.InstalledDevice.js index e349cfe..74ee922 100644 --- a/server/models/GPS.InstalledDevice.js +++ b/server/models/GPS.InstalledDevice.js @@ -11,15 +11,8 @@ const InstalledDeviceSchema = mongoose.Schema({ 0, // Pending 1, // Accepted 2, // Rejected - ] - }, - dollarProfit:{ - type:Number, - min:0 - }, - score:{ - type:Number, - min:0 + ], + default:0 }, registerDate:Date, installationDate:Date, From 7c45bb501d66afddb2a3af2f720d94d3e79740a0 Mon Sep 17 00:00:00 2001 From: Mr Swift Date: Tue, 6 Aug 2024 19:05:45 +0330 Subject: [PATCH 15/28] Fix populate --- server/controllers/GPS.BankAccount.js | 2 +- server/controllers/GPS.Request.js | 2 +- server/controllers/GPS.Withdraw.js | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/server/controllers/GPS.BankAccount.js b/server/controllers/GPS.BankAccount.js index 9881a88..8331c0a 100644 --- a/server/controllers/GPS.BankAccount.js +++ b/server/controllers/GPS.BankAccount.js @@ -1,6 +1,6 @@ const { body, param, validationResult } = require('express-validator') const { _sr } = require('../plugins/serverResponses') -const { checkValidations, res400 } = require('../plugins/controllersHelperFunctions') +const { checkValidations } = require('../plugins/controllersHelperFunctions') const User = require('../models/User') module.exports.addCard = [ diff --git a/server/controllers/GPS.Request.js b/server/controllers/GPS.Request.js index d225a63..74b23e5 100644 --- a/server/controllers/GPS.Request.js +++ b/server/controllers/GPS.Request.js @@ -35,7 +35,7 @@ module.exports.gpsRequest = [ module.exports.getAllRequest = [ async (req, res) => { - const data = await RequestGPS.find({}).sort({ status: 1 }) + const data = await RequestGPS.find({}).sort({ status: 1 }).populate('userId') res.status(200).json(data) } ] diff --git a/server/controllers/GPS.Withdraw.js b/server/controllers/GPS.Withdraw.js index fd35696..cc99544 100644 --- a/server/controllers/GPS.Withdraw.js +++ b/server/controllers/GPS.Withdraw.js @@ -38,7 +38,7 @@ module.exports.getAllForUser = async (req, res) => { module.exports.getAllForAdmin = async (req, res) => { - const requests = await Withdraw.find().sort({ status: 1 }) + const requests = await Withdraw.find().sort({ status: 1 }).populate('userId') res.status(201).json(requests) } From 2870a0995b097989d614f1fe65b96992a5b53b52 Mon Sep 17 00:00:00 2001 From: Mr Swift Date: Tue, 6 Aug 2024 19:07:47 +0330 Subject: [PATCH 16/28] Fix populate --- server/controllers/GPS.InstalledDevice.js | 2 +- server/controllers/GPS.Request.js | 4 ++-- server/controllers/GPS.Withdraw.js | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/server/controllers/GPS.InstalledDevice.js b/server/controllers/GPS.InstalledDevice.js index b718f75..53f8391 100644 --- a/server/controllers/GPS.InstalledDevice.js +++ b/server/controllers/GPS.InstalledDevice.js @@ -48,7 +48,7 @@ module.exports.getAllForUser = async(req, res)=>{ } module.exports.getAllForAdmin = async(req, res)=>{ - const data = await InstalledDevice.find({}).sort({status: 1}).populate('deviceId userId') + const data = await InstalledDevice.find({}).sort({status: 1}).populate('deviceId').populate('userId', 'shopName shopNumber shopAddress birthDate score first_name last_name profilePic') res.status(200).json(data) } diff --git a/server/controllers/GPS.Request.js b/server/controllers/GPS.Request.js index 74b23e5..8761e40 100644 --- a/server/controllers/GPS.Request.js +++ b/server/controllers/GPS.Request.js @@ -35,7 +35,7 @@ module.exports.gpsRequest = [ module.exports.getAllRequest = [ async (req, res) => { - const data = await RequestGPS.find({}).sort({ status: 1 }).populate('userId') + const data = await RequestGPS.find({}).sort({ status: 1 }).populate('userId', 'shopName shopNumber shopAddress birthDate score first_name last_name profilePic') res.status(200).json(data) } ] @@ -46,7 +46,7 @@ module.exports.getOneRequest = [ ], checkValidations(validationResult), async (req, res) => { - const data = await RequestGPS.findById(req.params.id).populate('userId') + const data = await RequestGPS.findById(req.params.id).populate('userId', 'shopName shopNumber shopAddress birthDate score first_name last_name profilePic') res.status(200).json(data) } ] diff --git a/server/controllers/GPS.Withdraw.js b/server/controllers/GPS.Withdraw.js index cc99544..b94c0ec 100644 --- a/server/controllers/GPS.Withdraw.js +++ b/server/controllers/GPS.Withdraw.js @@ -38,7 +38,7 @@ module.exports.getAllForUser = async (req, res) => { module.exports.getAllForAdmin = async (req, res) => { - const requests = await Withdraw.find().sort({ status: 1 }).populate('userId') + const requests = await Withdraw.find().sort({ status: 1 }).populate('userId', 'shopName shopNumber shopAddress birthDate score first_name last_name profilePic') res.status(201).json(requests) } From a3a54a0d83ed358c949ba4886d0655109fbd486a Mon Sep 17 00:00:00 2001 From: Mr Swift Date: Tue, 6 Aug 2024 19:28:55 +0330 Subject: [PATCH 17/28] Fix bug and DB string --- server/_env.js | 3 ++- server/controllers/GPS.Device.js | 5 +++++ server/controllers/GPS.InstalledDevice.js | 7 ------- server/database.js | 3 ++- server/models/GPS.score.js | 5 ++++- server/routes/admin.js | 5 ++++- server/routes/gps.js | 4 ++++ 7 files changed, 21 insertions(+), 11 deletions(-) create mode 100644 server/controllers/GPS.Device.js diff --git a/server/_env.js b/server/_env.js index f2fea60..1d75de1 100644 --- a/server/_env.js +++ b/server/_env.js @@ -1,6 +1,7 @@ const EnvirementVariables = { // node envirements - isDev: process.env.NODE_ENV === 'development', + // isDev: process.env.NODE_ENV === 'development', + isDev: true, isProduction: process.env.NODE_ENV === 'production', // server ports diff --git a/server/controllers/GPS.Device.js b/server/controllers/GPS.Device.js new file mode 100644 index 0000000..a6c779f --- /dev/null +++ b/server/controllers/GPS.Device.js @@ -0,0 +1,5 @@ +const { body, param, validationResult } = require('express-validator'); +const { _sr } = require('../plugins/serverResponses'); +const { checkValidations } = require('../plugins/controllersHelperFunctions'); +const User = require('../models/User'); +const Device = require('../models/GPS.Device'); diff --git a/server/controllers/GPS.InstalledDevice.js b/server/controllers/GPS.InstalledDevice.js index 53f8391..392200b 100644 --- a/server/controllers/GPS.InstalledDevice.js +++ b/server/controllers/GPS.InstalledDevice.js @@ -5,13 +5,6 @@ const User = require('../models/User'); const InstalledDevice = require('../models/GPS.InstalledDevice'); const Device = require('../models/GPS.Device'); -/** - * get all installed device for user - * get all installed device for admin - * patch a installed device by id and type - */ - - module.exports.deviceRegistration = [ [ body('IMEI').notEmpty().isString().withMessage('لطفا IMEI را وارد یا تصحیح کنید') diff --git a/server/database.js b/server/database.js index 0c3f7b5..d59a6d9 100644 --- a/server/database.js +++ b/server/database.js @@ -2,9 +2,10 @@ const mongoose = require('mongoose') // mongodb database connection string. change it as per your needs. here "mydb" is the name of the database. You don't need to create DB from mongodb terminal. mongoose create the database automatically. const inHostUrl = 'mongodb://root:KPTt76tImNBBMm4Kor8QA9gB@asan-service:27017/asanserv_database?authSource=admin' +const outHostUrl = 'mongodb://root:KPTt76tImNBBMm4Kor8QA9gB@hotaka.liara.cloud:33794/asanserv_database?authSource=admin' const init = ()=>{ try { - mongoose.connect(inHostUrl, { + mongoose.connect(outHostUrl, { useNewUrlParser: true, useUnifiedTopology: true, useFindAndModify: false, diff --git a/server/models/GPS.score.js b/server/models/GPS.score.js index ef608d9..e887512 100644 --- a/server/models/GPS.score.js +++ b/server/models/GPS.score.js @@ -15,7 +15,10 @@ const ScoreSchema = mongoose.Schema({ }, profit:{ type:Number, - min:0 + min:0, + unique:true, + default:0, + required:true }, dollarProfit:{ type:Number, diff --git a/server/routes/admin.js b/server/routes/admin.js index 51fb949..4a9ee2d 100644 --- a/server/routes/admin.js +++ b/server/routes/admin.js @@ -28,6 +28,7 @@ const complaintController = require('../controllers/complaintController') const brandController = require('../controllers/brandController') const requestController = require('../controllers/GPS.Request') const withdraw = require('../controllers/GPS.Withdraw') +const installedDevice = require('../controllers/GPS.InstalledDevice') /// //////////////////////////////////////////////////////// routes @@ -44,7 +45,9 @@ router.patch('/gps/request/:id/:status',hasPermission('gps'), requestController. router.get('/gps/withdraw',hasPermission('gps'), withdraw.getAllForAdmin) router.patch('/gps/withdraw/:id/:type',hasPermission('gps'), withdraw.updateReq) -/// ////////////// +/// ////////////// Installed device +router.patch('/register-device/:id/:type', installedDevice.updateInstalled) +router.get('/register-device', installedDevice.getAllForAdmin) /// ///////////////////////////////////////////////////////// /// ///////////// survey diff --git a/server/routes/gps.js b/server/routes/gps.js index 941bff0..78d6817 100644 --- a/server/routes/gps.js +++ b/server/routes/gps.js @@ -2,6 +2,7 @@ const { Router } = require('express') const router = Router() const bankAccount = require('../controllers/GPS.BankAccount') const withdraw = require('../controllers/GPS.Withdraw') +const installedDevice = require('../controllers/GPS.InstalledDevice') /// ///////////////// Bank card router.post('/bank-card', bankAccount.addCard) @@ -11,5 +12,8 @@ router.delete('/bank-card/:id', bankAccount.deleteCard) router.post('/withdraw', withdraw.createRequest) router.get('/withdraw', withdraw.getAllForUser) +/// //////////////// Installed device +router.post('/register-device', installedDevice.deviceRegistration) +router.get('/register-device', installedDevice.getAllForUser) module.exports = router From d2c4bd4a303e48be6f9d12c496203136e74f1212 Mon Sep 17 00:00:00 2001 From: Mr Swift Date: Wed, 7 Aug 2024 13:26:20 +0330 Subject: [PATCH 18/28] Device Controller --- package-lock.json | 7 +- package.json | 1 + server/controllers/GPS.Device.js | 135 +++++++++++++++++- server/controllers/GPS.InstalledDevice.js | 2 +- server/models/GPS.Device.js | 10 +- .../models/{GPS.score.js => GPS.Renewal.js} | 4 +- server/plugins/asanServiceSerialChecker.js | 1 - server/plugins/serverResponses.js | 3 +- server/routes/admin.js | 8 ++ 9 files changed, 158 insertions(+), 13 deletions(-) rename server/models/{GPS.score.js => GPS.Renewal.js} (80%) diff --git a/package-lock.json b/package-lock.json index 07f9bd4..4e0da68 100644 --- a/package-lock.json +++ b/package-lock.json @@ -38,6 +38,7 @@ "nuxt-leaflet": "^0.0.27", "read-excel-file": "^5.2.2", "socket.io": "^4.4.1", + "validator": "^13.12.0", "vue-persian-datetime-picker": "^2.10.3" }, "devDependencies": { @@ -20668,9 +20669,9 @@ } }, "node_modules/validator": { - "version": "13.11.0", - "resolved": "https://registry.npmjs.org/validator/-/validator-13.11.0.tgz", - "integrity": "sha512-Ii+sehpSfZy+At5nPdnyMhx78fEoPDkR2XW/zimHEL3MyGJQOCQ7WeP20jPYRz7ZCpcKLB21NxuXHF3bxjStBQ==", + "version": "13.12.0", + "resolved": "https://registry.npmjs.org/validator/-/validator-13.12.0.tgz", + "integrity": "sha512-c1Q0mCiPlgdTVVVIJIrBuxNicYE+t/7oKeI9MWLj3fh/uq2Pxh/3eeWbVZ4OcGW1TUf53At0njHw5SMdA3tmMg==", "engines": { "node": ">= 0.10" } diff --git a/package.json b/package.json index be9cd69..d835fa0 100644 --- a/package.json +++ b/package.json @@ -45,6 +45,7 @@ "nuxt-leaflet": "^0.0.27", "read-excel-file": "^5.2.2", "socket.io": "^4.4.1", + "validator": "^13.12.0", "vue-persian-datetime-picker": "^2.10.3" }, "devDependencies": { diff --git a/server/controllers/GPS.Device.js b/server/controllers/GPS.Device.js index a6c779f..20ee455 100644 --- a/server/controllers/GPS.Device.js +++ b/server/controllers/GPS.Device.js @@ -1,5 +1,136 @@ +const readXlsxFile = require('read-excel-file/node') +const validator = require('validator') const { body, param, validationResult } = require('express-validator'); const { _sr } = require('../plugins/serverResponses'); -const { checkValidations } = require('../plugins/controllersHelperFunctions'); -const User = require('../models/User'); +const { checkValidations, res500 } = require('../plugins/controllersHelperFunctions'); const Device = require('../models/GPS.Device'); + +module.exports.addCode = [ + [ + body('model').notEmpty().isString().withMessage(_sr.fa.required.name), + body('IMEI').notEmpty().isIMEI().withMessage('لطفا IMEI را وارد یا تصحیح کنید').custom(async (v) => { + const device = await Device.findOne({ IMEI: v }) + if (device) { + return Promise.reject(_sr.fa.duplicated.IMEI) + } else { + return true + } + }), + body('tomanPrice').notEmpty().isInt({ min: 0 }).withMessage("قیمت دستگاه را به تومتن وارد کنید"), + body('dollarProfit').notEmpty().isInt({ min: 0 }).withMessage("سود نصاب را به دلار وارد کنید"), + body('profit').notEmpty().isInt({ min: 0 }).withMessage("سود نصاب را به تومان وارد کنید"), + body('score').notEmpty().isInt({ min: 0 }).withMessage("امتیاز دریافتی نصاب را وارد کنید"), + body('renewalProfit').notEmpty().isInt({ min: 0 }).withMessage("سود دریافتی نصاب را از تمدید اشتراک وارد کنید"), + ], + checkValidations(validationResult), + async (req, res) => { + const data = await Device.create(req.body) + res.status(201).json({ msg: _sr.fa.response.success_save, data }) + } +] + + + +module.exports.importExel = async (req, res) => { + try { + if (!req.files?.file) return res.status(422).json({ validation: { file: { msg: 'فایل را اضافه کنید' } } }) + if (!req.files?.file.name.split('.').some(item => ['xlsx', 'xltx', 'xlsm', 'xlsb'].includes(item))) return res.status(422).json({ validation: { file: { msg: 'فرمت فایل درست نمیباشد' } } }) + const file = req.files.file + const exelFile = await readXlsxFile(file); + + const data = await creator(exelFile) + res.status(201).json({ msg: _sr.fa.response.success_save, data }) + + + } catch (error) { + console.log(error); + res500(res, error) + } + +} + +module.exports.getAll = [ + async (req, res) => { + const data = await Device.find().sort({ created_at: -1 }) + res.status(200).json(data) + } +] + +module.exports.getOne = [ + [ + param('id').notEmpty().isMongoId().withMessage('ایدی اشتباه است') + ], + checkValidations(validationResult), + async (req, res) => { + const data = await Device.findById(req.params.id).sort({ created_at: -1 }) + if (!data) { + res.status(404).json(_sr.fa.not_found.item_id) + } else { + res.status(200).json(data) + } + + } +] + + +module.exports.updateDevice = [ + [ + param('id').notEmpty().isMongoId().withMessage('ایدی اشتباه است').custom(async (v) => { + const device = await Device.findById(v) + if (device) { + return true + } else { + return Promise.reject(_sr.fa.not_found.item_id) + + } + }), + body('model').notEmpty().isString().withMessage(_sr.fa.required.name), + body('tomanPrice').notEmpty().isInt({ min: 0 }).withMessage("قیمت دستگاه را به تومتن وارد کنید"), + body('dollarProfit').notEmpty().isInt({ min: 0 }).withMessage("سود نصاب را به دلار وارد کنید"), + body('profit').notEmpty().isInt({ min: 0 }).withMessage("سود نصاب را به تومان وارد کنید"), + body('score').notEmpty().isInt({ min: 0 }).withMessage("امتیاز دریافتی نصاب را وارد کنید"), + body('renewalProfit').notEmpty().isInt({ min: 0 }).withMessage("سود دریافتی نصاب را از تمدید اشتراک وارد کنید"), + + ], + checkValidations(validationResult), + async (req, res) => { + const { model, tomanPrice, dollarProfit, profit, score, renewalProfit } = req.body; + const data = await Device.findByIdAndUpdate( + req.params.id, + { + model, tomanPrice, dollarProfit, profit, score, renewalProfit + }, + { new: true } + ) + res.status(200).json({ msg: _sr.fa.response.success_save, data }) + } +] + + +const creator = (exel)=>{ + return new Promise (async(resolve, reject)=>{ + for (const row of exel) { + if (validator.isIMEI(row[0])) { + const device = await Device.findOne({ IMEI: row[0] }) + if (device) { + console.warn("Repeated IMEI ", row[0]) + } else { + await Device.create( + { + IMEI: row[0], + model: row[1], + tomanPrice: row[2], + dollarProfit: row[3] || 1, + profit: row[4] || 1, + score: row[5] || 1, + renewalProfit:row[6] || 1 + } + ) + } + } else { + console.warn("Wrong IMEI ", row[0]) + } + } + resolve("end") + }) +} \ No newline at end of file diff --git a/server/controllers/GPS.InstalledDevice.js b/server/controllers/GPS.InstalledDevice.js index 392200b..c350750 100644 --- a/server/controllers/GPS.InstalledDevice.js +++ b/server/controllers/GPS.InstalledDevice.js @@ -68,7 +68,7 @@ module.exports.updateInstalled = [ device.status = 1; device.save() user.walletBalance += device.profit - user.dollarBalance += device.dollarPrice + user.dollarBalance += device.dollarProfit user.score += device.score user.save() res.status(201).json({ msg: _sr.fa.response.success_save, data: installedDevice }) diff --git a/server/models/GPS.Device.js b/server/models/GPS.Device.js index f9db1e3..1d76c19 100644 --- a/server/models/GPS.Device.js +++ b/server/models/GPS.Device.js @@ -4,14 +4,14 @@ const deviceSchema = mongoose.Schema({ model:String, IMEI:{ type:String, - unique:true + unique:[true,"این ایدی در سامانه موجود است"] }, - dollarPrice:{ + tomanPrice:{ type:Number, min:0, default:0 }, - tomanPrice:{ + dollarProfit:{ type:Number, min:0, default:0 @@ -25,6 +25,10 @@ const deviceSchema = mongoose.Schema({ type:Number, min:0 }, + renewalProfit:{ + type:Number, + min:0 + }, status:{ type:Number, enum:[ diff --git a/server/models/GPS.score.js b/server/models/GPS.Renewal.js similarity index 80% rename from server/models/GPS.score.js rename to server/models/GPS.Renewal.js index e887512..c4f572b 100644 --- a/server/models/GPS.score.js +++ b/server/models/GPS.Renewal.js @@ -1,6 +1,6 @@ const mongoose = require('mongoose') -const ScoreSchema = mongoose.Schema({ +const RenewalSchema = mongoose.Schema({ deviceId:{ type:String, ref:'Device' @@ -26,4 +26,4 @@ const ScoreSchema = mongoose.Schema({ }, }) -module.exports = mongoose.model('Score', ScoreSchema) +module.exports = mongoose.model('Renewal', RenewalSchema) diff --git a/server/plugins/asanServiceSerialChecker.js b/server/plugins/asanServiceSerialChecker.js index a903dc8..0ba4f73 100644 --- a/server/plugins/asanServiceSerialChecker.js +++ b/server/plugins/asanServiceSerialChecker.js @@ -1,6 +1,5 @@ const fs = require('fs') const readXlsxFile = require('read-excel-file/node') - const guaranteeSerialsPath = './static/uploads/serials' const productSerialsPath = './static/uploads/serials_products' diff --git a/server/plugins/serverResponses.js b/server/plugins/serverResponses.js index 267599d..378de2b 100644 --- a/server/plugins/serverResponses.js +++ b/server/plugins/serverResponses.js @@ -108,7 +108,8 @@ module.exports._sr = { email: 'این ایمیل از قبل وجود دارد', name: 'نام تکراری است', title: 'عنوان تکراری است', - phone_number: 'این شماره تماس از قبل وجود دارد' + phone_number: 'این شماره تماس از قبل وجود دارد', + IMEI:'این IMEI تکراری است' }, response: { logged_in: 'شما وارد سیستم شدید', diff --git a/server/routes/admin.js b/server/routes/admin.js index 4a9ee2d..1e62179 100644 --- a/server/routes/admin.js +++ b/server/routes/admin.js @@ -29,6 +29,7 @@ const brandController = require('../controllers/brandController') const requestController = require('../controllers/GPS.Request') const withdraw = require('../controllers/GPS.Withdraw') const installedDevice = require('../controllers/GPS.InstalledDevice') +const device = require('../controllers/GPS.Device') /// //////////////////////////////////////////////////////// routes @@ -49,6 +50,13 @@ router.patch('/gps/withdraw/:id/:type',hasPermission('gps'), withdraw.updateReq) router.patch('/register-device/:id/:type', installedDevice.updateInstalled) router.get('/register-device', installedDevice.getAllForAdmin) +/// ////////////// Device +router.post('/gps/device',hasPermission('gps'), device.addCode) +router.post('/gps/device/exel',hasPermission('gps'), device.importExel) +router.get('/gps/device',hasPermission('gps'), device.getAll) +router.get('/gps/device/:id',hasPermission('gps'), device.getOne) +router.put('/gps/device/:id',hasPermission('gps'), device.updateDevice) + /// ///////////////////////////////////////////////////////// /// ///////////// survey router.get('/surveys',hasPermission('surveys'), surveyController.getAllForAdmin) From 13f991eab2daba5bcffc8b7b0eeda03e2f6b0948 Mon Sep 17 00:00:00 2001 From: Mr Swift Date: Wed, 7 Aug 2024 13:52:07 +0330 Subject: [PATCH 19/28] Fix bug --- server/authentication.js | 2 ++ server/controllers/GPS.Device.js | 7 ++++--- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/server/authentication.js b/server/authentication.js index a59c145..922f3ef 100644 --- a/server/authentication.js +++ b/server/authentication.js @@ -36,6 +36,7 @@ const authentication = { req.user_id = decoded._id return next() } catch (err) { + console.log(err) return res401(res, 'unauthorized') } }, @@ -72,6 +73,7 @@ const authentication = { req.user_id = decoded._id return next() } catch (err) { + return res401(res, 'unauthorized') } }, diff --git a/server/controllers/GPS.Device.js b/server/controllers/GPS.Device.js index 20ee455..6c2e0e5 100644 --- a/server/controllers/GPS.Device.js +++ b/server/controllers/GPS.Device.js @@ -8,7 +8,7 @@ const Device = require('../models/GPS.Device'); module.exports.addCode = [ [ body('model').notEmpty().isString().withMessage(_sr.fa.required.name), - body('IMEI').notEmpty().isIMEI().withMessage('لطفا IMEI را وارد یا تصحیح کنید').custom(async (v) => { + body('IMEI').notEmpty().isIMEI().trim().withMessage('لطفا IMEI را وارد یا تصحیح کنید').custom(async (v) => { const device = await Device.findOne({ IMEI: v }) if (device) { return Promise.reject(_sr.fa.duplicated.IMEI) @@ -36,8 +36,8 @@ module.exports.importExel = async (req, res) => { if (!req.files?.file) return res.status(422).json({ validation: { file: { msg: 'فایل را اضافه کنید' } } }) if (!req.files?.file.name.split('.').some(item => ['xlsx', 'xltx', 'xlsm', 'xlsb'].includes(item))) return res.status(422).json({ validation: { file: { msg: 'فرمت فایل درست نمیباشد' } } }) const file = req.files.file - const exelFile = await readXlsxFile(file); + const exelFile = await readXlsxFile(Buffer.from(file.data)); const data = await creator(exelFile) res.status(201).json({ msg: _sr.fa.response.success_save, data }) @@ -110,7 +110,8 @@ module.exports.updateDevice = [ const creator = (exel)=>{ return new Promise (async(resolve, reject)=>{ for (const row of exel) { - if (validator.isIMEI(row[0])) { + // eslint-disable-next-line no-constant-condition + if (validator.isIMEI(row[0].toString().trim() )|| true) { const device = await Device.findOne({ IMEI: row[0] }) if (device) { console.warn("Repeated IMEI ", row[0]) From db6c8d66816b78188fc5b7b408db3b0ae70ce527 Mon Sep 17 00:00:00 2001 From: Mr Swift Date: Wed, 7 Aug 2024 15:42:53 +0330 Subject: [PATCH 20/28] add pagination and fix bug --- server/controllers/GPS.BankAccount.js | 24 +++---- server/controllers/GPS.Device.js | 71 ++++++++++++-------- server/controllers/GPS.InstalledDevice.js | 80 +++++++++++++++++------ server/controllers/GPS.Request.js | 22 ++++++- server/controllers/GPS.Score.js | 32 +++++++++ server/controllers/GPS.Withdraw.js | 47 ++++++++++--- server/models/GPS.Device.js | 52 +++++++-------- server/models/GPS.InstalledDevice.js | 24 +++---- server/models/GPS.Renewal.js | 40 +++++++----- server/models/GPS.Request.js | 22 +++---- server/models/GPS.Score.js | 18 +++++ server/models/GPS.Withdraw.js | 42 ++++++------ server/routes/gps.js | 4 ++ 13 files changed, 322 insertions(+), 156 deletions(-) create mode 100644 server/controllers/GPS.Score.js create mode 100644 server/models/GPS.Score.js diff --git a/server/controllers/GPS.BankAccount.js b/server/controllers/GPS.BankAccount.js index 8331c0a..808d48d 100644 --- a/server/controllers/GPS.BankAccount.js +++ b/server/controllers/GPS.BankAccount.js @@ -13,22 +13,22 @@ module.exports.addCard = [ async (req, res) => { const { holderName, PAN, IBAN } = req.body; const userData = await User.findById(req.user_id).select('id cardBank') - if(userData?.cardBank && Array.isArray(userData?.cardBank)){ + if (userData?.cardBank && Array.isArray(userData?.cardBank)) { userData.cardBank.push({ holderName, PAN, IBAN - }) - userData.save() - res.status(201).json({msg: 'با موفقیت ثبت شد ' }) - }else{ + }) + userData.save() + res.status(201).json({ msg: 'با موفقیت ثبت شد ' }) + } else { userData.cardBank = [{ holderName, PAN, IBAN - }]; + }]; userData.save() - res.status(201).json({msg: 'با موفقیت ثبت شد '}) + res.status(201).json({ msg: 'با موفقیت ثبت شد ' }) } } ] @@ -50,15 +50,15 @@ module.exports.deleteCard = [ async (req, res) => { const userData = await User.findOneAndUpdate( { - _id:req.user_id, - "cardBank._id":req.params.id + _id: req.user_id, + "cardBank._id": req.params.id }, { - $pull: { - cardBank: { _id: req.params.id } + $pull: { + cardBank: { _id: req.params.id } } } ).select('id cardBank') - res.status(200).json({msg: "با موفقیت حذف شد ", data:userData}) + res.status(200).json({ msg: "با موفقیت حذف شد ", data: userData }) } ] \ No newline at end of file diff --git a/server/controllers/GPS.Device.js b/server/controllers/GPS.Device.js index 6c2e0e5..ad65d7d 100644 --- a/server/controllers/GPS.Device.js +++ b/server/controllers/GPS.Device.js @@ -38,8 +38,8 @@ module.exports.importExel = async (req, res) => { const file = req.files.file const exelFile = await readXlsxFile(Buffer.from(file.data)); - const data = await creator(exelFile) - res.status(201).json({ msg: _sr.fa.response.success_save, data }) + const data = await creator(exelFile) + res.status(201).json({ msg: _sr.fa.response.success_save, data }) } catch (error) { @@ -51,8 +51,25 @@ module.exports.importExel = async (req, res) => { module.exports.getAll = [ async (req, res) => { - const data = await Device.find().sort({ created_at: -1 }) - res.status(200).json(data) + let page; + let rows; + if (!req.query?.rows) { + rows = 10 + } else { + rows = req.query.rows + } + if (!req.query?.page) { + page = 0 + // eslint-disable-next-line eqeqeq + } else if (!req.query.page == 1) { + page = 0 + } else { + page = req.query.page + page = page * rows - rows + } + const data = await Device.find().sort({ created_at: -1 }).skip(page).limit(rows); + const total = Math.ceil((await Device.estimatedDocumentCount())) + res.status(200).json({ data, total }) } ] @@ -107,31 +124,31 @@ module.exports.updateDevice = [ ] -const creator = (exel)=>{ - return new Promise (async(resolve, reject)=>{ - for (const row of exel) { - // eslint-disable-next-line no-constant-condition - if (validator.isIMEI(row[0].toString().trim() )|| true) { - const device = await Device.findOne({ IMEI: row[0] }) - if (device) { - console.warn("Repeated IMEI ", row[0]) +const creator = (exel) => { + return new Promise(async (resolve, reject) => { + for (const row of exel) { + // eslint-disable-next-line no-constant-condition + if (validator.isIMEI(row[0].toString().trim()) || true) { + const device = await Device.findOne({ IMEI: row[0] }) + if (device) { + console.warn("Repeated IMEI ", row[0]) + } else { + await Device.create( + { + IMEI: row[0], + model: row[1], + tomanPrice: row[2], + dollarProfit: row[3] || 1, + profit: row[4] || 1, + score: row[5] || 1, + renewalProfit: row[6] || 1 + } + ) + } } else { - await Device.create( - { - IMEI: row[0], - model: row[1], - tomanPrice: row[2], - dollarProfit: row[3] || 1, - profit: row[4] || 1, - score: row[5] || 1, - renewalProfit:row[6] || 1 - } - ) + console.warn("Wrong IMEI ", row[0]) } - } else { - console.warn("Wrong IMEI ", row[0]) } - } - resolve("end") + resolve("end") }) } \ No newline at end of file diff --git a/server/controllers/GPS.InstalledDevice.js b/server/controllers/GPS.InstalledDevice.js index c350750..5eecbfc 100644 --- a/server/controllers/GPS.InstalledDevice.js +++ b/server/controllers/GPS.InstalledDevice.js @@ -4,6 +4,7 @@ const { checkValidations } = require('../plugins/controllersHelperFunctions'); const User = require('../models/User'); const InstalledDevice = require('../models/GPS.InstalledDevice'); const Device = require('../models/GPS.Device'); +const Score = require('../models/GPS.Score'); module.exports.deviceRegistration = [ [ @@ -11,38 +12,74 @@ module.exports.deviceRegistration = [ ], checkValidations(validationResult), async (req, res) => { - const device = await Device.find({IMEI:req.body.IMEI}); - if(!device){ - throw res.status(404).json({msg:'این IMEI وجود ندارد'}) - // eslint-disable-next-line eqeqeq - }else if(device.status == 1){ - throw res.status(404).json({msg:'این IMEI قبلا ثبت شده'}) + const device = await Device.find({ IMEI: req.body.IMEI }); + if (!device) { + throw res.status(404).json({ msg: 'این IMEI وجود ندارد' }) + // eslint-disable-next-line eqeqeq + } else if (device.status == 1) { + throw res.status(404).json({ msg: 'این IMEI قبلا ثبت شده' }) - }else{ + } else { const data = { deviceId: device.id, - status:0, - registerDate:new Date(), - userId:req.user_id + status: 0, + registerDate: new Date(), + userId: req.user_id } const newRequest = await InstalledDevice.create(data); device.status = 1; device.save() - res.status(201).json({msg:_sr.fa.response.success_save, data:newRequest}) + res.status(201).json({ msg: _sr.fa.response.success_save, data: newRequest }) } } ] -module.exports.getAllForUser = async(req, res)=>{ - const data = await InstalledDevice.find({userId:req.user_id}).sort({created_at: -1}).populate('deviceId') - res.status(200).json(data) - +module.exports.getAllForUser = async (req, res) => { + let page; + let rows; + if (!req.query?.rows) { + rows = 10 + } else { + rows = req.query.rows + } + if (!req.query?.page) { + page = 0 + // eslint-disable-next-line eqeqeq + } else if (!req.query.page == 1) { + page = 0 + } else { + page = req.query.page + page = page * rows - rows + } + const data = await InstalledDevice.find({ userId: req.user_id }).sort({ created_at: -1 }).populate('deviceId').skip(page).limit(rows); + const total = Math.ceil((await InstalledDevice.countDocuments({ userId: req.user_id }))) + res.status(200).json({ data, total }) + } -module.exports.getAllForAdmin = async(req, res)=>{ - const data = await InstalledDevice.find({}).sort({status: 1}).populate('deviceId').populate('userId', 'shopName shopNumber shopAddress birthDate score first_name last_name profilePic') - res.status(200).json(data) +module.exports.getAllForAdmin = async (req, res) => { + let page; + let rows; + if (!req.query?.rows) { + rows = 10 + } else { + rows = req.query.rows + } + if (!req.query?.page) { + page = 0 + // eslint-disable-next-line eqeqeq + } else if (!req.query.page == 1) { + page = 0 + } else { + page = req.query.page + page = page * rows - rows + } + const data = await InstalledDevice.find({}).sort({ status: 1 }).skip(page).limit(rows) + .populate('deviceId') + .populate('userId', 'shopName shopNumber shopAddress birthDate score first_name last_name profilePic') + const total = Math.ceil((await InstalledDevice.estimatedDocumentCount())) + res.status(200).json({ data, total }) } @@ -56,7 +93,7 @@ module.exports.updateInstalled = [ async (req, res) => { const installedDevice = await InstalledDevice.findById(req.params.id) if (!installedDevice) { - throw res.status(404).json({msg:'این ایدی وجود ندارد'}) + throw res.status(404).json({ msg: 'این ایدی وجود ندارد' }) } else { const user = await User.findById(installedDevice.userID) const device = await Device.findById(installedDevice.deviceId) @@ -71,6 +108,11 @@ module.exports.updateInstalled = [ user.dollarBalance += device.dollarProfit user.score += device.score user.save() + await Score.create({ + deviceId: device.id, + score: device.score, + userId: installedDevice.userID + }) res.status(201).json({ msg: _sr.fa.response.success_save, data: installedDevice }) break; } diff --git a/server/controllers/GPS.Request.js b/server/controllers/GPS.Request.js index 8761e40..d328c57 100644 --- a/server/controllers/GPS.Request.js +++ b/server/controllers/GPS.Request.js @@ -35,8 +35,26 @@ module.exports.gpsRequest = [ module.exports.getAllRequest = [ async (req, res) => { - const data = await RequestGPS.find({}).sort({ status: 1 }).populate('userId', 'shopName shopNumber shopAddress birthDate score first_name last_name profilePic') - res.status(200).json(data) + let page; + let rows; + if (!req.query?.rows) { + rows = 10 + } else { + rows = req.query.rows + } + if (!req.query?.page) { + page = 0 + // eslint-disable-next-line eqeqeq + } else if (!req.query.page == 1) { + page = 0 + } else { + page = req.query.page + page = page * rows - rows + } + const data = await RequestGPS.find({}).sort({ status: 1 }).skip(page).limit(rows) + .populate('userId', 'shopName shopNumber shopAddress birthDate score first_name last_name profilePic') + const total = Math.ceil((await RequestGPS.estimatedDocumentCount())) + res.status(200).json({ data, total }) } ] diff --git a/server/controllers/GPS.Score.js b/server/controllers/GPS.Score.js new file mode 100644 index 0000000..fa5b853 --- /dev/null +++ b/server/controllers/GPS.Score.js @@ -0,0 +1,32 @@ +// const { body, param, validationResult } = require('express-validator') +// const { _sr } = require('../plugins/serverResponses') +// const { checkValidations } = require('../plugins/controllersHelperFunctions') +const Score = require('../models/GPS.Score') +const User = require('../models/User') + + + +module.exports.getAll = async (req, res) => { + let page; + let rows; + if (!req.query?.rows) { + rows = 10 + } else { + rows = req.query.rows + } + if (!req.query?.page) { + page = 0 + // eslint-disable-next-line eqeqeq + } else if (!req.query.page == 1) { + page = 0 + } else { + page = req.query.page + page = page * rows - rows + } + + const score = await Score.find({ userId: req.user_id }).skip(page).limit(rows); + const total = Math.ceil((await score.estimatedDocumentCount())) + + const user = await User.findById(req.user_id).select('score') + res.status(200).json({ data: score, score: user.score, total }) +} diff --git a/server/controllers/GPS.Withdraw.js b/server/controllers/GPS.Withdraw.js index b94c0ec..b1f6dfe 100644 --- a/server/controllers/GPS.Withdraw.js +++ b/server/controllers/GPS.Withdraw.js @@ -30,17 +30,48 @@ module.exports.createRequest = [ module.exports.getAllForUser = async (req, res) => { - - const requests = await Withdraw.find({ userId: req.user_id }).sort({ created_at: -1 }) - - res.status(201).json(requests) + let page; + let rows; + if (!req.query?.rows) { + rows = 10 + } else { + rows = req.query.rows + } + if (!req.query?.page) { + page = 0 + // eslint-disable-next-line eqeqeq + } else if (!req.query.page == 1) { + page = 0 + } else { + page = req.query.page + page = page * rows - rows + } + const data = await Withdraw.find({ userId: req.user_id }).sort({ created_at: -1 }).skip(page).limit(rows); + const total = Math.ceil((await Withdraw.countDocuments({ userId: req.user_id }))) + res.status(201).json({ data, total }) } module.exports.getAllForAdmin = async (req, res) => { - - const requests = await Withdraw.find().sort({ status: 1 }).populate('userId', 'shopName shopNumber shopAddress birthDate score first_name last_name profilePic') - - res.status(201).json(requests) + let page; + let rows; + if (!req.query?.rows) { + rows = 10 + } else { + rows = req.query.rows + } + if (!req.query?.page) { + page = 0 + // eslint-disable-next-line eqeqeq + } else if (!req.query.page == 1) { + page = 0 + } else { + page = req.query.page + page = page * rows - rows + } + const data = await Withdraw.find().sort({ status: 1 }).skip(page).limit(rows) + .populate('userId', 'shopName shopNumber shopAddress birthDate score first_name last_name profilePic') + const total = Math.ceil((await Withdraw.estimatedDocumentCount())) + res.status(201).json({ data, total }) } diff --git a/server/models/GPS.Device.js b/server/models/GPS.Device.js index 1d76c19..cb7dbad 100644 --- a/server/models/GPS.Device.js +++ b/server/models/GPS.Device.js @@ -1,41 +1,41 @@ const mongoose = require('mongoose') const deviceSchema = mongoose.Schema({ - model:String, - IMEI:{ - type:String, - unique:[true,"این ایدی در سامانه موجود است"] + model: String, + IMEI: { + type: String, + unique: [true, "این ایدی در سامانه موجود است"] }, - tomanPrice:{ - type:Number, - min:0, - default:0 + tomanPrice: { + type: Number, + min: 0, + default: 0 }, - dollarProfit:{ - type:Number, - min:0, - default:0 + dollarProfit: { + type: Number, + min: 0, + default: 0 }, - profit:{ - type:Number, - min:0, - default:0 + profit: { + type: Number, + min: 0, + default: 0 }, - score:{ - type:Number, - min:0 + score: { + type: Number, + min: 0 }, - renewalProfit:{ - type:Number, - min:0 + renewalProfit: { + type: Number, + min: 0 }, - status:{ - type:Number, - enum:[ + status: { + type: Number, + enum: [ 0, // not installed 1 // installed ], - default:0 + default: 0 } }) diff --git a/server/models/GPS.InstalledDevice.js b/server/models/GPS.InstalledDevice.js index 74ee922..fc1d0f8 100644 --- a/server/models/GPS.InstalledDevice.js +++ b/server/models/GPS.InstalledDevice.js @@ -1,24 +1,24 @@ const mongoose = require('mongoose') const InstalledDeviceSchema = mongoose.Schema({ - deviceId:{ - type:String, - ref:"Device" + deviceId: { + type: String, + ref: "Device" }, - status:{ - type:Number, - enum:[ + status: { + type: Number, + enum: [ 0, // Pending 1, // Accepted 2, // Rejected ], - default:0 + default: 0 }, - registerDate:Date, - installationDate:Date, - userId:{ - type:String, - ref:'User' + registerDate: Date, + installationDate: Date, + userId: { + type: String, + ref: 'User' }, }) diff --git a/server/models/GPS.Renewal.js b/server/models/GPS.Renewal.js index c4f572b..a181274 100644 --- a/server/models/GPS.Renewal.js +++ b/server/models/GPS.Renewal.js @@ -1,28 +1,32 @@ const mongoose = require('mongoose') const RenewalSchema = mongoose.Schema({ - deviceId:{ - type:String, - ref:'Device' + deviceId: { + type: String, + ref: 'Device' }, - renewDate:Date, - renewType:{ - type:String, + renewDate: Date, + renewType: { + type: String, }, - price:{ - type:Number, - min:0 + price: { + type: Number, + min: 0 }, - profit:{ - type:Number, - min:0, - unique:true, - default:0, - required:true + profit: { + type: Number, + min: 0, + unique: true, + default: 0, + required: true }, - dollarProfit:{ - type:Number, - min:0 + dollarProfit: { + type: Number, + min: 0 + }, + userId: { + type: String, + ref: 'User' }, }) diff --git a/server/models/GPS.Request.js b/server/models/GPS.Request.js index f2253a4..d755842 100644 --- a/server/models/GPS.Request.js +++ b/server/models/GPS.Request.js @@ -1,22 +1,22 @@ const mongoose = require('mongoose') const RequestSchema = mongoose.Schema({ - userId:{ - type:String, - ref:'User' + userId: { + type: String, + ref: 'User' }, - shopName:String, - shopNumber:String, - shopAddress:String, - birthDate:String, - status:{ - type:Number, - enum:[ + shopName: String, + shopNumber: String, + shopAddress: String, + birthDate: String, + status: { + type: Number, + enum: [ 0, // Pending 1, // Accepted 2 // Rejected ], - default:0 + default: 0 } }) diff --git a/server/models/GPS.Score.js b/server/models/GPS.Score.js new file mode 100644 index 0000000..47b02ac --- /dev/null +++ b/server/models/GPS.Score.js @@ -0,0 +1,18 @@ +const mongoose = require('mongoose') + +const ScoreSchema = mongoose.Schema({ + deviceId: { + type: String, + ref: 'Device' + }, + score: { + type: Number, + min: 0 + }, + userId: { + type: String, + ref: 'User' + }, +}) + +module.exports = mongoose.model('Score', ScoreSchema) diff --git a/server/models/GPS.Withdraw.js b/server/models/GPS.Withdraw.js index b793193..02b582a 100644 --- a/server/models/GPS.Withdraw.js +++ b/server/models/GPS.Withdraw.js @@ -2,40 +2,40 @@ const mongoose = require('mongoose') const BankSchema = mongoose.Schema({ - holderName:String, - PAN:{ - type:Number, + holderName: String, + PAN: { + type: Number, }, - IBAN:{ - type:Number, + IBAN: { + type: Number, } - }) +}) /// ///////////////////////////////////////////////////// const WithdrawSchema = mongoose.Schema({ - card:BankSchema, - amount:{ - type:Number, - min:0 + card: BankSchema, + amount: { + type: Number, + min: 0 }, - dollarAmount:{ - type:Number, - min:0 + dollarAmount: { + type: Number, + min: 0 }, - userId:{ - type:String, - ref:'User' + userId: { + type: String, + ref: 'User' }, - status:{ - type:Number, - enum:[ + status: { + type: Number, + enum: [ 0, // Pending 1, // Accepted 2, // deposited ] }, - depositDate:Date, - trackingNumber:String + depositDate: Date, + trackingNumber: String }) module.exports = mongoose.model('Withdraw', WithdrawSchema) diff --git a/server/routes/gps.js b/server/routes/gps.js index 78d6817..2f22f1c 100644 --- a/server/routes/gps.js +++ b/server/routes/gps.js @@ -3,6 +3,7 @@ const router = Router() const bankAccount = require('../controllers/GPS.BankAccount') const withdraw = require('../controllers/GPS.Withdraw') const installedDevice = require('../controllers/GPS.InstalledDevice') +const score = require('../controllers/GPS.Score') /// ///////////////// Bank card router.post('/bank-card', bankAccount.addCard) @@ -16,4 +17,7 @@ router.get('/withdraw', withdraw.getAllForUser) router.post('/register-device', installedDevice.deviceRegistration) router.get('/register-device', installedDevice.getAllForUser) +/// ///////////////// Score +router.get('/score', score.getAll) + module.exports = router From 95f4e04d21f44af7cbcf6a02df520aeca6365bd4 Mon Sep 17 00:00:00 2001 From: Mr Swift Date: Wed, 7 Aug 2024 16:03:35 +0330 Subject: [PATCH 21/28] Create GPS.Auth.js --- server/controllers/GPS.Auth.js | 63 ++++++++++++++++++++++++++++++++++ 1 file changed, 63 insertions(+) create mode 100644 server/controllers/GPS.Auth.js diff --git a/server/controllers/GPS.Auth.js b/server/controllers/GPS.Auth.js new file mode 100644 index 0000000..63fa4be --- /dev/null +++ b/server/controllers/GPS.Auth.js @@ -0,0 +1,63 @@ +const bcrypt = require('bcryptjs') +const jwt = require('jsonwebtoken') +const { body, param, validationResult } = require('express-validator') +const { secretKey } = require('../authentication') +const { _sr } = require('../plugins/serverResponses') +const { checkValidations } = require('../plugins/controllersHelperFunctions') +const User = require('../models/User') + +module.exports.login = [ + [ + body('username') + .isLength({ min: 4 }) + .withMessage(_sr.fa.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(_sr.fa.not_found.password) + else return true + }) + }), + + body('password') + .notEmpty() + .withMessage(_sr.fa.required.password) + .bail() + .isLength({ min: 4 }) + .withMessage(_sr.fa.min_char.min4), + + body('remember_me') + .exists() + .withMessage(_sr.fa.required.remember_me) + .bail() + .isBoolean() + .withMessage(_sr.fa.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.status(200).json({ token }) + } catch (err) { + return res.status(422).json({ + validation: { username: { msg: _sr.fa.not_found.password } } + }) + } + } + ] \ No newline at end of file From db63bfa23f06b5c2863460ca5490339a4ee0037a Mon Sep 17 00:00:00 2001 From: Mr Swift Date: Sat, 10 Aug 2024 13:23:09 +0330 Subject: [PATCH 22/28] Add award --- server/controllers/GPS.Auth.js | 4 +- server/controllers/GPS.Award.js | 83 ++++++++++++++++++++++++++ server/controllers/GPS.AwardRequest.js | 4 ++ server/models/GPS.Award.js | 12 ++++ server/models/GPS.AwardRequest.js | 24 ++++++++ 5 files changed, 124 insertions(+), 3 deletions(-) create mode 100644 server/controllers/GPS.Award.js create mode 100644 server/controllers/GPS.AwardRequest.js create mode 100644 server/models/GPS.Award.js create mode 100644 server/models/GPS.AwardRequest.js diff --git a/server/controllers/GPS.Auth.js b/server/controllers/GPS.Auth.js index 63fa4be..14a85b3 100644 --- a/server/controllers/GPS.Auth.js +++ b/server/controllers/GPS.Auth.js @@ -1,6 +1,6 @@ const bcrypt = require('bcryptjs') const jwt = require('jsonwebtoken') -const { body, param, validationResult } = require('express-validator') +const { body, validationResult } = require('express-validator') const { secretKey } = require('../authentication') const { _sr } = require('../plugins/serverResponses') const { checkValidations } = require('../plugins/controllersHelperFunctions') @@ -23,14 +23,12 @@ module.exports.login = [ else return true }) }), - body('password') .notEmpty() .withMessage(_sr.fa.required.password) .bail() .isLength({ min: 4 }) .withMessage(_sr.fa.min_char.min4), - body('remember_me') .exists() .withMessage(_sr.fa.required.remember_me) diff --git a/server/controllers/GPS.Award.js b/server/controllers/GPS.Award.js new file mode 100644 index 0000000..3bbc34b --- /dev/null +++ b/server/controllers/GPS.Award.js @@ -0,0 +1,83 @@ +const { body, validationResult, param } = require('express-validator'); +const { _sr } = require('../plugins/serverResponses'); +const { checkValidations } = require('../plugins/controllersHelperFunctions'); +const Award = require('../models/GPS.Award'); + + +module.exports.createAward = [ + [ + body('score').notEmpty().isInt().withMessage(_sr.fa.required.field), + body('title').notEmpty().isString().withMessage(_sr.fa.required.field), + body('desc').notEmpty().isString().withMessage(_sr.fa.required.field), + body('expireDate').notEmpty().isDate().withMessage(_sr.fa.required.field), + ], + checkValidations(validationResult), + async (req, res) => { + const { score, title, desc, expireData } = req.body; + const award = await Award.create({ score, title, desc, expireData }) + res.status(201).json({ + msg: _sr.fa.response.success_save, + data: award + }) + + } +] + + +module.exports.findAllUser = async (req, res) => { + const toDay = new Date() + const data = await Award.find({$lt: {expireDate: toDay}}) + res.status(200).json(data) +} + +module.exports.findAllAdmin = async (req, res) => { + const data = await Award.find({}) + res.status(200).json(data) +} + +module.exports.findOne = [ + [ + param('id').notEmpty().isMongoId().withMessage('ایدی را وارد یا تصحیح کنید') + ], + checkValidations(validationResult), + async (req, res) => { + const data = await Award.findById(req.params.id) + if (!data) { + res.status(404).json({ msg: _sr.fa.not_found.item_id }) + } else { + res.status(200).json(data) + } + + } +] + +module.exports.update =[ + [ + param('id').notEmpty().isMongoId().withMessage('ایدی را وارد یا تصحیح کنید'), + body('score').notEmpty().isInt().withMessage(_sr.fa.required.field), + body('title').notEmpty().isString().withMessage(_sr.fa.required.field), + body('desc').notEmpty().isString().withMessage(_sr.fa.required.field), + body('expireDate').notEmpty().isDate().withMessage(_sr.fa.required.field), + ], + checkValidations(validationResult), + async (req, res) => { + const { score, title, desc, expireData } = req.body; + const data = await Award.findById(req.params.id) + if (!data) { + res.status(404).json({ msg: _sr.fa.not_found.item_id }) + } else { + data.score = score; + data.title = title; + data.desc = desc; + data.expireData = expireData; + data.save() + res.status(200).json({ + msg: _sr.fa.response.success_save, + data + }) + } + + } +] + + diff --git a/server/controllers/GPS.AwardRequest.js b/server/controllers/GPS.AwardRequest.js new file mode 100644 index 0000000..d2afb8a --- /dev/null +++ b/server/controllers/GPS.AwardRequest.js @@ -0,0 +1,4 @@ +const { body, param, validationResult } = require('express-validator') +const { _sr } = require('../plugins/serverResponses') +const { checkValidations } = require('../plugins/controllersHelperFunctions') +const User = require('../models/User') \ No newline at end of file diff --git a/server/models/GPS.Award.js b/server/models/GPS.Award.js new file mode 100644 index 0000000..d245a8d --- /dev/null +++ b/server/models/GPS.Award.js @@ -0,0 +1,12 @@ +const mongoose = require('mongoose') + +const AwairdSchema = mongoose.Schema({ + + score:Number, + title:String, + desc:String, + expireDate:Date + +}) + +module.exports = mongoose.model('AwairdGPS', AwairdSchema) diff --git a/server/models/GPS.AwardRequest.js b/server/models/GPS.AwardRequest.js new file mode 100644 index 0000000..6a7db59 --- /dev/null +++ b/server/models/GPS.AwardRequest.js @@ -0,0 +1,24 @@ +const mongoose = require('mongoose') + +const AwardRequestSchema = mongoose.Schema({ + awardId:{ + type:String, + ref:'Award' + }, + userId:{ + type:String, + ref:'User' + }, + desc:String, + metaData:Object, + status:{ + type:Number, + enum:[ + 0, // Pending + 1 // Done + ], + default:0 + } +}) + +module.exports = mongoose.model('AwardRequestGPS', AwardRequestSchema) From 39f670164aea1f93b5404d2ce29d6f13621647b2 Mon Sep 17 00:00:00 2001 From: Mr Swift Date: Sat, 10 Aug 2024 19:32:08 +0330 Subject: [PATCH 23/28] Update GPS.AwardRequest.js --- server/controllers/GPS.AwardRequest.js | 89 +++++++++++++++++++++++++- 1 file changed, 88 insertions(+), 1 deletion(-) diff --git a/server/controllers/GPS.AwardRequest.js b/server/controllers/GPS.AwardRequest.js index d2afb8a..2467201 100644 --- a/server/controllers/GPS.AwardRequest.js +++ b/server/controllers/GPS.AwardRequest.js @@ -1,4 +1,91 @@ const { body, param, validationResult } = require('express-validator') const { _sr } = require('../plugins/serverResponses') const { checkValidations } = require('../plugins/controllersHelperFunctions') -const User = require('../models/User') \ No newline at end of file +const User = require('../models/User') +const Award = require('../models/GPS.Award'); +const AwardRequest = require('../models/GPS.AwardRequest'); + + +module.exports.sendRequest = [ + [ + body('awardId').notEmpty().isMongoId().withMessage(_sr.fa.required.field) + ], + checkValidations(validationResult), + async(req, res)=>{ + const award = await Award.findById(req.body.awardId) + if (!award) { + res.status(404).json({ msg: _sr.fa.not_found.item_id }) + }else if(award.expireDate < new Date()){ + res.status(404).json({ msg: _sr.fa.not_found.item_id }) + }else{ + const user = await User.findById(req.user_id) + if(award.score <= user.score){ + user.score -= award.score; + user.save() + const data = await AwardRequest.create({ + awardId:req.body.awardId, + userId:req.user_id + }) + res.status(200).json({ msg:_sr.fa.response.success_save, data}) + }else{ + res.status(400).json({ msg: "امتیاز شما برای این مورد کافی نیست" }) + + } + + } + + } +] + +module.exports.findAllUser = async(req, res)=>{ + const data = await AwardRequest.find({userId:req.user_id}).populate('awardId','-created_at -updated_at') + res.status(200).json(data) +} + +module.exports.findAllAdmin = async(req, res)=>{ + const data = await AwardRequest.find().populate('awardId','-created_at -updated_at').populate('userId', 'first_name last_name shopName shopNumber shopAddress national_code mobile_number') + res.status(200).json(data) +} + +module.exports.findOne = [ + [ + param('id').notEmpty().isMongoId().withMessage('ایدی را وارد یا تصحیح کنید') + ], + checkValidations(validationResult), + async (req, res) => { + const data = await AwardRequest.findById(req.params.id).populate('awardId','-created_at -updated_at').populate('userId', 'first_name last_name shopName shopNumber shopAddress national_code mobile_number') + if (!data) { + res.status(404).json({ msg: _sr.fa.not_found.item_id }) + } else { + res.status(200).json(data) + } + + } +] + + +module.exports.update = [ + [ + param('id').notEmpty().isMongoId().withMessage('ایدی را وارد یا تصحیح کنید'), + body('status').notEmpty().isInt().withMessage(_sr.fa.required.field), + body('desc').notEmpty().isString().withMessage(_sr.fa.required.field) + ], + checkValidations(validationResult), + async (req, res) => { + const { status, desc, metaData } = req.body; + const data = await AwardRequest.findById(req.params.id) + if (!data) { + res.status(404).json({ msg: _sr.fa.not_found.item_id }) + } else { + await AwardRequest.updateOne( + {id:req.params.id}, + { + status, + desc, + metaData + } + ) + } + + } +] From 21a6907d9fd65d3d762d4c689fe9c9c210d107ee Mon Sep 17 00:00:00 2001 From: Mr Swift Date: Sun, 11 Aug 2024 10:56:26 +0330 Subject: [PATCH 24/28] Fiz --- server/controllers/GPS.Auth.js | 3 +++ server/controllers/GPS.Request.js | 3 ++- 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/server/controllers/GPS.Auth.js b/server/controllers/GPS.Auth.js index 14a85b3..1763745 100644 --- a/server/controllers/GPS.Auth.js +++ b/server/controllers/GPS.Auth.js @@ -49,6 +49,9 @@ module.exports.login = [ const token = await jwt.sign({ _id: user._id }, secretKey, { expiresIn: req.body.remember_me ? '30d' : '7d' }) + if(!user.scope.includes('gps')){ + throw new Error('err') + } user.token = token await user.save() return res.status(200).json({ token }) diff --git a/server/controllers/GPS.Request.js b/server/controllers/GPS.Request.js index d328c57..9d15422 100644 --- a/server/controllers/GPS.Request.js +++ b/server/controllers/GPS.Request.js @@ -94,7 +94,8 @@ module.exports.changeStatus = [ birthDate: data.birthDate, walletBalance: userPreData?.walletBalance | 0, dollarBalance: userPreData?.dollarBalance | 0, - score: userPreData?.score | 0 + score: userPreData?.score | 0, + $push:{scope:'gps'} }, { new: true } ) From 180cb8b5cf3f6840f756f5220e0d8ccb24fb01f9 Mon Sep 17 00:00:00 2001 From: Mr Swift Date: Sun, 11 Aug 2024 16:11:32 +0330 Subject: [PATCH 25/28] Fix Bug --- bun.lockb | Bin 0 -> 754194 bytes server/authentication.js | 13 +++--- server/controllers/GPS.Auth.js | 8 ++-- server/controllers/GPS.Award.js | 15 +++---- server/controllers/GPS.AwardRequest.js | 2 + server/controllers/GPS.BankAccount.js | 44 ++++++++++--------- server/controllers/GPS.Device.js | 17 ++++++++ server/controllers/GPS.InstalledDevice.js | 40 +++++++++++------- server/controllers/GPS.Request.js | 49 +++++++++++++++------- server/controllers/GPS.Score.js | 9 ++-- server/controllers/GPS.Withdraw.js | 48 ++++++++++++--------- server/models/GPS.Award.js | 2 +- server/models/GPS.AwardRequest.js | 4 +- server/models/GPS.Withdraw.js | 2 +- server/models/User.js | 2 +- server/routes/admin.js | 20 +++++++-- server/routes/auth.js | 7 ++++ server/routes/gps.js | 10 +++++ 18 files changed, 192 insertions(+), 100 deletions(-) create mode 100644 bun.lockb diff --git a/bun.lockb b/bun.lockb new file mode 100644 index 0000000000000000000000000000000000000000..55c24e2f5a93ff101a75cd8dbc843527bd04234a GIT binary patch literal 754194 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⪻}rvP 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üJs@> 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

Mj@ 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 { - const { score, title, desc, expireData } = req.body; - const award = await Award.create({ score, title, desc, expireData }) + const { score, title, desc, expireDate } = req.body; + const fixDate = new Date(expireDate) + const award = await Award.create({ score, title, desc, expireDate:fixDate }) res.status(201).json({ msg: _sr.fa.response.success_save, data: award @@ -26,7 +27,7 @@ module.exports.createAward = [ module.exports.findAllUser = async (req, res) => { const toDay = new Date() - const data = await Award.find({$lt: {expireDate: toDay}}) + const data = await Award.find({expireDate: {$gt: toDay}}) res.status(200).json(data) } @@ -57,11 +58,11 @@ module.exports.update =[ body('score').notEmpty().isInt().withMessage(_sr.fa.required.field), body('title').notEmpty().isString().withMessage(_sr.fa.required.field), body('desc').notEmpty().isString().withMessage(_sr.fa.required.field), - body('expireDate').notEmpty().isDate().withMessage(_sr.fa.required.field), + body('expireDate').notEmpty().withMessage(_sr.fa.required.field), ], checkValidations(validationResult), async (req, res) => { - const { score, title, desc, expireData } = req.body; + const { score, title, desc, expireDate } = req.body; const data = await Award.findById(req.params.id) if (!data) { res.status(404).json({ msg: _sr.fa.not_found.item_id }) @@ -69,7 +70,7 @@ module.exports.update =[ data.score = score; data.title = title; data.desc = desc; - data.expireData = expireData; + data.expireDate = new Date(expireDate) data.save() res.status(200).json({ msg: _sr.fa.response.success_save, diff --git a/server/controllers/GPS.AwardRequest.js b/server/controllers/GPS.AwardRequest.js index 2467201..cdeda43 100644 --- a/server/controllers/GPS.AwardRequest.js +++ b/server/controllers/GPS.AwardRequest.js @@ -85,6 +85,8 @@ module.exports.update = [ metaData } ) + res.status(200).json({ msg: _sr.fa.response.success_save }) + } } diff --git a/server/controllers/GPS.BankAccount.js b/server/controllers/GPS.BankAccount.js index 808d48d..56855c5 100644 --- a/server/controllers/GPS.BankAccount.js +++ b/server/controllers/GPS.BankAccount.js @@ -11,24 +11,29 @@ module.exports.addCard = [ ], checkValidations(validationResult), async (req, res) => { - const { holderName, PAN, IBAN } = req.body; - const userData = await User.findById(req.user_id).select('id cardBank') - if (userData?.cardBank && Array.isArray(userData?.cardBank)) { - userData.cardBank.push({ - holderName, - PAN, - IBAN - }) - userData.save() - res.status(201).json({ msg: 'با موفقیت ثبت شد ' }) - } else { - userData.cardBank = [{ - holderName, - PAN, - IBAN - }]; - userData.save() - res.status(201).json({ msg: 'با موفقیت ثبت شد ' }) + try { + const { holderName, PAN, IBAN } = req.body; + const userData = await User.findById(req.user_id).select('id cardBank') + if (userData?.cardBank && Array.isArray(userData?.cardBank)) { + userData.cardBank.push({ + holderName, + PAN, + IBAN + }) + userData.save() + res.status(201).json({ msg: 'با موفقیت ثبت شد ' }) + } else { + userData.cardBank = [{ + holderName, + PAN, + IBAN + }]; + userData.save() + res.status(201).json({ msg: 'با موفقیت ثبت شد ' }) + } + } catch (error) { + res.status(500).json({ msg: error }) + } } ] @@ -57,7 +62,8 @@ module.exports.deleteCard = [ $pull: { cardBank: { _id: req.params.id } } - } + }, + { new:true } ).select('id cardBank') res.status(200).json({ msg: "با موفقیت حذف شد ", data: userData }) } diff --git a/server/controllers/GPS.Device.js b/server/controllers/GPS.Device.js index ad65d7d..4167d01 100644 --- a/server/controllers/GPS.Device.js +++ b/server/controllers/GPS.Device.js @@ -89,6 +89,23 @@ module.exports.getOne = [ } ] +module.exports.getOneByIMEI = [ + [ + param('imei').notEmpty().isString().withMessage('ایدی اشتباه است') + ], + checkValidations(validationResult), + async (req, res) => { + const data = await Device.findOne({IMEI:req.params.imei}).sort({ created_at: -1 }) + if (!data) { + res.status(404).json(_sr.fa.not_found.item_id) + } else { + res.status(200).json(data) + } + + } +] + + module.exports.updateDevice = [ [ diff --git a/server/controllers/GPS.InstalledDevice.js b/server/controllers/GPS.InstalledDevice.js index 5eecbfc..bd8dca5 100644 --- a/server/controllers/GPS.InstalledDevice.js +++ b/server/controllers/GPS.InstalledDevice.js @@ -12,7 +12,7 @@ module.exports.deviceRegistration = [ ], checkValidations(validationResult), async (req, res) => { - const device = await Device.find({ IMEI: req.body.IMEI }); + const device = await Device.findOne({ IMEI: req.body.IMEI }); if (!device) { throw res.status(404).json({ msg: 'این IMEI وجود ندارد' }) // eslint-disable-next-line eqeqeq @@ -38,21 +38,23 @@ module.exports.deviceRegistration = [ module.exports.getAllForUser = async (req, res) => { let page; let rows; - if (!req.query?.rows) { + if (!req.query?.rows || req.query?.rows <= 5) { rows = 10 } else { - rows = req.query.rows + rows = parseInt(req.query.rows) } + if (!req.query?.page) { page = 0 // eslint-disable-next-line eqeqeq - } else if (!req.query.page == 1) { + } else if (req.query.page <= 1) { page = 0 } else { page = req.query.page page = page * rows - rows } - const data = await InstalledDevice.find({ userId: req.user_id }).sort({ created_at: -1 }).populate('deviceId').skip(page).limit(rows); + const data = await InstalledDevice.find({ userId: req.user_id }).skip(page).limit(rows).sort({ created_at: -1 }).populate('deviceId') + const total = Math.ceil((await InstalledDevice.countDocuments({ userId: req.user_id }))) res.status(200).json({ data, total }) @@ -61,15 +63,16 @@ module.exports.getAllForUser = async (req, res) => { module.exports.getAllForAdmin = async (req, res) => { let page; let rows; - if (!req.query?.rows) { + if (!req.query?.rows || req.query?.rows <= 5) { rows = 10 } else { - rows = req.query.rows + rows = parseInt(req.query.rows) } + if (!req.query?.page) { page = 0 // eslint-disable-next-line eqeqeq - } else if (!req.query.page == 1) { + } else if (req.query.page <= 1) { page = 0 } else { page = req.query.page @@ -95,24 +98,29 @@ module.exports.updateInstalled = [ if (!installedDevice) { throw res.status(404).json({ msg: 'این ایدی وجود ندارد' }) } else { - const user = await User.findById(installedDevice.userID) + const user = await User.findById(installedDevice.userId).select('walletBalance dollarBalance score') const device = await Device.findById(installedDevice.deviceId) switch (req.params.type) { case "accept": { + installedDevice.status = 1; installedDevice.installationDate = new Date(); - installedDevice.save() + device.status = 1; - device.save() - user.walletBalance += device.profit - user.dollarBalance += device.dollarProfit - user.score += device.score - user.save() + + user.walletBalance = device.profit + user.dollarBalance = device.dollarProfit + user.score = device.score + + await Score.create({ deviceId: device.id, score: device.score, - userId: installedDevice.userID + userId: installedDevice.userId }) + user.save() + device.save() + installedDevice.save() res.status(201).json({ msg: _sr.fa.response.success_save, data: installedDevice }) break; } diff --git a/server/controllers/GPS.Request.js b/server/controllers/GPS.Request.js index 9d15422..78ef4a6 100644 --- a/server/controllers/GPS.Request.js +++ b/server/controllers/GPS.Request.js @@ -84,22 +84,41 @@ module.exports.changeStatus = [ status: 1 }, { new: true }) - const userPreData = await User.findById(data.userId).select('walletBalance dollarBalance score') - const userData = await User.findByIdAndUpdate( - data.userId, - { - shopName: data.shopName, - shopNumber: data.shopNumber, - shopAddress: data.shopAddress, - birthDate: data.birthDate, - walletBalance: userPreData?.walletBalance | 0, - dollarBalance: userPreData?.dollarBalance | 0, - score: userPreData?.score | 0, - $push:{scope:'gps'} - }, - { new: true } - ) + const userPreData = await User.findById(data.userId).select('walletBalance dollarBalance score scope') + if(userPreData.scope.includes('gps')){ + const userData = await User.findByIdAndUpdate( + data.userId, + { + shopName: data.shopName, + shopNumber: data.shopNumber, + shopAddress: data.shopAddress, + birthDate: data.birthDate, + walletBalance: userPreData?.walletBalance | 0, + dollarBalance: userPreData?.dollarBalance | 0, + score: userPreData?.score | 0, + $push:{scope:'gps'} + }, + { new: true } + ).select('first_name last_name') res.status(200).json({ msg: 'با موفقیت به روز شد', data: userData }) + + }else{ + const userData = await User.findByIdAndUpdate( + data.userId, + { + shopName: data.shopName, + shopNumber: data.shopNumber, + shopAddress: data.shopAddress, + birthDate: data.birthDate, + walletBalance: userPreData?.walletBalance | 0, + dollarBalance: userPreData?.dollarBalance | 0, + score: userPreData?.score | 0, + }, + { new: true } + ).select('first_name last_name') + res.status(200).json({ msg: 'با موفقیت به روز شد', data: userData }) + + } break; } case "reject": { diff --git a/server/controllers/GPS.Score.js b/server/controllers/GPS.Score.js index fa5b853..e1a882e 100644 --- a/server/controllers/GPS.Score.js +++ b/server/controllers/GPS.Score.js @@ -9,15 +9,16 @@ const User = require('../models/User') module.exports.getAll = async (req, res) => { let page; let rows; - if (!req.query?.rows) { + if (!req.query?.rows || req.query?.rows <= 5) { rows = 10 } else { - rows = req.query.rows + rows = parseInt(req.query.rows) } + if (!req.query?.page) { page = 0 // eslint-disable-next-line eqeqeq - } else if (!req.query.page == 1) { + } else if (req.query.page <= 1) { page = 0 } else { page = req.query.page @@ -25,7 +26,7 @@ module.exports.getAll = async (req, res) => { } const score = await Score.find({ userId: req.user_id }).skip(page).limit(rows); - const total = Math.ceil((await score.estimatedDocumentCount())) + const total = Math.ceil((await Score.countDocuments({ userId: req.user_id }))) const user = await User.findById(req.user_id).select('score') res.status(200).json({ data: score, score: user.score, total }) diff --git a/server/controllers/GPS.Withdraw.js b/server/controllers/GPS.Withdraw.js index b1f6dfe..fa31818 100644 --- a/server/controllers/GPS.Withdraw.js +++ b/server/controllers/GPS.Withdraw.js @@ -11,20 +11,25 @@ module.exports.createRequest = [ ], checkValidations(validationResult), async (req, res) => { - const user = await User.findById(req.user_id) - const data = { - card: req.body.card, - userId: req.user_id, - amount: user.walletBalance, - dollarAmount: user.dollarBalance, - status: 0 + try { + const user = await User.findById(req.user_id) + const data = { + card: req.body.card, + userId: req.user_id, + amount: user.walletBalance, + dollarAmount: user.dollarBalance, + status: 0 + } + + const request = await Withdraw.create(data) + user.dollarBalance = 0; + user.walletBalance = 0; + user.save() + res.status(201).json({ msg: _sr.fa.response.success_save, data: request }) + } catch (error) { + res.status(500).json({ msg: error }) + } - user.dollarBalance = 0; - user.walletBalance = 0; - user.save() - const request = await Withdraw.create(data) - - res.status(201).json({ msg: _sr.fa.response.success_save, data: request }) } ] @@ -32,21 +37,23 @@ module.exports.createRequest = [ module.exports.getAllForUser = async (req, res) => { let page; let rows; - if (!req.query?.rows) { + if (!req.query?.rows || req.query?.rows <= 5) { rows = 10 } else { - rows = req.query.rows + rows = parseInt(req.query.rows) } + if (!req.query?.page) { page = 0 // eslint-disable-next-line eqeqeq - } else if (!req.query.page == 1) { + } else if (req.query.page <= 1) { page = 0 } else { page = req.query.page page = page * rows - rows } - const data = await Withdraw.find({ userId: req.user_id }).sort({ created_at: -1 }).skip(page).limit(rows); + + const data = await Withdraw.find({ userId: req.user_id }).skip(page).limit(rows).sort({ created_at: -1 }); const total = Math.ceil((await Withdraw.countDocuments({ userId: req.user_id }))) res.status(201).json({ data, total }) } @@ -54,15 +61,16 @@ module.exports.getAllForUser = async (req, res) => { module.exports.getAllForAdmin = async (req, res) => { let page; let rows; - if (!req.query?.rows) { + if (!req.query?.rows || req.query?.rows <= 5) { rows = 10 } else { - rows = req.query.rows + rows = parseInt(req.query.rows) } + if (!req.query?.page) { page = 0 // eslint-disable-next-line eqeqeq - } else if (!req.query.page == 1) { + } else if (req.query.page <= 1) { page = 0 } else { page = req.query.page diff --git a/server/models/GPS.Award.js b/server/models/GPS.Award.js index d245a8d..7df2283 100644 --- a/server/models/GPS.Award.js +++ b/server/models/GPS.Award.js @@ -9,4 +9,4 @@ const AwairdSchema = mongoose.Schema({ }) -module.exports = mongoose.model('AwairdGPS', AwairdSchema) +module.exports = mongoose.model('AwardGPS', AwairdSchema) diff --git a/server/models/GPS.AwardRequest.js b/server/models/GPS.AwardRequest.js index 6a7db59..4689cfc 100644 --- a/server/models/GPS.AwardRequest.js +++ b/server/models/GPS.AwardRequest.js @@ -2,8 +2,8 @@ const mongoose = require('mongoose') const AwardRequestSchema = mongoose.Schema({ awardId:{ - type:String, - ref:'Award' + type:mongoose.Types.ObjectId, + ref:'AwardGPS' }, userId:{ type:String, diff --git a/server/models/GPS.Withdraw.js b/server/models/GPS.Withdraw.js index 02b582a..3c13415 100644 --- a/server/models/GPS.Withdraw.js +++ b/server/models/GPS.Withdraw.js @@ -7,7 +7,7 @@ const BankSchema = mongoose.Schema({ type: Number, }, IBAN: { - type: Number, + type: String, } }) diff --git a/server/models/User.js b/server/models/User.js index 2264c05..a398b0a 100644 --- a/server/models/User.js +++ b/server/models/User.js @@ -6,7 +6,7 @@ const BankSchema = mongoose.Schema({ type:Number, }, IBAN:{ - type:Number, + type:String, } }) diff --git a/server/routes/admin.js b/server/routes/admin.js index 1e62179..0ae205b 100644 --- a/server/routes/admin.js +++ b/server/routes/admin.js @@ -30,6 +30,8 @@ const requestController = require('../controllers/GPS.Request') const withdraw = require('../controllers/GPS.Withdraw') const installedDevice = require('../controllers/GPS.InstalledDevice') const device = require('../controllers/GPS.Device') +const award = require('../controllers/GPS.Award') +const awardRequest = require('../controllers/GPS.AwardRequest') /// //////////////////////////////////////////////////////// routes @@ -37,6 +39,17 @@ const device = require('../controllers/GPS.Device') /// ///////////////////////////// GPS +/// ////////////// Award +router.post('/gps/award',hasPermission('gps'), award.createAward) +router.get('/gps/award',hasPermission('gps'), award.findAllAdmin) +router.get('/gps/award/:id',hasPermission('gps'), award.findOne) +router.put('/gps/award/:id',hasPermission('gps'), award.update) + +/// ////////////// Award request +router.get('/gps/award-request',hasPermission('gps'), awardRequest.findAllAdmin) +router.get('/gps/award-request/:id',hasPermission('gps'), awardRequest.findOne) +router.put('/gps/award-request/:id',hasPermission('gps'), awardRequest.update) + /// ////////////// request for access to gps router.get('/gps/request',hasPermission('gps'), requestController.getAllRequest) router.get('/gps/request/:id',hasPermission('gps'), requestController.getOneRequest) @@ -47,14 +60,15 @@ router.get('/gps/withdraw',hasPermission('gps'), withdraw.getAllForAdmin) router.patch('/gps/withdraw/:id/:type',hasPermission('gps'), withdraw.updateReq) /// ////////////// Installed device -router.patch('/register-device/:id/:type', installedDevice.updateInstalled) -router.get('/register-device', installedDevice.getAllForAdmin) +router.patch('/gps/register-device/:id/:type', installedDevice.updateInstalled) +router.get('/gps/register-device', installedDevice.getAllForAdmin) /// ////////////// Device router.post('/gps/device',hasPermission('gps'), device.addCode) router.post('/gps/device/exel',hasPermission('gps'), device.importExel) router.get('/gps/device',hasPermission('gps'), device.getAll) -router.get('/gps/device/:id',hasPermission('gps'), device.getOne) +router.get('/gps/device/imei/:imei',hasPermission('gps'), device.getOneByIMEI) +router.get('/gps/device/id/:id',hasPermission('gps'), device.getOne) router.put('/gps/device/:id',hasPermission('gps'), device.updateDevice) /// ///////////////////////////////////////////////////////// diff --git a/server/routes/auth.js b/server/routes/auth.js index bf7de62..89f31c3 100644 --- a/server/routes/auth.js +++ b/server/routes/auth.js @@ -1,6 +1,11 @@ const { Router } = require('express') const router = Router() const userController = require('../controllers/userController') +const gpsAuthController = require('../controllers/GPS.Auth') + +/// /////////////////// gps routes +router.post('/gps/login', gpsAuthController.login) + /// /////////////////// admin routes // router.post('/register/admin', userController.register_admin) @@ -13,4 +18,6 @@ router.post('/login', userController.webLogin) router.post('/logout', userController.webLogout) router.get('/user', userController.getUser) + + module.exports = router diff --git a/server/routes/gps.js b/server/routes/gps.js index 2f22f1c..af5561a 100644 --- a/server/routes/gps.js +++ b/server/routes/gps.js @@ -4,6 +4,16 @@ const bankAccount = require('../controllers/GPS.BankAccount') const withdraw = require('../controllers/GPS.Withdraw') const installedDevice = require('../controllers/GPS.InstalledDevice') const score = require('../controllers/GPS.Score') +const award = require('../controllers/GPS.Award') +const awardRequest = require('../controllers/GPS.AwardRequest') + + +/// ////////////// Award request +router.post('/award-request', awardRequest.sendRequest) +router.get('/award-request', awardRequest.findAllUser) + +/// ////////////// Award +router.get('/award', award.findAllUser) /// ///////////////// Bank card router.post('/bank-card', bankAccount.addCard) From 648acf59aa26b9240a272686f9696e1dab79c05d Mon Sep 17 00:00:00 2001 From: Mr Swift Date: Sun, 11 Aug 2024 17:12:15 +0330 Subject: [PATCH 26/28] update ws and fix bug --- .../controllers/admin_EventsController.js | 30 ++++++++++++-- server/controllers/GPS.Overview.js | 23 +++++++++++ server/controllers/GPS.Withdraw.js | 34 +++++++++------- server/controllers/userController.js | 39 +++++++------------ server/routes/auth.js | 2 +- server/routes/gps.js | 5 +++ 6 files changed, 90 insertions(+), 43 deletions(-) create mode 100644 server/controllers/GPS.Overview.js diff --git a/server/WebSocket/controllers/admin_EventsController.js b/server/WebSocket/controllers/admin_EventsController.js index 458a01a..da300e8 100644 --- a/server/WebSocket/controllers/admin_EventsController.js +++ b/server/WebSocket/controllers/admin_EventsController.js @@ -7,11 +7,15 @@ const OldPieceRequest = require('../../models/OldPieceRequest') const BufferRequest = require('../../models/BufferRequest') const GuaranteeReport = require('../../models/GuaranteeReport') const Complaint = require('../../models/Complaint') - +const Withdraw = require('../../models/GPS.Withdraw'); +const RequestGPS = require('../../models/GPS.Request') +const AwardRequest = require('../../models/GPS.AwardRequest'); +const InstalledDevice = require('../../models/GPS.InstalledDevice'); module.exports.getAllNotifs = async socket => { try { const allData = await Promise.all([ + // unreadCuMsgs ContactPageMessage.countDocuments({ read: false }), @@ -36,7 +40,19 @@ module.exports.getAllNotifs = async socket => { // newGuaranteeReports GuaranteeReport.countDocuments({ status: 'sent', seen: false }), - Complaint.countDocuments({ read: false }) + Complaint.countDocuments({ read: false }), + + // unread withdraw request + Withdraw.countDocuments({ status: 0 }), + + // unread GPS request + RequestGPS.countDocuments({ status: 0 }), + + // unread award request + AwardRequest.countDocuments({ status: 0 }), + + // unread install device request + InstalledDevice.countDocuments({ status: 0 }) ]) const unreadCuMsgs = allData[0] @@ -48,6 +64,10 @@ module.exports.getAllNotifs = async socket => { const newBufferRequests = allData[6] const newGuaranteeReports = allData[7] const newComplaintReports = allData[8] + const newWithdrawRequest = allData[9] + const newGpsRequest = allData[10] + const newAwardRequest = allData[11] + const newInstallDeviceRequest = allData[12] socket.emit(`admin:allNotifs`, { @@ -59,7 +79,11 @@ module.exports.getAllNotifs = async socket => { newOldPieceRequests, newBufferRequests, newGuaranteeReports, - newComplaintReports + newComplaintReports, + newWithdrawRequest, + newGpsRequest, + newAwardRequest, + newInstallDeviceRequest }) } catch (e) { console.log(e) diff --git a/server/controllers/GPS.Overview.js b/server/controllers/GPS.Overview.js new file mode 100644 index 0000000..225c675 --- /dev/null +++ b/server/controllers/GPS.Overview.js @@ -0,0 +1,23 @@ +const User = require('../models/User'); +const InstalledDevice = require('../models/GPS.InstalledDevice'); +const Withdraw = require('../models/GPS.Withdraw'); + + +module.exports.mainPage = async(req, res)=>{ + const device = await InstalledDevice.countDocuments({userId:req.user_id}) + const user = await User.findById(req.user_id).select('walletBalance dollarBalance score') + res.status(200).json({installedDevice:device, user}) +} + +module.exports.walletPage = async(req, res)=>{ + const withdraw = await Withdraw.findOne({userId: req.user_id, status:0}) + const user = await User.findById(req.user_id).select('walletBalance dollarBalance score') + let pending; + + if(withdraw){ + pending = true + }else{ + pending = false + } + res.status(200).json({user, pending }) +} \ No newline at end of file diff --git a/server/controllers/GPS.Withdraw.js b/server/controllers/GPS.Withdraw.js index fa31818..35d9480 100644 --- a/server/controllers/GPS.Withdraw.js +++ b/server/controllers/GPS.Withdraw.js @@ -12,20 +12,26 @@ module.exports.createRequest = [ checkValidations(validationResult), async (req, res) => { try { - const user = await User.findById(req.user_id) - const data = { - card: req.body.card, - userId: req.user_id, - amount: user.walletBalance, - dollarAmount: user.dollarBalance, - status: 0 - } - - const request = await Withdraw.create(data) - user.dollarBalance = 0; - user.walletBalance = 0; - user.save() - res.status(201).json({ msg: _sr.fa.response.success_save, data: request }) + const withdraw = await Withdraw.findOne({userId: req.user_id, status:0}) + if(withdraw){ + res.status(400).json({ msg: 'شما درخواست درحال بررسی دارید' }) + }else{ + const user = await User.findById(req.user_id) + const data = { + card: req.body.card, + userId: req.user_id, + amount: user.walletBalance, + dollarAmount: user.dollarBalance, + status: 0 + } + + const request = await Withdraw.create(data) + user.dollarBalance = 0; + user.walletBalance = 0; + user.save() + res.status(201).json({ msg: _sr.fa.response.success_save, data: request }) + } + } catch (error) { res.status(500).json({ msg: error }) diff --git a/server/controllers/userController.js b/server/controllers/userController.js index 5e04ce3..1cb7ac9 100644 --- a/server/controllers/userController.js +++ b/server/controllers/userController.js @@ -24,7 +24,18 @@ const { generateRandomDigits } = require('../plugins/controllersHelperFunctions') const _faSr = _sr.fa - +const transporter = nodemailer.createTransport({ + host: 'smtp.c1.liara.email', + port: 587, + secure: false, // true for 465, false for other ports + auth: { + user: 'awesome_bell_ncc1hi', + pass: '509f8938-db95-4b8d-83e7-9ea8eccfd28b' + }, + tls: { + rejectUnauthorized: false + } +}) /// ///////////////////////////////////////////////////////////////// verify account functions function sendConfirmationEmail(userId) { return new Promise(async (resolve, reject) => { @@ -38,18 +49,7 @@ function sendConfirmationEmail(userId) { /// //// email configs // const hostURL = 'www.asan-service.com' - const transporter = nodemailer.createTransport({ - host: 'smtp.c1.liara.email', - port: 587, - secure: false, // true for 465, false for other ports - auth: { - user: 'awesome_bell_ncc1hi', - pass: '509f8938-db95-4b8d-83e7-9ea8eccfd28b' - }, - tls: { - rejectUnauthorized: false - } - }) + const emailHTMLTemplate = `

@@ -687,18 +687,7 @@ module.exports.generate_reset_user_password_link = [ const hostURL = 'www.asan-service.com' if (type === 'email') { - const transporter = nodemailer.createTransport({ - host: 'mail.asan-service.com', - port: 587, - secure: false, // true for 465, false for other ports - auth: { - user: 'resetpassword@asan-service.com', - pass: '3e9atXQV+7a&' - }, - tls: { - rejectUnauthorized: false - } - }) + const emailHTMLTemplate = `
diff --git a/server/routes/auth.js b/server/routes/auth.js index 89f31c3..83c1eb5 100644 --- a/server/routes/auth.js +++ b/server/routes/auth.js @@ -7,7 +7,7 @@ const gpsAuthController = require('../controllers/GPS.Auth') router.post('/gps/login', gpsAuthController.login) -/// /////////////////// admin routes +/// /////////////////// // router.post('/register/admin', userController.register_admin) router.post('/register/user', userController.register_user) // router.post('/activation/:key', userController.activation) diff --git a/server/routes/gps.js b/server/routes/gps.js index af5561a..47dbe98 100644 --- a/server/routes/gps.js +++ b/server/routes/gps.js @@ -6,6 +6,11 @@ const installedDevice = require('../controllers/GPS.InstalledDevice') const score = require('../controllers/GPS.Score') const award = require('../controllers/GPS.Award') const awardRequest = require('../controllers/GPS.AwardRequest') +const overview = require('../controllers/GPS.Overview') + +/// /////////////// Overview page +router.get('/overview/main', overview.mainPage) +router.get('/overview/wallet', overview.walletPage) /// ////////////// Award request From 9769e2cf6368837a6dd69f6233bf9687c72f9fc3 Mon Sep 17 00:00:00 2001 From: Mr Swift Date: Sun, 11 Aug 2024 18:26:18 +0330 Subject: [PATCH 27/28] set error handler --- server/constants.js | 10 ++++++ server/errorHandler.js | 73 ++++++++++++++++++++++++++++++++++++++++++ server/index.js | 2 ++ 3 files changed, 85 insertions(+) create mode 100644 server/constants.js create mode 100644 server/errorHandler.js diff --git a/server/constants.js b/server/constants.js new file mode 100644 index 0000000..6ba4bcb --- /dev/null +++ b/server/constants.js @@ -0,0 +1,10 @@ +exports.constants = { + VALIDATION_ERROR: 400, + UNAUTHORIZED: 401, + FORBIDOEN: 403, + NOT_FOUND: 404, + SERVER_ERROR: 500, + SITE_UNAUTHORIZED: 422, + TOO_MANY: 429, + Method_Not_Allowed:405 +}; diff --git a/server/errorHandler.js b/server/errorHandler.js new file mode 100644 index 0000000..5d52dd0 --- /dev/null +++ b/server/errorHandler.js @@ -0,0 +1,73 @@ +const { constants } = require("./constants"); +const errorHandler = (err, req, res, next) => { + const statusCode = res.statusCode ? res.statusCode : 500; + + switch (statusCode) { + case constants.VALIDATION_ERROR: + res.status(statusCode).json({ + title: "Validation Failed ", + msg: err.message, + stackTrace: err.stack, + }); + break; + case constants.Method_Not_Allowed: + res.status(statusCode).json({ + title: "Method Not Allowed ", + msg: err.message, + stackTrace: err.stack, + }); + break; + case constants.NOT_FOUND: + res.status(statusCode).json({ + title: "Not found ", + msg: err.message, + stackTrace: err.stack, + }); + break; + case constants.FORBIDOEN: + res.status(statusCode).json({ + title: "Forbidoen ", + msg: err.message, + stackTrace: err.stack, + }); + break; + case constants.SERVER_ERROR: + res.status(statusCode).json({ + title: "Server Error ", + msg: err.message, + stackTrace: err.stack, + }); + break; + case constants.UNAUTHORIZED: + res.status(statusCode).json({ + title: "Unauthorized ", + msg: err.message, + stackTrace: err.stack, + }); + break; + case constants.SITE_UNAUTHORIZED: + res.status(statusCode).json({ + title: "Site Unauthorized ", + msg: err.message, + stackTrace: err.stack, + }); + break; + case constants.TOO_MANY: + res.status(statusCode).json({ + title: "Too many request", + msg: err.message, + stackTrace: err.stack, + }); + break; + default: + console.log(err); + res.status(500).json({ + title: "Unhandled error", + msg: err.message, + stackTrace: err.stack + }); + break; + } +}; + +module.exports = { name: "errorHandler", run: errorHandler }; diff --git a/server/index.js b/server/index.js index 11edb15..6e0dd63 100644 --- a/server/index.js +++ b/server/index.js @@ -1,5 +1,6 @@ /// / develop environment config const { isDev, isProduction, DevServerPort } = require('./_env') +const errorHandler = require('./errorHandler') const wss = require('./WebSocket/wss') /// / init express app (wrapping all functions into init() to prevent running in development mode by nuxt dev mode) function init() { @@ -53,6 +54,7 @@ function init() { app.use(isDev ? '/api' : '', router) + app.use(errorHandler.run) return app } From ad04de7832a900a85458452eada42129fcddd0c3 Mon Sep 17 00:00:00 2001 From: Mr Swift Date: Sun, 11 Aug 2024 18:50:30 +0330 Subject: [PATCH 28/28] Fix Bug | relocate data | set basic filter --- server/controllers/GPS.InstalledDevice.js | 25 +++++++++++++++++++---- server/controllers/GPS.Score.js | 10 ++++++++- server/controllers/GPS.Withdraw.js | 11 +++++++++- server/models/GPS.InstalledDevice.js | 1 + server/models/GPS.Score.js | 1 + 5 files changed, 42 insertions(+), 6 deletions(-) diff --git a/server/controllers/GPS.InstalledDevice.js b/server/controllers/GPS.InstalledDevice.js index bd8dca5..57b2118 100644 --- a/server/controllers/GPS.InstalledDevice.js +++ b/server/controllers/GPS.InstalledDevice.js @@ -24,7 +24,8 @@ module.exports.deviceRegistration = [ deviceId: device.id, status: 0, registerDate: new Date(), - userId: req.user_id + userId: req.user_id, + IMEI: req.body.IMEI } const newRequest = await InstalledDevice.create(data); device.status = 1; @@ -53,7 +54,16 @@ module.exports.getAllForUser = async (req, res) => { page = req.query.page page = page * rows - rows } - const data = await InstalledDevice.find({ userId: req.user_id }).skip(page).limit(rows).sort({ created_at: -1 }).populate('deviceId') + + const search = req.query?.search ? req.query.search : "" + + + const data = await InstalledDevice.find({ + userId: req.user_id, + $or: [ + { IMEI: { $regex: search, $options: 'i' } }, + ], + }).skip(page).limit(rows).sort({ created_at: -1 }).populate('deviceId') const total = Math.ceil((await InstalledDevice.countDocuments({ userId: req.user_id }))) res.status(200).json({ data, total }) @@ -78,7 +88,13 @@ module.exports.getAllForAdmin = async (req, res) => { page = req.query.page page = page * rows - rows } - const data = await InstalledDevice.find({}).sort({ status: 1 }).skip(page).limit(rows) + const search = req.query?.search ? req.query.search : "" + + const data = await InstalledDevice.find({ + $or: [ + { IMEI: { $regex: search, $options: 'i' } }, + ] + }).sort({ status: 1 }).skip(page).limit(rows) .populate('deviceId') .populate('userId', 'shopName shopNumber shopAddress birthDate score first_name last_name profilePic') const total = Math.ceil((await InstalledDevice.estimatedDocumentCount())) @@ -108,12 +124,13 @@ module.exports.updateInstalled = [ device.status = 1; - user.walletBalance = device.profit + user.walletBalance = device.profit user.dollarBalance = device.dollarProfit user.score = device.score await Score.create({ + title:"ثبت دستگاه", deviceId: device.id, score: device.score, userId: installedDevice.userId diff --git a/server/controllers/GPS.Score.js b/server/controllers/GPS.Score.js index e1a882e..ff9e2f5 100644 --- a/server/controllers/GPS.Score.js +++ b/server/controllers/GPS.Score.js @@ -24,8 +24,16 @@ module.exports.getAll = async (req, res) => { page = req.query.page page = page * rows - rows } + const search = req.query?.search ? req.query.search : "" - const score = await Score.find({ userId: req.user_id }).skip(page).limit(rows); + + const score = await Score.find({ + userId: req.user_id, + $or: [ + { title: { $regex: search, $options: 'i' } }, + { score: { $regex: search, $options: 'i' } }, + ], + }).skip(page).limit(rows); const total = Math.ceil((await Score.countDocuments({ userId: req.user_id }))) const user = await User.findById(req.user_id).select('score') diff --git a/server/controllers/GPS.Withdraw.js b/server/controllers/GPS.Withdraw.js index 35d9480..5271ef5 100644 --- a/server/controllers/GPS.Withdraw.js +++ b/server/controllers/GPS.Withdraw.js @@ -58,8 +58,17 @@ module.exports.getAllForUser = async (req, res) => { page = req.query.page page = page * rows - rows } + const search = req.query?.search ? req.query.search : "" - const data = await Withdraw.find({ userId: req.user_id }).skip(page).limit(rows).sort({ created_at: -1 }); + + const data = await Withdraw.find({ + userId: req.user_id, + $or: [ + { amount: { $regex: search, $options: 'i' } }, + { dollarAmount: { $regex: search, $options: 'i' } }, + { trackingNumber: { $regex: search, $options: 'i' } }, + ], + }).skip(page).limit(rows).sort({ created_at: -1 }); const total = Math.ceil((await Withdraw.countDocuments({ userId: req.user_id }))) res.status(201).json({ data, total }) } diff --git a/server/models/GPS.InstalledDevice.js b/server/models/GPS.InstalledDevice.js index fc1d0f8..583964b 100644 --- a/server/models/GPS.InstalledDevice.js +++ b/server/models/GPS.InstalledDevice.js @@ -5,6 +5,7 @@ const InstalledDeviceSchema = mongoose.Schema({ type: String, ref: "Device" }, + IMEI:String, status: { type: Number, enum: [ diff --git a/server/models/GPS.Score.js b/server/models/GPS.Score.js index 47b02ac..5e40807 100644 --- a/server/models/GPS.Score.js +++ b/server/models/GPS.Score.js @@ -5,6 +5,7 @@ const ScoreSchema = mongoose.Schema({ type: String, ref: 'Device' }, + title:String, score: { type: Number, min: 0