From 3aeef0a4cf561982edcb40bb622e6996a604d02e Mon Sep 17 00:00:00 2001 From: Zachary Chai Date: Wed, 26 Oct 2016 13:41:55 -0400 Subject: [PATCH 1/2] refactor bbb helper and implement wait for mod --- app/assets/javascripts/landing.js | 16 +++++--- app/controllers/bbb_controller.rb | 43 +++++++++++-------- app/controllers/landing_controller.rb | 1 + app/helpers/bbb_helper.rb | 57 ++++++++++++++++++++++---- app/views/bbb/end.html.erb | 2 - app/views/bbb/join.html.erb | 2 - app/views/bbb/join.jbuilder | 8 ++++ app/views/shared/_meeting_url.html.erb | 4 +- config/routes.rb | 2 +- 9 files changed, 98 insertions(+), 37 deletions(-) delete mode 100644 app/views/bbb/end.html.erb delete mode 100644 app/views/bbb/join.html.erb create mode 100644 app/views/bbb/join.jbuilder diff --git a/app/assets/javascripts/landing.js b/app/assets/javascripts/landing.js index 9ede6b12..c3b3fde3 100644 --- a/app/assets/javascripts/landing.js +++ b/app/assets/javascripts/landing.js @@ -33,16 +33,22 @@ var link = window.location.protocol + '//' + window.location.hostname + - '/' + - 'meetings/' + + '/meetings/' + Math.trunc(Math.random() * 1000000000); $('.meeting-url').val(link); }); - - $('.meeting-url').val(''); - $('.generate-link').click(); + if (meetingId = $('.meeting-url').data('meetingId')) { + var link = window.location.protocol + + '//' + + window.location.hostname + + '/meetings/' + + meetingId; + $('.meeting-url').val(link) + } else { + $('.generate-link').click(); + } }; var initRooms = function() { diff --git a/app/controllers/bbb_controller.rb b/app/controllers/bbb_controller.rb index 9e50f497..8181a343 100644 --- a/app/controllers/bbb_controller.rb +++ b/app/controllers/bbb_controller.rb @@ -1,33 +1,40 @@ class BbbController < ApplicationController - # GET /join - # GET /join.json + # GET /:resource/:id/join def join - if ( !params.has_key?(:id) ) + if ( !params[:id] ) render_response("missing_parameter", "meeting token was not included", :bad_request) - elsif ( !params.has_key?(:name) ) + elsif ( !params[:name] ) render_response("missing_parameter", "user name was not included", :bad_request) else - bbb_join_url = helpers.bbb_join_url(params[:id], false, params[:name], false, "#{request.base_url}/#{params[:resource]}/#{params[:id]}") - if bbb_join_url[:returncode] - logger.info "#Execute the redirect" - render_response("ok", "execute the redirect", :ok, {:join_url => bbb_join_url[:join_url]}) + user = User.find_by username: params[:id] + + options = if user + { + wait_for_moderator: true, + user_is_moderator: current_user == user + } else - render_response("bigbluebutton_error", "join url could not be created", :internal_server_error) + {} end + options[:meeting_logout_url] = "#{request.base_url}/#{params[:resource]}/#{params[:id]}" + + bbb_res = helpers.bbb_join_url( + params[:id], + params[:name], + options + ) + + render_response bbb_res[:messageKey], bbb_res[:message], bbb_res[:status], bbb_res[:response] end end private def render_response(messageKey, message, status, response={}) - respond_to do |format| - if (status == :ok) - format.html { render :template => "bbb/join" } - format.json { render :json => { :messageKey => messageKey, :message => message, :status => status, :response => response }, :status => status } - else - format.html { render :template => "errors/error" } - format.json { render :json => { :messageKey => messageKey, :message => message, :status => status, :response => response }, :status => status } - end - end + @messageKey = messageKey + @message = message + @status = status + @response = response + render status: @status && return end end diff --git a/app/controllers/landing_controller.rb b/app/controllers/landing_controller.rb index 689080ef..462f749b 100644 --- a/app/controllers/landing_controller.rb +++ b/app/controllers/landing_controller.rb @@ -18,6 +18,7 @@ class LandingController < ApplicationController private def render_meeting + @meeting_id = params[:id] params[:action] = 'meetings' render :action => 'meeting' end diff --git a/app/helpers/bbb_helper.rb b/app/helpers/bbb_helper.rb index 91130568..f0034065 100644 --- a/app/helpers/bbb_helper.rb +++ b/app/helpers/bbb_helper.rb @@ -13,10 +13,15 @@ module BbbHelper return password end - def bbb_join_url(meeting_token, meeting_recorded=false, user_fullname='User', user_is_moderator=false, meeting_logout_url=nil) + def bbb_join_url(meeting_token, full_name, options={}) + options[:meeting_recorded] ||= false + options[:user_is_moderator] ||= false + options[:wait_for_moderator] ||= false + options[:meeting_logout_url] ||= nil + bbb ||= BigBlueButton::BigBlueButtonApi.new(bbb_endpoint + "api", bbb_secret, "0.8", true) if !bbb - return { :returncode => false, :messageKey => "BBBAPICallInvalid", :message => "BBB API call invalid." } + return call_invalid_res else meeting_id = (Digest::SHA1.hexdigest(Rails.application.secrets[:secret_key_base]+meeting_token)).to_s @@ -24,14 +29,18 @@ module BbbHelper begin bbb_meeting_info = bbb.get_meeting_info( meeting_id, nil ) rescue BigBlueButton::BigBlueButtonException => exc + if options[:wait_for_moderator] && !options[:user_is_moderator] + return wait_moderator_res + end + # This means that is not created logger.info "Message for the log file #{exc.key}: #{exc.message}" # Prepare parameters for create - logout_url = meeting_logout_url || logout_url = "#{request.base_url}" + logout_url = options[:meeting_logout_url] || "#{request.base_url}" moderator_password = random_password(12) viewer_password = random_password(12) - meeting_options = {:record => meeting_recorded.to_s, :logoutURL => logout_url, :moderatorPW => moderator_password, :attendeePW => viewer_password } + meeting_options = {:record => options[:meeting_recorded].to_s, :logoutURL => logout_url, :moderatorPW => moderator_password, :attendeePW => viewer_password } # Create the meeting bbb.create_meeting(meeting_token, meeting_id, meeting_options) @@ -40,14 +49,48 @@ module BbbHelper bbb_meeting_info = bbb.get_meeting_info( meeting_id, nil ) end + if options[:wait_for_moderator] && !options[:user_is_moderator] && bbb_meeting_info[:moderatorCount] <= 0 + return wait_moderator_res + end + # Get the join url - if (user_is_moderator) + if (options[:user_is_moderator]) password = bbb_meeting_info[:moderatorPW] else password = bbb_meeting_info[:attendeePW] end - join_url = bbb.join_meeting_url(meeting_id, user_fullname, password ) - return { :returncode => true, :join_url => join_url, :messageKey => "", :message => "" } + join_url = bbb.join_meeting_url(meeting_id, full_name, password ) + return success_res(join_url) end end + + def success_res(join_url) + { + returncode: true, + messageKey: "ok", + message: "Execute the redirect", + status: :ok, + response: { + join_url: join_url + } + } + end + + def wait_moderator_res + { + returncode: false, + messageKey: "WaitModerator", + message: "Waiting for moderator", + status: :ok + } + end + + def call_invalid_res + { + returncode: false, + messageKey: "BBBAPICallInvalid", + message: "BBB API call invalid.", + status: :internal_server_error + } + end end diff --git a/app/views/bbb/end.html.erb b/app/views/bbb/end.html.erb deleted file mode 100644 index ad2b2d3f..00000000 --- a/app/views/bbb/end.html.erb +++ /dev/null @@ -1,2 +0,0 @@ -

Bbb#end

-

Find me in app/views/bbb/end.html.erb

diff --git a/app/views/bbb/join.html.erb b/app/views/bbb/join.html.erb deleted file mode 100644 index 55f29286..00000000 --- a/app/views/bbb/join.html.erb +++ /dev/null @@ -1,2 +0,0 @@ -

Bbb#join

-

Find me in app/views/bbb/join.html.erb

diff --git a/app/views/bbb/join.jbuilder b/app/views/bbb/join.jbuilder new file mode 100644 index 00000000..cc60f524 --- /dev/null +++ b/app/views/bbb/join.jbuilder @@ -0,0 +1,8 @@ +json.messageKey @messageKey +json.message @message +json.status @status +if @response + json.response do + json.join_url(@response[:join_url]) if @response[:join_url] + end +end diff --git a/app/views/shared/_meeting_url.html.erb b/app/views/shared/_meeting_url.html.erb index 88056e75..0ef8f0f6 100644 --- a/app/views/shared/_meeting_url.html.erb +++ b/app/views/shared/_meeting_url.html.erb @@ -1,6 +1,6 @@ -