Files
alrahma_sunday_school_api/apps/api/dist/modules/reviews/review.repo.js
T
2026-06-11 03:22:12 -04:00

104 lines
3.1 KiB
JavaScript

"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.findMany = findMany;
exports.findById = findById;
exports.updateById = updateById;
exports.getStats = getStats;
exports.sendReminder = sendReminder;
const prisma_1 = require("../../lib/prisma");
const REVIEW_INCLUDE = {
reservation: {
select: {
id: true,
startDate: true,
endDate: true,
reviewToken: true,
reviewRequestSentAt: true,
reviewReminderSentAt: true,
reviewFinalReminderSentAt: true,
reviewPaused: true,
customer: {
select: {
id: true,
firstName: true,
lastName: true,
email: true,
reviewOptOut: true,
},
},
vehicle: {
select: {
id: true,
make: true,
model: true,
year: true,
},
},
},
},
};
async function findMany(companyId, where, skip, take) {
const baseWhere = { companyId, ...where };
return Promise.all([
prisma_1.prisma.review.findMany({
where: baseWhere,
include: REVIEW_INCLUDE,
skip,
take,
orderBy: { createdAt: 'desc' },
}),
prisma_1.prisma.review.count({ where: baseWhere }),
]);
}
async function findById(id, companyId) {
return prisma_1.prisma.review.findFirst({
where: { id, companyId },
include: REVIEW_INCLUDE,
});
}
async function updateById(id, data) {
return prisma_1.prisma.review.update({
where: { id },
data,
include: REVIEW_INCLUDE,
});
}
async function getStats(companyId) {
const reviews = await prisma_1.prisma.review.findMany({
where: { companyId },
select: { overallRating: true, vehicleRating: true, serviceRating: true },
});
const total = reviews.length;
const byRating = { 1: 0, 2: 0, 3: 0, 4: 0, 5: 0 };
let sumOverall = 0;
let sumVehicle = 0;
let countVehicle = 0;
let sumService = 0;
let countService = 0;
for (const r of reviews) {
sumOverall += r.overallRating;
byRating[r.overallRating] = (byRating[r.overallRating] ?? 0) + 1;
if (r.vehicleRating != null) {
sumVehicle += r.vehicleRating;
countVehicle++;
}
if (r.serviceRating != null) {
sumService += r.serviceRating;
countService++;
}
}
return {
total,
averageOverall: total > 0 ? Math.round((sumOverall / total) * 10) / 10 : 0,
averageVehicle: countVehicle > 0 ? Math.round((sumVehicle / countVehicle) * 10) / 10 : 0,
averageService: countService > 0 ? Math.round((sumService / countService) * 10) / 10 : 0,
byRating,
};
}
async function sendReminder(reservationId, sentAt, field) {
return prisma_1.prisma.reservation.update({
where: { id: reservationId },
data: { [field]: sentAt },
});
}
//# sourceMappingURL=review.repo.js.map