From b8a4dbb278b6d61d437fc65825bb5ddef5c89537 Mon Sep 17 00:00:00 2001
From: Oleksandr Zhurbenko <xaerok.od.ua@gmail.com>
Date: Wed, 11 Oct 2017 17:59:35 -0700
Subject: [PATCH] Merged 2.0 and 1.1 slides api

---
 .../imports/api/1.1/slides/index.js           |  15 ++-
 .../api/1.1/slides/server/eventHandlers.js    |   6 +-
 .../1.1/slides/server/handlers/slideChange.js |  15 +--
 .../1.1/slides/server/handlers/slideResize.js |  14 +-
 .../api/{2.0 => 1.1}/slides/server/helpers.js |   0
 .../imports/api/1.1/slides/server/index.js    |   0
 .../imports/api/1.1/slides/server/methods.js  |   7 +-
 .../1.1/slides/server/methods/switchSlide.js  |  28 ++--
 .../1.1/slides/server/modifiers/addSlide.js   | 126 ++++++++++--------
 .../server/modifiers/changeCurrentSlide.js    |  15 ++-
 .../slides/server/modifiers/clearSlides.js    |   2 +-
 .../modifiers/clearSlidesPresentation.js      |  14 +-
 .../slides/server/modifiers/resizeSlide.js    |  45 +++++--
 .../api/1.1/slides/server/publishers.js       |   4 +-
 .../imports/api/2.0/slides/index.js           |  14 --
 .../api/2.0/slides/server/eventHandlers.js    |   6 -
 .../2.0/slides/server/handlers/slideChange.js |  11 --
 .../2.0/slides/server/handlers/slideResize.js |   9 --
 .../imports/api/2.0/slides/server/index.js    |   3 -
 .../imports/api/2.0/slides/server/methods.js  |   7 -
 .../2.0/slides/server/methods/switchSlide.js  |  49 -------
 .../2.0/slides/server/modifiers/addSlide.js   | 123 -----------------
 .../server/modifiers/changeCurrentSlide.js    |  61 ---------
 .../slides/server/modifiers/clearSlides.js    |  10 --
 .../modifiers/clearSlidesPresentation.js      |  28 ----
 .../slides/server/modifiers/resizeSlide.js    |  58 --------
 .../api/2.0/slides/server/publishers.js       |  24 ----
 27 files changed, 169 insertions(+), 525 deletions(-)
 mode change 100644 => 100755 bigbluebutton-html5/imports/api/1.1/slides/index.js
 mode change 100644 => 100755 bigbluebutton-html5/imports/api/1.1/slides/server/eventHandlers.js
 mode change 100644 => 100755 bigbluebutton-html5/imports/api/1.1/slides/server/handlers/slideChange.js
 mode change 100644 => 100755 bigbluebutton-html5/imports/api/1.1/slides/server/handlers/slideResize.js
 rename bigbluebutton-html5/imports/api/{2.0 => 1.1}/slides/server/helpers.js (100%)
 mode change 100644 => 100755
 mode change 100644 => 100755 bigbluebutton-html5/imports/api/1.1/slides/server/index.js
 mode change 100644 => 100755 bigbluebutton-html5/imports/api/1.1/slides/server/methods.js
 mode change 100644 => 100755 bigbluebutton-html5/imports/api/1.1/slides/server/methods/switchSlide.js
 mode change 100644 => 100755 bigbluebutton-html5/imports/api/1.1/slides/server/modifiers/addSlide.js
 mode change 100644 => 100755 bigbluebutton-html5/imports/api/1.1/slides/server/modifiers/changeCurrentSlide.js
 mode change 100644 => 100755 bigbluebutton-html5/imports/api/1.1/slides/server/modifiers/clearSlides.js
 mode change 100644 => 100755 bigbluebutton-html5/imports/api/1.1/slides/server/modifiers/clearSlidesPresentation.js
 mode change 100644 => 100755 bigbluebutton-html5/imports/api/1.1/slides/server/modifiers/resizeSlide.js
 mode change 100644 => 100755 bigbluebutton-html5/imports/api/1.1/slides/server/publishers.js
 delete mode 100644 bigbluebutton-html5/imports/api/2.0/slides/index.js
 delete mode 100644 bigbluebutton-html5/imports/api/2.0/slides/server/eventHandlers.js
 delete mode 100644 bigbluebutton-html5/imports/api/2.0/slides/server/handlers/slideChange.js
 delete mode 100644 bigbluebutton-html5/imports/api/2.0/slides/server/handlers/slideResize.js
 delete mode 100644 bigbluebutton-html5/imports/api/2.0/slides/server/index.js
 delete mode 100644 bigbluebutton-html5/imports/api/2.0/slides/server/methods.js
 delete mode 100644 bigbluebutton-html5/imports/api/2.0/slides/server/methods/switchSlide.js
 delete mode 100644 bigbluebutton-html5/imports/api/2.0/slides/server/modifiers/addSlide.js
 delete mode 100644 bigbluebutton-html5/imports/api/2.0/slides/server/modifiers/changeCurrentSlide.js
 delete mode 100644 bigbluebutton-html5/imports/api/2.0/slides/server/modifiers/clearSlides.js
 delete mode 100644 bigbluebutton-html5/imports/api/2.0/slides/server/modifiers/clearSlidesPresentation.js
 delete mode 100644 bigbluebutton-html5/imports/api/2.0/slides/server/modifiers/resizeSlide.js
 delete mode 100644 bigbluebutton-html5/imports/api/2.0/slides/server/publishers.js

