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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 9ee49b58e6a895d834d1f572efcdd8e1a74f18900e82276216023ef9532616c1
4
- data.tar.gz: 886e2aaca491fa532ecc05de5aca3a449fcfc46e00d74c23e91e2cf6b27da42a
3
+ metadata.gz: 371670b192f095092ef1197ab3f975a3cc839addf0182a8a8626c4129f3ddafd
4
+ data.tar.gz: 575fcb53daec77edf6c1ac0570a962907d8346d1da3373746e040783030ae85f
5
5
  SHA512:
6
- metadata.gz: 26da0e8526c58463aae326d6c5f89fa3b5647094c7d8bf07f86212649619c35efdadf0aa28da189925cbe9544999202962d3c45af160f6707f5907e7a920d1c9
7
- data.tar.gz: bfd5409cb06f37d77659535231f415b93275140d42e47df5616fe7246f829502a6e4e7bce391167e218af9f7ec2c1de742c33ba90e9e919398745707bc2dcc42
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 refine_schema(sub_schema)
13
- fields = {}
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
- sub_schema[:fields].each do |name, old_schema|
16
- if old_schema.type != 'Column' && old_schema.type != 'PolymorphicManyToOne'
17
- old_schema.foreign_collection = datasource.get_collection_name(old_schema.foreign_collection)
18
- if old_schema.type == 'ManyToMany'
19
- old_schema.through_collection = datasource.get_collection_name(old_schema.through_collection)
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
- sub_schema
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
@@ -1,3 +1,3 @@
1
1
  module ForestAdminDatasourceCustomizer
2
- VERSION = "1.20.0"
2
+ VERSION = "1.21.0"
3
3
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: forest_admin_datasource_customizer
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.20.0
4
+ version: 1.21.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Matthieu