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.

39 lines
787 B

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