master
 1class Creation
 2  include Queryable
 3  scope :tagged, ->(tag) { tagged_with([tag]).where('photos_count > 0') }
 4  scope :published, ->{ joins(:photos).where(photos: { image_processing: nil }) }
 5  scope :search, ->(query) { where(["UPPER(creations.name) LIKE :query OR UPPER(creations.story) LIKE :query", { query: "%#{query.upcase}%" }]) }
 6  scope :sorted_by, ->(direction) do
 7    order(created_at: "oldest" == direction ? :asc : :desc)
 8  end
 9
10  class Repository < SimpleDelegator
11    def initialize(connection = Creation)
12      @connection = connection
13      super(connection)
14    end
15
16    def tagged(tag)
17      connection.includes([:user, :photos]).tagged(tag)
18    end
19
20    def search(query)
21      connection.includes(:user, :photos).search(query)
22    end
23
24    def search_with(params)
25      filter_by(search_filters_for(params))
26    end
27
28    private
29
30    attr_reader :connection
31
32    def search_filters_for(params)
33      query_builder_for(params) do |builder|
34        builder.always do |relation|
35          relation.published
36        end
37        builder.if_present(:category) do |relation, category|
38          relation.where(category: Category.by_slug(category))
39        end
40        builder.if_present(:q) do |relation, query|
41          relation.search(query)
42        end
43        builder.if_present(:tags) do |relation, tags|
44          relation.tagged(tags.downcase.parameterize)
45        end
46        builder.if_present(:sort) do |relation, sort_order|
47          relation.sorted_by(sort_order)
48        end
49        builder.if_missing(:sort) do |relation, sort_order|
50          relation.sorted_by("newest")
51        end
52      end
53    end
54  end
55end