forest_liana 1.3.51 → 1.3.52
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/app/controllers/forest_liana/associations_controller.rb +1 -13
- data/app/controllers/forest_liana/resources_controller.rb +12 -8
- data/app/serializers/forest_liana/serializer_factory.rb +8 -4
- data/app/services/forest_liana/has_many_getter.rb +35 -0
- data/app/services/forest_liana/resource_creator.rb +12 -5
- data/app/services/forest_liana/resource_getter.rb +7 -1
- data/app/services/forest_liana/resource_updater.rb +12 -5
- data/app/services/forest_liana/resources_getter.rb +46 -10
- data/app/services/forest_liana/schema_utils.rb +6 -1
- data/app/services/forest_liana/search_query_builder.rb +10 -8
- data/lib/forest_liana/version.rb +1 -1
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 49ce2bea2aeb0b45516ad7e84e4879369ea12880
|
4
|
+
data.tar.gz: 37c94be3fcd9c8ebdde55f76a10938106807a577
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 6f867e92adf3495795418ab5fff10236b1f15e08545967a555a6582792c6f58723fd86264d4e6117bc7662e05febe32d291f51463cf40ca2f9c3e262883c3948
|
7
|
+
data.tar.gz: 7b55764e1282a53dfc3d850cd0187b266af72389d5eb1abdc447306c217cd1a39e8c0d525e4e9c7ee948b4f5a5cf9509cdcb61838f8305f9f2a2ed5a8b122b3b
|
@@ -13,7 +13,7 @@ module ForestLiana
|
|
13
13
|
getter.perform
|
14
14
|
|
15
15
|
render serializer: nil, json: serialize_models(getter.records,
|
16
|
-
include: includes,
|
16
|
+
include: getter.includes,
|
17
17
|
count: getter.count,
|
18
18
|
params: params)
|
19
19
|
end
|
@@ -65,17 +65,5 @@ module ForestLiana
|
|
65
65
|
def resource_params
|
66
66
|
ResourceDeserializer.new(@resource, params[:resource], true).perform
|
67
67
|
end
|
68
|
-
|
69
|
-
def includes
|
70
|
-
@association.klass
|
71
|
-
.reflect_on_all_associations
|
72
|
-
.select do |a|
|
73
|
-
SchemaUtils.model_included?(a.klass) &&
|
74
|
-
[:belongs_to, :has_and_belongs_to_many].include?(a.macro) &&
|
75
|
-
!a.options[:polymorphic]
|
76
|
-
end
|
77
|
-
.map {|a| a.name.to_s }
|
78
|
-
end
|
79
|
-
|
80
68
|
end
|
81
69
|
end
|
@@ -16,7 +16,7 @@ module ForestLiana
|
|
16
16
|
getter.perform
|
17
17
|
|
18
18
|
render serializer: nil, json: serialize_models(getter.records,
|
19
|
-
include: includes,
|
19
|
+
include: includes(getter),
|
20
20
|
count: getter.count,
|
21
21
|
params: params)
|
22
22
|
end
|
@@ -26,14 +26,17 @@ module ForestLiana
|
|
26
26
|
getter.perform
|
27
27
|
|
28
28
|
render serializer: nil, json:
|
29
|
-
serialize_model(getter.record, include: includes)
|
29
|
+
serialize_model(getter.record, include: includes(getter))
|
30
30
|
end
|
31
31
|
|
32
32
|
def create
|
33
33
|
creator = ResourceCreator.new(@resource, params)
|
34
34
|
creator.perform
|
35
35
|
|
36
|
-
if creator.
|
36
|
+
if creator.errors
|
37
|
+
render serializer: nil, json: JSONAPI::Serializer.serialize_errors(
|
38
|
+
creator.errors), status: 400
|
39
|
+
elsif creator.record.valid?
|
37
40
|
render serializer: nil,
|
38
41
|
json: serialize_model(creator.record, include: includes)
|
39
42
|
else
|
@@ -46,7 +49,10 @@ module ForestLiana
|
|
46
49
|
updater = ResourceUpdater.new(@resource, params)
|
47
50
|
updater.perform
|
48
51
|
|
49
|
-
if updater.
|
52
|
+
if updater.errors
|
53
|
+
render serializer: nil, json: JSONAPI::Serializer.serialize_errors(
|
54
|
+
updater.errors), status: 400
|
55
|
+
elsif updater.record.valid?
|
50
56
|
render serializer: nil,
|
51
57
|
json: serialize_model(updater.record, include: includes)
|
52
58
|
else
|
@@ -76,10 +82,8 @@ module ForestLiana
|
|
76
82
|
ResourceDeserializer.new(@resource, params[:resource], true).perform
|
77
83
|
end
|
78
84
|
|
79
|
-
def includes
|
80
|
-
|
81
|
-
.select { |a| SchemaUtils.model_included?(a.klass) }
|
82
|
-
.map { |a| a.name.to_s }
|
85
|
+
def includes(getter)
|
86
|
+
getter.includes.map(&:to_s)
|
83
87
|
end
|
84
88
|
end
|
85
89
|
end
|
@@ -108,10 +108,14 @@ module ForestLiana
|
|
108
108
|
|
109
109
|
if ret[:href].blank?
|
110
110
|
begin
|
111
|
-
|
111
|
+
if @options[:include].try(:include?, attribute_name.to_s)
|
112
|
+
object.send(attribute_name)
|
113
|
+
end
|
112
114
|
|
113
|
-
|
114
|
-
|
115
|
+
SchemaUtils.many_associations(object.class).each do |a|
|
116
|
+
if a.name == attribute_name
|
117
|
+
ret[:href] = "/forest/#{object.class.table_name}/#{object.id}/relationships/#{attribute_name}"
|
118
|
+
end
|
115
119
|
end
|
116
120
|
rescue TypeError, ActiveRecord::StatementInvalid, NoMethodError
|
117
121
|
puts "Cannot load the association #{attribute_name} on #{object.class.name} #{object.id}."
|
@@ -186,7 +190,7 @@ module ForestLiana
|
|
186
190
|
serializer.send(serializer_association(a), a.name) {
|
187
191
|
if [:has_one, :belongs_to].include?(a.macro)
|
188
192
|
begin
|
189
|
-
object.send(a.name)
|
193
|
+
object.send(a.name)
|
190
194
|
rescue ActiveRecord::RecordNotFound
|
191
195
|
nil
|
192
196
|
end
|
@@ -4,6 +4,13 @@ module ForestLiana
|
|
4
4
|
@resource = resource
|
5
5
|
@association = association
|
6
6
|
@params = params
|
7
|
+
@field_names_requested = field_names_requested
|
8
|
+
end
|
9
|
+
|
10
|
+
def field_names_requested
|
11
|
+
return nil unless @params[:fields] && @params[:fields][@association.table_name]
|
12
|
+
@params[:fields][@association.table_name].split(',')
|
13
|
+
.map { |name| name.to_sym }
|
7
14
|
end
|
8
15
|
|
9
16
|
def perform
|
@@ -11,6 +18,8 @@ module ForestLiana
|
|
11
18
|
.unscoped
|
12
19
|
.find(@params[:id])
|
13
20
|
.send(@params[:association_name])
|
21
|
+
.select(select)
|
22
|
+
.eager_load(includes)
|
14
23
|
@records = sort_query
|
15
24
|
end
|
16
25
|
|
@@ -18,12 +27,38 @@ module ForestLiana
|
|
18
27
|
@records.limit(limit).offset(offset)
|
19
28
|
end
|
20
29
|
|
30
|
+
def includes
|
31
|
+
@association.klass
|
32
|
+
.reflect_on_all_associations
|
33
|
+
.select do |association|
|
34
|
+
inclusion = SchemaUtils.model_included?(association.klass) &&
|
35
|
+
[:belongs_to, :has_and_belongs_to_many].include?(association.macro) &&
|
36
|
+
!association.options[:polymorphic]
|
37
|
+
|
38
|
+
if @field_names_requested
|
39
|
+
inclusion && @field_names_requested.include?(association.name)
|
40
|
+
else
|
41
|
+
inclusion
|
42
|
+
end
|
43
|
+
end
|
44
|
+
.map { |association| association.name.to_s }
|
45
|
+
end
|
46
|
+
|
21
47
|
def count
|
22
48
|
@records.to_a.length
|
23
49
|
end
|
24
50
|
|
25
51
|
private
|
26
52
|
|
53
|
+
def select
|
54
|
+
column_names = @association.klass.column_names.map { |name| name.to_sym }
|
55
|
+
if @field_names_requested
|
56
|
+
column_names & @field_names_requested
|
57
|
+
else
|
58
|
+
column_names
|
59
|
+
end
|
60
|
+
end
|
61
|
+
|
27
62
|
def association_table_name
|
28
63
|
@resource.reflect_on_association(@params[:association_name])
|
29
64
|
.try(:table_name)
|
@@ -1,19 +1,26 @@
|
|
1
1
|
module ForestLiana
|
2
2
|
class ResourceCreator
|
3
3
|
attr_accessor :record
|
4
|
+
attr_accessor :errors
|
4
5
|
|
5
6
|
def initialize(resource, params)
|
6
7
|
@resource = resource
|
7
8
|
@params = params
|
9
|
+
@errors = nil
|
8
10
|
end
|
9
11
|
|
10
12
|
def perform
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
13
|
+
begin
|
14
|
+
if has_strong_parameter
|
15
|
+
@record = @resource.create(resource_params)
|
16
|
+
else
|
17
|
+
@record = @resource.create(resource_params, without_protection: true)
|
18
|
+
end
|
19
|
+
set_has_many_relationships
|
20
|
+
rescue ActiveRecord::StatementInvalid => exception
|
21
|
+
# NOTICE: SQL request cannot be executed properly
|
22
|
+
@errors = [{ detail: exception.cause.error }]
|
15
23
|
end
|
16
|
-
set_has_many_relationships
|
17
24
|
end
|
18
25
|
|
19
26
|
def resource_params
|
@@ -8,7 +8,13 @@ module ForestLiana
|
|
8
8
|
end
|
9
9
|
|
10
10
|
def perform
|
11
|
-
@record = @resource.find(@params[:id])
|
11
|
+
@record = @resource.eager_load(includes).find(@params[:id])
|
12
|
+
end
|
13
|
+
|
14
|
+
def includes
|
15
|
+
SchemaUtils.one_associations(@resource)
|
16
|
+
.select { |association| SchemaUtils.model_included?(association.klass) }
|
17
|
+
.map(&:name)
|
12
18
|
end
|
13
19
|
|
14
20
|
end
|
@@ -1,19 +1,26 @@
|
|
1
1
|
module ForestLiana
|
2
2
|
class ResourceUpdater
|
3
3
|
attr_accessor :record
|
4
|
+
attr_accessor :errors
|
4
5
|
|
5
6
|
def initialize(resource, params)
|
6
7
|
@resource = resource
|
7
8
|
@params = params
|
9
|
+
@errors = nil
|
8
10
|
end
|
9
11
|
|
10
12
|
def perform
|
11
|
-
|
13
|
+
begin
|
14
|
+
@record = @resource.find(@params[:id])
|
12
15
|
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
16
|
+
if has_strong_parameter
|
17
|
+
@record.update_attributes(resource_params)
|
18
|
+
else
|
19
|
+
@record.update_attributes(resource_params, without_protection: true)
|
20
|
+
end
|
21
|
+
rescue ActiveRecord::StatementInvalid => exception
|
22
|
+
# NOTICE: SQL request cannot be executed properly
|
23
|
+
@errors = [{ detail: exception.cause.error }]
|
17
24
|
end
|
18
25
|
end
|
19
26
|
|
@@ -3,6 +3,30 @@ module ForestLiana
|
|
3
3
|
def initialize(resource, params)
|
4
4
|
@resource = resource
|
5
5
|
@params = params
|
6
|
+
@field_names_requested = field_names_requested
|
7
|
+
end
|
8
|
+
|
9
|
+
def field_names_requested
|
10
|
+
return nil unless @params[:fields] && @params[:fields][@resource.table_name]
|
11
|
+
|
12
|
+
associations_for_query = []
|
13
|
+
|
14
|
+
# NOTICE: Populate the necessary associations for filters
|
15
|
+
if @params[:filter]
|
16
|
+
@params[:filter].each do |field, values|
|
17
|
+
if field.include? ':'
|
18
|
+
associations_for_query << field.split(':').first.to_sym
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
if @params[:sort] && @params[:sort].include?('.')
|
24
|
+
associations_for_query << @params[:sort].split('.').first.to_sym
|
25
|
+
end
|
26
|
+
|
27
|
+
field_names = @params[:fields][@resource.table_name].split(',')
|
28
|
+
.map { |name| name.to_sym }
|
29
|
+
field_names | associations_for_query
|
6
30
|
end
|
7
31
|
|
8
32
|
def perform
|
@@ -12,17 +36,29 @@ module ForestLiana
|
|
12
36
|
end
|
13
37
|
|
14
38
|
def records
|
15
|
-
@sorted_records.offset(offset).limit(limit).to_a
|
39
|
+
@sorted_records.select(select).offset(offset).limit(limit).to_a
|
16
40
|
end
|
17
41
|
|
18
42
|
def count
|
19
43
|
@records.count
|
20
44
|
end
|
21
45
|
|
46
|
+
def includes
|
47
|
+
includes = SchemaUtils.one_associations(@resource)
|
48
|
+
.select { |association| SchemaUtils.model_included?(association.klass) }
|
49
|
+
.map(&:name)
|
50
|
+
|
51
|
+
if @field_names_requested
|
52
|
+
includes & @field_names_requested
|
53
|
+
else
|
54
|
+
includes
|
55
|
+
end
|
56
|
+
end
|
57
|
+
|
22
58
|
private
|
23
59
|
|
24
60
|
def search_query
|
25
|
-
SearchQueryBuilder.new(@records, @params).perform
|
61
|
+
SearchQueryBuilder.new(@records, @params, includes).perform
|
26
62
|
end
|
27
63
|
|
28
64
|
def sort_query
|
@@ -31,9 +67,6 @@ module ForestLiana
|
|
31
67
|
order = detect_sort_order(@params[:sort])
|
32
68
|
field.slice!(0) if order == :desc
|
33
69
|
|
34
|
-
ref = field.split('.')[0]
|
35
|
-
@records = @records.includes(ref) if association?(ref)
|
36
|
-
|
37
70
|
field = detect_reference(field)
|
38
71
|
if field.index('.').nil?
|
39
72
|
@records = @records
|
@@ -63,7 +96,7 @@ module ForestLiana
|
|
63
96
|
.find {|a| a.name == ref.to_sym }
|
64
97
|
|
65
98
|
if association
|
66
|
-
"#{association.table_name}
|
99
|
+
"\"#{association.table_name}\".\"#{field}\""
|
67
100
|
else
|
68
101
|
param
|
69
102
|
end
|
@@ -76,10 +109,13 @@ module ForestLiana
|
|
76
109
|
@resource.reflect_on_association(field.to_sym).present?
|
77
110
|
end
|
78
111
|
|
79
|
-
def
|
80
|
-
|
81
|
-
|
82
|
-
|
112
|
+
def select
|
113
|
+
column_names = @resource.column_names.map { |name| name.to_sym }
|
114
|
+
if @field_names_requested
|
115
|
+
column_names & @field_names_requested
|
116
|
+
else
|
117
|
+
column_names
|
118
|
+
end
|
83
119
|
end
|
84
120
|
|
85
121
|
def offset
|
@@ -13,6 +13,12 @@ module ForestLiana
|
|
13
13
|
end
|
14
14
|
end
|
15
15
|
|
16
|
+
def self.many_associations(active_record_class)
|
17
|
+
self.associations(active_record_class).select do |x|
|
18
|
+
[:has_many, :has_and_belongs_to_many].include?(x.macro)
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
16
22
|
def self.find_model_from_table_name(table_name)
|
17
23
|
model = nil
|
18
24
|
|
@@ -66,4 +72,3 @@ module ForestLiana
|
|
66
72
|
end
|
67
73
|
end
|
68
74
|
end
|
69
|
-
|
@@ -1,9 +1,10 @@
|
|
1
1
|
module ForestLiana
|
2
2
|
class SearchQueryBuilder
|
3
3
|
|
4
|
-
def initialize(resource, params)
|
4
|
+
def initialize(resource, params, includes)
|
5
5
|
@resource = @records = resource
|
6
6
|
@params = params
|
7
|
+
@includes = includes
|
7
8
|
end
|
8
9
|
|
9
10
|
def perform
|
@@ -51,15 +52,16 @@ module ForestLiana
|
|
51
52
|
end
|
52
53
|
|
53
54
|
SchemaUtils.one_associations(@resource).map(&:name).each do |association|
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
55
|
+
if @includes.include? association.to_sym
|
56
|
+
resource = @resource.reflect_on_association(association.to_sym)
|
57
|
+
resource.klass.columns.each do |column|
|
58
|
+
if !column.array && (column.type == :string || column.type == :text)
|
59
|
+
conditions <<
|
60
|
+
"LOWER(\"#{resource.table_name}\".\"#{column.name}\") LIKE " +
|
61
|
+
"'%#{@params[:search].downcase}%'"
|
62
|
+
end
|
60
63
|
end
|
61
64
|
end
|
62
|
-
@resource = @resource.eager_load(association.to_sym)
|
63
65
|
end
|
64
66
|
|
65
67
|
@records = @resource.where(conditions.join(' OR '))
|
data/lib/forest_liana/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: forest_liana
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.3.
|
4
|
+
version: 1.3.52
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Sandro Munda
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2016-11-
|
11
|
+
date: 2016-11-04 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rails
|