Class: AdminUserIndexQuery

Inherits:
Object
  • Object
show all
Defined in:
lib/admin_user_index_query.rb

Constant Summary collapse

SORTABLE_MAPPING =
{
  "created" => "created_at",
  "last_emailed" => "COALESCE(last_emailed_at, to_date('1970-01-01', 'YYYY-MM-DD'))",
  "seen" => "COALESCE(last_seen_at, to_date('1970-01-01', 'YYYY-MM-DD'))",
  "username" => "username",
  "email" => "email",
  "trust_level" => "trust_level",
  "days_visited" => "user_stats.days_visited",
  "posts_read" => "user_stats.posts_read_count",
  "topics_viewed" => "user_stats.topics_entered",
  "posts" => "user_stats.post_count",
  "read_time" => "user_stats.time_read",
}

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(params = {}, klass = User, trust_levels = TrustLevel.levels) ⇒ AdminUserIndexQuery

Returns a new instance of AdminUserIndexQuery.



4
5
6
7
8
# File 'lib/admin_user_index_query.rb', line 4

def initialize(params = {}, klass = User, trust_levels = TrustLevel.levels)
  @params = params
  @query = initialize_query_with_order(klass)
  @trust_levels = trust_levels
end

Instance Attribute Details

#paramsObject (readonly)

Returns the value of attribute params.



10
11
12
# File 'lib/admin_user_index_query.rb', line 10

def params
  @params
end

#trust_levelsObject (readonly)

Returns the value of attribute trust_levels.



10
11
12
# File 'lib/admin_user_index_query.rb', line 10

def trust_levels
  @trust_levels
end

Instance Method Details

#append(active_relation) ⇒ Object

this might not be needed in rails 4 ?



123
124
125
# File 'lib/admin_user_index_query.rb', line 123

def append(active_relation)
  @query = active_relation if active_relation
end

#count_usersObject



32
33
34
# File 'lib/admin_user_index_query.rb', line 32

def count_users
  find_users_query.count
end

#filter_by_ipObject



112
113
114
115
116
# File 'lib/admin_user_index_query.rb', line 112

def filter_by_ip
  if params[:ip].present?
    @query.where("ip_address = :ip OR registration_ip_address = :ip", ip: params[:ip].strip)
  end
end

#filter_by_query_classificationObject



72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
# File 'lib/admin_user_index_query.rb', line 72

def filter_by_query_classification
  case params[:query]
  when "staff"
    @query.where("admin or moderator")
  when "admins"
    @query.where(admin: true)
  when "moderators"
    @query.where(moderator: true)
  when "silenced"
    @query.silenced
  when "suspended"
    @query.suspended
  when "pending"
    @query.not_suspended.where(approved: false, active: true)
  when "staged"
    @query.where(staged: true)
  end
end

#filter_by_searchObject



91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
# File 'lib/admin_user_index_query.rb', line 91

def filter_by_search
  if params[:email].present?
    return @query.joins(:primary_email).where("user_emails.email = ?", params[:email].downcase)
  end

  filter = params[:filter]
  if filter.present?
    filter = filter.strip
    if ip =
         begin
           IPAddr.new(filter)
         rescue StandardError
           nil
         end
      @query.where("ip_address <<= :ip OR registration_ip_address <<= :ip", ip: ip.to_cidr_s)
    else
      @query.filter_by_username_or_email(filter)
    end
  end
end

#filter_by_trustObject



65
66
67
68
69
70
# File 'lib/admin_user_index_query.rb', line 65

def filter_by_trust
  levels = trust_levels.map { |key, _| key.to_s }
  if levels.include?(params[:query])
    @query.where("trust_level = ?", trust_levels[params[:query].to_sym])
  end
end

#filter_excludeObject



118
119
120
# File 'lib/admin_user_index_query.rb', line 118

def filter_exclude
  @query.where("users.id != ?", params[:exclude]) if params[:exclude].present?
end

#find_users(limit = 100) ⇒ Object



26
27
28
29
30
# File 'lib/admin_user_index_query.rb', line 26

def find_users(limit = 100)
  page = params[:page].to_i - 1
  page = 0 if page < 0
  find_users_query.limit(limit).offset(page * limit)
end

#find_users_queryObject



127
128
129
130
131
132
133
134
# File 'lib/admin_user_index_query.rb', line 127

def find_users_query
  append filter_by_trust
  append filter_by_query_classification
  append filter_by_ip
  append filter_exclude
  append filter_by_search
  @query
end

#initialize_query_with_order(klass) ⇒ Object



36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
# File 'lib/admin_user_index_query.rb', line 36

def initialize_query_with_order(klass)
  order = []

  custom_order = params[:order]
  custom_direction = params[:asc].present? ? "ASC" : "DESC"
  if custom_order.present? &&
       without_dir = SORTABLE_MAPPING[custom_order.downcase.sub(/ (asc|desc)\z/, "")]
    order << "#{without_dir} #{custom_direction}"
  end

  if !custom_order.present?
    if params[:query] == "active"
      order << "users.last_seen_at DESC NULLS LAST"
    else
      order << "users.created_at DESC"
    end

    order << "users.username"
  end

  query = klass.includes(:totps).order(order.reject(&:blank?).join(","))

  query = query.includes(:user_stat) unless params[:stats].present? && params[:stats] == false

  query = query.joins(:primary_email) if params[:show_emails] == "true"

  query
end