collect-system/apps/server/src/models/message/message.service.ts

58 lines
1.6 KiB
TypeScript
Executable File

import { Injectable } from '@nestjs/common';
import { UserProfile, db, Prisma, VisitType, ObjectType } from '@nice/common';
import { BaseService } from '../base/base.service';
import EventBus, { CrudOperation } from '@server/utils/event-bus';
import { setMessageRelation } from './utils';
@Injectable()
export class MessageService extends BaseService<Prisma.MessageDelegate> {
constructor() {
super(db, ObjectType.MESSAGE);
}
async create(args: Prisma.MessageCreateArgs, params?: { tx?: Prisma.MessageDelegate, staff?: UserProfile }) {
args.data!.senderId = params?.staff?.id;
args.include = {
receivers: {
select: { id: true, registerToken: true, username: true }
}
}
const result = await super.create(args);
EventBus.emit("dataChanged", {
type: ObjectType.MESSAGE,
operation: CrudOperation.CREATED,
data: result
})
return result
}
async findManyWithCursor(
args: Prisma.MessageFindManyArgs,
staff?: UserProfile,
) {
return this.wrapResult(super.findManyWithCursor(args), async (result) => {
let { items } = result;
await Promise.all(
items.map(async (item) => {
await setMessageRelation(item, staff);
}),
);
return { ...result, items };
});
}
async getUnreadCount(staff?: UserProfile) {
const count = await db.message.count({
where: {
receivers: { some: { id: staff?.id } },
visits: {
none: {
visitorId: staff?.id,
type: VisitType.READED
}
}
}
})
return count
}
}