From 7b8b5b9f1ec16d4c4f5a7902d76e367db9a348ab Mon Sep 17 00:00:00 2001 From: Matt Jankowski Date: Wed, 31 May 2017 14:30:55 -0400 Subject: [PATCH] Refactor api/v1/notifications controller (#3470) --- .../api/v1/notifications_controller.rb | 67 +++++++++++++++---- 1 file changed, 54 insertions(+), 13 deletions(-) diff --git a/app/controllers/api/v1/notifications_controller.rb b/app/controllers/api/v1/notifications_controller.rb index e79434f1da..1cd4ca40a4 100644 --- a/app/controllers/api/v1/notifications_controller.rb +++ b/app/controllers/api/v1/notifications_controller.rb @@ -3,40 +3,81 @@ class Api::V1::NotificationsController < ApiController before_action -> { doorkeeper_authorize! :read } before_action :require_user! + after_action :insert_pagination_headers, only: :index respond_to :json DEFAULT_NOTIFICATIONS_LIMIT = 15 def index - @notifications = Notification.where(account: current_account).browserable(exclude_types).paginate_by_max_id(limit_param(DEFAULT_NOTIFICATIONS_LIMIT), params[:max_id], params[:since_id]) - @notifications = cache_collection(@notifications, Notification) - statuses = @notifications.select { |n| !n.target_status.nil? }.map(&:target_status) - - set_maps(statuses) - - next_path = api_v1_notifications_url(pagination_params(max_id: @notifications.last.id)) unless @notifications.empty? - prev_path = api_v1_notifications_url(pagination_params(since_id: @notifications.first.id)) unless @notifications.empty? - - set_pagination_headers(next_path, prev_path) + @notifications = load_notifications + set_maps_for_notification_target_statuses end def show - @notification = Notification.where(account: current_account).find(params[:id]) + @notification = current_account.notifications.find(params[:id]) end def clear - Notification.where(account: current_account).delete_all + current_account.notifications.delete_all render_empty end def dismiss - Notification.find_by!(account: current_account, id: params[:id]).destroy! + current_account.notifications.find_by!(id: params[:id]).destroy! render_empty end private + def load_notifications + cache_collection paginated_notifications, Notification + end + + def paginated_notifications + browserable_account_notifications.paginate_by_max_id( + limit_param(DEFAULT_NOTIFICATIONS_LIMIT), + params[:max_id], + params[:since_id] + ) + end + + def browserable_account_notifications + current_account.notifications.browserable(exclude_types) + end + + def set_maps_for_notification_target_statuses + set_maps target_statuses_from_notifications + end + + def target_statuses_from_notifications + @notifications.select { |notification| !notification.target_status.nil? }.map(&:target_status) + end + + def insert_pagination_headers + set_pagination_headers(next_path, prev_path) + end + + def next_path + unless @notifications.empty? + api_v1_notifications_url pagination_params(max_id: pagination_max_id) + end + end + + def prev_path + unless @notifications.empty? + api_v1_notifications_url pagination_params(since_id: pagination_since_id) + end + end + + def pagination_max_id + @notifications.last.id + end + + def pagination_since_id + @notifications.first.id + end + def exclude_types val = params.permit(exclude_types: [])[:exclude_types] || [] val = [val] unless val.is_a?(Enumerable)