croods 0.2.10 → 0.3.4

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: 47184f50917d2e0f8d4c16826c1d056b783813bfc6c54a0831bc8fb333155ba8
4
- data.tar.gz: 38f8082f8019604ac318d7308b87c5bf167eb85b2b3c85b1e58795a46e2a4895
3
+ metadata.gz: 80ba62d306db9fbfaaef4c51506e3424a6ee78237fe60a02914d468dcf36a1e7
4
+ data.tar.gz: ddbd60c3e43de63e14a2ea06384429d8d5248b232945fe1f9089c861063ba7a3
5
5
  SHA512:
6
- metadata.gz: 7bac77110662f6d9cbf664c3d59bb02a82f7a486cafc36a1ffa0e392772aff15ef78085b5e5f1f1ff60dd8a3235dba5e6a4c10cabb76ee70ce3364f5a1eaecbe
7
- data.tar.gz: b7f08e87e4e51aa32067b805853f5fef004d4f8bd3b0163f63fec3abb7f797806cadf58da24b28a77709b8fb9b2c988aa7e606764ee702afd03a5aecf968e94a
6
+ metadata.gz: b5b393de7b8eec8efe3e2b7fe3250f768afd5f442324371d27f8f8a3bb54557c0eb707f84c850483292f7a5e062ce3a842ec41f8e2646a914d4e1c095d7d7a6c
7
+ data.tar.gz: 5610da27ba4a5cc4b5b9c73e7a7e955c8f0c363596631f92ac65fd23d96b3f812b026c3bcd967302587283e5b71c5f2b55502e0fd5356eda24f05e4a1778648a
data/lib/croods.rb CHANGED
@@ -4,11 +4,16 @@ require 'rack/cors'
4
4
  require 'committee'
5
5
  require 'devise'
6
6
  require 'devise_token_auth'
7
+ require 'kaminari'
8
+ require 'api-pagination'
9
+ require 'pg_search'
7
10
  require 'pundit'
8
11
  require 'schema_associations'
9
12
  require 'schema_auto_foreign_keys'
10
13
  require 'schema_validations'
11
14
 
15
+ load 'pg_search/tasks.rb'
16
+
12
17
  module Croods
13
18
  cattr_accessor :namespaces, :json_schema, :multi_tenancy_by
14
19
 
@@ -5,10 +5,65 @@ module Croods
5
5
  module Collection
6
6
  protected
7
7
 
8
+ def page_param
9
+ params[resource.page_attribute_name]
10
+ end
11
+
12
+ def search_param
13
+ params[resource.search_attribute_name]
14
+ end
15
+
16
+ def paginate_collection(list)
17
+ paginate(list.send(resource.page_method_name, page_param))
18
+ end
19
+
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
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
+
8
60
  def collection
9
- resource
10
- .apply_filters(policy_scope(model), params)
11
- .order(resource.sort_by)
61
+ list = resource.apply_filters(policy_scope(model), params)
62
+ list = search_collection(list) unless resource.skip_search?
63
+ list = sort(list)
64
+ list = paginate_collection(list) if page_param.present?
65
+
66
+ list
12
67
  end
13
68
  end
14
69
  end
@@ -12,7 +12,9 @@ require_relative 'resource/json_schema'
12
12
  require_relative 'resource/authentication'
13
13
  require_relative 'resource/authorization'
14
14
  require_relative 'resource/filters'
15
+ require_relative 'resource/pagination'
15
16
  require_relative 'resource/sorting'
17
+ require_relative 'resource/search'
16
18
  require_relative 'resource/services'
17
19
 
18
20
  module Croods
@@ -32,7 +34,9 @@ module Croods
32
34
  include Authentication
33
35
  include Authorization
34
36
  include Filters
37
+ include Pagination
35
38
  include Sorting
39
+ include Search
36
40
  include Services
37
41
  end
38
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)
@@ -33,6 +33,19 @@ module Croods
33
33
  filters
34
34
  end
35
35
 
36
+ def properties(resource)
37
+ properties = {}
38
+
39
+ params = resource.pagination_params + resource.order_params +
40
+ resource.search_params
41
+
42
+ params.each do |attribute|
43
+ properties[attribute.name] = definition(attribute)
44
+ end
45
+
46
+ properties.merge(filters(resource))
47
+ end
48
+
36
49
  def definition(attribute)
