Morph relation v2 schema runner (#14195)

close https://github.com/twentyhq/core-team-issues/issues/1410
This commit is contained in:
Paul Rastoin
2025-09-01 11:39:06 +02:00
committed by GitHub
parent aa3e21a243
commit 58a38769bd
2 changed files with 73 additions and 25 deletions
@@ -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<FieldMetadataEntity[T]>;
property: P;
} & FromTo<FieldMetadataEntity<T>[P]>;
@@ -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<T>;
flatFieldMetadata: FlatFieldMetadata<T>;
update: FlatFieldMetadataPropertyUpdate<P, T>;
};
@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,
});
}
}