97 lines
		
	
	
		
			2.0 KiB
		
	
	
	
		
			Ruby
		
	
	
	
	
	
			
		
		
	
	
			97 lines
		
	
	
		
			2.0 KiB
		
	
	
	
		
			Ruby
		
	
	
	
	
	
| # frozen_string_literal: true
 | |
| 
 | |
| class AccountSearchService < BaseService
 | |
|   attr_reader :query, :limit, :resolve, :account
 | |
| 
 | |
|   def call(query, limit, resolve = false, account = nil)
 | |
|     @query = query
 | |
|     @limit = limit
 | |
|     @resolve = resolve
 | |
|     @account = account
 | |
| 
 | |
|     search_service_results
 | |
|   end
 | |
| 
 | |
|   private
 | |
| 
 | |
|   def search_service_results
 | |
|     return [] if query_blank_or_hashtag? || limit < 1
 | |
| 
 | |
|     if resolving_non_matching_remote_account?
 | |
|       [ResolveRemoteAccountService.new.call("#{query_username}@#{query_domain}")].compact
 | |
|     else
 | |
|       search_results_and_exact_match.compact.uniq.slice(0, limit)
 | |
|     end
 | |
|   end
 | |
| 
 | |
|   def resolving_non_matching_remote_account?
 | |
|     resolve && !exact_match && !domain_is_local?
 | |
|   end
 | |
| 
 | |
|   def search_results_and_exact_match
 | |
|     exact = [exact_match]
 | |
|     return exact if !exact[0].nil? && limit == 1
 | |
|     exact + search_results.to_a
 | |
|   end
 | |
| 
 | |
|   def query_blank_or_hashtag?
 | |
|     query.blank? || query.start_with?('#')
 | |
|   end
 | |
| 
 | |
|   def split_query_string
 | |
|     @_split_query_string ||= query.gsub(/\A@/, '').split('@')
 | |
|   end
 | |
| 
 | |
|   def query_username
 | |
|     @_query_username ||= split_query_string.first || ''
 | |
|   end
 | |
| 
 | |
|   def query_domain
 | |
|     @_query_domain ||= query_without_split? ? nil : split_query_string.last
 | |
|   end
 | |
| 
 | |
|   def query_without_split?
 | |
|     split_query_string.size == 1
 | |
|   end
 | |
| 
 | |
|   def domain_is_local?
 | |
|     @_domain_is_local ||= TagManager.instance.local_domain?(query_domain)
 | |
|   end
 | |
| 
 | |
|   def exact_match
 | |
|     @_exact_match ||= begin
 | |
|       if domain_is_local?
 | |
|         Account.find_local(query_username)
 | |
|       else
 | |
|         Account.find_remote(query_username, query_domain)
 | |
|       end
 | |
|     end
 | |
|   end
 | |
| 
 | |
|   def search_results
 | |
|     @_search_results ||= begin
 | |
|       if account
 | |
|         advanced_search_results
 | |
|       else
 | |
|         simple_search_results
 | |
|       end
 | |
|     end
 | |
|   end
 | |
| 
 | |
|   def advanced_search_results
 | |
|     Account.advanced_search_for(terms_for_query, account, limit)
 | |
|   end
 | |
| 
 | |
|   def simple_search_results
 | |
|     Account.search_for(terms_for_query, limit)
 | |
|   end
 | |
| 
 | |
|   def terms_for_query
 | |
|     if domain_is_local?
 | |
|       query_username
 | |
|     else
 | |
|       "#{query_username} #{query_domain}"
 | |
|     end
 | |
|   end
 | |
| end
 |