From b793d28e601719073d4650ae892a9cc1b1745b12 Mon Sep 17 00:00:00 2001 From: canove Date: Sun, 6 Sep 2020 14:22:05 -0300 Subject: [PATCH] feat: checking for whatsapp session Id on ticket and message creation --- backend/src/controllers/MessageController.js | 22 ++++++++++++++++--- backend/src/controllers/TicketController.js | 14 +++++++++++- backend/src/controllers/WhatsAppController.js | 3 ++- ...906155658-add-whatsapp-field-to-tickets.js | 16 ++++++++++++++ backend/src/libs/wbot.js | 3 ++- backend/src/models/Ticket.js | 4 ++++ backend/src/models/Whatsapp.js | 4 ++++ 7 files changed, 60 insertions(+), 6 deletions(-) create mode 100644 backend/src/database/migrations/20200906155658-add-whatsapp-field-to-tickets.js diff --git a/backend/src/controllers/MessageController.js b/backend/src/controllers/MessageController.js index 2639b55..33a04b7 100644 --- a/backend/src/controllers/MessageController.js +++ b/backend/src/controllers/MessageController.js @@ -1,6 +1,7 @@ const Message = require("../models/Message"); const Contact = require("../models/Contact"); const User = require("../models/User"); +const Whatsapp = require("../models/Whatsapp"); const Ticket = require("../models/Ticket"); const { getIO } = require("../libs/socket"); @@ -11,7 +12,7 @@ const { MessageMedia } = require("whatsapp-web.js"); const setMessagesAsRead = async ticket => { const io = getIO(); - const wbot = getWbot(); + const wbot = getWbot(ticket.whatsappId); await Message.update( { read: true }, @@ -104,7 +105,6 @@ exports.index = async (req, res, next) => { }; exports.store = async (req, res, next) => { - const wbot = getWbot(); const io = getIO(); const { ticketId } = req.params; @@ -126,6 +126,22 @@ exports.store = async (req, res, next) => { return res.status(404).json({ error: "No ticket found with this ID" }); } + if (!ticket.whatsappId) { + const defaultWhatsapp = await Whatsapp.findOne({ + where: { default: true }, + }); + + if (!defaultWhatsapp) { + return res + .status(404) + .json({ error: "No default WhatsApp found. Check Connection page." }); + } + + await ticket.setWhatsapp(defaultWhatsapp); + } + + const wbot = getWbot(ticket.whatsappId); + try { if (media) { const newMedia = MessageMedia.fromFilePath(req.file.path); @@ -178,7 +194,7 @@ exports.store = async (req, res, next) => { await setMessagesAsRead(ticket); - return res.json({ newMessage, ticket }); + return res.status(200).json({ newMessage, ticket }); } return res diff --git a/backend/src/controllers/TicketController.js b/backend/src/controllers/TicketController.js index 825203e..7fe06ae 100644 --- a/backend/src/controllers/TicketController.js +++ b/backend/src/controllers/TicketController.js @@ -4,6 +4,7 @@ const { startOfDay, endOfDay, parseISO } = require("date-fns"); const Ticket = require("../models/Ticket"); const Contact = require("../models/Contact"); const Message = require("../models/Message"); +const Whatsapp = require("../models/Whatsapp"); const { getIO } = require("../libs/socket"); @@ -110,7 +111,18 @@ exports.index = async (req, res) => { exports.store = async (req, res) => { const io = getIO(); - const ticket = await Ticket.create(req.body); + + const defaultWhatsapp = await Whatsapp.findOne({ + where: { default: true }, + }); + + if (!defaultWhatsapp) { + return res + .status(404) + .json({ error: "No default WhatsApp found. Check Connection page." }); + } + + const ticket = await defaultWhatsapp.createTicket(req.body); const contact = await ticket.getContact(); diff --git a/backend/src/controllers/WhatsAppController.js b/backend/src/controllers/WhatsAppController.js index b50dbcc..30fc5b3 100644 --- a/backend/src/controllers/WhatsAppController.js +++ b/backend/src/controllers/WhatsAppController.js @@ -20,7 +20,6 @@ exports.store = async (req, res) => { "Check-default", "Only one default whatsapp is permited", async value => { - // console.log("cai no if", value); if (value === true) { const whatsappFound = await Whatsapp.findOne({ where: { default: true }, @@ -88,6 +87,8 @@ exports.update = async (req, res) => { }); if (whatsappFound) { return !(whatsappFound.id !== +whatsappId); + } else { + return true; } } else return true; } diff --git a/backend/src/database/migrations/20200906155658-add-whatsapp-field-to-tickets.js b/backend/src/database/migrations/20200906155658-add-whatsapp-field-to-tickets.js new file mode 100644 index 0000000..28f7c0c --- /dev/null +++ b/backend/src/database/migrations/20200906155658-add-whatsapp-field-to-tickets.js @@ -0,0 +1,16 @@ +"use strict"; + +module.exports = { + up: (queryInterface, Sequelize) => { + return queryInterface.addColumn("Tickets", "whatsappId", { + type: Sequelize.INTEGER, + references: { model: "Whatsapps", key: "id" }, + onUpdate: "CASCADE", + onDelete: "SET NULL", + }); + }, + + down: queryInterface => { + return queryInterface.removeColumn("Tickets", "whatsappId"); + }, +}; diff --git a/backend/src/libs/wbot.js b/backend/src/libs/wbot.js index eee60d0..86ee3a0 100644 --- a/backend/src/libs/wbot.js +++ b/backend/src/libs/wbot.js @@ -90,7 +90,8 @@ module.exports = { const sessionIndex = sessions.findIndex(s => s.id === whatsappId); if (sessionIndex === -1) { - throw new Error("This Wbot session is not initialized"); + console.log("This Wbot session is not initialized"); + return null; } return sessions[sessionIndex]; }, diff --git a/backend/src/models/Ticket.js b/backend/src/models/Ticket.js index 5882527..771eba5 100644 --- a/backend/src/models/Ticket.js +++ b/backend/src/models/Ticket.js @@ -39,6 +39,10 @@ class Ticket extends Sequelize.Model { static associate(models) { this.belongsTo(models.Contact, { foreignKey: "contactId", as: "contact" }); this.belongsTo(models.User, { foreignKey: "userId", as: "user" }); + this.belongsTo(models.Whatsapp, { + foreignKey: "whatsappId", + as: "whatsapp", + }); this.hasMany(models.Message, { foreignKey: "ticketId", as: "messages" }); } } diff --git a/backend/src/models/Whatsapp.js b/backend/src/models/Whatsapp.js index 754de3b..7d77f17 100644 --- a/backend/src/models/Whatsapp.js +++ b/backend/src/models/Whatsapp.js @@ -23,6 +23,10 @@ class Whatsapp extends Sequelize.Model { return this; } + + static associate(models) { + this.hasMany(models.Ticket, { foreignKey: "whatsappId", as: "tickets" }); + } } module.exports = Whatsapp;