Change profile updates to be sent to recently-mentioned servers (#24852)
This commit is contained in:
		@@ -6,7 +6,7 @@ class AccountReachFinder
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  def inboxes
 | 
			
		||||
    (followers_inboxes + reporters_inboxes + relay_inboxes).uniq
 | 
			
		||||
    (followers_inboxes + reporters_inboxes + recently_mentioned_inboxes + relay_inboxes).uniq
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  private
 | 
			
		||||
@@ -19,6 +19,13 @@ class AccountReachFinder
 | 
			
		||||
    Account.where(id: @account.targeted_reports.select(:account_id)).inboxes
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  def recently_mentioned_inboxes
 | 
			
		||||
    cutoff_id       = Mastodon::Snowflake.id_at(2.days.ago, with_random: false)
 | 
			
		||||
    recent_statuses = @account.statuses.recent.where(id: cutoff_id...).limit(200)
 | 
			
		||||
 | 
			
		||||
    Account.joins(:mentions).where(mentions: { status: recent_statuses }).inboxes.take(2000)
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  def relay_inboxes
 | 
			
		||||
    Relay.enabled.pluck(:inbox_url)
 | 
			
		||||
  end
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										53
									
								
								spec/lib/account_reach_finder_spec.rb
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										53
									
								
								spec/lib/account_reach_finder_spec.rb
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,53 @@
 | 
			
		||||
# frozen_string_literal: true
 | 
			
		||||
 | 
			
		||||
require 'rails_helper'
 | 
			
		||||
 | 
			
		||||
RSpec.describe AccountReachFinder do
 | 
			
		||||
  let(:account) { Fabricate(:account) }
 | 
			
		||||
 | 
			
		||||
  let(:follower1) { Fabricate(:account, protocol: :activitypub, inbox_url: 'https://example.com/inbox-1') }
 | 
			
		||||
  let(:follower2) { Fabricate(:account, protocol: :activitypub, inbox_url: 'https://example.com/inbox-2') }
 | 
			
		||||
  let(:follower3) { Fabricate(:account, protocol: :activitypub, inbox_url: 'https://foo.bar/users/a/inbox', shared_inbox_url: 'https://foo.bar/inbox') }
 | 
			
		||||
 | 
			
		||||
  let(:mentioned1) { Fabricate(:account, protocol: :activitypub, inbox_url: 'https://foo.bar/users/b/inbox', shared_inbox_url: 'https://foo.bar/inbox') }
 | 
			
		||||
  let(:mentioned2) { Fabricate(:account, protocol: :activitypub, inbox_url: 'https://example.com/inbox-3') }
 | 
			
		||||
  let(:mentioned3) { Fabricate(:account, protocol: :activitypub, inbox_url: 'https://example.com/inbox-4') }
 | 
			
		||||
 | 
			
		||||
  let(:unrelated_account) { Fabricate(:account, protocol: :activitypub, inbox_url: 'https://example.com/unrelated-inbox') }
 | 
			
		||||
 | 
			
		||||
  before do
 | 
			
		||||
    follower1.follow!(account)
 | 
			
		||||
    follower2.follow!(account)
 | 
			
		||||
    follower3.follow!(account)
 | 
			
		||||
 | 
			
		||||
    Fabricate(:status, account: account).tap do |status|
 | 
			
		||||
      status.mentions << Mention.new(account: follower1)
 | 
			
		||||
      status.mentions << Mention.new(account: mentioned1)
 | 
			
		||||
    end
 | 
			
		||||
 | 
			
		||||
    Fabricate(:status, account: account)
 | 
			
		||||
 | 
			
		||||
    Fabricate(:status, account: account).tap do |status|
 | 
			
		||||
      status.mentions << Mention.new(account: mentioned2)
 | 
			
		||||
      status.mentions << Mention.new(account: mentioned3)
 | 
			
		||||
    end
 | 
			
		||||
 | 
			
		||||
    Fabricate(:status).tap do |status|
 | 
			
		||||
      status.mentions << Mention.new(account: unrelated_account)
 | 
			
		||||
    end
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  describe '#inboxes' do
 | 
			
		||||
    it 'includes the preferred inbox URL of followers' do
 | 
			
		||||
      expect(described_class.new(account).inboxes).to include(*[follower1, follower2, follower3].map(&:preferred_inbox_url))
 | 
			
		||||
    end
 | 
			
		||||
 | 
			
		||||
    it 'includes the preferred inbox URL of recently-mentioned accounts' do
 | 
			
		||||
      expect(described_class.new(account).inboxes).to include(*[mentioned1, mentioned2, mentioned3].map(&:preferred_inbox_url))
 | 
			
		||||
    end
 | 
			
		||||
 | 
			
		||||
    it 'does not include the inbox of unrelated users' do
 | 
			
		||||
      expect(described_class.new(account).inboxes).to_not include(unrelated_account.preferred_inbox_url)
 | 
			
		||||
    end
 | 
			
		||||
  end
 | 
			
		||||
end
 | 
			
		||||
		Reference in New Issue
	
	Block a user