| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192 |
- import { Request, Response } from "express";
- import AppError from "../errors/AppError";
- import SetTicketMessagesAsRead from "../helpers/SetTicketMessagesAsRead";
- import { getIO } from "../libs/socket";
- import Message from "../models/Message";
- import Queue from "../models/Queue";
- import User from "../models/User";
- import Whatsapp from "../models/Whatsapp";
- import formatBody from "../helpers/Mustache";
- import ListMessagesService from "../services/MessageServices/ListMessagesService";
- import ShowTicketService from "../services/TicketServices/ShowTicketService";
- import FindOrCreateTicketService from "../services/TicketServices/FindOrCreateTicketService";
- import UpdateTicketService from "../services/TicketServices/UpdateTicketService";
- import DeleteWhatsAppMessage from "../services/WbotServices/DeleteWhatsAppMessage";
- import SendWhatsAppMedia from "../services/WbotServices/SendWhatsAppMedia";
- import SendWhatsAppMessage from "../services/WbotServices/SendWhatsAppMessage";
- import CheckContactNumber from "../services/WbotServices/CheckNumber";
- import CheckIsValidContact from "../services/WbotServices/CheckIsValidContact";
- import GetProfilePicUrl from "../services/WbotServices/GetProfilePicUrl";
- import CreateOrUpdateContactService from "../services/ContactServices/CreateOrUpdateContactService";
- type IndexQuery = {
- pageNumber: string;
- };
- type MessageData = {
- body: string;
- fromMe: boolean;
- read: boolean;
- quotedMsg?: Message;
- number?: string;
- closeTicket?: true;
- };
- export const index = async (req: Request, res: Response): Promise<Response> => {
- const { ticketId } = req.params;
- const { pageNumber } = req.query as IndexQuery;
- const { companyId, profile } = req.user;
- const queues: number[] = [];
- if (profile !== "admin") {
- const user = await User.findByPk(req.user.id, {
- include: [{ model: Queue, as: "queues" }]
- });
- user.queues.forEach(queue => {
- queues.push(queue.id);
- });
- }
- const { count, messages, ticket, hasMore } = await ListMessagesService({
- pageNumber,
- ticketId,
- companyId,
- queues
- });
- SetTicketMessagesAsRead(ticket);
- return res.json({ count, messages, ticket, hasMore });
- };
- export const store = async (req: Request, res: Response): Promise<Response> => {
- const { ticketId } = req.params;
- const { body, quotedMsg }: MessageData = req.body;
- const medias = req.files as Express.Multer.File[];
- const { companyId } = req.user;
- const ticket = await ShowTicketService(ticketId, companyId);
- SetTicketMessagesAsRead(ticket);
- if (medias) {
- await Promise.all(
- medias.map(async (media: Express.Multer.File, index) => {
- await SendWhatsAppMedia({ media, ticket, body: Array.isArray(body) ? body[index] : body });
- })
- );
- } else {
- const send = await SendWhatsAppMessage({ body, ticket, quotedMsg });
- }
- return res.send();
- };
- export const remove = async (
- req: Request,
- res: Response
- ): Promise<Response> => {
- const { messageId } = req.params;
- const { companyId } = req.user;
- const message = await DeleteWhatsAppMessage(messageId);
- const io = getIO();
- io.to(message.ticketId.toString()).emit(`company-${companyId}-appMessage`, {
- action: "update",
- message
- });
- return res.send();
- };
- export const send = async (req: Request, res: Response): Promise<Response> => {
- const { whatsappId } = req.params as unknown as { whatsappId: number };
- const messageData: MessageData = req.body;
- const medias = req.files as Express.Multer.File[];
- try {
- const whatsapp = await Whatsapp.findByPk(whatsappId);
- if (!whatsapp) {
- throw new Error("Não foi possível realizar a operação");
- }
- if (messageData.number === undefined) {
- throw new Error("O número é obrigatório");
- }
- const numberToTest = messageData.number;
- const body = messageData.body;
- const companyId = whatsapp.companyId;
- const CheckValidNumber = await CheckContactNumber(numberToTest, companyId);
- const number = CheckValidNumber.jid.replace(/\D/g, "");
- const profilePicUrl = await GetProfilePicUrl(
- number,
- companyId
- );
- const contactData = {
- name: `${number}`,
- number,
- profilePicUrl,
- isGroup: false,
- companyId
- };
- const contact = await CreateOrUpdateContactService(contactData);
- const ticket = await FindOrCreateTicketService(contact, whatsapp.id!, 0, companyId);
- if (medias) {
- await Promise.all(
- medias.map(async (media: Express.Multer.File) => {
- await req.app.get("queues").messageQueue.add(
- "SendMessage",
- {
- whatsappId,
- data: {
- number,
- body: body ? formatBody(body, contact) : media.originalname,
- mediaPath: media.path,
- fileName: media.originalname
- }
- },
- { removeOnComplete: true, attempts: 3 }
- );
- })
- );
- } else {
- await SendWhatsAppMessage({ body: formatBody(body, contact), ticket });
- await ticket.update({
- lastMessage: body,
- });
- }
- if (messageData.closeTicket) {
- setTimeout(async () => {
- await UpdateTicketService({
- ticketId: ticket.id,
- ticketData: { status: "closed" },
- companyId
- });
- }, 1000);
- }
- SetTicketMessagesAsRead(ticket);
- return res.send({ mensagem: "Mensagem enviada" });
- } catch (err: any) {
- if (Object.keys(err).length === 0) {
- throw new AppError(
- "Não foi possível enviar a mensagem, tente novamente em alguns instantes"
- );
- } else {
- throw new AppError(err.message);
- }
- }
- };
|