/var/www/qr4y.com/server/delivery/api/controllers
Edit: /var/www/qr4y.com/server/delivery/api/controllers/branchReview.controller.js (6321B)
const logger = require('../../logger')({ service: 'api' })
const { NotFound, BadRequest } = require('../responseModels/errors')
const { isSet, isEmpty, minLength, isPhone, isEmail } = require('../utils/validator.util')
module.exports = function ({ db }) {
this.List = async (req, res, next) => {
logger.child({ path: req.path, request: req.query }).info()
try {
let t1 = performance.now()
const { isVerified, userId, branchId, limit, page } = req.query
let where = {}
if (userId) {
where['userId'] = userId
}
if (branchId) {
where['branchId'] = branchId
}
if (typeof isVerified === 'undefined') {
where['isVerified'] = true
} else {
where['isVerified'] = isVerified
}
let offset = page > 0 ? (page - 1) * (limit || 10) : 0
const rows = await db.branchReview.findAll({
include: db.user,
where,
offset,
order: [
['createdAt', 'DESC']
// ['name', 'ASC'],
],
limit: parseInt(limit) || 10
})
const time = performance.now() - t1
return res.status(200).json({ list: rows, count: rows.length, time, page })
} catch (err) {
next(err)
}
}
this.Details = async (req, res, next) => {
logger.child({ path: req.path, request: req.params }).info()
try {
const { id } = req.params
const review = await db.branchReview.findOne({ where: { id } })
return res.status(200).json(review)
} catch (err) {
next(err)
}
}
this.Accept = async (req, res, next) => {
logger.child({ path: req.path, request: req.body }).info()
let transaction = null
try {
const { id } = req.body
transaction = await db.sequelize.transaction()
const review = await db.branchReview.findOne({ where: { id } })
review.isVerified = true
await review.save()
await transaction.commit()
await calculateBranchRating(review.branchId)
return res.status(200).json({ status: 'success', id })
} catch (err) {
transaction?.rollback()
next(err)
}
}
this.Create = async (req, res, next) => {
logger.child({ path: req.path, request: req.body }).info()
try {
const { branchId, text, rating, orderId } = req.body
if (!isSet(branchId) || isEmpty(branchId)) {
throw new BadRequest({ lang: req.user?.languageCode })
}
if (!isSet(rating)) {
throw new BadRequest({ lang: req.user?.languageCode })
}
if (!isSet(text)) {
throw new BadRequest({ lang: req.user?.languageCode })
}
let branch = await db.branch.findOne({
where: { id: branchId }
})
const review = await db.branchReview.create({
branchId: branch.id,
userId: req.user.id,
text,
rating
})
// Расчет рейтинга не нужен. Расчет будет после подтверждения.
// ---> Пока что принимаем все подряд
let transaction = null
try {
transaction = await db.sequelize.transaction()
if (isSet(orderId) && !isEmpty(orderId)) {
const order = await db.order.findOne({ where: { id: orderId } })
order.rate = rating
order.save()
}
const review2 = await db.branchReview.findOne({ where: { id: review.id } })
review2.isVerified = true
await review2.save()
// company counters
const company = await db.company.findOne({ where: { id: branch.companyId } })
if (company) {
company.countBranchReviews++
company.save()
}
await transaction.commit()
await calculateBranchRating(branchId)
SERVICES.BranchService.ReloadBranch(branchId)
} catch (err) {
transaction?.rollback()
}
// <---
return res.status(200).json({ success: 'success', id: review.id, review: review })
} catch (err) {
next(err)
}
}
this.Edit = async (req, res, next) => {
logger.child({ path: req.path, request: req.body }).info()
let transaction = null
try {
const { id, rating, text } = req.body
if (!isSet(id) || isEmpty(id)) {
throw new BadRequest({ lang: req.user?.languageCode })
}
if (!isSet(rating)) {
throw new BadRequest({ lang: req.user?.languageCode })
}
if (!isSet(text) || isEmpty(text)) {
throw new BadRequest({ lang: req.user?.languageCode })
}
transaction = await db.sequelize.transaction()
let review = await db.branchReview.findOne({ where: { id } })
if (rating != review.rating || text != review.text) {
review.isVerified = false
}
review.rating = rating
review.text = text
await review.save()
await transaction.commit()
await calculateBranchRating(review.branchId)
return res.status(200).json(review)
} catch (err) {
transaction?.rollback()
next(err)
}
}
this.Delete = async (req, res, next) => {
logger.child({ path: req.path, request: req.body }).info()
let transaction = null
try {
const { id } = req.body
if (!isSet(id) || isEmpty(id)) {
throw new BadRequest({ lang: req.user?.languageCode })
}
transaction = await db.sequelize.transaction()
const review = await db.branchReview.findOne({ where: { id } })
if (!review) {
throw new NotFound({ lang: req.user?.languageCode })
}
const branchId = review.branchId
const isVerified = review.isVerified
await review.destroy()
// если отзыв был проверен то пересчитать рейтинг
if (isVerified) {
let branch = await db.branch.findOne({
where: { id: branchId }
})
const company = await db.company.findOne({ where: { id: branch.companyId } })
if (company) {
company.countBranchReviews--
company.save()
}
}
await transaction.commit()
SERVICES.BranchService.ReloadBranch(branchId)
await calculateBranchRating(branchId)
return res.status(200).json({ status: 'success', id })
} catch (err) {
transaction?.rollback()
next(err)
}
}
async function calculateBranchRating(branchId) {
let branch = await db.branch.findOne({ where: { id: branchId } })
if (!branch) {
throw new NotFound({ lang: req.user?.languageCode })
}
const sum = await db.branchReview.sum('rating',
{
where: { branchId: branchId, isVerified: true }
}
)
const count = await db.branchReview.count(
{
where: { branchId: branchId, isVerified: true }
}
)
if (sum > 0) {
branch.rating = sum / count
await branch.save()
}
}
}