Merge pull request #6 from Danakcorp/Gps

Gps mearge
This commit is contained in:
Mr Swift
2024-08-11 18:51:24 +03:30
committed by GitHub
41 changed files with 1745 additions and 260 deletions
-42
View File
@@ -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": []
}'
+70 -3
View File
@@ -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
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": []
}'
BIN
View File
Binary file not shown.
+4 -3
View File
@@ -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"
}
+1
View File
@@ -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": {
@@ -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)
+2 -1
View File
@@ -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
+22 -3
View File
@@ -25,13 +25,31 @@ 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) {
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('err1')
const decoded = jwt.verify(token.replace(/^Bearer\s/, ''), authentication.secretKey)
if (!decoded) throw new Error('err2')
const user = await User.findById(decoded._id)
if (!user || !user.scope.includes('gps')) throw new Error('err3')
req.user_id = decoded._id
return next()
@@ -54,6 +72,7 @@ const authentication = {
req.user_id = decoded._id
return next()
} catch (err) {
return res401(res, 'unauthorized')
}
},
+10
View File
@@ -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
};
+64
View File
@@ -0,0 +1,64 @@
const bcrypt = require('bcryptjs')
const jwt = require('jsonwebtoken')
const { body, 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(_sr.fa.not_found.password)
const passwordMatch = await bcrypt.compare(password, user.password)
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('شما به این بخش دسترسی ندارید')
}
user.token = token
await user.save()
return res.status(200).json({ token })
} catch (err) {
return res.status(422).json({
validation: { username: { msg: err.message } }
})
}
}
]
+84
View File
@@ -0,0 +1,84 @@
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().withMessage(_sr.fa.required.field),
],
checkValidations(validationResult),
async (req, res) => {
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
})
}
]
module.exports.findAllUser = async (req, res) => {
const toDay = new Date()
const data = await Award.find({expireDate: {$gt: 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().withMessage(_sr.fa.required.field),
],
checkValidations(validationResult),
async (req, res) => {
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 })
} else {
data.score = score;
data.title = title;
data.desc = desc;
data.expireDate = new Date(expireDate)
data.save()
res.status(200).json({
msg: _sr.fa.response.success_save,
data
})
}
}
]
+93
View File
@@ -0,0 +1,93 @@
const { body, param, validationResult } = require('express-validator')
const { _sr } = require('../plugins/serverResponses')
const { checkValidations } = require('../plugins/controllersHelperFunctions')
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
}
)
res.status(200).json({ msg: _sr.fa.response.success_save })
}
}
]
+70
View File
@@ -0,0 +1,70 @@
const { body, param, validationResult } = require('express-validator')
const { _sr } = require('../plugins/serverResponses')
const { checkValidations } = require('../plugins/controllersHelperFunctions')
const User = require('../models/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 })
}
}
]
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 }
}
},
{ new:true }
).select('id cardBank')
res.status(200).json({ msg: "با موفقیت حذف شد ", data: userData })
}
]
+171
View File
@@ -0,0 +1,171 @@
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, 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 })
}
]
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 })
} catch (error) {
console.log(error);
res500(res, error)
}
}
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 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 })
}
]
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 })
}
]
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 {
console.warn("Wrong IMEI ", row[0])
}
}
resolve("end")
})
}
+160
View File
@@ -0,0 +1,160 @@
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');
const Score = require('../models/GPS.Score');
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) {
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()
res.status(201).json({ msg: _sr.fa.response.success_save, data: newRequest })
}
}
]
module.exports.getAllForUser = async (req, res) => {
let page;
let rows;
if (!req.query?.rows || req.query?.rows <= 5) {
rows = 10
} else {
rows = parseInt(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 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 })
}
module.exports.getAllForAdmin = async (req, res) => {
let page;
let rows;
if (!req.query?.rows || req.query?.rows <= 5) {
rows = 10
} else {
rows = parseInt(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 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()))
res.status(200).json({ data, total })
}
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;
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()
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;
}
}
}
}
]
+23
View File
@@ -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 })
}
+139
View File
@@ -0,0 +1,139 @@
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) => {
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 })
}
]
module.exports.getOneRequest = [
[
param('id').notEmpty().isMongoId().withMessage('این ایدی اشتباه است')
],
checkValidations(validationResult),
async (req, res) => {
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)
}
]
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 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": {
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;
}
}
]
+41
View File
@@ -0,0 +1,41 @@
// 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 || req.query?.rows <= 5) {
rows = 10
} else {
rows = parseInt(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 search = req.query?.search ? req.query.search : ""
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')
res.status(200).json({ data: score, score: user.score, total })
}
+134
View File
@@ -0,0 +1,134 @@
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');
module.exports.createRequest = [
[
body('card').notEmpty().isObject().withMessage('گارت ورودی خود را انتخاب کنید'),
],
checkValidations(validationResult),
async (req, res) => {
try {
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 })
}
}
]
module.exports.getAllForUser = async (req, res) => {
let page;
let rows;
if (!req.query?.rows || req.query?.rows <= 5) {
rows = 10
} else {
rows = parseInt(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 search = req.query?.search ? req.query.search : ""
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 })
}
module.exports.getAllForAdmin = async (req, res) => {
let page;
let rows;
if (!req.query?.rows || req.query?.rows <= 5) {
rows = 10
} else {
rows = parseInt(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 })
}
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;
}
}
}
}
]
+189 -199
View File
@@ -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 = `
<div style="direction: rtl;background-color: #065495;overflow: hidden;">
@@ -250,7 +250,7 @@ module.exports.delete_admin = [
module.exports.permissions = [
(req, res) => {
return res.json(permissions)
return res.status(200).json(permissions)
}
]
@@ -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 = `
<div style="direction: rtl;background-color: #065495;overflow: hidden;">
@@ -1238,179 +1227,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 +1411,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
+2 -1
View File
@@ -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,
+73
View File
@@ -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 };
+4
View File
@@ -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() {
@@ -36,6 +37,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,12 +47,14 @@ 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)
app.use(isDev ? '/api' : '', router)
app.use(errorHandler.run)
return app
}
+12
View File
@@ -0,0 +1,12 @@
const mongoose = require('mongoose')
const AwairdSchema = mongoose.Schema({
score:Number,
title:String,
desc:String,
expireDate:Date
})
module.exports = mongoose.model('AwardGPS', AwairdSchema)
+24
View File
@@ -0,0 +1,24 @@
const mongoose = require('mongoose')
const AwardRequestSchema = mongoose.Schema({
awardId:{
type:mongoose.Types.ObjectId,
ref:'AwardGPS'
},
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)
+42
View File
@@ -0,0 +1,42 @@
const mongoose = require('mongoose')
const deviceSchema = mongoose.Schema({
model: String,
IMEI: {
type: String,
unique: [true, "این ایدی در سامانه موجود است"]
},
tomanPrice: {
type: Number,
min: 0,
default: 0
},
dollarProfit: {
type: Number,
min: 0,
default: 0
},
profit: {
type: Number,
min: 0,
default: 0
},
score: {
type: Number,
min: 0
},
renewalProfit: {
type: Number,
min: 0
},
status: {
type: Number,
enum: [
0, // not installed
1 // installed
],
default: 0
}
})
module.exports = mongoose.model('Device', deviceSchema)
+26
View File
@@ -0,0 +1,26 @@
const mongoose = require('mongoose')
const InstalledDeviceSchema = mongoose.Schema({
deviceId: {
type: String,
ref: "Device"
},
IMEI:String,
status: {
type: Number,
enum: [
0, // Pending
1, // Accepted
2, // Rejected
],
default: 0
},
registerDate: Date,
installationDate: Date,
userId: {
type: String,
ref: 'User'
},
})
module.exports = mongoose.model('InstalledDevice', InstalledDeviceSchema)
+33
View File
@@ -0,0 +1,33 @@
const mongoose = require('mongoose')
const RenewalSchema = mongoose.Schema({
deviceId: {
type: String,
ref: 'Device'
},
renewDate: Date,
renewType: {
type: String,
},
price: {
type: Number,
min: 0
},
profit: {
type: Number,
min: 0,
unique: true,
default: 0,
required: true
},
dollarProfit: {
type: Number,
min: 0
},
userId: {
type: String,
ref: 'User'
},
})
module.exports = mongoose.model('Renewal', RenewalSchema)
+23
View File
@@ -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)
+19
View File
@@ -0,0 +1,19 @@
const mongoose = require('mongoose')
const ScoreSchema = mongoose.Schema({
deviceId: {
type: String,
ref: 'Device'
},
title:String,
score: {
type: Number,
min: 0
},
userId: {
type: String,
ref: 'User'
},
})
module.exports = mongoose.model('Score', ScoreSchema)
+41
View File
@@ -0,0 +1,41 @@
const mongoose = require('mongoose')
const BankSchema = mongoose.Schema({
holderName: String,
PAN: {
type: Number,
},
IBAN: {
type: String,
}
})
/// /////////////////////////////////////////////////////
const WithdrawSchema = mongoose.Schema({
card: BankSchema,
amount: {
type: Number,
min: 0
},
dollarAmount: {
type: Number,
min: 0
},
userId: {
type: String,
ref: 'User'
},
status: {
type: Number,
enum: [
0, // Pending
1, // Accepted
2, // deposited
]
},
depositDate: Date,
trackingNumber: String
})
module.exports = mongoose.model('Withdraw', WithdrawSchema)
+39
View File
@@ -1,5 +1,16 @@
const mongoose = require('mongoose')
const BankSchema = mongoose.Schema({
holderName:String,
PAN:{
type:Number,
},
IBAN:{
type:String,
}
})
const UserSchema = mongoose.Schema({
// for admins
_creator: { type: mongoose.ObjectId, ref: 'User' },
@@ -7,6 +18,7 @@ const UserSchema = mongoose.Schema({
username: String,
permissions: Array,
personalCode:String,
// for user
national_code: String,
province_id: String,
@@ -42,6 +54,33 @@ const UserSchema = mongoose.Schema({
last_name: String,
password: String,
// for GPS
profilePic:{
type:String,
default:"noPic"
},
shopName:String,
shopNumber:String,
shopAddress:String,
birthDate:String,
walletBalance:{
type:Number,
min:0,
default:0
},
dollarBalance:{
type:Number,
min:0,
default:0
},
score:{
type:Number,
min:0,
default:0
},
cardBank:[BankSchema],
/// //////////////////////////////// user confirmations
confirmed: { type: Boolean, default: false },
email_confirmed: { type: Boolean, default: false },
@@ -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'
+3 -1
View File
@@ -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 })
}
+4
View File
@@ -114,5 +114,9 @@ module.exports = [
{
name: 'برند ها',
value: 'brands'
},
{
name: 'جی پی اس',
value: 'gps'
}
]
+3 -1
View File
@@ -16,6 +16,7 @@ module.exports._sr = {
company_name: 'درصورتی که شخص حقوقی هستید، نام کمپانی را وارد کنید',
username: 'نام کاربری را وارد کنید',
phone_number: 'شماره تماس را وارد کنید',
store_number: 'شماره تماس مغازه را وارد کنید',
password: 'پسورد را وارد کنید',
birthdate: 'تاریخ تولد را وارد کنید',
// addressing validations
@@ -107,7 +108,8 @@ module.exports._sr = {
email: 'این ایمیل از قبل وجود دارد',
name: 'نام تکراری است',
title: 'عنوان تکراری است',
phone_number: 'این شماره تماس از قبل وجود دارد'
phone_number: 'این شماره تماس از قبل وجود دارد',
IMEI:'این IMEI تکراری است'
},
response: {
logged_in: 'شما وارد سیستم شدید',
+43
View File
@@ -26,9 +26,52 @@ 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')
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
/// ///////////////////////////// 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)
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)
/// ////////////// Installed device
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/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)
/// /////////////////////////////////////////////////////////
/// ///////////// survey
router.get('/surveys',hasPermission('surveys'), surveyController.getAllForAdmin)
router.get('/surveys/:id',hasPermission('surveys'), surveyController.getOneForAdmin)
-1
View File
@@ -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
+8 -1
View File
@@ -1,8 +1,13 @@
const { Router } = require('express')
const router = Router()
const userController = require('../controllers/userController')
const gpsAuthController = require('../controllers/GPS.Auth')
/// /////////////////// admin routes
/// /////////////////// gps routes
router.post('/gps/login', gpsAuthController.login)
/// ///////////////////
// router.post('/register/admin', userController.register_admin)
router.post('/register/user', userController.register_user)
// router.post('/activation/:key', userController.activation)
@@ -13,4 +18,6 @@ router.post('/login', userController.webLogin)
router.post('/logout', userController.webLogout)
router.get('/user', userController.getUser)
module.exports = router
+38
View File
@@ -0,0 +1,38 @@
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')
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
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)
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)
/// //////////////// Installed device
router.post('/register-device', installedDevice.deviceRegistration)
router.get('/register-device', installedDevice.getAllForUser)
/// ///////////////// Score
router.get('/score', score.getAll)
module.exports = router
+4
View File
@@ -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)