You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
99 lines
2.1 KiB
99 lines
2.1 KiB
# 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? |
|
role.can?(:manage_reports, :manage_users) |
|
end |
|
|
|
def show? |
|
return false if author.suspended? |
|
|
|
if requires_mention? |
|
owned? || mention_exists? |
|
elsif private? |
|
owned? || following_author? || mention_exists? |
|
else |
|
current_account.nil? || (!author_blocking? && !author_blocking_domain?) |
|
end |
|
end |
|
|
|
def reblog? |
|
!requires_mention? && (!private? || owned?) && show? && !blocking_author? |
|
end |
|
|
|
def favourite? |
|
show? && !blocking_author? |
|
end |
|
|
|
def destroy? |
|
role.can?(:manage_reports) || owned? |
|
end |
|
|
|
alias unreblog? destroy? |
|
|
|
def update? |
|
role.can?(:manage_reports) || owned? |
|
end |
|
|
|
def review? |
|
role.can?(:manage_taxonomies) |
|
end |
|
|
|
private |
|
|
|
def requires_mention? |
|
record.direct_visibility? || record.limited_visibility? |
|
end |
|
|
|
def owned? |
|
author.id == current_account&.id |
|
end |
|
|
|
def private? |
|
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 author_blocking_domain? |
|
return false if current_account.nil? || current_account.domain.nil? |
|
|
|
author.domain_blocking?(current_account.domain) |
|
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 |
|
end
|
|
|