chore: add notif service for new criticisms ticket and subscribtion

This commit is contained in:
mahyargdz
2025-05-04 14:48:39 +03:30
parent 9d50578cc2
commit 170bb867d0
14 changed files with 236 additions and 93 deletions
@@ -1,35 +1,49 @@
import { BadRequestException, Injectable } from "@nestjs/common";
import { DataSource, QueryRunner } from "typeorm";
import { CommonMessage, CriticismMessage } from "../../../common/enums/message.enum";
import { NotificationsService } from "../../notifications/providers/notifications.service";
import { AdminsService } from "../../users/providers/admins.service";
import { UsersService } from "../../users/providers/users.service";
import { PaginationUtils } from "../../utils/providers/pagination.utils";
import { CreateCriticismDto } from "../DTO/create-criticism.dto";
import { SearchCriticismQueryDto } from "../DTO/search-criticism-query.dto";
import { Criticism } from "../entities/criticism.entity";
import { CriticismRepository } from "../repositories/criticisms.repository";
@Injectable()
export class CriticismsService {
constructor(
private readonly criticismRepository: CriticismRepository,
private readonly usersService: UsersService,
private readonly dataSource: DataSource,
private readonly adminsService: AdminsService,
private readonly notificationsService: NotificationsService,
) {}
async create(createDto: CreateCriticismDto, userId: string) {
const { user } = await this.usersService.findOneById(userId);
const files =
createDto.files?.map((file) => {
return { fileUrl: file };
}) || [];
const criticism = this.criticismRepository.create({
...createDto,
user,
files,
});
await this.criticismRepository.save(criticism);
return {
message: CommonMessage.CREATED,
criticism,
};
const queryRunner = this.dataSource.createQueryRunner();
try {
const user = await this.usersService.findOneByIdWithQueryRunner(userId, queryRunner);
const files =
createDto.files?.map((file) => {
return { fileUrl: file };
}) || [];
const criticism = queryRunner.manager.create(this.criticismRepository.target, { ...createDto, user, files });
await queryRunner.manager.save(this.criticismRepository.target, criticism);
await this.notifySuperAdmins(criticism, queryRunner);
await queryRunner.commitTransaction();
return {
message: CommonMessage.CREATED,
criticism,
};
} catch (error) {
await queryRunner.rollbackTransaction();
throw error;
} finally {
await queryRunner.release();
}
}
//##################################### ##
@@ -79,4 +93,21 @@ export class CriticismsService {
message: CommonMessage.DELETED,
};
}
private async notifySuperAdmins(criticism: Criticism, queryRunner: QueryRunner) {
const superAdmins = await this.adminsService.getSuperAdmins(queryRunner);
for (const admin of superAdmins) {
await this.notificationsService.createNewCriticismNotification(
admin.id,
{
fullName: `${criticism.user.firstName} ${criticism.user.lastName}`,
userPhone: criticism.user.phone,
userEmail: criticism.user.email,
title: criticism.title,
},
queryRunner,
);
}
}
}