origin/apps/server/src/models/visit/visit.service.ts

84 lines
2.5 KiB
TypeScript
Raw Normal View History

2024-12-30 08:26:40 +08:00
import { Injectable } from '@nestjs/common';
import { BaseService } from '../base/base.service';
2025-02-06 16:32:52 +08:00
import { UserProfile, db, ObjectType, Prisma, VisitType } from '@nice/common';
2024-12-30 08:26:40 +08:00
import EventBus from '@server/utils/event-bus';
@Injectable()
export class VisitService extends BaseService<Prisma.VisitDelegate> {
constructor() {
super(db, ObjectType.VISIT);
}
async create(args: Prisma.VisitCreateArgs, staff?: UserProfile) {
2024-12-31 15:57:32 +08:00
const { postId, lectureId, messageId } = args.data;
2024-12-30 08:26:40 +08:00
const visitorId = args.data.visitorId || staff?.id;
let result;
const existingVisit = await db.visit.findFirst({
where: {
2024-12-31 15:57:32 +08:00
type: args.data.type,
2024-12-30 08:26:40 +08:00
visitorId,
2024-12-31 15:57:32 +08:00
OR: [{ postId }, { lectureId }, { messageId }],
2024-12-30 08:26:40 +08:00
},
});
if (!existingVisit) {
result = await super.create(args);
2024-12-31 15:57:32 +08:00
} else if (args.data.type === VisitType.READED) {
2024-12-30 08:26:40 +08:00
result = await super.update({
where: { id: existingVisit.id },
data: {
...args.data,
views: existingVisit.views + 1,
},
});
}
2024-12-31 15:57:32 +08:00
// if (troubleId && args.data.type === VisitType.READED) {
// EventBus.emit('updateViewCount', {
// objectType: ObjectType.TROUBLE,
// id: troubleId,
// });
// }
2024-12-30 08:26:40 +08:00
return result;
}
async createMany(args: Prisma.VisitCreateManyArgs, staff?: UserProfile) {
const data = Array.isArray(args.data) ? args.data : [args.data];
2024-12-31 15:57:32 +08:00
const updatePromises: any[] = [];
const createData: Prisma.VisitCreateManyInput[] = [];
2024-12-30 08:26:40 +08:00
await Promise.all(
data.map(async (item) => {
2025-02-06 16:32:52 +08:00
if (staff && !item.visitorId) item.visitorId = staff.id;
2024-12-31 15:57:32 +08:00
const { postId, lectureId, messageId, visitorId } = item;
2024-12-30 08:26:40 +08:00
const existingVisit = await db.visit.findFirst({
where: {
visitorId,
2024-12-31 15:57:32 +08:00
OR: [{ postId }, { lectureId }, { messageId }],
2024-12-30 08:26:40 +08:00
},
});
if (existingVisit) {
updatePromises.push(
super.update({
where: { id: existingVisit.id },
data: {
...item,
views: existingVisit.views + 1,
},
}),
);
} else {
createData.push(item);
}
}),
);
// Execute all updates in parallel
await Promise.all(updatePromises);
// Create new visits for those not existing
if (createData.length > 0) {
return super.createMany({
...args,
data: createData,
});
}
return { count: updatePromises.length }; // Return the number of updates if no new creates
}
}