diff options
author | Jenkins <jenkins@jenkins.ninjawedding.org> | 2018-01-24 19:17:11 +0000 |
---|---|---|
committer | Jenkins <jenkins@jenkins.ninjawedding.org> | 2018-01-24 19:17:11 +0000 |
commit | 0e10667fbe8b565b05dd2f34c3ee14bed7f36967 (patch) | |
tree | 272ee0087b95e4f2dfeb08243bbeb60cc5d8a651 /app/services/resolve_url_service.rb | |
parent | 1b4d79acf8a0667b15a6835479d2cae0c2de5612 (diff) | |
parent | a3c0a2037314f105e807f9ede4210066a1524229 (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.rb | 90 |
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 |