You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

45 lines
989 B

  1. # frozen_string_literal: true
  2. class InstanceFilter
  3. KEYS = %i(
  4. limited
  5. by_domain
  6. warning
  7. unavailable
  8. ).freeze
  9. attr_reader :params
  10. def initialize(params)
  11. @params = params
  12. end
  13. def results
  14. scope = Instance.includes(:domain_block, :domain_allow, :unavailable_domain).order(accounts_count: :desc)
  15. params.each do |key, value|
  16. scope.merge!(scope_for(key, value.to_s.strip)) if value.present?
  17. end
  18. scope
  19. end
  20. private
  21. def scope_for(key, value)
  22. case key.to_s
  23. when 'limited'
  24. Instance.joins(:domain_block).reorder(Arel.sql('domain_blocks.id desc'))
  25. when 'allowed'
  26. Instance.joins(:domain_allow).reorder(Arel.sql('domain_allows.id desc'))
  27. when 'by_domain'
  28. Instance.matches_domain(value)
  29. when 'warning'
  30. Instance.where(domain: DeliveryFailureTracker.warning_domains)
  31. when 'unavailable'
  32. Instance.joins(:unavailable_domain)
  33. else
  34. raise "Unknown filter: #{key}"
  35. end
  36. end
  37. end