forked from cybrespace/mastodon
Fix UserTrackingConcern firing on every request, optimize some queries (#5368)
- For some reason, :if option on before_action did not work. It got executed every time, returned false, and the action run anyway, which led to the current_sign_in_at and sign_in_count being updated on every request - Return "do not filter" early in FeedManager#filter_from_home? if the status is authored by receiver. Usually this method is not called for own statuses at all, but it is called when Feed#get uses the database - Return early if #reload_stale_associations! has nothing to load to save a database query with WHERE 1=0
This commit is contained in:
parent
48f7a58799
commit
b8db386e05
|
@ -7,12 +7,14 @@ module UserTrackingConcern
|
||||||
UPDATE_SIGN_IN_HOURS = 24
|
UPDATE_SIGN_IN_HOURS = 24
|
||||||
|
|
||||||
included do
|
included do
|
||||||
before_action :set_user_activity, if: %i(user_signed_in? user_needs_sign_in_update?)
|
before_action :set_user_activity
|
||||||
end
|
end
|
||||||
|
|
||||||
private
|
private
|
||||||
|
|
||||||
def set_user_activity
|
def set_user_activity
|
||||||
|
return unless user_needs_sign_in_update?
|
||||||
|
|
||||||
# Mark as signed-in today
|
# Mark as signed-in today
|
||||||
current_user.update_tracked_fields!(request)
|
current_user.update_tracked_fields!(request)
|
||||||
|
|
||||||
|
@ -21,7 +23,7 @@ module UserTrackingConcern
|
||||||
end
|
end
|
||||||
|
|
||||||
def user_needs_sign_in_update?
|
def user_needs_sign_in_update?
|
||||||
current_user.current_sign_in_at.nil? || current_user.current_sign_in_at < UPDATE_SIGN_IN_HOURS.hours.ago
|
user_signed_in? && (current_user.current_sign_in_at.nil? || current_user.current_sign_in_at < UPDATE_SIGN_IN_HOURS.hours.ago)
|
||||||
end
|
end
|
||||||
|
|
||||||
def user_needs_feed_update?
|
def user_needs_feed_update?
|
||||||
|
|
|
@ -115,7 +115,8 @@ class FeedManager
|
||||||
end
|
end
|
||||||
|
|
||||||
def filter_from_home?(status, receiver_id)
|
def filter_from_home?(status, receiver_id)
|
||||||
return true if status.reply? && (status.in_reply_to_id.nil? || status.in_reply_to_account_id.nil?)
|
return false if receiver_id == status.account_id
|
||||||
|
return true if status.reply? && (status.in_reply_to_id.nil? || status.in_reply_to_account_id.nil?)
|
||||||
|
|
||||||
check_for_mutes = [status.account_id]
|
check_for_mutes = [status.account_id]
|
||||||
check_for_mutes.concat([status.reblog.account_id]) if status.reblog?
|
check_for_mutes.concat([status.reblog.account_id]) if status.reblog?
|
||||||
|
|
|
@ -68,7 +68,10 @@ class Notification < ApplicationRecord
|
||||||
class << self
|
class << self
|
||||||
def reload_stale_associations!(cached_items)
|
def reload_stale_associations!(cached_items)
|
||||||
account_ids = cached_items.map(&:from_account_id).uniq
|
account_ids = cached_items.map(&:from_account_id).uniq
|
||||||
accounts = Account.where(id: account_ids).map { |a| [a.id, a] }.to_h
|
|
||||||
|
return if account_ids.empty?
|
||||||
|
|
||||||
|
accounts = Account.where(id: account_ids).map { |a| [a.id, a] }.to_h
|
||||||
|
|
||||||
cached_items.each do |item|
|
cached_items.each do |item|
|
||||||
item.from_account = accounts[item.from_account_id]
|
item.from_account = accounts[item.from_account_id]
|
||||||
|
|
|
@ -194,7 +194,11 @@ class Status < ApplicationRecord
|
||||||
account_ids << item.reblog.account_id if item.reblog?
|
account_ids << item.reblog.account_id if item.reblog?
|
||||||
end
|
end
|
||||||
|
|
||||||
accounts = Account.where(id: account_ids.uniq).map { |a| [a.id, a] }.to_h
|
account_ids.uniq!
|
||||||
|
|
||||||
|
return if account_ids.empty?
|
||||||
|
|
||||||
|
accounts = Account.where(id: account_ids).map { |a| [a.id, a] }.to_h
|
||||||
|
|
||||||
cached_items.each do |item|
|
cached_items.each do |item|
|
||||||
item.account = accounts[item.account_id]
|
item.account = accounts[item.account_id]
|
||||||
|
|
Loading…
Reference in New Issue