about summary refs log tree commit diff
diff options
context:
space:
mode:
authoralpaca-tc <alpaca-tc@alpaca.tc>2017-05-05 06:44:39 +0900
committerEugen Rochko <eugen@zeonfederated.com>2017-05-04 23:44:39 +0200
commit74c8ca699c37ebdb0e3c6f0648f9f90a4f1f8f89 (patch)
tree74e9d9dfb474acd1ec7f74bb42177b8d0b396136
parenteddb95b0126e523faeafbde544ff5df3a64e5b25 (diff)
Delete records in smaller transaction (#2802)
-rw-r--r--app/services/suspend_account_service.rb22
-rw-r--r--spec/fabricators/favourite_fabricator.rb3
-rw-r--r--spec/services/suspend_account_service_spec.rb33
3 files changed, 50 insertions, 8 deletions
diff --git a/app/services/suspend_account_service.rb b/app/services/suspend_account_service.rb
index 66517470e..0cf574ca2 100644
--- a/app/services/suspend_account_service.rb
+++ b/app/services/suspend_account_service.rb
@@ -17,12 +17,16 @@ class SuspendAccountService < BaseService
       RemoveStatusService.new.call(status)
     end
 
-    @account.media_attachments.destroy_all
-    @account.stream_entries.destroy_all
-    @account.notifications.destroy_all
-    @account.favourites.destroy_all
-    @account.active_relationships.destroy_all
-    @account.passive_relationships.destroy_all
+    [
+      @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
@@ -35,6 +39,10 @@ class SuspendAccountService < BaseService
   end
 
   def unsubscribe_push_subscribers
-    @account.subscriptions.destroy_all
+    destroy_all(@account.subscriptions)
+  end
+
+  def destroy_all(association)
+    association.in_batches.destroy_all
   end
 end
diff --git a/spec/fabricators/favourite_fabricator.rb b/spec/fabricators/favourite_fabricator.rb
index e598d3838..464ac8d71 100644
--- a/spec/fabricators/favourite_fabricator.rb
+++ b/spec/fabricators/favourite_fabricator.rb
@@ -1,3 +1,4 @@
 Fabricator(:favourite) do
-
+  account
+  status
 end
diff --git a/spec/services/suspend_account_service_spec.rb b/spec/services/suspend_account_service_spec.rb
new file mode 100644
index 000000000..1cb647e8d
--- /dev/null
+++ b/spec/services/suspend_account_service_spec.rb
@@ -0,0 +1,33 @@
+require 'rails_helper'
+
+RSpec.describe SuspendAccountService do
+  describe '#call' do
+    subject do
+      -> { described_class.new.call(account) }
+    end
+
+    let!(:account) { Fabricate(:account) }
+    let!(:status) { Fabricate(:status, account: account) }
+    let!(:media_attachment) { Fabricate(:media_attachment, account: account) }
+    let!(:notification) { Fabricate(:notification, account: account) }
+    let!(:favourite) { Fabricate(:favourite, account: account) }
+    let!(:active_relationship) { Fabricate(:follow, account: account) }
+    let!(:passive_relationship) { Fabricate(:follow, target_account: account) }
+    let!(:subscription) { Fabricate(:subscription, account: account) }
+
+    it 'deletes associated records' do
+      is_expected.to change {
+        [
+          account.statuses,
+          account.media_attachments,
+          account.stream_entries,
+          account.notifications,
+          account.favourites,
+          account.active_relationships,
+          account.passive_relationships,
+          account.subscriptions
+        ].map(&:count)
+      }.from([1, 1, 1, 1, 1, 1, 1, 1]).to([0, 0, 0, 0, 0, 0, 0, 0])
+    end
+  end
+end