From 8abdd10393b3e55c3d05a26e323df20f4f3e80ab Mon Sep 17 00:00:00 2001
From: Oswaldo Acauan <oswaldoacauan@gmail.com>
Date: Wed, 22 Feb 2017 18:59:47 +0000
Subject: [PATCH] Refactor handler for emojiStatus

---
 .../imports/api/users/server/eventHandlers.js |  2 +
 .../api/users/server/handlers/emojiStatus.js  | 37 +++++++++++
 .../server/handlers/presenterAssigned.js      | 61 +++++++++++++++++++
 .../api/users/server/handlers/removeUser.js   | 14 +++++
 .../api/users/server/modifiers/removeUser.js  | 56 +++++++++++++++++
 5 files changed, 170 insertions(+)
 create mode 100644 bigbluebutton-html5/imports/api/users/server/handlers/emojiStatus.js
 create mode 100644 bigbluebutton-html5/imports/api/users/server/handlers/presenterAssigned.js
 create mode 100644 bigbluebutton-html5/imports/api/users/server/handlers/removeUser.js
 create mode 100644 bigbluebutton-html5/imports/api/users/server/modifiers/removeUser.js

diff --git a/bigbluebutton-html5/imports/api/users/server/eventHandlers.js b/bigbluebutton-html5/imports/api/users/server/eventHandlers.js
index ffa138652d..6f5b534cbf 100644
--- a/bigbluebutton-html5/imports/api/users/server/eventHandlers.js
+++ b/bigbluebutton-html5/imports/api/users/server/eventHandlers.js
@@ -1,8 +1,10 @@
 import RedisPubSub from '/imports/startup/server/redis';
 import handleRemoveUser from './handlers/removeUser';
 import handlePresenterAssigned from './handlers/presenterAssigned';
+import handleEmojiStatus from './handlers/emojiStatus';
 
 RedisPubSub.on('user_eject_from_meeting', handleRemoveUser);
 RedisPubSub.on('disconnect_user_message', handleRemoveUser);
 RedisPubSub.on('user_left_message', handleRemoveUser);
 RedisPubSub.on('presenter_assigned_message', handlePresenterAssigned);
