2019-03-16 12:23:22 +02:00
|
|
|
# frozen_string_literal: true
|
|
|
|
|
|
|
|
class Form::AccountBatch
|
|
|
|
include ActiveModel::Model
|
2019-04-06 18:53:45 +03:00
|
|
|
include Authorization
|
2021-12-05 22:48:39 +02:00
|
|
|
include AccountableConcern
|
2019-06-05 00:11:18 +03:00
|
|
|
include Payloadable
|
2019-03-16 12:23:22 +02:00
|
|
|
|
2022-08-26 00:33:34 +03:00
|
|
|
attr_accessor :account_ids, :action, :current_account,
|
|
|
|
:select_all_matching, :query
|
2019-03-16 12:23:22 +02:00
|
|
|
|
|
|
|
def save
|
|
|
|
case action
|
2020-11-12 17:58:00 +02:00
|
|
|
when 'follow'
|
|
|
|
follow!
|
2019-03-16 12:23:22 +02:00
|
|
|
when 'unfollow'
|
|
|
|
unfollow!
|
|
|
|
when 'remove_from_followers'
|
|
|
|
remove_from_followers!
|
2023-03-03 21:25:15 +02:00
|
|
|
when 'remove_domains_from_followers'
|
|
|
|
remove_domains_from_followers!
|
2019-04-06 18:53:45 +03:00
|
|
|
when 'approve'
|
|
|
|
approve!
|
|
|
|
when 'reject'
|
|
|
|
reject!
|
2021-04-12 13:37:14 +03:00
|
|
|
when 'suppress_follow_recommendation'
|
|
|
|
suppress_follow_recommendation!
|
|
|
|
when 'unsuppress_follow_recommendation'
|
|
|
|
unsuppress_follow_recommendation!
|
2021-12-05 22:48:39 +02:00
|
|
|
when 'suspend'
|
|
|
|
suspend!
|
2019-03-16 12:23:22 +02:00
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
private
|
|
|
|
|
2020-11-12 17:58:00 +02:00
|
|
|
def follow!
|
2023-03-03 21:36:18 +02:00
|
|
|
error = nil
|
|
|
|
|
2021-12-05 22:48:39 +02:00
|
|
|
accounts.each do |target_account|
|
2020-11-12 17:58:00 +02:00
|
|
|
FollowService.new.call(current_account, target_account)
|
2023-03-03 21:36:18 +02:00
|
|
|
rescue Mastodon::NotPermittedError, ActiveRecord::RecordNotFound => e
|
|
|
|
error ||= e
|
2020-11-12 17:58:00 +02:00
|
|
|
end
|
2023-03-03 21:36:18 +02:00
|
|
|
|
|
|
|
raise error if error.present?
|
2020-11-12 17:58:00 +02:00
|
|
|
end
|
|
|
|
|
2019-03-16 12:23:22 +02:00
|
|
|
def unfollow!
|
2021-12-05 22:48:39 +02:00
|
|
|
accounts.each do |target_account|
|
2019-03-16 12:23:22 +02:00
|
|
|
UnfollowService.new.call(current_account, target_account)
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
def remove_from_followers!
|
2021-10-18 13:02:35 +03:00
|
|
|
RemoveFromFollowersService.new.call(current_account, account_ids)
|
2019-03-16 12:23:22 +02:00
|
|
|
end
|
|
|
|
|
2023-03-03 21:25:15 +02:00
|
|
|
def remove_domains_from_followers!
|
|
|
|
RemoveDomainsFromFollowersService.new.call(current_account, account_domains)
|
2019-03-16 12:23:22 +02:00
|
|
|
end
|
|
|
|
|
|
|
|
def account_domains
|
2020-12-07 13:08:30 +02:00
|
|
|
accounts.group(:domain).pluck(:domain).compact
|
2019-03-16 12:23:22 +02:00
|
|
|
end
|
|
|
|
|
|
|
|
def accounts
|
2022-08-26 00:33:34 +03:00
|
|
|
if select_all_matching?
|
|
|
|
query
|
|
|
|
else
|
|
|
|
Account.where(id: account_ids)
|
|
|
|
end
|
2019-03-16 12:23:22 +02:00
|
|
|
end
|
|
|
|
|
2019-04-06 18:53:45 +03:00
|
|
|
def approve!
|
2021-12-05 22:48:39 +02:00
|
|
|
accounts.includes(:user).find_each do |account|
|
|
|
|
approve_account(account)
|
|
|
|
end
|
2019-04-06 18:53:45 +03:00
|
|
|
end
|
|
|
|
|
|
|
|
def reject!
|
2021-12-05 22:48:39 +02:00
|
|
|
accounts.includes(:user).find_each do |account|
|
|
|
|
reject_account(account)
|
|
|
|
end
|
|
|
|
end
|
2019-04-06 18:53:45 +03:00
|
|
|
|
2021-12-05 22:48:39 +02:00
|
|
|
def suspend!
|
|
|
|
accounts.find_each do |account|
|
|
|
|
if account.user_pending?
|
|
|
|
reject_account(account)
|
|
|
|
else
|
|
|
|
suspend_account(account)
|
|
|
|
end
|
|
|
|
end
|
2019-04-06 18:53:45 +03:00
|
|
|
end
|
2021-04-12 13:37:14 +03:00
|
|
|
|
|
|
|
def suppress_follow_recommendation!
|
|
|
|
authorize(:follow_recommendation, :suppress?)
|
|
|
|
|
2021-12-05 22:48:39 +02:00
|
|
|
accounts.find_each do |account|
|
2021-04-12 13:37:14 +03:00
|
|
|
FollowRecommendationSuppression.create(account: account)
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
def unsuppress_follow_recommendation!
|
|
|
|
authorize(:follow_recommendation, :unsuppress?)
|
|
|
|
|
|
|
|
FollowRecommendationSuppression.where(account_id: account_ids).destroy_all
|
|
|
|
end
|
2021-12-05 22:48:39 +02:00
|
|
|
|
|
|
|
def reject_account(account)
|
|
|
|
authorize(account.user, :reject?)
|
2022-08-25 21:39:40 +03:00
|
|
|
log_action(:reject, account.user)
|
2021-12-05 22:48:39 +02:00
|
|
|
account.suspend!(origin: :local)
|
2022-01-28 01:43:56 +02:00
|
|
|
AccountDeletionWorker.perform_async(account.id, { 'reserve_username' => false })
|
2021-12-05 22:48:39 +02:00
|
|
|
end
|
|
|
|
|
|
|
|
def suspend_account(account)
|
|
|
|
authorize(account, :suspend?)
|
|
|
|
log_action(:suspend, account)
|
|
|
|
account.suspend!(origin: :local)
|
2022-11-17 11:52:51 +02:00
|
|
|
account.strikes.create!(
|
|
|
|
account: current_account,
|
|
|
|
action: :suspend
|
|
|
|
)
|
2021-12-05 22:48:39 +02:00
|
|
|
Admin::SuspensionWorker.perform_async(account.id)
|
|
|
|
end
|
|
|
|
|
|
|
|
def approve_account(account)
|
|
|
|
authorize(account.user, :approve?)
|
|
|
|
log_action(:approve, account.user)
|
|
|
|
account.user.approve!
|
|
|
|
end
|
2022-08-26 00:33:34 +03:00
|
|
|
|
|
|
|
def select_all_matching?
|
|
|
|
select_all_matching == '1'
|
|
|
|
end
|
2019-03-16 12:23:22 +02:00
|
|
|
end
|