bastodon/app/services/approve_appeal_service.rb
Eugen Rochko 976cd6413e
Fix moderator leak in undo_mark_statuses_as_sensitive (#18525)
Signed-off-by: Eugen Rochko <eugen@zeonfederated.com>

Co-authored-by: 40826d <74816220+40826d@users.noreply.github.com>
2022-05-26 22:04:16 +02:00

83 lines
1.7 KiB
Ruby

# frozen_string_literal: true
class ApproveAppealService < BaseService
def call(appeal, current_account)
@appeal = appeal
@strike = appeal.strike
@current_account = current_account
ApplicationRecord.transaction do
undo_strike_action!
mark_strike_as_appealed!
end
queue_workers!
notify_target_account!
end
private
def target_account
@strike.target_account
end
def undo_strike_action!
case @strike.action
when 'disable'
undo_disable!
when 'delete_statuses'
undo_delete_statuses!
when 'mark_statuses_as_sensitive'
undo_mark_statuses_as_sensitive!
when 'sensitive'
undo_sensitive!
when 'silence'
undo_silence!
when 'suspend'
undo_suspend!
end
end
def mark_strike_as_appealed!
@appeal.approve!(@current_account)
@strike.touch(:overruled_at)
end
def undo_disable!
target_account.user.enable!
end
def undo_delete_statuses!
# Cannot be undone
end
def undo_mark_statuses_as_sensitive!
representative_account = Account.representative
@strike.statuses.includes(:media_attachments).each do |status|
UpdateStatusService.new.call(status, representative_account.id, sensitive: false) if status.with_media?
end
end
def undo_sensitive!
target_account.unsensitize!
end
def undo_silence!
target_account.unsilence!
end
def undo_suspend!
target_account.unsuspend!
end
def queue_workers!
case @strike.action
when 'suspend'
Admin::UnsuspensionWorker.perform_async(target_account.id)
end
end
def notify_target_account!
UserMailer.appeal_approved(target_account.user, @appeal).deliver_later
end
end