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.

102 lines
2.2 KiB

  1. # frozen_string_literal: true
  2. class AccountFilter
  3. KEYS = %i(
  4. local
  5. remote
  6. by_domain
  7. active
  8. pending
  9. silenced
  10. suspended
  11. username
  12. display_name
  13. email
  14. ip
  15. staff
  16. order
  17. ).freeze
  18. attr_reader :params
  19. def initialize(params)
  20. @params = params
  21. set_defaults!
  22. end
  23. def results
  24. scope = Account.includes(:user).reorder(nil)
  25. params.each do |key, value|
  26. scope.merge!(scope_for(key, value.to_s.strip)) if value.present?
  27. end
  28. scope
  29. end
  30. private
  31. def set_defaults!
  32. params['local'] = '1' if params['remote'].blank?
  33. params['active'] = '1' if params['suspended'].blank? && params['silenced'].blank? && params['pending'].blank?
  34. params['order'] = 'recent' if params['order'].blank?
  35. end
  36. def scope_for(key, value)
  37. case key.to_s
  38. when 'local'
  39. Account.local.without_instance_actor
  40. when 'remote'
  41. Account.remote
  42. when 'by_domain'
  43. Account.where(domain: value)
  44. when 'active'
  45. Account.without_suspended
  46. when 'pending'
  47. accounts_with_users.merge(User.pending)
  48. when 'disabled'
  49. accounts_with_users.merge(User.disabled)
  50. when 'silenced'
  51. Account.silenced
  52. when 'suspended'
  53. Account.suspended
  54. when 'username'
  55. Account.matches_username(value)
  56. when 'display_name'
  57. Account.matches_display_name(value)
  58. when 'email'
  59. accounts_with_users.merge(User.matches_email(value))
  60. when 'ip'
  61. valid_ip?(value) ? accounts_with_users.merge(User.matches_ip(value)) : Account.none
  62. when 'staff'
  63. accounts_with_users.merge(User.staff)
  64. when 'order'
  65. order_scope(value)
  66. else
  67. raise "Unknown filter: #{key}"
  68. end
  69. end
  70. def order_scope(value)
  71. case value
  72. when 'active'
  73. params['remote'] ? Account.joins(:account_stat).by_recent_status : Account.joins(:user).by_recent_sign_in
  74. when 'recent'
  75. Account.recent
  76. when 'alphabetic'
  77. Account.alphabetic
  78. else
  79. raise "Unknown order: #{value}"
  80. end
  81. end
  82. def accounts_with_users
  83. Account.joins(:user)
  84. end
  85. def valid_ip?(value)
  86. IPAddr.new(value) && true
  87. rescue IPAddr::InvalidAddressError
  88. false
  89. end
  90. end