notification

This commit is contained in:
2026-02-23 12:21:09 +03:30
parent 937b985229
commit 062c433ffb
7 changed files with 45 additions and 41 deletions
@@ -4,7 +4,7 @@ import { CommonMessage, CriticismMessage } from '../../../common/enums/message.e
import { NotificationQueueService } from '../../notification/services/notification-queue.service';
import { AdminRepository } from '../../admin/repositories/admin.repository';
import { PermissionEnum } from '../../../common/enums/permission.enum';
import { NotifEvent } from '../../notification/interfaces/notification.interface';
import { NotifTitle } from '../../notification/interfaces/notification.interface';
import { Notification } from '../../notification/entities/notification.entity';
import { CreateCriticismDto } from '../DTO/create-criticism.dto';
import { SearchCriticismQueryDto } from '../DTO/search-criticism-query.dto';
@@ -21,7 +21,7 @@ export class CriticismsService {
private readonly em: EntityManager,
private readonly adminRepository: AdminRepository,
private readonly notificationQueueService: NotificationQueueService,
) {}
) { }
async create(createDto: CreateCriticismDto, userId: string) {
return this.em.transactional(async (em) => {
@@ -119,7 +119,7 @@ export class CriticismsService {
const notifications = admins.map((admin) =>
em.create(Notification, {
admin,
title: NotifEvent.NEW_CRITICISM,
title: NotifTitle.NEW_CRITICISM,
content: body,
}),
);
@@ -129,7 +129,7 @@ export class CriticismsService {
await this.notificationQueueService.addBulkInAppNotifications(
notifications.map((n) => ({
recipient: { adminId: n.admin!.id },
subject: NotifEvent.NEW_CRITICISM,
subject: NotifTitle.NEW_CRITICISM,
body,
notificationId: n.id,
})),
@@ -1,7 +1,7 @@
import { Entity, Property, ManyToOne, Enum, PrimaryKey, OptionalProps } from '@mikro-orm/core';
import { BaseEntity } from '../../../common/entities/base.entity';
import { User } from '../../user/entities/user.entity';
import { NotifEvent } from '../interfaces/notification.interface';
import { NotifTitle } from '../interfaces/notification.interface';
import { Admin } from 'src/modules/admin/entities/admin.entity';
@Entity({ tableName: 'notifications' })
@@ -14,8 +14,8 @@ export class Notification extends BaseEntity {
@ManyToOne(() => Admin, { nullable: true })
admin?: Admin;
@Enum(() => NotifEvent)
title!: NotifEvent;
@Enum(() => NotifTitle)
title!: NotifTitle;
@Property()
content!: string;
@@ -1,4 +1,4 @@
import type { NotifEvent, recipientType } from './notification.interface';
import type { NotifTitle, recipientType } from './notification.interface';
export interface SmsNotificationQueueJob {
recipient: recipientType;
@@ -18,7 +18,7 @@ export interface PushNotificationQueueJob {
}
export interface InAppNotificationQueueJob {
recipient: { adminId: string; };
subject: NotifEvent;
subject: NotifTitle;
body: string;
notificationId: string;
}
@@ -4,18 +4,22 @@ export enum NotifChannelEnum {
PUSH = 'push',
}
export enum NotifEvent {
export enum NotifTitle {
NEW_REQUEST = 'newRequest',
INVOICED = 'invoiced',
NEW_ORDER = 'newOrder', // for chapkhane sms bere
DESIGNER_ASSIGN = 'designerAssign',
PAYMENT_SUCCESS = 'paymentSuccess',
NEW_INVOICE = 'newInvoice',
NEW_PAYMENT = 'newPayment',
NEW_ORDER = 'newOrder',
NEW_CRITICISM = 'newCriticism',
NEW_TICKET = 'newTicket',
NEW_ORDER_MESSAGE = 'newOrderMessage',
NEW_REQUEST_MESSAGE = 'newRequestMessage',
NEW_REQUEST_COMMENT = 'newRequestComment',
NEW_REQUEST_LIKE = 'newRequestLike',
}
export type recipientType = { userId: string } | { adminId: string };
export interface NotifRequestMessage {
title: NotifEvent;
title: NotifTitle;
content: string;
sms: {
templateId: string;
@@ -35,23 +39,23 @@ interface INotifySmsPayload {
}
interface INotifySms {
phone: string;
subject: NotifEvent;
subject: NotifTitle;
}
export interface IInAppNotificationPayload {
notificationId: string;
subject: NotifEvent;
subject: NotifTitle;
body: string;
}
// 2. Payment Success
interface IPaymentSuccessSmsNotifyPayload extends INotifySmsPayload {
amount: number;
date: Date;
}
// // 2. Payment Success
// interface IPaymentSuccessSmsNotifyPayload extends INotifySmsPayload {
// amount: number;
// date: Date;
// }
interface IPaymentSuccessSmsNotify extends INotifySms {
subject: NotifEvent.PAYMENT_SUCCESS;
payload: IPaymentSuccessSmsNotifyPayload;
}
// interface IPaymentSuccessSmsNotify extends INotifySms {
// subject: NotifEvent.PAYMENT_SUCCESS;
// payload: IPaymentSuccessSmsNotifyPayload;
// }
export type ISmsNotifyPayload = IPaymentSuccessSmsNotify;
// export type ISmsNotifyPayload = IPaymentSuccessSmsNotify;
@@ -3,7 +3,7 @@ import { EntityManager, FilterQuery } from '@mikro-orm/postgresql';
import { Notification } from '../entities/notification.entity';
import { NotificationQueueService } from './notification-queue.service';
import { NotificationsGateway } from '../notifications.gateway';
import { NotifChannelEnum, NotifRequest, NotifEvent } from '../interfaces/notification.interface';
import { NotifChannelEnum, NotifRequest, NotifTitle } from '../interfaces/notification.interface';
import { SmsLogRepository } from '../repositories/sms-log.repository';
import { Admin } from '../../admin/entities/admin.entity';
import { User } from '../../user/entities/user.entity';
@@ -41,13 +41,13 @@ export class NotificationService {
if (channels.includes(NotifChannelEnum.IN_APP)) {
const adminNotifications = notifications
.filter(n => n.admin?.id)
.map(notification => ({
recipient: { adminId: notification.admin!.id },
subject: message.title,
body: message.content,
notificationId: notification.id,
}))
.filter(n => n.admin?.id)
.map(notification => ({
recipient: { adminId: notification.admin!.id },
subject: message.title,
body: message.content,
notificationId: notification.id,
}))
if (adminNotifications.length > 0) {
await this.queueService.addBulkInAppNotifications(adminNotifications);
@@ -71,7 +71,7 @@ export class NotificationService {
async createAdminBulkNotifications(
params: {
title: NotifEvent;
title: NotifTitle;
content: string;
adminId: string | null;
userId: string | null;
@@ -3,7 +3,7 @@ import { OnEvent } from '@nestjs/event-emitter';
import { AdminRepository } from 'src/modules/admin/repositories/admin.repository';
import { OrderCreatedEvent, OrderStatusChangedEvent } from '../events/order.events';
import { PermissionEnum } from 'src/common/enums/permission.enum';
import { NotifEvent } from 'src/modules/notification/interfaces/notification.interface';
import { NotifTitle } from 'src/modules/notification/interfaces/notification.interface';
import { NotificationService } from 'src/modules/notification/services/notification.service';
import { ConfigService } from '@nestjs/config';
import { OrderRepository } from '../repositories/order.repository';
@@ -4,7 +4,7 @@ import { EntityManager } from '@mikro-orm/postgresql';
import { AdminRepository } from 'src/modules/admin/repositories/admin.repository';
import { onlinePaymentSucceedEvent } from '../events/payment.events';
import { PermissionEnum } from 'src/common/enums/permission.enum';
import { NotifEvent } from 'src/modules/notification/interfaces/notification.interface';
import { NotifTitle } from 'src/modules/notification/interfaces/notification.interface';
import { Notification } from 'src/modules/notification/entities/notification.entity';
import { NotificationQueueService } from 'src/modules/notification/services/notification-queue.service';
@@ -16,7 +16,7 @@ export class PaymentListeners {
private readonly adminRepository: AdminRepository,
private readonly em: EntityManager,
private readonly notificationQueueService: NotificationQueueService,
) {}
) { }
@OnEvent(onlinePaymentSucceedEvent.name)
async handleOnlinePaymentVerified(event: InstanceType<typeof onlinePaymentSucceedEvent>) {
@@ -39,7 +39,7 @@ export class PaymentListeners {
const notifications = admins.map((admin) =>
this.em.create(Notification, {
admin,
title: NotifEvent.PAYMENT_SUCCESS,
title: NotifTitle.NEW_PAYMENT,
content: body,
}),
);
@@ -49,7 +49,7 @@ export class PaymentListeners {
await this.notificationQueueService.addBulkInAppNotifications(
notifications.map((n) => ({
recipient: { adminId: n.admin!.id },
subject: NotifEvent.PAYMENT_SUCCESS,
subject: NotifTitle.NEW_PAYMENT,
body,
notificationId: n.id,
})),