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