import { Request, Response } from "express"; import { getIO } from "../libs/socket"; import { removeWbot } from "../libs/wbot"; import { StartWhatsAppSession } from "../services/WbotServices/StartWhatsAppSession"; import { removeDir } from "../helpers/DeleteDirectory"; import CreateWhatsAppService from "../services/WhatsappService/CreateWhatsAppService"; import DeleteWhatsAppService from "../services/WhatsappService/DeleteWhatsAppService"; import ListWhatsAppsService from "../services/WhatsappService/ListWhatsAppsService"; import ShowWhatsAppService from "../services/WhatsappService/ShowWhatsAppService"; import UpdateWhatsAppService from "../services/WhatsappService/UpdateWhatsAppService"; import AppError from "../errors/AppError"; import getNumberFromName from "../helpers/GetNumberSequence"; import phoneNumberStart from "../helpers/PhoneNumberStatusCode"; import path from "path"; import validatePhoneName from "../helpers/ValidatePhoneName"; import postData from "../helpers/AxiosPost"; import Whatsapp from "../models/Whatsapp"; import Message from "../models/Message"; import FindOrCreateTicketService from "../services/TicketServices/FindOrCreateTicketService"; import { handleMsgAck, verifyContact, verifyMessage } from "../services/WbotServices/wbotMessageListener"; import Contact from "../models/Contact"; import CreateOrUpdateContactService from "../services/ContactServices/CreateOrUpdateContactService"; interface WhatsappData { name: string; queueIds: number[]; url: string; urlApi: string; greetingMessage?: string; farewellMessage?: string; status?: string; isDefault?: boolean; } export const index = async (req: Request, res: Response): Promise => { const whatsapps = await ListWhatsAppsService(); return res.status(200).json(whatsapps); }; export const weebhook = async ( req: Request, res: Response ): Promise => { // console.log(JSON.stringify(req.body, null, 2)); // MESSAGE if (req.body.object) { if ( req.body.entry && req.body.entry[0].changes && req.body.entry[0].changes[0] && req.body.entry[0].changes[0].value.messages && req.body.entry[0].changes[0].value.messages[0] ) { const contact_from = req.body.entry[0].changes[0].value.messages[0].from; // extract the phone number from the webhook payload const msg_body = req.body.entry[0].changes[0].value.messages[0].text.body; // extract the message text from the webhook payload const type = req.body.entry[0].changes[0].value.messages[0].type; const contact_to = req.body.entry[0].changes[0].value.metadata.display_phone_number; console.log("from: ", contact_from); console.log("to: ", contact_to); console.log("msg_body: ", msg_body); console.log("msg type: ", type); const contact: any = await verifyContact(null, { number: contact_from }); const whatsapp: any = await Whatsapp.findOne({ where: { number: contact_to } }); const ticket = await FindOrCreateTicketService(contact, whatsapp.id, 1); let msg = {}; msg = { ...msg, id: { id: req.body.entry[0].changes[0].value.messages[0].id }, fromMe: false, type: type === "text" ? "chat" : type, read: false, body: req.body.entry[0].changes[0].value.messages[0].text.body }; await verifyMessage(msg, ticket, contact, undefined); return res.sendStatus(200); } // STATUS MESSAGE SENT else if ( req.body.entry && req.body.entry[0].changes && req.body.entry[0].changes[0] && req.body.entry[0].changes[0].value.statuses && req.body.entry[0].changes[0].value.statuses[0] ) { const id = req.body.entry[0].changes[0].value.statuses[0].id; const ack = req.body.entry[0].changes[0].value.statuses[0].status; handleMsgAck(id, ack, true); } } return res.sendStatus(200); }; export const store = async (req: Request, res: Response): Promise => { const { name, status, isDefault, greetingMessage, farewellMessage, queueIds, url, urlApi }: WhatsappData = req.body; if (req.user.profile !== "master") { throw new AppError("ERR_NO_PERMISSION", 403); } let validate = validatePhoneName(name); if (validate) { return res.status(200).json({ message: validate }); } const { whatsapp, oldDefaultWhatsapp } = await CreateWhatsAppService({ name, url, urlApi, status, isDefault, greetingMessage, farewellMessage, queueIds }); console.log("whatsapp.id: ", whatsapp.id); postData(`${whatsapp.urlApi}/api/session`, { app_name: process.env.APP_NAME, whatsappId: whatsapp.id, number: getNumberFromName(name), client_url: `${process.env.BACKEND_URL_RAW}:${process.env.PORT}` }); // StartWhatsAppSession(whatsapp); const io = getIO(); io.emit("whatsapp", { action: "update", whatsapp }); if (oldDefaultWhatsapp) { io.emit("whatsapp", { action: "update", whatsapp: oldDefaultWhatsapp }); } return res.status(200).json(whatsapp); }; export const show = async (req: Request, res: Response): Promise => { const { whatsappId } = req.params; const whatsapp = await ShowWhatsAppService(whatsappId); return res.status(200).json(whatsapp); }; export const update = async ( req: Request, res: Response ): Promise => { const { whatsappId } = req.params; const whatsappData = req.body; let validate = validatePhoneName(whatsappData.name); console.log("validate", validate); if (validate) { return res.status(200).json({ message: validate }); } const { whatsapp, oldDefaultWhatsapp } = await UpdateWhatsAppService({ whatsappData, whatsappId }); postData(`${whatsapp.urlApi}/api/session`, { app_name: process.env.APP_NAME, whatsappId: whatsapp.id, number: getNumberFromName(whatsapp.name), client_url: `${process.env.BACKEND_URL_RAW}:${process.env.PORT}` }); const io = getIO(); io.emit("whatsapp", { action: "update", whatsapp }); if (oldDefaultWhatsapp) { io.emit("whatsapp", { action: "update", whatsapp: oldDefaultWhatsapp }); } return res.status(200).json(whatsapp); }; export const remove = async ( req: Request, res: Response ): Promise => { if (req.user.profile !== "master") { throw new AppError("ERR_NO_PERMISSION", 403); } const { whatsappId } = req.params; const whatsapp: any = await Whatsapp.findByPk(whatsappId, { raw: true }); postData(`${whatsapp.urlApi}/api/session/del`, { app_name: process.env.APP_NAME, whatsappId: whatsappId }); await DeleteWhatsAppService(whatsappId); removeDir( path.join(process.cwd(), ".wwebjs_auth", `session-bd_${whatsappId}`) ); removeDir( path.join( process.cwd(), ".wwebjs_auth", "sessions", `session-bd_${whatsappId}` ) ); removeWbot(+whatsappId); const io = getIO(); io.emit("whatsapp", { action: "delete", whatsappId: +whatsappId }); return res.status(200).json({ message: "Whatsapp deleted." }); };