diff --git a/src/modules/announcements/announcement.service.ts b/src/modules/announcements/announcement.service.ts index 7692e53..6b80dc5 100644 --- a/src/modules/announcements/announcement.service.ts +++ b/src/modules/announcements/announcement.service.ts @@ -67,7 +67,7 @@ export class AnnouncementService { const [announcements, count] = await queryBuilder.skip(skip).take(limit).getManyAndCount(); - return { announcements, count }; + return { announcements, count, paginate: true }; } async getAllAnnouncementsByUser(queryDto: SearchAnnouncementQueryDto, userId: string) { diff --git a/src/modules/criticisms/providers/criticisms.service.ts b/src/modules/criticisms/providers/criticisms.service.ts index 84ac167..795d3ab 100644 --- a/src/modules/criticisms/providers/criticisms.service.ts +++ b/src/modules/criticisms/providers/criticisms.service.ts @@ -52,6 +52,7 @@ export class CriticismsService { return { criticisms, count, + paginate: true, }; } diff --git a/src/modules/danak-services/providers/danak-services.service.ts b/src/modules/danak-services/providers/danak-services.service.ts index 73c7ad0..230df4f 100644 --- a/src/modules/danak-services/providers/danak-services.service.ts +++ b/src/modules/danak-services/providers/danak-services.service.ts @@ -75,7 +75,7 @@ export class DanakServicesService { const [categories, count] = await queryBuilder.skip(skip).take(limit).getManyAndCount(); - return { categories, count }; + return { categories, count, paginate: true }; } /******************************************** */ diff --git a/src/modules/tickets/providers/tickets.service.ts b/src/modules/tickets/providers/tickets.service.ts index bd9acc8..5af0739 100644 --- a/src/modules/tickets/providers/tickets.service.ts +++ b/src/modules/tickets/providers/tickets.service.ts @@ -3,6 +3,8 @@ import { Not } from "typeorm"; import { ParamDto } from "../../../common/DTO/param.dto"; import { CommonMessage, TicketMessageEnum } from "../../../common/enums/message.enum"; +import { Role } from "../../users/entities/role.entity"; +import { RoleEnum } from "../../users/enums/role.enum"; import { UsersService } from "../../users/providers/users.service"; import { PaginationUtils } from "../../utils/providers/pagination.utils"; import { CreateTicketCategoryDto } from "../DTO/create-ticket-category.dto"; @@ -12,6 +14,7 @@ import { SearchTicketCategoryDto } from "../DTO/search-ticket-category.dto"; import { SearchTicketQueryDto } from "../DTO/search-ticket-query.dto"; import { UpdateTicketCategoryDto } from "../DTO/update-ticket-category.dto"; import { TicketMessage } from "../entities/ticket-message.entity"; +import { Ticket } from "../entities/ticket.entity"; import { TicketStatus } from "../enums/ticket-status.enum"; import { TicketCategoryRepository } from "../repositories/tickets-category.repository"; import { TicketMessagesRepository } from "../repositories/tickets-message.repository"; @@ -27,7 +30,7 @@ export class TicketsService { ) {} //******************************** */ async getTicketCategories() { - const ticketCategories = await this.ticketsCategoryRepository.find({ relations: { group: true } }); + const ticketCategories = await this.ticketsCategoryRepository.find({}); return { ticketCategories, }; @@ -56,7 +59,7 @@ export class TicketsService { const [categories, count] = await queryBuilder.skip(skip).take(limit).getManyAndCount(); - return { categories, count }; + return { categories, count, paginate: true }; } //******************************** */ async createTicketCategory(createDto: CreateTicketCategoryDto) { @@ -115,7 +118,6 @@ export class TicketsService { return { message: TicketMessageEnum.CREATED, - ticket, }; } @@ -131,7 +133,7 @@ export class TicketsService { }, relations: { category: true, - user: true, + // user: true, }, order: { createdAt: "DESC" as const, @@ -142,18 +144,23 @@ export class TicketsService { const [tickets, count] = await this.ticketsRepository.findAndCount(findOptions); - return { - tickets, - count, - }; + return { tickets, count, paginate: true }; } //******************************** */ - async createTicketMessage(ticketId: string, createDto: CreateTicketMessageDto, userId: string) { - const ticket = await this.ticketsRepository.findTicketById(ticketId, userId); + async createTicketMessage(ticketId: string, createDto: CreateTicketMessageDto, userId: string, role: Role) { + const userRole = role as unknown as RoleEnum; + let ticket: null | Ticket = null; + + if (userRole === RoleEnum.ADMIN) { + ticket = await this.ticketsRepository.findTicketById(ticketId); + } else { + ticket = await this.ticketsRepository.findTicketById(ticketId, userId); + } + if (!ticket) throw new BadRequestException(TicketMessageEnum.TICKET_NOT_FOUND); - // + const { user } = await this.usersService.findOneById(userId); const ticketMessage = this.ticketMessagesRepository.create({ ...createDto, author: user, ticket }); @@ -162,26 +169,43 @@ export class TicketsService { return { message: TicketMessageEnum.MESSAGE_CREATED, - ticketMessage, + // ticketMessage, }; } //******************************** */ - async getTicketMessages(ticketId: string, userId: string) { - const ticket = await this.ticketsRepository.findTicketById(ticketId, userId); + async getTicketMessages(ticketId: string, userId: string, role: Role) { + const userRole = role as unknown as RoleEnum; + let ticket: null | Ticket = null; + + // + if (userRole === RoleEnum.ADMIN) { + ticket = await this.ticketsRepository.findTicketById(ticketId); + } else { + ticket = await this.ticketsRepository.findTicketById(ticketId, userId); + } if (!ticket) throw new BadRequestException(TicketMessageEnum.TICKET_NOT_FOUND); const messages = await this.ticketMessagesRepository.findMessagesByTicketId(ticketId); return { + ticket, messages, }; } //******************************** */ - async closeTicketByUser(ticketId: string, userId: string) { - const ticket = await this.ticketsRepository.findTicketById(ticketId, userId); + async closeTicketByUser(ticketId: string, userId: string, role: Role) { + const userRole = role as unknown as RoleEnum; + let ticket: null | Ticket = null; + + if (userRole === RoleEnum.ADMIN) { + ticket = await this.ticketsRepository.findTicketById(ticketId); + } else { + ticket = await this.ticketsRepository.findTicketById(ticketId, userId); + } + if (!ticket) throw new BadRequestException(TicketMessageEnum.TICKET_NOT_FOUND); ticket.status = TicketStatus.CLOSED; diff --git a/src/modules/tickets/repositories/tickets-message.repository.ts b/src/modules/tickets/repositories/tickets-message.repository.ts index 4f70570..1c028f8 100644 --- a/src/modules/tickets/repositories/tickets-message.repository.ts +++ b/src/modules/tickets/repositories/tickets-message.repository.ts @@ -14,19 +14,23 @@ export class TicketMessagesRepository extends Repository { return this.find({ relations: { author: true, - ticket: true, + // ticket: true, + }, + select: { + id: true, + content: true, + attachmentUrl: true, + createdAt: true, + author: { + id: true, + firstName: true, + lastName: true, + role: { + id: true, + name: false, + }, + }, }, - // select: { - // id: true, - // content: true, - // attachmentUrl: true, - // createdAt: true, - // author: { - // id: true, - // firstName: true, - // lastName: true, - // }, - // }, where: { ticket: { id: ticketId } }, order: { createdAt: "DESC" }, }); diff --git a/src/modules/tickets/repositories/tickets.repository.ts b/src/modules/tickets/repositories/tickets.repository.ts index dbd99c2..3dd4eda 100644 --- a/src/modules/tickets/repositories/tickets.repository.ts +++ b/src/modules/tickets/repositories/tickets.repository.ts @@ -10,7 +10,7 @@ export class TicketsRepository extends Repository { super(ticketsRepository.target, ticketsRepository.manager, ticketsRepository.queryRunner); } - async findTicketById(id: string, userId: string): Promise { - return this.findOneBy({ id, user: { id: userId } }); + async findTicketById(id: string, userId?: string): Promise { + return this.findOneBy({ id, ...(userId && { user: { id: userId } }) }); } } diff --git a/src/modules/tickets/tickets.controller.ts b/src/modules/tickets/tickets.controller.ts index fa809f7..a63fff3 100644 --- a/src/modules/tickets/tickets.controller.ts +++ b/src/modules/tickets/tickets.controller.ts @@ -39,9 +39,9 @@ export class TicketsController { return this.ticketsService.updateCategory(paramDto, updateCategoryDto); } - @ApiOperation({ summary: "Get ticket categories => admin route" }) + @ApiOperation({ summary: "Get ticket categories " }) @AuthGuards() - @Roles(RoleEnum.ADMIN) + @Roles(RoleEnum.ADMIN, RoleEnum.USER) @Get("categories") getTicketCategories() { return this.ticketsService.getTicketCategories(); @@ -89,22 +89,22 @@ export class TicketsController { @Roles(RoleEnum.USER, RoleEnum.ADMIN) @Post(":id/messages") createTicketMessage(@Param() paramDto: ParamDto, @Body() createDto: CreateTicketMessageDto, @UserDec() user: User) { - return this.ticketsService.createTicketMessage(paramDto.id, createDto, user.id); + return this.ticketsService.createTicketMessage(paramDto.id, createDto, user.id, user.role); } - @ApiOperation({ summary: "Get all ticket messages of user ==> user route" }) + @ApiOperation({ summary: "Get all ticket messages of user" }) @AuthGuards() - @Roles(RoleEnum.USER) + @Roles(RoleEnum.USER, RoleEnum.ADMIN) @Get(":id/messages") getTicketMessages(@Param() paramDto: ParamDto, @UserDec() user: User) { - return this.ticketsService.getTicketMessages(paramDto.id, user.id); + return this.ticketsService.getTicketMessages(paramDto.id, user.id, user.role); } - @ApiOperation({ summary: "close ticket by user ==> user route" }) + @ApiOperation({ summary: "close ticket by user or admin" }) @AuthGuards() - @Roles(RoleEnum.USER) + @Roles(RoleEnum.USER, RoleEnum.ADMIN) @Get(":id/close") closedTicketByUser(@Param() paramDto: ParamDto, @UserDec() user: User) { - return this.ticketsService.closeTicketByUser(paramDto.id, user.id); + return this.ticketsService.closeTicketByUser(paramDto.id, user.id, user.role); } }