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.
134 lines
2.9 KiB
134 lines
2.9 KiB
# frozen_string_literal: true |
|
|
|
class Admin::AccountAction |
|
include ActiveModel::Model |
|
include AccountableConcern |
|
include Authorization |
|
|
|
TYPES = %w( |
|
none |
|
disable |
|
silence |
|
suspend |
|
).freeze |
|
|
|
attr_accessor :target_account, |
|
:current_account, |
|
:type, |
|
:text, |
|
:report_id, |
|
:warning_preset_id, |
|
:send_email_notification |
|
|
|
attr_reader :warning |
|
|
|
def save! |
|
ApplicationRecord.transaction do |
|
process_action! |
|
process_warning! |
|
end |
|
|
|
queue_email! |
|
process_reports! |
|
end |
|
|
|
def report |
|
@report ||= Report.find(report_id) if report_id.present? |
|
end |
|
|
|
def with_report? |
|
!report.nil? |
|
end |
|
|
|
class << self |
|
def types_for_account(account) |
|
if account.local? |
|
TYPES |
|
else |
|
TYPES - %w(none disable) |
|
end |
|
end |
|
end |
|
|
|
private |
|
|
|
def process_action! |
|
case type |
|
when 'disable' |
|
handle_disable! |
|
when 'silence' |
|
handle_silence! |
|
when 'suspend' |
|
handle_suspend! |
|
end |
|
end |
|
|
|
def process_warning! |
|
return unless warnable? |
|
|
|
authorize(target_account, :warn?) |
|
|
|
@warning = AccountWarning.create!(target_account: target_account, |
|
account: current_account, |
|
action: type, |
|
text: text_for_warning) |
|
|
|
# A log entry is only interesting if the warning contains |
|
# custom text from someone. Otherwise it's just noise. |
|
log_action(:create, warning) if warning.text.present? |
|
end |
|
|
|
def process_reports! |
|
return if report_id.blank? |
|
|
|
authorize(report, :update?) |
|
|
|
if type == 'none' |
|
log_action(:resolve, report) |
|
report.resolve!(current_account) |
|
else |
|
Report.where(target_account: target_account).unresolved.update_all(action_taken: true, action_taken_by_account_id: current_account.id) |
|
end |
|
end |
|
|
|
def handle_disable! |
|
authorize(target_account.user, :disable?) |
|
log_action(:disable, target_account.user) |
|
target_account.user&.disable! |
|
end |
|
|
|
def handle_silence! |
|
authorize(target_account, :silence?) |
|
log_action(:silence, target_account) |
|
target_account.silence! |
|
end |
|
|
|
def handle_suspend! |
|
authorize(target_account, :suspend?) |
|
log_action(:suspend, target_account) |
|
target_account.suspend! |
|
queue_suspension_worker! |
|
end |
|
|
|
def text_for_warning |
|
[warning_preset&.text, text].compact.join("\n\n") |
|
end |
|
|
|
def queue_suspension_worker! |
|
Admin::SuspensionWorker.perform_async(target_account.id) |
|
end |
|
|
|
def queue_email! |
|
return unless warnable? |
|
|
|
UserMailer.warning(target_account.user, warning).deliver_later! |
|
end |
|
|
|
def warnable? |
|
send_email_notification && target_account.local? |
|
end |
|
|
|
def warning_preset |
|
@warning_preset ||= AccountWarningPreset.find(warning_preset_id) if warning_preset_id.present? |
|
end |
|
end
|
|
|