123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149 |
- # frozen_string_literal: true
- class Form::AccountBatch
- include ActiveModel::Model
- include Authorization
- include AccountableConcern
- include Payloadable
- attr_accessor :account_ids, :action, :current_account,
- :select_all_matching, :query
- def save
- case action
- when 'follow'
- follow!
- when 'unfollow'
- unfollow!
- when 'remove_from_followers'
- remove_from_followers!
- when 'remove_domains_from_followers'
- remove_domains_from_followers!
- when 'approve'
- approve!
- when 'reject'
- reject!
- when 'suppress_follow_recommendation'
- suppress_follow_recommendation!
- when 'unsuppress_follow_recommendation'
- unsuppress_follow_recommendation!
- when 'suspend'
- suspend!
- end
- end
- private
- def follow!
- error = nil
- accounts.each do |target_account|
- FollowService.new.call(current_account, target_account)
- rescue Mastodon::NotPermittedError, ActiveRecord::RecordNotFound => e
- error ||= e
- end
- raise error if error.present?
- end
- def unfollow!
- accounts.each do |target_account|
- UnfollowService.new.call(current_account, target_account)
- end
- end
- def remove_from_followers!
- RemoveFromFollowersService.new.call(current_account, account_ids)
- end
- def remove_domains_from_followers!
- RemoveDomainsFromFollowersService.new.call(current_account, account_domains)
- end
- def account_domains
- accounts.group(:domain).pluck(:domain).compact
- end
- def accounts
- if select_all_matching?
- query
- else
- Account.where(id: account_ids)
- end
- end
- def approve!
- accounts.includes(:user).find_each do |account|
- approve_account(account)
- end
- end
- def reject!
- accounts.includes(:user).find_each do |account|
- reject_account(account)
- end
- end
- def suspend!
- accounts.find_each do |account|
- if account.user_pending?
- reject_account(account)
- else
- suspend_account(account)
- end
- end
- end
- def suppress_follow_recommendation!
- authorize(:follow_recommendation, :suppress?)
- accounts.find_each do |account|
- FollowRecommendationSuppression.create(account: account)
- end
- end
- def unsuppress_follow_recommendation!
- authorize(:follow_recommendation, :unsuppress?)
- FollowRecommendationSuppression.where(account_id: account_ids).destroy_all
- end
- def reject_account(account)
- authorize(account.user, :reject?)
- log_action(:reject, account.user)
- account.suspend!(origin: :local)
- AccountDeletionWorker.perform_async(account.id, { 'reserve_username' => false })
- end
- def suspend_account(account)
- authorize(account, :suspend?)
- log_action(:suspend, account)
- account.suspend!(origin: :local)
- account.strikes.create!(
- account: current_account,
- action: :suspend
- )
- Admin::SuspensionWorker.perform_async(account.id)
- # Suspending a single account closes their associated reports, so
- # mass-suspending would be consistent.
- Report.where(target_account: account).unresolved.find_each do |report|
- authorize(report, :update?)
- log_action(:resolve, report)
- report.resolve!(current_account)
- rescue Mastodon::NotPermittedError
- # This should not happen, but just in case, do not fail early
- end
- end
- def approve_account(account)
- authorize(account.user, :approve?)
- log_action(:approve, account.user)
- account.user.approve!
- end
- def select_all_matching?
- select_all_matching == '1'
- end
- end
|