about summary refs log tree commit diff
diff options
context:
space:
mode:
authorEugen Rochko <eugen@zeonfederated.com>2017-01-24 21:40:41 +0100
committerEugen Rochko <eugen@zeonfederated.com>2017-01-24 21:40:41 +0100
commit8a880a3d464daf486a10d85b8ee49305aa6b1e5b (patch)
treecc143c4fc9b5e5fd359c2ae51a78ab78297ca627
parent326c75b35b826aa9e807fe7d1972ade41d789663 (diff)
Make blocks create entries and unfollows instantly, but do the clean up
in the background instead. Should fix delay where blocked person
can interact with blocker for a short time before background job
gets processed
-rw-r--r--app/controllers/api/v1/accounts_controller.rb2
-rw-r--r--app/services/after_block_service.rb31
-rw-r--r--app/services/block_service.rb27
-rw-r--r--app/workers/block_worker.rb2
4 files changed, 34 insertions, 28 deletions
diff --git a/app/controllers/api/v1/accounts_controller.rb b/app/controllers/api/v1/accounts_controller.rb
index a43619193..d97010c0e 100644
--- a/app/controllers/api/v1/accounts_controller.rb
+++ b/app/controllers/api/v1/accounts_controller.rb
@@ -65,7 +65,7 @@ class Api::V1::AccountsController < ApiController
   end
 
   def block
-    BlockWorker.perform_async(current_user.account_id, @account.id)
+    BlockService.new.call(current_user.account, @account)
 
     @following   = { @account.id => false }
     @followed_by = { @account.id => false }
diff --git a/app/services/after_block_service.rb b/app/services/after_block_service.rb
new file mode 100644
index 000000000..8c6197f2c
--- /dev/null
+++ b/app/services/after_block_service.rb
@@ -0,0 +1,31 @@
+# frozen_string_literal: true
+
+class AfterBlockService < BaseService
+  def call(account, target_account)
+    clear_timelines(account, target_account)
+    clear_notifications(account, target_account)
+  end
+
+  private
+
+  def clear_timelines(account, target_account)
+    mentions_key = FeedManager.instance.key(:mentions, account.id)
+    home_key     = FeedManager.instance.key(:home, account.id)
+
+    target_account.statuses.select('id').find_each do |status|
+      redis.zrem(mentions_key, status.id)
+      redis.zrem(home_key, status.id)
+    end
+  end
+
+  def clear_notifications(account, target_account)
+    Notification.where(account: account).joins(:follow).where(activity_type: 'Follow', follows: { account_id: target_account.id }).destroy_all
+    Notification.where(account: account).joins(mention: :status).where(activity_type: 'Mention', statuses: { account_id: target_account.id }).destroy_all
+    Notification.where(account: account).joins(:favourite).where(activity_type: 'Favourite', favourites: { account_id: target_account.id }).destroy_all
+    Notification.where(account: account).joins(:status).where(activity_type: 'Status', statuses: { account_id: target_account.id }).destroy_all
+  end
+
+  def redis
+    Redis.current
+  end
+end
diff --git a/app/services/block_service.rb b/app/services/block_service.rb
index b08cf8ca8..e04b6cc39 100644
--- a/app/services/block_service.rb
+++ b/app/services/block_service.rb
@@ -9,32 +9,7 @@ class BlockService < BaseService
 
     block = account.block!(target_account)
 
-    clear_timelines(account, target_account)
-    clear_notifications(account, target_account)
-
+    BlockWorker.perform_async(account.id, target_account.id)
     NotificationWorker.perform_async(block.stream_entry.id, target_account.id) unless target_account.local?
   end
-
-  private
-
-  def clear_timelines(account, target_account)
-    mentions_key = FeedManager.instance.key(:mentions, account.id)
-    home_key     = FeedManager.instance.key(:home, account.id)
-
-    target_account.statuses.select('id').find_each do |status|
-      redis.zrem(mentions_key, status.id)
-      redis.zrem(home_key, status.id)
-    end
-  end
-
-  def clear_notifications(account, target_account)
-    Notification.where(account: account).joins(:follow).where(activity_type: 'Follow', follows: { account_id: target_account.id }).destroy_all
-    Notification.where(account: account).joins(mention: :status).where(activity_type: 'Mention', statuses: { account_id: target_account.id }).destroy_all
-    Notification.where(account: account).joins(:favourite).where(activity_type: 'Favourite', favourites: { account_id: target_account.id }).destroy_all
-    Notification.where(account: account).joins(:status).where(activity_type: 'Status', statuses: { account_id: target_account.id }).destroy_all
-  end
-
-  def redis
-    Redis.current
-  end
 end
diff --git a/app/workers/block_worker.rb b/app/workers/block_worker.rb
index dc00db197..0820490d3 100644
--- a/app/workers/block_worker.rb
+++ b/app/workers/block_worker.rb
@@ -4,6 +4,6 @@ class BlockWorker
   include Sidekiq::Worker
 
   def perform(account_id, target_account_id)
-    BlockService.new.call(Account.find(account_id), Account.find(target_account_id))
+    AfterBlockService.new.call(Account.find(account_id), Account.find(target_account_id))
   end
 end