account_filter.rb 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120
  1. # frozen_string_literal: true
  2. class AccountFilter
  3. KEYS = %i(
  4. origin
  5. status
  6. role_ids
  7. username
  8. by_domain
  9. display_name
  10. email
  11. ip
  12. invited_by
  13. order
  14. ).freeze
  15. attr_reader :params
  16. def initialize(params)
  17. @params = params
  18. end
  19. def results
  20. scope = Account.includes(:account_stat, user: [:ips, :invite_request]).without_instance_actor.reorder(nil)
  21. params.each do |key, value|
  22. next if key.to_s == 'page'
  23. scope.merge!(scope_for(key, value)) if value.present?
  24. end
  25. scope
  26. end
  27. private
  28. def scope_for(key, value)
  29. case key.to_s
  30. when 'origin'
  31. origin_scope(value)
  32. when 'role_ids'
  33. role_scope(value)
  34. when 'status'
  35. status_scope(value)
  36. when 'by_domain'
  37. Account.where(domain: value.to_s)
  38. when 'username'
  39. Account.matches_username(value.to_s)
  40. when 'display_name'
  41. Account.matches_display_name(value.to_s)
  42. when 'email'
  43. accounts_with_users.merge(User.matches_email(value.to_s))
  44. when 'ip'
  45. valid_ip?(value) ? accounts_with_users.merge(User.matches_ip(value).group('users.id, accounts.id')) : Account.none
  46. when 'invited_by'
  47. invited_by_scope(value)
  48. when 'order'
  49. order_scope(value)
  50. else
  51. raise "Unknown filter: #{key}"
  52. end
  53. end
  54. def origin_scope(value)
  55. case value.to_s
  56. when 'local'
  57. Account.local
  58. when 'remote'
  59. Account.remote
  60. else
  61. raise "Unknown origin: #{value}"
  62. end
  63. end
  64. def status_scope(value)
  65. case value.to_s
  66. when 'active'
  67. Account.without_suspended
  68. when 'pending'
  69. accounts_with_users.merge(User.pending)
  70. when 'suspended'
  71. Account.suspended
  72. when 'disabled'
  73. accounts_with_users.merge(User.disabled)
  74. when 'silenced'
  75. Account.silenced
  76. else
  77. raise "Unknown status: #{value}"
  78. end
  79. end
  80. def order_scope(value)
  81. case value.to_s
  82. when 'active'
  83. accounts_with_users.left_joins(:account_stat).order(Arel.sql('coalesce(users.current_sign_in_at, account_stats.last_status_at, to_timestamp(0)) desc, accounts.id desc'))
  84. when 'recent'
  85. Account.recent
  86. else
  87. raise "Unknown order: #{value}"
  88. end
  89. end
  90. def invited_by_scope(value)
  91. Account.left_joins(user: :invite).merge(Invite.where(user_id: value.to_s))
  92. end
  93. def role_scope(value)
  94. accounts_with_users.merge(User.where(role_id: Array(value).map(&:to_s)))
  95. end
  96. def accounts_with_users
  97. Account.left_joins(:user)
  98. end
  99. def valid_ip?(value)
  100. IPAddr.new(value.to_s) && true
  101. rescue IPAddr::InvalidAddressError
  102. false
  103. end
  104. end