37
50
  definition = Definition.schema(attribute)
38
51
 
@@ -42,13 +55,16 @@ module Croods
42
55
  end
43
56
 
44
57
  def required(resource)
45
- resource.filters.reject(&:null).map(&:name)
58
+ collection_properties = resource.filters +
59
+ resource.pagination_params
60
+
61
+ collection_properties.reject(&:null).map(&:name)
46
62
  end
47
63
 
48
64
  def schema(resource)
49
65
  {
50
66
  additionalProperties: false,
51
- properties: filters(resource),
67
+ properties: properties(resource),
52
68
  required: required(resource),
53
69
  type: ['object']
54
70
  }
@@ -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,31 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Croods
4
+ module Resource
5
+ module Pagination
6
+ def page_attribute
7
+ @page_attribute ||= Croods::Attribute.new(
8
+ Kaminari.config.param_name, :string, null: true
9
+ )
10
+ end
11
+
12
+ def per_page_attribute
13
+ @per_page_attribute ||= Croods::Attribute.new(
14
+ 'per_page', :string, null: true
15
+ )
16
+ end
17
+
18
+ def pagination_params
19
+ @pagination_params ||= [page_attribute, per_page_attribute]
20
+ end
21
+
22
+ def page_attribute_name
23
+ @page_attribute.name
24
+ end
25
+
26
+ def page_method_name
27
+ @page_method_name ||= Kaminari.config.page_method_name
28
+ end
29
+ end
30
+ end
31
+ 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.2.10'
4
+ VERSION = '0.3.4'
5
5
  end
metadata CHANGED
@@ -1,15 +1,29 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: croods
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.10
4
+ version: 0.3.4
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-07-22 00:00:00.000000000 Z
11
+ date: 2021-04-01 00:00:00.000000000 Z
12
12
  dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: api-pagination
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - '='
18
+ - !ruby/object:Gem::Version
19
+ version: 4.8.2
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - '='
25
+ - !ruby/object:Gem::Version
26
+ version: 4.8.2
13
27
  - !ruby/object:Gem::Dependency
14
28
  name: committee
15
29
  requirement: !ruby/object:Gem::Requirement
@@ -38,6 +52,34 @@ dependencies:
38
52
  - - '='
39
53
  - !ruby/object:Gem::Version
40
54
  version: 1.1.3
55
+ - !ruby/object:Gem::Dependency
56
+ name: kaminari
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - '='
60
+ - !ruby/object:Gem::Version
61
+ version: 1.2.1
62
+ type: :runtime
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - '='
67
+ - !ruby/object:Gem::Version
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
41
83
  - !ruby/object:Gem::Dependency
42
84
  name: pundit
43
85
  requirement: !ruby/object:Gem::Requirement
@@ -58,14 +100,14 @@ dependencies:
58
100
  requirements:
59
101
  - - '='
60
102
  - !ruby/object:Gem::Version
61
- version: 5.2.4.3
103
+ version: 5.2.5
62
104
  type: :runtime
63
105
  prerelease: false
64
106
  version_requirements: !ruby/object:Gem::Requirement
65
107
  requirements:
66
108
  - - '='
67
109
  - !ruby/object:Gem::Version
68
- version: 5.2.4.3
110
+ version: 5.2.5
69
111
  - !ruby/object:Gem::Dependency
70
112
  name: schema_associations
71
113
  requirement: !ruby/object:Gem::Requirement
@@ -296,8 +338,10 @@ files:
296
338
  - lib/croods/resource/json_schema/required.rb
297
339
  - lib/croods/resource/model.rb
298
340
  - lib/croods/resource/names.rb
341
+ - lib/croods/resource/pagination.rb
299
342
  - lib/croods/resource/paths.rb
300
343
  - lib/croods/resource/policy.rb
344
+ - lib/croods/resource/search.rb
301
345
  - lib/croods/resource/services.rb
302
346
  - lib/croods/resource/sorting.rb
303
347
  - lib/croods/routes.rb