about summary refs log tree commit diff
path: root/app/services/resolve_url_service.rb
diff options
context:
space:
mode:
authorAkihiko Odaki <akihiko.odaki.4i@stu.hosei.ac.jp>2018-01-22 22:24:22 +0900
committerEugen Rochko <eugen@zeonfederated.com>2018-01-22 14:24:22 +0100
commit17cecd75cadfd9914ffc233de01d41204ef7802c (patch)
tree3b8a6532283b18cddc92c48cede5a81246a26983 /app/services/resolve_url_service.rb
parent8cc65cde274055a8c6e89a0de2d8811880d4b55d (diff)
Rename FetchRemoteResourceService to ResolveURLService (#6328)
The service used to be named FetchRemoteResourceService resolves local
URL as well.
Diffstat (limited to 'app/services/resolve_url_service.rb')
-rw-r--r--app/services/resolve_url_service.rb90
1 files changed, 90 insertions, 0 deletions
diff --git a/app/services/resolve_url_service.rb b/app/services/resolve_url_service.rb
new file mode 100644
index 000000000..1f2b24524
--- /dev/null
+++ b/app/services/resolve_url_service.rb
@@ -0,0 +1,90 @@
+# frozen_string_literal: true
+
+class ResolveURLService < BaseService
+  include JsonLdHelper
+
+  attr_reader :url
+
+  def call(url)
+    @url = url
+
+    return process_local_url if local_url?
+
+    process_url unless fetched_atom_feed.nil?
+  end
+
+  private
+
+  def process_url
+    case type
+    when 'Person'
+      FetchRemoteAccountService.new.call(atom_url, body, protocol)
+    when 'Note'
+      FetchRemoteStatusService.new.call(atom_url, body, protocol)
+    end
+  end
+
+  def fetched_atom_feed
+    @_fetched_atom_feed ||= FetchAtomService.new.call(url)
+  end
+
+  def atom_url
+    fetched_atom_feed.first
+  end
+
+  def body
+    fetched_atom_feed.second[:prefetched_body]
+  end
+
+  def protocol
+    fetched_atom_feed.third
+  end
+
+  def type
+    return json_data['type'] if protocol == :activitypub
+
+    case xml_root
+    when 'feed'
+      'Person'
+    when 'entry'
+      'Note'
+    end
+  end
+
+  def json_data
+    @_json_data ||= body_to_json(body)
+  end
+
+  def xml_root
+    xml_data.root.name
+  end
+
+  def xml_data
+    @_xml_data ||= Nokogiri::XML(body, nil, 'utf-8')
+  end
+
+  def local_url?
+    TagManager.instance.local_url?(@url)
+  end
+
+  def process_local_url
+    recognized_params = Rails.application.routes.recognize_path(@url)
+
+    return unless recognized_params[:action] == 'show'
+
+    if recognized_params[:controller] == 'stream_entries'
+      status = StreamEntry.find_by(id: recognized_params[:id])&.status
+      check_local_status(status)
+    elsif recognized_params[:controller] == 'statuses'
+      status = Status.find_by(id: recognized_params[:id])
+      check_local_status(status)
+    elsif recognized_params[:controller] == 'accounts'
+      Account.find_local(recognized_params[:username])
+    end
+  end
+
+  def check_local_status(status)
+    return if status.nil?
+    status if status.public_visibility? || status.unlisted_visibility?
+  end
+end