Update Name of relation fieldMetadata (#15749)

UpdateOne of a Relation that involves a CustomObject, because the
nameSingular needs to be updated in the fieldMetadata
- nameSingular and namePlural must be provided since they are necessary
for morph name computation
  - label sync should be false


Interesting files to look at:

-
packages/twenty-server/src/engine/metadata-modules/object-metadata/utils/build-default-relation-flat-field-metadatas-for-custom-object.util.ts

- UPDATE =>
packages/twenty-server/src/engine/metadata-modules/flat-object-metadata/utils/rename-related-morph-field-on-object-names-update.util.ts
( also update relation indexes ) needs v2 refactor to handle field
relation name update
- CREATE =>
packages/twenty-server/src/engine/metadata-modules/object-metadata/utils/build-default-relation-flat-field-metadatas-for-custom-object.util.ts
( handle morph instead of previous classic relation )
- DELETE => DONE

Edit:
closes https://github.com/twentyhq/core-team-issues/issues/1897

---------

Co-authored-by: prastoin <paul@twenty.com>
This commit is contained in:
Guillim
2025-11-23 21:45:30 +01:00
committed by GitHub
parent 6203b7b3e6
commit 4848bc03f3
24 changed files with 1282 additions and 405 deletions
@@ -108,6 +108,7 @@ export class FlatFieldMetadataValidatorService {
});
}
// Should be moved in relation field validator
if (isMorphOrRelationFlatFieldMetadata(flatFieldMetadataToValidate)) {
const relationNonEditableUpdatedProperties = updates.flatMap(
({ property }) =>
@@ -126,6 +127,7 @@ export class FlatFieldMetadataValidatorService {
});
}
}
///
if (updates.some((update) => update.property === 'name')) {
validationResult.errors.push(
@@ -211,19 +211,26 @@ export class UpdateFieldActionHandlerService extends WorkspaceMigrationRunnerAct
optimisticFlatFieldMetadata.options = update.to ?? [];
}
if (
isMorphOrRelationFlatFieldMetadata(optimisticFlatFieldMetadata) &&
update.property === 'settings'
isPropertyUpdate(update, 'settings') &&
isDefined(update.from?.joinColumnName) &&
isDefined(update.to?.joinColumnName) &&
update.from.joinColumnName !== update.to.joinColumnName &&
isMorphOrRelationFlatFieldMetadata(optimisticFlatFieldMetadata)
) {
await this.handleMorphOrRelationSettingsUpdate({
flatFieldMetadata: optimisticFlatFieldMetadata,
await this.workspaceSchemaManagerService.columnManager.renameColumn({
queryRunner,
schemaName,
tableName,
update: update as PropertyUpdate<
FlatFieldMetadata<MorphOrRelationFieldMetadataType>,
'settings'
>,
oldColumnName: update.from.joinColumnName,
newColumnName: update.to.joinColumnName,
});
optimisticFlatFieldMetadata = {
...optimisticFlatFieldMetadata,
settings: {
...optimisticFlatFieldMetadata.settings,
joinColumnName: update.to.joinColumnName,
},
};
}
}
}
@@ -263,20 +270,6 @@ export class UpdateFieldActionHandlerService extends WorkspaceMigrationRunnerAct
newColumnName: toCompositeColumnName,
});
}
} else {
if (isMorphOrRelationFlatFieldMetadata(flatFieldMetadata)) {
throw new WorkspaceMigrationRunnerException(
'Relation field metadata name update is not supported yet',
WorkspaceMigrationRunnerExceptionCode.NOT_SUPPORTED,
);
}
await this.workspaceSchemaManagerService.columnManager.renameColumn({
queryRunner,
schemaName,
tableName,
oldColumnName: update.from,
newColumnName: update.to,
});
}
const enumOperations = collectEnumOperationsForField({
@@ -440,8 +433,8 @@ export class UpdateFieldActionHandlerService extends WorkspaceMigrationRunnerAct
}
await this.workspaceSchemaManagerService.columnManager.renameColumn({
newColumnName: fromJoinColumnName,
oldColumnName: toJoinColumnName,
oldColumnName: fromJoinColumnName,
newColumnName: toJoinColumnName,
queryRunner,
schemaName,
tableName,