121 lines
2.8 KiB
Ruby
121 lines
2.8 KiB
Ruby
# frozen_string_literal: true
|
|
|
|
class Admin::ModerationAction < Admin::BaseAction
|
|
TYPES = %w(
|
|
delete
|
|
mark_as_sensitive
|
|
).freeze
|
|
|
|
validates :report_id, presence: true
|
|
|
|
private
|
|
|
|
def status_ids
|
|
report.status_ids
|
|
end
|
|
|
|
def statuses
|
|
@statuses ||= Status.with_discarded.where(id: status_ids).reorder(nil)
|
|
end
|
|
|
|
def collections
|
|
report.collections
|
|
end
|
|
|
|
def process_action!
|
|
case type
|
|
when 'delete'
|
|
handle_delete!
|
|
when 'mark_as_sensitive'
|
|
handle_mark_as_sensitive!
|
|
end
|
|
end
|
|
|
|
def handle_delete!
|
|
statuses.each { |status| authorize([:admin, status], :destroy?) }
|
|
collections.each { |collection| authorize([:admin, collection], :destroy?) }
|
|
|
|
ApplicationRecord.transaction do
|
|
delete_statuses!
|
|
delete_collections!
|
|
|
|
resolve_report!
|
|
process_strike!(:delete_statuses)
|
|
|
|
create_tombstones! unless target_account.local?
|
|
end
|
|
|
|
process_notification!
|
|
|
|
RemovalWorker.push_bulk(status_ids) { |status_id| [status_id, { 'preserve' => target_account.local?, 'immediate' => !target_account.local? }] }
|
|
end
|
|
|
|
def handle_mark_as_sensitive!
|
|
collections.each { |collection| authorize([:admin, collection], :update?) }
|
|
|
|
# Can't use a transaction here because UpdateStatusService queues
|
|
# Sidekiq jobs
|
|
mark_statuses_as_sensitive!
|
|
mark_collections_as_sensitive!
|
|
|
|
resolve_report!
|
|
process_strike!(:mark_statuses_as_sensitive)
|
|
process_notification!
|
|
end
|
|
|
|
def delete_statuses!
|
|
statuses.each do |status|
|
|
status.discard_with_reblogs
|
|
log_action(:destroy, status)
|
|
end
|
|
end
|
|
|
|
def delete_collections!
|
|
collections.each do |collection|
|
|
collection.destroy!
|
|
log_action(:destroy, collection)
|
|
end
|
|
end
|
|
|
|
def create_tombstones!
|
|
(statuses + collections).each { |record| Tombstone.find_or_create_by(uri: record.uri, account: target_account, by_moderator: true) }
|
|
end
|
|
|
|
def mark_statuses_as_sensitive!
|
|
representative_account = Account.representative
|
|
|
|
statuses.includes(:media_attachments, preview_cards_status: :preview_card).find_each do |status|
|
|
next if status.discarded? || !(status.with_media? || status.with_preview_card?)
|
|
|
|
authorize([:admin, status], :update?)
|
|
|
|
if target_account.local?
|
|
UpdateStatusService.new.call(status, representative_account.id, sensitive: true)
|
|
else
|
|
status.update(sensitive: true)
|
|
end
|
|
|
|
log_action(:update, status)
|
|
end
|
|
end
|
|
|
|
def mark_collections_as_sensitive!
|
|
collections.each do |collection|
|
|
UpdateCollectionService.new.call(collection, sensitive: true)
|
|
|
|
log_action(:update, collection)
|
|
end
|
|
end
|
|
|
|
def resolve_report!
|
|
report.resolve!(current_account)
|
|
log_action(:resolve, report)
|
|
end
|
|
|
|
def target_account
|
|
report.target_account
|
|
end
|
|
|
|
def text_for_warning = text
|
|
end
|