diff --git a/app/assets/javascripts/channels/meeting_updates.js b/app/assets/javascripts/channels/meeting_updates.js index 87f6af15..ddde60f8 100644 --- a/app/assets/javascripts/channels/meeting_updates.js +++ b/app/assets/javascripts/channels/meeting_updates.js @@ -23,10 +23,11 @@ }); }; - var initRooms = function() { - App.messages = App.cable.subscriptions.create({ + var enableMeetingUpdates = function() { + App.meeting_update = App.cable.subscriptions.create({ channel: 'MeetingUpdatesChannel', - encrypted_id: $(".page-wrapper").data('id') + admin_id: $(".page-wrapper.rooms").data('admin-id'), + meeting_id: $(".page-wrapper.rooms").data('id') }, { received: function(data) { @@ -55,10 +56,21 @@ }); }; + var disableMeetingUpdates = function() { + App.meeting_update.unsubscribe(); + delete App.meeting_update + }; + $(document).on("turbolinks:load", function() { if ($("body[data-controller=landing]").get(0)) { if ($("body[data-action=rooms]").get(0)) { - initRooms(); + // disable meeting updates if enabled from a previous page + if (App.meeting_update) { + disableMeetingUpdates(); + } + if ($(".page-wrapper.rooms").data('main-room') === false) { + enableMeetingUpdates(); + } } } }); diff --git a/app/assets/javascripts/landing.js b/app/assets/javascripts/landing.js index 1444c839..92058407 100644 --- a/app/assets/javascripts/landing.js +++ b/app/assets/javascripts/landing.js @@ -64,6 +64,10 @@ } }); + $('.center-panel-wrapper').on ('click', '.meeting-start', function (event) { + Turbolinks.visit(Meeting.getInstance().getURL()); + }); + $('.center-panel-wrapper').on ('keypress', '.meeting-user-name', function (event) { if (event.keyCode === 13) { event.preventDefault(); @@ -192,12 +196,15 @@ displayRoomURL(); $('.center-panel-wrapper').on('keyup', '.meeting-name', function (event, msg) { - var newName = $(this).val(); - // Meeting.getInstance().setMeetingId(newId); - Meeting.getInstance().setMeetingName(newName); - // $(".page-wrapper.meetings").data('id', newId); - // $('.meeting-url').val(Meeting.getInstance().getURL()); - // $('.join-meeting-title').html(I18n.join_title.replace(/%{id}/, newId)); + var newId = $(this).val(); + Meeting.getInstance().setMeetingId(newId); + $('.meeting-url').val(Meeting.getInstance().getURL()); + $('.join-meeting-title').html(I18n.join_title.replace(/%{id}/, newId)); + if (newId === '') { + $('.invite-join-wrapper').addClass('hidden'); + } else { + $('.invite-join-wrapper').removeClass('hidden'); + } }); Recordings.getInstance().refresh(); diff --git a/app/assets/javascripts/meeting.coffee b/app/assets/javascripts/meeting.coffee index 45b03ef4..05b4da94 100644 --- a/app/assets/javascripts/meeting.coffee +++ b/app/assets/javascripts/meeting.coffee @@ -19,28 +19,30 @@ _meetingInstance = null class @Meeting - constructor: (@meetingId, @type, @userName, @meetingName) -> + constructor: (@meetingId, @type, @userName, @adminId) -> # Gets the current instance or creates a new one @getInstance: -> if _meetingInstance return _meetingInstance - id = $(".page-wrapper").data('id') + meetingId = $(".page-wrapper").data('id') if (type = location.pathname.split('/')[1]) != 'rooms' type = 'meetings' name = $('.meeting-user-name').val() - _meetingInstance = new Meeting(id, type, name) + adminId = $(".page-wrapper").data('admin-id') + _meetingInstance = new Meeting(meetingId, type, name, adminId) return _meetingInstance @clear: -> _meetingInstance = null - @buildMeetingURL: (id, type, name) -> - if name - name = '/' + encodeURIComponent(name) + @buildMeetingURL: (meetingId, type, adminId) -> + fullId = '' + if adminId + fullId = encodeURIComponent(adminId) + '/' + encodeURIComponent(meetingId) else - name = '' - return @buildFullDomainURL() + '/' + type + '/' + encodeURIComponent(id) + name + fullId = encodeURIComponent(meetingId) + return @buildFullDomainURL() + '/' + type + '/' + fullId @buildFullDomainURL: -> url = location.protocol + '//' + location.hostname @@ -84,8 +86,11 @@ class @Meeting @meetingId = id return this - setMeetingName: (name) -> - @meetingName = name + getAdminId: -> + return @adminId + + setAdminId: (id) -> + @adminId = id return this getType: -> @@ -96,7 +101,7 @@ class @Meeting return this getURL: -> - return Meeting.buildMeetingURL(@meetingId, @type, @meetingName) + return Meeting.buildMeetingURL(@meetingId, @type, @adminId) getUserName: -> return @userName diff --git a/app/assets/javascripts/recordings.coffee b/app/assets/javascripts/recordings.coffee index 0a53ca98..af206b5f 100644 --- a/app/assets/javascripts/recordings.coffee +++ b/app/assets/javascripts/recordings.coffee @@ -157,7 +157,7 @@ class @Recordings # refresh the recordings from the server refresh: -> table_api = this.table.api() - $.get "/rooms/"+Meeting.getInstance().getMeetingId()+"/recordings", (data) => + $.get "/rooms/"+Meeting.getInstance().getAdminId()+"/recordings", (data) => @setOwner(data.is_owner) if !@owner table_api.column(-1).visible(false) diff --git a/app/channels/meeting_updates_channel.rb b/app/channels/meeting_updates_channel.rb index 27be305d..127c18da 100644 --- a/app/channels/meeting_updates_channel.rb +++ b/app/channels/meeting_updates_channel.rb @@ -16,6 +16,12 @@ class MeetingUpdatesChannel < ApplicationCable::Channel def subscribed - stream_from "#{params[:encrypted_id]}_meeting_updates_channel" + + full_id = if params[:meeting_id].present? + "#{params[:admin_id]}-#{params[:meeting_id]}" + else + params[:admin_id] + end + stream_from "#{full_id}_meeting_updates_channel" end end diff --git a/app/controllers/bbb_controller.rb b/app/controllers/bbb_controller.rb index ab0b2d65..1ef59478 100644 --- a/app/controllers/bbb_controller.rb +++ b/app/controllers/bbb_controller.rb @@ -42,11 +42,13 @@ class BbbController < ApplicationController ) end - meeting_id = params[:room_id] + meeting_id = "#{params[:room_id]}-#{params[:id]}" meeting_name = params[:id] + meeting_path = "#{params[:room_id]}/#{params[:id]}" else - meeting_id = params[:id] user = User.find_by encrypted_id: params[:id] + meeting_id = params[:id] + meeting_path = meeting_id end options = if user @@ -62,7 +64,7 @@ class BbbController < ApplicationController } end - base_url = "#{request.base_url}/#{params[:resource]}/#{meeting_id}" + base_url = "#{request.base_url}/#{params[:resource]}/#{meeting_path}" options[:meeting_logout_url] = base_url options[:hook_url] = "#{base_url}/callback" @@ -74,11 +76,11 @@ class BbbController < ApplicationController # the user can join the meeting if bbb_res[:returncode] && current_user && current_user == user - JoinMeetingJob.perform_later(meeting_id) + JoinMeetingJob.perform_later(user.encrypted_id, params[:id]) # user will be waiting for a moderator else - NotifyUserWaitingJob.perform_later(meeting_id, params[:name]) + NotifyUserWaitingJob.perform_later(user.encrypted_id, params[:id], params[:name]) end render_bbb_response bbb_res, bbb_res[:response] @@ -103,9 +105,9 @@ class BbbController < ApplicationController def end load_and_authorize_room_owner! - bbb_res = bbb_end_meeting @user.encrypted_id + bbb_res = bbb_end_meeting "#{@user.encrypted_id}-#{params[:id]}" if bbb_res[:returncode] - EndMeetingJob.perform_later(@user.encrypted_id) + EndMeetingJob.perform_later(@user.encrypted_id, params[:id]) end render_bbb_response bbb_res end @@ -114,7 +116,8 @@ class BbbController < ApplicationController def recordings load_room! - bbb_res = bbb_get_recordings @user.encrypted_id + # bbb_res = bbb_get_recordings "#{@user.encrypted_id}-#{params[:id]}" + bbb_res = bbb_get_recordings "#{@user.encrypted_id}" render_bbb_response bbb_res, bbb_res[:recordings] end @@ -141,7 +144,7 @@ class BbbController < ApplicationController private def load_room! - @user = User.find_by encrypted_id: params[:id] + @user = User.find_by encrypted_id: params[:room_id] if !@user render head(:not_found) && return end @@ -158,7 +161,7 @@ class BbbController < ApplicationController def authorize_recording_owner! load_and_authorize_room_owner! - recordings = bbb_get_recordings(params[:id])[:recordings] + recordings = bbb_get_recordings(params[:room_id])[:recordings] recordings.each do |recording| if recording[:recordID] == params[:record_id] return true diff --git a/app/controllers/landing_controller.rb b/app/controllers/landing_controller.rb index 249c8172..d6e63224 100644 --- a/app/controllers/landing_controller.rb +++ b/app/controllers/landing_controller.rb @@ -35,12 +35,13 @@ class LandingController < ApplicationController end def session_status_refresh - @user = User.find_by(encrypted_id: params[:id]) + @user = User.find_by(encrypted_id: params[:room_id]) if @user.nil? render head(:not_found) && return end - @meeting_running = bbb_get_meeting_info(@user.encrypted_id)[:returncode] + @meeting_id = params[:id] + @meeting_running = bbb_get_meeting_info("#{@user.encrypted_id}-#{params[:id]}")[:returncode] render layout: false end @@ -65,13 +66,15 @@ class LandingController < ApplicationController def render_room params[:action] = 'rooms' - @user = User.find_by(encrypted_id: params[:id]) + @user = User.find_by(encrypted_id: params[:room_id] || params[:id]) if @user.nil? redirect_to root_path return end - @meeting_running = bbb_get_meeting_info(@user.encrypted_id)[:returncode] + @meeting_id = params[:id] + @meeting_running = bbb_get_meeting_info("#{@user.encrypted_id}-#{@meeting_id}")[:returncode] + @main_room = @meeting_id.blank? || @meeting_id == @user.encrypted_id render :action => 'rooms' end diff --git a/app/helpers/users_helper.rb b/app/helpers/users_helper.rb index 19758ad6..7919773b 100644 --- a/app/helpers/users_helper.rb +++ b/app/helpers/users_helper.rb @@ -17,6 +17,6 @@ module UsersHelper def is_room_owner token = current_user ? current_user.encrypted_id : nil - token.present? && params[:id].present? && token == params[:id] + token.present? && params[:room_id].present? && token == params[:room_id] end end diff --git a/app/jobs/end_meeting_job.rb b/app/jobs/end_meeting_job.rb index 235c0f78..66711057 100644 --- a/app/jobs/end_meeting_job.rb +++ b/app/jobs/end_meeting_job.rb @@ -19,15 +19,15 @@ class EndMeetingJob < ApplicationJob queue_as :default - def perform(room) + def perform(room, meeting) tries = 0 sleep_time = 2 while tries < 4 - bbb_res = bbb_get_meeting_info(room) + bbb_res = bbb_get_meeting_info("#{room}-#{meeting}") if !bbb_res[:returncode] - ActionCable.server.broadcast "#{room}_meeting_updates_channel", + ActionCable.server.broadcast "#{room}-#{meeting}_meeting_updates_channel", action: 'meeting_ended' break end diff --git a/app/jobs/join_meeting_job.rb b/app/jobs/join_meeting_job.rb index feb4f303..02dc2db4 100644 --- a/app/jobs/join_meeting_job.rb +++ b/app/jobs/join_meeting_job.rb @@ -17,8 +17,8 @@ class JoinMeetingJob < ApplicationJob queue_as :default - def perform(room) - ActionCable.server.broadcast "#{room}_meeting_updates_channel", + def perform(room, meeting) + ActionCable.server.broadcast "#{room}-#{meeting}_meeting_updates_channel", action: 'moderator_joined', moderator: 'joined' end diff --git a/app/jobs/notify_user_waiting_job.rb b/app/jobs/notify_user_waiting_job.rb index 0211e42a..2437d840 100644 --- a/app/jobs/notify_user_waiting_job.rb +++ b/app/jobs/notify_user_waiting_job.rb @@ -17,8 +17,8 @@ class NotifyUserWaitingJob < ApplicationJob queue_as :default - def perform(room, user) - ActionCable.server.broadcast "#{room}_meeting_updates_channel", + def perform(room, meeting, user) + ActionCable.server.broadcast "#{room}-#{meeting}_meeting_updates_channel", { action: 'user_waiting', user: user } end end diff --git a/app/views/landing/_invite_join.html.erb b/app/views/landing/_invite_join.html.erb index e143c74a..7f11b5b0 100644 --- a/app/views/landing/_invite_join.html.erb +++ b/app/views/landing/_invite_join.html.erb @@ -8,6 +8,8 @@