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.

52 lines
953 B

  1. # frozen_string_literal: true
  2. class TagFilter
  3. KEYS = %i(
  4. directory
  5. reviewed
  6. unreviewed
  7. pending_review
  8. popular
  9. active
  10. name
  11. ).freeze
  12. attr_reader :params
  13. def initialize(params)
  14. @params = params
  15. end
  16. def results
  17. scope = Tag.unscoped
  18. params.each do |key, value|
  19. next if key.to_s == 'page'
  20. scope.merge!(scope_for(key, value.to_s.strip)) if value.present?
  21. end
  22. scope.order(id: :desc)
  23. end
  24. private
  25. def scope_for(key, value)
  26. case key.to_s
  27. when 'reviewed'
  28. Tag.reviewed.order(reviewed_at: :desc)
  29. when 'unreviewed'
  30. Tag.unreviewed
  31. when 'pending_review'
  32. Tag.pending_review.order(requested_review_at: :desc)
  33. when 'popular'
  34. Tag.order('max_score DESC NULLS LAST')
  35. when 'active'
  36. Tag.order('last_status_at DESC NULLS LAST')
  37. when 'name'
  38. Tag.matches_name(value)
  39. else
  40. raise "Unknown filter: #{key}"
  41. end
  42. end
  43. end