import { Body, Controller, Get, HttpCode, HttpStatus, Param, Patch, Post, Query } from "@nestjs/common"; import { ApiOperation, ApiTags } from "@nestjs/swagger"; import { CreateTicketCategoryDto } from "./DTO/create-ticket-category.dto"; import { CreateTicketMessageDto } from "./DTO/create-ticket-message.dto"; import { CreateTicketByAdminDto, CreateTicketDto } from "./DTO/create-ticket.dto"; import { ReferTicketDto } from "./DTO/refer-ticket.dto"; 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 { TicketsService } from "./providers/tickets.service"; import { AdminRoute } from "../../common/decorators/admin.decorator"; import { AuthGuards } from "../../common/decorators/auth-guard.decorator"; import { PermissionsDec } from "../../common/decorators/permission.decorator"; import { IUserIpAndHeaders, UserDec, UserIpAndHeaders } from "../../common/decorators/user.decorator"; import { ParamDto } from "../../common/DTO/param.dto"; import { PermissionEnum } from "../users/enums/permission.enum"; @Controller("tickets") @ApiTags("Tickets") @AuthGuards() export class TicketsController { constructor(private readonly ticketsService: TicketsService) {} //----------------- ticket categories ------------------- @ApiOperation({ summary: "Create ticket category => admin route" }) @PermissionsDec(PermissionEnum.TICKETS) @Post("category") createTicketCategory(@Body() createDto: CreateTicketCategoryDto, @UserIpAndHeaders() userIpAndHeaders: IUserIpAndHeaders) { return this.ticketsService.createTicketCategory(createDto, userIpAndHeaders); } @ApiOperation({ summary: "Update ticket category => admin route" }) @PermissionsDec(PermissionEnum.TICKETS) @Patch("category/:id") updateCategory( @Param() paramDto: ParamDto, @Body() updateCategoryDto: UpdateTicketCategoryDto, @UserIpAndHeaders() userIpAndHeaders: IUserIpAndHeaders, ) { return this.ticketsService.updateCategory(paramDto, updateCategoryDto, userIpAndHeaders); } @ApiOperation({ summary: "Get ticket categories " }) @Get("categories") getTicketCategories() { return this.ticketsService.getTicketCategories(); } @ApiOperation({ summary: "Get ticket categories list => admin route" }) @AdminRoute() @PermissionsDec(PermissionEnum.TICKETS) @Get("categories-list") getCategoriesList(@Query() queryDto: SearchTicketCategoryDto) { return this.ticketsService.getCategoriesList(queryDto); } @ApiOperation({ summary: "toggle status of categories => admin route" }) @AdminRoute() @HttpCode(HttpStatus.OK) @PermissionsDec(PermissionEnum.TICKETS) @Post("category/toggle-status/:id") toggleCategoryStatus(@Param() paramDto: ParamDto, @UserIpAndHeaders() userIpAndHeaders: IUserIpAndHeaders) { return this.ticketsService.toggleCategoryStatus(paramDto, userIpAndHeaders); } //----------------- ticket and ticket messages ------------------- @ApiOperation({ summary: "create ticket ==> user route" }) @Post() createTicket(@Body() createDto: CreateTicketDto, @UserDec("id") userId: string) { return this.ticketsService.createTicket(createDto, userId); } @ApiOperation({ summary: "create ticket by admin" }) @AdminRoute() @PermissionsDec(PermissionEnum.TICKETS) @Post("admin") createTicketByAdmin(@Body() createDto: CreateTicketByAdminDto, @UserIpAndHeaders() userIpAndHeaders: IUserIpAndHeaders) { return this.ticketsService.createTicketByAdmin(createDto, userIpAndHeaders); } @ApiOperation({ summary: "Get all tickets of user ==> user route" }) @Get() getTickets(@Query() queryDto: SearchTicketQueryDto, @UserDec("id") userId: string) { return this.ticketsService.getTickets(queryDto, userId); } @ApiOperation({ summary: "Get all tickets ==> admin route" }) @AdminRoute() @PermissionsDec(PermissionEnum.TICKETS) @Get("admin") getAllTickets(@Query() queryDto: SearchTicketQueryDto, @UserDec("id") adminId: string) { return this.ticketsService.getTicketForAdmin(queryDto, adminId); } @ApiOperation({ summary: "create ticket messages" }) @Post(":id/messages") createTicketMessage( @Param() paramDto: ParamDto, @Body() createDto: CreateTicketMessageDto, @UserDec("id") userId: string, @UserDec("isAdmin") isAdmin: boolean, ) { return this.ticketsService.createTicketMessage(paramDto.id, createDto, userId, isAdmin); } @ApiOperation({ summary: "Get all ticket messages of user" }) @Get(":id/messages") getTicketMessages(@Param() paramDto: ParamDto, @UserDec("id") userId: string, @UserDec("isAdmin") isAdmin: boolean) { return this.ticketsService.getTicketMessages(paramDto.id, userId, isAdmin); } @ApiOperation({ summary: "close ticket by user or admin" }) @HttpCode(HttpStatus.OK) @Post(":id/close") closedTicketByUser( @Param() paramDto: ParamDto, @UserDec("isAdmin") isAdmin: boolean, @UserIpAndHeaders() userIpAndHeaders: IUserIpAndHeaders, ) { return this.ticketsService.closeTicketByUser(paramDto.id, isAdmin, userIpAndHeaders); } @ApiOperation({ summary: "open ticket by admin" }) @AdminRoute() @PermissionsDec(PermissionEnum.TICKETS) @Post(":id/open") openTicketByAdmin(@Param() paramDto: ParamDto, @UserIpAndHeaders() userIpAndHeaders: IUserIpAndHeaders) { return this.ticketsService.openTicketByAdmin(paramDto.id, userIpAndHeaders); } @ApiOperation({ summary: "referer ticket ==> admin route" }) @AdminRoute() @PermissionsDec(PermissionEnum.TICKETS) @Post(":id/refer") referTicket(@Param() paramDto: ParamDto, @Body() referDto: ReferTicketDto, @UserIpAndHeaders() userIpAndHeaders: IUserIpAndHeaders) { return this.ticketsService.referTicket(paramDto.id, referDto, userIpAndHeaders); } }