ticket
This commit is contained in:
+119
@@ -0,0 +1,119 @@
|
||||
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";
|
||||
|
||||
@Injectable()
|
||||
export class TicketsRepository extends Repository<Ticket> {
|
||||
constructor(@InjectRepository(Ticket) ticketsRepository: Repository<Ticket>) {
|
||||
super(ticketsRepository.target, ticketsRepository.manager, ticketsRepository.queryRunner);
|
||||
}
|
||||
|
||||
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();
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user