|
@@ -0,0 +1,68 @@
|
|
|
+# frozen_string_literal: true
|
|
|
+
|
|
|
+class AccountSuggestions::SettingSource < AccountSuggestions::Source
|
|
|
+ def key
|
|
|
+ :staff
|
|
|
+ end
|
|
|
+
|
|
|
+ def get(account, skip_account_ids: [], limit: 40)
|
|
|
+ return [] unless setting_enabled?
|
|
|
+
|
|
|
+ as_ordered_suggestions(
|
|
|
+ scope(account).where(setting_to_where_condition).where.not(id: skip_account_ids),
|
|
|
+ usernames_and_domains
|
|
|
+ ).take(limit)
|
|
|
+ end
|
|
|
+
|
|
|
+ def remove(_account, _target_account_id)
|
|
|
+ nil
|
|
|
+ end
|
|
|
+
|
|
|
+ private
|
|
|
+
|
|
|
+ def scope(account)
|
|
|
+ Account.searchable
|
|
|
+ .followable_by(account)
|
|
|
+ .not_excluded_by_account(account)
|
|
|
+ .not_domain_blocked_by_account(account)
|
|
|
+ .where(locked: false)
|
|
|
+ .where.not(id: account.id)
|
|
|
+ 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)|
|
|
|
+ Arel::Nodes::Grouping.new(
|
|
|
+ Account.arel_table[:username].lower.eq(username.downcase).and(
|
|
|
+ Account.arel_table[:domain].lower.eq(domain&.downcase)
|
|
|
+ )
|
|
|
+ )
|
|
|
+ end.reduce(:or)
|
|
|
+ end
|
|
|
+
|
|
|
+ def setting_to_usernames_and_domains
|
|
|
+ setting.split(',').map do |str|
|
|
|
+ username, domain = str.strip.gsub(/\A@/, '').split('@', 2)
|
|
|
+ domain = nil if TagManager.instance.local_domain?(domain)
|
|
|
+
|
|
|
+ next if username.blank?
|
|
|
+
|
|
|
+ [username, domain]
|
|
|
+ end.compact
|
|
|
+ end
|
|
|
+
|
|
|
+ def setting
|
|
|
+ Setting.bootstrap_timeline_accounts
|
|
|
+ end
|
|
|
+
|
|
|
+ def to_ordered_list_key(account)
|
|
|
+ [account.username, account.domain]
|
|
|
+ end
|
|
|
+end
|