forked from External/greenlight
add recordings api actions
This commit is contained in:
parent
fdf6f0e2c4
commit
3871e0129c
|
@ -1,17 +1,18 @@
|
||||||
class BbbController < ApplicationController
|
class BbbController < ApplicationController
|
||||||
|
|
||||||
|
before_action :authorize_owner_recording, only: [:update_recordings, :delete_recordings]
|
||||||
|
|
||||||
# GET /:resource/:id/join
|
# GET /:resource/:id/join
|
||||||
def join
|
def join
|
||||||
if ( params[:id].blank? )
|
if params[:name].blank?
|
||||||
render_response("missing_parameter", "meeting token was not included", :bad_request)
|
render_bbb_response("missing_parameter", "user name was not included", :unprocessable_entity)
|
||||||
elsif ( params[:name].blank? )
|
|
||||||
render_response("missing_parameter", "user name was not included", :bad_request)
|
|
||||||
else
|
else
|
||||||
user = User.find_by username: params[:id]
|
user = User.find_by username: params[:id]
|
||||||
|
|
||||||
options = if user
|
options = if user
|
||||||
{
|
{
|
||||||
wait_for_moderator: true,
|
wait_for_moderator: true,
|
||||||
|
meeting_recorded: true,
|
||||||
user_is_moderator: current_user == user
|
user_is_moderator: current_user == user
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
|
@ -25,22 +26,63 @@ class BbbController < ApplicationController
|
||||||
options
|
options
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
if bbb_res[:returncode] && current_user && current_user == user
|
if bbb_res[:returncode] && current_user && current_user == user
|
||||||
ActionCable.server.broadcast "moderator_#{user.username}_join_channel",
|
ActionCable.server.broadcast "moderator_#{user.username}_join_channel",
|
||||||
moderator: "joined"
|
moderator: "joined"
|
||||||
end
|
end
|
||||||
|
|
||||||
render_response bbb_res[:messageKey], bbb_res[:message], bbb_res[:status], bbb_res[:response]
|
render_bbb_response bbb_res, bbb_res[:response]
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
# GET /rooms/:id/recordings
|
||||||
|
def recordings
|
||||||
|
user = User.find_by username: params[:id]
|
||||||
|
if !user
|
||||||
|
render head(:not_found) && return
|
||||||
|
end
|
||||||
|
|
||||||
|
bbb_res = helpers.bbb_get_recordings user.username
|
||||||
|
render_bbb_response bbb_res, bbb_res[:recordings]
|
||||||
|
end
|
||||||
|
|
||||||
|
# PATCH /rooms/:id/recordings/:record_id
|
||||||
|
def update_recordings
|
||||||
|
bbb_res = helpers.bbb_update_recordings(params[:record_id], params[:published] == 'true')
|
||||||
|
render_bbb_response bbb_res, bbb_res[:recordings]
|
||||||
|
end
|
||||||
|
|
||||||
|
# DELETE /rooms/:id/recordings/:record_id
|
||||||
|
def delete_recordings
|
||||||
|
byebug
|
||||||
|
bbb_res = helpers.bbb_delete_recordings(params[:record_id])
|
||||||
|
render_bbb_response bbb_res, bbb_res[:recordings]
|
||||||
|
end
|
||||||
|
|
||||||
private
|
private
|
||||||
def render_response(messageKey, message, status, response={})
|
|
||||||
@messageKey = messageKey
|
def authorize_owner_recording
|
||||||
@message = message
|
user = User.find_by username: params[:id]
|
||||||
@status = status
|
if !user
|
||||||
|
render head(:not_found) && return
|
||||||
|
elsif !current_user || current_user != user
|
||||||
|
render head(:unauthorized) && return
|
||||||
|
end
|
||||||
|
|
||||||
|
recordings = helpers.bbb_get_recordings(params[:record_id])[:recordings]
|
||||||
|
recordings.each do |recording|
|
||||||
|
if recording[:recordID] == params[:record_id]
|
||||||
|
return true
|
||||||
|
end
|
||||||
|
end
|
||||||
|
render head(:not_found) && return
|
||||||
|
end
|
||||||
|
|
||||||
|
def render_bbb_response(bbb_res, response)
|
||||||
|
@messageKey = bbb_res[:messageKey]
|
||||||
|
@message = bbb_res[:message]
|
||||||
|
@status = bbb_res[:status]
|
||||||
@response = response
|
@response = response
|
||||||
render status: @status
|
render status: @status && return
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
|
@ -7,6 +7,10 @@ module BbbHelper
|
||||||
Rails.application.secrets[:bbb_secret]
|
Rails.application.secrets[:bbb_secret]
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def bbb
|
||||||
|
@bbb ||= BigBlueButton::BigBlueButtonApi.new(bbb_endpoint + "api", bbb_secret, "0.8", true)
|
||||||
|
end
|
||||||
|
|
||||||
def random_password(length)
|
def random_password(length)
|
||||||
o = [('a'..'z'), ('A'..'Z')].map { |i| i.to_a }.flatten
|
o = [('a'..'z'), ('A'..'Z')].map { |i| i.to_a }.flatten
|
||||||
password = (0...length).map { o[rand(o.length)] }.join
|
password = (0...length).map { o[rand(o.length)] }.join
|
||||||
|
@ -19,7 +23,6 @@ module BbbHelper
|
||||||
options[:wait_for_moderator] ||= false
|
options[:wait_for_moderator] ||= false
|
||||||
options[:meeting_logout_url] ||= nil
|
options[:meeting_logout_url] ||= nil
|
||||||
|
|
||||||
bbb ||= BigBlueButton::BigBlueButtonApi.new(bbb_endpoint + "api", bbb_secret, "0.8", true)
|
|
||||||
if !bbb
|
if !bbb
|
||||||
return call_invalid_res
|
return call_invalid_res
|
||||||
else
|
else
|
||||||
|
@ -41,8 +44,7 @@ module BbbHelper
|
||||||
logout_url = options[:meeting_logout_url] || "#{request.base_url}"
|
logout_url = options[:meeting_logout_url] || "#{request.base_url}"
|
||||||
moderator_password = random_password(12)
|
moderator_password = random_password(12)
|
||||||
viewer_password = random_password(12)
|
viewer_password = random_password(12)
|
||||||
meeting_options = {:record => options[: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
|
# Create the meeting
|
||||||
bbb.create_meeting(meeting_token, meeting_id, meeting_options)
|
bbb.create_meeting(meeting_token, meeting_id, meeting_options)
|
||||||
|
|
||||||
|
@ -65,6 +67,34 @@ module BbbHelper
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def bbb_get_recordings(meeting_token)
|
||||||
|
meeting_id = (Digest::SHA1.hexdigest(Rails.application.secrets[:secret_key_base]+meeting_token)).to_s
|
||||||
|
bbb_safe_execute :get_recordings, meetingID: meeting_id
|
||||||
|
end
|
||||||
|
|
||||||
|
def bbb_update_recordings(id, published)
|
||||||
|
bbb_safe_execute :publish_recordings, id, published
|
||||||
|
end
|
||||||
|
|
||||||
|
def bbb_delete_recordings(id)
|
||||||
|
bbb_safe_execute :delete_recordings, id
|
||||||
|
end
|
||||||
|
|
||||||
|
# method must be a symbol of the method's name
|
||||||
|
def bbb_safe_execute(method, *args)
|
||||||
|
if !bbb
|
||||||
|
return call_invalid_res
|
||||||
|
else
|
||||||
|
begin
|
||||||
|
response_data = bbb.send(method, *args)
|
||||||
|
response_data[:status] = :ok
|
||||||
|
rescue BigBlueButton::BigBlueButtonException => exc
|
||||||
|
response_data = bbb_exception_res exc
|
||||||
|
end
|
||||||
|
end
|
||||||
|
response_data
|
||||||
|
end
|
||||||
|
|
||||||
def success_res(join_url)
|
def success_res(join_url)
|
||||||
{
|
{
|
||||||
returncode: true,
|
returncode: true,
|
||||||
|
@ -94,4 +124,13 @@ module BbbHelper
|
||||||
status: :internal_server_error
|
status: :internal_server_error
|
||||||
}
|
}
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def bbb_exception_res(exc)
|
||||||
|
{
|
||||||
|
returncode: false,
|
||||||
|
messageKey: 'BBB'+exc.key.capitalize.underscore,
|
||||||
|
message: exc.message,
|
||||||
|
status: :internal_server_error
|
||||||
|
}
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
|
@ -0,0 +1,3 @@
|
||||||
|
json.messageKey messageKey
|
||||||
|
json.message message
|
||||||
|
json.status status
|
|
@ -0,0 +1 @@
|
||||||
|
json.partial! 'bbb', messageKey: @messageKey, message: @message, status: @status
|
|
@ -1,7 +1,5 @@
|
||||||
json.messageKey @messageKey
|
json.partial! 'bbb', messageKey: @messageKey, message: @message, status: @status
|
||||||
json.message @message
|
unless @response.blank?
|
||||||
json.status @status
|
|
||||||
if @response
|
|
||||||
json.response do
|
json.response do
|
||||||
json.join_url(@response[:join_url]) if @response[:join_url]
|
json.join_url(@response[:join_url]) if @response[:join_url]
|
||||||
end
|
end
|
||||||
|
|
|
@ -0,0 +1,21 @@
|
||||||
|
json.partial! 'bbb', messageKey: @messageKey, message: @message, status: @status
|
||||||
|
unless @response.blank?
|
||||||
|
json.recordings do
|
||||||
|
unless @response.is_a? Array
|
||||||
|
@response = [@response]
|
||||||
|
end
|
||||||
|
json.array!(@response) do |recording|
|
||||||
|
json.id recording[:recordID]
|
||||||
|
json.name recording[:name]
|
||||||
|
json.start_time recording[:startTime]
|
||||||
|
json.end_time recording[:endTime]
|
||||||
|
json.published recording[:published]
|
||||||
|
json.playbacks do
|
||||||
|
json.array!(recording[:playback][:format]) do |playback|
|
||||||
|
json.type playback[:type]
|
||||||
|
json.url playback[:url]
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
|
@ -0,0 +1 @@
|
||||||
|
json.partial! 'bbb', messageKey: @messageKey, message: @message, status: @status
|
|
@ -34,5 +34,7 @@
|
||||||
<% end %>
|
<% end %>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
<table id="recordings" class="table table-striped table-bordered dt-responsive" width="100%"></table>
|
||||||
|
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
|
@ -11,8 +11,11 @@ Rails.application.routes.draw do
|
||||||
# meetings offer a landing page for NON authenticated users to create and join session in BigBlueButton
|
# meetings offer a landing page for NON authenticated users to create and join session in BigBlueButton
|
||||||
# rooms offer a customized landing page for authenticated users to create and join session in BigBlueButton
|
# rooms offer a customized landing page for authenticated users to create and join session in BigBlueButton
|
||||||
get '/:resource/:id', to: 'landing#index', as: :resource
|
get '/:resource/:id', to: 'landing#index', as: :resource
|
||||||
get '/:resource/:id/join', to: 'bbb#join', as: :bbb_join, defaults: { :format => 'json' }
|
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/wait', to: 'landing#wait_for_moderator'
|
||||||
|
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'}
|
||||||
|
|
||||||
root to: 'landing#index', :resource => "meetings"
|
root to: 'landing#index', :resource => "meetings"
|
||||||
end
|
end
|
||||||
|
|
Loading…
Reference in New Issue