about summary refs log tree commit diff
path: root/app/services/resolve_url_service.rb
diff options
context:
space:
mode:
authorJenkins <jenkins@jenkins.ninjawedding.org>2018-01-24 19:17:11 +0000
committerJenkins <jenkins@jenkins.ninjawedding.org>2018-01-24 19:17:11 +0000
commit0e10667fbe8b565b05dd2f34c3ee14bed7f36967 (patch)
tree272ee0087b95e4f2dfeb08243bbeb60cc5d8a651 /app/services/resolve_url_service.rb
parent1b4d79acf8a0667b15a6835479d2cae0c2de5612 (diff)
parenta3c0a2037314f105e807f9ede4210066a1524229 (diff)
Merge remote-tracking branch 'tootsuite/master' into glitchsoc/master
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