TicketController.ts 5.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224
  1. import { Request, Response } from "express";
  2. import { getIO } from "../libs/socket";
  3. import Ticket from "../models/Ticket";
  4. import CreateTicketService from "../services/TicketServices/CreateTicketService";
  5. import DeleteTicketService from "../services/TicketServices/DeleteTicketService";
  6. import ListTicketsService from "../services/TicketServices/ListTicketsService";
  7. import ShowTicketUUIDService from "../services/TicketServices/ShowTicketFromUUIDService";
  8. import ShowTicketService from "../services/TicketServices/ShowTicketService";
  9. import UpdateTicketService from "../services/TicketServices/UpdateTicketService";
  10. import ListTicketsServiceKanban from "../services/TicketServices/ListTicketsServiceKanban";
  11. type IndexQuery = {
  12. searchParam: string;
  13. pageNumber: string;
  14. status: string;
  15. date: string;
  16. updatedAt?: string;
  17. showAll: string;
  18. withUnreadMessages: string;
  19. queueIds: string;
  20. tags: string;
  21. users: string;
  22. };
  23. interface TicketData {
  24. contactId: number;
  25. status: string;
  26. queueId: number;
  27. userId: number;
  28. whatsappId: string;
  29. useIntegration: boolean;
  30. promptId: number;
  31. integrationId: number;
  32. }
  33. export const index = async (req: Request, res: Response): Promise<Response> => {
  34. const {
  35. pageNumber,
  36. status,
  37. date,
  38. updatedAt,
  39. searchParam,
  40. showAll,
  41. queueIds: queueIdsStringified,
  42. tags: tagIdsStringified,
  43. users: userIdsStringified,
  44. withUnreadMessages
  45. } = req.query as IndexQuery;
  46. const userId = req.user.id;
  47. const { companyId } = req.user;
  48. let queueIds: number[] = [];
  49. let tagsIds: number[] = [];
  50. let usersIds: number[] = [];
  51. if (queueIdsStringified) {
  52. queueIds = JSON.parse(queueIdsStringified);
  53. }
  54. if (tagIdsStringified) {
  55. tagsIds = JSON.parse(tagIdsStringified);
  56. }
  57. if (userIdsStringified) {
  58. usersIds = JSON.parse(userIdsStringified);
  59. }
  60. const { tickets, count, hasMore } = await ListTicketsService({
  61. searchParam,
  62. tags: tagsIds,
  63. users: usersIds,
  64. pageNumber,
  65. status,
  66. date,
  67. updatedAt,
  68. showAll,
  69. userId,
  70. queueIds,
  71. withUnreadMessages,
  72. companyId,
  73. });
  74. return res.status(200).json({ tickets, count, hasMore });
  75. };
  76. export const store = async (req: Request, res: Response): Promise<Response> => {
  77. const { contactId, status, userId, queueId, whatsappId }: TicketData = req.body;
  78. const { companyId } = req.user;
  79. const ticket = await CreateTicketService({
  80. contactId,
  81. status,
  82. userId,
  83. companyId,
  84. queueId,
  85. whatsappId
  86. });
  87. const io = getIO();
  88. io.to(ticket.status).emit(`company-${companyId}-ticket`, {
  89. action: "update",
  90. ticket
  91. });
  92. return res.status(200).json(ticket);
  93. };
  94. export const kanban = async (req: Request, res: Response): Promise<Response> => {
  95. const {
  96. pageNumber,
  97. status,
  98. date,
  99. updatedAt,
  100. searchParam,
  101. showAll,
  102. queueIds: queueIdsStringified,
  103. tags: tagIdsStringified,
  104. users: userIdsStringified,
  105. withUnreadMessages
  106. } = req.query as IndexQuery;
  107. const userId = req.user.id;
  108. const { companyId } = req.user;
  109. let queueIds: number[] = [];
  110. let tagsIds: number[] = [];
  111. let usersIds: number[] = [];
  112. if (queueIdsStringified) {
  113. queueIds = JSON.parse(queueIdsStringified);
  114. }
  115. if (tagIdsStringified) {
  116. tagsIds = JSON.parse(tagIdsStringified);
  117. }
  118. if (userIdsStringified) {
  119. usersIds = JSON.parse(userIdsStringified);
  120. }
  121. const { tickets, count, hasMore } = await ListTicketsServiceKanban({
  122. searchParam,
  123. tags: tagsIds,
  124. users: usersIds,
  125. pageNumber,
  126. status,
  127. date,
  128. updatedAt,
  129. showAll,
  130. userId,
  131. queueIds,
  132. withUnreadMessages,
  133. companyId
  134. });
  135. return res.status(200).json({ tickets, count, hasMore });
  136. };
  137. export const show = async (req: Request, res: Response): Promise<Response> => {
  138. const { ticketId } = req.params;
  139. const { companyId } = req.user;
  140. const contact = await ShowTicketService(ticketId, companyId);
  141. return res.status(200).json(contact);
  142. };
  143. export const showFromUUID = async (
  144. req: Request,
  145. res: Response
  146. ): Promise<Response> => {
  147. const { uuid } = req.params;
  148. const ticket: Ticket = await ShowTicketUUIDService(uuid);
  149. return res.status(200).json(ticket);
  150. };
  151. export const update = async (
  152. req: Request,
  153. res: Response
  154. ): Promise<Response> => {
  155. const { ticketId } = req.params;
  156. const ticketData: TicketData = req.body;
  157. const { companyId, id} = req.user;
  158. const { ticket } = await UpdateTicketService({
  159. ticketData,
  160. ticketId,
  161. companyId,
  162. actionUserId: id
  163. });
  164. return res.status(200).json(ticket);
  165. };
  166. export const remove = async (
  167. req: Request,
  168. res: Response
  169. ): Promise<Response> => {
  170. const { ticketId } = req.params;
  171. const { companyId } = req.user;
  172. await ShowTicketService(ticketId, companyId);
  173. const ticket = await DeleteTicketService(ticketId);
  174. const io = getIO();
  175. io.to(ticketId)
  176. .to(`company-${companyId}-${ticket.status}`)
  177. .to(`company-${companyId}-notification`)
  178. .to(`queue-${ticket.queueId}-${ticket.status}`)
  179. .to(`queue-${ticket.queueId}-notification`)
  180. .emit(`company-${companyId}-ticket`, {
  181. action: "delete",
  182. ticketId: +ticketId
  183. });
  184. return res.status(200).json({ message: "ticket deleted" });
  185. };