From 8214ba9e6726f717cbb79a4f1065f152048c2d80 Mon Sep 17 00:00:00 2001 From: Senad Uka Date: Mon, 3 Aug 2020 21:52:04 +0000 Subject: [PATCH] Changes --- .env.sample | 3 +- app/controllers/admin/accounts_controller.rb | 5 ++ .../admin/broadcasts_controller.rb | 24 ++++++ .../broadcast_recordings_controller.rb | 26 +++++++ app/controllers/broadcasts_controller.rb | 2 +- .../public/broadcasts_controller.rb | 2 +- .../stream_notifications_controller.rb | 2 +- app/models/account.rb | 1 + app/models/broadcast.rb | 6 +- app/models/broadcast_recording.rb | 2 + app/policies/broadcast_recording_policy.rb | 9 +++ app/views/admin/accounts/_broadcast.html.erb | 13 ++++ app/views/admin/accounts/show.html.erb | 20 +++++ app/views/admin/broadcasts/_form.html.erb | 14 ++++ app/views/admin/broadcasts/edit.html.erb | 6 ++ app/views/broadcast_recordings/destroy.js.erb | 6 ++ app/views/broadcasts/_broadcast.html.erb | 4 +- .../_broadcast_recording_nav.html.erb | 3 +- .../broadcasts/_broadcast_recordings.html.erb | 7 +- app/views/broadcasts/_video.html.erb | 6 +- app/views/broadcasts/show.html.erb | 9 +++ .../_location_release.html.erb | 4 +- app/views/location_releases/index.html.erb | 4 +- app/views/public/amendments/new.html.erb | 4 + config/locales/en.yml | 12 ++- config/locales/es.yml | 1 + config/routes.rb | 2 + ...dd_hidden_field_to_broadcast_recordings.rb | 5 ++ ...d_stream_and_key_override_to_broadcasts.rb | 7 ++ ...5912_remove_youtube_uid_from_broadcasts.rb | 5 ++ ...director_mode_video_embed_to_broadcasts.rb | 5 ++ db/structure.sql | 14 +++- spec/channels/broadcasts_channel_spec.rb | 2 +- .../admin/accounts_controller_spec.rb | 10 +++ .../admin/broadcasts_controller_spec.rb | 77 +++++++++++++++++++ .../broadcast_recordings_controller_spec.rb | 30 ++++++++ .../controllers/broadcasts_controller_spec.rb | 29 +++++++ spec/factories/broadcast_recordings.rb | 3 +- spec/factories/broadcasts.rb | 11 +++ .../features/user_managing_broadcasts_spec.rb | 50 +++++++++++- .../user_managing_location_releases_spec.rb | 11 ++- spec/models/broadcast_spec.rb | 30 ++++++++ 42 files changed, 462 insertions(+), 24 deletions(-) create mode 100644 app/controllers/admin/broadcasts_controller.rb create mode 100644 app/controllers/broadcast_recordings_controller.rb create mode 100644 app/policies/broadcast_recording_policy.rb create mode 100644 app/views/admin/accounts/_broadcast.html.erb create mode 100644 app/views/admin/broadcasts/_form.html.erb create mode 100644 app/views/admin/broadcasts/edit.html.erb create mode 100644 app/views/broadcast_recordings/destroy.js.erb create mode 100644 db/migrate/20200724084722_add_hidden_field_to_broadcast_recordings.rb create mode 100644 db/migrate/20200730050903_add_stream_and_key_override_to_broadcasts.rb create mode 100644 db/migrate/20200803145912_remove_youtube_uid_from_broadcasts.rb create mode 100644 db/migrate/20200803150138_add_director_mode_video_embed_to_broadcasts.rb create mode 100644 spec/controllers/admin/broadcasts_controller_spec.rb create mode 100644 spec/controllers/broadcast_recordings_controller_spec.rb diff --git a/.env.sample b/.env.sample index 92c84ee..c506d1a 100644 --- a/.env.sample +++ b/.env.sample @@ -16,9 +16,10 @@ REDIS_URL= # Required for Zoom.us integration ZOOM_API_KEY= ZOOM_API_SECRET= +ZOOM_ACCOUNT_NUMBER= ZOOM_PRO_USERS_LIMIT= # defaults to 3 ZOOM_USER_TYPE= # 'pro' / 'basic' -ZOOM_ENABLE_RECORDINGS=0 # 0 / 1 +ZOOM_ENABLE_RECORDINGS= # true / false (default: false) # Token for webhooks authorization ZOOM_VERIFICATION_TOKEN= diff --git a/app/controllers/admin/accounts_controller.rb b/app/controllers/admin/accounts_controller.rb index aec98e3..b69b710 100644 --- a/app/controllers/admin/accounts_controller.rb +++ b/app/controllers/admin/accounts_controller.rb @@ -20,6 +20,7 @@ class Admin::AccountsController < Admin::ApplicationController def show @videos = filtered_account_videos.order(created_at: :desc, project_id: :desc).paginate(page: params[:page]) + @broadcasts = account_broadcasts.order(created_at: :desc, project_id: :desc).paginate(page: params[:page]) end def edit @@ -70,4 +71,8 @@ class Admin::AccountsController < Admin::ApplicationController @account.videos end end + + def account_broadcasts + @account.broadcasts + end end diff --git a/app/controllers/admin/broadcasts_controller.rb b/app/controllers/admin/broadcasts_controller.rb new file mode 100644 index 0000000..8e37c18 --- /dev/null +++ b/app/controllers/admin/broadcasts_controller.rb @@ -0,0 +1,24 @@ +class Admin::BroadcastsController < Admin::ApplicationController + before_action :set_broadcast, only: [:edit, :update] + + def edit + end + + def update + if @broadcast.update(broadcast_update_params) + redirect_to [:admin, @broadcast.project.account], notice: t(".notice") + else + render :edit + end + end + + private + + def set_broadcast + @broadcast = authorize policy_scope(Broadcast).find(params[:id]) + end + + def broadcast_update_params + params.require(:broadcast).permit(:stream_url_override, :stream_key_override, :director_mode_video_embed) + end +end diff --git a/app/controllers/broadcast_recordings_controller.rb b/app/controllers/broadcast_recordings_controller.rb new file mode 100644 index 0000000..477edda --- /dev/null +++ b/app/controllers/broadcast_recordings_controller.rb @@ -0,0 +1,26 @@ +class BroadcastRecordingsController < ApplicationController + layout "project" + + before_action :set_project + before_action :set_broadcast + before_action :set_recording + + def destroy + @recording.update(hidden: true) + @recordings = @broadcast.broadcast_recordings.visible.order_by_recent.paginate(page: params[:page]) + end + + private + + def set_project + @project = policy_scope(Project).find(params[:project_id]) + end + + def set_broadcast + @broadcast = authorize policy_scope(@project.broadcasts).find(params[:broadcast_id]) + end + + def set_recording + @recording = authorize policy_scope(@broadcast.broadcast_recordings).find(params[:id]) + end +end diff --git a/app/controllers/broadcasts_controller.rb b/app/controllers/broadcasts_controller.rb index 072498b..22d59bc 100644 --- a/app/controllers/broadcasts_controller.rb +++ b/app/controllers/broadcasts_controller.rb @@ -27,7 +27,7 @@ class BroadcastsController < ApplicationController def show @conference_url = url_for [@broadcast.project, @broadcast, :zoom_meeting] - @recordings = @broadcast.broadcast_recordings.order_by_recent.paginate(page: params[:page]) + @recordings = @broadcast.broadcast_recordings.visible.order_by_recent.paginate(page: params[:page]) @files = @broadcast.files.order("created_at DESC").paginate(page: params[:files_page]) render layout: 'application' end diff --git a/app/controllers/public/broadcasts_controller.rb b/app/controllers/public/broadcasts_controller.rb index bad8a1c..aca8f57 100644 --- a/app/controllers/public/broadcasts_controller.rb +++ b/app/controllers/public/broadcasts_controller.rb @@ -5,7 +5,7 @@ class Public::BroadcastsController < Public::BaseController def show @conference_url = broadcast_zoom_meeting_url(@broadcast.token) @multi_view_broadcasts = multi_view_broadcasts - @recordings = @broadcast.broadcast_recordings.order_by_recent.paginate(page: params[:page]) + @recordings = @broadcast.broadcast_recordings.visible.order_by_recent.paginate(page: params[:page]) @files = @broadcast.files.order("created_at DESC").paginate(page: params[:files_page]) render 'broadcasts/show' diff --git a/app/controllers/stream_notifications_controller.rb b/app/controllers/stream_notifications_controller.rb index 76a77c8..ad4a7cb 100644 --- a/app/controllers/stream_notifications_controller.rb +++ b/app/controllers/stream_notifications_controller.rb @@ -35,7 +35,7 @@ class StreamNotificationsController < ApplicationController duration = notification.dig(:data, :duration) recording = @broadcast.broadcast_recordings.create!(asset_uid: asset_uid, asset_playback_uid: playback_uid, file_name: file_name, duration: duration) - recordings = @broadcast.broadcast_recordings.order_by_recent.paginate(page: params[:page]) + recordings = @broadcast.broadcast_recordings.visible.order_by_recent.paginate(page: params[:page]) link = helpers.link_to(recording.broadcast_name.titleize, recording.download_url, target: "_blank") message = "Your recent live stream has been recorded and is available for download here: #{link}" diff --git a/app/models/account.rb b/app/models/account.rb index de3a812..6c89d62 100644 --- a/app/models/account.rb +++ b/app/models/account.rb @@ -5,6 +5,7 @@ class Account < ApplicationRecord has_many :users, through: :account_auths has_many :projects, dependent: :destroy has_many :videos, through: :projects + has_many :broadcasts, through: :projects has_many :contract_templates, through: :projects validates :name, presence: true diff --git a/app/models/broadcast.rb b/app/models/broadcast.rb index d1f6943..349ea65 100644 --- a/app/models/broadcast.rb +++ b/app/models/broadcast.rb @@ -35,7 +35,11 @@ class Broadcast < ApplicationRecord end def stream_server_url - ENV['MUX_BROADCAST_SERVER_URL'] + stream_url_override.presence || ENV["MUX_BROADCAST_SERVER_URL"] + end + + def stream_server_key + stream_key_override.presence || stream_key end def zoom_meeting_url diff --git a/app/models/broadcast_recording.rb b/app/models/broadcast_recording.rb index 6ad23bd..a7add7d 100644 --- a/app/models/broadcast_recording.rb +++ b/app/models/broadcast_recording.rb @@ -5,6 +5,8 @@ class BroadcastRecording < ApplicationRecord validates :asset_uid, uniqueness: true + scope :visible, -> { where(hidden: false) } + def download_url "https://stream.mux.com/#{asset_playback_uid}/#{file_name}?download=#{download_file_name}" end diff --git a/app/policies/broadcast_recording_policy.rb b/app/policies/broadcast_recording_policy.rb new file mode 100644 index 0000000..7423f2d --- /dev/null +++ b/app/policies/broadcast_recording_policy.rb @@ -0,0 +1,9 @@ +class BroadcastRecordingPolicy < ApplicationPolicy + def destroy? + if user.nil? || user.user.nil? + return false + end + + user.manager? || user.account_manager? + end +end diff --git a/app/views/admin/accounts/_broadcast.html.erb b/app/views/admin/accounts/_broadcast.html.erb new file mode 100644 index 0000000..3d4cc59 --- /dev/null +++ b/app/views/admin/accounts/_broadcast.html.erb @@ -0,0 +1,13 @@ + + <%= broadcast.project.name %> + <%= broadcast.name %> + +
+ <%= button_tag "Manage", class: "btn btn-light btn-sm dropdown-toggle border", data: { toggle: "dropdown", boundary: "window" }, aria: { haspopup: true, expanded: false } %> + +
+ + diff --git a/app/views/admin/accounts/show.html.erb b/app/views/admin/accounts/show.html.erb index dfc6ca1..48b21ed 100644 --- a/app/views/admin/accounts/show.html.erb +++ b/app/views/admin/accounts/show.html.erb @@ -34,5 +34,25 @@ <%= will_paginate @videos %> <% end %> +
+ <%= card_field_set_tag "Broadcasts" do %> +
+ + + + + + + + + + <%= render partial: "admin/accounts/broadcast", collection: @broadcasts %> + +
ProjectName
+
+
+ <%= will_paginate @broadcasts %> +
+ <% end %> diff --git a/app/views/admin/broadcasts/_form.html.erb b/app/views/admin/broadcasts/_form.html.erb new file mode 100644 index 0000000..acd53ac --- /dev/null +++ b/app/views/admin/broadcasts/_form.html.erb @@ -0,0 +1,14 @@ +<%= errors_summary_for broadcast %> + +<%= bootstrap_form_with model: model, local: true do |form| %> + <%= form.text_field :stream_url_override %> + <%= form.text_field :stream_key_override %> + <%= form.text_area :director_mode_video_embed %> + +
+ <%= link_to t("shared.cancel"), [:admin, broadcast.project.account], class: "col-3 text-reset" %> +
+ <%= form.submit class: class_string("btn btn-block", ["btn-success", "btn-primary"] => broadcast.new_record?), data: { disable_with: t("shared.disable_with") } %> +
+
+<% end %> diff --git a/app/views/admin/broadcasts/edit.html.erb b/app/views/admin/broadcasts/edit.html.erb new file mode 100644 index 0000000..1dc8bb5 --- /dev/null +++ b/app/views/admin/broadcasts/edit.html.erb @@ -0,0 +1,6 @@ +
+ <%= card_header text: t(".heading"), close_action_path: [:admin, @broadcast.project.account] %> +
+ <%= render "form", model: [:admin, @broadcast], broadcast: @broadcast %> +
+
diff --git a/app/views/broadcast_recordings/destroy.js.erb b/app/views/broadcast_recordings/destroy.js.erb new file mode 100644 index 0000000..0359114 --- /dev/null +++ b/app/views/broadcast_recordings/destroy.js.erb @@ -0,0 +1,6 @@ +var dom_id = "<%= dom_id(@recording) %>" +$('[data-id="' + dom_id + '"]').remove(); +<% if @recordings.empty? %> + $("#broadcast_recordings_nav").append('') +<% end %> +$("#broadcast_recordings").html("<%= j render(partial: 'broadcasts/broadcast_recordings', locals: { recordings: @recordings, broadcast: @broadcast }) %>"); \ No newline at end of file diff --git a/app/views/broadcasts/_broadcast.html.erb b/app/views/broadcasts/_broadcast.html.erb index 8cfb573..c40b09c 100644 --- a/app/views/broadcasts/_broadcast.html.erb +++ b/app/views/broadcasts/_broadcast.html.erb @@ -16,8 +16,8 @@
<%= button_tag t(".actions.manage"), class: "btn btn-light btn-sm dropdown-toggle border", data: { toggle: "dropdown", boundary: "window" }, aria: { haspopup: true, expanded: false } %>