import { Request, Response } from "express"; import { getIO } from "../libs/socket"; import CreateTicketService from "../services/TicketServices/CreateTicketService"; import DeleteTicketService from "../services/TicketServices/DeleteTicketService"; import ListTicketsService from "../services/TicketServices/ListTicketsService"; import ShowTicketService from "../services/TicketServices/ShowTicketService"; import UpdateTicketService from "../services/TicketServices/UpdateTicketService"; type IndexQuery = { searchParam: string; pageNumber: string; status: string; date: string; showAll: string; withUnreadMessages: string; }; interface TicketData { contactId: number; status: string; userId: number; } export const index = async (req: Request, res: Response): Promise => { const { pageNumber, status, date, searchParam, showAll, withUnreadMessages } = req.query as IndexQuery; const userId = req.user.id; const { tickets, count, hasMore } = await ListTicketsService({ searchParam, pageNumber, status, date, showAll, userId, withUnreadMessages }); return res.status(200).json({ tickets, count, hasMore }); }; export const store = async (req: Request, res: Response): Promise => { const { contactId, status, userId }: TicketData = req.body; const ticket = await CreateTicketService({ contactId, status, userId }); const io = getIO(); io.to(ticket.status).emit("ticket", { action: "create", ticket }); return res.status(200).json(ticket); }; export const show = async (req: Request, res: Response): Promise => { const { ticketId } = req.params; const contact = await ShowTicketService(ticketId); return res.status(200).json(contact); }; export const update = async ( req: Request, res: Response ): Promise => { const { ticketId } = req.params; const ticketData: TicketData = req.body; const { ticket, oldStatus, oldUserId } = await UpdateTicketService({ ticketData, ticketId }); const io = getIO(); if (ticket.status !== oldStatus || ticket.user?.id !== oldUserId) { io.to(oldStatus).emit("ticket", { action: "delete", ticketId: ticket.id }); } io.to(ticket.status).to("notification").to(ticketId).emit("ticket", { action: "updateStatus", ticket }); return res.status(200).json(ticket); }; export const remove = async ( req: Request, res: Response ): Promise => { const { ticketId } = req.params; const ticket = await DeleteTicketService(ticketId); const io = getIO(); io.to(ticket.status) .to(ticketId) .to("notification") .emit("ticket", { action: "delete", ticketId: +ticketId }); return res.status(200).json({ message: "ticket deleted" }); };