diff --git a/bigbluebutton-html5/imports/api/1.1/slides/index.js b/bigbluebutton-html5/imports/api/1.1/slides/index.js
old mode 100644
new mode 100755
index 1834357cc4..7831569b53
--- a/bigbluebutton-html5/imports/api/1.1/slides/index.js
+++ b/bigbluebutton-html5/imports/api/1.1/slides/index.js
@@ -1 +1,14 @@
-export default new Mongo.Collection('slides');
+import { Meteor } from 'meteor/meteor';
+
+const Slides = new Mongo.Collection('slides2x');
+
+if (Meteor.isServer) {
+  // types of queries for the slides:
+  // 1. meetingId
+  // 2. meetingId, presentationId
+  // 3. meetingId, presentationId, id
+
+  Slides._ensureIndex({ meetingId: 1, presentationId: 1, id: 1 });
+}
+
+export default Slides;
diff --git a/bigbluebutton-html5/imports/api/1.1/slides/server/eventHandlers.js b/bigbluebutton-html5/imports/api/1.1/slides/server/eventHandlers.js
old mode 100644
new mode 100755
index 46a0aa1922..65ebaf2fed
--- a/bigbluebutton-html5/imports/api/1.1/slides/server/eventHandlers.js
+++ b/bigbluebutton-html5/imports/api/1.1/slides/server/eventHandlers.js
@@ -1,6 +1,6 @@
-import RedisPubSub from '/imports/startup/server/redis';
+import RedisPubSub from '/imports/startup/server/redis2x';
 import handleSlideResize from './handlers/slideResize';
 import handleSlideChange from './handlers/slideChange';
 
-RedisPubSub.on('presentation_page_resized_message', handleSlideResize);
-RedisPubSub.on('presentation_page_changed_message', handleSlideChange);
+RedisPubSub.on('ResizeAndMovePageEvtMsg', handleSlideResize);
+RedisPubSub.on('SetCurrentPageEvtMsg', handleSlideChange);
diff --git a/bigbluebutton-html5/imports/api/1.1/slides/server/handlers/slideChange.js b/bigbluebutton-html5/imports/api/1.1/slides/server/handlers/slideChange.js
old mode 100644
new mode 100755
index 334aa9bfb9..5cc819ea05
--- a/bigbluebutton-html5/imports/api/1.1/slides/server/handlers/slideChange.js
+++ b/bigbluebutton-html5/imports/api/1.1/slides/server/handlers/slideChange.js
@@ -1,16 +1,11 @@
-import Logger from '/imports/startup/server/logger';
 import { check } from 'meteor/check';
 import changeCurrentSlide from '../modifiers/changeCurrentSlide';
 
