forked from fedi/mastodon
03d59340da
* Fix Sidekiq warnings about JSON serialization This occurs on every symbol argument we pass, and every symbol key in hashes, because Sidekiq expects strings instead. See https://github.com/mperham/sidekiq/pull/5071 We do not need to change how workers parse their arguments because this has not changed and we were already converting to symbols adequately or using `with_indifferent_access`. * Set Sidekiq to raise on unsafe arguments in test mode In order to more easily catch issues that would produce warnings in production code.
93 lines
2.1 KiB
Ruby
93 lines
2.1 KiB
Ruby
# frozen_string_literal: true
|
|
|
|
class Admin::StatusBatchAction
|
|
include ActiveModel::Model
|
|
include AccountableConcern
|
|
include Authorization
|
|
|
|
attr_accessor :current_account, :type,
|
|
:status_ids, :report_id
|
|
|
|
def save!
|
|
process_action!
|
|
end
|
|
|
|
private
|
|
|
|
def statuses
|
|
Status.with_discarded.where(id: status_ids)
|
|
end
|
|
|
|
def process_action!
|
|
return if status_ids.empty?
|
|
|
|
case type
|
|
when 'delete'
|
|
handle_delete!
|
|
when 'report'
|
|
handle_report!
|
|
when 'remove_from_report'
|
|
handle_remove_from_report!
|
|
end
|
|
end
|
|
|
|
def handle_delete!
|
|
statuses.each { |status| authorize(status, :destroy?) }
|
|
|
|
ApplicationRecord.transaction do
|
|
statuses.each do |status|
|
|
status.discard
|
|
log_action(:destroy, status)
|
|
end
|
|
|
|
if with_report?
|
|
report.resolve!(current_account)
|
|
log_action(:resolve, report)
|
|
end
|
|
|
|
@warning = target_account.strikes.create!(
|
|
action: :delete_statuses,
|
|
account: current_account,
|
|
report: report,
|
|
status_ids: status_ids
|
|
)
|
|
|
|
statuses.each { |status| Tombstone.find_or_create_by(uri: status.uri, account: status.account, by_moderator: true) } unless target_account.local?
|
|
end
|
|
|
|
UserMailer.warning(target_account.user, @warning).deliver_later! if target_account.local?
|
|
RemovalWorker.push_bulk(status_ids) { |status_id| [status_id, { 'preserve' => target_account.local?, 'immediate' => !target_account.local? }] }
|
|
end
|
|
|
|
def handle_report!
|
|
@report = Report.new(report_params) unless with_report?
|
|
@report.status_ids = (@report.status_ids + status_ids.map(&:to_i)).uniq
|
|
@report.save!
|
|
|
|
@report_id = @report.id
|
|
end
|
|
|
|
def handle_remove_from_report!
|
|
return unless with_report?
|
|
|
|
report.status_ids -= status_ids.map(&:to_i)
|
|
report.save!
|
|
end
|
|
|
|
def report
|
|
@report ||= Report.find(report_id) if report_id.present?
|
|
end
|
|
|
|
def with_report?
|
|
!report.nil?
|
|
end
|
|
|
|
def target_account
|
|
@target_account ||= statuses.first.account
|
|
end
|
|
|
|
def report_params
|
|
{ account: current_account, target_account: target_account }
|
|
end
|
|
end
|