diff --git a/config/routes.rb b/config/routes.rb
index 327a924..5bdeac1 100644
--- a/config/routes.rb
+++ b/config/routes.rb
@@ -102,7 +102,6 @@ Rails.application.routes.draw do
delete :destroy_file
end
# resource :zoom_meeting, only: [:show]
- resource :microsoft_teams_meeting, only: [:show]
end
resources :directories, except: [:index] do
member do
diff --git a/db/migrate/20200817233053_add_microsoft_teams_meeting_join_url_to_broadcasts.rb b/db/migrate/20200817233053_add_microsoft_teams_meeting_join_url_to_broadcasts.rb
new file mode 100644
index 0000000..ddff8e9
--- /dev/null
+++ b/db/migrate/20200817233053_add_microsoft_teams_meeting_join_url_to_broadcasts.rb
@@ -0,0 +1,5 @@
+class AddMicrosoftTeamsMeetingJoinUrlToBroadcasts < ActiveRecord::Migration[6.0]
+ def change
+ add_column :broadcasts, :microsoft_teams_meeting_url, :string
+ end
+end
\ No newline at end of file
diff --git a/db/structure.sql b/db/structure.sql
index 34371f4..1707992 100644
--- a/db/structure.sql
+++ b/db/structure.sql
@@ -562,7 +562,8 @@ CREATE TABLE public.broadcasts (
token character varying,
streamer_status integer DEFAULT 0,
shoot_location_time_zone character varying DEFAULT 'UTC'::character varying,
- full_live_stream_playback_uid character varying
+ full_live_stream_playback_uid character varying,
+ microsoft_teams_meeting_url character varying
);
@@ -3972,6 +3973,7 @@ INSERT INTO "schema_migrations" (version) VALUES
('20200721140821'),
('20200725231419'),
('20200810140331'),
-('20200812161119');
+('20200812161119'),
+('20200817233053');
diff --git a/lib/microsoft_graph.rb b/lib/microsoft_graph.rb
index 040d22c..586eea6 100644
--- a/lib/microsoft_graph.rb
+++ b/lib/microsoft_graph.rb
@@ -2,49 +2,29 @@ require 'httparty'
class MicrosoftGraph
BASE_URL = 'https://graph.microsoft.com/v1.0'.freeze
- BETA_BASE_URL = 'https://graph.microsoft.com/beta'.freeze
- # Documentation says that "common" can be used (instead of tenantID) to refresh access token
- REFRESH_TOKEN_URL = 'https://login.microsoftonline.com/common/oauth2/v2.0/token'.freeze
- def initialize(current_user, client_id, client_secret, scopes)
+ def initialize(current_user, client_id, client_secret, tenant_id, scopes)
@current_user = current_user
@uid = current_user.microsoft_user_id
@token = current_user.microsoft_access_token
@refresh_token = current_user.microsoft_refresh_token
- @expires_at = current_user.microsoft_token_expires_at
+ @token_expires_at = current_user.microsoft_token_expires_at
@client_id = client_id
@client_secret = client_secret
+ @tenant_id = tenant_id
@scopes = scopes
end
- def request(resource)
- return false unless @token
-
- response = HTTParty.get(
- "#{BASE_URL}/#{resource}",
- headers: {
- Authorization: "Bearer #{@token}"
- }
- )
-
- if response.code != 200
- p '[Microsoft Graph API Error]'
- p response.inspect
- false
- else
- JSON.parse(response.body)
+ def create_teams_meeting(subject)
+ # Obtain new token if token is expired or will expire in less than 5 minutes
+ if 5.minutes.from_now.to_i > @token_expires_at.seconds
+ refresh_access_token
end
- end
-
- def create_teams_meeting(start_date_time, end_date_time, subject)
- # check if token expired and obtain new access_token using refresh token
response = HTTParty.post(
- "#{BETA_BASE_URL}/me/onlineMeetings",
+ "#{BASE_URL}/me/onlineMeetings",
body: {
- startDateTime: start_date_time,
- endDateTime: end_date_time,
subject: subject,
participants: {
organizer: {
@@ -55,22 +35,35 @@ class MicrosoftGraph
}
}
}
- },
+ }.to_json,
headers: {
- Authorization: "Bearer #{@token}"
+ Authorization: "Bearer #{@token}",
+ 'Content-Type': 'application/json'
}
)
+ raise StandardError, 'Authenticated user does not have a permission to create Teams Online Meeting' if response.code == 403
+
if response.code != 201
- p '[Microsoft Graph API Error] Failed to create online meeting'
- p response.inspect
+ Rails.logger.error('[Microsoft Graph Error]')
+ Rails.logger.error(response.inspect)
+ raise StandardError, "Failed to create teams meeting [#{response.code}]"
else
JSON.parse(response.body)
end
end
- def refresh_token
- response = HTTParty.post(REFRESH_TOKEN_URL,
+ private
+
+ def refresh_token_url
+ "https://login.microsoftonline.com/#{@tenant_id}/oauth2/v2.0/token"
+ end
+
+ def refresh_access_token
+ response = HTTParty.post(refresh_token_url,
+ headers: {
+ 'Content-Type': 'application/x-www-form-urlencoded'
+ },
body: {
client_id: @client_id,
client_secret: @client_secret,
@@ -79,5 +72,26 @@ class MicrosoftGraph
scope: @scopes
})
+ if response.code != 200
+ Rails.logger.error '[Microsoft Graph Error] Failed to obtain new access token using refresh token'
+ Rails.logger.error(response.inspect)
+ raise StandardError, 'Failed to obtain new access token'
+ end
+
+ parsed_response = JSON.parse(response.body)
+
+ new_access_token = parsed_response['access_token']
+ new_refresh_token = parsed_response['refresh_token']
+ token_expires_in = parsed_response['expires_in'] # For how long access token is valid (in seconds)
+ token_new_expiration_time = Time.now.to_i + token_expires_in
+
+ @current_user.microsoft_access_token = new_access_token
+ @current_user.microsoft_refresh_token = new_refresh_token
+ @current_user.microsoft_token_expires_at = token_new_expiration_time
+ @current_user.save!
+
+ @token = new_access_token
+ @refresh_token = new_refresh_token
+ @token_expires_at = token_new_expiration_time
end
end
\ No newline at end of file
--
2.47.3
From 27fade2d09ba3114a6c7f53d08905b2fa40a5c3c Mon Sep 17 00:00:00 2001
From: Bilal
Date: Tue, 18 Aug 2020 20:46:38 +0300
Subject: [PATCH 5/7] remove obsolete require
---
app/models/broadcast.rb | 1 -
1 file changed, 1 deletion(-)
diff --git a/app/models/broadcast.rb b/app/models/broadcast.rb
index 42df29b..d1f6943 100644
--- a/app/models/broadcast.rb
+++ b/app/models/broadcast.rb
@@ -1,5 +1,4 @@
class Broadcast < ApplicationRecord
- require 'microsoft_graph'
include PgSearch
belongs_to :project
--
2.47.3
From f5628c47df6cf9c5294543720066823dce1e65c3 Mon Sep 17 00:00:00 2001
From: Bilal
Date: Wed, 19 Aug 2020 13:05:16 +0300
Subject: [PATCH 6/7] allow selecting conference option
---
app/controllers/broadcasts_controller.rb | 24 +----------
.../conference_meetings_controller.rb | 42 +++++++++++++++++++
app/helpers/broadcast_conferences_helper.rb | 17 ++++++++
app/views/broadcasts/_form.html.erb | 1 +
app/views/broadcasts/show.html.erb | 4 +-
config/locales/en.yml | 3 ++
config/locales/es.yml | 3 ++
config/routes.rb | 2 +-
...53_add_conference_details_to_broadcasts.rb | 6 +++
...ft_teams_meeting_join_url_to_broadcasts.rb | 5 ---
db/structure.sql | 3 +-
lib/microsoft_graph.rb | 10 +++++
12 files changed, 89 insertions(+), 31 deletions(-)
create mode 100644 app/controllers/conference_meetings_controller.rb
create mode 100644 app/helpers/broadcast_conferences_helper.rb
create mode 100644 db/migrate/20200817233053_add_conference_details_to_broadcasts.rb
delete mode 100644 db/migrate/20200817233053_add_microsoft_teams_meeting_join_url_to_broadcasts.rb
diff --git a/app/controllers/broadcasts_controller.rb b/app/controllers/broadcasts_controller.rb
index fa93af8..bc7c561 100644
--- a/app/controllers/broadcasts_controller.rb
+++ b/app/controllers/broadcasts_controller.rb
@@ -18,25 +18,6 @@ class BroadcastsController < ApplicationController
def create
@broadcast.attributes = broadcast_params
- begin
- graph_api = MicrosoftGraph.new(
- current_user,
- ENV['AZURE_CLIENT_ID'],
- ENV['AZURE_CLIENT_SECRET'],
- ENV['AZURE_TENANT_ID'],
- ENV['AZURE_SCOPES']
- )
-
- subject = "#{@broadcast.name} Online Meeting"
- teams_meeting = graph_api.create_teams_meeting(subject)
- join_url = teams_meeting['joinUrl']
- @broadcast.microsoft_teams_meeting_url = join_url if join_url.present?
- rescue StandardError => e
- @broadcast.errors[:base] << e.message
- render :new
- return
- end
-
if @broadcast.save
log_create_analytics
redirect_to [@project, :broadcasts], notice: t(".notice")
@@ -46,8 +27,7 @@ class BroadcastsController < ApplicationController
end
def show
- # @conference_url = url_for [@broadcast.project, @broadcast, :zoom_meeting]
- @conference_url = @broadcast.microsoft_teams_meeting_url
+ @conference_url = url_for [@broadcast.project, @broadcast, :conference_meeting]
@recordings = @broadcast.broadcast_recordings.order_by_recent.paginate(page: params[:page])
@files = @broadcast.files.order("created_at DESC").paginate(page: params[:files_page])
render layout: 'application'
@@ -93,7 +73,7 @@ class BroadcastsController < ApplicationController
end
def broadcast_params
- params.require(:broadcast).permit(:name, :shoot_location_time_zone, files: [])
+ params.require(:broadcast).permit(:name, :shoot_location_time_zone, :conference_option, files: [])
end
def set_project
diff --git a/app/controllers/conference_meetings_controller.rb b/app/controllers/conference_meetings_controller.rb
new file mode 100644
index 0000000..2515ea7
--- /dev/null
+++ b/app/controllers/conference_meetings_controller.rb
@@ -0,0 +1,42 @@
+class ConferenceMeetingsController < ApplicationController
+ def show
+ authorize broadcast = Broadcast.find(params[:broadcast_id])
+ case broadcast.conference_option
+ when 'zoom'
+ redirect_to broadcast.zoom_meeting_url
+ when 'ms_teams'
+ if broadcast.conference_join_url.nil?
+ begin
+ graph_api = MicrosoftGraph.new(
+ current_user,
+ ENV['AZURE_CLIENT_ID'],
+ ENV['AZURE_CLIENT_SECRET'],
+ ENV['AZURE_TENANT_ID'],
+ ENV['AZURE_SCOPES']
+ )
+
+ subject = "#{broadcast.name} Online Meeting"
+ teams_meeting = graph_api.create_teams_meeting(subject)
+ join_url = teams_meeting['joinUrl']
+ if join_url.present?
+ broadcast.conference_join_url = join_url
+ broadcast.save
+ else
+ raise StandardError, 'Failed to read teams meeting join URL'
+ end
+ rescue ActionController::InvalidAuthenticityToken => e
+ Rails.logger.error(e.message)
+ redirect_to project_broadcast_url(broadcast.project, broadcast), alert: 'You are not authenticated via Microsoft, please authenticate and try again'
+ return
+ rescue StandardError => e
+ Rails.logger.error(e.message)
+ redirect_to project_broadcast_url(broadcast.project, broadcast), alert: 'Failed to join conference'
+ return
+ end
+ end
+ redirect_to broadcast.conference_join_url
+ else
+ redirect_to project_broadcast_url(broadcast.project, broadcast), alert: 'Unknown conference option'
+ end
+ end
+end
\ No newline at end of file
diff --git a/app/helpers/broadcast_conferences_helper.rb b/app/helpers/broadcast_conferences_helper.rb
new file mode 100644
index 0000000..05ab097
--- /dev/null
+++ b/app/helpers/broadcast_conferences_helper.rb
@@ -0,0 +1,17 @@
+module BroadcastConferencesHelper
+ def options_for_conference_select
+ [
+ ['Zoom', 'zoom'],
+ ['MS Teams', 'ms_teams']
+ ]
+ end
+
+ def conference_option_name_from_key(key)
+ option = options_for_conference_select.find { |option| option[1] == key }
+ if option.present?
+ option.first
+ else
+ 'Unknown conference option'
+ end
+ end
+end
\ No newline at end of file
diff --git a/app/views/broadcasts/_form.html.erb b/app/views/broadcasts/_form.html.erb
index 2efc4bd..b60665d 100644
--- a/app/views/broadcasts/_form.html.erb
+++ b/app/views/broadcasts/_form.html.erb
@@ -2,6 +2,7 @@
<%= bootstrap_form_with model: model, local: true do |form| %>
<%= form.text_field :name %>
+ <%= form.select :conference_option, options_for_conference_select, { label: t('.labels.conference_option') }, class: "form-control custom-select" %>
<%= form.time_zone_select(:shoot_location_time_zone, nil, label: "Time zone of shoot location") %>
diff --git a/app/views/broadcasts/show.html.erb b/app/views/broadcasts/show.html.erb
index ccd5fc2..c6a94c3 100644
--- a/app/views/broadcasts/show.html.erb
+++ b/app/views/broadcasts/show.html.erb
@@ -118,8 +118,8 @@
<% end %>
- If you want to join the ZOOM meeting dedicated to this broadcast, follow the link below.
- <%= link_to 'Video Conference', @conference_url, class: "btn btn-primary btn-block #{@conference_url.present? ? '' : 'disabled'}", target: '_blank' %>
+ <%= "If you want to join the #{conference_option_name_from_key(@broadcast.conference_option)} meeting dedicated to this broadcast, follow the link below." %>
+ <%= link_to 'Video Conference', @conference_url, class: "btn btn-primary btn-block", target: '_blank' %>
params[:active_tab] == 'recordings') %>" id="recordings">
diff --git a/config/locales/en.yml b/config/locales/en.yml
index 46f0db3..ae6cbb9 100644
--- a/config/locales/en.yml
+++ b/config/locales/en.yml
@@ -262,6 +262,9 @@ en:
stream_multiple_cameras: Stream multiple cameras at one time
update:
reset_notice: The Share URL has been reset, and the previous URL will no longer work. Please click "Copy URL" and share it again with those who you want to have access to this live stream
+ form:
+ labels:
+ conference_option: Conference Option
bulk_taggings:
new_bulk_tag_modal:
submit: Add
diff --git a/config/locales/es.yml b/config/locales/es.yml
index db3048b..530909f 100644
--- a/config/locales/es.yml
+++ b/config/locales/es.yml
@@ -120,6 +120,9 @@ es:
stream_multiple_cameras: Stream multiple cameras at one time
update:
reset_notice: The Share URL has been reset, and the previous URL will no longer work. Please click "Copy URL" and share it again with those who you want to have access to this live stream
+ form:
+ labels:
+ conference_option: Conference Option (ES)
contract_templates:
blank_contracts:
create:
diff --git a/config/routes.rb b/config/routes.rb
index 5bdeac1..7dcfb5e 100644
--- a/config/routes.rb
+++ b/config/routes.rb
@@ -101,7 +101,7 @@ Rails.application.routes.draw do
member do
delete :destroy_file
end
- # resource :zoom_meeting, only: [:show]
+ resource :conference_meeting, only: [:show]
end
resources :directories, except: [:index] do
member do
diff --git a/db/migrate/20200817233053_add_conference_details_to_broadcasts.rb b/db/migrate/20200817233053_add_conference_details_to_broadcasts.rb
new file mode 100644
index 0000000..72a5d9e
--- /dev/null
+++ b/db/migrate/20200817233053_add_conference_details_to_broadcasts.rb
@@ -0,0 +1,6 @@
+class AddConferenceDetailsToBroadcasts < ActiveRecord::Migration[6.0]
+ def change
+ add_column :broadcasts, :conference_option, :string
+ add_column :broadcasts, :conference_join_url, :string
+ end
+end
\ No newline at end of file
diff --git a/db/migrate/20200817233053_add_microsoft_teams_meeting_join_url_to_broadcasts.rb b/db/migrate/20200817233053_add_microsoft_teams_meeting_join_url_to_broadcasts.rb
deleted file mode 100644
index ddff8e9..0000000
--- a/db/migrate/20200817233053_add_microsoft_teams_meeting_join_url_to_broadcasts.rb
+++ /dev/null
@@ -1,5 +0,0 @@
-class AddMicrosoftTeamsMeetingJoinUrlToBroadcasts < ActiveRecord::Migration[6.0]
- def change
- add_column :broadcasts, :microsoft_teams_meeting_url, :string
- end
-end
\ No newline at end of file
diff --git a/db/structure.sql b/db/structure.sql
index 1707992..866d2fa 100644
--- a/db/structure.sql
+++ b/db/structure.sql
@@ -563,7 +563,8 @@ CREATE TABLE public.broadcasts (
streamer_status integer DEFAULT 0,
shoot_location_time_zone character varying DEFAULT 'UTC'::character varying,
full_live_stream_playback_uid character varying,
- microsoft_teams_meeting_url character varying
+ conference_option character varying,
+ conference_join_url character varying
);
diff --git a/lib/microsoft_graph.rb b/lib/microsoft_graph.rb
index 586eea6..27531cc 100644
--- a/lib/microsoft_graph.rb
+++ b/lib/microsoft_graph.rb
@@ -17,11 +17,21 @@ class MicrosoftGraph
end
def create_teams_meeting(subject)
+ if @refresh_token.nil? || @token_expires_at.nil?
+ raise ActionController::InvalidAuthenticityToken, 'Missing refresh token / token expiration'
+ return
+ end
+
# Obtain new token if token is expired or will expire in less than 5 minutes
if 5.minutes.from_now.to_i > @token_expires_at.seconds
refresh_access_token
end
+ if @token.nil?
+ raise ActionController::InvalidAuthenticityToken, 'Missing access token'
+ return
+ end
+
response = HTTParty.post(
"#{BASE_URL}/me/onlineMeetings",
body: {
--
2.47.3
From 51478064837c0ad849f591330e406488a905e660 Mon Sep 17 00:00:00 2001
From: Bilal
Date: Wed, 19 Aug 2020 15:47:01 +0300
Subject: [PATCH 7/7] add specs and use i18n
---
app/controllers/broadcasts_controller.rb | 1 -
.../conference_meetings_controller.rb | 9 ++-
config/locales/en.yml | 6 ++
config/locales/es.yml | 8 ++
.../controllers/broadcasts_controller_spec.rb | 15 +++-
.../conference_meetings_controller_spec.rb | 76 +++++++++++++++++++
.../zoom_meetings_controller_spec.rb | 30 --------
spec/factories/broadcasts.rb | 5 ++
.../features/user_managing_broadcasts_spec.rb | 7 ++
9 files changed, 120 insertions(+), 37 deletions(-)
create mode 100644 spec/controllers/conference_meetings_controller_spec.rb
delete mode 100644 spec/controllers/zoom_meetings_controller_spec.rb
diff --git a/app/controllers/broadcasts_controller.rb b/app/controllers/broadcasts_controller.rb
index bc7c561..af38f6d 100644
--- a/app/controllers/broadcasts_controller.rb
+++ b/app/controllers/broadcasts_controller.rb
@@ -1,5 +1,4 @@
class BroadcastsController < ApplicationController
- require 'microsoft_graph'
layout "project"
before_action :set_project
diff --git a/app/controllers/conference_meetings_controller.rb b/app/controllers/conference_meetings_controller.rb
index 2515ea7..40b85dc 100644
--- a/app/controllers/conference_meetings_controller.rb
+++ b/app/controllers/conference_meetings_controller.rb
@@ -1,4 +1,6 @@
class ConferenceMeetingsController < ApplicationController
+ require 'microsoft_graph'
+
def show
authorize broadcast = Broadcast.find(params[:broadcast_id])
case broadcast.conference_option
@@ -18,6 +20,7 @@ class ConferenceMeetingsController < ApplicationController
subject = "#{broadcast.name} Online Meeting"
teams_meeting = graph_api.create_teams_meeting(subject)
join_url = teams_meeting['joinUrl']
+
if join_url.present?
broadcast.conference_join_url = join_url
broadcast.save
@@ -26,17 +29,17 @@ class ConferenceMeetingsController < ApplicationController
end
rescue ActionController::InvalidAuthenticityToken => e
Rails.logger.error(e.message)
- redirect_to project_broadcast_url(broadcast.project, broadcast), alert: 'You are not authenticated via Microsoft, please authenticate and try again'
+ redirect_to project_broadcast_url(broadcast.project, broadcast), alert: t('.alerts.not_authenticated')
return
rescue StandardError => e
Rails.logger.error(e.message)
- redirect_to project_broadcast_url(broadcast.project, broadcast), alert: 'Failed to join conference'
+ redirect_to project_broadcast_url(broadcast.project, broadcast), alert: t('.alerts.failed_to_join')
return
end
end
redirect_to broadcast.conference_join_url
else
- redirect_to project_broadcast_url(broadcast.project, broadcast), alert: 'Unknown conference option'
+ redirect_to project_broadcast_url(broadcast.project, broadcast), alert: t('.alerts.unknown_conference_option')
end
end
end
\ No newline at end of file
diff --git a/config/locales/en.yml b/config/locales/en.yml
index ae6cbb9..af6396a 100644
--- a/config/locales/en.yml
+++ b/config/locales/en.yml
@@ -1557,3 +1557,9 @@ en:
edit: Edit
report: Report
generating: Generating...
+ conference_meetings:
+ show:
+ alerts:
+ not_authenticated: You are not authenticated via Microsoft, please authenticate and try again
+ failed_to_join: Failed to join conference
+ unknown_conference_option: Unknown conference option
diff --git a/config/locales/es.yml b/config/locales/es.yml
index 530909f..9f9c267 100644
--- a/config/locales/es.yml
+++ b/config/locales/es.yml
@@ -633,3 +633,11 @@ es:
production_elements_logs: Production Elements Logs, and more (ES)
reduces_labor_cost: Reduces labor costs (ES)
simplifies_cue_sheets: Simplifies Music Cue Sheets, Graphic Cue Sheets (ES)
+ conference_meetings:
+ show:
+ alert:
+ not_authenticated: ""
+ alerts:
+ not_authenticated: You are not authenticated via Microsoft, please authenticate and try again (ES)
+ failed_to_join: Failed to join conference (ES)
+ unknown_conference_option: Unknown conference option (ES)
diff --git a/spec/controllers/broadcasts_controller_spec.rb b/spec/controllers/broadcasts_controller_spec.rb
index ed37ad2..072ad00 100644
--- a/spec/controllers/broadcasts_controller_spec.rb
+++ b/spec/controllers/broadcasts_controller_spec.rb
@@ -131,16 +131,25 @@ RSpec.describe BroadcastsController, type: :controller do
expect(response.body).to have_xpath "//input[@readonly][@value='#{broadcast_url(broadcast.token)}']"
end
- it "displays zoom meeting button" do
+ it "displays zoom meeting button for zoom conference option" do
get :show, params: { project_id: project.id, id: broadcast.id }
- expect(response.body).to have_link("Video Conference", href: project_broadcast_zoom_meeting_url(project, broadcast))
+ expect(response.body).to have_content 'Zoom'
+ expect(response.body).to have_link("Video Conference", href: project_broadcast_conference_meeting_url(project, broadcast))
+ end
+
+ it "displays microsoft teams meeting button for MS Teams conference option" do
+ ms_teams_broadcast = create(:broadcast, :ms_teams_conference, project: project )
+ get :show, params: { project_id: project.id, id: ms_teams_broadcast.id }
+
+ expect(response.body).to have_content 'MS Teams'
+ expect(response.body).to have_link 'Video Conference', href: project_broadcast_conference_meeting_url(project, ms_teams_broadcast)
end
it "assigns required variables" do
get :show, params: { project_id: project.id, id: broadcast.id }
- expect(assigns(:conference_url)).to eq project_broadcast_zoom_meeting_url(project, broadcast)
+ expect(assigns(:conference_url)).to eq project_broadcast_conference_meeting_url(project, broadcast)
expect(assigns(:broadcast)).to eq broadcast
end
diff --git a/spec/controllers/conference_meetings_controller_spec.rb b/spec/controllers/conference_meetings_controller_spec.rb
new file mode 100644
index 0000000..9b9167a
--- /dev/null
+++ b/spec/controllers/conference_meetings_controller_spec.rb
@@ -0,0 +1,76 @@
+require 'rails_helper'
+
+RSpec.describe ConferenceMeetingsController, type: :controller do
+ let(:user) { create(:user) }
+ let(:account) { user.primary_account }
+ let(:project) { create(:project, account: user.primary_account) }
+ let(:broadcast) { create(:broadcast, name: "Broadcast", project: project) }
+ let(:ms_teams_broadcast) { create(:broadcast, :ms_teams_conference, project: project) }
+ let(:unknown_option_broadcast) { create(:broadcast, project: project, conference_option: 'google') }
+
+ let(:meeting_start_url) { "http://meeting_start_url" }
+ let(:meeting_hash) { HashWithIndifferentAccess.new(start_url: meeting_start_url) }
+ let(:user_create_response) { {"id" => "new_host_id"} }
+ let(:roles_assign_response) { {"ids" => ["new_host_id"]} }
+ let(:roles_list_response) { {"roles" => [{"name" => "directme-host"}]} }
+
+ before :each do
+ allow_any_instance_of(ZoomGateway).to receive(:find_meeting).and_return(meeting_hash)
+ allow_any_instance_of(ZoomGateway).to receive(:create_meeting).and_return("meeting_id")
+ allow_any_instance_of(ZoomGateway).to receive(:create_host).and_return("host_id")
+ allow(MuxLiveStream).to receive(:new).and_return OpenStruct.new(id: 'id', key: 'key', playback_id: 'playback_id')
+ end
+
+ describe "#show" do
+ before { sign_in user }
+
+ it "redirects to meeting start url with Zoom conference option" do
+ get :show, params: { project_id: project.id, broadcast_id: broadcast.id }
+ expect(response).to redirect_to(meeting_start_url)
+ end
+
+ it "redirects to the broadcast show page with alert if user is not authenticated via microsoft and tries to create MS Teams meeting" do
+ get :show, params: { project_id: project.id, broadcast_id: ms_teams_broadcast.id }
+ expect(response).to redirect_to project_broadcast_path(project, ms_teams_broadcast)
+ expect(flash.alert).to eq not_authenticated_alert
+ end
+
+ it "redirects to the broadcast show page with alert if user is authenticated via microsoft and tries to create MS Teams meeting but Graph API fails to create meeting" do
+ allow_any_instance_of(MicrosoftGraph).to receive(:create_teams_meeting).and_return(nil)
+ get :show, params: { project_id: project.id, broadcast_id: ms_teams_broadcast.id }
+ expect(response).to redirect_to project_broadcast_path(project, ms_teams_broadcast)
+ expect(flash.alert).to eq failed_to_join_alert
+ end
+
+ it "redirects to the broadcast show page with alert if conference option is not reckognized" do
+ get :show, params: { project_id: project.id, broadcast_id: unknown_option_broadcast.id }
+ expect(response).to redirect_to project_broadcast_path(project, unknown_option_broadcast)
+ expect(flash.alert).to eq unknown_conference_option_alert
+ end
+
+ it "redirects to meeting start url with MS Teams conference option" do
+ new_ms_teams_meeting = JSON.parse({
+ joinUrl: meeting_start_url
+ }.to_json)
+
+ allow_any_instance_of(MicrosoftGraph).to receive(:create_teams_meeting).and_return(new_ms_teams_meeting)
+
+ get :show, params: { project_id: project.id, broadcast_id: ms_teams_broadcast.id }
+ expect(response).to redirect_to(meeting_start_url)
+ end
+ end
+
+ private
+
+ def not_authenticated_alert
+ t 'conference_meetings.show.alerts.not_authenticated'
+ end
+
+ def failed_to_join_alert
+ t 'conference_meetings.show.alerts.failed_to_join'
+ end
+
+ def unknown_conference_option_alert
+ t 'conference_meetings.show.alerts.unknown_conference_option'
+ end
+end
diff --git a/spec/controllers/zoom_meetings_controller_spec.rb b/spec/controllers/zoom_meetings_controller_spec.rb
deleted file mode 100644
index ca1ab04..0000000
--- a/spec/controllers/zoom_meetings_controller_spec.rb
+++ /dev/null
@@ -1,30 +0,0 @@
-require 'rails_helper'
-
-RSpec.describe ZoomMeetingsController, type: :controller do
- let(:user) { create(:user) }
- let(:account) { user.primary_account }
- let(:project) { create(:project, account: user.primary_account) }
- let(:broadcast) { create(:broadcast, name: "Broadcast", project: project) }
-
- let(:meeting_start_url) { "http://meeting_start_url" }
- let(:meeting_hash) { HashWithIndifferentAccess.new(start_url: meeting_start_url) }
- let(:user_create_response) { {"id" => "new_host_id"} }
- let(:roles_assign_response) { {"ids" => ["new_host_id"]} }
- let(:roles_list_response) { {"roles" => [{"name" => "directme-host"}]} }
-
- before :each do
- allow_any_instance_of(ZoomGateway).to receive(:find_meeting).and_return(meeting_hash)
- allow_any_instance_of(ZoomGateway).to receive(:create_meeting).and_return("meeting_id")
- allow_any_instance_of(ZoomGateway).to receive(:create_host).and_return("host_id")
- allow(MuxLiveStream).to receive(:new).and_return OpenStruct.new(id: 'id', key: 'key', playback_id: 'playback_id')
- end
-
- describe "#show" do
- before { sign_in user }
-
- it "redirects to meeting start url" do
- get :show, params: { project_id: project.id, broadcast_id: broadcast.id }
- expect(response).to redirect_to(meeting_start_url)
- end
- end
-end
diff --git a/spec/factories/broadcasts.rb b/spec/factories/broadcasts.rb
index 4148242..33da96c 100644
--- a/spec/factories/broadcasts.rb
+++ b/spec/factories/broadcasts.rb
@@ -2,11 +2,16 @@ FactoryBot.define do
factory :broadcast do
association :project
name "My Live Stream"
+ conference_option "zoom"
transient do
skip_create_callback false
end
+ trait :ms_teams_conference do
+ conference_option "ms_teams"
+ end
+
trait :with_stream do
stream_uid "mux_stream"
stream_key "mux_key"
diff --git a/spec/features/user_managing_broadcasts_spec.rb b/spec/features/user_managing_broadcasts_spec.rb
index b4acf4e..6e2fa6a 100644
--- a/spec/features/user_managing_broadcasts_spec.rb
+++ b/spec/features/user_managing_broadcasts_spec.rb
@@ -24,6 +24,7 @@ feature 'User managing broadcasts' do
by 'filling out the form' do
fill_in broadcast_name_field, with: 'My Broadcast'
+ select_conference_option('Zoom')
select_time_zone("New Delhi")
end
@@ -267,6 +268,12 @@ feature 'User managing broadcasts' do
end
end
+ def select_conference_option(value)
+ if value.present?
+ select value, from: "broadcast[conference_option]"
+ end
+ end
+
def click_checkboxes
all('input[type="checkbox"]')[0].click
all('input[type="checkbox"]')[1].click
--
2.47.3