order and payment notifs

This commit is contained in:
2025-12-20 21:46:15 +03:30
parent e0df01053b
commit cb532a7941
5 changed files with 47 additions and 20 deletions
@@ -5,6 +5,7 @@ export class OrderCreatedEvent {
public readonly orderId: string, public readonly orderId: string,
public readonly restaurantId: string, public readonly restaurantId: string,
public readonly orderNumber: string, public readonly orderNumber: string,
public readonly total: number,
) {} ) {}
} }
@@ -13,13 +13,15 @@ import { OrderStatus } from '../interface/order.interface';
export class OrderListeners { export class OrderListeners {
private readonly logger = new Logger(OrderListeners.name); private readonly logger = new Logger(OrderListeners.name);
private orderCreatedSmsTemplateId: string; private orderCreatedSmsTemplateId: string;
private orderStatusChangedSmsTemplateId: string;
constructor( constructor(
private readonly adminService: AdminRepository, private readonly adminService: AdminRepository,
private readonly OrderRepository: OrderRepository, private readonly OrderRepository: OrderRepository,
private readonly notificationService: NotificationService, private readonly notificationService: NotificationService,
private readonly configService: ConfigService, private readonly configService: ConfigService,
) { ) {
this.orderCreatedSmsTemplateId = this.configService.get<string>('ORDER_CREATED_SMS_TEMPLATE_ID') ?? '123'; this.orderCreatedSmsTemplateId = this.configService.get<string>('SMS_PATTERN_ORDER_CREATED') ?? '123';
this.orderStatusChangedSmsTemplateId = this.configService.get<string>('SMS_PATTERN_ORDER_STATUS_CHANGE') ?? '123';
} }
@OnEvent(OrderCreatedEvent.name) @OnEvent(OrderCreatedEvent.name)
@@ -37,20 +39,21 @@ export class OrderListeners {
restaurantId: event.restaurantId, restaurantId: event.restaurantId,
message: { message: {
title: NotifTitleEnum.ORDER_CREATED, title: NotifTitleEnum.ORDER_CREATED,
content: `Order ${event.orderNumber} has been created successfully`, content: `Order ${event.orderNumber} with ${event.total} has been created successfully`,
sms: { sms: {
templateId: this.orderCreatedSmsTemplateId, templateId: this.orderCreatedSmsTemplateId,
parameters: { parameters: {
orderNumber: event.orderNumber, orderNumber: event.orderNumber,
total: event.total.toString(),
}, },
}, },
pushNotif: { pushNotif: {
title: `Order ${event.orderNumber} has been created successfully`, title: `Order ${event.orderNumber} with ${event.total} has been created successfully`,
content: `Order ${event.orderNumber} has been created successfully`, content: `Order ${event.orderNumber} with ${event.total} has been created successfully`,
icon: `Order ${event.orderNumber} has been created successfully`, icon: `/`,
action: { action: {
type: `Order ${event.orderNumber} has been created successfully`, type: NotifTitleEnum.ORDER_CREATED,
url: `Order ${event.orderNumber} has been created successfully`, url: `/`,
}, },
}, },
}, },
@@ -90,7 +93,26 @@ export class OrderListeners {
]; ];
await this.notificationService.sendNotification({ await this.notificationService.sendNotification({
restaurantId: event.restaurantId, restaurantId: event.restaurantId,
message: this.factory(event.newStatus, event)?.message, message: {
title: NotifTitleEnum.ORDER_STATUS_CHANGED,
content: `Order #${event.orderNumber} status is changed to ${event.newStatus} .`,
sms: {
templateId: this.orderStatusChangedSmsTemplateId,
parameters: {
orderNumber: event.orderNumber,
status: event.newStatus,
},
},
pushNotif: {
title: `Order #${event.orderNumber} status is changed to ${event.newStatus} .`,
content: `Order #${event.orderNumber} status is changed to ${event.newStatus} .`,
icon: `/`,
action: {
type: NotifTitleEnum.ORDER_STATUS_CHANGED,
url: ``,
},
},
},
recipients, recipients,
metadata: { metadata: {
priority: 1, priority: 1,
@@ -56,7 +56,7 @@ export class OrdersService {
private readonly paymentsService: PaymentsService, private readonly paymentsService: PaymentsService,
private readonly inventoryService: InventoryService, private readonly inventoryService: InventoryService,
private readonly eventEmitter: EventEmitter2, private readonly eventEmitter: EventEmitter2,
) {} ) { }
async checkout(userId: string, restaurantId: string) { async checkout(userId: string, restaurantId: string) {
const cart = await this.cartService.findOneOrFail(userId, restaurantId); const cart = await this.cartService.findOneOrFail(userId, restaurantId);
@@ -133,7 +133,7 @@ export class OrdersService {
const { paymentUrl } = await this.paymentsService.payOrder(order.id); const { paymentUrl } = await this.paymentsService.payOrder(order.id);
this.eventEmitter.emit( this.eventEmitter.emit(
OrderCreatedEvent.name, OrderCreatedEvent.name,
new OrderCreatedEvent(order.id, restaurantId, String(order?.orderNumber) || ''), new OrderCreatedEvent(order.id, restaurantId, String(order?.orderNumber) || '', order.total),
); );
return { paymentUrl, order }; return { paymentUrl, order };
@@ -1,8 +1,12 @@
import { PaymentMethodEnum } from "../interface/payment";
export class paymentSucceedEvent { export class paymentSucceedEvent {
constructor( constructor(
public readonly orderId: string, public readonly orderId: string,
public readonly restaurantId: string, public readonly restaurantId: string,
public readonly orderNumber: string, public readonly orderNumber: string,
public readonly paymentMethod: PaymentMethodEnum,
public readonly total:number
) {} ) {}
} }
@@ -10,14 +10,14 @@ import { ConfigService } from '@nestjs/config';
@Injectable() @Injectable()
export class OrderListeners { export class OrderListeners {
private readonly logger = new Logger(OrderListeners.name); private readonly logger = new Logger(OrderListeners.name);
private orderCreatedSmsTemplateId: string; private paymentSuccessSmsTemplateId: string;
constructor( constructor(
private readonly adminService: AdminRepository, private readonly adminService: AdminRepository,
private readonly notificationService: NotificationService, private readonly notificationService: NotificationService,
private readonly configService: ConfigService, private readonly configService: ConfigService,
// private readonly orderSer // private readonly orderSer
) { ) {
this.orderCreatedSmsTemplateId = this.configService.get<string>('ORDER_CREATED_SMS_TEMPLATE_ID') ?? '123'; this.paymentSuccessSmsTemplateId = this.configService.get<string>('SMS_PATTERN_PAYMENT_SUCCESS') ?? '123';
} }
@OnEvent(paymentSucceedEvent.name) @OnEvent(paymentSucceedEvent.name)
@@ -35,21 +35,21 @@ export class OrderListeners {
await this.notificationService.sendNotification({ await this.notificationService.sendNotification({
restaurantId: event.restaurantId, restaurantId: event.restaurantId,
message: { message: {
title: NotifTitleEnum.ORDER_CREATED, title: NotifTitleEnum.PAYMENT_SUCCESS,
content: `payment order #${event.orderNumber} has been paid successfully`, content: `payment order #${event.orderNumber} has been paid successfully with ${event.paymentMethod} method and total amount of ${event.total}`,
sms: { sms: {
templateId: this.orderCreatedSmsTemplateId, templateId: this.paymentSuccessSmsTemplateId,
parameters: { parameters: {
orderNumber: event.orderNumber, orderNumber: event.orderNumber,
}, },
}, },
pushNotif: { pushNotif: {
title: `Payment Order ${event.orderNumber} has been paid successfully`, title: `Payment Order ${event.orderNumber} has been paid successfully with ${event.paymentMethod} method and total amount of ${event.total} `,
content: `Payment Order ${event.orderNumber} has been paid successfully`, content: `Payment Order ${event.orderNumber} has been paid successfully with ${event.paymentMethod} method and total amount of ${event.total} `,
icon: `Payment Order ${event.orderNumber} has been paid successfully`, icon: ``,
action: { action: {
type: `Payment Order ${event.orderNumber} has been paid successfully`, type: NotifTitleEnum.PAYMENT_SUCCESS,
url: `Payment Order ${event.orderNumber} has been paid successfully`, url: `/`,
}, },
}, },
}, },