From 58a38769bda8d7118cb16a294335ab9807ee35ea Mon Sep 17 00:00:00 2001 From: Paul Rastoin <45004772+prastoin@users.noreply.github.com> Date: Mon, 1 Sep 2025 11:39:06 +0200 Subject: [PATCH] Morph relation v2 schema runner (#14195) close https://github.com/twentyhq/core-team-issues/issues/1410 --- ...lat-field-metadata-property-update.type.ts | 9 +- .../update-field-action-handler.service.ts | 89 ++++++++++++++----- 2 files changed, 73 insertions(+), 25 deletions(-) diff --git a/packages/twenty-server/src/engine/workspace-manager/workspace-migration-v2/workspace-migration-builder-v2/types/flat-field-metadata-property-update.type.ts b/packages/twenty-server/src/engine/workspace-manager/workspace-migration-v2/workspace-migration-builder-v2/types/flat-field-metadata-property-update.type.ts index 47b34488a0..8e1f1c3344 100644 --- a/packages/twenty-server/src/engine/workspace-manager/workspace-migration-v2/workspace-migration-builder-v2/types/flat-field-metadata-property-update.type.ts +++ b/packages/twenty-server/src/engine/workspace-manager/workspace-migration-v2/workspace-migration-builder-v2/types/flat-field-metadata-property-update.type.ts @@ -1,10 +1,11 @@ -import { type FromTo } from 'twenty-shared/types'; +import { type FieldMetadataType, type FromTo } from 'twenty-shared/types'; import { type FieldMetadataEntity } from 'src/engine/metadata-modules/field-metadata/field-metadata.entity'; import { type FlatFieldMetadataPropertiesToCompare } from 'src/engine/metadata-modules/flat-field-metadata/types/flat-field-metadata-properties-to-compare.type'; export type FlatFieldMetadataPropertyUpdate< - T extends FlatFieldMetadataPropertiesToCompare, + P extends FlatFieldMetadataPropertiesToCompare, + T extends FieldMetadataType = FieldMetadataType, > = { - property: T; -} & FromTo; + property: P; +} & FromTo[P]>; diff --git a/packages/twenty-server/src/engine/workspace-manager/workspace-migration-v2/workspace-migration-runner-v2/action-handlers/field/services/update-field-action-handler.service.ts b/packages/twenty-server/src/engine/workspace-manager/workspace-migration-v2/workspace-migration-runner-v2/action-handlers/field/services/update-field-action-handler.service.ts index bad3202792..ccde9430df 100644 --- a/packages/twenty-server/src/engine/workspace-manager/workspace-migration-v2/workspace-migration-runner-v2/action-handlers/field/services/update-field-action-handler.service.ts +++ b/packages/twenty-server/src/engine/workspace-manager/workspace-migration-v2/workspace-migration-runner-v2/action-handlers/field/services/update-field-action-handler.service.ts @@ -1,11 +1,13 @@ import { Injectable } from '@nestjs/common'; +import { FieldMetadataType } from 'twenty-shared/types'; import { isDefined } from 'twenty-shared/utils'; import { ColumnType, type QueryRunner } from 'typeorm'; import { WorkspaceMigrationRunnerActionHandler } from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-runner-v2/interfaces/workspace-migration-runner-action-handler-service.interface'; import { FieldMetadataEntity } from 'src/engine/metadata-modules/field-metadata/field-metadata.entity'; +import { MorphOrRelationFieldMetadataType } from 'src/engine/metadata-modules/field-metadata/types/morph-or-relation-field-metadata-type.type'; import { computeCompositeColumnName } from 'src/engine/metadata-modules/field-metadata/utils/compute-column-name.util'; import { getCompositeTypeOrThrow } from 'src/engine/metadata-modules/field-metadata/utils/get-composite-type-or-throw.util'; import { isCompositeFieldMetadataType } from 'src/engine/metadata-modules/field-metadata/utils/is-composite-field-metadata-type.util'; @@ -39,13 +41,14 @@ import { } from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-runner-v2/utils/workspace-schema-enum-operations.util'; type UpdateFieldPropertyUpdateHandlerArgs< - T extends FlatFieldMetadataPropertiesToCompare, + P extends FlatFieldMetadataPropertiesToCompare, + T extends FieldMetadataType = FieldMetadataType, > = { queryRunner: QueryRunner; schemaName: string; tableName: string; - flatFieldMetadata: FlatFieldMetadata; - update: FlatFieldMetadataPropertyUpdate; + flatFieldMetadata: FlatFieldMetadata; + update: FlatFieldMetadataPropertyUpdate; }; @Injectable() @@ -140,6 +143,21 @@ export class UpdateFieldActionHandlerService extends WorkspaceMigrationRunnerAct }); optimisticFlatFieldMetadata.options = update.to ?? []; } + if ( + isMorphOrRelationFlatFieldMetadata(optimisticFlatFieldMetadata) && + update.property === 'settings' + ) { + await this.handleMorphOrRelationSettingsUpdate({ + flatFieldMetadata: optimisticFlatFieldMetadata, + queryRunner, + schemaName, + tableName, + update: update as FlatFieldMetadataPropertyUpdate< + 'settings', + MorphOrRelationFieldMetadataType + >, + }); + } } } @@ -248,7 +266,7 @@ export class UpdateFieldActionHandlerService extends WorkspaceMigrationRunnerAct defaultValue: compositeDefaultValue, }); - await this.workspaceSchemaManagerService.columnManager.alterColumnDefault( + return await this.workspaceSchemaManagerService.columnManager.alterColumnDefault( { queryRunner, schemaName, @@ -258,25 +276,25 @@ export class UpdateFieldActionHandlerService extends WorkspaceMigrationRunnerAct }, ); } - } else { - const serializedNewDefaultValue = serializeDefaultValueV2({ - columnName: flatFieldMetadata.name, + } + + const serializedNewDefaultValue = serializeDefaultValueV2({ + columnName: flatFieldMetadata.name, + schemaName, + tableName, + columnType, + defaultValue: update.to, + }); + + return await this.workspaceSchemaManagerService.columnManager.alterColumnDefault( + { + queryRunner, schemaName, tableName, - columnType, - defaultValue: update.to, - }); - - await this.workspaceSchemaManagerService.columnManager.alterColumnDefault( - { - queryRunner, - schemaName, - tableName, - columnName: flatFieldMetadata.name, - defaultValue: serializedNewDefaultValue, - }, - ); - } + columnName: flatFieldMetadata.name, + defaultValue: serializedNewDefaultValue, + }, + ); } private async handleFieldOptionsUpdate({ @@ -327,4 +345,33 @@ export class UpdateFieldActionHandlerService extends WorkspaceMigrationRunnerAct }); } } + + private async handleMorphOrRelationSettingsUpdate({ + queryRunner, + schemaName, + tableName, + update, + }: UpdateFieldPropertyUpdateHandlerArgs< + 'settings', + MorphOrRelationFieldMetadataType + >) { + const fromJoinColumnName = update.from.joinColumnName; + const toJoinColumnName = update.to.joinColumnName; + + if ( + !isDefined(fromJoinColumnName) || + !isDefined(toJoinColumnName) || + fromJoinColumnName === toJoinColumnName + ) { + return; + } + + await this.workspaceSchemaManagerService.columnManager.renameColumn({ + newColumnName: fromJoinColumnName, + oldColumnName: toJoinColumnName, + queryRunner, + schemaName, + tableName, + }); + } }