preview_card_filter.rb 966 B

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455
  1. # frozen_string_literal: true
  2. class Trends::PreviewCardFilter
  3. KEYS = %i(
  4. trending
  5. locale
  6. ).freeze
  7. attr_reader :params
  8. def initialize(params)
  9. @params = params
  10. end
  11. def results
  12. scope = initial_scope
  13. params.each do |key, value|
  14. next if %w(page).include?(key.to_s)
  15. scope.merge!(scope_for(key, value.to_s.strip)) if value.present?
  16. end
  17. scope
  18. end
  19. private
  20. def initial_scope
  21. PreviewCard.select(PreviewCard.arel_table[Arel.star])
  22. .joins(:trend)
  23. .eager_load(:trend)
  24. .reorder(score: :desc)
  25. end
  26. def scope_for(key, value)
  27. case key.to_s
  28. when 'trending'
  29. trending_scope(value)
  30. when 'locale'
  31. PreviewCardTrend.where(language: value)
  32. else
  33. raise "Unknown filter: #{key}"
  34. end
  35. end
  36. def trending_scope(value)
  37. case value
  38. when 'allowed'
  39. PreviewCardTrend.allowed
  40. else
  41. PreviewCardTrend.all
  42. end
  43. end
  44. end