-export default function handleSlideChange({ payload }) {
-  const meetingId = payload.meeting_id;
-  const slide = payload.page;
+export default function handleSlideChange({ body }, meetingId) {
+  const { pageId, presentationId } = body;
 
-  check(meetingId, String);
-  check(slide, Object);
+  check(pageId, String);
+  check(presentationId, String);
 
-  const slideId = slide.id;
-  const presentationId = slideId.split('/')[0];
-
-  return changeCurrentSlide(meetingId, presentationId, slideId);
+  return changeCurrentSlide(meetingId, presentationId, pageId);
 }
diff --git a/bigbluebutton-html5/imports/api/1.1/slides/server/handlers/slideResize.js b/bigbluebutton-html5/imports/api/1.1/slides/server/handlers/slideResize.js
old mode 100644
new mode 100755
index 66d6f3bceb..a8e32f61e2
--- a/bigbluebutton-html5/imports/api/1.1/slides/server/handlers/slideResize.js
+++ b/bigbluebutton-html5/imports/api/1.1/slides/server/handlers/slideResize.js
@@ -1,17 +1,9 @@
-import Logger from '/imports/startup/server/logger';
-import Slides from './../../';
 import { check } from 'meteor/check';
 import resizeSlide from '../modifiers/resizeSlide';
 
-export default function handleSlideResize({ payload }) {
-  const meetingId = payload.meeting_id;
-  const slide = payload.page;
-
+export default function handleSlideResize({ body }, meetingId) {
   check(meetingId, String);
-  check(slide, Object);
-
-  const slideId = slide.id;
-  const presentationId = slideId.split('/')[0];
+  check(body, Object);
 
-  return resizeSlide(meetingId, presentationId, slideId, slide);
+  return resizeSlide(meetingId, body);
 }
diff --git a/bigbluebutton-html5/imports/api/2.0/slides/server/helpers.js b/bigbluebutton-html5/imports/api/1.1/slides/server/helpers.js
old mode 100644
new mode 100755
similarity index 100%
rename from bigbluebutton-html5/imports/api/2.0/slides/server/helpers.js
rename to bigbluebutton-html5/imports/api/1.1/slides/server/helpers.js
diff --git a/bigbluebutton-html5/imports/api/1.1/slides/server/index.js b/bigbluebutton-html5/imports/api/1.1/slides/server/index.js
old mode 100644
new mode 100755
diff --git a/bigbluebutton-html5/imports/api/1.1/slides/server/methods.js b/bigbluebutton-html5/imports/api/1.1/slides/server/methods.js
old mode 100644
new mode 100755
index 1ce65c3698..5d69c6254d
--- a/bigbluebutton-html5/imports/api/1.1/slides/server/methods.js
+++ b/bigbluebutton-html5/imports/api/1.1/slides/server/methods.js
@@ -1,4 +1,7 @@
 import { Meteor } from 'meteor/meteor';
+import mapToAcl from '/imports/startup/mapToAcl';
+import switchSlide from './methods/switchSlide';
 
-Meteor.methods({
-});
+Meteor.methods(mapToAcl(['methods.switchSlide'], {
+  switchSlide,
+}));
diff --git a/bigbluebutton-html5/imports/api/1.1/slides/server/methods/switchSlide.js b/bigbluebutton-html5/imports/api/1.1/slides/server/methods/switchSlide.js
old mode 100644
new mode 100755
index 37a8b41080..a33fdc3e28
--- a/bigbluebutton-html5/imports/api/1.1/slides/server/methods/switchSlide.js
+++ b/bigbluebutton-html5/imports/api/1.1/slides/server/methods/switchSlide.js
@@ -1,14 +1,14 @@
-import Presentations from '/imports/api/1.1/presentations';
-import Slides from './../../';
+import Presentations from '/imports/api/2.0/presentations';
+import Slides from '/imports/api/2.0/slides';
 import { Meteor } from 'meteor/meteor';
 import { check } from 'meteor/check';
-import RedisPubSub from '/imports/startup/server/redis';
+import RedisPubSub from '/imports/startup/server/redis2x';
 
 export default function switchSlide(credentials, slideNumber) {
   const REDIS_CONFIG = Meteor.settings.redis;
 
-  const CHANNEL = REDIS_CONFIG.channels.toBBBApps.presentation;
-  const EVENT_NAME = 'go_to_slide';
+  const CHANNEL = REDIS_CONFIG.channels.toAkkaApps;
+  const EVENT_NAME = 'SetCurrentPagePubMsg';
 
   const { meetingId, requesterUserId, requesterToken } = credentials;
 
@@ -17,10 +17,12 @@ export default function switchSlide(credentials, slideNumber) {
   check(requesterToken, String);
   check(slideNumber, Number);
 
-  const Presentation = Presentations.findOne({
+  const selector = {
     meetingId,
-    'presentation.current': true,
-  });
+    current: true,
+  };
+
+  const Presentation = Presentations.findOne(selector);
 
   if (!Presentation) {
     throw new Meteor.Error(
@@ -29,8 +31,8 @@ export default function switchSlide(credentials, slideNumber) {
 
   const Slide = Slides.findOne({
     meetingId,
-    presentationId: Presentation.presentation.id,
-    'slide.num': parseInt(slideNumber, 2),
+    presentationId: Presentation.id,
+    num: slideNumber,
   });
 
   if (!Slide) {
@@ -39,9 +41,9 @@ export default function switchSlide(credentials, slideNumber) {
   }
 
   const payload = {
-    page: Slide.slide.id,
-    meeting_id: meetingId,
+    pageId: Slide.id,
+    presentationId: Presentation.id,
   };
 
-  return RedisPubSub.publish(CHANNEL, EVENT_NAME, payload);
+  return RedisPubSub.publishUserMessage(CHANNEL, EVENT_NAME, meetingId, requesterUserId, payload);
 }
diff --git a/bigbluebutton-html5/imports/api/1.1/slides/server/modifiers/addSlide.js b/bigbluebutton-html5/imports/api/1.1/slides/server/modifiers/addSlide.js
old mode 100644
new mode 100755
index 8e8df42cfa..e28f6e79aa
--- a/bigbluebutton-html5/imports/api/1.1/slides/server/modifiers/addSlide.js
+++ b/bigbluebutton-html5/imports/api/1.1/slides/server/modifiers/addSlide.js
@@ -1,61 +1,78 @@
 import probe from 'probe-image-size';
 import { Meteor } from 'meteor/meteor';
 import { check } from 'meteor/check';
-import RedisPubSub from '/imports/startup/server/redis';
-import Slides from './../../';
+import flat from 'flat';
+import RedisPubSub from '/imports/startup/server/redis2x';
+import Slides from '/imports/api/2.0/slides';
 import Logger from '/imports/startup/server/logger';
 import { SVG, PNG } from '/imports/utils/mimeTypes';
+import calculateSlideData from '/imports/api/2.0/slides/server/helpers';
 
 const requestWhiteboardHistory = (meetingId, slideId) => {
   const REDIS_CONFIG = Meteor.settings.redis;
-  const CHANNEL = REDIS_CONFIG.channels.toBBBApps.whiteboard;
-  const EVENT_NAME = 'request_whiteboard_annotation_history_request';
+  const CHANNEL = REDIS_CONFIG.channels.toAkkaApps;
+  const EVENT_NAME = 'GetWhiteboardAnnotationsReqMsg';
+  const USER_ID = 'nodeJSapp';
 
   const payload = {
-    meeting_id: meetingId,
-    requester_id: 'nodeJSapp',
-    whiteboard_id: slideId,
-    reply_to: `${meetingId}/nodeJSapp`,
+    whiteboardId: slideId,
   };
 
-  return RedisPubSub.publish(CHANNEL, EVENT_NAME, payload);
+  return RedisPubSub.publishUserMessage(CHANNEL, EVENT_NAME, meetingId, USER_ID, payload);
 };
 
 const SUPPORTED_TYPES = [SVG, PNG];
 
+const fetchImageSizes = imageUri =>
+  probe(imageUri)
+    .then((result) => {
+      if (!SUPPORTED_TYPES.includes(result.mime)) {
+        throw new Meteor.Error(
+          'invalid-image-type', `received ${result.mime} expecting ${SUPPORTED_TYPES.join()}`,
+        );
+      }
+
+      return {
+        width: result.width,
+        height: result.height,
+      };
+    })
+    .catch((reason) => {
+      Logger.error(`Error parsing image size. ${reason}. uri=${imageUri}`);
+      return reason;
+    });
+
 export default function addSlide(meetingId, presentationId, slide) {
-  check(meetingId, String);
   check(presentationId, String);
-  check(slide, Object);
+
+  check(slide, {
+    id: String,
+    num: Number,
+    thumbUri: String,
+    swfUri: String,
+    txtUri: String,
+    svgUri: String,
+    current: Boolean,
+    xOffset: Number,
+    yOffset: Number,
+    widthRatio: Number,
+    heightRatio: Number,
+  });
 
   const selector = {
     meetingId,
     presentationId,
-    'slide.id': slide.id,
+    id: slide.id,
   };
 
-  const imageUri = slide.svg_uri || slide.png_uri;
+  const imageUri = slide.svgUri || slide.pngUri;
 
   const modifier = {
-    $set: {
-      meetingId,
-      presentationId,
-      slide: {
-        id: slide.id,
-        height_ratio: slide.height_ratio,
-        y_offset: slide.y_offset,
-        num: slide.num,
-        x_offset: slide.x_offset,
-        current: slide.current,
-        img_uri: imageUri,
-        txt_uri: slide.txt_uri,
-        width_ratio: slide.width_ratio,
-        swf_uri: slide.swf_uri,
-        thumb_uri: slide.thumb_uri,
-        width: slide.width,
-        height: slide.height,
-      },
-    },
+    $set: Object.assign(
+      { meetingId },
+      { presentationId },
+      flat(slide, { safe: true }),
+    ),
   };
 
   const cb = (err, numChanged) => {
@@ -71,35 +88,36 @@ export default function addSlide(meetingId, presentationId, slide) {
       return Logger.info(`Added slide id=${slide.id} to presentation=${presentationId}`);
     }
 
-    if (numChanged) {
-      return Logger.info(`Upserted slide id=${slide.id} to presentation=${presentationId}`);
-    }
+    return Logger.info(`Upserted slide id=${slide.id} to presentation=${presentationId}`);
   };
 
   return fetchImageSizes(imageUri)
     .then(({ width, height }) => {
-      modifier.$set.slide.width = width;
-      modifier.$set.slide.height = height;
+      // there is a rare case when for a very long not-active meeting
+      // the presentation files just disappear
+      // in that case just set the whole calculatedData to undefined
+      if (!width && !height) {
+        modifier.$set.calculatedData = undefined;
+        return Slides.upsert(selector, modifier, cb);
+      }
+
+      // pre-calculating the width, height, and vieBox coordinates / dimensions
+      // to unload the client-side
+      const slideData = {
+        width,
+        height,
+        xOffset: modifier.$set.xOffset,
+        yOffset: modifier.$set.yOffset,
+        widthRatio: modifier.$set.widthRatio,
+        heightRatio: modifier.$set.heightRatio,
+      };
+      modifier.$set.calculatedData = calculateSlideData(slideData);
+      modifier.$set.calculatedData.imageUri = imageUri;
+      modifier.$set.calculatedData.width = width;
+      modifier.$set.calculatedData.height = height;
 
       return Slides.upsert(selector, modifier, cb);
     })
     .catch(reason =>
       Logger.error(`Error parsing image size. ${reason}. slide=${slide.id} uri=${imageUri}`));
 }
-
-const fetchImageSizes = imageUri =>
-  probe(imageUri)
-  .then((result) => {
-    if (!SUPPORTED_TYPES.includes(result.mime)) {
-      throw `Invalid image type, received ${result.mime} expecting ${SUPPORTED_TYPES.join()}`;
-    }
-
-    return {
-      width: result.width,
-      height: result.height,
-    };
-  })
-  .catch((reason) => {
-    Logger.error(`Error parsing image size. ${reason}. uri=${imageUri}`);
-    return reason;
-  });
diff --git a/bigbluebutton-html5/imports/api/1.1/slides/server/modifiers/changeCurrentSlide.js b/bigbluebutton-html5/imports/api/1.1/slides/server/modifiers/changeCurrentSlide.js
old mode 100644
new mode 100755
index fe38483c14..3bda1944ee
--- a/bigbluebutton-html5/imports/api/1.1/slides/server/modifiers/changeCurrentSlide.js
+++ b/bigbluebutton-html5/imports/api/1.1/slides/server/modifiers/changeCurrentSlide.js
@@ -1,5 +1,5 @@
 import { check } from 'meteor/check';
-import Slides from './../../';
+import Slides from '/imports/api/2.0/slides';
 import Logger from '/imports/startup/server/logger';
 
 export default function changeCurrentSlide(meetingId, presentationId, slideId) {
@@ -11,10 +11,10 @@ export default function changeCurrentSlide(meetingId, presentationId, slideId) {
     selector: {
       meetingId,
       presentationId,
-      'slide.current': true,
+      current: true,
     },
     modifier: {
-      $set: { 'slide.current': false },
+      $set: { current: false },
     },
     callback: (err) => {
       if (err) {
@@ -29,10 +29,10 @@ export default function changeCurrentSlide(meetingId, presentationId, slideId) {
     selector: {
       meetingId,
       presentationId,
-      'slide.id': slideId,
+      id: slideId,
     },
     modifier: {
-      $set: { 'slide.current': true },
+      $set: { current: true },
     },
     callback: (err) => {
       if (err) {
@@ -46,6 +46,11 @@ export default function changeCurrentSlide(meetingId, presentationId, slideId) {
   const oldSlide = Slides.findOne(oldCurrent.selector);
   const newSlide = Slides.findOne(newCurrent.selector);
 
+  // if the oldCurrent and newCurrent have the same ids
+  if (oldSlide && newSlide && (oldSlide._id === newSlide._id)) {
+    return;
+  }
+
   if (newSlide) {
     Slides.update(newSlide._id, newCurrent.modifier, newCurrent.callback);
   }
diff --git a/bigbluebutton-html5/imports/api/1.1/slides/server/modifiers/clearSlides.js b/bigbluebutton-html5/imports/api/1.1/slides/server/modifiers/clearSlides.js
old mode 100644
new mode 100755
index 959f12f5f7..a8aa8096eb
--- a/bigbluebutton-html5/imports/api/1.1/slides/server/modifiers/clearSlides.js
+++ b/bigbluebutton-html5/imports/api/1.1/slides/server/modifiers/clearSlides.js
@@ -1,4 +1,4 @@
-import Slides from './../../';
+import Slides from '/imports/api/2.0/slides';
 import Logger from '/imports/startup/server/logger';
 
 export default function clearSlides(meetingId) {
diff --git a/bigbluebutton-html5/imports/api/1.1/slides/server/modifiers/clearSlidesPresentation.js b/bigbluebutton-html5/imports/api/1.1/slides/server/modifiers/clearSlidesPresentation.js
old mode 100644
new mode 100755
index 6713b25a0f..cb20bf2fc4
--- a/bigbluebutton-html5/imports/api/1.1/slides/server/modifiers/clearSlidesPresentation.js
+++ b/bigbluebutton-html5/imports/api/1.1/slides/server/modifiers/clearSlidesPresentation.js
@@ -1,7 +1,7 @@
-import Slides from './../../';
+import Slides from '/imports/api/2.0/slides';
 import Logger from '/imports/startup/server/logger';
 import { check } from 'meteor/check';
-import clearShapesWhiteboard from '/imports/api/1.1/shapes/server/modifiers/clearShapesWhiteboard';
+import clearAnnotations from '/imports/api/2.0/annotations/server/modifiers/clearAnnotations';
 
 export default function clearSlidesPresentation(meetingId, presentationId) {
   check(meetingId, String);
@@ -12,18 +12,16 @@ export default function clearSlidesPresentation(meetingId, presentationId) {
     presentationId,
   };
 
-  const whiteboardIds = Slides.find(selector).map(row => row.slide.id);
+  const whiteboardIds = Slides.find(selector).map(row => row.id);
 
-  const cb = (err, numChanged) => {
+  const cb = (err) => {
     if (err) {
       return Logger.error(`Removing Slides from collection: ${err}`);
     }
 
-    if (numChanged) {
-      whiteboardIds.forEach(whiteboardId => clearShapesWhiteboard(meetingId, whiteboardId));
+    whiteboardIds.forEach(whiteboardId => clearAnnotations(meetingId, whiteboardId));
 
-      return Logger.info(`Removed Slides where presentationId=${presentationId}`);
-    }
+    return Logger.info(`Removed Slides where presentationId=${presentationId}`);
   };
 
   return Slides.remove(selector, cb);
diff --git a/bigbluebutton-html5/imports/api/1.1/slides/server/modifiers/resizeSlide.js b/bigbluebutton-html5/imports/api/1.1/slides/server/modifiers/resizeSlide.js
old mode 100644
new mode 100755
index 4ba66bf350..ad00b54306
--- a/bigbluebutton-html5/imports/api/1.1/slides/server/modifiers/resizeSlide.js
+++ b/bigbluebutton-html5/imports/api/1.1/slides/server/modifiers/resizeSlide.js
@@ -1,36 +1,57 @@
 import { check } from 'meteor/check';
-import Slides from './../../';
+import Slides from '/imports/api/2.0/slides';
 import Logger from '/imports/startup/server/logger';
+import calculateSlideData from '/imports/api/2.0/slides/server/helpers';
 
-export default function resizeSlide(meetingId, presentationId, slideId, slide) {
+export default function resizeSlide(meetingId, slide) {
   check(meetingId, String);
-  check(presentationId, String);
-  check(slideId, String);
-  check(slide, Object);
+
+  const { presentationId } = slide;
+  const { pageId, widthRatio, heightRatio, xOffset, yOffset } = slide;
 
   const selector = {
     meetingId,
     presentationId,
-    'slide.id': slideId,
+    id: pageId,
   };
 
   const modifier = {
     $set: {
-      'slide.width_ratio': slide.width_ratio,
-      'slide.height_ratio': slide.height_ratio,
-      'slide.x_offset': slide.x_offset,
-      'slide.y_offset': slide.y_offset,
+      widthRatio,
+      heightRatio,
+      xOffset,
+      yOffset,
     },
   };
 
+  // fetching the current slide data
+  // and pre-calculating the width, height, and vieBox coordinates / sizes
+  // to reduce the client-side load
+  const Slide = Slides.findOne(selector);
+  const slideData = {
+    width: Slide.calculatedData.width,
+    height: Slide.calculatedData.height,
+    xOffset,
+    yOffset,
+    widthRatio,
+    heightRatio,
+  };
+  const calculatedData = calculateSlideData(slideData);
+  calculatedData.imageUri = Slide.calculatedData.imageUri;
+  calculatedData.width = Slide.calculatedData.width;
+  calculatedData.height = Slide.calculatedData.height;
+  modifier.$set.calculatedData = calculatedData;
+
   const cb = (err, numChanged) => {
     if (err) {
-      return Logger.error(`Resizing slide id=${slideId}: ${err}`);
+      return Logger.error(`Resizing slide id=${pageId}: ${err}`);
     }
 
     if (numChanged) {
-      return Logger.info(`Resized slide id=${slideId}`);
+      return Logger.info(`Resized slide id=${pageId}`);
     }
+
+    return Logger.info(`No slide found with id=${pageId}`);
   };
 
   return Slides.update(selector, modifier, cb);
diff --git a/bigbluebutton-html5/imports/api/1.1/slides/server/publishers.js b/bigbluebutton-html5/imports/api/1.1/slides/server/publishers.js
old mode 100644
new mode 100755
index 97b861c154..1bc992720f
--- a/bigbluebutton-html5/imports/api/1.1/slides/server/publishers.js
+++ b/bigbluebutton-html5/imports/api/1.1/slides/server/publishers.js
@@ -1,4 +1,4 @@
-import Slides from './../';
+import Slides from '/imports/api/2.0/slides';
 import { Meteor } from 'meteor/meteor';
 import { check } from 'meteor/check';
 import Logger from '/imports/startup/server/logger';
@@ -21,4 +21,4 @@ function publish(...args) {
   return mapToAcl('subscriptions.slides', boundSlides)(args);
 }
 
-Meteor.publish('slides', publish);
+Meteor.publish('slides2x', publish);
diff --git a/bigbluebutton-html5/imports/api/2.0/slides/index.js b/bigbluebutton-html5/imports/api/2.0/slides/index.js
deleted file mode 100644
index 7831569b53..0000000000
--- a/bigbluebutton-html5/imports/api/2.0/slides/index.js
+++ /dev/null
@@ -1,14 +0,0 @@
-import { Meteor } from 'meteor/meteor';
-
-const Slides = new Mongo.Collection('slides2x');
-
-if (Meteor.isServer) {
-  // types of queries for the slides:
-  // 1. meetingId
-  // 2. meetingId, presentationId
-  // 3. meetingId, presentationId, id
-
-  Slides._ensureIndex({ meetingId: 1, presentationId: 1, id: 1 });
-}
-
-export default Slides;
diff --git a/bigbluebutton-html5/imports/api/2.0/slides/server/eventHandlers.js b/bigbluebutton-html5/imports/api/2.0/slides/server/eventHandlers.js
deleted file mode 100644
index 65ebaf2fed..0000000000
--- a/bigbluebutton-html5/imports/api/2.0/slides/server/eventHandlers.js
+++ /dev/null
@@ -1,6 +0,0 @@
-import RedisPubSub from '/imports/startup/server/redis2x';
-import handleSlideResize from './handlers/slideResize';
-import handleSlideChange from './handlers/slideChange';
-
-RedisPubSub.on('ResizeAndMovePageEvtMsg', handleSlideResize);
-RedisPubSub.on('SetCurrentPageEvtMsg', handleSlideChange);
diff --git a/bigbluebutton-html5/imports/api/2.0/slides/server/handlers/slideChange.js b/bigbluebutton-html5/imports/api/2.0/slides/server/handlers/slideChange.js
deleted file mode 100644
index 5cc819ea05..0000000000
--- a/bigbluebutton-html5/imports/api/2.0/slides/server/handlers/slideChange.js
+++ /dev/null
@@ -1,11 +0,0 @@
-import { check } from 'meteor/check';
-import changeCurrentSlide from '../modifiers/changeCurrentSlide';
-
-export default function handleSlideChange({ body }, meetingId) {
-  const { pageId, presentationId } = body;
-
-  check(pageId, String);
-  check(presentationId, String);
-
-  return changeCurrentSlide(meetingId, presentationId, pageId);
-}
diff --git a/bigbluebutton-html5/imports/api/2.0/slides/server/handlers/slideResize.js b/bigbluebutton-html5/imports/api/2.0/slides/server/handlers/slideResize.js
deleted file mode 100644
index a8e32f61e2..0000000000
--- a/bigbluebutton-html5/imports/api/2.0/slides/server/handlers/slideResize.js
+++ /dev/null
@@ -1,9 +0,0 @@
-import { check } from 'meteor/check';
-import resizeSlide from '../modifiers/resizeSlide';
-
-export default function handleSlideResize({ body }, meetingId) {
-  check(meetingId, String);
-  check(body, Object);
-
-  return resizeSlide(meetingId, body);
-}
diff --git a/bigbluebutton-html5/imports/api/2.0/slides/server/index.js b/bigbluebutton-html5/imports/api/2.0/slides/server/index.js
deleted file mode 100644
index 92451ac76b..0000000000
--- a/bigbluebutton-html5/imports/api/2.0/slides/server/index.js
+++ /dev/null
@@ -1,3 +0,0 @@
-import './eventHandlers';
-import './methods';
-import './publishers';
diff --git a/bigbluebutton-html5/imports/api/2.0/slides/server/methods.js b/bigbluebutton-html5/imports/api/2.0/slides/server/methods.js
deleted file mode 100644
index 5d69c6254d..0000000000
--- a/bigbluebutton-html5/imports/api/2.0/slides/server/methods.js
+++ /dev/null
@@ -1,7 +0,0 @@
-import { Meteor } from 'meteor/meteor';
-import mapToAcl from '/imports/startup/mapToAcl';
-import switchSlide from './methods/switchSlide';
-
-Meteor.methods(mapToAcl(['methods.switchSlide'], {
-  switchSlide,
-}));
diff --git a/bigbluebutton-html5/imports/api/2.0/slides/server/methods/switchSlide.js b/bigbluebutton-html5/imports/api/2.0/slides/server/methods/switchSlide.js
deleted file mode 100644
index a33fdc3e28..0000000000
--- a/bigbluebutton-html5/imports/api/2.0/slides/server/methods/switchSlide.js
+++ /dev/null
@@ -1,49 +0,0 @@
-import Presentations from '/imports/api/2.0/presentations';
-import Slides from '/imports/api/2.0/slides';
-import { Meteor } from 'meteor/meteor';
-import { check } from 'meteor/check';
-import RedisPubSub from '/imports/startup/server/redis2x';
-
-export default function switchSlide(credentials, slideNumber) {
-  const REDIS_CONFIG = Meteor.settings.redis;
-
-  const CHANNEL = REDIS_CONFIG.channels.toAkkaApps;
-  const EVENT_NAME = 'SetCurrentPagePubMsg';
-
-  const { meetingId, requesterUserId, requesterToken } = credentials;
-
-  check(meetingId, String);
-  check(requesterUserId, String);
-  check(requesterToken, String);
-  check(slideNumber, Number);
-
-  const selector = {
-    meetingId,
-    current: true,
-  };
-
-  const Presentation = Presentations.findOne(selector);
-
-  if (!Presentation) {
-    throw new Meteor.Error(
-      'presentation-not-found', 'You need a presentation to be able to switch slides');
-  }
-
-  const Slide = Slides.findOne({
-    meetingId,
-    presentationId: Presentation.id,
-    num: slideNumber,
-  });
-
-  if (!Slide) {
-    throw new Meteor.Error(
-      'slide-not-found', `Slide number ${slideNumber} not found in the current presentation`);
-  }
-
-  const payload = {
-    pageId: Slide.id,
-    presentationId: Presentation.id,
-  };
-
-  return RedisPubSub.publishUserMessage(CHANNEL, EVENT_NAME, meetingId, requesterUserId, payload);
-}
diff --git a/bigbluebutton-html5/imports/api/2.0/slides/server/modifiers/addSlide.js b/bigbluebutton-html5/imports/api/2.0/slides/server/modifiers/addSlide.js
deleted file mode 100644
index e28f6e79aa..0000000000
--- a/bigbluebutton-html5/imports/api/2.0/slides/server/modifiers/addSlide.js
+++ /dev/null
@@ -1,123 +0,0 @@
-import probe from 'probe-image-size';
-import { Meteor } from 'meteor/meteor';
-import { check } from 'meteor/check';
-import flat from 'flat';
-import RedisPubSub from '/imports/startup/server/redis2x';
-import Slides from '/imports/api/2.0/slides';
-import Logger from '/imports/startup/server/logger';
-import { SVG, PNG } from '/imports/utils/mimeTypes';
-import calculateSlideData from '/imports/api/2.0/slides/server/helpers';
-
-const requestWhiteboardHistory = (meetingId, slideId) => {
-  const REDIS_CONFIG = Meteor.settings.redis;
-  const CHANNEL = REDIS_CONFIG.channels.toAkkaApps;
-  const EVENT_NAME = 'GetWhiteboardAnnotationsReqMsg';
-  const USER_ID = 'nodeJSapp';
-
-  const payload = {
-    whiteboardId: slideId,
-  };
-
-  return RedisPubSub.publishUserMessage(CHANNEL, EVENT_NAME, meetingId, USER_ID, payload);
-};
-
-const SUPPORTED_TYPES = [SVG, PNG];
-
-const fetchImageSizes = imageUri =>
-  probe(imageUri)
-    .then((result) => {
-      if (!SUPPORTED_TYPES.includes(result.mime)) {
-        throw new Meteor.Error(
-          'invalid-image-type', `received ${result.mime} expecting ${SUPPORTED_TYPES.join()}`,
-        );
-      }
-
-      return {
-        width: result.width,
-        height: result.height,
-      };
-    })
-    .catch((reason) => {
-      Logger.error(`Error parsing image size. ${reason}. uri=${imageUri}`);
-      return reason;
-    });
-
-export default function addSlide(meetingId, presentationId, slide) {
-  check(presentationId, String);
-
-  check(slide, {
-    id: String,
-    num: Number,
-    thumbUri: String,
-    swfUri: String,
-    txtUri: String,
-    svgUri: String,
-    current: Boolean,
-    xOffset: Number,
-    yOffset: Number,
-    widthRatio: Number,
-    heightRatio: Number,
-  });
-
-  const selector = {
-    meetingId,
-    presentationId,
-    id: slide.id,
-  };
-
-  const imageUri = slide.svgUri || slide.pngUri;
-
-  const modifier = {
-    $set: Object.assign(
-      { meetingId },
-      { presentationId },
-      flat(slide, { safe: true }),
-    ),
-  };
-
-  const cb = (err, numChanged) => {
-    if (err) {
-      return Logger.error(`Adding slide to collection: ${err}`);
-    }
-
-    const { insertedId } = numChanged;
-
-    requestWhiteboardHistory(meetingId, slide.id);
-
-    if (insertedId) {
-      return Logger.info(`Added slide id=${slide.id} to presentation=${presentationId}`);
-    }
-
-    return Logger.info(`Upserted slide id=${slide.id} to presentation=${presentationId}`);
-  };
-
-  return fetchImageSizes(imageUri)
-    .then(({ width, height }) => {
-      // there is a rare case when for a very long not-active meeting
-      // the presentation files just disappear
-      // in that case just set the whole calculatedData to undefined
-      if (!width && !height) {
-        modifier.$set.calculatedData = undefined;
-        return Slides.upsert(selector, modifier, cb);
-      }
-
-      // pre-calculating the width, height, and vieBox coordinates / dimensions
-      // to unload the client-side
-      const slideData = {
-        width,
-        height,
-        xOffset: modifier.$set.xOffset,
-        yOffset: modifier.$set.yOffset,
-        widthRatio: modifier.$set.widthRatio,
-        heightRatio: modifier.$set.heightRatio,
-      };
-      modifier.$set.calculatedData = calculateSlideData(slideData);
-      modifier.$set.calculatedData.imageUri = imageUri;
-      modifier.$set.calculatedData.width = width;
-      modifier.$set.calculatedData.height = height;
-
-      return Slides.upsert(selector, modifier, cb);
-    })
-    .catch(reason =>
-      Logger.error(`Error parsing image size. ${reason}. slide=${slide.id} uri=${imageUri}`));
-}
diff --git a/bigbluebutton-html5/imports/api/2.0/slides/server/modifiers/changeCurrentSlide.js b/bigbluebutton-html5/imports/api/2.0/slides/server/modifiers/changeCurrentSlide.js
deleted file mode 100644
index 3bda1944ee..0000000000
--- a/bigbluebutton-html5/imports/api/2.0/slides/server/modifiers/changeCurrentSlide.js
+++ /dev/null
@@ -1,61 +0,0 @@
-import { check } from 'meteor/check';
-import Slides from '/imports/api/2.0/slides';
-import Logger from '/imports/startup/server/logger';
-
-export default function changeCurrentSlide(meetingId, presentationId, slideId) {
-  check(meetingId, String);
-  check(presentationId, String);
-  check(slideId, String);
-
-  const oldCurrent = {
-    selector: {
-      meetingId,
-      presentationId,
-      current: true,
-    },
-    modifier: {
-      $set: { current: false },
-    },
-    callback: (err) => {
-      if (err) {
-        return Logger.error(`Unsetting the current slide: ${err}`);
-      }
-
-      return Logger.info('Unsetted the current slide');
-    },
-  };
-
-  const newCurrent = {
-    selector: {
-      meetingId,
-      presentationId,
-      id: slideId,
-    },
-    modifier: {
-      $set: { current: true },
-    },
-    callback: (err) => {
-      if (err) {
-        return Logger.error(`Setting as current slide id=${slideId}: ${err}`);
-      }
-
-      return Logger.info(`Setted as current slide id=${slideId}`);
-    },
-  };
-
-  const oldSlide = Slides.findOne(oldCurrent.selector);
-  const newSlide = Slides.findOne(newCurrent.selector);
-
-  // if the oldCurrent and newCurrent have the same ids
-  if (oldSlide && newSlide && (oldSlide._id === newSlide._id)) {
-    return;
-  }
-
-  if (newSlide) {
-    Slides.update(newSlide._id, newCurrent.modifier, newCurrent.callback);
-  }
-
-  if (oldSlide) {
-    Slides.update(oldSlide._id, oldCurrent.modifier, oldCurrent.callback);
-  }
-}
diff --git a/bigbluebutton-html5/imports/api/2.0/slides/server/modifiers/clearSlides.js b/bigbluebutton-html5/imports/api/2.0/slides/server/modifiers/clearSlides.js
deleted file mode 100644
index a8aa8096eb..0000000000
--- a/bigbluebutton-html5/imports/api/2.0/slides/server/modifiers/clearSlides.js
+++ /dev/null
@@ -1,10 +0,0 @@
-import Slides from '/imports/api/2.0/slides';
-import Logger from '/imports/startup/server/logger';
-
-export default function clearSlides(meetingId) {
-  if (meetingId) {
-    return Slides.remove({ meetingId }, Logger.info(`Cleared Slides (${meetingId})`));
-  }
-
-  return Slides.remove({}, Logger.info('Cleared Slides (all)'));
-}
diff --git a/bigbluebutton-html5/imports/api/2.0/slides/server/modifiers/clearSlidesPresentation.js b/bigbluebutton-html5/imports/api/2.0/slides/server/modifiers/clearSlidesPresentation.js
deleted file mode 100644
index cb20bf2fc4..0000000000
--- a/bigbluebutton-html5/imports/api/2.0/slides/server/modifiers/clearSlidesPresentation.js
+++ /dev/null
@@ -1,28 +0,0 @@
-import Slides from '/imports/api/2.0/slides';
-import Logger from '/imports/startup/server/logger';
-import { check } from 'meteor/check';
-import clearAnnotations from '/imports/api/2.0/annotations/server/modifiers/clearAnnotations';
-
-export default function clearSlidesPresentation(meetingId, presentationId) {
-  check(meetingId, String);
-  check(presentationId, String);
-
-  const selector = {
-    meetingId,
-    presentationId,
-  };
-
-  const whiteboardIds = Slides.find(selector).map(row => row.id);
-
-  const cb = (err) => {
-    if (err) {
-      return Logger.error(`Removing Slides from collection: ${err}`);
-    }
-
-    whiteboardIds.forEach(whiteboardId => clearAnnotations(meetingId, whiteboardId));
-
-    return Logger.info(`Removed Slides where presentationId=${presentationId}`);
-  };
-
-  return Slides.remove(selector, cb);
-}
diff --git a/bigbluebutton-html5/imports/api/2.0/slides/server/modifiers/resizeSlide.js b/bigbluebutton-html5/imports/api/2.0/slides/server/modifiers/resizeSlide.js
deleted file mode 100644
index ad00b54306..0000000000
--- a/bigbluebutton-html5/imports/api/2.0/slides/server/modifiers/resizeSlide.js
+++ /dev/null
@@ -1,58 +0,0 @@
-import { check } from 'meteor/check';
-import Slides from '/imports/api/2.0/slides';
-import Logger from '/imports/startup/server/logger';
-import calculateSlideData from '/imports/api/2.0/slides/server/helpers';
-
-export default function resizeSlide(meetingId, slide) {
-  check(meetingId, String);
-
-  const { presentationId } = slide;
-  const { pageId, widthRatio, heightRatio, xOffset, yOffset } = slide;
-
-  const selector = {
-    meetingId,
-    presentationId,
-    id: pageId,
-  };
-
-  const modifier = {
-    $set: {
-      widthRatio,
-      heightRatio,
-      xOffset,
-      yOffset,
-    },
-  };
-
-  // fetching the current slide data
-  // and pre-calculating the width, height, and vieBox coordinates / sizes
-  // to reduce the client-side load
-  const Slide = Slides.findOne(selector);
-  const slideData = {
-    width: Slide.calculatedData.width,
-    height: Slide.calculatedData.height,
-    xOffset,
-    yOffset,
-    widthRatio,
-    heightRatio,
-  };
-  const calculatedData = calculateSlideData(slideData);
-  calculatedData.imageUri = Slide.calculatedData.imageUri;
-  calculatedData.width = Slide.calculatedData.width;
-  calculatedData.height = Slide.calculatedData.height;
-  modifier.$set.calculatedData = calculatedData;
-
-  const cb = (err, numChanged) => {
-    if (err) {
-      return Logger.error(`Resizing slide id=${pageId}: ${err}`);
-    }
-
-    if (numChanged) {
-      return Logger.info(`Resized slide id=${pageId}`);
-    }
-
-    return Logger.info(`No slide found with id=${pageId}`);
-  };
-
-  return Slides.update(selector, modifier, cb);
-}
diff --git a/bigbluebutton-html5/imports/api/2.0/slides/server/publishers.js b/bigbluebutton-html5/imports/api/2.0/slides/server/publishers.js
deleted file mode 100644
index 1bc992720f..0000000000
--- a/bigbluebutton-html5/imports/api/2.0/slides/server/publishers.js
+++ /dev/null
@@ -1,24 +0,0 @@
-import Slides from '/imports/api/2.0/slides';
-import { Meteor } from 'meteor/meteor';
-import { check } from 'meteor/check';
-import Logger from '/imports/startup/server/logger';
-import mapToAcl from '/imports/startup/mapToAcl';
-
-function slides(credentials) {
-  const { meetingId, requesterUserId, requesterToken } = credentials;
-
-  check(meetingId, String);
-  check(requesterUserId, String);
-  check(requesterToken, String);
-
-  Logger.info(`Publishing Slides for ${meetingId} ${requesterUserId} ${requesterToken}`);
-
-  return Slides.find({ meetingId });
-}
-
-function publish(...args) {
-  const boundSlides = slides.bind(this);
-  return mapToAcl('subscriptions.slides', boundSlides)(args);
-}
-
-Meteor.publish('slides2x', publish);
-- 
GitLab