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 { CreateTicketDto } from "./DTO/create-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 { AuthGuards } from "../../common/decorators/auth-guard.decorator"; import { Pagination } from "../../common/decorators/pagination.decorator"; import { PermissionsDec } from "../../common/decorators/permission.decorator"; import { UserDec } from "../../common/decorators/user.decorator"; import { ParamDto } from "../../common/DTO/param.dto"; import { User } from "../users/entities/user.entity"; import { PermissionEnum } from "../users/enums/permission.enum"; @Controller("tickets") @ApiTags("Tickets") export class TicketsController { constructor(private readonly ticketsService: TicketsService) {} //----------------- ticket categories ------------------- @ApiOperation({ summary: "Create ticket category => admin route" }) @AuthGuards() @PermissionsDec(PermissionEnum.TICKETS) @Post("category") createTicketCategory(@Body() createDto: CreateTicketCategoryDto) { return this.ticketsService.createTicketCategory(createDto); } @ApiOperation({ summary: "Update ticket category => admin route" }) @AuthGuards() @PermissionsDec(PermissionEnum.TICKETS) @Patch("category/:id") updateCategory(@Param() paramDto: ParamDto, @Body() updateCategoryDto: UpdateTicketCategoryDto) { return this.ticketsService.updateCategory(paramDto, updateCategoryDto); } @ApiOperation({ summary: "Get ticket categories " }) @AuthGuards() @Get("categories") // @PermissionsDec(PermissionEnum.TICKETS) getTicketCategories() { return this.ticketsService.getTicketCategories(); } @ApiOperation({ summary: "Get ticket categories list => admin route" }) @Pagination() @AuthGuards() @PermissionsDec(PermissionEnum.TICKETS) @Get("categories-list") getCategoriesList(@Query() queryDto: SearchTicketCategoryDto) { return this.ticketsService.getCategoriesList(queryDto); } @ApiOperation({ summary: "toggle status of categories => admin route" }) @AuthGuards() @HttpCode(HttpStatus.OK) @PermissionsDec(PermissionEnum.TICKETS) @Post("category/toggle-status/:id") toggleCategoryStatus(@Param() paramDto: ParamDto) { return this.ticketsService.toggleCategoryStatus(paramDto); } //----------------- ticket and ticket messages ------------------- @ApiOperation({ summary: "create ticket ==> user route" }) @AuthGuards() @Post() createTicket(@Body() createDto: CreateTicketDto, @UserDec("id") userId: string) { return this.ticketsService.createTicket(createDto, userId); } @ApiOperation({ summary: "Get all tickets of user ==> user route" }) @AuthGuards() @Pagination() @Get() getTickets(@Query() queryDto: SearchTicketQueryDto, @UserDec("id") userId: string) { return this.ticketsService.getTickets(queryDto, userId); } @ApiOperation({ summary: "Get all tickets ==> admin route" }) @AuthGuards() @PermissionsDec(PermissionEnum.TICKETS) @Pagination() @Get("admin") getAllTickets(@Query() queryDto: SearchTicketQueryDto) { return this.ticketsService.getAllTickets(queryDto); } @ApiOperation({ summary: "create ticket messages" }) @AuthGuards() @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" }) @AuthGuards() @Get(":id/messages") getTicketMessages( @Param() paramDto: ParamDto, @UserDec("id") userId: string, @UserDec("isAdmin") isAdmin: boolean, @UserDec() user: User, ) { console.log(user); return this.ticketsService.getTicketMessages(paramDto.id, userId, isAdmin); } @ApiOperation({ summary: "close ticket by user or admin" }) @AuthGuards() @HttpCode(HttpStatus.OK) @Post(":id/close") closedTicketByUser(@Param() paramDto: ParamDto, @UserDec("id") userId: string, @UserDec("isAdmin") isAdmin: boolean) { return this.ticketsService.closeTicketByUser(paramDto.id, userId, isAdmin); } }