diff --git a/app/assets/stylesheets/admins.scss b/app/assets/stylesheets/admins.scss index 65036144..38c40afc 100644 --- a/app/assets/stylesheets/admins.scss +++ b/app/assets/stylesheets/admins.scss @@ -98,4 +98,4 @@ .admin-tabs { justify-content: space-around; -} +} \ No newline at end of file diff --git a/app/controllers/admins_controller.rb b/app/controllers/admins_controller.rb index d51aeca0..ee963ac3 100644 --- a/app/controllers/admins_controller.rb +++ b/app/controllers/admins_controller.rb @@ -56,12 +56,19 @@ class AdminsController < ApplicationController # GET /admins/server_recordings def server_recordings - server_rooms = rooms_list_for_recordings + @search = params[:search] || "" - @search, @order_column, @order_direction, recs = - all_recordings(server_rooms, params.permit(:search, :column, :direction), true, true) + if @search.present? + if @search.include? "@" + user_email = @search + else + room_uid = @search + end + else + @latest = true + end - @pagy, @recordings = pagy_array(recs) + @pagy, @recordings = pagy_array(recordings_to_show(user_email, room_uid)) end # GET /admins/rooms diff --git a/app/controllers/concerns/populator.rb b/app/controllers/concerns/populator.rb index b7865462..a8df30d6 100644 --- a/app/controllers/concerns/populator.rb +++ b/app/controllers/concerns/populator.rb @@ -56,12 +56,22 @@ module Populator end end - # Returns list of rooms needed to get the recordings on the server - def rooms_list_for_recordings - if Rails.configuration.loadbalanced_configuration - Room.includes(:owner).where(users: { provider: @user_domain }).pluck(:bbb_id) + # Returns the correct recordings based on the users inputs + def recordings_to_show(user = nil, room = nil) + if user.present? + # Find user and get his recordings + rooms = User.find_by(email: user)&.rooms&.pluck(:bbb_id) + return all_recordings(rooms) if user.present? + + [] # return no recs if room not found + elsif room.present? + # Find room and get its recordings + room = Room.find_by(uid: room)&.bbb_id + return all_recordings([room]) if room.present? + + [] else - Room.pluck(:bbb_id) + latest_recordings end end @@ -75,4 +85,36 @@ module Populator list.admins_search(@search).order(updated_at: :desc) end + + private + + # Returns exactly 1 page of the latest recordings + def latest_recordings + return_length = Rails.configuration.pagination_number + recordings = [] + counter = 0 + + # Manually paginate through the rooms + while recordings.length < return_length + rooms = if Rails.configuration.loadbalanced_configuration + Room.includes(:owner) + .where(users: { provider: @user_domain }) + .order(last_session: :desc) + .limit(return_length) + .offset(counter * return_length) + .pluck(:bbb_id) + else + Room.order(last_session: :desc) + .limit(return_length) + .offset(counter * return_length) + .pluck(:bbb_id) + end + + break if rooms.blank? + counter += 1 + recordings.push(*all_recordings(rooms)) + end + + recordings[0..return_length] + end end diff --git a/app/controllers/concerns/recorder.rb b/app/controllers/concerns/recorder.rb index 68607977..0365fb2d 100644 --- a/app/controllers/concerns/recorder.rb +++ b/app/controllers/concerns/recorder.rb @@ -37,7 +37,7 @@ module Recorder def all_recordings(room_bbb_ids, search_params = {}, ret_search_params = false, search_name = false) res = { recordings: [] } - until room_bbb_ids.empty? + until room_bbb_ids.empty? || res[:recordings].length > Rails.configuration.pagination_number # bbb.get_recordings returns an object # take only the array portion of the object that is returned full_res = get_multiple_recordings(room_bbb_ids.pop(Rails.configuration.pagination_number)) diff --git a/app/models/room.rb b/app/models/room.rb index 1d9abf5b..ec8f9d2e 100644 --- a/app/models/room.rb +++ b/app/models/room.rb @@ -51,7 +51,7 @@ class Room < ApplicationRecord # Rely on manual ordering if trying to sort by status return order_by_status(table, running_ids) if column == "status" - return table.order("COALESCE(rooms.last_session,rooms.created_at) DESC") if column == "created_at" + return table.order(Arel.sql("COALESCE(rooms.last_session,rooms.created_at) DESC")) if column == "created_at" return table.order(Arel.sql("rooms.#{column} #{direction}")) if table.column_names.include?(column) diff --git a/app/views/admins/components/_manage_users_table.html.erb b/app/views/admins/components/_manage_users_table.html.erb index f4d00db3..1fbfc3ca 100644 --- a/app/views/admins/components/_manage_users_table.html.erb +++ b/app/views/admins/components/_manage_users_table.html.erb @@ -90,6 +90,11 @@ + <% unless user.rooms.length.zero? %> + <%= link_to admin_recordings_path(search: user.email), class: "dropdown-item" do %> + <%= t("administrator.rooms.table.recordings") %> + <% end %> + <% end %> <%= button_to admin_ban_path(user_uid: user.uid), class: "dropdown-item", "data-disable": "" do %> <%= t("administrator.users.settings.ban") %> <% end %> diff --git a/app/views/admins/components/_recordings.html.erb b/app/views/admins/components/_recordings.html.erb index 8d890fef..6030b692 100644 --- a/app/views/admins/components/_recordings.html.erb +++ b/app/views/admins/components/_recordings.html.erb @@ -93,7 +93,7 @@ <% end %> - <% if !@recordings.empty?%> + <% if !@recordings.empty? && !@latest%>
<%== pagy_bootstrap_nav(@pagy) %>
diff --git a/app/views/admins/components/_server_room_row.html.erb b/app/views/admins/components/_server_room_row.html.erb index 34d9a06f..6aece4c8 100644 --- a/app/views/admins/components/_server_room_row.html.erb +++ b/app/views/admins/components/_server_room_row.html.erb @@ -65,6 +65,9 @@ <%= t("room.settings") %> + <%= link_to admin_recordings_path(search: room.uid), class: "dropdown-item" do %> + <%= t("administrator.rooms.table.recordings") %> + <% end %> <% if preupload_allowed? %> <%= t("room.add_presentation") %> diff --git a/app/views/admins/components/_setting_view.html.erb b/app/views/admins/components/_setting_view.html.erb index 1b2eb6ec..df7dffe1 100644 --- a/app/views/admins/components/_setting_view.html.erb +++ b/app/views/admins/components/_setting_view.html.erb @@ -17,7 +17,7 @@
- <%= render "shared/components/subtitle", subtitle: setting_title, search: search %> + <%= render "shared/components/subtitle", subtitle: setting_title, search: search, search_info: defined?(search_info) ? search_info : "" %>
diff --git a/app/views/admins/server_recordings.html.erb b/app/views/admins/server_recordings.html.erb index b2732e08..a3292771 100644 --- a/app/views/admins/server_recordings.html.erb +++ b/app/views/admins/server_recordings.html.erb @@ -21,7 +21,7 @@ <%= render "admins/components/menu_buttons" %>
- <%= render "admins/components/setting_view", setting_id: "recordings", setting_title: t("administrator.recordings.title"), search: true %> + <%= render "admins/components/setting_view", setting_id: "recordings", setting_title: t("administrator.recordings.latest"), search: true, search_info: t("administrator.recordings.search_info") %>
diff --git a/app/views/shared/components/_subtitle.html.erb b/app/views/shared/components/_subtitle.html.erb index 43acd90a..56fd8fc7 100644 --- a/app/views/shared/components/_subtitle.html.erb +++ b/app/views/shared/components/_subtitle.html.erb @@ -35,6 +35,14 @@ + <% if defined?(search_info) && search_info.present? %> +
+ + + <%= search_info %> + +
+ <% end %> <% else %>
diff --git a/config/locales/en.yml b/config/locales/en.yml index 9987acec..bfc1ae18 100755 --- a/config/locales/en.yml +++ b/config/locales/en.yml @@ -138,8 +138,10 @@ en: settings: Site Settings successfully changed unauthorized: You are not authorized to perform actions on this user recordings: + latest: Latest Recordings title: Server Recordings no_recordings: This server has no recordings. + search_info: Enter a user's full email or a room's uid roles: appear_in_share_list: Include users with this role in the dropdown for sharing rooms can_create_rooms: Can create rooms diff --git a/spec/controllers/admins_controller_spec.rb b/spec/controllers/admins_controller_spec.rb index a172ea89..3d009f21 100644 --- a/spec/controllers/admins_controller_spec.rb +++ b/spec/controllers/admins_controller_spec.rb @@ -28,6 +28,26 @@ describe AdminsController, type: :controller do @admin.set_role :admin end + describe "Server Recordings" do + it "renders the server_recordings page" do + @request.session[:user_id] = @admin.id + + get :server_recordings + + expect(response).to render_template(:server_recordings) + end + end + + describe "Server Rooms" do + it "renders the server_rooms page" do + @request.session[:user_id] = @admin.id + + get :server_rooms + + expect(response).to render_template(:server_rooms) + end + end + describe "User Roles" do before do allow(Rails.configuration).to receive(:enable_email_verification).and_return(true)