/var/www/verywell.gr/server/delivery/api/controllers
Edit: /var/www/verywell.gr/server/delivery/api/controllers/delivery.controller.js (7624B)
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.ShippingRateList = async (req, res, next) => {
logger.child({ path: req.path, request: req.query }).info()
try {
let t1 = performance.now()
const { page, limit, deliveryTypeUid } = req.query
if (!isSet(deliveryTypeUid) || !isNumber(deliveryTypeUid)) {
throw new BadRequest({ lang: req.user?.languageCode })
}
const deliveryType = await db.deliveryType.findOne({ where: { uid: deliveryTypeUid } })
if (!deliveryType) {
throw new BadRequest({ lang: req.user?.languageCode })
}
let offset = page > 0 ? (page - 1) * (limit || 10) : 0
const rows = await db.shippingRate.findAll({
where: { deliveryTypeId: deliveryType.id },
offset,
limit: parseInt(limit) || 10
})
if (rows.length == 0 || !rows) {
throw new NotFound({ lang: req.user?.languageCode })
}
const time = performance.now() - t1
return res.status(200).json({ rows, count: rows.length, time })
} catch (err) {
next(err)
}
}
this.ShippingRateDetails = async (req, res, next) => {
logger.child({ path: req.path, request: req.params }).info()
try {
let t1 = performance.now()
const { branchId, deliveryTypeId } = req.params
if (!isSet(branchId) || isEmpty(branchId)) {
throw new BadRequest({ lang: req.user?.languageCode })
}
if (!isSet(deliveryTypeId) || isEmpty(deliveryTypeId)) {
throw new BadRequest({ lang: req.user?.languageCode })
}
const shippingRate = await db.shippingRate.findOne({ where: { branchId: branchId, deliveryTypeId: deliveryTypeId } })
if (!shippingRate) {
throw new NotFound({ lang: req.user?.languageCode })
}
const time = performance.now() - t1
return res.status(200).json({ shippingRate, time })
} catch (err) {
next(err)
}
}
this.ShippingRateSet = async (req, res, next) => {
logger.child({ path: req.path, request: req.body }).info()
try {
let t1 = performance.now()
let {
deliveryTypeId,
branchId,
initialCost,
costPerKm,
freeKm,
maxKm,
costPerMinute,
freeMinutes,
timeOfDelivery,
freeMinCost,
reservShowRooms,
reservMaxDays
} = req.body
if (!isSet(initialCost)) {
throw new BadRequest({ lang: req.user?.languageCode })
}
if (!isSet(costPerKm)) {
throw new BadRequest({ lang: req.user?.languageCode })
}
if (!isSet(freeKm)) {
throw new BadRequest({ lang: req.user?.languageCode })
}
if (!isSet(maxKm)) {
throw new BadRequest({ lang: req.user?.languageCode })
}
if (!isSet(costPerMinute)) {
throw new BadRequest({ lang: req.user?.languageCode })
}
if (!isSet(freeMinutes)) {
throw new BadRequest({ lang: req.user?.languageCode })
}
if (!isSet(deliveryTypeId)) {
throw new BadRequest({ lang: req.user?.languageCode })
}
if (!isSet(branchId)) {
throw new BadRequest({ lang: req.user?.languageCode })
}
if (!isSet(reservShowRooms)) {
reservShowRooms = false;
}
if (!isSet(reservMaxDays)) {
reservMaxDays = 7; // days
}
var shippingRate = await db.shippingRate.findOne({ where: { branchId: branchId, deliveryTypeId: deliveryTypeId } })
if (shippingRate) {
shippingRate.initialCost = parseFloat(initialCost)
shippingRate.costPerKm = parseFloat(costPerKm)
shippingRate.freeKm = parseFloat(freeKm)
shippingRate.maxKm = parseFloat(maxKm)
shippingRate.costPerMinute = parseFloat(costPerMinute)
shippingRate.freeMinutes = parseFloat(freeMinutes)
shippingRate.freeMinCost = parseFloat(freeMinCost)
shippingRate.timeOfDelivery = parseInt(timeOfDelivery)
shippingRate.deliveryTypeId = deliveryTypeId
shippingRate.branchId = branchId
shippingRate.reservShowRooms = reservShowRooms
shippingRate.reservMaxDays = reservMaxDays
await shippingRate.save()
}else{
shippingRate = await db.shippingRate.create({
deliveryTypeId,
branchId,
initialCost,
costPerKm,
freeKm,
maxKm,
costPerMinute,
freeMinutes,
timeOfDelivery,
freeMinCost,
reservShowRooms,
reservMaxDays
})
}
const time = performance.now() - t1
return res.status(200).json({ status: 'success', uid: shippingRate.uid, time })
} catch (err) {
next(err)
}
}
this.ShippingRateDelete = async (req, res, next) => {
logger.child({ path: req.path, request: req.body }).info()
try {
let t1 = performance.now()
const { uid } = req.body
if (!isSet(uid)) {
throw new BadRequest({ lang: req.user?.languageCode })
}
const shippingRate = await db.shippingRate.findOne({ where: { uid: uid } })
if (!shippingRate) {
throw new NotFound({ lang: req.user?.languageCode })
}
await db.shippingRate.destroy({ where: { uid: uid } })
const time = performance.now() - t1
return res.status(200).json({ status: 'success', uid: shippingRate.uid, time })
} catch (err) {
next(err)
}
}
this.Calculate = async (req, res, next) => {
logger.child({ path: req.path, request: req.body }).info()
try {
let t1 = performance.now()
const { shippingRateUid, orderCost, coordinates } = req.body
if (!isSet(shippingRateUid) || isEmpty(shippingRateUid)) {
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([
await fetch(`${config.osrm.url}${coordinates.join(';')}`),
db.shippingRate.findOne({ where: { uid: shippingRateUid } })
])
const data = await response[0].json()
const shippingRate = response[1]
if (!data || data?.code != 'Ok' || !isArray(data.routes) || data.routes.length == 0) {
let route = {
distance: 0,
distanceToPay: 0,
duration: 0,
timeOfDelivery: parseInt(shippingRate.timeOfDelivery),
orderCost: parseFloat(orderCost),
freeMinCost: parseFloat(shippingRate.freeMinCost),
deliveryCost: 0,
deliveryCostCalculated: 0
}
const time = performance.now() - t1
return res.status(200).json({
route,
time
})
}
let route = {
distance: data.routes[0].distance,
distanceToPay: 0,
duration: parseInt(data.routes[0].duration / 60),
timeOfDelivery: parseInt(shippingRate.timeOfDelivery),
orderCost: parseFloat(orderCost),
freeMinCost: parseFloat(shippingRate.freeMinCost),
deliveryCost: 0,
deliveryCostCalculated: 0
}
let distanceToPay = route.distance / 1000 - shippingRate.freeKm
if (distanceToPay < 0) {
distanceToPay = 0
} else {
route.distanceToPay = parseInt(distanceToPay * 1000)
}
route.deliveryCostCalculated = Math.round(
parseFloat(shippingRate.initialCost) +
distanceToPay * parseFloat(shippingRate.costPerKm)
)
if (route.orderCost < route.freeMinCost) {
route.deliveryCost = route.deliveryCostCalculated
}
const time = performance.now() - t1
return res.status(200).json({
route,
time
})
} catch (err) {
next(err)
}
}
}