From 0d8ba394b1887cac718a5daeff31e336270869df Mon Sep 17 00:00:00 2001 From: mahyargdz Date: Sun, 22 Dec 2024 17:21:40 +0330 Subject: [PATCH] feat: add route to update and add cardbank and fix --- server/controllers/GPS.BankAccount.js | 148 ++-- server/controllers/GPS.Device.js | 356 +++++---- server/controllers/GPS.InstalledDevice.js | 317 ++++---- server/controllers/GPS.User.js | 879 ++++++++++------------ server/plugins/serverResponses.js | 3 +- server/routes/gps.js | 4 +- 6 files changed, 827 insertions(+), 880 deletions(-) diff --git a/server/controllers/GPS.BankAccount.js b/server/controllers/GPS.BankAccount.js index 80354af..1926401 100644 --- a/server/controllers/GPS.BankAccount.js +++ b/server/controllers/GPS.BankAccount.js @@ -4,69 +4,101 @@ const { checkValidations } = require('../plugins/controllersHelperFunctions') const User = require('../models/GPS.User') module.exports.addCard = [ - [ - body('holderName').notEmpty().isString().withMessage(_sr.fa.required.name), - body('PAN').notEmpty().isInt().withMessage(_sr.fa.required.store_number), - body('IBAN').notEmpty().isIBAN().withMessage(_sr.fa.required.address) - ], - checkValidations(validationResult), - async (req, res) => { - 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 }) - - } + [ + body('holderName').notEmpty().isString().withMessage(_sr.fa.required.name), + body('PAN').notEmpty().isInt().withMessage(_sr.fa.required.store_number), + body('IBAN').notEmpty().isLength({ min: 24, max: 24 }).withMessage(_sr.fa.required.iban) + ], + checkValidations(validationResult), + async (req, res) => { + 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 }) } + } ] - module.exports.getAll = [ - async (req, res) => { - const userData = await User.findById(req.user_id).select('id cardBank') - res.status(200).json(userData) - } + async (req, res) => { + const userData = await User.findById(req.user_id).select('id cardBank') + res.status(200).json(userData) + } +] +module.exports.getOne = [ + async (req, res) => { + const userCart = await User.findOne({ _id: req.user_id, 'cardBank._id': req.params.id }).select('id cardBank') + console.log(userCart) + res.status(200).json({ userCart: userCart.cardBank[0] }) + } ] +module.exports.updateCard = [ + [ + param('id').notEmpty().isMongoId().withMessage('این ایدی اشتباه می باشد'), + body('holderName').notEmpty().isString().withMessage(_sr.fa.required.name), + body('PAN').notEmpty().isInt().withMessage(_sr.fa.required.store_number), + body('IBAN').notEmpty().isLength({ min: 24, max: 24 }).withMessage(_sr.fa.required.iban) + ], + checkValidations(validationResult), + async (req, res) => { + try { + const { holderName, PAN, IBAN } = req.body + const userData = await User.findOneAndUpdate( + { _id: req.user_id, 'cardBank._id': req.params.id }, + { + $set: { + 'cardBank.$.holderName': holderName, + 'cardBank.$.PAN': PAN, + 'cardBank.$.IBAN': IBAN + } + }, + { new: true } + ).select('id cardBank') + res.status(200).json(userData) + } catch (error) { + res.status(500).json({ msg: error.message }) + } + } +] 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 } - } - }, - { new:true } - ).select('id cardBank') - // res.status(200).json({ msg: "با موفقیت حذف شد ", data: userData }) - res.status(200).json(userData) - - } -] \ No newline at end of file + [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 } + } + }, + { new: true } + ).select('id cardBank') + // res.status(200).json({ msg: "با موفقیت حذف شد ", data: userData }) + res.status(200).json(userData) + } +] diff --git a/server/controllers/GPS.Device.js b/server/controllers/GPS.Device.js index df41f2f..b0feb29 100644 --- a/server/controllers/GPS.Device.js +++ b/server/controllers/GPS.Device.js @@ -1,212 +1,204 @@ const readXlsxFile = require('read-excel-file/node') -const { body, param, validationResult } = require('express-validator'); -const xlsx = require("json-as-xlsx") -const { _sr } = require('../plugins/serverResponses'); -const { checkValidations, res500 } = require('../plugins/controllersHelperFunctions'); -const Device = require('../models/GPS.Device'); +const { body, param, validationResult } = require('express-validator') +const xlsx = require('json-as-xlsx') +const { _sr } = require('../plugins/serverResponses') +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().trim().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 }) - res.status(201).json(data) - - } + [ + body('model').notEmpty().isString().withMessage(_sr.fa.required.name), + 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) + } 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 }) + res.status(201).json(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(Buffer.from(file.data)); - const data = await creator(exelFile) - // res.status(201).json({ msg: _sr.fa.response.success_save, data }) - res.status(201).json(data) - - - - } catch (error) { - console.log(error); - res500(res, error) - } + 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(Buffer.from(file.data)) + const data = await creator(exelFile) + // res.status(201).json({ msg: _sr.fa.response.success_save, data }) + res.status(201).json(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) - } + async (req, res) => { + const data = await Device.find().sort({ created_at: -1 }) + res.status(200).json(data) + } ] module.exports.downloadAll = [ - async (req, res) => { + async (req, res) => { + const device = await Device.find().sort({ created_at: -1 }) + const data = [ + { + sheet: 'device', + columns: [ + { label: 'IMEI', value: 'IMEI' }, + { label: 'مدل', value: 'model' }, + { label: 'قیمت به تومان', value: 'tomanPrice' }, + { label: 'سود به دلار', value: 'dollarProfit' }, + { label: 'سود به تومان', value: 'profit' }, + { label: 'امتیاز', value: 'score' }, + { label: 'سود از تمدید', value: 'renewalProfit' }, + { label: 'وضعیت نصب', value: 'status' } + ], + content: device + } + ] - const device = await Device.find().sort({ created_at: -1 }) - const data = [ - { - sheet: "device", - columns: [ - { label: "IMEI", value: "IMEI" }, - { label: "مدل", value: "model" }, - { label: "قیمت به تومان", value: "tomanPrice" }, - { label: "سود به دلار", value: "dollarProfit" }, - { label: "سود به تومان", value: "profit" }, - { label: "امتیاز", value: "score" }, - { label: "سود از تمدید", value: "renewalProfit" }, - { label: "وضعیت نصب", value: "status" }, - ], - content: device, - } - ] - - const settings = { - writeOptions: { - type: "buffer", - bookType: "csv", - }, - RTL: true - } - setTimeout(() => { - const buffer = xlsx(data, settings) - res.writeHead(200, { - "Content-Type": "application/octet-stream", - "Content-disposition": "attachment; filename=device.csv", - }) - res.end(buffer) - }, 2000); + const settings = { + writeOptions: { + type: 'buffer', + bookType: 'csv' + }, + RTL: true } + setTimeout(() => { + const buffer = xlsx(data, settings) + res.writeHead(200, { + 'Content-Type': 'application/octet-stream', + 'Content-disposition': 'attachment; filename=device.csv' + }) + res.end(buffer) + }, 2000) + } ] 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) - } - + [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.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) - } - + [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 = [ - [ - 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 }) - res.status(200).json(data) - - } + [ + 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 }) + res.status(200).json(data) + } ] +const creator = exel => { + return new Promise(async (resolve, reject) => { + try { + for (const row of exel) { + console.log(row) + // eslint-disable-next-line no-constant-condition + if (/^[0-9]{15}$/gm.test(row?.[0]?.toString()?.trim())) { + const device = await Device.findOne({ IMEI: row?.[0]?.toString()?.trim() }) + if (device) { + console.info('Repeated IMEI ', row[0]) -const creator = (exel) => { - return new Promise(async (resolve, reject) => { - try { - for (const row of exel) { - // eslint-disable-next-line no-constant-condition - if (/^[0-9]{15}$/gm.test(row[0].toString().trim())) { - const device = await Device.findOne({ IMEI: row[0].trim() }) - if (device) { - console.info("Repeated IMEI ", row[0]) - - device.model = row[1] - device.tomanPrice = row[2] - device.dollarProfit = row[3] || 1 - device.profit = row[4] || 1 - device.score = row[5] || 1 - device.renewalProfit = row[6] || 1 - device.save() - } else { - await Device.create( - { - IMEI: row[0].trim(), - 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") - } catch (error) { - reject(error.message) + device.model = row[1] + device.tomanPrice = row[2] + device.dollarProfit = row[3] || 1 + device.profit = row[4] || 1 + device.score = row[5] || 1 + device.renewalProfit = row[6] || 1 + device.save() + } else { + await Device.create({ + IMEI: row[0].toString().trim(), + 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') + } catch (error) { + reject(error.message) + } + }) } - diff --git a/server/controllers/GPS.InstalledDevice.js b/server/controllers/GPS.InstalledDevice.js index 83191e8..85e0876 100644 --- a/server/controllers/GPS.InstalledDevice.js +++ b/server/controllers/GPS.InstalledDevice.js @@ -1,201 +1,184 @@ -const { body, param, validationResult } = require('express-validator'); -const { checkValidations } = require('../plugins/controllersHelperFunctions'); -const User = require('../models/GPS.User'); -const InstalledDevice = require('../models/GPS.InstalledDevice'); -const Device = require('../models/GPS.Device'); -const Score = require('../models/GPS.Score'); -const { _sr } = require('../plugins/serverResponses'); +const { body, param, validationResult } = require('express-validator') +const { checkValidations } = require('../plugins/controllersHelperFunctions') +const User = require('../models/GPS.User') +const InstalledDevice = require('../models/GPS.InstalledDevice') +const Device = require('../models/GPS.Device') +const Score = require('../models/GPS.Score') +const { _sr } = require('../plugins/serverResponses') const { notifyAdmin } = require('../WebSocket/controllers/admin_EventsController') module.exports.deviceRegistration = [ - [ - body('IMEI').notEmpty().isString().withMessage('لطفا IMEI را وارد یا تصحیح کنید') - ], - checkValidations(validationResult), - async (req, res) => { - const device = await Device.findOne({ IMEI: req.body.IMEI }); - if (!device) { - throw res.status(404).json({ msg: 'این IMEI وجود ندارد' }) - // eslint-disable-next-line eqeqeq - } else if (device.status == 1 || device.status == 0) { - throw res.status(404).json({ msg: 'این IMEI قبلا ثبت شده' }) + [body('IMEI').notEmpty().isString().withMessage('لطفا IMEI را وارد یا تصحیح کنید')], + checkValidations(validationResult), + async (req, res) => { + const device = await Device.findOne({ 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, + IMEI: req.body.IMEI + } + const newRequest = await InstalledDevice.create(data) + device.status = 1 + device.save() + notifyAdmin('newInstallDeviceRequest') - } else { - const data = { - deviceId: device.id, - status: 0, - registerDate: new Date(), - userId: req.user_id, - IMEI: req.body.IMEI - } - const newRequest = await InstalledDevice.create(data); - device.status = 1; - device.save() - notifyAdmin('newInstallDeviceRequest') - - // res.status(201).json({ msg: _sr.fa.response.success_save, data: newRequest }) - res.status(201).json(newRequest) - - } + // res.status(201).json({ msg: _sr.fa.response.success_save, data: newRequest }) + res.status(201).json(newRequest) } + } ] - module.exports.getAllForUser = async (req, res) => { - let page; - let rows; + let page + let rows - if (!req.query?.rows || req.query?.rows <= 5) { - rows = 10; - } else { - rows = parseInt(req.query.rows); - } + if (!req.query?.rows || req.query?.rows <= 5) { + rows = 10 + } else { + rows = parseInt(req.query.rows) + } - if (!req.query?.page || req.query.page <= 1) { - page = 0; - } else { - page = (req.query.page - 1) * rows; - } + if (!req.query?.page || req.query.page <= 1) { + page = 0 + } else { + page = (req.query.page - 1) * rows + } - const search = req.query?.search || null; + const search = req.query?.search || null - let sort = {}; + let sort = {} - if (req.query?.deviceId_dollarProfit) { - sort.dollarProfit = parseInt(req.query.deviceId_dollarProfit); - } - if (req.query?.status) { - sort.status = parseInt(req.query.status); - } - if (req.query?.registerDate) { - sort.registerDate = parseInt(req.query.registerDate); - } + if (req.query?.deviceId_dollarProfit) { + sort.dollarProfit = parseInt(req.query.deviceId_dollarProfit) + } + if (req.query?.status) { + sort.status = parseInt(req.query.status) + } + if (req.query?.registerDate) { + sort.registerDate = parseInt(req.query.registerDate) + } - if (Object.keys(sort).length === 0) { - sort = { 'created_at': -1 }; - } + if (Object.keys(sort).length === 0) { + sort = { created_at: -1 } + } - const filter = { - userId: req.user_id, - }; + const filter = { + userId: req.user_id + } - if (search) { - filter.$or = [ - { IMEI: { $regex: search, $options: 'i' } }, - ]; - } + if (search) { + filter.$or = [{ IMEI: { $regex: search, $options: 'i' } }] + } - try { - const data = await InstalledDevice.find(filter) - .skip(page) - .limit(rows) - .sort(sort) - .populate('deviceId'); + try { + const data = await InstalledDevice.find(filter).skip(page).limit(rows).sort(sort).populate('deviceId') - const total = await InstalledDevice.countDocuments(filter); + const total = await InstalledDevice.countDocuments(filter) - res.status(200).json({ data, total }); - } catch (error) { - res.status(500).json({ message: 'An error occurred', error }); - } -}; + res.status(200).json({ data, total }) + } catch (error) { + res.status(500).json({ message: 'An error occurred', error }) + } +} module.exports.getAllForAdmin = async (req, res) => { - try { - // const page = parseInt(req.query.page) || 1; - // const rows = parseInt(req.query.rows) || 10; - // const search = req.query.search || ""; - // const sortField = req.query.sortField || "status"; - // const sortOrder = req.query.sortOrder === "desc" ? -1 : 1; + try { + // const page = parseInt(req.query.page) || 1; + // const rows = parseInt(req.query.rows) || 10; + // const search = req.query.search || ""; + // const sortField = req.query.sortField || "status"; + // const sortOrder = req.query.sortOrder === "desc" ? -1 : 1; - // const skip = (page - 1) * rows; + // const skip = (page - 1) * rows; - // const filter = {}; - // if (search) { - // filter.$or = [ - // { IMEI: new RegExp(search, 'i') }, - // { 'userId.shopName': new RegExp(search, 'i') }, - // { 'userId.national_code': new RegExp(search, 'i') }, - // ]; - // } + // const filter = {}; + // if (search) { + // filter.$or = [ + // { IMEI: new RegExp(search, 'i') }, + // { 'userId.shopName': new RegExp(search, 'i') }, + // { 'userId.national_code': new RegExp(search, 'i') }, + // ]; + // } - const data = await InstalledDevice.find() - // .sort({ [sortField]: sortOrder }) - .populate('deviceId') - .populate('userId', 'shopName national_code first_name last_name mobile_number city_name province_name') - // .skip(skip) - // .limit(rows); - - // const totalDocuments = await InstalledDevice.countDocuments(filter); - // const totalPages = Math.ceil(totalDocuments / rows); - - res.status(200).json({ data }); - } catch (error) { - console.error('Error:', error.message); - res.status(500).json({ message: "Server Error", error: error.message }); - } -}; + const data = await InstalledDevice.find() + // .sort({ [sortField]: sortOrder }) + .populate('deviceId') + .populate('userId', 'shopName national_code first_name last_name mobile_number city_name province_name') + // .skip(skip) + // .limit(rows); + // const totalDocuments = await InstalledDevice.countDocuments(filter); + // const totalPages = Math.ceil(totalDocuments / rows); + res.status(200).json({ data }) + } catch (error) { + console.error('Error:', error.message) + res.status(500).json({ message: 'Server Error', error: error.message }) + } +} 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).select('walletBalance dollarBalance score') - const device = await Device.findById(installedDevice.deviceId) - switch (req.params.type) { - case "accept": { - installedDevice.status = 1; - installedDevice.installationDate = new Date(); - device.status = 1; + [ + 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).select('walletBalance dollarBalance score') + const device = await Device.findById(installedDevice.deviceId) + switch (req.params.type) { + case 'accept': { + installedDevice.status = 1 + installedDevice.installationDate = new Date() + device.status = 1 - user.walletBalance += device.profit - user.dollarBalance += device.dollarProfit - user.score += device.score + 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 + }) + user.save() + device.save() + installedDevice.save() + notifyAdmin('newInstallDeviceRequest') - await Score.create({ - title: "ثبت دستگاه", - deviceId: device.id, - score: device.score, - userId: installedDevice.userId - }) - user.save() - device.save() - installedDevice.save() - notifyAdmin('newInstallDeviceRequest') + res.status(201).json({ msg: _sr.fa.response.success_save, data: installedDevice }) - 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() - notifyAdmin('newInstallDeviceRequest') - - res.status(201).json({ msg: _sr.fa.response.success_save, data: installedDevice }) - - - break; - } - default: { - res.status(404).json({ msg: "وضعیت اشتباه است" }) - break; - } - } + break } - } -] + case 'reject': { + installedDevice.status = 2 + installedDevice.save() + device.status = 0 + device.save() + notifyAdmin('newInstallDeviceRequest') + res.status(201).json({ msg: _sr.fa.response.success_save, data: installedDevice }) + + break + } + default: { + res.status(404).json({ msg: 'وضعیت اشتباه است' }) + break + } + } + } + } +] diff --git a/server/controllers/GPS.User.js b/server/controllers/GPS.User.js index 7cda92d..c1bcfdc 100644 --- a/server/controllers/GPS.User.js +++ b/server/controllers/GPS.User.js @@ -6,555 +6,494 @@ const User = require('../models/GPS.User') const { _sr } = require('../plugins/serverResponses') const { SMS } = require('../plugins/SMS_Module') const { - res500, - checkValidations, - removeWhiteSpaces, - checkMobileNumber, - normalizeMobileNumber, - nameOptimizer, - checkNationalCode, - isPersian, - generateRandomDigits + res500, + checkValidations, + removeWhiteSpaces, + checkMobileNumber, + normalizeMobileNumber, + nameOptimizer, + checkNationalCode, + isPersian, + generateRandomDigits } = require('../plugins/controllersHelperFunctions') const _faSr = _sr.fa const { notifyAdmin } = require('../WebSocket/controllers/admin_EventsController') - - function sendConfirmationSMS(userId) { - return new Promise(async (resolve, reject) => { - try { - const user = await User.findById(userId) - if (!user) throw new Error('invalid id') + return new Promise(async (resolve, reject) => { + try { + const user = await User.findById(userId) + if (!user) throw new Error('invalid id') - const mobileKey = generateRandomDigits(6) - user.otp = mobileKey - await user.save() + const mobileKey = generateRandomDigits(6) + user.otp = mobileKey + await user.save() - const smsMsg = [ - 'این شماره در وبسایت آسان سرویس ثبت گردیده.', - ' کد تایید شماره همراه: ', - mobileKey - ] + const smsMsg = ['این شماره در وبسایت آسان سرویس ثبت گردیده.', ' کد تایید شماره همراه: ', mobileKey] - await SMS([user.mobile_number], smsMsg.join('')) + await SMS([user.mobile_number], smsMsg.join('')) - resolve() - } catch (err) { - reject(err) - } - }) + resolve() + } catch (err) { + reject(err) + } + }) } module.exports.register_user = [ - [ - body('first_name') - .notEmpty() - .withMessage(_faSr.required.first_name) - .bail() - .isLength({ min: 2 }) - .withMessage(_faSr.min_char.min2) - .bail() - .custom((value, { req }) => { - if (removeWhiteSpaces(value).length < 2) return Promise.reject(_faSr.min_char.min2) - if (!isPersian(value)) return Promise.reject(new Error('لطفا با حروف فارسی تایپ کنید')) - else return true - }), + [ + body('first_name') + .notEmpty() + .withMessage(_faSr.required.first_name) + .bail() + .isLength({ min: 2 }) + .withMessage(_faSr.min_char.min2) + .bail() + .custom((value, { req }) => { + if (removeWhiteSpaces(value).length < 2) return Promise.reject(_faSr.min_char.min2) + if (!isPersian(value)) return Promise.reject(new Error('لطفا با حروف فارسی تایپ کنید')) + else return true + }), - body('last_name') - .notEmpty() - .withMessage(_faSr.required.first_name) - .bail() - .isLength({ min: 2 }) - .withMessage(_faSr.min_char.min2) - .bail() - .custom((value, { req }) => { - if (removeWhiteSpaces(value).length < 2) return Promise.reject(_faSr.min_char.min2) - if (!isPersian(value)) return Promise.reject(new Error('لطفا با حروف فارسی تایپ کنید')) - else return true - }), + body('last_name') + .notEmpty() + .withMessage(_faSr.required.first_name) + .bail() + .isLength({ min: 2 }) + .withMessage(_faSr.min_char.min2) + .bail() + .custom((value, { req }) => { + if (removeWhiteSpaces(value).length < 2) return Promise.reject(_faSr.min_char.min2) + if (!isPersian(value)) return Promise.reject(new Error('لطفا با حروف فارسی تایپ کنید')) + else return true + }), - body('national_code') - .notEmpty() - .withMessage(_faSr.required.national_code) - .bail() - .custom((value, { req }) => { - if (checkNationalCode(value)) return true - else return Promise.reject(_faSr.format.national_code) - }) - .bail() - .custom((value, { req }) => { - const nationalCode = value.trim() - return User.findOne({ national_code: nationalCode }).then(user => { - if (user && user.national_code === nationalCode) - return Promise.reject(new Error('کاربر با این کد ملی از قبل وجود دارد')) - else return true - }) - }), + body('national_code') + .notEmpty() + .withMessage(_faSr.required.national_code) + .bail() + .custom((value, { req }) => { + if (checkNationalCode(value)) return true + else return Promise.reject(_faSr.format.national_code) + }) + .bail() + .custom((value, { req }) => { + const nationalCode = value.trim() + return User.findOne({ national_code: nationalCode }).then(user => { + if (user && user.national_code === nationalCode) + return Promise.reject(new Error('کاربر با این کد ملی از قبل وجود دارد')) + else return true + }) + }), - body('province_name').notEmpty().withMessage(_faSr.required.province), + body('province_name').notEmpty().withMessage(_faSr.required.province), - body('city_name').notEmpty().withMessage(_faSr.required.city), + body('city_name').notEmpty().withMessage(_faSr.required.city), - body('shopName') - .notEmpty() - .withMessage(_faSr.required.address), + body('shopName').notEmpty().withMessage(_faSr.required.address), + body('mobile_number') + .notEmpty() + .withMessage(_faSr.required.phone_number) + .bail() + .custom((value, { req }) => { + const mobileNStatus = checkMobileNumber(value) + if (!mobileNStatus) return Promise.reject(_faSr.format.phone_number) + else return Promise.resolve() + }) + .bail() + .custom((value, { req }) => { + const mobileNumber = value.trim() + return User.findOne({ mobile_number: mobileNumber }).then(user => { + if (user && user.mobile_number === mobileNumber) + return Promise.reject(new Error('کاربر با این شماره موبایل از قبل وجود دارد')) + else return true + }) + }), - body('mobile_number') - .notEmpty() - .withMessage(_faSr.required.phone_number) - .bail() - .custom((value, { req }) => { - const mobileNStatus = checkMobileNumber(value) - if (!mobileNStatus) return Promise.reject(_faSr.format.phone_number) - else return Promise.resolve() - }) - .bail() - .custom((value, { req }) => { - const mobileNumber = value.trim() - return User.findOne({ mobile_number: mobileNumber }).then(user => { - if (user && user.mobile_number === mobileNumber) - return Promise.reject(new Error('کاربر با این شماره موبایل از قبل وجود دارد')) - else return true - }) - }), + body('password') + .isLength({ min: 4 }) + .withMessage(_faSr.min_char.min4) + .custom((value, { req }) => { + if (value === req.body.password_confirmation) return true + else return Promise.reject(_faSr.response.passwords_not_match) + }) + ], + checkValidations(validationResult), + async (req, res) => { + try { + const provinceId = uid.v4() + const cityId = uid.v4() - body('password') - .isLength({ min: 4 }) - .withMessage(_faSr.min_char.min4) - .custom((value, { req }) => { - if (value === req.body.password_confirmation) return true - else return Promise.reject(_faSr.response.passwords_not_match) - }) - ], - checkValidations(validationResult), - async (req, res) => { - try { - const provinceId = uid.v4() - const cityId = uid.v4() + const { first_name, last_name, national_code, province_name, city_name, mobile_number, password, shopName } = + req.body - const { - first_name, - last_name, - national_code, - province_name, - city_name, - mobile_number, - password, - shopName - } = req.body + const data = { + last_name, + province_name: { id: provinceId, provinceName: province_name }, + city_name: { id: cityId, cityName: city_name }, + shopName + } + data.first_name = nameOptimizer(first_name) + data.national_code = national_code.trim() + data.mobile_number = normalizeMobileNumber(mobile_number) - const data = { - last_name, - province_name:{id:provinceId,provinceName:province_name}, - city_name:{id:cityId,cityName:city_name}, - shopName - } - data.first_name = nameOptimizer(first_name) - data.national_code = national_code.trim() - data.mobile_number = normalizeMobileNumber(mobile_number) + // hash user password and done + const salt = await bcrypt.genSalt(10) + const hash = await bcrypt.hash(password, salt) + data.password = hash + const user = new User(data) + await user.save() + notifyAdmin('pendingUsers') - // hash user password and done - const salt = await bcrypt.genSalt(10) - const hash = await bcrypt.hash(password, salt) - data.password = hash - - const user = new User(data) - await user.save() - notifyAdmin('pendingUsers') - - return res.json({ message: _faSr.response.success_save }) - } catch (err) { - const registerFailurMsg = 'مشکلی در ثبت نام پیش آمده، لطفا مجددا تلاش کنید' - res500(res, registerFailurMsg) - } + return res.json({ message: _faSr.response.success_save }) + } catch (err) { + const registerFailurMsg = 'مشکلی در ثبت نام پیش آمده، لطفا مجددا تلاش کنید' + res500(res, registerFailurMsg) } + } ] - module.exports.update_user = [ - [ - body('first_name') - .notEmpty() - .withMessage(_faSr.required.first_name) - .bail() - .isLength({ min: 2 }) - .withMessage(_faSr.min_char.min2) - .bail() - .custom((value, { req }) => { - if (removeWhiteSpaces(value).length < 2) return Promise.reject(_faSr.min_char.min2) - if (!isPersian(value)) return Promise.reject(new Error('لطفا با حروف فارسی تایپ کنید')) - else return true - }), + [ + body('first_name') + .notEmpty() + .withMessage(_faSr.required.first_name) + .bail() + .isLength({ min: 2 }) + .withMessage(_faSr.min_char.min2) + .bail() + .custom((value, { req }) => { + if (removeWhiteSpaces(value).length < 2) return Promise.reject(_faSr.min_char.min2) + if (!isPersian(value)) return Promise.reject(new Error('لطفا با حروف فارسی تایپ کنید')) + else return true + }), - body('last_name') - .notEmpty() - .withMessage(_faSr.required.first_name) - .bail() - .isLength({ min: 2 }) - .withMessage(_faSr.min_char.min2) - .bail() - .custom((value, { req }) => { - if (removeWhiteSpaces(value).length < 2) return Promise.reject(_faSr.min_char.min2) - if (!isPersian(value)) return Promise.reject(new Error('لطفا با حروف فارسی تایپ کنید')) - else return true - }), - body('province_name').notEmpty().withMessage(_faSr.required.province), + body('last_name') + .notEmpty() + .withMessage(_faSr.required.first_name) + .bail() + .isLength({ min: 2 }) + .withMessage(_faSr.min_char.min2) + .bail() + .custom((value, { req }) => { + if (removeWhiteSpaces(value).length < 2) return Promise.reject(_faSr.min_char.min2) + if (!isPersian(value)) return Promise.reject(new Error('لطفا با حروف فارسی تایپ کنید')) + else return true + }), + body('province_name').notEmpty().withMessage(_faSr.required.province), - body('city_name').notEmpty().withMessage(_faSr.required.city), + body('city_name').notEmpty().withMessage(_faSr.required.city), - body('shopName') - .notEmpty() - .withMessage(_faSr.required.field), - body('address') - .notEmpty() - .withMessage(_faSr.required.address), + body('shopName').notEmpty().withMessage(_faSr.required.field), + body('address').notEmpty().withMessage(_faSr.required.address), - body('cell_number') - .notEmpty() - .withMessage(_faSr.required.address), + body('cell_number').notEmpty().withMessage(_faSr.required.address), - body('birthDate') - .notEmpty() - .withMessage(_faSr.required.address), - ], - checkValidations(validationResult), - async (req, res) => { - try { - const { - first_name, - last_name, - province_name, - city_name, - shopName, - birthDate, - address, - cell_number - } = req.body + body('birthDate').notEmpty().withMessage(_faSr.required.address) + ], + checkValidations(validationResult), + async (req, res) => { + try { + const { first_name, last_name, province_name, city_name, shopName, birthDate, address, cell_number } = req.body - const data = { - last_name, - province_name, - city_name, - shopName, - birthDate, - address, - cell_number - } - if (req.files?.image) { - const image = req.files?.image - const fileName = 'profile' + Date.now() + '.' + image.name - await image.mv(`./static/uploads/images/${fileName}`) - data.profilePic = `/uploads/images/${fileName}` - } - data.first_name = nameOptimizer(first_name) - await User.findByIdAndUpdate( - req.params.id, - data - ) - const user = await User.findById(req.params.id) - return res.json({ message: _faSr.response.success_save ,user }) - } catch (err) { - const registerFailurMsg = 'مشکلی در به روز رسانی پیش آمده، لطفا مجددا تلاش کنید' - throw new Error(registerFailurMsg) - } + const data = { + last_name, + province_name, + city_name, + shopName, + birthDate, + address, + cell_number + } + if (req.files?.image) { + const image = req.files?.image + const fileName = 'profile' + Date.now() + '.' + image.name + await image.mv(`./static/uploads/images/${fileName}`) + data.profilePic = `/uploads/images/${fileName}` + } + data.first_name = nameOptimizer(first_name) + await User.findByIdAndUpdate(req.params.id, data) + const user = await User.findById(req.params.id) + return res.json({ message: _faSr.response.success_save, user }) + } catch (err) { + const registerFailurMsg = 'مشکلی در به روز رسانی پیش آمده، لطفا مجددا تلاش کنید' + throw new Error(registerFailurMsg) } + } ] module.exports.update_user_password = [ - [ - body('newPassword') - .isLength({ min: 4 }) - .withMessage(_faSr.min_char.min4) - .custom((value, { req }) => { - if (value === req.body.password_confirmation) return true - else return Promise.reject(_faSr.response.passwords_not_match) - }), - body('password') - .isLength({ min: 4 }) - .withMessage(_faSr.min_char.min4) - ], - checkValidations(validationResult), - async (req, res) => { - try { - const { password, newPassword } = req.body - const { user_id } = req - const salt = await bcrypt.genSalt(10) - const hash = await bcrypt.hash(newPassword, salt) - const user = await User.findById(user_id) - if (!user) { - res.status(404) - throw new Error(_faSr.not_found.user_id) - } - const passwordMatch = await bcrypt.compare(password, user.password) - if (!passwordMatch) { - res.status(401) - throw new Error('err') - } - user.password = hash - await user.save() - return res.json({ message: _faSr.response.success_save }) - } catch (err) { - throw new Error(err.message) - } + [ + body('newPassword') + .isLength({ min: 4 }) + .withMessage(_faSr.min_char.min4) + .custom((value, { req }) => { + if (value === req.body.password_confirmation) return true + else return Promise.reject(_faSr.response.passwords_not_match) + }), + body('password').isLength({ min: 4 }).withMessage(_faSr.min_char.min4) + ], + checkValidations(validationResult), + async (req, res) => { + try { + const { password, newPassword } = req.body + const { user_id } = req + const salt = await bcrypt.genSalt(10) + const hash = await bcrypt.hash(newPassword, salt) + const user = await User.findById(user_id) + if (!user) { + res.status(404) + throw new Error(_faSr.not_found.user_id) + } + const passwordMatch = await bcrypt.compare(password, user.password) + if (!passwordMatch) { + res.status(401) + throw new Error('err') + } + user.password = hash + await user.save() + return res.json({ message: _faSr.response.success_save }) + } catch (err) { + throw new Error(err.message) } + } ] module.exports.send_otp = [ - [ - body('mobile_number') - .notEmpty() - .withMessage(_faSr.required.phone_number) - ], - checkValidations(validationResult), - async (req, res) => { - try { - const { mobile_number } = req.body - const user = await User.findOne({ mobile_number }) - if (!user) { - res.status(404) - throw new Error(_sr.fa.not_found.user_id) - } - await sendConfirmationSMS(user.id) - res.status(200).json({ msg: "ok" }) - } catch (err) { - throw new Error(err.message) - } + [body('mobile_number').notEmpty().withMessage(_faSr.required.phone_number)], + checkValidations(validationResult), + async (req, res) => { + try { + const { mobile_number } = req.body + const user = await User.findOne({ mobile_number }) + if (!user) { + res.status(404) + throw new Error(_sr.fa.not_found.user_id) + } + await sendConfirmationSMS(user.id) + res.status(200).json({ msg: 'ok' }) + } catch (err) { + throw new Error(err.message) } + } ] module.exports.check_otp = [ - [ - body('mobile_number') - .notEmpty() - .withMessage(_faSr.required.phone_number), - body('otp') - .notEmpty() - .withMessage(_faSr.required.phone_number) - ], - checkValidations(validationResult), - async (req, res) => { - try { - const { mobile_number, otp } = req.body - const user = await User.findOne({ mobile_number }) - if (!user) throw new Error(_sr.fa.not_found.user_id) - if (user.otp !== otp) throw new Error("کد اشتباه است") - if (user.otp === otp) res.status(200).json({ msg: "ok" }) - } catch (err) { - throw new Error(err.message) - } + [ + body('mobile_number').notEmpty().withMessage(_faSr.required.phone_number), + body('otp').notEmpty().withMessage(_faSr.required.phone_number) + ], + checkValidations(validationResult), + async (req, res) => { + try { + const { mobile_number, otp } = req.body + const user = await User.findOne({ mobile_number }) + if (!user) throw new Error(_sr.fa.not_found.user_id) + if (user.otp !== otp) throw new Error('کد اشتباه است') + if (user.otp === otp) res.status(200).json({ msg: 'ok' }) + } catch (err) { + throw new Error(err.message) } + } ] module.exports.resetpass_otp = [ - [ - body('mobile_number') - .notEmpty() - .withMessage(_faSr.required.phone_number), - body('otp') - .notEmpty() - .withMessage(_faSr.required.phone_number), - body('password') - .isLength({ min: 4 }) - .withMessage(_faSr.min_char.min4) - .custom((value, { req }) => { - if (value === req.body?.password_confirmation) return true - else return Promise.reject(_faSr.response.passwords_not_match) - }) - ], - checkValidations(validationResult), - async (req, res) => { - try { - const { mobile_number, otp, password } = req.body - const salt = await bcrypt.genSalt(10) - const hash = await bcrypt.hash(password, salt) - const user = await User.findOne({ mobile_number }) - if (!user) throw new Error(_sr.fa.not_found.user_id) - if (user.otp !== otp) throw new Error("کد اشتباه است") - if (user.otp === otp) { - user.password = hash - user.otp = generateRandomDigits(6) - user.save() - res.status(200).json({ msg: _sr.fa.response.success_save }) - } - } catch (err) { - throw new Error(err.message) - } + [ + body('mobile_number').notEmpty().withMessage(_faSr.required.phone_number), + body('otp').notEmpty().withMessage(_faSr.required.phone_number), + body('password') + .isLength({ min: 4 }) + .withMessage(_faSr.min_char.min4) + .custom((value, { req }) => { + if (value === req.body?.password_confirmation) return true + else return Promise.reject(_faSr.response.passwords_not_match) + }) + ], + checkValidations(validationResult), + async (req, res) => { + try { + const { mobile_number, otp, password } = req.body + const salt = await bcrypt.genSalt(10) + const hash = await bcrypt.hash(password, salt) + const user = await User.findOne({ mobile_number }) + if (!user) throw new Error(_sr.fa.not_found.user_id) + if (user.otp !== otp) throw new Error('کد اشتباه است') + if (user.otp === otp) { + user.password = hash + user.otp = generateRandomDigits(6) + user.save() + res.status(200).json({ msg: _sr.fa.response.success_save }) + } + } catch (err) { + throw new Error(err.message) } + } ] module.exports.getCurrent = async (req, res) => { - const user = await User.findById(req.user_id).select('-password -token -otp -seenByAdmin') - if (!user || !user.active) return res.ststus(404).json({ msg: _sr.fa.not_found.user_id }) - else return res.status(200).json({user}) + const user = await User.findById(req.user_id).select('-password -token -otp -seenByAdmin') + if (!user || !user.active) return res.ststus(404).json({ msg: _sr.fa.not_found.user_id }) + else return res.status(200).json({ user }) } module.exports.getUsersForAdmin = async (req, res) => { - const user = await User.find({}).sort({ active: 1, created_at: -1 }).select('-password -token -otp -seenByAdmin -cardBank') - res.status(200).json(user) + const user = await User.find({}) + .sort({ active: 1, created_at: -1 }) + .select('-password -token -otp -seenByAdmin -cardBank') + res.status(200).json(user) } module.exports.getPendingUsersForAdmin = async (req, res) => { - const user = await User.find({ active: false }).sort({ active: 1, created_at: -1 }).select('-password -token -otp -seenByAdmin -cardBank') - res.status(200).json(user) + const user = await User.find({ active: false }) + .sort({ active: 1, created_at: -1 }) + .select('-password -token -otp -seenByAdmin -cardBank') + res.status(200).json(user) } module.exports.getUserForAdmin = async (req, res) => { - const user = await User.findById(req.params.id).select('-password -token -otp -seenByAdmin') - if (!user) { - return res.status(404).json({ msg: _sr.fa.not_found.user_id }) - } else { - user.seenByAdmin = true - user.save() - res.status(200).json(user) - } + const user = await User.findById(req.params.id).select('-password -token -otp -seenByAdmin') + if (!user) { + return res.status(404).json({ msg: _sr.fa.not_found.user_id }) + } else { + user.seenByAdmin = true + user.save() + res.status(200).json(user) + } } module.exports.activeUser = [ - [ - param('status').notEmpty().isBoolean().withMessage('این استاتوس اشتباه است'), - param('id').notEmpty().isMongoId().withMessage('این ایدی اشتباه است') - ], - checkValidations(validationResult), - async (req, res) => { - const data = await User.findByIdAndUpdate(req.params.id, - { - active: req.params.status - }, - { new: true }).select('-password -token -otp -seenByAdmin') - if (!data) return res.status(404).json({ msg: _sr.fa.not_found.user_id }) + [ + param('status').notEmpty().isBoolean().withMessage('این استاتوس اشتباه است'), + param('id').notEmpty().isMongoId().withMessage('این ایدی اشتباه است') + ], + checkValidations(validationResult), + async (req, res) => { + const data = await User.findByIdAndUpdate( + req.params.id, + { + active: req.params.status + }, + { new: true } + ).select('-password -token -otp -seenByAdmin') + if (!data) return res.status(404).json({ msg: _sr.fa.not_found.user_id }) - notifyAdmin('pendingUsers') + notifyAdmin('pendingUsers') - res.status(200).json(data) - - } + res.status(200).json(data) + } ] module.exports.addUserByAdmin = [ - [ - body('first_name') - .notEmpty() - .withMessage(_faSr.required.first_name) - .bail() - .isLength({ min: 2 }) - .withMessage(_faSr.min_char.min2) - .bail() - .custom((value, { req }) => { - if (removeWhiteSpaces(value).length < 2) return Promise.reject(_faSr.min_char.min2) - if (!isPersian(value)) return Promise.reject(new Error('لطفا با حروف فارسی تایپ کنید')) - else return true - }), + [ + body('first_name') + .notEmpty() + .withMessage(_faSr.required.first_name) + .bail() + .isLength({ min: 2 }) + .withMessage(_faSr.min_char.min2) + .bail() + .custom((value, { req }) => { + if (removeWhiteSpaces(value).length < 2) return Promise.reject(_faSr.min_char.min2) + if (!isPersian(value)) return Promise.reject(new Error('لطفا با حروف فارسی تایپ کنید')) + else return true + }), - body('last_name') - .notEmpty() - .withMessage(_faSr.required.first_name) - .bail() - .isLength({ min: 2 }) - .withMessage(_faSr.min_char.min2) - .bail() - .custom((value, { req }) => { - if (removeWhiteSpaces(value).length < 2) return Promise.reject(_faSr.min_char.min2) - if (!isPersian(value)) return Promise.reject(new Error('لطفا با حروف فارسی تایپ کنید')) - else return true - }), + body('last_name') + .notEmpty() + .withMessage(_faSr.required.first_name) + .bail() + .isLength({ min: 2 }) + .withMessage(_faSr.min_char.min2) + .bail() + .custom((value, { req }) => { + if (removeWhiteSpaces(value).length < 2) return Promise.reject(_faSr.min_char.min2) + if (!isPersian(value)) return Promise.reject(new Error('لطفا با حروف فارسی تایپ کنید')) + else return true + }), - body('national_code') - .notEmpty() - .withMessage(_faSr.required.national_code) - .bail() - .custom((value, { req }) => { - if (checkNationalCode(value)) return true - else return Promise.reject(_faSr.format.national_code) - }) - .bail() - .custom((value, { req }) => { - const nationalCode = value.trim() - return User.findOne({ national_code: nationalCode }).then(user => { - if (user && user.national_code === nationalCode) - return Promise.reject(new Error('کاربر با این کد ملی از قبل وجود دارد')) - else return true - }) - }), + body('national_code') + .notEmpty() + .withMessage(_faSr.required.national_code) + .bail() + .custom((value, { req }) => { + if (checkNationalCode(value)) return true + else return Promise.reject(_faSr.format.national_code) + }) + .bail() + .custom((value, { req }) => { + const nationalCode = value.trim() + return User.findOne({ national_code: nationalCode }).then(user => { + if (user && user.national_code === nationalCode) + return Promise.reject(new Error('کاربر با این کد ملی از قبل وجود دارد')) + else return true + }) + }), - body('province_name').notEmpty().withMessage(_faSr.required.province), + body('province_name').notEmpty().withMessage(_faSr.required.province), - body('city_name').notEmpty().withMessage(_faSr.required.city), + body('city_name').notEmpty().withMessage(_faSr.required.city), - body('shopName') - .notEmpty() - .withMessage(_faSr.required.address), + body('shopName').notEmpty().withMessage(_faSr.required.address), + body('mobile_number') + .notEmpty() + .withMessage(_faSr.required.phone_number) + .bail() + .custom((value, { req }) => { + const mobileNStatus = checkMobileNumber(value) + if (!mobileNStatus) return Promise.reject(_faSr.format.phone_number) + else return Promise.resolve() + }) + .bail() + .custom((value, { req }) => { + const mobileNumber = value.trim() + return User.findOne({ mobile_number: mobileNumber }).then(user => { + if (user && user.mobile_number === mobileNumber) + return Promise.reject(new Error('کاربر با این شماره موبایل از قبل وجود دارد')) + else return true + }) + }), - body('mobile_number') - .notEmpty() - .withMessage(_faSr.required.phone_number) - .bail() - .custom((value, { req }) => { - const mobileNStatus = checkMobileNumber(value) - if (!mobileNStatus) return Promise.reject(_faSr.format.phone_number) - else return Promise.resolve() - }) - .bail() - .custom((value, { req }) => { - const mobileNumber = value.trim() - return User.findOne({ mobile_number: mobileNumber }).then(user => { - if (user && user.mobile_number === mobileNumber) - return Promise.reject(new Error('کاربر با این شماره موبایل از قبل وجود دارد')) - else return true - }) - }), + body('password') + .isLength({ min: 4 }) + .withMessage(_faSr.min_char.min4) + .custom((value, { req }) => { + if (value === req.body.password_confirmation) return true + else return Promise.reject(_faSr.response.passwords_not_match) + }) + ], + checkValidations(validationResult), + async (req, res) => { + try { + const provinceId = uid.v4() + const cityId = uid.v4() - body('password') - .isLength({ min: 4 }) - .withMessage(_faSr.min_char.min4) - .custom((value, { req }) => { - if (value === req.body.password_confirmation) return true - else return Promise.reject(_faSr.response.passwords_not_match) - }) - ], - checkValidations(validationResult), - async (req, res) => { - try { - const provinceId = uid.v4() - const cityId = uid.v4() + const { first_name, last_name, national_code, province_name, city_name, mobile_number, password, shopName } = + req.body - const { - first_name, - last_name, - national_code, - province_name, - city_name, - mobile_number, - password, - shopName - } = req.body + const data = { + last_name, + province_name: { id: provinceId, provinceName: province_name }, + city_name: { id: cityId, cityName: city_name }, + shopName, + active: true + } + data.first_name = nameOptimizer(first_name) + data.national_code = national_code.trim() + data.mobile_number = normalizeMobileNumber(mobile_number) - const data = { - last_name, - province_name:{id:provinceId,provinceName:province_name}, - city_name:{id:cityId,cityName:city_name}, - shopName, - active:true - } - data.first_name = nameOptimizer(first_name) - data.national_code = national_code.trim() - data.mobile_number = normalizeMobileNumber(mobile_number) + // hash user password and done + const salt = await bcrypt.genSalt(10) + const hash = await bcrypt.hash(password, salt) + data.password = hash + const user = new User(data) + await user.save() - // hash user password and done - const salt = await bcrypt.genSalt(10) - const hash = await bcrypt.hash(password, salt) - data.password = hash - - const user = new User(data) - await user.save() - - - return res.status(200).json({ message: _faSr.response.success_save }) - } catch (err) { - const registerFailurMsg = 'مشکلی در ثبت نام پیش آمده، لطفا مجددا تلاش کنید' - res500(res, registerFailurMsg) - } + return res.status(200).json({ message: _faSr.response.success_save }) + } catch (err) { + const registerFailurMsg = 'مشکلی در ثبت نام پیش آمده، لطفا مجددا تلاش کنید' + res500(res, registerFailurMsg) } -] \ No newline at end of file + } +] diff --git a/server/plugins/serverResponses.js b/server/plugins/serverResponses.js index 378de2b..ecd8624 100644 --- a/server/plugins/serverResponses.js +++ b/server/plugins/serverResponses.js @@ -24,6 +24,7 @@ module.exports._sr = { province: 'استان را وارد کنید', city: 'شهر را وارد کنید', address: 'آدرس را وارد کنید', + iban: 'شماره شبا را وارد کنید', postal_code: 'کد پستی را وارد کنید', plaque: 'پلاک را وارد کنید', receiver_first_name: 'نام گیرنده را وارد کنید', @@ -109,7 +110,7 @@ module.exports._sr = { name: 'نام تکراری است', title: 'عنوان تکراری است', phone_number: 'این شماره تماس از قبل وجود دارد', - IMEI:'این IMEI تکراری است' + IMEI: 'این IMEI تکراری است' }, response: { logged_in: 'شما وارد سیستم شدید', diff --git a/server/routes/gps.js b/server/routes/gps.js index 184e649..1afcfca 100644 --- a/server/routes/gps.js +++ b/server/routes/gps.js @@ -17,7 +17,6 @@ router.get('/renew', renewal.findAllUser) router.get('/notif/:id', notif.setSeen) router.get('/notif', notif.setSeenAll) - /// /////////////// User router.get('/user/me', userGPS.getCurrent) router.put('/user/me/:id', userGPS.update_user) @@ -28,7 +27,6 @@ router.post('/user/reset-pass', userGPS.update_user_password) router.get('/overview/main', overview.mainPage) router.get('/overview/wallet', overview.walletPage) - /// ////////////// Award request router.post('/award-request', awardRequest.sendRequest) router.get('/award-request', awardRequest.findAllUser) @@ -39,6 +37,8 @@ router.get('/award', award.findAllUser) /// ///////////////// Bank card router.post('/bank-card', bankAccount.addCard) router.get('/bank-card', bankAccount.getAll) +router.get('/bank-card/:id', bankAccount.getOne) +router.put('/bank-card/:id', bankAccount.updateCard) router.delete('/bank-card/:id', bankAccount.deleteCard) /// ///////////////// Withdraw request router.post('/withdraw', withdraw.createRequest)