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 @@
<%= render 'shared/title', title: t('join'), title_class: 'join-meeting-title' %> - <%= render 'shared/join_form' %> +
diff --git a/app/views/landing/_rooms_center_panel.html.erb b/app/views/landing/_rooms_center_panel.html.erb index 5321a4f4..c87e4e8c 100644 --- a/app/views/landing/_rooms_center_panel.html.erb +++ b/app/views/landing/_rooms_center_panel.html.erb @@ -31,18 +31,8 @@ with BigBlueButton; if not, see .
<% if admin? %> <%= render 'shared/meeting_name_form' %> -
-
- <%= render 'shared/title', title: t('invite') do %> - <%= t('invite_description') %> - <% end %> - <%= render 'shared/meeting_url', hidden: false %> -
-
-
- <%= render 'shared/title', title: t('join'), title_class: 'join-meeting-title' %> - <%= render 'shared/join_form' %> -
+
+ <%= render 'landing/invite_join' %>
<% else %> <%= render 'shared/meeting_url', hidden: true %> diff --git a/app/views/landing/_rooms_meetings_center_panel.html.erb b/app/views/landing/_rooms_meetings_center_panel.html.erb new file mode 100644 index 00000000..c80f0141 --- /dev/null +++ b/app/views/landing/_rooms_meetings_center_panel.html.erb @@ -0,0 +1,29 @@ + + +<% content_for :title do %> +
+

+ <%= t('join_session_id', id: @meeting_id) %> +

+
+<% end %> + +<%= render layout: 'shared/center_panel' do %> +
+ <%= render 'shared/meeting_url', hidden: true %> + <%= render 'shared/join_form' %> +
+<% end %> diff --git a/app/views/landing/rooms.html.erb b/app/views/landing/rooms.html.erb index 1fc84c05..6184ad6f 100644 --- a/app/views/landing/rooms.html.erb +++ b/app/views/landing/rooms.html.erb @@ -19,11 +19,15 @@ with BigBlueButton; if not, see . <% page_title= t('greet_guest', name: @user.username) %> <% end %> -
+
- <%= render 'rooms_center_panel' %> + <% if @main_room %> + <%= render 'rooms_center_panel' %> + <% else %> + <%= render 'rooms_meetings_center_panel' %> + <% end %>
<%= render 'shared/signup' %> diff --git a/app/views/landing/session_status_refresh.html.erb b/app/views/landing/session_status_refresh.html.erb index fdb2c9f5..983fbb77 100644 --- a/app/views/landing/session_status_refresh.html.erb +++ b/app/views/landing/session_status_refresh.html.erb @@ -13,4 +13,4 @@ You should have received a copy of the GNU Lesser General Public License along with BigBlueButton; if not, see . --> -<%= render 'rooms_center_panel' %> +<%= render 'rooms_meetings_center_panel' %> diff --git a/config/routes.rb b/config/routes.rb index 056ba8ab..8725dff3 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -30,14 +30,17 @@ Rails.application.routes.draw do # rooms offer a customized landing page for authenticated users to create and join session in BigBlueButton get '/:resource/:id', to: 'landing#resource', as: :resource get '/:resource/:id/join', to: 'bbb#join', as: :bbb_join, defaults: {format: 'json'} - get '/:resource/:id/wait', to: 'landing#wait_for_moderator' - get '/:resource/:id/session_status_refresh', to: 'landing#session_status_refresh' + + get '/rooms/:room_id/recordings', to: 'bbb#recordings', defaults: {format: 'json'} post '/:resource/:id/callback', to: 'bbb#callback' #, defaults: {format: 'json'} - delete '/rooms/:id/end', to: 'bbb#end', defaults: {format: 'json'} - get '/:resource/:room_id/:id/join', to: 'bbb#join', defaults: {format: 'json'} - get '/rooms/:id/recordings', to: 'bbb#recordings', defaults: {format: 'json'} patch '/rooms/:id/recordings/:record_id', to: 'bbb#update_recordings', defaults: {format: 'json'} delete '/rooms/:id/recordings/:record_id', to: 'bbb#delete_recordings', defaults: {format: 'json'} + get '/:resource/:room_id/:id/wait', to: 'landing#wait_for_moderator' + get '/:resource/:room_id/:id/session_status_refresh', to: 'landing#session_status_refresh' + delete '/rooms/:room_id/:id/end', to: 'bbb#end', defaults: {format: 'json'} + get '/rooms/:room_id/:id', to: 'landing#resource', resource: 'rooms' + get '/:resource/:room_id/:id/join', to: 'bbb#join', defaults: {format: 'json'} - root to: 'landing#index', :resource => "meetings" + + root to: 'landing#index', :resource => 'meetings' end diff --git a/test/controllers/landing_controller_test.rb b/test/controllers/landing_controller_test.rb index bdb4ac76..4a698af5 100644 --- a/test/controllers/landing_controller_test.rb +++ b/test/controllers/landing_controller_test.rb @@ -39,12 +39,12 @@ class LandingControllerTest < ActionController::TestCase end test "should get wait for moderator" do - get :wait_for_moderator, params: { id: @user.encrypted_id, resource: 'rooms' } + get :wait_for_moderator, params: { room_id: @user.encrypted_id, id: 'room1', resource: 'rooms' } assert_response :success end test "should get session status refresh" do - get :wait_for_moderator, params: { id: @user.encrypted_id, resource: 'rooms' } + get :wait_for_moderator, params: { room_id: @user.encrypted_id, id: 'room1', resource: 'rooms' } assert_response :success end