49 lines
		
	
	
		
			1.0 KiB
		
	
	
	
		
			Ruby
		
	
	
	
			
		
		
	
	
			49 lines
		
	
	
		
			1.0 KiB
		
	
	
	
		
			Ruby
		
	
	
	
| # frozen_string_literal: true
 | |
| 
 | |
| class AccountSuggestions::SettingSource < AccountSuggestions::Source
 | |
|   def get(account, limit: DEFAULT_LIMIT)
 | |
|     if setting_enabled?
 | |
|       base_account_scope(account).merge(setting_to_where_condition).limit(limit).pluck(:id).zip([key].cycle)
 | |
|     else
 | |
|       []
 | |
|     end
 | |
|   end
 | |
| 
 | |
|   private
 | |
| 
 | |
|   def key
 | |
|     :featured
 | |
|   end
 | |
| 
 | |
|   def usernames_and_domains
 | |
|     @usernames_and_domains ||= setting_to_usernames_and_domains
 | |
|   end
 | |
| 
 | |
|   def setting_enabled?
 | |
|     setting.present?
 | |
|   end
 | |
| 
 | |
|   def setting_to_where_condition
 | |
|     usernames_and_domains.map do |(username, domain)|
 | |
|       Account
 | |
|         .with_username(username)
 | |
|         .with_domain(domain)
 | |
|     end.reduce(:or)
 | |
|   end
 | |
| 
 | |
|   def setting_to_usernames_and_domains
 | |
|     setting.split(',').filter_map do |str|
 | |
|       username, domain = str.strip.gsub(/\A@/, '').split('@', 2)
 | |
|       domain           = nil if TagManager.instance.local_domain?(domain)
 | |
| 
 | |
|       next if username.blank?
 | |
| 
 | |
|       [username.downcase, domain&.downcase]
 | |
|     end
 | |
|   end
 | |
| 
 | |
|   def setting
 | |
|     Setting.bootstrap_timeline_accounts
 | |
|   end
 | |
| end
 |