croods 0.3.0 → 0.3.5

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: abd8dafdfb10c2b936a894dcb6da1057c6bfe3646f6e6d5af0f58d59d0be7bab
4
- data.tar.gz: 8da5a9b8c82bacefae7d736610d7ba4e0e3305ecf832a602dd61cff0edc1b53c
3
+ metadata.gz: '05196570cc7a53898c790d3ab24038629f2e8a909df92fb9642b0c95d6f7ab14'
4
+ data.tar.gz: beecd504fcdb6cc2b824b6403e873b5b8dc6c0993717cec6ed2fcec50f25b6d2
5
5
  SHA512:
6
- metadata.gz: deac1ff6c8763d738b8ccd20149632df9be2425690a1550d57172e3a922a1b685f484d848f39fa5f3a8a29b3bd596c4c8c27e6f7356dbd4d56d40ff0abf879a2
7
- data.tar.gz: 7a7342dba26327dc7e1422b26adf56b08747a20a3062d1c1090b941c6d3cf4030f2953975fceb770fb1127cc15097e7398ee35ec0ca017c1a4a6b18ba3a78a4a
6
+ metadata.gz: 9a0c38196bcef7a198497d7fab1254f3e5e2924dd3a411d1016745dbcd828c000ecbb47f04324d33f2d4b4e20b893ea28f83d312c7aa792e09dcf36f784a6cd3
7
+ data.tar.gz: afdfc76c66c79e6f9c7e49ab9f21582f377a89e4c024f7e715af380e620fe08f6a5c9c259288c4a38f8be9de6a0534c78574cf1319d47231e798b4a12870812d
data/lib/croods.rb CHANGED
@@ -6,11 +6,14 @@ require 'devise'
6
6
  require 'devise_token_auth'
7
7
  require 'kaminari'
8
8
  require 'api-pagination'
9
+ require 'pg_search'
9
10
  require 'pundit'
10
11
  require 'schema_associations'
11
12
  require 'schema_auto_foreign_keys'
12
13
  require 'schema_validations'
13
14
 
15
+ load 'pg_search/tasks.rb'
16
+
14
17
  module Croods
15
18
  cattr_accessor :namespaces, :json_schema, :multi_tenancy_by
16
19
 
@@ -9,15 +9,58 @@ module Croods
9
9
  params[resource.page_attribute_name]
10
10
  end
11
11
 
12
+ def search_param
13
+ params[resource.search_attribute_name]
14
+ end
15
+
12
16
  def paginate_collection(list)
13
17
  paginate(list.send(resource.page_method_name, page_param))
14
18
  end
15
19
 
16
- def collection
17
- list = resource
18
- .apply_filters(policy_scope(model), params)
19
- .order(resource.sort_by)
20
+ def search_collection(list)
21
+ return list unless search_param.present?
22
+
23
+ if resource.search_block.present?
24
+ list.instance_exec(search_param, &resource.search_block)
25
+ else
26
+ list.public_send resource.search_method_name, search_param
27
+ end
28
+ end
29
+
30
+ def order_by
31
+ params[:order_by].presence
32
+ end
20
33
 
34
+ def order
35
+ params[:order].presence
36
+ end
37
+
38
+ # rubocop:disable Metrics/AbcSize
39
+ def sort_by_method(list)
40
+ if order_by && order
41
+ list.public_send(resource.sort_by, order_by, order)
42
+ elsif order_by
43
+ list.public_send(resource.sort_by, order_by)
44
+ elsif order
45
+ list.public_send(resource.sort_by, order)
46
+ else
47
+ list.public_send(resource.sort_by)
48
+ end
49
+ end
50
+ # rubocop:enable Metrics/AbcSize
51
+
52
+ def sort(list)
53
+ if resource.sort_by_method?
54
+ sort_by_method(list)
55
+ else
56
+ list.order(resource.sort_by)
57
+ end
58
+ end
59
+
60
+ def collection
61
+ list = resource.apply_filters(policy_scope(model), params)
62
+ list = search_collection(list) unless resource.skip_search?
63
+ list = sort(list)
21
64
  list = paginate_collection(list) if page_param.present?
