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'); 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) } ] 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) } } module.exports.getAll = [ async (req, res) => { const data = await Device.find().sort({ created_at: -1 }) res.status(200).json(data) } ] module.exports.downloadAll = [ 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 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) } } ] 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 = [ [ 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) { // 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) } }) }