master
1class User
2 include Queryable
3 scope :artists, ->{ includes(:avatar).where('creations_count > 0') }
4 scope :search_by, ->(query) { query.blank? ? all : where('upper(users.name) LIKE :query OR upper(users.email) LIKE :query', query: "#{query.upcase}%") }
5 scope :oldest, ->{ order(created_at: :asc) }
6 scope :newest, ->{ order(created_at: :desc) }
7 scope :by_cakes, ->{ order(creations_count: :desc) }
8
9 class Repository < SimpleDelegator
10 def initialize(connection = User)
11 @connection = connection
12 super(connection)
13 end
14
15 def ordered
16 connection.order(creations_count: :desc)
17 end
18
19 def search_with(params)
20 filter_by(search_filters_for(params))
21 end
22
23 private
24
25 attr_reader :connection
26
27 def search_filters_for(params)
28 query_builder_for(params) do |builder|
29 builder.if_present(:artists) do |relation, _|
30 relation.artists
31 end
32 builder.if_present(:q) do |relation, search_term|
33 relation.search_by(search_term)
34 end
35 builder.if_present(:sort) do |relation, direction|
36 case direction.try(:downcase)
37 when 'oldest'
38 relation.oldest
39 when 'newest'
40 relation.newest
41 else
42 relation.by_cakes
43 end
44 end
45 builder.if_missing(:sort) do |relation, direction|
46 relation.order(creations_count: :desc)
47 end
48 end
49 end
50 end
51end