22
65
 
23
66
  list
@@ -14,6 +14,7 @@ require_relative 'resource/authorization'
14
14
  require_relative 'resource/filters'
15
15
  require_relative 'resource/pagination'
16
16
  require_relative 'resource/sorting'
17
+ require_relative 'resource/search'
17
18
  require_relative 'resource/services'
18
19
 
19
20
  module Croods
@@ -35,6 +36,7 @@ module Croods
35
36
  include Filters
36
37
  include Pagination
37
38
  include Sorting
39
+ include Search
38
40
  include Services
39
41
  end
40
42
  end
@@ -43,6 +43,10 @@ module Croods
43
43
  merged_attributes(self, model.columns_hash)
44
44
  end
45
45
 
46
+ def attribute_names
47
+ attributes.map { |key, _| key }
48
+ end
49
+
46
50
  def definitions
47
51
  attributes
48
52
  .merge(request_instance.additional_attributes)
@@ -36,7 +36,10 @@ module Croods
36
36
  def properties(resource)
37
37
  properties = {}
38
38
 
39
- resource.pagination_params.each do |attribute|
39
+ params = resource.pagination_params + resource.order_params +
40
+ resource.search_params
41
+
42
+ params.each do |attribute|
40
43
  properties[attribute.name] = definition(attribute)
41
44
  end
42
45
 
@@ -17,9 +17,20 @@ module Croods
17
17
  model_name.constantize
18
18
  end
19
19
 
20
+ def configure_search
21
+ return unless table_exists?
22
+
23
+ model.send(:include, PgSearch::Model)
24
+ model.send(:pg_search_scope,
25
+ search_method_name,
26
+ search_options)
27
+ end
28
+
20
29
  def create_model!
21
30
  Object.const_set(model_name, Class.new(Croods::Model))
22
31
 
32
+ configure_search unless model.resource.skip_search?
33
+
23
34
  model_blocks.each do |block|
24
35
  model.instance_eval(&block)
25
36
  end
@@ -0,0 +1,65 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Croods
4
+ module Resource
5
+ module Search
6
+ def search_attribute
7
+ return if skip_search?
8
+
9
+ @search_attribute ||= Croods::Attribute.new(
10
+ 'query', :string, null: true
11
+ )
12
+ end
13
+
14
+ def search_params
15
+ return [] if skip_search?
16
+
17
+ @search_params ||= [search_attribute]
18
+ end
19
+
20
+ def search_attribute_name
21
+ return if skip_search?
22
+
23
+ @search_attribute.name
24
+ end
25
+
26
+ def search_method_name
27
+ @search_method_name ||= :search
28
+ end
29
+
30
+ def default_search_options
31
+ searchable = []
32
+
33
+ attributes.each do |key, value|
34
+ searchable << key if value.type.in? %i[string text]
35
+ end
36
+
37
+ {
38
+ against: searchable
39
+ }
40
+ end
41
+
42
+ def search_options
43
+ @search_options ||= default_search_options
44
+ end
45
+
46
+ def search_block
47
+ @search_block
48
+ end
49
+
50
+ def skip_search?
51
+ @skip_search
52
+ end
53
+
54
+ def skip_search
55
+ @skip_search ||= true
56
+ end
57
+
58
+ def search_by(name, options = {}, &block)
59
+ @search_method_name = name
60
+ @search_options = options
61
+ @search_block = block
62
+ end
63
+ end
64
+ end
65
+ end
@@ -3,10 +3,31 @@
3
3
  module Croods
4
4
  module Resource
5
5
  module Sorting
