diff options
author | Eugen Rochko <eugen@zeonfederated.com> | 2021-04-24 17:01:43 +0200 |
---|---|---|
committer | GitHub <noreply@github.com> | 2021-04-24 17:01:43 +0200 |
commit | daccc07dc170627b17564402296f6c8631d0cd97 (patch) | |
tree | bb1fea8fde8f44b622b9b39cff46026689dc30ca /app/models/account_suggestions/setting_source.rb | |
parent | 863ae47b5145e53c6cc820bd7eff0efd41339e03 (diff) |
Change auto-following admin-selected accounts, show in recommendations (#16078)
Diffstat (limited to 'app/models/account_suggestions/setting_source.rb')
-rw-r--r-- | app/models/account_suggestions/setting_source.rb | 68 |
1 files changed, 68 insertions, 0 deletions
diff --git a/app/models/account_suggestions/setting_source.rb b/app/models/account_suggestions/setting_source.rb new file mode 100644 index 000000000..be9eff233 --- /dev/null +++ b/app/models/account_suggestions/setting_source.rb @@ -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 |