forest_admin_datasource_customizer 1.20.0 → 1.21.0
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/forest_admin_datasource_customizer/decorators/rename_collection/rename_collection_datasource_decorator.rb +0 -14
- data/lib/forest_admin_datasource_customizer/decorators/rename_collection/rename_collection_decorator.rb +157 -10
- data/lib/forest_admin_datasource_customizer/version.rb +1 -1
- metadata +1 -1
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: 371670b192f095092ef1197ab3f975a3cc839addf0182a8a8626c4129f3ddafd
|
|
4
|
+
data.tar.gz: 575fcb53daec77edf6c1ac0570a962907d8346d1da3373746e040783030ae85f
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: bab0b35b445bc3ec354da8f0cbfe4b6425328272d9c24ba536ccbb2f2e178e73772ce7752f258df5eb4baaf92c1ba7acc8a526800e59143973b7043a7485e241
|
|
7
|
+
data.tar.gz: c91f34ef071ef68104e02490b7b6cca3c18f78fabd386a7f933004701bc06da001e6ff3ace46d313088ebba20829176ec51c916cfc5d39f30a910cea03a0775a
|
|
@@ -47,9 +47,6 @@ module ForestAdminDatasourceCustomizer
|
|
|
47
47
|
end
|
|
48
48
|
|
|
49
49
|
def rename_collection(current_name, new_name)
|
|
50
|
-
# Check collection exists
|
|
51
|
-
collection = get_collection(current_name)
|
|
52
|
-
|
|
53
50
|
return unless current_name != new_name
|
|
54
51
|
|
|
55
52
|
# Check new name is not already used
|
|
@@ -64,17 +61,6 @@ module ForestAdminDatasourceCustomizer
|
|
|
64
61
|
"Cannot rename a collection twice: #{@to_child_name[current_name]}->#{current_name}->#{new_name}"
|
|
65
62
|
end
|
|
66
63
|
|
|
67
|
-
polymorphic_relations = %w[PolymorphicOneToOne PolymorphicOneToMany]
|
|
68
|
-
collection.schema[:fields].each do |field_name, field_schema|
|
|
69
|
-
next unless polymorphic_relations.include?(field_schema.type)
|
|
70
|
-
|
|
71
|
-
reverse_relation_name = Utils::Collection.get_inverse_relation(collection, field_name)
|
|
72
|
-
|
|
73
|
-
raise Exceptions::ForestException,
|
|
74
|
-
"Cannot rename collection #{current_name} because it's a target of a polymorphic relation " \
|
|
75
|
-
"'#{field_schema.foreign_collection}.#{reverse_relation_name}'"
|
|
76
|
-
end
|
|
77
|
-
|
|
78
64
|
@from_child_name[current_name] = new_name
|
|
79
65
|
@to_child_name[new_name] = current_name
|
|
80
66
|
|
|
@@ -9,21 +9,46 @@ module ForestAdminDatasourceCustomizer
|
|
|
9
9
|
datasource.get_collection_name(super)
|
|
10
10
|
end
|
|
11
11
|
|
|
12
|
-
def
|
|
13
|
-
|
|
12
|
+
def list(caller, filter = nil, projection = nil)
|
|
13
|
+
refined_filter = refine_filter(caller, filter)
|
|
14
|
+
records = @child_collection.list(caller, refined_filter, projection)
|
|
14
15
|
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
16
|
+
transform_records_polymorphic_values(records)
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
def create(caller, data)
|
|
20
|
+
transformed_data = transform_data_polymorphic_values(data)
|
|
21
|
+
result = @child_collection.create(caller, transformed_data)
|
|
22
|
+
|
|
23
|
+
transform_record_polymorphic_values(result)
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
def update(caller, filter, patch)
|
|
27
|
+
refined_filter = refine_filter(caller, filter)
|
|
28
|
+
transformed_patch = transform_data_polymorphic_values(patch)
|
|
29
|
+
|
|
30
|
+
@child_collection.update(caller, refined_filter, transformed_patch)
|
|
31
|
+
end
|
|
32
|
+
|
|
33
|
+
def refine_filter(_caller, filter)
|
|
34
|
+
return filter unless filter&.condition_tree
|
|
35
|
+
|
|
36
|
+
type_fields = polymorphic_type_fields
|
|
37
|
+
|
|
38
|
+
transformed_tree = filter.condition_tree.replace_leafs do |leaf|
|
|
39
|
+
if type_fields.include?(leaf.field)
|
|
40
|
+
transformed_value = transform_polymorphic_value(leaf.value)
|
|
41
|
+
if transformed_value == leaf.value
|
|
42
|
+
leaf
|
|
43
|
+
else
|
|
44
|
+
leaf.override(value: transformed_value)
|
|
20
45
|
end
|
|
46
|
+
else
|
|
47
|
+
leaf
|
|
21
48
|
end
|
|
22
|
-
|
|
23
|
-
fields[name] = old_schema
|
|
24
49
|
end
|
|
25
50
|
|
|
26
|
-
|
|
51
|
+
filter.override(condition_tree: transformed_tree)
|
|
27
52
|
end
|
|
28
53
|
|
|
29
54
|
# rubocop:disable Lint/UselessMethodDefinition
|
|
@@ -31,6 +56,128 @@ module ForestAdminDatasourceCustomizer
|
|
|
31
56
|
super
|
|
32
57
|
end
|
|
33
58
|
# rubocop:enable Lint/UselessMethodDefinition
|
|
59
|
+
|
|
60
|
+
private
|
|
61
|
+
|
|
62
|
+
def polymorphic_type_fields
|
|
63
|
+
type_fields = []
|
|
64
|
+
child_schema = @child_collection.schema
|
|
65
|
+
return type_fields unless child_schema && child_schema[:fields]
|
|
66
|
+
|
|
67
|
+
child_schema[:fields].each_value do |field_schema|
|
|
68
|
+
case field_schema.type
|
|
69
|
+
when 'PolymorphicManyToOne'
|
|
70
|
+
type_fields << field_schema.foreign_key_type_field
|
|
71
|
+
end
|
|
72
|
+
end
|
|
73
|
+
type_fields
|
|
74
|
+
end
|
|
75
|
+
|
|
76
|
+
def transform_data_polymorphic_values(data)
|
|
77
|
+
return data unless data
|
|
78
|
+
|
|
79
|
+
type_fields = polymorphic_type_fields
|
|
80
|
+
transformed_data = data.dup
|
|
81
|
+
|
|
82
|
+
type_fields.each do |type_field|
|
|
83
|
+
next unless transformed_data.key?(type_field)
|
|
84
|
+
|
|
85
|
+
original_value = transformed_data[type_field]
|
|
86
|
+
transformed_value = reverse_collection_name(original_value)
|
|
87
|
+
transformed_data[type_field] = transformed_value if transformed_value != original_value
|
|
88
|
+
end
|
|
89
|
+
|
|
90
|
+
transformed_data
|
|
91
|
+
end
|
|
92
|
+
|
|
93
|
+
def transform_polymorphic_value(value)
|
|
94
|
+
return value unless value
|
|
95
|
+
|
|
96
|
+
# Handle both single values and arrays (for IN/NOT_IN operators)
|
|
97
|
+
if value.is_a?(Array)
|
|
98
|
+
value.map { |v| reverse_collection_name(v) }
|
|
99
|
+
else
|
|
100
|
+
reverse_collection_name(value)
|
|
101
|
+
end
|
|
102
|
+
end
|
|
103
|
+
|
|
104
|
+
# convert new collection name back to old name for db queries
|
|
105
|
+
def reverse_collection_name(collection_name)
|
|
106
|
+
to_child_name = datasource.instance_variable_get(:@to_child_name)
|
|
107
|
+
to_child_name[collection_name] || collection_name
|
|
108
|
+
end
|
|
109
|
+
|
|
110
|
+
# convert old collection name to new name for returned data
|
|
111
|
+
def forward_collection_name(collection_name)
|
|
112
|
+
from_child_name = datasource.instance_variable_get(:@from_child_name)
|
|
113
|
+
from_child_name[collection_name] || collection_name
|
|
114
|
+
end
|
|
115
|
+
|
|
116
|
+
def transform_records_polymorphic_values(records)
|
|
117
|
+
return records unless records.is_a?(Array)
|
|
118
|
+
|
|
119
|
+
type_fields = polymorphic_type_fields
|
|
120
|
+
return records if type_fields.empty?
|
|
121
|
+
|
|
122
|
+
records.map do |record|
|
|
123
|
+
transform_record_polymorphic_values(record)
|
|
124
|
+
end
|
|
125
|
+
end
|
|
126
|
+
|
|
127
|
+
def transform_record_polymorphic_values(record)
|
|
128
|
+
return record unless record.is_a?(Hash)
|
|
129
|
+
|
|
130
|
+
type_fields = polymorphic_type_fields
|
|
131
|
+
return record if type_fields.empty?
|
|
132
|
+
|
|
133
|
+
transformed_record = record.dup
|
|
134
|
+
|
|
135
|
+
type_fields.each do |type_field|
|
|
136
|
+
next unless transformed_record.key?(type_field)
|
|
137
|
+
|
|
138
|
+
old_value = transformed_record[type_field]
|
|
139
|
+
new_value = forward_collection_name(old_value)
|
|
140
|
+
transformed_record[type_field] = new_value if new_value != old_value
|
|
141
|
+
end
|
|
142
|
+
|
|
143
|
+
transformed_record
|
|
144
|
+
end
|
|
145
|
+
|
|
146
|
+
protected
|
|
147
|
+
|
|
148
|
+
def refine_schema(sub_schema)
|
|
149
|
+
current_collection_name = @child_collection.name
|
|
150
|
+
|
|
151
|
+
sub_schema[:fields].each_value do |old_schema|
|
|
152
|
+
case old_schema.type
|
|
153
|
+
when 'PolymorphicOneToOne', 'PolymorphicOneToMany'
|
|
154
|
+
refine_polymorphic_one_schema(old_schema, current_collection_name)
|
|
155
|
+
when 'PolymorphicManyToOne'
|
|
156
|
+
refine_polymorphic_many_schema(old_schema)
|
|
157
|
+
when 'ManyToOne', 'OneToMany', 'OneToOne'
|
|
158
|
+
old_schema.foreign_collection = datasource.get_collection_name(old_schema.foreign_collection)
|
|
159
|
+
when 'ManyToMany'
|
|
160
|
+
old_schema.foreign_collection = datasource.get_collection_name(old_schema.foreign_collection)
|
|
161
|
+
old_schema.through_collection = datasource.get_collection_name(old_schema.through_collection)
|
|
162
|
+
end
|
|
163
|
+
end
|
|
164
|
+
|
|
165
|
+
sub_schema
|
|
166
|
+
end
|
|
167
|
+
|
|
168
|
+
def refine_polymorphic_one_schema(schema, current_collection_name)
|
|
169
|
+
if schema.origin_type_value == current_collection_name
|
|
170
|
+
schema.origin_type_value = datasource.get_collection_name(current_collection_name)
|
|
171
|
+
end
|
|
172
|
+
schema.foreign_collection = datasource.get_collection_name(schema.foreign_collection)
|
|
173
|
+
end
|
|
174
|
+
|
|
175
|
+
def refine_polymorphic_many_schema(schema)
|
|
176
|
+
schema.foreign_collections = schema.foreign_collections.map { |fc| datasource.get_collection_name(fc) }
|
|
177
|
+
schema.foreign_key_targets = schema.foreign_key_targets.transform_keys do |key|
|
|
178
|
+
datasource.get_collection_name(key)
|
|
179
|
+
end
|
|
180
|
+
end
|
|
34
181
|
end
|
|
35
182
|
end
|
|
36
183
|
end
|