123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134 |
- # 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
|