diff options
Diffstat (limited to 'app/policies')
-rw-r--r-- | app/policies/status_policy.rb | 46 |
1 files changed, 42 insertions, 4 deletions
diff --git a/app/policies/status_policy.rb b/app/policies/status_policy.rb index 307876856..96cdee8c7 100644 --- a/app/policies/status_policy.rb +++ b/app/policies/status_policy.rb @@ -1,6 +1,12 @@ # 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 @@ -9,16 +15,20 @@ class StatusPolicy < ApplicationPolicy return false if local_only? && current_account.nil? 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? + !direct? && (!private? || owned?) && show? && !blocking_author? + end + + def favourite? + show? && !blocking_author? end def destroy? @@ -45,6 +55,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 |