instance_filter.rb 1.1 KB

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