From 90dc47a61b52bec36606170fc8d1f9f80ed95a4e Mon Sep 17 00:00:00 2001 From: mgabdev <> Date: Thu, 6 Aug 2020 23:20:48 -0500 Subject: [PATCH] Updated GroupCollectionController to have sorting v1 for logged-in users MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit • Updated: - GroupCollectionController to have sorting v1 for logged-in users --- .../timelines/group_collection_controller.rb | 81 ++++++++++++++++--- 1 file changed, 71 insertions(+), 10 deletions(-) diff --git a/app/controllers/api/v1/timelines/group_collection_controller.rb b/app/controllers/api/v1/timelines/group_collection_controller.rb index f883c043..ead367cf 100644 --- a/app/controllers/api/v1/timelines/group_collection_controller.rb +++ b/app/controllers/api/v1/timelines/group_collection_controller.rb @@ -2,6 +2,7 @@ class Api::V1::Timelines::GroupCollectionController < Api::BaseController before_action :set_collection_type + before_action :set_sort_type before_action :set_statuses after_action :insert_pagination_headers, unless: -> { @statuses.empty? } @@ -27,6 +28,21 @@ class Api::V1::Timelines::GroupCollectionController < Api::BaseController return @collection_type end + def set_sort_type + @sort_type = 'newest' + @sort_type = params[:sort_by] if [ + 'newest', + 'recent', + 'top_today', + 'top_weekly', + 'top_monthly', + 'top_yearly', + 'top_all_time', + ].include? params[:sort_by] + + return @sort_type + end + private def set_statuses @@ -47,11 +63,54 @@ class Api::V1::Timelines::GroupCollectionController < Api::BaseController @groupIds = current_user.account.groups.pluck(:id) end + date_limit = 30.days.ago + top_order = 'status_stats.favourites_count DESC, status_stats.reblogs_count DESC, status_stats.replies_count DESC' + + if @sort_type == 'top_today' + date_limit = 24.hours.ago + elsif @sort_type == 'top_weekly' + date_limit = 7.days.ago + elsif @sort_type == 'top_monthly' + date_limit = 30.days.ago + elsif @sort_type == 'top_yearly' + date_limit = 1.year.ago + end + if current_account - statuses = Status.as_group_collection_timeline(@groupIds).paginate_by_id( - limit_param(DEFAULT_STATUSES_LIMIT), - params_slice(:max_id, :since_id, :min_id) - ).reject { |status| FeedManager.instance.filter?(:home, status, current_account.id) } + if @sort_type == 'newest' + statuses = Status.where( + group: @groupIds, reply: false + ).paginate_by_id(limit_param(DEFAULT_STATUSES_LIMIT), params_slice(:max_id, :since_id, :min_id)) + .reject { |status| FeedManager.instance.filter?(:home, status, current_account.id) } + elsif @sort_type == 'recent' + statuses = Status.where( + group: @groupIds, reply: false + ).joins(:status_stat).where( + 'status_stats.replies_count > 0 OR status_stats.reblogs_count > 0 OR status_stats.favourites_count > 0' + ).order('status_stats.updated_at DESC').paginate_by_id( + limit_param(DEFAULT_STATUSES_LIMIT), + params_slice(:max_id, :since_id, :min_id) + ).reject { |status| FeedManager.instance.filter?(:home, status, current_account.id) } + elsif ['top_today', 'top_weekly', 'top_monthly', 'top_yearly', 'top_all_time'].include? @sort_type + if @sort_type == 'top_all_time' + statuses = Status.unscoped.where( + group: @groupIds, reply: false + ).joins(:status_stat).order(top_order) + .paginate_by_id( + limit_param(DEFAULT_STATUSES_LIMIT), + params_slice(:max_id, :since_id, :min_id) + ).reject { |status| FeedManager.instance.filter?(:home, status, current_account.id) } + else + statuses = Status.unscoped.where( + group: @groupIds, reply: false + ).where( + 'statuses.created_at > ?', date_limit + ).joins(:status_stat).order(top_order).paginate_by_id( + limit_param(DEFAULT_STATUSES_LIMIT), + params_slice(:max_id, :since_id, :min_id) + ).reject { |status| FeedManager.instance.filter?(:home, status, current_account.id) } + end + end else statuses = Status.as_group_collection_timeline(@groupIds).paginate_by_id( limit_param(DEFAULT_STATUSES_LIMIT), @@ -59,13 +118,15 @@ class Api::V1::Timelines::GroupCollectionController < Api::BaseController ) end - if truthy_param?(:only_media) && current_account - # `SELECT DISTINCT id, updated_at` is too slow, so pluck ids at first, and then select id, updated_at with ids. - status_ids = statuses.joins(:media_attachments).distinct(:id).pluck(:id) - statuses.where(id: status_ids) - else + # statuses = query + + # if truthy_param?(:only_media) && current_account + # # `SELECT DISTINCT id, updated_at` is too slow, so pluck ids at first, and then select id, updated_at with ids. + # status_ids = statuses.joins(:media_attachments).distinct(:id).pluck(:id) + # statuses.where(id: status_ids) + # else statuses - end + # end end def insert_pagination_headers