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 +4 -4
- data/lib/croods.rb +3 -0
- data/lib/croods/controller/collection.rb +47 -4
- data/lib/croods/resource.rb +2 -0
- data/lib/croods/resource/attributes.rb +4 -0
- data/lib/croods/resource/json_schema/links/collection.rb +4 -1
- data/lib/croods/resource/model.rb +11 -0
- data/lib/croods/resource/search.rb +65 -0
- data/lib/croods/resource/sorting.rb +24 -3
- data/lib/croods/version.rb +1 -1
- metadata +27 -12
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: '05196570cc7a53898c790d3ab24038629f2e8a909df92fb9642b0c95d6f7ab14'
|
4
|
+
data.tar.gz: beecd504fcdb6cc2b824b6403e873b5b8dc6c0993717cec6ed2fcec50f25b6d2
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
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
|
17
|
-
list
|
18
|
-
|
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
|
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
|
data/lib/croods/resource.rb
CHANGED
@@ -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
|
@@ -36,7 +36,10 @@ module Croods
|
|
36
36
|
def properties(resource)
|
37
37
|
properties = {}
|
38
38
|
|
39
|
-
resource.pagination_params.
|
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
|
7
|
-
|
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
|
30
|
+
@sort_by ||= sort
|
10
31
|
end
|
11
32
|
end
|
12
33
|
end
|
data/lib/croods/version.rb
CHANGED
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.
|
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:
|
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:
|
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:
|
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:
|
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:
|
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.
|
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.
|
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
|