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