diff --git a/bun.lockb b/bun.lockb new file mode 100644 index 0000000..55c24e2 Binary files /dev/null and b/bun.lockb differ diff --git a/server/authentication.js b/server/authentication.js index 922f3ef..1289045 100644 --- a/server/authentication.js +++ b/server/authentication.js @@ -25,18 +25,17 @@ const authentication = { async isAdmin(req, res, next) { try { const token = req.headers?.authorization - if (!token) throw new Error('err') + if (!token) throw new Error('err1') const decoded = jwt.verify(token.replace(/^Bearer\s/, ''), authentication.secretKey) - if (!decoded) throw new Error('err') + if (!decoded) throw new Error('err2') const user = await User.findById(decoded._id) - if (!user || !user.scope.includes('admin')) throw new Error('err') + if (!user || !user.scope.includes('admin')) throw new Error('err3') req.user_id = decoded._id return next() } catch (err) { - console.log(err) return res401(res, 'unauthorized') } }, @@ -44,13 +43,13 @@ const authentication = { async isGPS(req, res, next) { try { const token = req.headers?.authorization - if (!token) throw new Error('err') + if (!token) throw new Error('err1') const decoded = jwt.verify(token.replace(/^Bearer\s/, ''), authentication.secretKey) - if (!decoded) throw new Error('err') + if (!decoded) throw new Error('err2') const user = await User.findById(decoded._id) - if (!user || !user.scope.includes('gps')) throw new Error('err') + if (!user || !user.scope.includes('gps')) throw new Error('err3') req.user_id = decoded._id return next() diff --git a/server/controllers/GPS.Auth.js b/server/controllers/GPS.Auth.js index 1763745..16b1e3b 100644 --- a/server/controllers/GPS.Auth.js +++ b/server/controllers/GPS.Auth.js @@ -43,21 +43,21 @@ module.exports.login = [ const user = await User.findOne({ $or: [{ email: username.toLowerCase().trim() }, { national_code: username }, { username }] }) - if (!user) throw new Error('err') + if (!user) throw new Error(_sr.fa.not_found.password) const passwordMatch = await bcrypt.compare(password, user.password) - if (!passwordMatch) throw new Error('err') + if (!passwordMatch) throw new Error(_sr.fa.not_found.password) 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') + throw new Error('شما به این بخش دسترسی ندارید') } 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 } } + validation: { username: { msg: err.message } } }) } } diff --git a/server/controllers/GPS.Award.js b/server/controllers/GPS.Award.js index 3bbc34b..54c83b5 100644 --- a/server/controllers/GPS.Award.js +++ b/server/controllers/GPS.Award.js @@ -9,12 +9,13 @@ 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), + body('expireDate').notEmpty().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 }) + 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)