summaryrefslogtreecommitdiff
path: root/app/models/user/repository.rb
blob: 60c5cbf707d59505e53a9b4ad8d9270cb0c0283e (plain)
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
class User
  include Queryable
  scope :artists, ->{ includes(:avatar).where('creations_count > 0') }
  scope :search_by, ->(query) { query.blank? ? all : where('upper(users.name) LIKE :query OR upper(users.email) LIKE :query', query: "#{query.upcase}%") }
  scope :oldest, ->{ order(created_at: :asc) }
  scope :newest, ->{ order(created_at: :desc) }
  scope :by_cakes, ->{ order(creations_count: :desc) }

  class Repository < SimpleDelegator
    def initialize(connection = User)
      @connection = connection
      super(connection)
    end

    def ordered
      connection.order(creations_count: :desc)
    end

    def search_with(params)
      filter_by(search_filters_for(params))
    end

    private

    attr_reader :connection

    def search_filters_for(params)
      query_builder_for(params) do |builder|
        builder.if_present(:artists) do |relation, _|
          relation.artists
        end
        builder.if_present(:q) do |relation, search_term|
          relation.search_by(search_term)
        end
        builder.if_present(:sort) do |relation, direction|
          case direction.try(:downcase)
          when 'oldest'
            relation.oldest
          when 'newest'
            relation.newest
          else
            relation.by_cakes
          end
        end
        builder.if_missing(:sort) do |relation, direction|
          relation.order(creations_count: :desc)
        end
      end
    end
  end
end