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