0
0
Fork 0

Fix n+1 queries in StatusThreadingConcern (#7321)

This commit is contained in:
Eugen Rochko 2018-05-03 10:41:58 +02:00 committed by GitHub
parent a3d84e705a
commit a5293fdf61
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
4 changed files with 74 additions and 20 deletions

View file

@ -1,26 +1,32 @@
# frozen_string_literal: true
class StatusPolicy < ApplicationPolicy
def initialize(current_account, record, preloaded_relations = {})
super(current_account, record)
@preloaded_relations = preloaded_relations
end
def index?
staff?
end
def show?
if direct?
owned? || record.mentions.where(account: current_account).exists?
owned? || mention_exists?
elsif private?
owned? || current_account&.following?(author) || record.mentions.where(account: current_account).exists?
owned? || following_author? || mention_exists?
else
current_account.nil? || !author.blocking?(current_account)
current_account.nil? || !author_blocking?
end
end
def reblog?
!direct? && (!private? || owned?) && show? && !current_account&.blocking?(author)
!direct? && (!private? || owned?) && show? && !blocking_author?
end
def favourite?
show? && !current_account&.blocking?(author)
show? && !blocking_author?
end
def destroy?
@ -47,6 +53,34 @@ class StatusPolicy < ApplicationPolicy
record.private_visibility?
end
def mention_exists?
return false if current_account.nil?
if record.mentions.loaded?
record.mentions.any? { |mention| mention.account_id == current_account.id }
else
record.mentions.where(account: current_account).exists?
end
end
def blocking_author?
return false if current_account.nil?
@preloaded_relations[:blocking] ? @preloaded_relations[:blocking][author.id] : current_account.blocking?(author)
end
def author_blocking?
return false if current_account.nil?
@preloaded_relations[:blocked_by] ? @preloaded_relations[:blocked_by][author.id] : author.blocking?(current_account)
end
def following_author?
return false if current_account.nil?
@preloaded_relations[:following] ? @preloaded_relations[:following][author.id] : current_account.following?(author)
end
def author
record.account
end