diff options
Diffstat (limited to 'app/workers')
-rw-r--r-- | app/workers/filter_feeds_worker.rb | 46 |
1 files changed, 46 insertions, 0 deletions
diff --git a/app/workers/filter_feeds_worker.rb b/app/workers/filter_feeds_worker.rb new file mode 100644 index 000000000..ced9e707b --- /dev/null +++ b/app/workers/filter_feeds_worker.rb @@ -0,0 +1,46 @@ +# frozen_string_literal: true + +class FilterFeedsWorker + include Sidekiq::Worker + include FilterHelper + + def perform(account_id) + @account = Account.find(account_id) + + statuses = HomeFeed.new(@account).all + filtered_statuses(statuses).each do |status| + FeedManager.instance.unpush_from_home(@account, status) + end + + @account.lists.find_each do |list| + statuses = ListFeed.new(list).all + filtered_statuses(statuses).each do |status| + FeedManager.instance.unpush_from_list(list, status) + end + end + rescue ActiveRecord::RecordNotFound + true + end + + private + + def filtered_statuses(statuses) + account_ids = statuses.map(&:account_id).uniq + domains = statuses.map(&:account_domain).compact.uniq + relations = relations_map_for_account(@account, account_ids, domains) + + statuses.select { |status| StatusFilter.new(status, @account, relations).filtered? } + end + + def relations_map_for_account(account, account_ids, domains) + return {} if account.nil? + + { + blocking: Account.blocking_map(account_ids, account.id), + blocked_by: Account.blocked_by_map(account_ids, account.id), + muting: Account.muting_map(account_ids, account.id), + following: Account.following_map(account_ids, account.id), + domain_blocking_by_domain: Account.domain_blocking_map_by_domain(domains, account.id), + } + end +end |