Fetch statuses/following/followers numbers from ActivityPub collections (#4840)
This commit is contained in:
parent
7c2d84910c
commit
a4caa7eb62
|
@ -8,11 +8,12 @@ class ActivityPub::ProcessAccountService < BaseService
|
||||||
def call(username, domain, json)
|
def call(username, domain, json)
|
||||||
return if json['inbox'].blank?
|
return if json['inbox'].blank?
|
||||||
|
|
||||||
@json = json
|
@json = json
|
||||||
@uri = @json['id']
|
@uri = @json['id']
|
||||||
@username = username
|
@username = username
|
||||||
@domain = domain
|
@domain = domain
|
||||||
@account = Account.find_by(uri: @uri)
|
@account = Account.find_by(uri: @uri)
|
||||||
|
@collections = {}
|
||||||
|
|
||||||
create_account if @account.nil?
|
create_account if @account.nil?
|
||||||
upgrade_account if @account.ostatus?
|
upgrade_account if @account.ostatus?
|
||||||
|
@ -51,6 +52,9 @@ class ActivityPub::ProcessAccountService < BaseService
|
||||||
@account.header_remote_url = image_url('image')
|
@account.header_remote_url = image_url('image')
|
||||||
@account.public_key = public_key || ''
|
@account.public_key = public_key || ''
|
||||||
@account.locked = @json['manuallyApprovesFollowers'] || false
|
@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!
|
@account.save!
|
||||||
end
|
end
|
||||||
|
|
||||||
|
@ -88,6 +92,29 @@ class ActivityPub::ProcessAccountService < BaseService
|
||||||
value['href']
|
value['href']
|
||||||
end
|
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?
|
def auto_suspend?
|
||||||
domain_block && domain_block.suspend?
|
domain_block && domain_block.suspend?
|
||||||
end
|
end
|
||||||
|
|
|
@ -2,12 +2,16 @@ require 'rails_helper'
|
||||||
|
|
||||||
RSpec.describe ActivityPub::Activity::Update do
|
RSpec.describe ActivityPub::Activity::Update do
|
||||||
let!(:sender) { Fabricate(:account) }
|
let!(:sender) { Fabricate(:account) }
|
||||||
|
|
||||||
before do
|
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))
|
sender.update!(uri: ActivityPub::TagManager.instance.uri_for(sender))
|
||||||
end
|
end
|
||||||
|
|
||||||
let(:modified_sender) do
|
let(:modified_sender) do
|
||||||
sender.dup.tap do |modified_sender|
|
sender.dup.tap do |modified_sender|
|
||||||
modified_sender.display_name = 'Totally modified now'
|
modified_sender.display_name = 'Totally modified now'
|
||||||
end
|
end
|
||||||
|
|
|
@ -41,7 +41,7 @@ RSpec.describe ActivityPub::FetchRemoteAccountService do
|
||||||
|
|
||||||
before do
|
before do
|
||||||
actor[:inbox] = nil
|
actor[:inbox] = nil
|
||||||
|
|
||||||
stub_request(:get, 'https://example.com/alice').to_return(body: Oj.dump(actor))
|
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' })
|
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
|
end
|
||||||
|
|
Reference in a new issue