From 17cecd75cadfd9914ffc233de01d41204ef7802c Mon Sep 17 00:00:00 2001 From: Akihiko Odaki Date: Mon, 22 Jan 2018 22:24:22 +0900 Subject: Rename FetchRemoteResourceService to ResolveURLService (#6328) The service used to be named FetchRemoteResourceService resolves local URL as well. --- app/services/fetch_remote_resource_service.rb | 90 ---------------------- app/services/resolve_url_service.rb | 90 ++++++++++++++++++++++ app/services/search_service.rb | 14 ++-- .../services/fetch_remote_resource_service_spec.rb | 53 ------------- spec/services/resolve_url_service_spec.rb | 53 +++++++++++++ spec/services/search_service_spec.rb | 6 +- 6 files changed, 153 insertions(+), 153 deletions(-) delete mode 100644 app/services/fetch_remote_resource_service.rb create mode 100644 app/services/resolve_url_service.rb delete mode 100644 spec/services/fetch_remote_resource_service_spec.rb create mode 100644 spec/services/resolve_url_service_spec.rb diff --git a/app/services/fetch_remote_resource_service.rb b/app/services/fetch_remote_resource_service.rb deleted file mode 100644 index 6d40796f2..000000000 --- a/app/services/fetch_remote_resource_service.rb +++ /dev/null @@ -1,90 +0,0 @@ -# frozen_string_literal: true - -class FetchRemoteResourceService < 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 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 diff --git a/app/services/search_service.rb b/app/services/search_service.rb index 85ad94463..5f763b8f7 100644 --- a/app/services/search_service.rb +++ b/app/services/search_service.rb @@ -8,7 +8,7 @@ class SearchService < BaseService default_results.tap do |results| if url_query? - results.merge!(remote_resource_results) unless remote_resource.nil? + results.merge!(url_resource_results) unless url_resource.nil? elsif query.present? results[:accounts] = AccountSearchService.new.call(query, limit, account, resolve: resolve) results[:hashtags] = Tag.search_for(query.gsub(/\A#/, ''), limit) unless query.start_with?('@') @@ -24,15 +24,15 @@ class SearchService < BaseService query =~ /\Ahttps?:\/\// end - def remote_resource_results - { remote_resource_symbol => [remote_resource] } + def url_resource_results + { url_resource_symbol => [url_resource] } end - def remote_resource - @_remote_resource ||= FetchRemoteResourceService.new.call(query) + def url_resource + @_url_resource ||= ResolveURLService.new.call(query) end - def remote_resource_symbol - remote_resource.class.name.downcase.pluralize.to_sym + def url_resource_symbol + url_resource.class.name.downcase.pluralize.to_sym end end diff --git a/spec/services/fetch_remote_resource_service_spec.rb b/spec/services/fetch_remote_resource_service_spec.rb deleted file mode 100644 index b80fb2475..000000000 --- a/spec/services/fetch_remote_resource_service_spec.rb +++ /dev/null @@ -1,53 +0,0 @@ -# frozen_string_literal: true - -require 'rails_helper' - -describe FetchRemoteResourceService do - subject { described_class.new } - - describe '#call' do - it 'returns nil when there is no atom url' do - url = 'http://example.com/missing-atom' - service = double - allow(FetchAtomService).to receive(:new).and_return service - allow(service).to receive(:call).with(url).and_return(nil) - - result = subject.call(url) - expect(result).to be_nil - end - - it 'fetches remote accounts for feed types' do - url = 'http://example.com/atom-feed' - service = double - allow(FetchAtomService).to receive(:new).and_return service - feed_url = 'http://feed-url' - feed_content = 'contents' - allow(service).to receive(:call).with(url).and_return([feed_url, { prefetched_body: feed_content }]) - - account_service = double - allow(FetchRemoteAccountService).to receive(:new).and_return(account_service) - allow(account_service).to receive(:call) - - _result = subject.call(url) - - expect(account_service).to have_received(:call).with(feed_url, feed_content, nil) - end - - it 'fetches remote statuses for entry types' do - url = 'http://example.com/atom-entry' - service = double - allow(FetchAtomService).to receive(:new).and_return service - feed_url = 'http://feed-url' - feed_content = 'contents' - allow(service).to receive(:call).with(url).and_return([feed_url, { prefetched_body: feed_content }]) - - account_service = double - allow(FetchRemoteStatusService).to receive(:new).and_return(account_service) - allow(account_service).to receive(:call) - - _result = subject.call(url) - - expect(account_service).to have_received(:call).with(feed_url, feed_content, nil) - end - end -end diff --git a/spec/services/resolve_url_service_spec.rb b/spec/services/resolve_url_service_spec.rb new file mode 100644 index 000000000..1e9be4c07 --- /dev/null +++ b/spec/services/resolve_url_service_spec.rb @@ -0,0 +1,53 @@ +# frozen_string_literal: true + +require 'rails_helper' + +describe ResolveURLService do + subject { described_class.new } + + describe '#call' do + it 'returns nil when there is no atom url' do + url = 'http://example.com/missing-atom' + service = double + allow(FetchAtomService).to receive(:new).and_return service + allow(service).to receive(:call).with(url).and_return(nil) + + result = subject.call(url) + expect(result).to be_nil + end + + it 'fetches remote accounts for feed types' do + url = 'http://example.com/atom-feed' + service = double + allow(FetchAtomService).to receive(:new).and_return service + feed_url = 'http://feed-url' + feed_content = 'contents' + allow(service).to receive(:call).with(url).and_return([feed_url, { prefetched_body: feed_content }]) + + account_service = double + allow(FetchRemoteAccountService).to receive(:new).and_return(account_service) + allow(account_service).to receive(:call) + + _result = subject.call(url) + + expect(account_service).to have_received(:call).with(feed_url, feed_content, nil) + end + + it 'fetches remote statuses for entry types' do + url = 'http://example.com/atom-entry' + service = double + allow(FetchAtomService).to receive(:new).and_return service + feed_url = 'http://feed-url' + feed_content = 'contents' + allow(service).to receive(:call).with(url).and_return([feed_url, { prefetched_body: feed_content }]) + + account_service = double + allow(FetchRemoteStatusService).to receive(:new).and_return(account_service) + allow(account_service).to receive(:call) + + _result = subject.call(url) + + expect(account_service).to have_received(:call).with(feed_url, feed_content, nil) + end + end +end diff --git a/spec/services/search_service_spec.rb b/spec/services/search_service_spec.rb index 3ffcc389b..957b60c7d 100644 --- a/spec/services/search_service_spec.rb +++ b/spec/services/search_service_spec.rb @@ -26,7 +26,7 @@ describe SearchService do context 'that does not find anything' do it 'returns the empty results' do service = double(call: nil) - allow(FetchRemoteResourceService).to receive(:new).and_return(service) + allow(ResolveURLService).to receive(:new).and_return(service) results = subject.call(@query, 10) expect(service).to have_received(:call).with(@query) @@ -38,7 +38,7 @@ describe SearchService do it 'includes the account in the results' do account = Account.new service = double(call: account) - allow(FetchRemoteResourceService).to receive(:new).and_return(service) + allow(ResolveURLService).to receive(:new).and_return(service) results = subject.call(@query, 10) expect(service).to have_received(:call).with(@query) @@ -50,7 +50,7 @@ describe SearchService do it 'includes the status in the results' do status = Status.new service = double(call: status) - allow(FetchRemoteResourceService).to receive(:new).and_return(service) + allow(ResolveURLService).to receive(:new).and_return(service) results = subject.call(@query, 10) expect(service).to have_received(:call).with(@query) -- cgit