From 5f7835e2d56dad6cd178b6064fee364c0c8b60a0 Mon Sep 17 00:00:00 2001
From: italo <italojmf@gmail.com>
Date: Tue, 12 Sep 2017 18:42:38 +0000
Subject: [PATCH] Feature: Change meetingid tracking to match bbb-2.0 messages

---
 bbb-webhooks/web_hooks.js | 44 +++++++++++++++++++++++++++------------
 1 file changed, 31 insertions(+), 13 deletions(-)

diff --git a/bbb-webhooks/web_hooks.js b/bbb-webhooks/web_hooks.js
index 6ce6bd4847..8461e23c59 100644
--- a/bbb-webhooks/web_hooks.js
+++ b/bbb-webhooks/web_hooks.js
@@ -79,24 +79,40 @@ module.exports = class WebHooks {
     let hooks = Hook.allGlobalSync();
 
     // Add hooks for the specific meeting that expect raw data
-    if (message[config.webhooks.rawPath] != null) {
-      // Get meetingId for a raw message that was previously mapped by another webhook application or if it's straight from redis (configurable)
-      switch (config.webhooks.rawPath) {
-        case "payload": idFromMessage = message[config.webhooks.rawPath][config.webhooks.meetingID]; break;
-        case "data": idFromMessage = message[config.webhooks.rawPath].attributes.meeting[config.webhooks.meetingID]; break;
-      }
-    }
+    // Get meetingId for a raw message that was previously mapped by another webhook application or if it's straight from redis
+    idFromMessage = this._findMeetingID(message);
     if (idFromMessage != null) {
       const eMeetingID = IDMapping.getExternalMeetingID(idFromMessage);
       hooks = hooks.concat(Hook.findByExternalMeetingIDSync(eMeetingID));
       // Notify the hooks that expect raw data
-      async.forEach(hooks, function(hook) {
-        if (hook.getRaw) { Logger.info("[WebHooks] enqueueing a raw message in the hook:", hook.callbackURL); }
-        if (hook.getRaw) { hook.enqueue(message); }
+      async.forEach(hooks, (hook) => {
+        if (hook.getRaw) {
+          Logger.info("[WebHooks] enqueueing a raw message in the hook:", hook.callbackURL);
+          hook.enqueue(message);
+        }
       });
     } // Put foreach inside the if to avoid pingpong events
   }
 
+  _findMeetingID(message) {
+    if (message.data) {
+      return message.data.attributes.meeting["internal-meeting-id"];
+    }
+    if (message.payload) {
+      return message.payload.meeting_id;
+    }
+    if (message.envelope && message.envelope.routing && message.envelope.routing.meetingId) {
+      return message.envelope.routing.meetingId;
+    }
+    if (message.header && message.header.body && message.header.body.meetingId) {
+      return message.header.body.meetingId;
+    }
+    if (message.core && message.core.body) {
+      return message.core.body.props ? message.core.body.props.meetingProp.intId : message.core.body.meetingId;
+    }
+    return undefined;
+  }
+
   // Processes an event received from redis. Will get all hook URLs that
   // should receive this event and start the process to perform the callback.
   _processEvent(message, raw) {
@@ -112,9 +128,11 @@ module.exports = class WebHooks {
     }
 
     // Notify every hook asynchronously, if hook N fails, it won't block hook N+k from receiving its message
-    async.forEach(hooks, function(hook) {
-      if (!hook.getRaw) { Logger.info("[WebHooks] enqueueing a message in the hook:", hook.callbackURL); }
-      if (!hook.getRaw) { hook.enqueue(message); }
+    async.forEach(hooks, (hook) => {
+      if (!hook.getRaw) {
+        Logger.info("[WebHooks] enqueueing a message in the hook:", hook.callbackURL);
+        hook.enqueue(message);
+      }
     });
 
     const sendRaw = hooks.some(hook => { return hook.getRaw });
-- 
GitLab