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.
125 lines
2.8 KiB
125 lines
2.8 KiB
# frozen_string_literal: true |
|
|
|
class Form::AccountBatch |
|
include ActiveModel::Model |
|
include Authorization |
|
include AccountableConcern |
|
include Payloadable |
|
|
|
attr_accessor :account_ids, :action, :current_account |
|
|
|
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 |
|
Account.where(id: account_ids) |
|
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, username: account.username) |
|
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) |
|
Admin::SuspensionWorker.perform_async(account.id) |
|
end |
|
|
|
def approve_account(account) |
|
authorize(account.user, :approve?) |
|
log_action(:approve, account.user) |
|
account.user.approve! |
|
end |
|
end
|
|
|