113 lines
4.5 KiB
TypeScript
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);
|
|
}
|
|
}
|