/var/www/qr4y.com/server/delivery/api/controllers
Edit: /var/www/qr4y.com/server/delivery/api/controllers/delivery.controller.js (2827B)
const logger = require('../../logger')({ service: 'DeliveryController' })
const checkPermission = require('../utils/checkPermission.util')
const { NotFound, BadRequest } = require('../responseModels/errors')
const { isSet, isArray, isEmpty, isNumber } = require('../utils/validator.util')
const fetch = require('node-fetch')
const config = require('../../config/app.json')
const { performance } = require('perf_hooks')
const { exit } = require('process')
module.exports = function ({ db }) {
this.Calculate = async (req, res, next) => {
logger.child({ path: req.path, request: req.body }).info()
try {
let t1 = performance.now()
const { branchDeliveryTypeId, orderCost, coordinates } = req.body
if (!isSet(branchDeliveryTypeId) || isEmpty(branchDeliveryTypeId)) {
throw new BadRequest({ lang: req.user?.languageCode })
}
if (!isSet(orderCost)) {
throw new BadRequest({ lang: req.user?.languageCode })
}
if (!isSet(coordinates) || !isArray(coordinates)) {
throw new BadRequest({ lang: req.user?.languageCode })
}
const response = await Promise.all([
fetch(`${config.osrm.url}${coordinates.join(';')}`),
db.branchDeliveryTypes.findOne({ where: { id: branchDeliveryTypeId } })
])
var data
var rateJson
try {
data = await response[0].json()
}catch(e){}
try {
rateJson = JSON.parse(response[1].rate_json)
}catch(e){}
if (!isSet(rateJson)) {
throw new BadRequest({ lang: req.user?.languageCode })
}
if (!data || data?.code != 'Ok' || !isArray(data.routes) || data.routes.length == 0) {
let route = {
distance: 0,
distanceToPay: 0,
duration: 0,
timeOfDelivery: 0,//parseInt(rateJson.timeOfDelivery),
orderCost: parseFloat(orderCost),
freeMinCost: rateJson.fmc,
deliveryCost: 0,
deliveryCostCalculated: 0
}
const time = performance.now() - t1
return res.status(200).json({
route,
time
})
}
let route = {
distance: data.routes[0].distance / 1000,
distanceToPay: 0,
duration: parseInt(data.routes[0].duration / 60),
timeOfDelivery: 0,//parseInt(rateJson.timeOfDelivery),
orderCost: parseFloat(orderCost),
freeMinCost: rateJson.fmc,
deliveryCost: 0,
deliveryCostCalculated: 0
}
let distanceToPay = route.distance - rateJson.fk
if (distanceToPay < 0) {
distanceToPay = 0
} else {
route.distanceToPay = parseFloat(distanceToPay)
}
route.deliveryCostCalculated = Math.round(
rateJson.mc + distanceToPay * rateJson.ck
)
if (route.freeMinCost == 0 || route.orderCost < route.freeMinCost) {
route.deliveryCost = route.deliveryCostCalculated
}
const time = performance.now() - t1
return res.status(200).json({
route,
time
})
} catch (err) {
next(err)
}
}
}