Add shared statuses to the database

master
Eugen Rochko 9 years ago
parent fa7868675d
commit 8da8387afe
  1. 4
      app/helpers/application_helper.rb
  2. 16
      app/services/fetch_entry_service.rb
  3. 42
      app/services/process_feed_service.rb

@ -10,6 +10,10 @@ module ApplicationHelper
return match[1] unless match.nil? return match[1] unless match.nil?
end end
def local_id?(id)
id.start_with?("tag:#{LOCAL_DOMAIN}")
end
def subscription_url(account) def subscription_url(account)
add_base_url_prefix subscriptions_path(id: account.id, format: '') add_base_url_prefix subscriptions_path(id: account.id, format: '')
end end

@ -1,16 +0,0 @@
class FetchEntryService < BaseService
# Knowing nothing but the URL of a remote status, create a local representation of it and return it
# @param [String] url Atom URL
# @return [Status]
def call(url)
body = http_client.get(url)
xml = Nokogiri::XML(body)
# todo
end
private
def http_client
HTTP
end
end

@ -32,12 +32,17 @@ class ProcessFeedService < BaseService
def add_reblog!(entry, status) def add_reblog!(entry, status)
status.reblog = find_original_status(entry, target_id(entry)) status.reblog = find_original_status(entry, target_id(entry))
if status.reblog.nil?
status.reblog = fetch_remote_status(entry)
end
status.save! unless status.reblog.nil? status.save! unless status.reblog.nil?
end end
def add_reply!(entry, status) def add_reply!(entry, status)
status.thread = find_original_status(entry, thread_id(entry)) status.thread = find_original_status(entry, thread_id(entry))
status.save! unless status.thread.nil? status.save!
end end
def find_original_status(xml, id) def find_original_status(xml, id)
@ -46,23 +51,22 @@ class ProcessFeedService < BaseService
if local_id?(id) if local_id?(id)
Status.find(unique_tag_to_local_id(id, 'Status')) Status.find(unique_tag_to_local_id(id, 'Status'))
else else
status = Status.find_by(uri: id) Status.find_by(uri: id)
if status.nil?
status = fetch_remote_status(xml, id)
end
status
end end
end end
def fetch_remote_status(xml, id) def fetch_remote_status(xml)
url = xml.at_xpath('./link[@rel="self"]').attribute('href').value username = xml.at_xpath('./activity:object/xmlns:author/xmlns:name').content
nil url = xml.at_xpath('./activity:object/xmlns:author/xmlns:uri').content
end domain = Addressable::URI.parse(url).host
account = Account.find_by(username: username, domain: domain)
if account.nil?
account = follow_remote_account_service.("acct:#{username}@#{domain}", false)
return nil if account.nil?
end
def local_id?(id) Status.new(account: account, uri: target_id(xml), text: target_content(xml), url: target_url(xml))
id.start_with?("tag:#{LOCAL_DOMAIN}")
end end
def published(xml) def published(xml)
@ -84,7 +88,7 @@ class ProcessFeedService < BaseService
end end
def target_id(xml) def target_id(xml)
xml.at_xpath('./activity:object/xmlns:id').content xml.at_xpath('.//activity:object/xmlns:id').content
rescue rescue
nil nil
end end
@ -93,6 +97,14 @@ class ProcessFeedService < BaseService
entry.at_xpath('./xmlns:id').content entry.at_xpath('./xmlns:id').content
end end
def target_content(xml)
xml.at_xpath('.//activity:object/xmlns:content').content
end
def target_url(xml)
xml.at_xpath('.//activity:object/xmlns:link[@rel=alternate]').attribute('href').value
end
def object_type(xml) def object_type(xml)
xml.at_xpath('./activity:object-type').content.gsub('http://activitystrea.ms/schema/1.0/', '').to_sym xml.at_xpath('./activity:object-type').content.gsub('http://activitystrea.ms/schema/1.0/', '').to_sym
rescue rescue

Loading…
Cancel
Save