import { Injectable } from '@nestjs/common'; import { Prisma } from '@prisma/client'; import { PrismaService } from '../../common/prisma/prisma.module'; import { serializeBigInt } from '../../common/decorators/current-user.decorator'; import type { AdminStoreRatingsQueryDto } from './dto/admin-query.dto'; import { HqPermissionsResolver, mergeHqStoreCityWhere } from '../../common/guards/hq-permission.guard'; @Injectable() export class AdminStoreRatingsService { constructor( private readonly prisma: PrismaService, private readonly hqPermissions: HqPermissionsResolver, ) {} async list(query: AdminStoreRatingsQueryDto, actorId: bigint) { const page = query.page ?? 1; const pageSize = query.pageSize ?? 20; const scope = await this.hqPermissions.resolveCityScope(actorId); if (query.storeId) { await this.hqPermissions.assertStoreIdInScope(actorId, BigInt(query.storeId)); } const storeWhere = mergeHqStoreCityWhere({}, scope, query.cityId); const where: Prisma.StoreRatingWhereInput = { store: storeWhere, }; if (query.storeId) where.storeId = BigInt(query.storeId); if (query.redeemNo) { where.redeemRecord = { redeemNo: { contains: query.redeemNo } }; } const [items, total] = await Promise.all([ this.prisma.storeRating.findMany({ where, orderBy: { createdAt: 'desc' }, skip: (page - 1) * pageSize, take: pageSize, include: { store: { select: { id: true, name: true, cityName: true } }, redeemRecord: { select: { id: true, redeemNo: true, amount: true, user: { select: { id: true, userNo: true, phone: true, nickname: true } }, }, }, }, }), this.prisma.storeRating.count({ where }), ]); return serializeBigInt({ items: items.map((r) => ({ id: r.id, serviceScore: r.serviceScore, envScore: r.envScore, createdAt: r.createdAt, store: r.store, redeemRecordId: r.redeemRecordId, redeemNo: r.redeemRecord.redeemNo, redeemAmount: Number(r.redeemRecord.amount), user: r.redeemRecord.user, })), total, page, pageSize, }); } }