From 8ce7020b1278e0beab6bbefea941b56cbaef3335 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=A9my=20M?= Date: Tue, 13 Feb 2024 19:36:58 +0100 Subject: [PATCH] feat: sync metadata can alter and update a field (#3944) --- .../comparators/workspace-field.comparator.ts | 2 +- .../workspace-metadata-updater.service.ts | 35 +++++++++++++++++-- .../workspace-sync-object-metadata.service.ts | 8 +++++ .../storage/workspace-sync.storage.ts | 5 +-- 4 files changed, 44 insertions(+), 6 deletions(-) diff --git a/packages/twenty-server/src/workspace/workspace-sync-metadata/comparators/workspace-field.comparator.ts b/packages/twenty-server/src/workspace/workspace-sync-metadata/comparators/workspace-field.comparator.ts index 0cc2e222e..e76f2ae8a 100644 --- a/packages/twenty-server/src/workspace/workspace-sync-metadata/comparators/workspace-field.comparator.ts +++ b/packages/twenty-server/src/workspace/workspace-sync-metadata/comparators/workspace-field.comparator.ts @@ -55,7 +55,7 @@ export class WorkspaceFieldComparator { const standardFieldMetadataMap = transformMetadataForComparison( standardObjectMetadata.fields, { - propertiesToIgnore: fieldPropertiesToStringify, + propertiesToStringify: fieldPropertiesToStringify, keyFactory(datum) { return datum.name; }, diff --git a/packages/twenty-server/src/workspace/workspace-sync-metadata/services/workspace-metadata-updater.service.ts b/packages/twenty-server/src/workspace/workspace-sync-metadata/services/workspace-metadata-updater.service.ts index 087733ec3..5ef08575f 100644 --- a/packages/twenty-server/src/workspace/workspace-sync-metadata/services/workspace-metadata-updater.service.ts +++ b/packages/twenty-server/src/workspace/workspace-sync-metadata/services/workspace-metadata-updater.service.ts @@ -108,7 +108,10 @@ export class WorkspaceMetadataUpdaterService { storage: WorkspaceSyncStorage, ): Promise<{ createdFieldMetadataCollection: FieldMetadataEntity[]; - updatedFieldMetadataCollection: FieldMetadataEntity[]; + updatedFieldMetadataCollection: { + current: FieldMetadataEntity; + altered: FieldMetadataEntity; + }[]; }> { const fieldMetadataRepository = manager.getRepository(FieldMetadataEntity); @@ -124,6 +127,11 @@ export class WorkspaceMetadataUpdaterService { /** * Update field metadata */ + const oldFieldMetadataCollection = await fieldMetadataRepository.find({ + where: { + id: In(storage.fieldMetadataUpdateCollection.map((field) => field.id)), + }, + }); const updatedFieldMetadataCollection = await fieldMetadataRepository.save( storage.fieldMetadataUpdateCollection as DeepPartial[], ); @@ -148,8 +156,29 @@ export class WorkspaceMetadataUpdaterService { return { createdFieldMetadataCollection: createdFieldMetadataCollection as FieldMetadataEntity[], - updatedFieldMetadataCollection: - updatedFieldMetadataCollection as FieldMetadataEntity[], + updatedFieldMetadataCollection: oldFieldMetadataCollection.map( + (oldFieldMetadata) => { + const alteredFieldMetadata = updatedFieldMetadataCollection.find( + (field) => field.id === oldFieldMetadata.id, + ); + + if (!alteredFieldMetadata) { + throw new Error( + `Field ${oldFieldMetadata.id} not found in updatedFieldMetadataCollection`, + ); + } + + return { + current: oldFieldMetadata as FieldMetadataEntity, + // TypeORM save method doesn't return the whole entity... + // https://github.com/typeorm/typeorm/issues/3490 + altered: { + ...oldFieldMetadata, + ...alteredFieldMetadata, + } as FieldMetadataEntity, + }; + }, + ), }; } diff --git a/packages/twenty-server/src/workspace/workspace-sync-metadata/services/workspace-sync-object-metadata.service.ts b/packages/twenty-server/src/workspace/workspace-sync-metadata/services/workspace-sync-object-metadata.service.ts index 4e4eacb43..43c3b2e42 100644 --- a/packages/twenty-server/src/workspace/workspace-sync-metadata/services/workspace-sync-object-metadata.service.ts +++ b/packages/twenty-server/src/workspace/workspace-sync-metadata/services/workspace-sync-object-metadata.service.ts @@ -160,6 +160,13 @@ export class WorkspaceSyncObjectMetadataService { WorkspaceMigrationBuilderAction.CREATE, ); + const updateFieldWorkspaceMigrations = + await this.workspaceMigrationFieldFactory.create( + originalObjectMetadataCollection, + metadataFieldUpdaterResult.updatedFieldMetadataCollection, + WorkspaceMigrationBuilderAction.UPDATE, + ); + const deleteFieldWorkspaceMigrations = await this.workspaceMigrationFieldFactory.create( originalObjectMetadataCollection, @@ -173,6 +180,7 @@ export class WorkspaceSyncObjectMetadataService { ...createObjectWorkspaceMigrations, ...deleteObjectWorkspaceMigrations, ...createFieldWorkspaceMigrations, + ...updateFieldWorkspaceMigrations, ...deleteFieldWorkspaceMigrations, ]; } diff --git a/packages/twenty-server/src/workspace/workspace-sync-metadata/storage/workspace-sync.storage.ts b/packages/twenty-server/src/workspace/workspace-sync-metadata/storage/workspace-sync.storage.ts index 99791b9ac..bde414db3 100644 --- a/packages/twenty-server/src/workspace/workspace-sync-metadata/storage/workspace-sync.storage.ts +++ b/packages/twenty-server/src/workspace/workspace-sync-metadata/storage/workspace-sync.storage.ts @@ -15,8 +15,9 @@ export class WorkspaceSyncStorage { // Field metadata private readonly _fieldMetadataCreateCollection: PartialFieldMetadata[] = []; - private readonly _fieldMetadataUpdateCollection: Partial[] = - []; + private readonly _fieldMetadataUpdateCollection: Partial< + PartialFieldMetadata & { id: string } + >[] = []; private readonly _fieldMetadataDeleteCollection: FieldMetadataEntity[] = []; // Relation metadata