croods 0.3.0 → 0.3.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
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