+RedisPubSub.on('user_emoji_status_message', handleEmojiStatus);
diff --git a/bigbluebutton-html5/imports/api/users/server/handlers/emojiStatus.js b/bigbluebutton-html5/imports/api/users/server/handlers/emojiStatus.js
new file mode 100644
index 0000000000..ee6a0f966d
--- /dev/null
+++ b/bigbluebutton-html5/imports/api/users/server/handlers/emojiStatus.js
@@ -0,0 +1,37 @@
+import Logger from '/imports/startup/server/logger';
+import { check } from 'meteor/check';
+import Users from '/imports/api/users';
+
+export default function handleEmojiStatus({ payload }) {
+  const meetingId = payload.meeting_id;
+  const userId = payload.userid;
+  const status = payload.emoji_status;
+
+  check(meetingId, String);
+  check(userId, String);
+  check(status, String);
+
+  const selector = {
+    meetingId,
+    userId,
+  };
+
+  const modifier = {
+    $set: {
+      'user.set_emoji_time': new Date(),
+      'user.emoji_status': status,
+    },
+  };
+
+  const cb = (err, numChanged) => {
+    if (err) {
+      return Logger.error(`Assigning user emoji status: ${err}`);
+    }
+
+    if (numChanged) {
+      return Logger.info(`Assigned user emoji status '${status}' id=${newPresenterId} meeting=${meetingId}`);
+    }
+  };
+
+  return Users.update(selector, modifier, cb);
+};
diff --git a/bigbluebutton-html5/imports/api/users/server/handlers/presenterAssigned.js b/bigbluebutton-html5/imports/api/users/server/handlers/presenterAssigned.js
new file mode 100644
index 0000000000..9d4e1fe652
--- /dev/null
+++ b/bigbluebutton-html5/imports/api/users/server/handlers/presenterAssigned.js
@@ -0,0 +1,61 @@
+import Logger from '/imports/startup/server/logger';
+import { check } from 'meteor/check';
+import Users from '/imports/api/users';
+
+export default function handlePresenterAssigned({ payload }) {
+  const meetingId = payload.meeting_id;
+  const newPresenterId = payload.new_presenter_id;
+
+  check(meetingId, String);
+  check(newPresenterId, String);
+
+  const selector = {
+    meetingId,
+    userId: newPresenterId,
+  };
+
+  const modifier = {
+    $set: {
+      'user.presenter': true,
+    },
+  };
+
+  const cb = (err, numChanged) => {
+    if (err) {
+      return Logger.error(`Assigning user as presenter: ${err}`);
+    }
+
+    if (numChanged) {
+      unassignCurrentPresenter(meetingId, newPresenterId);
+      return Logger.info(`Assigned user as presenter id=${newPresenterId} meeting=${meetingId}`);
+    }
+  };
+
+  return Users.update(selector, modifier, cb);
+};
+
+const unassignCurrentPresenter = (meetingId, newPresenterId) => {
+  const selector = {
+    meetingId,
+    userId: { $ne: newPresenterId },
+    'user.presenter': true,
+  };
+
+  const modifier = {
+    $set: {
+      'user.presenter': false,
+    },
+  };
+
+  const cb = (err, numChanged) => {
+    if (err) {
+      return Logger.error(`Unassigning current presenter from collection: ${err}`);
+    }
+
+    if (numChanged) {
+      return Logger.info(`Unassign current presenter meeting=${meetingId}`);
+    }
+  };
+
+  return Users.update(selector, modifier, cb);
+};
diff --git a/bigbluebutton-html5/imports/api/users/server/handlers/removeUser.js b/bigbluebutton-html5/imports/api/users/server/handlers/removeUser.js
new file mode 100644
index 0000000000..4a54919913
--- /dev/null
+++ b/bigbluebutton-html5/imports/api/users/server/handlers/removeUser.js
@@ -0,0 +1,14 @@
+import Logger from '/imports/startup/server/logger';
+import { check } from 'meteor/check';
+
+import removeUser from '../modifiers/removeUser';
+
+export default function handleRemoveUser({ payload }) {
+  const meetingId = payload.meeting_id;
+  const userId = payload.userid;
+
+  check(meetingId, String);
+  check(userId, String);
+
+  return removeUser(meetingId, userId);
+};
diff --git a/bigbluebutton-html5/imports/api/users/server/modifiers/removeUser.js b/bigbluebutton-html5/imports/api/users/server/modifiers/removeUser.js
new file mode 100644
index 0000000000..87a1153702
--- /dev/null
+++ b/bigbluebutton-html5/imports/api/users/server/modifiers/removeUser.js
@@ -0,0 +1,56 @@
+import { check } from 'meteor/check';
+import Users from '/imports/api/slides';
+import Logger from '/imports/startup/server/logger';
+
+import setConnectionStatus from './setConnectionStatus';
+
+const CLIENT_TYPE_HTML = 'HTML5';
+
+export default function removeUser(meetingId, userId) {
+  check(meetingId, String);
+  check(userId, String);
+
+  const selector = {
+    meetingId,
+    userId,
+  };
+
+  const User = Users.findOne(selector);
+
+  if (User && User.clientType !== CLIENT_TYPE_HTML) {
+    const cb = (err, numChanged) => {
+      if (err) {
+        return Logger.error(`Removing user from collection: ${err}`);
+      }
+
+      if (numChanged) {
+        return Logger.info(`Removed user id=${userId} meeting=${meetingId}`);
+      }
+    };
+
+    return Users.remove(selector, cb);
+  }
+
+  const modifier = {
+    $set: {
+      'user.connection_status': 'offline',
+      'user.voiceUser.talking': false,
+      'user.voiceUser.joined': false,
+      'user.voiceUser.muted': false,
+      'user.time_of_joining': 0,
+      'user.listenOnly': false, //TODO make this user: {}
+    },
+  };
+
+  const cb = (err, numChanged) => {
+    if (err) {
+      return Logger.error(`Removing user from collection: ${err}`);
+    }
+
+    if (numChanged) {
+      return Logger.info(`Removed ${CLIENT_TYPE_HTML} user id=${userId} meeting=${meetingId}`);
+    }
+  };
+
+  return Users.update(selector, modifier, cb);
+};
-- 
GitLab