Preparing feeds for better filtering
This commit is contained in:
		| @@ -24,6 +24,7 @@ | ||||
|  | ||||
|   &:disabled { | ||||
|     background-color: #9baec8; | ||||
|     cursor: default; | ||||
|   } | ||||
|  | ||||
|   &.button-secondary { | ||||
|   | ||||
| @@ -9,10 +9,12 @@ class FeedManager | ||||
|     "feed:#{type}:#{id}" | ||||
|   end | ||||
|  | ||||
|   # Filter status out of the home feed if it is a reply to someone the user doesn't follow | ||||
|   def filter_status?(status, follower) | ||||
|     replied_to_user = status.reply? ? status.thread.account : nil | ||||
|     (status.reply? && !(follower.id == replied_to_user.id || replied_to_user.id == status.account_id || follower.following?(replied_to_user))) | ||||
|   def filter?(timeline_type, status, receiver) | ||||
|     if timeline_type == :home | ||||
|       filter_from_home?(status, receiver) | ||||
|     else | ||||
|       filter_from_mentions?(status, receiver) | ||||
|     end | ||||
|   end | ||||
|  | ||||
|   def push(timeline_type, account, status) | ||||
| @@ -37,6 +39,16 @@ class FeedManager | ||||
|     $redis | ||||
|   end | ||||
|  | ||||
|   # Filter status out of the home feed if it is a reply to someone the user doesn't follow | ||||
|   def filter_from_home?(status, follower) | ||||
|     replied_to_user = status.reply? ? status.thread.account : nil | ||||
|     (status.reply? && !(follower.id == replied_to_user.id || replied_to_user.id == status.account_id || follower.following?(replied_to_user))) | ||||
|   end | ||||
|  | ||||
|   def filter_from_mentions?(status, follower) | ||||
|     false | ||||
|   end | ||||
|  | ||||
|   def inline_render(target_account, status) | ||||
|     rabl_scope = Class.new do | ||||
|       include RoutingHelper | ||||
|   | ||||
| @@ -15,7 +15,7 @@ class FanOutOnWriteService < BaseService | ||||
|  | ||||
|   def deliver_to_followers(status) | ||||
|     status.account.followers.each do |follower| | ||||
|       next if !follower.local? || FeedManager.instance.filter_status?(status, follower) | ||||
|       next if !follower.local? || FeedManager.instance.filter?(:home, status, follower) | ||||
|       FeedManager.instance.push(:home, follower, status) | ||||
|     end | ||||
|   end | ||||
| @@ -23,7 +23,7 @@ class FanOutOnWriteService < BaseService | ||||
|   def deliver_to_mentioned(status) | ||||
|     status.mentions.each do |mention| | ||||
|       mentioned_account = mention.account | ||||
|       next if !mentioned_account.local? || mentioned_account.id == status.account_id | ||||
|       next if !mentioned_account.local? || mentioned_account.id == status.account_id || FeedManager.instance.filter?(:mentions, status, mentioned_account) | ||||
|       FeedManager.instance.push(:mentions, mentioned_account, status) | ||||
|     end | ||||
|   end | ||||
|   | ||||
| @@ -7,7 +7,7 @@ class PrecomputeFeedService < BaseService | ||||
|     instant_return = [] | ||||
|  | ||||
|     Status.send("as_#{type}_timeline", account).order('created_at desc').limit(FeedManager::MAX_ITEMS).find_each do |status| | ||||
|       next if type == :home && FeedManager.instance.filter_status?(status, account) | ||||
|       next FeedManager.instance.filter?(type, status, account) | ||||
|       redis.zadd(FeedManager.instance.key(type, account.id), status.id, status.id) | ||||
|       instant_return << status unless instant_return.size > limit | ||||
|     end | ||||
|   | ||||
| @@ -9,12 +9,12 @@ RSpec.describe FeedManager do | ||||
|     end | ||||
|   end | ||||
|  | ||||
|   describe '#filter_status?' do | ||||
|   describe '#filter?' do | ||||
|     let(:followee) { Fabricate(:account, username: 'alice') } | ||||
|     let(:status)   { Fabricate(:status, text: 'Hello world', account: followee) } | ||||
|     let(:follower) { Fabricate(:account, username: 'bob') } | ||||
|  | ||||
|     subject { FeedManager.instance.filter_status?(status, follower) } | ||||
|     subject { FeedManager.instance.filter?(:home, status, follower) } | ||||
|  | ||||
|     it 'returns a boolean value' do | ||||
|       expect(subject).to be false | ||||
|   | ||||
		Reference in New Issue
	
	Block a user