parent
98571b0ce4
commit
05cf086766
@ -0,0 +1,9 @@ |
||||
# frozen_string_literal: true |
||||
|
||||
class Api::V1::SearchController < ApiController |
||||
respond_to :json |
||||
|
||||
def index |
||||
@search = OpenStruct.new(SearchService.new.call(params[:q], 5, params[:resolve] == 'true', current_account)) |
||||
end |
||||
end |
@ -0,0 +1,26 @@ |
||||
# frozen_string_literal: true |
||||
|
||||
class AccountSearchService < BaseService |
||||
def call(query, limit, resolve = false, account = nil) |
||||
return [] if query.blank? || query.start_with?('#') |
||||
|
||||
username, domain = query.gsub(/\A@/, '').split('@') |
||||
domain = nil if TagManager.instance.local_domain?(domain) |
||||
|
||||
if domain.nil? |
||||
exact_match = Account.find_local(username) |
||||
results = account.nil? ? Account.search_for(username, limit) : Account.advanced_search_for(username, account, limit) |
||||
else |
||||
exact_match = Account.find_remote(username, domain) |
||||
results = account.nil? ? Account.search_for("#{username} #{domain}", limit) : Account.advanced_search_for("#{username} #{domain}", account, limit) |
||||
end |
||||
|
||||
results = [exact_match] + results.reject { |a| a.id == exact_match.id } if exact_match |
||||
|
||||
if resolve && !exact_match && !domain.nil? |
||||
results = [FollowRemoteAccountService.new.call("#{username}@#{domain}")] |
||||
end |
||||
|
||||
results |
||||
end |
||||
end |
@ -0,0 +1,18 @@ |
||||
# frozen_string_literal: true |
||||
|
||||
class FetchRemoteResourceService < BaseService |
||||
def call(url) |
||||
atom_url, body = FetchAtomService.new.call(url) |
||||
|
||||
return nil if atom_url.nil? |
||||
|
||||
xml = Nokogiri::XML(body) |
||||
xml.encoding = 'utf-8' |
||||
|
||||
if xml.root.name == 'feed' |
||||
FetchRemoteAccountService.new.call(atom_url) |
||||
elsif xml.root.name == 'entry' |
||||
FetchRemoteStatusService.new.call(atom_url) |
||||
end |
||||
end |
||||
end |
@ -0,0 +1,13 @@ |
||||
object @search |
||||
|
||||
child accounts: :accounts do |
||||
extends 'api/v1/accounts/show' |
||||
end |
||||
|
||||
node(:hashtags) do |search| |
||||
search.hashtags.map(&:name) |
||||
end |
||||
|
||||
child statuses: :statuses do |
||||
extends 'api/v1/statuses/show' |
||||
end |
Loading…
Reference in new issue