The code powering m.abunchtell.com https://m.abunchtell.com
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.
 
 
 
 

69 lines
1.5 KiB

  1. # frozen_string_literal: true
  2. class AccountFilter
  3. attr_reader :params
  4. def initialize(params)
  5. @params = params
  6. set_defaults!
  7. end
  8. def results
  9. scope = Account.recent.includes(:user)
  10. params.each do |key, value|
  11. scope.merge!(scope_for(key, value.to_s.strip)) if value.present?
  12. end
  13. scope
  14. end
  15. private
  16. def set_defaults!
  17. params['local'] = '1' if params['remote'].blank?
  18. params['active'] = '1' if params['suspended'].blank? && params['silenced'].blank? && params['pending'].blank?
  19. end
  20. def scope_for(key, value)
  21. case key.to_s
  22. when 'local'
  23. Account.local
  24. when 'remote'
  25. Account.remote
  26. when 'by_domain'
  27. Account.where(domain: value)
  28. when 'active'
  29. Account.without_suspended
  30. when 'pending'
  31. accounts_with_users.merge User.pending
  32. when 'silenced'
  33. Account.silenced
  34. when 'suspended'
  35. Account.suspended
  36. when 'username'
  37. Account.matches_username(value)
  38. when 'display_name'
  39. Account.matches_display_name(value)
  40. when 'email'
  41. accounts_with_users.merge User.matches_email(value)
  42. when 'ip'
  43. valid_ip?(value) ? accounts_with_users.where('users.current_sign_in_ip <<= ?', value) : Account.none
  44. when 'staff'
  45. accounts_with_users.merge User.staff
  46. else
  47. raise "Unknown filter: #{key}"
  48. end
  49. end
  50. def accounts_with_users
  51. Account.joins(:user)
  52. end
  53. def valid_ip?(value)
  54. IPAddr.new(value) && true
  55. rescue IPAddr::InvalidAddressError
  56. false
  57. end
  58. end