croods 0.2.9 → 0.3.3

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: c48ff1f8f4575752544cd790c77fe2c9b3ad1986ce56198d4ff552e701043d3b
4
- data.tar.gz: fe604e9c23a6bbb90890d7056d7c835ae33ac6dad8c63db1151d121f60b13c4a
3
+ metadata.gz: 9b91328083ded875d3426c54dc559f88244325ef94b858e9f5c3f7e023074e3e
4
+ data.tar.gz: 19c5a896ecd8b90656cbd5a8ce13404e8d97fdcd464ced2635cc54ec440e1b79
5
5
  SHA512:
6
- metadata.gz: bab3bfec3298e879dd7d7f1c10c2d65b9b40e51ba5af0d42937d9c8687daf847ceb1004d561dc0faa7ad45fb86296324c992a48a342e906cd3316710f4dd6416
7
- data.tar.gz: ba23108357cd2bd5de0969c605db9262f363a4231a9aa9b70e17a47373e427d5ae3af454577e6e67f6b42cb129ff25d27ba682be02111c2931a299e93d529b52
6
+ metadata.gz: 3bd8d3bb1ad81a579b28117a9b438db8183e618840f238870ac8cf775138da8a066418dfe2e71085ad6f9c2495cb2de7b62e733c3508df57e568094114dbb8e0
7
+ data.tar.gz: 737e22753cc7354b386ebcbf74096a87f212d23c06871dd1054236b76464560e99ab6d77e02cdd3bcad69cc58e9fbab86d868d2a3a2ac14706727237753532d6
@@ -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)
@@ -8,10 +8,23 @@ module Croods
8
8
 
9
9
  on = [on] if on&.is_a?(Symbol)
10
10
 
11
- actions.each do |action|
12
- next if on && !on.include?(action.name)
11
+ authorization_roles << { roles: roles, on: on }
12
+ end
13
+
14
+ def authorization_roles
15
+ @authorization_roles ||= []
16
+ end
17
+
18
+ def apply_authorization_roles!
19
+ authorization_roles.each do |authorization|
20
+ (actions + additional_actions).each do |action|
21
+ on = authorization[:on]
22
+ roles = authorization[:roles]
23
+
24
+ next if on && !on.include?(action.name)
13
25
 
14
- action.roles = roles
26
+ action.roles = roles
27
+ end
15
28
  end
16
29
  end
17
30
 
@@ -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
@@ -10,6 +10,7 @@ module ActionDispatch
10
10
  resource.create_model!
11
11
  resource.create_policy!
12
12
  resource.create_controller!
13
+ resource.apply_authorization_roles!
13
14
  create_resource_routes!(resource)
14
15
  end
15
16
 
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Croods
4
- VERSION = '0.2.9'
4
+ VERSION = '0.3.3'
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.9
4
+ version: 0.3.3
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-06-26 00:00:00.000000000 Z
11
+ date: 2020-10-27 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.4.4
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.4.4
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