chat notification
This commit is contained in:
@@ -6,6 +6,8 @@ import { Order } from 'src/modules/order/entities/order.entity';
|
|||||||
import { NotificationService } from 'src/modules/notification/services/notification.service';
|
import { NotificationService } from 'src/modules/notification/services/notification.service';
|
||||||
import { NotifChannelEnum, NotifTitle } from 'src/modules/notification/interfaces/notification.interface';
|
import { NotifChannelEnum, NotifTitle } from 'src/modules/notification/interfaces/notification.interface';
|
||||||
import { ChatCreatedByAdminEvent } from '../events/chat.events';
|
import { ChatCreatedByAdminEvent } from '../events/chat.events';
|
||||||
|
import { PermissionEnum } from 'src/common/enums/permission.enum';
|
||||||
|
import { AdminRepository } from 'src/modules/admin/repositories/admin.repository';
|
||||||
|
|
||||||
@Injectable()
|
@Injectable()
|
||||||
export class ChatListeners {
|
export class ChatListeners {
|
||||||
@@ -14,7 +16,8 @@ export class ChatListeners {
|
|||||||
constructor(
|
constructor(
|
||||||
private readonly em: EntityManager,
|
private readonly em: EntityManager,
|
||||||
private readonly notificationService: NotificationService,
|
private readonly notificationService: NotificationService,
|
||||||
) {}
|
private readonly adminRepository: AdminRepository,
|
||||||
|
) { }
|
||||||
|
|
||||||
@OnEvent(ChatCreatedByAdminEvent.name)
|
@OnEvent(ChatCreatedByAdminEvent.name)
|
||||||
async handleChatCreatedByAdmin(event: ChatCreatedByAdminEvent) {
|
async handleChatCreatedByAdmin(event: ChatCreatedByAdminEvent) {
|
||||||
@@ -57,6 +60,46 @@ export class ChatListeners {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@OnEvent(ChatCreatedByAdminEvent.name)
|
||||||
|
async handleChatCreatedByUser(event: ChatCreatedByAdminEvent) {
|
||||||
|
try {
|
||||||
|
this.logger.log(
|
||||||
|
`Chat created by admin: refId=${event.refId}, chatId=${event.chatId}`,
|
||||||
|
);
|
||||||
|
|
||||||
|
const adminIds = await this.findAdminByRefId(event.refId);
|
||||||
|
if (adminIds.length === 0) {
|
||||||
|
this.logger.warn(
|
||||||
|
`No admins found for refId=${event.refId}, skipping notification`,
|
||||||
|
);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
const body = 'پیام جدید از پشتیبانی برای شما ارسال شده است.';
|
||||||
|
|
||||||
|
await this.notificationService.sendNotification({
|
||||||
|
channels: [NotifChannelEnum.SMS],
|
||||||
|
recipients: adminIds.map(id => ({ adminId: id })),
|
||||||
|
message: {
|
||||||
|
title: NotifTitle.NEW_TICKET,
|
||||||
|
content: body,
|
||||||
|
sms: {
|
||||||
|
templateId: '',
|
||||||
|
parameters: {},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
});
|
||||||
|
|
||||||
|
this.logger.log(
|
||||||
|
`Notification sent to user ${adminIds} for admin chat on refId=${event.refId}`,
|
||||||
|
);
|
||||||
|
} catch (error) {
|
||||||
|
this.logger.error(
|
||||||
|
`Failed to send notification for chat created by admin: refId=${event.refId}`,
|
||||||
|
error instanceof Error ? error.stack : String(error),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
/**
|
/**
|
||||||
* Find the user associated with refId: first search in requests, then in orders.
|
* Find the user associated with refId: first search in requests, then in orders.
|
||||||
*/
|
*/
|
||||||
@@ -81,4 +124,26 @@ export class ChatListeners {
|
|||||||
|
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private async findAdminByRefId(refId: string): Promise<string[]> {
|
||||||
|
|
||||||
|
const admins = await this.adminRepository.findAdminsWithPermission(
|
||||||
|
PermissionEnum.NEW_REQUEST_NOTIFICATION,
|
||||||
|
);
|
||||||
|
|
||||||
|
if (admins.length) {
|
||||||
|
return admins.map(admin => admin.id);
|
||||||
|
}
|
||||||
|
|
||||||
|
const order = await this.em.findOne(
|
||||||
|
Order,
|
||||||
|
{ id: refId },
|
||||||
|
{ populate: ['designer'], fields: ['id', 'designer'] },
|
||||||
|
);
|
||||||
|
if (order?.designer?.id) {
|
||||||
|
return [order?.designer?.id]
|
||||||
|
}
|
||||||
|
|
||||||
|
return [];
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -13,8 +13,6 @@ export enum NotifTitle {
|
|||||||
NEW_TICKET = 'newTicket',
|
NEW_TICKET = 'newTicket',
|
||||||
NEW_ORDER_MESSAGE = 'newOrderMessage',
|
NEW_ORDER_MESSAGE = 'newOrderMessage',
|
||||||
NEW_REQUEST_MESSAGE = 'newRequestMessage',
|
NEW_REQUEST_MESSAGE = 'newRequestMessage',
|
||||||
NEW_REQUEST_COMMENT = 'newRequestComment',
|
|
||||||
NEW_REQUEST_LIKE = 'newRequestLike',
|
|
||||||
}
|
}
|
||||||
export type recipientType = { userId: string } | { adminId: string };
|
export type recipientType = { userId: string } | { adminId: string };
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user