Commit 8a880a3d authored by Eugen Rochko's avatar Eugen Rochko

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
parent 326c75b3
......@@ -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 }
......
# 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
......@@ -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
......@@ -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
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment