commit: 5442083b3c44c731679fc489568bf7f70a807a39
parent: bafbf63fcca81ae9dce3a40959b8a47e5fcfc6ac
Author: Eugen Rochko <eugen@zeonfederated.com>
Date: Wed, 5 Apr 2017 21:41:50 +0200
Split SalmonWorker into smaller parts, move profile updating into another job
Diffstat:
9 files changed, 39 insertions(+), 25 deletions(-)
diff --git a/app/services/follow_remote_account_service.rb b/app/services/follow_remote_account_service.rb
@@ -45,13 +45,13 @@ class FollowRemoteAccountService < BaseService
account.suspended = true if domain_block && domain_block.suspend?
account.silenced = true if domain_block && domain_block.silence?
- xml = get_feed(account.remote_url)
- hubs = get_hubs(xml)
+ body, xml = get_feed(account.remote_url)
+ hubs = get_hubs(xml)
account.uri = get_account_uri(xml)
account.hub_url = hubs.first.attribute('href').value
- get_profile(xml, account)
+ get_profile(body, account)
account.save!
account
@@ -61,7 +61,7 @@ class FollowRemoteAccountService < BaseService
def get_feed(url)
response = http_client.get(Addressable::URI.parse(url))
- Nokogiri::XML(response)
+ [response.to_s, Nokogiri::XML(response)]
end
def get_hubs(xml)
@@ -82,12 +82,8 @@ class FollowRemoteAccountService < BaseService
author_uri.content
end
- def get_profile(xml, account)
- update_remote_profile_service.call(xml.at_xpath('/xmlns:feed'), account)
- end
-
- def update_remote_profile_service
- @update_remote_profile_service ||= UpdateRemoteProfileService.new
+ def get_profile(body, account)
+ RemoteProfileUpdateWorker.perform_async(account.id, body.force_encoding('UTF-8'), false)
end
def http_client
diff --git a/app/services/process_feed_service.rb b/app/services/process_feed_service.rb
@@ -5,15 +5,15 @@ class ProcessFeedService < BaseService
xml = Nokogiri::XML(body)
xml.encoding = 'utf-8'
- update_author(xml, account)
+ update_author(body, xml, account)
process_entries(xml, account)
end
private
- def update_author(xml, account)
+ def update_author(body, xml, account)
return if xml.at_xpath('/xmlns:feed', xmlns: TagManager::XMLNS).nil?
- UpdateRemoteProfileService.new.call(xml.at_xpath('/xmlns:feed', xmlns: TagManager::XMLNS), account, true)
+ RemoteProfileUpdateWorker.perform_async(account.id, body.force_encoding('UTF-8'), true)
end
def process_entries(xml, account)
diff --git a/app/services/process_interaction_service.rb b/app/services/process_interaction_service.rb
@@ -24,7 +24,7 @@ class ProcessInteractionService < BaseService
return if account.suspended?
if salmon.verify(envelope, account.keypair)
- update_remote_profile_service.call(xml.at_xpath('/xmlns:entry', xmlns: TagManager::XMLNS), account, true)
+ RemoteProfileUpdateWorker.perform_async(account.id, body.force_encoding('UTF-8'), true)
case verb(xml)
when :follow
@@ -114,7 +114,7 @@ class ProcessInteractionService < BaseService
return if status.nil?
- remove_status_service.call(status) if account.id == status.account_id
+ RemovalWorker.perform_async(status.id) if account.id == status.account_id
end
def favourite!(xml, from_account)
@@ -130,7 +130,7 @@ class ProcessInteractionService < BaseService
end
def add_post!(body, account)
- process_feed_service.call(body, account)
+ ProcessingWorker.perform_async(account.id, body.force_encoding('UTF-8'))
end
def status(xml)
@@ -153,10 +153,6 @@ class ProcessInteractionService < BaseService
@process_feed_service ||= ProcessFeedService.new
end
- def update_remote_profile_service
- @update_remote_profile_service ||= UpdateRemoteProfileService.new
- end
-
def remove_status_service
@remove_status_service ||= RemoveStatusService.new
end
diff --git a/app/workers/admin/suspension_worker.rb b/app/workers/admin/suspension_worker.rb
@@ -3,6 +3,8 @@
class Admin::SuspensionWorker
include Sidekiq::Worker
+ sidekiq_options queue: 'pull'
+
def perform(account_id)
SuspendAccountService.new.call(Account.find(account_id))
end
diff --git a/app/workers/application_worker.rb b/app/workers/application_worker.rb
@@ -1,3 +1,5 @@
+# frozen_string_literal: true
+
class ApplicationWorker
def info(message)
Rails.logger.info("#{self.class.name} - #{message}")
diff --git a/app/workers/distribution_worker.rb b/app/workers/distribution_worker.rb
@@ -4,10 +4,7 @@ class DistributionWorker < ApplicationWorker
include Sidekiq::Worker
def perform(status_id)
- status = Status.find(status_id)
-
- FanOutOnWriteService.new.call(status)
- WarmCacheService.new.call(status)
+ FanOutOnWriteService.new.call(Status.find(status_id))
rescue ActiveRecord::RecordNotFound
info("Couldn't find the status")
end
diff --git a/app/workers/remote_profile_update_worker.rb b/app/workers/remote_profile_update_worker.rb
@@ -0,0 +1,20 @@
+# frozen_string_literal: true
+
+class RemoteProfileUpdateWorker
+ include Sidekiq::Worker
+
+ sidekiq_options queue: 'pull'
+
+ def perform(account_id, body, resubscribe)
+ account = Account.find(account_id)
+
+ xml = Nokogiri::XML(body)
+ xml.encoding = 'utf-8'
+
+ author_container = xml.at_xpath('/xmlns:feed', xmlns: TagManager::XMLNS) || xml.at_xpath('/xmlns:entry', xmlns: TagManager::XMLNS)
+
+ UpdateRemoteProfileService.new.call(author_container, account, resubscribe)
+ rescue ActiveRecord::RecordNotFound
+ true
+ end
+end
diff --git a/app/workers/salmon_worker.rb b/app/workers/salmon_worker.rb
@@ -7,7 +7,7 @@ class SalmonWorker
def perform(account_id, body)
ProcessInteractionService.new.call(body, Account.find(account_id))
- rescue ActiveRecord::RecordNotFound
+ rescue Nokogiri::XML::XPath::SyntaxError, ActiveRecord::RecordNotFound
true
end
end
diff --git a/spec/services/process_feed_service_spec.rb b/spec/services/process_feed_service_spec.rb
@@ -16,6 +16,7 @@ RSpec.describe ProcessFeedService do
end
it 'updates remote user\'s account information' do
+ account.reload
expect(account.display_name).to eq '::1'
expect(account).to have_attached_file(:avatar)
end