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