about summary refs log tree commit diff
path: root/app/services/defederate_account_serivice.rb
diff options
context:
space:
mode:
Diffstat (limited to 'app/services/defederate_account_serivice.rb')
-rw-r--r--app/services/defederate_account_serivice.rb38
1 files changed, 38 insertions, 0 deletions
diff --git a/app/services/defederate_account_serivice.rb b/app/services/defederate_account_serivice.rb
new file mode 100644
index 000000000..5d9cc1597
--- /dev/null
+++ b/app/services/defederate_account_serivice.rb
@@ -0,0 +1,38 @@
+# frozen_string_literal: true
+
+class DefederateAccountService < BaseService
+  include Payloadable
+
+  def call(account, domains)
+    @account = account
+    @domains = domains
+
+    return if account.blank? || !account.local? || domains.blank?
+
+    distribute_delete_actor!
+  end
+
+  private
+
+  def distribute_delete_actor!
+    ActivityPub::DeliveryWorker.push_bulk(delivery_inboxes) do |inbox_url|
+      [delete_actor_json, @account.id, inbox_url]
+    end
+
+    ActivityPub::LowPriorityDeliveryWorker.push_bulk(low_priority_delivery_inboxes) do |inbox_url|
+      [delete_actor_json, @account.id, inbox_url]
+    end
+  end
+
+  def delete_actor_json
+    @delete_actor_json ||= Oj.dump(serialize_payload(@account, ActivityPub::DeleteActorSerializer, signer: @account))
+  end
+
+  def delivery_inboxes
+    @delivery_inboxes ||= @account.followers.where(domain: @domains).inboxes
+  end
+
+  def low_priority_delivery_inboxes
+    Account.where(domain: @domains).inboxes - delivery_inboxes
+  end
+end