import { Request } from "express"; import { inject } from "inversify"; import { controller, httpGet, httpPost, request, requestBody, requestParam } from "inversify-express-utils"; import { HttpStatus } from "../../../common"; import { BaseController } from "../../../common/base/controller"; import { ApiAuth, ApiFile, ApiModel, ApiOperation, ApiParam, ApiResponse, ApiTags } from "../../../common/decorator/swggerDocs"; import { Guard } from "../../../core/middlewares/guard.middleware"; import { ValidationMiddleware } from "../../../core/middlewares/validator.middleware"; import { IOCTYPES } from "../../../IOC/ioc.types"; import { UploadService } from "../../../utils/upload.service"; import { CreateTicketCategoryDTO } from "../../ticket/DTO/createTicket.dto"; import { TicketMessageDTO } from "../../ticket/DTO/ticketMessage.dto"; import { TicketStatus } from "../../ticket/models/Abstraction/ITicket"; import { SenderRef } from "../../ticket/models/Abstraction/ITicketMessage"; import { TicketService } from "../../ticket/ticket.service"; import { IAdmin } from "../models/Abstraction/IAdmin"; import { PermissionEnum } from "../models/Abstraction/IPermission"; @ApiTags("Admin Ticket") @controller("/admin/tickets") export class AdminTicketController extends BaseController { @inject(IOCTYPES.TicketService) private ticketService: TicketService; @ApiOperation("create a category for ticket") @ApiResponse("successful", HttpStatus.Created) @ApiParam("id", "id of ticket", true) @ApiModel(CreateTicketCategoryDTO) @ApiAuth() @httpPost( "/category", Guard.authAdmin(), Guard.checkAdminPermissions([PermissionEnum.ADMIN]), ValidationMiddleware.validateInput(CreateTicketCategoryDTO), ) public async createTicketCategory(@requestBody() createDto: CreateTicketCategoryDTO) { const data = await this.ticketService.createTicketCategory(createDto); return this.response(data, HttpStatus.Created); } //==> @ApiOperation("get all tickets") @ApiResponse("successful", HttpStatus.Ok) @ApiAuth() @httpGet("", Guard.authAdmin(), Guard.checkAdminPermissions([PermissionEnum.ADMIN])) public async getAllTickets() { const data = await this.ticketService.getAllTickets(); return this.response(data); } @ApiOperation("get ticket with messages") @ApiResponse("successful", HttpStatus.Ok) @ApiParam("id", "id of ticket", true) @ApiAuth() @httpGet("/:id", Guard.authAdmin(), Guard.checkAdminPermissions([PermissionEnum.ADMIN])) public async getTicketWithMessages(@requestParam("id") ticketId: string) { const data = await this.ticketService.getTicketWithMessageForAdmin(ticketId); return this.response(data); } //==> @ApiOperation("add a message to ticket of seller ") @ApiResponse("successful", HttpStatus.Created) @ApiParam("id", "id of ticket", true) @ApiModel(TicketMessageDTO) @ApiAuth() @httpPost( "/:id/add-message", Guard.authAdmin(), Guard.checkAdminPermissions([PermissionEnum.ADMIN]), ValidationMiddleware.validateInput(TicketMessageDTO), ) public async addMessageToTicket( @requestParam("id") ticketId: string, @request() req: Request, @requestBody() messageDto: TicketMessageDTO, ) { const admin = req.user as IAdmin; const data = await this.ticketService.addMessage(ticketId, admin._id.toString(), SenderRef.ADMIN, messageDto); return this.response(data, HttpStatus.Created); } //==> @ApiOperation("close status of seller ticket with its id") @ApiResponse("successful", HttpStatus.Ok) @ApiParam("id", "id of ticket", true) @ApiAuth() @httpPost("/:id/close", Guard.authAdmin(), Guard.checkAdminPermissions([PermissionEnum.ADMIN])) public async closeTicket(@requestParam("id") ticketId: string) { const data = await this.ticketService.updateTicketStatus(ticketId, TicketStatus.CLOSED); return this.response(data); } @ApiOperation("upload a ticket attachment") @ApiResponse("successful", HttpStatus.Created) @ApiFile("attachments", true, true) @ApiAuth() @httpPost("/attachment", Guard.authAdmin(), UploadService.multiple("attachments", 5, "ticket-attachments")) public async ticketAttachment(@request() req: Request) { // eslint-disable-next-line no-undef const files = req.files as Express.MulterS3.File[]; const data = { message: "files uploaded!", urls: files.map((file) => ({ originalname: file.originalname, size: file.size, url: file.location, type: file.mimetype, })), }; return this.response(data, HttpStatus.Accepted); } }