Add shared statuses to the database
This commit is contained in:
		
							parent
							
								
									fa7868675d
								
							
						
					
					
						commit
						8da8387afe
					
				| @ -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 | ||||||
|  |     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 |     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…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user