6
- def sort_by(attribute = nil)
7
- return @sort_by ||= :created_at unless attribute
6
+ def order_by_attribute
7
+ @order_by_attribute ||= Croods::Attribute.new(
8
+ 'order_by', :string, null: true
9
+ )
10
+ end
11
+
12
+ def order_attribute
13
+ @order_attribute ||= Croods::Attribute.new(
14
+ 'order', :string, null: true
15
+ )
16
+ end
17
+
18
+ def order_params
19
+ @order_params ||= [order_by_attribute, order_attribute]
20
+ end
21
+
22
+ def sort_by_method?
23
+ sort_by.is_a?(Symbol) && !sort_by.to_s.in?(attribute_names) &&
24
+ model.respond_to?(sort_by)
25
+ end
26
+
27
+ def sort_by(sort = nil)
28
+ return @sort_by ||= :created_at unless sort
8
29
 
9
- @sort_by = attribute
30
+ @sort_by ||= sort
10
31
  end
11
32
  end
12
33
  end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Croods
4
- VERSION = '0.3.0'
4
+ VERSION = '0.3.5'
5
5
  end
metadata CHANGED
@@ -1,29 +1,29 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: croods
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.3.0
4
+ version: 0.3.5
5
5
  platform: ruby
6
6
  authors:
7
7
  - Daniel Weinmann
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2020-10-13 00:00:00.000000000 Z
11
+ date: 2021-05-18 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: api-pagination
15
15
  requirement: !ruby/object:Gem::Requirement
16
16
  requirements:
17
- - - ">="
17
+ - - '='
18
18
  - !ruby/object:Gem::Version
19
- version: '0'
19
+ version: 4.8.2
20
20
  type: :runtime
21
21
  prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
- - - ">="
24
+ - - '='
25
25
  - !ruby/object:Gem::Version
26
- version: '0'
26
+ version: 4.8.2
27
27
  - !ruby/object:Gem::Dependency
28
28
  name: committee
29
29
  requirement: !ruby/object:Gem::Requirement
@@ -56,16 +56,30 @@ dependencies:
56
56
  name: kaminari
57
57
  requirement: !ruby/object:Gem::Requirement
58
58
  requirements:
59
- - - ">="
59
+ - - '='
60
60
  - !ruby/object:Gem::Version
61
- version: '0'
61
+ version: 1.2.1
62
62
  type: :runtime
63
63
  prerelease: false
64
64
  version_requirements: !ruby/object:Gem::Requirement
65
65
  requirements:
66
- - - ">="
66
+ - - '='
67
67
  - !ruby/object:Gem::Version
68
- version: '0'
68
+ version: 1.2.1
69
+ - !ruby/object:Gem::Dependency
70
+ name: pg_search
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - '='
74
+ - !ruby/object:Gem::Version
75
+ version: 2.3.4
76
+ type: :runtime
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - '='
81
+ - !ruby/object:Gem::Version
82
+ version: 2.3.4
69
83
  - !ruby/object:Gem::Dependency
70
84
  name: pundit
71
85
  requirement: !ruby/object:Gem::Requirement
@@ -86,14 +100,14 @@ dependencies:
86
100
  requirements:
87
101
  - - '='
88
102
  - !ruby/object:Gem::Version
89
- version: 5.2.4.3
103
+ version: 5.2.6
90
104
  type: :runtime
91
105
  prerelease: false
92
106
  version_requirements: !ruby/object:Gem::Requirement
93
107
  requirements:
94
108
  - - '='
95
109
  - !ruby/object:Gem::Version
96
- version: 5.2.4.3
110
+ version: 5.2.6
97
111
  - !ruby/object:Gem::Dependency
98
112
  name: schema_associations
99
113
  requirement: !ruby/object:Gem::Requirement
@@ -327,6 +341,7 @@ files:
327
341
  - lib/croods/resource/pagination.rb
328
342
  - lib/croods/resource/paths.rb
329
343
  - lib/croods/resource/policy.rb
344
+ - lib/croods/resource/search.rb
330
345
  - lib/croods/resource/services.rb
331
346
  - lib/croods/resource/sorting.rb
332
347
  - lib/croods/routes.rb