/var/www/verywell.gr/server/delivery/api/controllers
Edit: /var/www/verywell.gr/server/delivery/api/controllers/waiter.controller.js (6173B)
const logger = require('../../logger')({ service: 'api' })
const { NotFound, BadRequest } = require('../responseModels/errors')
//const { Op } = require('sequelize')
const checkPermission = require('../utils/checkPermission.util')
const { performance } = require('perf_hooks')
const { getDateByDateRange, hoursList, daysOfWeekList } = require('../utils/date')
module.exports = function ({ db }) {
this.Statistic = async (req, res, next) => {
logger.child({ path: req.path, request: req.query }).info()
try {
let t1 = performance.now()
const { uid, range } = req.query
if (!uid) throw new BadRequest({ lang: req.user?.languageCode })
let date
let waiter
let list = []
let whereOrders = {}
switch (range) {
case DATE.RANGE.HOUR:
date = getDateByDateRange(DATE.RANGE.HOUR)
whereOrders['createdAt'] = {
[db.Sequelize.Op.between]: [date.begin, date.end]
}
waiter = await db.user.findOne({
where: { uid },
include: [
{
model: db.order,
foreginKey: 'userId',
as: 'waiterOrders',
where: whereOrders
}
]
})
if (!waiter) throw new NotFound({ lang: req.user?.languageCode })
if (!waiter.waiterOrders || !waiter.waiterOrders.length === 0)
throw new NotFound({ lang: req.user?.languageCode })
for (let i = 0; i < 60; i++) {
let dt = new Date(date.end)
dt.setMinutes(dt.getMinutes() - i)
dt.setSeconds(0)
dt.setMilliseconds(0)
list.push({
idx: 59 - i,
name: dt.getMinutes(),
date: dt,
complete: waiter.waiterOrders.filter(
(x) =>
x.status == ORDER_STATUS.COMPLETE &&
x.createdAt.getMinutes() == dt.getMinutes()
).length,
cancel: waiter.waiterOrders.filter(
(x) =>
x.status == ORDER_STATUS.CANCEL &&
x.createdAt.getMinutes() == dt.getMinutes()
).length
})
}
break
case DATE.RANGE.DAY:
date = getDateByDateRange(DATE.RANGE.DAY)
whereOrders['createdAt'] = {
[db.Sequelize.Op.between]: [date.begin, date.end]
}
waiter = await db.user.findOne({
where: { uid },
include: [
{
model: db.order,
foreginKey: 'userId',
as: 'waiterOrders',
where: whereOrders
}
]
})
if (!waiter) throw new NotFound({ lang: req.user?.languageCode })
if (!waiter.waiterOrders || !waiter.waiterOrders.length === 0)
throw new NotFound({ lang: req.user?.languageCode })
const hours = hoursList(req.user.languageCode)
for (let i = 0; i < hours.length; i++) {
let dt = new Date(date.end)
dt.setHours(dt.getHours() - i)
dt.setMinutes(0)
dt.setSeconds(0)
dt.setMilliseconds(0)
list.push({
idx: hours.length - 1 - i,
name: hours[dt.getHours()],
date: dt,
complete: waiter.waiterOrders.filter(
(x) =>
x.status == ORDER_STATUS.COMPLETE &&
x.createdAt.getUTCHours() == dt.getUTCHours()
).length,
cancel: waiter.waiterOrders.filter(
(x) =>
x.status == ORDER_STATUS.CANCEL &&
x.createdAt.getUTCHours() == dt.getUTCHours()
).length
})
}
break
case DATE.RANGE.WEEK:
date = getDateByDateRange(DATE.RANGE.WEEK)
whereOrders['createdAt'] = {
[db.Sequelize.Op.between]: [date.begin, date.end]
}
waiter = await db.user.findOne({
where: { uid },
include: [
{
model: db.order,
foreginKey: 'userId',
as: 'waiterOrders',
where: whereOrders
}
]
})
if (!waiter) throw new NotFound({ lang: req.user?.languageCode })
if (!waiter.waiterOrders || !waiter.waiterOrders.length === 0)
throw new NotFound({ lang: req.user?.languageCode })
const days = daysOfWeekList(req.user.languageCode)
for (let i = 0; i < days.length; i++) {
let dt = new Date(date.end)
dt.setDate(dt.getDate() - i)
dt.setMinutes(0)
dt.setSeconds(0)
dt.setMilliseconds(0)
list.push({
idx: days.length - 1 - i,
name: days[dt.getDay()],
date: dt,
complete: waiter.waiterOrders.filter(
(x) =>
x.status == ORDER_STATUS.COMPLETE &&
x.createdAt.getDate() == dt.getDate()
).length,
cancel: waiter.waiterOrders.filter(
(x) =>
x.status == ORDER_STATUS.CANCEL &&
x.createdAt.getDate() == dt.getDate()
).length
})
}
break
case DATE.RANGE.MONTH:
date = getDateByDateRange(DATE.RANGE.MONTH)
whereOrders['createdAt'] = {
[db.Sequelize.Op.between]: [date.begin, date.end]
}
waiter = await db.user.findOne({
where: { uid },
include: [
{
model: db.order,
foreginKey: 'userId',
as: 'waiterOrders',
where: whereOrders
}
]
})
if (!waiter) throw new NotFound({ lang: req.user?.languageCode })
if (!waiter.waiterOrders || !waiter.waiterOrders.length === 0)
throw new NotFound({ lang: req.user?.languageCode })
for (let i = 0; i <= 30; i++) {
let dt = new Date(date.end)
dt.setDate(dt.getDate() - i)
dt.setMinutes(0)
dt.setSeconds(0)
dt.setMilliseconds(0)
list.push({
idx: 30 - i,
name: dt.getDate(),
date: dt,
complete: waiter.waiterOrders.filter(
(x) =>
x.status == ORDER_STATUS.COMPLETE &&
x.createdAt.getDate() == dt.getDate()
).length,
cancel: waiter.waiterOrders.filter(
(x) =>
x.status == ORDER_STATUS.CANCEL &&
x.createdAt.getDate() == dt.getDate()
).length
})
}
break
}
const time = performance.now() - t1
return res.status(200).json({
all: waiter.waiterOrders.length,
complete: waiter.waiterOrders.filter((x) => x.status === ORDER_STATUS.COMPLETE)
.length,
cancel: waiter.waiterOrders.filter((x) => x.status === ORDER_STATUS.CANCEL).length,
list,
date,
range,
time
})
} catch (err) {
next(err)
}
}
}