# frozen_string_literal: true class SuspendAccountService < BaseService def call(account, **options) @account = account @options = options purge_user! purge_profile! purge_content! unsubscribe_push_subscribers! end private def purge_user! if @options[:remove_user] @account.user&.destroy else @account.user&.disable! end end def purge_content! if @account.local? ActivityPub::RawDistributionWorker.perform_async(delete_actor_json, @account.id) ActivityPub::DeliveryWorker.push_bulk(Relay.enabled.pluck(:inbox_url)) do |inbox_url| [delete_actor_json, @account.id, inbox_url] end end @account.statuses.reorder(nil).find_in_batches do |statuses| BatchedRemoveStatusService.new.call(statuses) end [ @account.media_attachments, @account.stream_entries, @account.notifications, @account.favourites, @account.active_relationships, @account.passive_relationships, ].each do |association| destroy_all(association) end end def purge_profile! @account.suspended = true @account.display_name = '' @account.note = '' @account.statuses_count = 0 @account.avatar.destroy @account.header.destroy @account.save! end def unsubscribe_push_subscribers! destroy_all(@account.subscriptions) end def destroy_all(association) association.in_batches.destroy_all end def delete_actor_json return @delete_actor_json if defined?(@delete_actor_json) payload = ActiveModelSerializers::SerializableResource.new( @account, serializer: ActivityPub::DeleteActorSerializer, adapter: ActivityPub::Adapter ).as_json @delete_actor_json = Oj.dump(ActivityPub::LinkedDataSignature.new(payload).sign!(@account)) end end