Fetch statuses/following/followers numbers from ActivityPub collections (#4840)
This commit is contained in:
		
							parent
							
								
									7c2d84910c
								
							
						
					
					
						commit
						a4caa7eb62
					
				
					 3 changed files with 39 additions and 8 deletions
				
			
		| 
						 | 
				
			
			@ -8,11 +8,12 @@ class ActivityPub::ProcessAccountService < BaseService
 | 
			
		|||
  def call(username, domain, json)
 | 
			
		||||
    return if json['inbox'].blank?
 | 
			
		||||
 | 
			
		||||
    @json     = json
 | 
			
		||||
    @uri      = @json['id']
 | 
			
		||||
    @username = username
 | 
			
		||||
    @domain   = domain
 | 
			
		||||
    @account  = Account.find_by(uri: @uri)
 | 
			
		||||
    @json        = json
 | 
			
		||||
    @uri         = @json['id']
 | 
			
		||||
    @username    = username
 | 
			
		||||
    @domain      = domain
 | 
			
		||||
    @account     = Account.find_by(uri: @uri)
 | 
			
		||||
    @collections = {}
 | 
			
		||||
 | 
			
		||||
    create_account  if @account.nil?
 | 
			
		||||
    upgrade_account if @account.ostatus?
 | 
			
		||||
| 
						 | 
				
			
			@ -51,6 +52,9 @@ class ActivityPub::ProcessAccountService < BaseService
 | 
			
		|||
    @account.header_remote_url   = image_url('image')
 | 
			
		||||
    @account.public_key          = public_key || ''
 | 
			
		||||
    @account.locked              = @json['manuallyApprovesFollowers'] || false
 | 
			
		||||
    @account.statuses_count      = outbox_total_items    if outbox_total_items.present?
 | 
			
		||||
    @account.following_count     = following_total_items if following_total_items.present?
 | 
			
		||||
    @account.followers_count     = followers_total_items if followers_total_items.present?
 | 
			
		||||
    @account.save!
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -88,6 +92,29 @@ class ActivityPub::ProcessAccountService < BaseService
 | 
			
		|||
    value['href']
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  def outbox_total_items
 | 
			
		||||
    collection_total_items('outbox')
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  def following_total_items
 | 
			
		||||
    collection_total_items('following')
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  def followers_total_items
 | 
			
		||||
    collection_total_items('followers')
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  def collection_total_items(type)
 | 
			
		||||
    return if @json[type].blank?
 | 
			
		||||
    return @collections[type] if @collections.key?(type)
 | 
			
		||||
 | 
			
		||||
    collection = fetch_resource(@json[type])
 | 
			
		||||
 | 
			
		||||
    @collections[type] = collection.is_a?(Hash) && collection['totalItems'].present? && collection['totalItems'].is_a?(Numeric) ? collection['totalItems'] : nil
 | 
			
		||||
  rescue HTTP::Error, OpenSSL::SSL::SSLError
 | 
			
		||||
    @collections[type] = nil
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  def auto_suspend?
 | 
			
		||||
    domain_block && domain_block.suspend?
 | 
			
		||||
  end
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -2,12 +2,16 @@ require 'rails_helper'
 | 
			
		|||
 | 
			
		||||
RSpec.describe ActivityPub::Activity::Update do
 | 
			
		||||
  let!(:sender) { Fabricate(:account) }
 | 
			
		||||
  
 | 
			
		||||
 | 
			
		||||
  before do
 | 
			
		||||
    stub_request(:get, actor_json[:outbox]).to_return(status: 404)
 | 
			
		||||
    stub_request(:get, actor_json[:followers]).to_return(status: 404)
 | 
			
		||||
    stub_request(:get, actor_json[:following]).to_return(status: 404)
 | 
			
		||||
 | 
			
		||||
    sender.update!(uri: ActivityPub::TagManager.instance.uri_for(sender))
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  let(:modified_sender) do 
 | 
			
		||||
  let(:modified_sender) do
 | 
			
		||||
    sender.dup.tap do |modified_sender|
 | 
			
		||||
      modified_sender.display_name = 'Totally modified now'
 | 
			
		||||
    end
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -41,7 +41,7 @@ RSpec.describe ActivityPub::FetchRemoteAccountService do
 | 
			
		|||
 | 
			
		||||
      before do
 | 
			
		||||
        actor[:inbox] = nil
 | 
			
		||||
        
 | 
			
		||||
 | 
			
		||||
        stub_request(:get, 'https://example.com/alice').to_return(body: Oj.dump(actor))
 | 
			
		||||
        stub_request(:get, 'https://example.com/.well-known/webfinger?resource=acct:alice@example.com').to_return(body: Oj.dump(webfinger), headers: { 'Content-Type': 'application/jrd+json' })
 | 
			
		||||
      end
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Reference in a new issue