From f5628c47df6cf9c5294543720066823dce1e65c3 Mon Sep 17 00:00:00 2001 From: Bilal Date: Wed, 19 Aug 2020 13:05:16 +0300 Subject: [PATCH] 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: {