@migration = current_account.migrations.build(resource_params)
if @migration.save_with_challenge(current_user)
- current_account.update!(moved_to_account: @migration.target_account)
- ActivityPub::UpdateDistributionWorker.perform_async(current_account.id)
- ActivityPub::MoveDistributionWorker.perform_async(@migration.id)
+ MoveService.new.call(@migration)
redirect_to settings_migration_path, notice: I18n.t('migrations.moved_msg', acct: current_account.moved_to_account.acct)
else
render :show
origin_account.update(moved_to_account: target_account)
# Initiate a re-follow for each follower
- origin_account.followers.local.select(:id).find_in_batches do |follower_accounts|
- UnfollowFollowWorker.push_bulk(follower_accounts.map(&:id)) do |follower_account_id|
- [follower_account_id, origin_account.id, target_account.id]
- end
- end
+ MoveWorker.perform_async(origin_account.id, target_account.id)
end
private
--- /dev/null
+# frozen_string_literal: true
+
+class MoveService < BaseService
+ def call(migration)
+ @migration = migration
+ @source_account = migration.account
+ @target_account = migration.target_account
+
+ update_redirect!
+ process_local_relationships!
+ distribute_update!
+ distribute_move!
+ end
+
+ private
+
+ def update_redirect!
+ @source_account.update!(moved_to_account: @target_account)
+ end
+
+ def process_local_relationships!
+ MoveWorker.perform_async(@source_account.id, @target_account.id)
+ end
+
+ def distribute_update!
+ ActivityPub::UpdateDistributionWorker.perform_async(@source_account.id)
+ end
+
+ def distribute_move!
+ ActivityPub::MoveDistributionWorker.perform_async(@migration.id)
+ end
+end
--- /dev/null
+# frozen_string_literal: true
+
+class MoveWorker
+ include Sidekiq::Worker
+
+ def perform(source_account_id, target_account_id)
+ @source_account = Account.find(source_account_id)
+ @target_account = Account.find(target_account_id)
+
+ if @target_account.local?
+ rewrite_follows!
+ else
+ queue_follow_unfollows!
+ end
+ rescue ActiveRecord::RecordNotFound
+ true
+ end
+
+ private
+
+ def rewrite_follows!
+ @source_account.passive_relationships
+ .where(account: Account.local)
+ .in_batches
+ .update_all(target_account: @target_account)
+ end
+
+ def queue_follow_unfollows!
+ @source_account.followers.local.select(:id).find_in_batches do |accounts|
+ UnfollowFollowWorker.push_bulk(accounts.map(&:id)) { |follower_id| [follower_id, @source_account.id, @target_account.id] }
+ end
+ end
+end