@@ -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": []
|
|
||||||
}'
|
|
||||||
@@ -7,14 +7,81 @@ jobs:
|
|||||||
deploy:
|
deploy:
|
||||||
runs-on: ubuntu-latest
|
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:
|
steps:
|
||||||
- uses: actions/checkout@v3
|
- uses: actions/checkout@v3
|
||||||
- uses: actions/setup-node@v3
|
- uses: actions/setup-node@v3
|
||||||
with:
|
with:
|
||||||
node-version: "18"
|
node-version: "18"
|
||||||
|
- name: Set up environment
|
||||||
|
run: |
|
||||||
|
echo "COMMIT_MESSAGE=$(echo '${{ github.event.head_commit.message }}' | jq -aRs .)" >> $GITHUB_ENV
|
||||||
- name: update-liara
|
- name: update-liara
|
||||||
env:
|
|
||||||
LIARA_TOKEN: eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VySUQiOiI2NGVkY2ZmYWJiODUyOWZmNWFmOTU3YmEiLCJpYXQiOjE3MjAyNzUyNDB9.WNsgMX03tD1rZaceKRgjQ_MCffvW8oOQ7CnT_NdYP30
|
|
||||||
run: |
|
run: |
|
||||||
npm i -g @liara/cli@5
|
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": []
|
||||||
|
}'
|
||||||
Generated
+4
-3
@@ -38,6 +38,7 @@
|
|||||||
"nuxt-leaflet": "^0.0.27",
|
"nuxt-leaflet": "^0.0.27",
|
||||||
"read-excel-file": "^5.2.2",
|
"read-excel-file": "^5.2.2",
|
||||||
"socket.io": "^4.4.1",
|
"socket.io": "^4.4.1",
|
||||||
|
"validator": "^13.12.0",
|
||||||
"vue-persian-datetime-picker": "^2.10.3"
|
"vue-persian-datetime-picker": "^2.10.3"
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
@@ -20668,9 +20669,9 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/validator": {
|
"node_modules/validator": {
|
||||||
"version": "13.11.0",
|
"version": "13.12.0",
|
||||||
"resolved": "https://registry.npmjs.org/validator/-/validator-13.11.0.tgz",
|
"resolved": "https://registry.npmjs.org/validator/-/validator-13.12.0.tgz",
|
||||||
"integrity": "sha512-Ii+sehpSfZy+At5nPdnyMhx78fEoPDkR2XW/zimHEL3MyGJQOCQ7WeP20jPYRz7ZCpcKLB21NxuXHF3bxjStBQ==",
|
"integrity": "sha512-c1Q0mCiPlgdTVVVIJIrBuxNicYE+t/7oKeI9MWLj3fh/uq2Pxh/3eeWbVZ4OcGW1TUf53At0njHw5SMdA3tmMg==",
|
||||||
"engines": {
|
"engines": {
|
||||||
"node": ">= 0.10"
|
"node": ">= 0.10"
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -45,6 +45,7 @@
|
|||||||
"nuxt-leaflet": "^0.0.27",
|
"nuxt-leaflet": "^0.0.27",
|
||||||
"read-excel-file": "^5.2.2",
|
"read-excel-file": "^5.2.2",
|
||||||
"socket.io": "^4.4.1",
|
"socket.io": "^4.4.1",
|
||||||
|
"validator": "^13.12.0",
|
||||||
"vue-persian-datetime-picker": "^2.10.3"
|
"vue-persian-datetime-picker": "^2.10.3"
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
|
|||||||
@@ -7,11 +7,15 @@ const OldPieceRequest = require('../../models/OldPieceRequest')
|
|||||||
const BufferRequest = require('../../models/BufferRequest')
|
const BufferRequest = require('../../models/BufferRequest')
|
||||||
const GuaranteeReport = require('../../models/GuaranteeReport')
|
const GuaranteeReport = require('../../models/GuaranteeReport')
|
||||||
const Complaint = require('../../models/Complaint')
|
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 => {
|
module.exports.getAllNotifs = async socket => {
|
||||||
try {
|
try {
|
||||||
const allData = await Promise.all([
|
const allData = await Promise.all([
|
||||||
|
|
||||||
// unreadCuMsgs
|
// unreadCuMsgs
|
||||||
ContactPageMessage.countDocuments({ read: false }),
|
ContactPageMessage.countDocuments({ read: false }),
|
||||||
|
|
||||||
@@ -36,7 +40,19 @@ module.exports.getAllNotifs = async socket => {
|
|||||||
// newGuaranteeReports
|
// newGuaranteeReports
|
||||||
GuaranteeReport.countDocuments({ status: 'sent', seen: false }),
|
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]
|
const unreadCuMsgs = allData[0]
|
||||||
@@ -48,6 +64,10 @@ module.exports.getAllNotifs = async socket => {
|
|||||||
const newBufferRequests = allData[6]
|
const newBufferRequests = allData[6]
|
||||||
const newGuaranteeReports = allData[7]
|
const newGuaranteeReports = allData[7]
|
||||||
const newComplaintReports = allData[8]
|
const newComplaintReports = allData[8]
|
||||||
|
const newWithdrawRequest = allData[9]
|
||||||
|
const newGpsRequest = allData[10]
|
||||||
|
const newAwardRequest = allData[11]
|
||||||
|
const newInstallDeviceRequest = allData[12]
|
||||||
|
|
||||||
|
|
||||||
socket.emit(`admin:allNotifs`, {
|
socket.emit(`admin:allNotifs`, {
|
||||||
@@ -59,7 +79,11 @@ module.exports.getAllNotifs = async socket => {
|
|||||||
newOldPieceRequests,
|
newOldPieceRequests,
|
||||||
newBufferRequests,
|
newBufferRequests,
|
||||||
newGuaranteeReports,
|
newGuaranteeReports,
|
||||||
newComplaintReports
|
newComplaintReports,
|
||||||
|
newWithdrawRequest,
|
||||||
|
newGpsRequest,
|
||||||
|
newAwardRequest,
|
||||||
|
newInstallDeviceRequest
|
||||||
})
|
})
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
console.log(e)
|
console.log(e)
|
||||||
|
|||||||
+2
-1
@@ -1,6 +1,7 @@
|
|||||||
const EnvirementVariables = {
|
const EnvirementVariables = {
|
||||||
// node envirements
|
// node envirements
|
||||||
isDev: process.env.NODE_ENV === 'development',
|
// isDev: process.env.NODE_ENV === 'development',
|
||||||
|
isDev: true,
|
||||||
isProduction: process.env.NODE_ENV === 'production',
|
isProduction: process.env.NODE_ENV === 'production',
|
||||||
|
|
||||||
// server ports
|
// server ports
|
||||||
|
|||||||
@@ -25,13 +25,31 @@ const authentication = {
|
|||||||
async isAdmin(req, res, next) {
|
async isAdmin(req, res, next) {
|
||||||
try {
|
try {
|
||||||
const token = req.headers?.authorization
|
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)
|
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)
|
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
|
req.user_id = decoded._id
|
||||||
return next()
|
return next()
|
||||||
@@ -54,6 +72,7 @@ const authentication = {
|
|||||||
req.user_id = decoded._id
|
req.user_id = decoded._id
|
||||||
return next()
|
return next()
|
||||||
} catch (err) {
|
} catch (err) {
|
||||||
|
|
||||||
return res401(res, 'unauthorized')
|
return res401(res, 'unauthorized')
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|||||||
@@ -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
|
||||||
|
};
|
||||||
@@ -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 } }
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]
|
||||||
@@ -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
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
]
|
||||||
|
|
||||||
|
|
||||||
@@ -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 })
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
]
|
||||||
@@ -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 })
|
||||||
|
}
|
||||||
|
]
|
||||||
@@ -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")
|
||||||
|
})
|
||||||
|
}
|
||||||
@@ -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;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]
|
||||||
|
|
||||||
@@ -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 })
|
||||||
|
}
|
||||||
@@ -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;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]
|
||||||
@@ -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 })
|
||||||
|
}
|
||||||
@@ -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;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]
|
||||||
@@ -24,7 +24,18 @@ const {
|
|||||||
generateRandomDigits
|
generateRandomDigits
|
||||||
} = require('../plugins/controllersHelperFunctions')
|
} = require('../plugins/controllersHelperFunctions')
|
||||||
const _faSr = _sr.fa
|
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
|
/// ///////////////////////////////////////////////////////////////// verify account functions
|
||||||
function sendConfirmationEmail(userId) {
|
function sendConfirmationEmail(userId) {
|
||||||
return new Promise(async (resolve, reject) => {
|
return new Promise(async (resolve, reject) => {
|
||||||
@@ -38,18 +49,7 @@ function sendConfirmationEmail(userId) {
|
|||||||
|
|
||||||
/// //// email configs
|
/// //// email configs
|
||||||
// const hostURL = 'www.asan-service.com'
|
// 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 = `
|
const emailHTMLTemplate = `
|
||||||
<div style="direction: rtl;background-color: #065495;overflow: hidden;">
|
<div style="direction: rtl;background-color: #065495;overflow: hidden;">
|
||||||
@@ -250,7 +250,7 @@ module.exports.delete_admin = [
|
|||||||
|
|
||||||
module.exports.permissions = [
|
module.exports.permissions = [
|
||||||
(req, res) => {
|
(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'
|
const hostURL = 'www.asan-service.com'
|
||||||
|
|
||||||
if (type === 'email') {
|
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 = `
|
const emailHTMLTemplate = `
|
||||||
<div style="direction: rtl;background-color: #065495;overflow: hidden;">
|
<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 = [
|
module.exports.updateUserByAdmin = [
|
||||||
[
|
[
|
||||||
body('first_name')
|
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
@@ -2,9 +2,10 @@
|
|||||||
const mongoose = require('mongoose')
|
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.
|
// 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 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 = ()=>{
|
const init = ()=>{
|
||||||
try {
|
try {
|
||||||
mongoose.connect(inHostUrl, {
|
mongoose.connect(outHostUrl, {
|
||||||
useNewUrlParser: true,
|
useNewUrlParser: true,
|
||||||
useUnifiedTopology: true,
|
useUnifiedTopology: true,
|
||||||
useFindAndModify: false,
|
useFindAndModify: false,
|
||||||
|
|||||||
@@ -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 };
|
||||||
@@ -1,5 +1,6 @@
|
|||||||
/// / develop environment config
|
/// / develop environment config
|
||||||
const { isDev, isProduction, DevServerPort } = require('./_env')
|
const { isDev, isProduction, DevServerPort } = require('./_env')
|
||||||
|
const errorHandler = require('./errorHandler')
|
||||||
const wss = require('./WebSocket/wss')
|
const wss = require('./WebSocket/wss')
|
||||||
/// / init express app (wrapping all functions into init() to prevent running in development mode by nuxt dev mode)
|
/// / init express app (wrapping all functions into init() to prevent running in development mode by nuxt dev mode)
|
||||||
function init() {
|
function init() {
|
||||||
@@ -36,6 +37,7 @@ function init() {
|
|||||||
const admin = require('./routes/admin')
|
const admin = require('./routes/admin')
|
||||||
const user = require('./routes/user')
|
const user = require('./routes/user')
|
||||||
const agent = require('./routes/agent')
|
const agent = require('./routes/agent')
|
||||||
|
const gps = require('./routes/gps')
|
||||||
const auth = require('./routes/auth')
|
const auth = require('./routes/auth')
|
||||||
const cross = require('./routes/cross')
|
const cross = require('./routes/cross')
|
||||||
const thirdParty = require('./routes/thirdParty')
|
const thirdParty = require('./routes/thirdParty')
|
||||||
@@ -45,12 +47,14 @@ function init() {
|
|||||||
router.use('/admin', authentication.isAdmin, admin)
|
router.use('/admin', authentication.isAdmin, admin)
|
||||||
router.use('/user', authentication.isUser, user)
|
router.use('/user', authentication.isUser, user)
|
||||||
router.use('/agent', authentication.isAgent, agent)
|
router.use('/agent', authentication.isAgent, agent)
|
||||||
|
router.use('/gps', authentication.isGPS, gps)
|
||||||
router.use('/auth', auth)
|
router.use('/auth', auth)
|
||||||
router.use('/cross', cross)
|
router.use('/cross', cross)
|
||||||
router.use('/thirdParty', checkThirdPartyAccess, thirdParty)
|
router.use('/thirdParty', checkThirdPartyAccess, thirdParty)
|
||||||
|
|
||||||
app.use(isDev ? '/api' : '', router)
|
app.use(isDev ? '/api' : '', router)
|
||||||
|
|
||||||
|
app.use(errorHandler.run)
|
||||||
|
|
||||||
return app
|
return app
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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)
|
||||||
@@ -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)
|
||||||
@@ -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)
|
||||||
@@ -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)
|
||||||
@@ -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)
|
||||||
@@ -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)
|
||||||
@@ -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)
|
||||||
@@ -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)
|
||||||
@@ -1,5 +1,16 @@
|
|||||||
const mongoose = require('mongoose')
|
const mongoose = require('mongoose')
|
||||||
|
|
||||||
|
const BankSchema = mongoose.Schema({
|
||||||
|
holderName:String,
|
||||||
|
PAN:{
|
||||||
|
type:Number,
|
||||||
|
},
|
||||||
|
IBAN:{
|
||||||
|
type:String,
|
||||||
|
}
|
||||||
|
})
|
||||||
|
|
||||||
|
|
||||||
const UserSchema = mongoose.Schema({
|
const UserSchema = mongoose.Schema({
|
||||||
// for admins
|
// for admins
|
||||||
_creator: { type: mongoose.ObjectId, ref: 'User' },
|
_creator: { type: mongoose.ObjectId, ref: 'User' },
|
||||||
@@ -7,6 +18,7 @@ const UserSchema = mongoose.Schema({
|
|||||||
username: String,
|
username: String,
|
||||||
permissions: Array,
|
permissions: Array,
|
||||||
personalCode:String,
|
personalCode:String,
|
||||||
|
|
||||||
// for user
|
// for user
|
||||||
national_code: String,
|
national_code: String,
|
||||||
province_id: String,
|
province_id: String,
|
||||||
@@ -42,6 +54,33 @@ const UserSchema = mongoose.Schema({
|
|||||||
last_name: String,
|
last_name: String,
|
||||||
password: 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
|
/// //////////////////////////////// user confirmations
|
||||||
confirmed: { type: Boolean, default: false },
|
confirmed: { type: Boolean, default: false },
|
||||||
email_confirmed: { type: Boolean, default: false },
|
email_confirmed: { type: Boolean, default: false },
|
||||||
|
|||||||
@@ -1,6 +1,5 @@
|
|||||||
const fs = require('fs')
|
const fs = require('fs')
|
||||||
const readXlsxFile = require('read-excel-file/node')
|
const readXlsxFile = require('read-excel-file/node')
|
||||||
|
|
||||||
const guaranteeSerialsPath = './static/uploads/serials'
|
const guaranteeSerialsPath = './static/uploads/serials'
|
||||||
const productSerialsPath = './static/uploads/serials_products'
|
const productSerialsPath = './static/uploads/serials_products'
|
||||||
|
|
||||||
|
|||||||
@@ -2,7 +2,9 @@
|
|||||||
module.exports.res404 = (res, err) => {
|
module.exports.res404 = (res, err) => {
|
||||||
return res.status(404).json({ message: 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) => {
|
module.exports.res406 = (res, err) => {
|
||||||
return res.status(406).json({ message: err })
|
return res.status(406).json({ message: err })
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -114,5 +114,9 @@ module.exports = [
|
|||||||
{
|
{
|
||||||
name: 'برند ها',
|
name: 'برند ها',
|
||||||
value: 'brands'
|
value: 'brands'
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: 'جی پی اس',
|
||||||
|
value: 'gps'
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
|
|||||||
@@ -16,6 +16,7 @@ module.exports._sr = {
|
|||||||
company_name: 'درصورتی که شخص حقوقی هستید، نام کمپانی را وارد کنید',
|
company_name: 'درصورتی که شخص حقوقی هستید، نام کمپانی را وارد کنید',
|
||||||
username: 'نام کاربری را وارد کنید',
|
username: 'نام کاربری را وارد کنید',
|
||||||
phone_number: 'شماره تماس را وارد کنید',
|
phone_number: 'شماره تماس را وارد کنید',
|
||||||
|
store_number: 'شماره تماس مغازه را وارد کنید',
|
||||||
password: 'پسورد را وارد کنید',
|
password: 'پسورد را وارد کنید',
|
||||||
birthdate: 'تاریخ تولد را وارد کنید',
|
birthdate: 'تاریخ تولد را وارد کنید',
|
||||||
// addressing validations
|
// addressing validations
|
||||||
@@ -107,7 +108,8 @@ module.exports._sr = {
|
|||||||
email: 'این ایمیل از قبل وجود دارد',
|
email: 'این ایمیل از قبل وجود دارد',
|
||||||
name: 'نام تکراری است',
|
name: 'نام تکراری است',
|
||||||
title: 'عنوان تکراری است',
|
title: 'عنوان تکراری است',
|
||||||
phone_number: 'این شماره تماس از قبل وجود دارد'
|
phone_number: 'این شماره تماس از قبل وجود دارد',
|
||||||
|
IMEI:'این IMEI تکراری است'
|
||||||
},
|
},
|
||||||
response: {
|
response: {
|
||||||
logged_in: 'شما وارد سیستم شدید',
|
logged_in: 'شما وارد سیستم شدید',
|
||||||
|
|||||||
@@ -26,9 +26,52 @@ const smsBroadcastController = require('../controllers/smsBroadcastController')
|
|||||||
const surveyController = require('../controllers/surveyController')
|
const surveyController = require('../controllers/surveyController')
|
||||||
const complaintController = require('../controllers/complaintController')
|
const complaintController = require('../controllers/complaintController')
|
||||||
const brandController = require('../controllers/brandController')
|
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
|
/// //////////////////////////////////////////////////////// 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
|
/// ///////////// survey
|
||||||
router.get('/surveys',hasPermission('surveys'), surveyController.getAllForAdmin)
|
router.get('/surveys',hasPermission('surveys'), surveyController.getAllForAdmin)
|
||||||
router.get('/surveys/:id',hasPermission('surveys'), surveyController.getOneForAdmin)
|
router.get('/surveys/:id',hasPermission('surveys'), surveyController.getOneForAdmin)
|
||||||
|
|||||||
@@ -5,7 +5,6 @@ const pieceController = require('../controllers/pieceController')
|
|||||||
const pieceRequestController = require('../controllers/pieceRequestController')
|
const pieceRequestController = require('../controllers/pieceRequestController')
|
||||||
const oldPieceRequestController = require('../controllers/oldPieceRequestController')
|
const oldPieceRequestController = require('../controllers/oldPieceRequestController')
|
||||||
const bufferRequestController = require('../controllers/bufferRequestController')
|
const bufferRequestController = require('../controllers/bufferRequestController')
|
||||||
|
|
||||||
const guaranteeReportController = require('../controllers/guaranteeReportController')
|
const guaranteeReportController = require('../controllers/guaranteeReportController')
|
||||||
|
|
||||||
/// // inbox
|
/// // inbox
|
||||||
|
|||||||
@@ -1,8 +1,13 @@
|
|||||||
const { Router } = require('express')
|
const { Router } = require('express')
|
||||||
const router = Router()
|
const router = Router()
|
||||||
const userController = require('../controllers/userController')
|
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/admin', userController.register_admin)
|
||||||
router.post('/register/user', userController.register_user)
|
router.post('/register/user', userController.register_user)
|
||||||
// router.post('/activation/:key', userController.activation)
|
// router.post('/activation/:key', userController.activation)
|
||||||
@@ -13,4 +18,6 @@ router.post('/login', userController.webLogin)
|
|||||||
router.post('/logout', userController.webLogout)
|
router.post('/logout', userController.webLogout)
|
||||||
router.get('/user', userController.getUser)
|
router.get('/user', userController.getUser)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
module.exports = router
|
module.exports = router
|
||||||
|
|||||||
@@ -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
|
||||||
@@ -6,6 +6,10 @@ const representationController = require('../controllers/representationControlle
|
|||||||
const transactionDraftsController = require('../controllers/transactionDraftsController')
|
const transactionDraftsController = require('../controllers/transactionDraftsController')
|
||||||
const transactionController = require('../controllers/transactionController')
|
const transactionController = require('../controllers/transactionController')
|
||||||
const surveyController = require('../controllers/surveyController')
|
const surveyController = require('../controllers/surveyController')
|
||||||
|
const requestController = require('../controllers/GPS.Request')
|
||||||
|
|
||||||
|
/// // GPS
|
||||||
|
router.post('/gps/request', requestController.gpsRequest)
|
||||||
|
|
||||||
/// // profile
|
/// // profile
|
||||||
router.put('/update_profile', userController.update_user)
|
router.put('/update_profile', userController.update_user)
|
||||||
|
|||||||
Reference in New Issue
Block a user