MessageController.ts 5.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192
  1. import { Request, Response } from "express";
  2. import AppError from "../errors/AppError";
  3. import SetTicketMessagesAsRead from "../helpers/SetTicketMessagesAsRead";
  4. import { getIO } from "../libs/socket";
  5. import Message from "../models/Message";
  6. import Queue from "../models/Queue";
  7. import User from "../models/User";
  8. import Whatsapp from "../models/Whatsapp";
  9. import formatBody from "../helpers/Mustache";
  10. import ListMessagesService from "../services/MessageServices/ListMessagesService";
  11. import ShowTicketService from "../services/TicketServices/ShowTicketService";
  12. import FindOrCreateTicketService from "../services/TicketServices/FindOrCreateTicketService";
  13. import UpdateTicketService from "../services/TicketServices/UpdateTicketService";
  14. import DeleteWhatsAppMessage from "../services/WbotServices/DeleteWhatsAppMessage";
  15. import SendWhatsAppMedia from "../services/WbotServices/SendWhatsAppMedia";
  16. import SendWhatsAppMessage from "../services/WbotServices/SendWhatsAppMessage";
  17. import CheckContactNumber from "../services/WbotServices/CheckNumber";
  18. import CheckIsValidContact from "../services/WbotServices/CheckIsValidContact";
  19. import GetProfilePicUrl from "../services/WbotServices/GetProfilePicUrl";
  20. import CreateOrUpdateContactService from "../services/ContactServices/CreateOrUpdateContactService";
  21. type IndexQuery = {
  22. pageNumber: string;
  23. };
  24. type MessageData = {
  25. body: string;
  26. fromMe: boolean;
  27. read: boolean;
  28. quotedMsg?: Message;
  29. number?: string;
  30. closeTicket?: true;
  31. };
  32. export const index = async (req: Request, res: Response): Promise<Response> => {
  33. const { ticketId } = req.params;
  34. const { pageNumber } = req.query as IndexQuery;
  35. const { companyId, profile } = req.user;
  36. const queues: number[] = [];
  37. if (profile !== "admin") {
  38. const user = await User.findByPk(req.user.id, {
  39. include: [{ model: Queue, as: "queues" }]
  40. });
  41. user.queues.forEach(queue => {
  42. queues.push(queue.id);
  43. });
  44. }
  45. const { count, messages, ticket, hasMore } = await ListMessagesService({
  46. pageNumber,
  47. ticketId,
  48. companyId,
  49. queues
  50. });
  51. SetTicketMessagesAsRead(ticket);
  52. return res.json({ count, messages, ticket, hasMore });
  53. };
  54. export const store = async (req: Request, res: Response): Promise<Response> => {
  55. const { ticketId } = req.params;
  56. const { body, quotedMsg }: MessageData = req.body;
  57. const medias = req.files as Express.Multer.File[];
  58. const { companyId } = req.user;
  59. const ticket = await ShowTicketService(ticketId, companyId);
  60. SetTicketMessagesAsRead(ticket);
  61. if (medias) {
  62. await Promise.all(
  63. medias.map(async (media: Express.Multer.File, index) => {
  64. await SendWhatsAppMedia({ media, ticket, body: Array.isArray(body) ? body[index] : body });
  65. })
  66. );
  67. } else {
  68. const send = await SendWhatsAppMessage({ body, ticket, quotedMsg });
  69. }
  70. return res.send();
  71. };
  72. export const remove = async (
  73. req: Request,
  74. res: Response
  75. ): Promise<Response> => {
  76. const { messageId } = req.params;
  77. const { companyId } = req.user;
  78. const message = await DeleteWhatsAppMessage(messageId);
  79. const io = getIO();
  80. io.to(message.ticketId.toString()).emit(`company-${companyId}-appMessage`, {
  81. action: "update",
  82. message
  83. });
  84. return res.send();
  85. };
  86. export const send = async (req: Request, res: Response): Promise<Response> => {
  87. const { whatsappId } = req.params as unknown as { whatsappId: number };
  88. const messageData: MessageData = req.body;
  89. const medias = req.files as Express.Multer.File[];
  90. try {
  91. const whatsapp = await Whatsapp.findByPk(whatsappId);
  92. if (!whatsapp) {
  93. throw new Error("Não foi possível realizar a operação");
  94. }
  95. if (messageData.number === undefined) {
  96. throw new Error("O número é obrigatório");
  97. }
  98. const numberToTest = messageData.number;
  99. const body = messageData.body;
  100. const companyId = whatsapp.companyId;
  101. const CheckValidNumber = await CheckContactNumber(numberToTest, companyId);
  102. const number = CheckValidNumber.jid.replace(/\D/g, "");
  103. const profilePicUrl = await GetProfilePicUrl(
  104. number,
  105. companyId
  106. );
  107. const contactData = {
  108. name: `${number}`,
  109. number,
  110. profilePicUrl,
  111. isGroup: false,
  112. companyId
  113. };
  114. const contact = await CreateOrUpdateContactService(contactData);
  115. const ticket = await FindOrCreateTicketService(contact, whatsapp.id!, 0, companyId);
  116. if (medias) {
  117. await Promise.all(
  118. medias.map(async (media: Express.Multer.File) => {
  119. await req.app.get("queues").messageQueue.add(
  120. "SendMessage",
  121. {
  122. whatsappId,
  123. data: {
  124. number,
  125. body: body ? formatBody(body, contact) : media.originalname,
  126. mediaPath: media.path,
  127. fileName: media.originalname
  128. }
  129. },
  130. { removeOnComplete: true, attempts: 3 }
  131. );
  132. })
  133. );
  134. } else {
  135. await SendWhatsAppMessage({ body: formatBody(body, contact), ticket });
  136. await ticket.update({
  137. lastMessage: body,
  138. });
  139. }
  140. if (messageData.closeTicket) {
  141. setTimeout(async () => {
  142. await UpdateTicketService({
  143. ticketId: ticket.id,
  144. ticketData: { status: "closed" },
  145. companyId
  146. });
  147. }, 1000);
  148. }
  149. SetTicketMessagesAsRead(ticket);
  150. return res.send({ mensagem: "Mensagem enviada" });
  151. } catch (err: any) {
  152. if (Object.keys(err).length === 0) {
  153. throw new AppError(
  154. "Não foi possível enviar a mensagem, tente novamente em alguns instantes"
  155. );
  156. } else {
  157. throw new AppError(err.message);
  158. }
  159. }
  160. };