Skip to content
Snippets Groups Projects
Unverified Commit 11356dbe authored by Ahmad Farhat's avatar Ahmad Farhat Committed by GitHub
Browse files

Initial work to get recording ready + meeting ended working (#3529)

* Initial work to get recording ready + meeting ended working

* Quick fixes

* Fixed tests
parent 81d97fc3
No related branches found
No related tags found
No related merge requests found
......@@ -14,6 +14,7 @@ gem 'dotenv-rails'
gem 'hcaptcha'
gem 'jbuilder'
gem 'jsbundling-rails'
gem 'jwt'
gem 'omniauth', '~> 2.1.0'
gem 'omniauth_openid_connect'
gem 'omniauth-rails_csrf_protection', '~> 1.0.1'
......
......@@ -141,6 +141,7 @@ GEM
activesupport (>= 4.2)
aes_key_wrap
bindata
jwt (2.4.1)
loofah (2.18.0)
crass (~> 1.0.2)
nokogiri (>= 1.5.9)
......@@ -353,6 +354,7 @@ DEPENDENCIES
hcaptcha
jbuilder
jsbundling-rails
jwt
omniauth (~> 2.1.0)
omniauth-rails_csrf_protection (~> 1.0.1)
omniauth_openid_connect
......
......@@ -12,7 +12,13 @@ module Api
def start
presentation_url = (url_for(@room.presentation).gsub('&', '%26') if @room.presentation.attached?)
MeetingStarter.new(room: @room, logout_url: request.referer, presentation_url:).call
MeetingStarter.new(
room: @room,
logout_url: request.referer,
presentation_url:,
meeting_ended: meeting_ended_url,
recording_ready: recording_ready_url
).call
render_json data: {
join_url: BigBlueButtonApi.new.join_meeting(room: @room, name: current_user.name, role: 'Moderator')
......
# frozen_string_literal: true
class ExternalController < ApplicationController
def create
skip_before_action :verify_authenticity_token, only: :recording_ready
# GET 'auth/:provider/callback'
def create_user
credentials = request.env['omniauth.auth']
user_info = credentials['info']
user = User.find_or_create_by(email: user_info['email']) do |u|
......@@ -19,6 +22,17 @@ class ExternalController < ApplicationController
redirect_to '/rooms'
end
# POST /recording_ready
def recording_ready
BigBlueButtonApi.new.decode_jwt(params[:signed_parameters])
render json, status: :ok
end
# GET /meeting_ended
def meeting_ended
render json, status: :ok
end
private
def extract_language_code(locale)
......
......@@ -50,6 +50,11 @@ class BigBlueButtonApi
bbb_server.update_recordings(record_id, {}, meta_hash)
end
# Decodes the JWT using the BBB secret as key (Used in Recording Ready Callback)
def decode_jwt(token)
JWT.decode token, bbb_secret, true, { algorithm: 'HS256' }
end
private
def bbb_endpoint
......
# frozen_string_literal: true
class MeetingStarter
def initialize(room:, logout_url:, presentation_url:)
def initialize(room:, logout_url:, presentation_url:, meeting_ended:, recording_ready:)
@room = room
@logout_url = logout_url
@presentation_url = presentation_url
@meeting_ended = meeting_ended
@recording_ready = recording_ready
end
def call
......@@ -30,6 +32,8 @@ class MeetingStarter
def computed_options
{
logoutURL: @logout_url,
meta_endCallbackUrl: @meeting_ended,
'meta_bbb-recording-ready-url': @recording_ready,
'meta_bbb-origin-version': 3,
'meta_bbb-origin': 'greenlight'
}
......
......@@ -4,7 +4,10 @@ Rails.application.routes.draw do
root 'components#index', via: :all
mount ActionCable.server => '/cable'
get 'auth/:provider/callback', to: 'external#create'
# External requests
get '/auth/:provider/callback', to: 'external#create_user'
get '/meeting_ended', to: 'external#meeting_ended'
post '/recording_ready', to: 'external#recording_ready'
# All the Api endpoints must be under /api/v1 and must have an extension .json.
namespace :api do
......
......@@ -22,14 +22,14 @@ RSpec.describe ExternalController, type: :controller do
request.env['omniauth.auth'] = OmniAuth.config.mock_auth[:openid_connect]
expect do
get :create, params: { provider: 'openid_connect' }
get :create_user, params: { provider: 'openid_connect' }
end.to change(User, :count).by(1)
end
it 'logs the user in and redirects to their rooms page' do
request.env['omniauth.auth'] = OmniAuth.config.mock_auth[:openid_connect]
get :create, params: { provider: 'openid_connect' }
get :create_user, params: { provider: 'openid_connect' }
expect(session[:user_id]).to eq(User.find_by(email: OmniAuth.config.mock_auth[:openid_connect][:info][:email]).id)
expect(response).to redirect_to('/rooms')
......@@ -38,7 +38,7 @@ RSpec.describe ExternalController, type: :controller do
it 'assigns the User role to the user' do
request.env['omniauth.auth'] = OmniAuth.config.mock_auth[:openid_connect]
get :create, params: { provider: 'openid_connect' }
get :create_user, params: { provider: 'openid_connect' }
expect(User.find_by(email: OmniAuth.config.mock_auth[:openid_connect][:info][:email]).role).to eq(role)
end
......
......@@ -24,7 +24,15 @@ RSpec.describe Api::V1::MeetingsController, type: :controller do
request.env['HTTP_REFERER'] = logout
presentation_url = nil
expect(MeetingStarter).to receive(:new).with(room:, logout_url: logout, presentation_url:)
expect(
MeetingStarter
).to receive(:new).with(
room:,
logout_url: logout,
presentation_url:,
meeting_ended: meeting_ended_url,
recording_ready: recording_ready_url
)
post :start, params: { friendly_id: room.friendly_id }
end
......@@ -35,7 +43,15 @@ RSpec.describe Api::V1::MeetingsController, type: :controller do
request.env['HTTP_REFERER'] = logout
presentation_url = Rails.application.routes.url_helpers.rails_blob_url(room.presentation, host: 'test.host')
expect(MeetingStarter).to receive(:new).with(room:, logout_url: logout, presentation_url:)
expect(
MeetingStarter
).to receive(:new).with(
room:,
logout_url: logout,
presentation_url:,
meeting_ended: meeting_ended_url,
recording_ready: recording_ready_url
)
post :start, params: { friendly_id: room.friendly_id }
end
......
......@@ -5,10 +5,20 @@ require 'rails_helper'
describe MeetingStarter, type: :service do
let(:room) { create(:room) }
let(:presentation_url) { 'http://www.samplepdf.com/sample.pdf' }
let(:service) { described_class.new(room:, logout_url: 'http://example.com', presentation_url:) }
let(:service) do
described_class.new(
room:,
logout_url: 'http://example.com',
presentation_url:,
meeting_ended: 'http://example.com/meeting_ended',
recording_ready: 'http://example.com/recording_ready'
)
end
let(:options) do
{
logoutURL: 'http://example.com',
meta_endCallbackUrl: 'http://example.com/meeting_ended',
'meta_bbb-recording-ready-url': 'http://example.com/recording_ready',
'meta_bbb-origin-version': 3,
'meta_bbb-origin': 'greenlight'
}
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment