From 5c7a759efabe54c1b67004bb5be15bd6c8bd2336 Mon Sep 17 00:00:00 2001 From: canove Date: Tue, 22 Sep 2020 16:33:13 -0300 Subject: [PATCH] fix: handling wwebjs erros without blocking routes --- backend/src/controllers/WhatsAppController.ts | 16 +------- backend/src/libs/socket.ts | 16 ++++++++ backend/src/server.ts | 41 ++----------------- .../WbotServices/ImportContactsService.ts | 17 ++++---- .../WbotServices/SendWhatsAppMedia.ts | 24 +++++++---- .../WbotServices/SendWhatsAppMessage.ts | 22 ++++++---- .../WbotServices/StartWhatsAppSessions.ts | 18 ++++++++ 7 files changed, 80 insertions(+), 74 deletions(-) create mode 100644 backend/src/services/WbotServices/StartWhatsAppSessions.ts diff --git a/backend/src/controllers/WhatsAppController.ts b/backend/src/controllers/WhatsAppController.ts index 9e32ee6..e147fa1 100644 --- a/backend/src/controllers/WhatsAppController.ts +++ b/backend/src/controllers/WhatsAppController.ts @@ -1,6 +1,6 @@ import { Request, Response } from "express"; import { getIO } from "../libs/socket"; -import { initWbot } from "../libs/wbot"; +import { initWbot, removeWbot } from "../libs/wbot"; import wbotMessageListener from "../services/WbotServices/wbotMessageListener"; import wbotMonitor from "../services/WbotServices/wbotMonitor"; @@ -33,10 +33,6 @@ export const store = async (req: Request, res: Response): Promise => { const whatsapp = await CreateWhatsAppService({ name, status, isDefault }); - // if (!whatsapp) { - // return res.status(400).json({ error: "Cannot create whatsapp session." }); - // } - initWbot(whatsapp) .then(() => { wbotMessageListener(whatsapp); @@ -70,14 +66,6 @@ export const update = async ( const whatsapp = await UpdateWhatsAppService({ whatsappData, whatsappId }); - // const whatsapp = await Whatsapp.findByPk(whatsappId); - - // if (!whatsapp) { - // return res.status(404).json({ message: "Whatsapp not found" }); - // } - - // await whatsapp.update(req.body); - const io = getIO(); io.emit("whatsapp", { action: "update", @@ -94,7 +82,7 @@ export const remove = async ( const { whatsappId } = req.params; await DeleteWhatsAppService(whatsappId); - // removeWbot(whatsapp.id); + removeWbot(+whatsappId); const io = getIO(); io.emit("whatsapp", { diff --git a/backend/src/libs/socket.ts b/backend/src/libs/socket.ts index cf5bcbf..cdeacc1 100644 --- a/backend/src/libs/socket.ts +++ b/backend/src/libs/socket.ts @@ -6,6 +6,22 @@ let io: SocketIO; export const initIO = (httpServer: Server): SocketIO => { io = socketIo(httpServer); + io.on("connection", socket => { + console.log("Client Connected"); + socket.on("joinChatBox", ticketId => { + console.log("A client joined a ticket channel"); + socket.join(ticketId); + }); + + socket.on("joinNotification", () => { + console.log("A client joined notification channel"); + socket.join("notification"); + }); + + socket.on("disconnect", () => { + console.log("Client disconnected"); + }); + }); return io; }; export const getIO = (): SocketIO => { diff --git a/backend/src/server.ts b/backend/src/server.ts index 6beb9a4..b023c28 100644 --- a/backend/src/server.ts +++ b/backend/src/server.ts @@ -11,12 +11,7 @@ import uploadConfig from "./config/upload"; import AppError from "./errors/AppError"; import routes from "./routes"; import { initIO } from "./libs/socket"; -import { initWbot } from "./libs/wbot"; - -// const wbotMonitor = require("./services/wbotMonitor"); -import Whatsapp from "./models/Whatsapp"; -import wbotMessageListener from "./services/WbotServices/wbotMessageListener"; -import wbotMonitor from "./services/WbotServices/wbotMonitor"; +import { StartWhatsAppSessions } from "./services/WbotServices/StartWhatsAppSessions"; Sentry.init({ dsn: process.env.SENTRY_DSN }); @@ -34,38 +29,8 @@ const server = app.listen(process.env.PORT, () => { console.log(`Server started on port: ${process.env.PORT}`); }); -const io = initIO(server); -io.on("connection", socket => { - console.log("Client Connected"); - socket.on("joinChatBox", ticketId => { - console.log("A client joined a ticket channel"); - socket.join(ticketId); - }); - - socket.on("joinNotification", () => { - console.log("A client joined notification channel"); - socket.join("notification"); - }); - - socket.on("disconnect", () => { - console.log("Client disconnected"); - }); -}); - -const startWhatsAppSessions = async () => { - const whatsapps = await Whatsapp.findAll(); - if (whatsapps.length > 0) { - whatsapps.forEach(whatsapp => { - initWbot(whatsapp) - .then(() => { - wbotMessageListener(whatsapp); - wbotMonitor(whatsapp); - }) - .catch(err => console.log(err)); - }); - } -}; -startWhatsAppSessions(); +initIO(server); +StartWhatsAppSessions(); app.use(Sentry.Handlers.errorHandler()); diff --git a/backend/src/services/WbotServices/ImportContactsService.ts b/backend/src/services/WbotServices/ImportContactsService.ts index 297893f..a45a249 100644 --- a/backend/src/services/WbotServices/ImportContactsService.ts +++ b/backend/src/services/WbotServices/ImportContactsService.ts @@ -13,16 +13,19 @@ const ImportContactsService = async (): Promise => { try { phoneContacts = await wbot.getContacts(); } catch (err) { - throw new AppError( - "Could not check whatsapp contact. Check connection page." + console.log( + "Could not get whatsapp contacts from phone. Check connection page.", + err ); } - await Promise.all( - phoneContacts.map(async ({ number, name }) => { - await Contact.create({ number, name }); - }) - ); + if (phoneContacts) { + await Promise.all( + phoneContacts.map(async ({ number, name }) => { + await Contact.create({ number, name }); + }) + ); + } }; export default ImportContactsService; diff --git a/backend/src/services/WbotServices/SendWhatsAppMedia.ts b/backend/src/services/WbotServices/SendWhatsAppMedia.ts index 424200f..8afade7 100644 --- a/backend/src/services/WbotServices/SendWhatsAppMedia.ts +++ b/backend/src/services/WbotServices/SendWhatsAppMedia.ts @@ -1,4 +1,5 @@ import { MessageMedia, Message as WbotMessage } from "whatsapp-web.js"; +import AppError from "../../errors/AppError"; import GetTicketWbot from "../../helpers/GetTicketWbot"; import Ticket from "../../models/Ticket"; @@ -11,17 +12,24 @@ const SendWhatsAppMedia = async ({ media, ticket }: Request): Promise => { - const wbot = await GetTicketWbot(ticket); + try { + const wbot = await GetTicketWbot(ticket); - const newMedia = MessageMedia.fromFilePath(media.path); + const newMedia = MessageMedia.fromFilePath(media.path); - const sentMessage = await wbot.sendMessage( - `${ticket.contact.number}@c.us`, - newMedia - ); + const sentMessage = await wbot.sendMessage( + `${ticket.contact.number}@c.us`, + newMedia + ); - await ticket.update({ lastMessage: media.filename }); - return sentMessage; + await ticket.update({ lastMessage: media.filename }); + return sentMessage; + } catch (err) { + console.log(err); + throw new AppError( + "Could not send whatsapp message. Check connections page." + ); + } }; export default SendWhatsAppMedia; diff --git a/backend/src/services/WbotServices/SendWhatsAppMessage.ts b/backend/src/services/WbotServices/SendWhatsAppMessage.ts index 403b915..049b1f0 100644 --- a/backend/src/services/WbotServices/SendWhatsAppMessage.ts +++ b/backend/src/services/WbotServices/SendWhatsAppMessage.ts @@ -1,4 +1,5 @@ import { Message as WbotMessage } from "whatsapp-web.js"; +import AppError from "../../errors/AppError"; import GetTicketWbot from "../../helpers/GetTicketWbot"; import Ticket from "../../models/Ticket"; @@ -11,15 +12,22 @@ const SendWhatsAppMessage = async ({ body, ticket }: Request): Promise => { - const wbot = await GetTicketWbot(ticket); + try { + const wbot = await GetTicketWbot(ticket); - const sentMessage = await wbot.sendMessage( - `${ticket.contact.number}@c.us`, - body - ); + const sentMessage = await wbot.sendMessage( + `${ticket.contact.number}@c.us`, + body + ); - await ticket.update({ lastMessage: body }); - return sentMessage; + await ticket.update({ lastMessage: body }); + return sentMessage; + } catch (err) { + console.log(err); + throw new AppError( + "Could not send whatsapp message. Check connections page." + ); + } }; export default SendWhatsAppMessage; diff --git a/backend/src/services/WbotServices/StartWhatsAppSessions.ts b/backend/src/services/WbotServices/StartWhatsAppSessions.ts new file mode 100644 index 0000000..82dc542 --- /dev/null +++ b/backend/src/services/WbotServices/StartWhatsAppSessions.ts @@ -0,0 +1,18 @@ +import { initWbot } from "../../libs/wbot"; +import Whatsapp from "../../models/Whatsapp"; +import wbotMessageListener from "./wbotMessageListener"; +import wbotMonitor from "./wbotMonitor"; + +export const StartWhatsAppSessions = async (): Promise => { + const whatsapps = await Whatsapp.findAll(); + if (whatsapps.length > 0) { + whatsapps.forEach(whatsapp => { + initWbot(whatsapp) + .then(() => { + wbotMessageListener(whatsapp); + wbotMonitor(whatsapp); + }) + .catch(err => console.log(err)); + }); + } +};