From 5018744773e38b67a27a2a16033511ddd6a6b691 Mon Sep 17 00:00:00 2001 From: Matt Date: Thu, 28 Nov 2024 17:23:36 +0100 Subject: [PATCH 1/3] fix(rename): properly map relation on pk field --- .../rename_field/rename_field_collection_decorator.rb | 10 ++++++++++ .../schema/relations/many_to_many_schema.rb | 3 +-- .../schema/relations/many_to_one_schema.rb | 3 +-- .../schema/relations/one_to_many_schema.rb | 3 +-- .../schema/relations/one_to_one_schema.rb | 3 +-- .../schema/relations/many_relation_schema.rbs | 2 +- .../schema/relations/many_to_many_schema.rbs | 2 +- .../schema/relations/single_relation_schema.rbs | 2 +- 8 files changed, 17 insertions(+), 11 deletions(-) diff --git a/packages/forest_admin_datasource_customizer/lib/forest_admin_datasource_customizer/decorators/rename_field/rename_field_collection_decorator.rb b/packages/forest_admin_datasource_customizer/lib/forest_admin_datasource_customizer/decorators/rename_field/rename_field_collection_decorator.rb index dbfbe40d0..a69fec1de 100644 --- a/packages/forest_admin_datasource_customizer/lib/forest_admin_datasource_customizer/decorators/rename_field/rename_field_collection_decorator.rb +++ b/packages/forest_admin_datasource_customizer/lib/forest_admin_datasource_customizer/decorators/rename_field/rename_field_collection_decorator.rb @@ -57,14 +57,24 @@ def refine_schema(sub_schema) sub_schema[:fields].each do |old_name, old_schema| case old_schema.type when 'ManyToOne' + relation = datasource.get_collection(old_schema.foreign_collection) old_schema.foreign_key = from_child_collection[old_schema.foreign_key] || old_schema.foreign_key + old_schema.foreign_key_target = + relation.from_child_collection[old_schema.foreign_key_target] || old_schema.foreign_key_target when 'OneToMany', 'OneToOne' relation = datasource.get_collection(old_schema.foreign_collection) old_schema.origin_key = relation.from_child_collection[old_schema.origin_key] || old_schema.origin_key + old_schema.origin_key_target = + relation.from_child_collection[old_schema.origin_key_target] || old_schema.origin_key_target when 'ManyToMany' through = datasource.get_collection(old_schema.through_collection) + relation = datasource.get_collection(old_schema.foreign_collection) old_schema.foreign_key = through.from_child_collection[old_schema.foreign_key] || old_schema.foreign_key old_schema.origin_key = through.from_child_collection[old_schema.origin_key] || old_schema.origin_key + old_schema.origin_key_target = + from_child_collection[old_schema.origin_key_target] || old_schema.origin_key_target + old_schema.foreign_key_target = + relation.from_child_collection[old_schema.foreign_key_target] || old_schema.foreign_key_target end fields[from_child_collection[old_name] || old_name] = old_schema diff --git a/packages/forest_admin_datasource_toolkit/lib/forest_admin_datasource_toolkit/schema/relations/many_to_many_schema.rb b/packages/forest_admin_datasource_toolkit/lib/forest_admin_datasource_toolkit/schema/relations/many_to_many_schema.rb index 839c4f4d6..c13de90a5 100644 --- a/packages/forest_admin_datasource_toolkit/lib/forest_admin_datasource_toolkit/schema/relations/many_to_many_schema.rb +++ b/packages/forest_admin_datasource_toolkit/lib/forest_admin_datasource_toolkit/schema/relations/many_to_many_schema.rb @@ -2,8 +2,7 @@ module ForestAdminDatasourceToolkit module Schema module Relations class ManyToManySchema < RelationSchema - attr_accessor :origin_key, :through_collection, :foreign_key - attr_reader :origin_key_target, :foreign_key_target + attr_accessor :origin_key, :through_collection, :foreign_key, :origin_key_target, :foreign_key_target def initialize( origin_key:, diff --git a/packages/forest_admin_datasource_toolkit/lib/forest_admin_datasource_toolkit/schema/relations/many_to_one_schema.rb b/packages/forest_admin_datasource_toolkit/lib/forest_admin_datasource_toolkit/schema/relations/many_to_one_schema.rb index 48394158d..03d5f3371 100644 --- a/packages/forest_admin_datasource_toolkit/lib/forest_admin_datasource_toolkit/schema/relations/many_to_one_schema.rb +++ b/packages/forest_admin_datasource_toolkit/lib/forest_admin_datasource_toolkit/schema/relations/many_to_one_schema.rb @@ -2,8 +2,7 @@ module ForestAdminDatasourceToolkit module Schema module Relations class ManyToOneSchema < RelationSchema - attr_accessor :foreign_key - attr_reader :foreign_key_target + attr_accessor :foreign_key, :foreign_key_target def initialize(foreign_key:, foreign_key_target:, foreign_collection:) super(foreign_collection, 'ManyToOne') diff --git a/packages/forest_admin_datasource_toolkit/lib/forest_admin_datasource_toolkit/schema/relations/one_to_many_schema.rb b/packages/forest_admin_datasource_toolkit/lib/forest_admin_datasource_toolkit/schema/relations/one_to_many_schema.rb index 00cbff603..f7c761a6b 100644 --- a/packages/forest_admin_datasource_toolkit/lib/forest_admin_datasource_toolkit/schema/relations/one_to_many_schema.rb +++ b/packages/forest_admin_datasource_toolkit/lib/forest_admin_datasource_toolkit/schema/relations/one_to_many_schema.rb @@ -2,8 +2,7 @@ module ForestAdminDatasourceToolkit module Schema module Relations class OneToManySchema < RelationSchema - attr_accessor :origin_key - attr_reader :origin_key_target + attr_accessor :origin_key, :origin_key_target def initialize(origin_key:, origin_key_target:, foreign_collection:) super(foreign_collection, 'OneToMany') diff --git a/packages/forest_admin_datasource_toolkit/lib/forest_admin_datasource_toolkit/schema/relations/one_to_one_schema.rb b/packages/forest_admin_datasource_toolkit/lib/forest_admin_datasource_toolkit/schema/relations/one_to_one_schema.rb index 664a78716..a02fafe98 100644 --- a/packages/forest_admin_datasource_toolkit/lib/forest_admin_datasource_toolkit/schema/relations/one_to_one_schema.rb +++ b/packages/forest_admin_datasource_toolkit/lib/forest_admin_datasource_toolkit/schema/relations/one_to_one_schema.rb @@ -2,8 +2,7 @@ module ForestAdminDatasourceToolkit module Schema module Relations class OneToOneSchema < RelationSchema - attr_accessor :origin_key - attr_reader :origin_key_target + attr_accessor :origin_key, :origin_key_target def initialize(origin_key:, origin_key_target:, foreign_collection:) super(foreign_collection, 'OneToOne') diff --git a/packages/forest_admin_datasource_toolkit/sig/forest_admin_datasource_toolkit/schema/relations/many_relation_schema.rbs b/packages/forest_admin_datasource_toolkit/sig/forest_admin_datasource_toolkit/schema/relations/many_relation_schema.rbs index b12409ee3..fc45b9a03 100644 --- a/packages/forest_admin_datasource_toolkit/sig/forest_admin_datasource_toolkit/schema/relations/many_relation_schema.rbs +++ b/packages/forest_admin_datasource_toolkit/sig/forest_admin_datasource_toolkit/schema/relations/many_relation_schema.rbs @@ -3,7 +3,7 @@ module ForestAdminDatasourceToolkit module Relations class ManyRelationSchema attr_accessor foreign_key: String - attr_reader foreign_key_target: String + attr_accessor foreign_key_target: String end end end diff --git a/packages/forest_admin_datasource_toolkit/sig/forest_admin_datasource_toolkit/schema/relations/many_to_many_schema.rbs b/packages/forest_admin_datasource_toolkit/sig/forest_admin_datasource_toolkit/schema/relations/many_to_many_schema.rbs index cc5468814..35f51bba6 100644 --- a/packages/forest_admin_datasource_toolkit/sig/forest_admin_datasource_toolkit/schema/relations/many_to_many_schema.rbs +++ b/packages/forest_admin_datasource_toolkit/sig/forest_admin_datasource_toolkit/schema/relations/many_to_many_schema.rbs @@ -3,7 +3,7 @@ module ForestAdminDatasourceToolkit module Relations class ManyToManySchema attr_accessor origin_key: String - attr_reader origin_key_target: String + attr_accessor origin_key_target: String attr_accessor through_collection: String end end diff --git a/packages/forest_admin_datasource_toolkit/sig/forest_admin_datasource_toolkit/schema/relations/single_relation_schema.rbs b/packages/forest_admin_datasource_toolkit/sig/forest_admin_datasource_toolkit/schema/relations/single_relation_schema.rbs index b4cb3e63b..39a7dcd60 100644 --- a/packages/forest_admin_datasource_toolkit/sig/forest_admin_datasource_toolkit/schema/relations/single_relation_schema.rbs +++ b/packages/forest_admin_datasource_toolkit/sig/forest_admin_datasource_toolkit/schema/relations/single_relation_schema.rbs @@ -3,7 +3,7 @@ module ForestAdminDatasourceToolkit module Relations class SingleRelationSchema attr_accessor origin_key: String - attr_reader origin_key_target: String + attr_accessor origin_key_target: String end end end From 203c361a03e489eeb9ee4046cbb135b85d959acc Mon Sep 17 00:00:00 2001 From: Matt Date: Thu, 28 Nov 2024 17:24:56 +0100 Subject: [PATCH 2/3] chore: add tests --- .../rename_field_collection_decorator_spec.rb | 46 +++++++++++++++++++ 1 file changed, 46 insertions(+) diff --git a/packages/forest_admin_datasource_customizer/spec/lib/forest_admin_datasource_customizer/decorators/rename_field/rename_field_collection_decorator_spec.rb b/packages/forest_admin_datasource_customizer/spec/lib/forest_admin_datasource_customizer/decorators/rename_field/rename_field_collection_decorator_spec.rb index b9366a18c..f7a253394 100644 --- a/packages/forest_admin_datasource_customizer/spec/lib/forest_admin_datasource_customizer/decorators/rename_field/rename_field_collection_decorator_spec.rb +++ b/packages/forest_admin_datasource_customizer/spec/lib/forest_admin_datasource_customizer/decorators/rename_field/rename_field_collection_decorator_spec.rb @@ -318,6 +318,52 @@ module RenameField expect(rows).to eq([{ 'value' => 34, 'group' => { 'my_novel_author:created_at' => 'abc' } }]) end end + + describe 'when renaming foreign keys' do + before do + @new_book_person.rename_field('book_id', 'novel_id') + @new_book_person.rename_field('person_id', 'author_id') + end + + it 'the columns should be renamed in the schema' do + fields = @new_book_person.schema[:fields] + expect(fields['author_id']).to be_a(ColumnSchema) + expect(fields['novel_id']).to be_a(ColumnSchema) + expect(fields['person_id']).to be_nil + expect(fields['book_id']).to be_nil + end + + it 'the relations should be updated in all collections' do + book_fields = @new_book.schema[:fields] + book_person_fields = @new_book_person.schema[:fields] + person_fields = @new_person.schema[:fields] + + expect(book_fields['my_persons'].foreign_key).to eq('author_id') + expect(book_fields['my_persons'].origin_key).to eq('novel_id') + expect(book_person_fields['my_book'].foreign_key).to eq('novel_id') + expect(book_person_fields['my_person'].foreign_key).to eq('author_id') + expect(person_fields['my_book_person'].origin_key).to eq('author_id') + end + end + + describe 'when renaming primary keys' do + before do + @new_book.rename_field('id', 'new_book_id') + @new_person.rename_field('id', 'new_person_id') + end + + it 'the relations should be updated in all collections' do + book_fields = @new_book.schema[:fields] + book_person_fields = @new_book_person.schema[:fields] + person_fields = @new_person.schema[:fields] + + expect(book_fields['my_persons'].origin_key_target).to eq('new_book_id') + expect(book_fields['my_persons'].foreign_key_target).to eq('new_person_id') + expect(book_person_fields['my_book'].foreign_key_target).to eq('new_book_id') + expect(book_person_fields['my_person'].foreign_key_target).to eq('new_person_id') + expect(person_fields['my_book_person'].origin_key_target).to eq('new_person_id') + end + end end end end From d83c540babe5ee455bca86550e7f2c8722464d21 Mon Sep 17 00:00:00 2001 From: Matt Date: Fri, 29 Nov 2024 10:55:27 +0100 Subject: [PATCH 3/3] fix: tests --- .../rename_field/rename_field_collection_decorator.rb | 2 +- .../rename_field/rename_field_collection_decorator_spec.rb | 4 +--- 2 files changed, 2 insertions(+), 4 deletions(-) diff --git a/packages/forest_admin_datasource_customizer/lib/forest_admin_datasource_customizer/decorators/rename_field/rename_field_collection_decorator.rb b/packages/forest_admin_datasource_customizer/lib/forest_admin_datasource_customizer/decorators/rename_field/rename_field_collection_decorator.rb index a69fec1de..02fc84c03 100644 --- a/packages/forest_admin_datasource_customizer/lib/forest_admin_datasource_customizer/decorators/rename_field/rename_field_collection_decorator.rb +++ b/packages/forest_admin_datasource_customizer/lib/forest_admin_datasource_customizer/decorators/rename_field/rename_field_collection_decorator.rb @@ -65,7 +65,7 @@ def refine_schema(sub_schema) relation = datasource.get_collection(old_schema.foreign_collection) old_schema.origin_key = relation.from_child_collection[old_schema.origin_key] || old_schema.origin_key old_schema.origin_key_target = - relation.from_child_collection[old_schema.origin_key_target] || old_schema.origin_key_target + from_child_collection[old_schema.origin_key_target] || old_schema.origin_key_target when 'ManyToMany' through = datasource.get_collection(old_schema.through_collection) relation = datasource.get_collection(old_schema.foreign_collection) diff --git a/packages/forest_admin_datasource_customizer/spec/lib/forest_admin_datasource_customizer/decorators/rename_field/rename_field_collection_decorator_spec.rb b/packages/forest_admin_datasource_customizer/spec/lib/forest_admin_datasource_customizer/decorators/rename_field/rename_field_collection_decorator_spec.rb index f7a253394..355a717f9 100644 --- a/packages/forest_admin_datasource_customizer/spec/lib/forest_admin_datasource_customizer/decorators/rename_field/rename_field_collection_decorator_spec.rb +++ b/packages/forest_admin_datasource_customizer/spec/lib/forest_admin_datasource_customizer/decorators/rename_field/rename_field_collection_decorator_spec.rb @@ -347,12 +347,10 @@ module RenameField end describe 'when renaming primary keys' do - before do + it 'the relations should be updated in all collections' do @new_book.rename_field('id', 'new_book_id') @new_person.rename_field('id', 'new_person_id') - end - it 'the relations should be updated in all collections' do book_fields = @new_book.schema[:fields] book_person_fields = @new_book_person.schema[:fields] person_fields = @new_person.schema[:fields]