Performance improvement for notifications API
This commit is contained in:
parent
52119104b9
commit
f88ca4a206
5 changed files with 23 additions and 7 deletions
|
@ -4,6 +4,6 @@ class Api::V1::AppsController < ApiController
|
|||
respond_to :json
|
||||
|
||||
def create
|
||||
@app = Doorkeeper::Application.create!(name: params[:client_name], redirect_uri: params[:redirect_uris], scopes: params[:scopes])
|
||||
@app = Doorkeeper::Application.create!(name: params[:client_name], redirect_uri: params[:redirect_uris], scopes: (params[:scopes] || Doorkeeper.configuration.default_scopes))
|
||||
end
|
||||
end
|
||||
|
|
|
@ -8,8 +8,11 @@ class Api::V1::NotificationsController < ApiController
|
|||
|
||||
def index
|
||||
@notifications = Notification.where(account: current_account).with_includes.paginate_by_max_id(20, params[:max_id], params[:since_id])
|
||||
statuses = @notifications.select { |n| !n.target_status.nil? }.map(&:target_status)
|
||||
|
||||
set_maps(@notifications.select { |n| !n.target_status.nil? }.map(&:target_status))
|
||||
set_maps(statuses)
|
||||
set_counters_maps(statuses)
|
||||
set_account_counters_maps(@notifications.map(&:from_account))
|
||||
|
||||
next_path = api_v1_notifications_url(max_id: @notifications.last.id) if @notifications.size == 20
|
||||
prev_path = api_v1_notifications_url(since_id: @notifications.first.id) unless @notifications.empty?
|
||||
|
|
|
@ -89,4 +89,17 @@ class ApiController < ApplicationController
|
|||
@reblogs_map = Status.reblogs_map(status_ids, current_account)
|
||||
@favourites_map = Status.favourites_map(status_ids, current_account)
|
||||
end
|
||||
|
||||
def set_counters_maps(statuses) # rubocop:disable Style/AccessorMethodName
|
||||
status_ids = statuses.map { |s| s.reblog? ? s.reblog_of_id : s.id }.uniq
|
||||
@favourites_counts_map = Favourite.select('status_id, COUNT(id) AS favourites_count').group('status_id').where(status_id: status_ids).map { |f| [f.status_id, f.favourites_count] }.to_h
|
||||
@reblogs_counts_map = Status.select('statuses.id, COUNT(reblogs.id) AS reblogs_count').joins('LEFT OUTER JOIN statuses AS reblogs ON statuses.id = reblogs.reblog_of_id').where(id: status_ids).group('statuses.id').map { |r| [r.id, r.reblogs_count] }.to_h
|
||||
end
|
||||
|
||||
def set_account_counters_maps(accounts) # rubocop:disable Style/AccessorMethodName
|
||||
account_ids = accounts.map(&:id)
|
||||
@followers_counts_map = Follow.unscoped.select('target_account_id, COUNT(account_id) AS followers_count').group('target_account_id').where(target_account_id: account_ids).map { |f| [f.target_account_id, f.followers_count] }.to_h
|
||||
@following_counts_map = Follow.unscoped.select('account_id, COUNT(target_account_id) AS following_count').group('account_id').where(account_id: account_ids).map { |f| [f.account_id, f.following_count] }.to_h
|
||||
@statuses_counts_map = Status.unscoped.select('account_id, COUNT(id) AS statuses_count').group('account_id').where(account_id: account_ids).map { |s| [s.account_id, s.statuses_count] }.to_h
|
||||
end
|
||||
end
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue