Files
shop-api/src/modules/admin/controllers/ticket.controller.ts
T
mahyargdz be82059172 first
2025-09-14 15:15:03 +03:30

113 lines
4.5 KiB
TypeScript

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);
}
}