forked from joemasilotti/railsdevs.com
-
Notifications
You must be signed in to change notification settings - Fork 0
/
developer_query.rb
168 lines (138 loc) · 4.07 KB
/
developer_query.rb
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
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
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
class DeveloperQuery
include Pagy::Backend
alias_method :build_pagy, :pagy
attr_reader :options
def initialize(options = {})
@options = options
@items_per_page = options.delete(:items_per_page)
@sort = options.delete(:sort)
@specialty_ids = options.delete(:specialty_ids)
@countries = options.delete(:countries)
@utc_offsets = options.delete(:utc_offsets)
@role_types = options.delete(:role_types)
@role_levels = options.delete(:role_levels)
@badges = options.delete(:badges)
@include_not_interested = options.delete(:include_not_interested)
@search_query = options.delete(:search_query)
@user = options.delete(:user)
end
def filters
@filters = {sort:, utc_offsets:, role_types:, role_levels:, include_not_interested:, search_query:, countries:, badges:}
end
def pagy
@pagy ||= query_and_paginate.first
end
def records
@records ||= query_and_paginate.last
end
def featured_records
if pagy.page == 1 && empty_search?
@featured_records ||= Developer.featured
else
Developer.none
end
end
def sort
@sort.to_s.downcase.to_sym == :newest ? :newest : :freshest
end
def countries
@countries.to_a.reject(&:blank?)
end
def specialty_ids
@specialty_ids.to_a.reject(&:blank?)
end
def utc_offsets
@utc_offsets.to_a.reject(&:blank?).map(&:to_f)
end
def role_types
@role_types.to_a.reject(&:blank?).map(&:to_sym)
end
def role_levels
@role_levels.to_a.reject(&:blank?).map(&:to_sym)
end
def badges
@badges.to_a.reject(&:blank?).map(&:to_sym)
end
def search_query
@search_query.to_s.strip
end
def include_not_interested
ActiveModel::Type::Boolean.new.cast(@include_not_interested)
end
private
def query_and_paginate
@_records = Developer.includes(:role_type, :specialties).with_attached_avatar.visible
sort_records
country_filter_records
utc_offset_filter_records
role_type_filter_records
role_level_filter_records
search_status_filter_records
search_query_filter_records
badges_filter_records
specialty_filter_records
@pagy, @records = build_pagy(@_records, items: items_per_page)
end
def items_per_page
@items_per_page || Pagy::DEFAULT[:items]
end
def empty_search?
utc_offsets.empty? &&
role_types.empty? &&
role_levels.empty? &&
search_query.blank? &&
countries.blank? &&
badges.blank? &&
specialty_ids.empty? &&
!include_not_interested
end
def badges_filter_records
badges.each do |badge|
if badge == :high_response_rate
@_records.merge!(Developer.high_response_rate)
elsif badge == :source_contributor
@_records.merge!(Developer.source_contributor)
elsif badge == :recently_added
@_records.merge!(Developer.recently_added)
elsif badge == :recently_updated
@_records.merge!(Developer.recently_updated)
end
end
end
def specialty_filter_records
if specialty_ids.any?
@_records.merge!(Developer.with_specialty_ids(specialty_ids))
end
end
def sort_records
if sort == :freshest
@_records.merge!(Developer.recently_updated_first)
else
@_records.merge!(Developer.newest_first)
end
end
def country_filter_records
@_records.merge!(Developer.filter_by_countries(countries)) if countries.any?
end
def utc_offset_filter_records
if utc_offsets.any?
@_records.merge!(Developer.filter_by_utc_offsets(utc_offsets))
end
end
def role_type_filter_records
@_records.merge!(Developer.filter_by_role_types(role_types)) if role_types.any?
end
def role_level_filter_records
@_records.merge!(Developer.filter_by_role_levels(role_levels)) if role_levels.any?
end
def search_status_filter_records
@_records.merge!(Developer.actively_looking.or(Developer.open)) unless include_not_interested
end
def search_query_filter_records
@_records.merge!(Developer.filter_by_search_query(search_query)) unless search_query.empty?
end
# Needed for #pagy (aliased to #build_pagy) helper.
def params
options
end
end