fix: handling wwebjs erros without blocking routes

This commit is contained in:
canove
2020-09-22 16:33:13 -03:00
parent 0d8b4cd60c
commit 5c7a759efa
7 changed files with 80 additions and 74 deletions

View File

@@ -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<Response> => {
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", {

View File

@@ -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 => {

View File

@@ -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());

View File

@@ -13,16 +13,19 @@ const ImportContactsService = async (): Promise<void> => {
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;

View File

@@ -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<WbotMessage> => {
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;

View File

@@ -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<WbotMessage> => {
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;

View File

@@ -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<void> => {
const whatsapps = await Whatsapp.findAll();
if (whatsapps.length > 0) {
whatsapps.forEach(whatsapp => {
initWbot(whatsapp)
.then(() => {
wbotMessageListener(whatsapp);
wbotMonitor(whatsapp);
})
.catch(err => console.log(err));
});
}
};