This commit is contained in:
2026-01-14 15:08:54 +03:30
parent 081f2cf4a7
commit 209a4fc723
16 changed files with 861 additions and 952 deletions
@@ -1,119 +1,13 @@
import { Injectable } from "@nestjs/common";
import { InjectRepository } from "@nestjs/typeorm";
import { Repository } from "typeorm";
import { PaginationUtils } from "../../utils/providers/pagination.utils";
import { SearchTicketQueryDto } from "../DTO/search-ticket-query.dto";
import { Ticket } from "../entities/ticket.entity";
import { TicketStatus } from "../enums/ticket-status.enum";
import { EntityManager, EntityRepository } from '@mikro-orm/postgresql';
import { Injectable } from '@nestjs/common';
import { Ticket } from '../entities/ticket.entity';
@Injectable()
export class TicketsRepository extends Repository<Ticket> {
constructor(@InjectRepository(Ticket) ticketsRepository: Repository<Ticket>) {
super(ticketsRepository.target, ticketsRepository.manager, ticketsRepository.queryRunner);
export class TicketRepository extends EntityRepository<Ticket> {
constructor(
readonly em: EntityManager,
) {
super(em, Ticket);
}
async findTicketById(id: string, userId?: string): Promise<Ticket | null> {
return this.findOne({
where: { id, ...(userId && { user: { id: userId } }) },
relations: {
user: true,
category: true,
assignedTo: true,
danakService: true,
},
select: {
id: true,
numericId: true,
danakService: {
id: true,
name: true,
},
subject: true,
priority: true,
status: true,
createdAt: true,
user: {
id: true,
firstName: true,
lastName: true,
},
assignedTo: {
id: true,
firstName: true,
lastName: true,
},
category: {
id: true,
title: true,
},
},
});
}
//******************************** */
async findTicketsList(queryDto: SearchTicketQueryDto, userId: string) {
const { limit, skip } = PaginationUtils(queryDto);
const queryBuilder = this.createQueryBuilder("ticket")
.leftJoinAndSelect("ticket.category", "category")
.leftJoinAndSelect("ticket.danakService", "danakService")
.where("ticket.user.id = :userId", { userId })
.orderBy("ticket.createdAt", "DESC")
.select([
"ticket.id",
"ticket.subject",
"ticket.status",
"ticket.priority",
"ticket.numericId",
"ticket.createdAt",
"ticket.updatedAt",
"category.id",
"category.title",
"danakService.id",
"danakService.name",
])
.skip(skip)
.take(limit);
if (queryDto.status) {
queryBuilder.andWhere("ticket.status = :status", {
status: queryDto.status,
});
} else {
queryBuilder.andWhere("ticket.status != :closedStatus", {
closedStatus: TicketStatus.CLOSED,
});
}
return queryBuilder.getManyAndCount();
}
async findTicketsListForAdmin(queryDto: SearchTicketQueryDto, adminId: string, isSuperAdmin: boolean) {
const { limit, skip } = PaginationUtils(queryDto);
const queryBuilder = this.createQueryBuilder("ticket")
.leftJoinAndSelect("ticket.category", "category")
.leftJoinAndSelect("ticket.user", "user")
.leftJoinAndSelect("ticket.assignedTo", "assignedTo")
.leftJoinAndSelect("ticket.danakService", "danakService")
.orderBy("ticket.createdAt", "DESC");
if (!isSuperAdmin) {
queryBuilder.andWhere("ticket.assignedToId = :adminId", { adminId });
}
if (queryDto.status) {
queryBuilder.andWhere("ticket.status = :status", {
status: queryDto.status,
});
}
if (queryDto.userId) {
queryBuilder.andWhere("user.id = :userId", { userId: queryDto.userId });
}
return queryBuilder.skip(skip).take(limit).getManyAndCount();
}
}