notif after request

This commit is contained in:
2026-02-23 12:40:48 +03:30
parent 062c433ffb
commit 8cd66303e2
4 changed files with 88 additions and 2 deletions
@@ -0,0 +1,7 @@
export class RequestCreatedEvent {
constructor(
public readonly requestId: string,
public readonly requestNumber: number,
public readonly userId: string,
) {}
}
@@ -0,0 +1,67 @@
import { Injectable, Logger } from '@nestjs/common';
import { OnEvent } from '@nestjs/event-emitter';
import { ConfigService } from '@nestjs/config';
import { AdminRepository } from 'src/modules/admin/repositories/admin.repository';
import { PermissionEnum } from 'src/common/enums/permission.enum';
import { NotificationService } from 'src/modules/notification/services/notification.service';
import { NotifChannelEnum, NotifTitle } from 'src/modules/notification/interfaces/notification.interface';
import { RequestCreatedEvent } from '../events/request.events';
@Injectable()
export class RequestListeners {
private readonly logger = new Logger(RequestListeners.name);
private newRequestSmsTemplateId: string;
constructor(
private readonly adminRepository: AdminRepository,
private readonly notificationService: NotificationService,
private readonly configService: ConfigService,
) {
this.newRequestSmsTemplateId =
this.configService.get<string>('SMS_PATTERN_NEW_REQUEST') ?? 'new-request';
}
@OnEvent(RequestCreatedEvent.name)
async handleRequestCreated(event: RequestCreatedEvent) {
try {
this.logger.log(
`Request created event: requestId=${event.requestId}, requestNumber=${event.requestNumber}, userId=${event.userId}`,
);
const admins = await this.adminRepository.findAdminsWithPermission(
PermissionEnum.NEW_REQUEST_NOTIFICATION,
);
if (admins.length === 0) {
this.logger.log('No admins with NEW_REQUEST_NOTIFICATION permission');
return;
}
const body = `درخواست جدید شماره ${event.requestNumber}`;
await this.notificationService.sendNotification({
channels: [NotifChannelEnum.SMS],
recipients: admins.map((admin) => ({ adminId: admin.id })),
message: {
title: NotifTitle.NEW_REQUEST,
content: body,
sms: {
templateId: this.newRequestSmsTemplateId,
parameters: {
requestNumber: String(event.requestNumber),
},
},
},
});
this.logger.log(
`SMS notification sent for ${admins.length} admin(s) for new request ${event.requestId}`,
);
} catch (error) {
this.logger.error(
`Failed to send notification for request created: ${event.requestId}`,
error instanceof Error ? error.stack : String(error),
);
}
}
}
+7 -2
View File
@@ -10,6 +10,9 @@ import { ProductModule } from '../product/product.module';
import { FormBuilderModule } from '../form-builder/form-builder.module';
import { AuthModule } from '../auth/auth.module';
import { JwtModule } from '@nestjs/jwt';
import { AdminModule } from '../admin/admin.module';
import { NotificationsModule } from '../notification/notifications.module';
import { RequestListeners } from './listeners/request.listeners';
@Module({
imports: [
@@ -18,9 +21,11 @@ import { JwtModule } from '@nestjs/jwt';
ProductModule,
FormBuilderModule,
JwtModule,
AuthModule
AuthModule,
AdminModule,
NotificationsModule,
],
controllers: [RequestController],
providers: [RequestService, RequestRepository],
providers: [RequestService, RequestRepository, RequestListeners],
})
export class RequestModule {}
+7
View File
@@ -1,5 +1,6 @@
import { Injectable, NotFoundException, BadRequestException } from '@nestjs/common';
import { EntityManager } from '@mikro-orm/postgresql';
import { EventEmitter2 } from '@nestjs/event-emitter';
import { CreateRequestDto } from './dto/create-request.dto';
import { UpdateRequestDto } from './dto/update-request.dto';
import { FindRequestsDto } from './dto/find-requests.dto';
@@ -10,6 +11,7 @@ import { UserService } from '../user/providers/user.service';
import { ProductService } from '../product/providers/product.service';
import { FieldRepository } from '../form-builder/repository/field.repository';
import { RequestRepository } from './repositories/request.repository';
import { RequestCreatedEvent } from './events/request.events';
@Injectable()
export class RequestService {
@@ -19,6 +21,7 @@ export class RequestService {
private readonly userService: UserService,
private readonly productService: ProductService,
private readonly fieldRepository: FieldRepository,
private readonly eventEmitter: EventEmitter2,
) { }
async create(createRequestDto: CreateRequestDto, userId: string) {
@@ -47,6 +50,10 @@ export class RequestService {
}
await em.flush();
this.eventEmitter.emit(
RequestCreatedEvent.name,
new RequestCreatedEvent(request.id, request.requestNumber, user.id),
);
return request;
});
}