Update object handle morph join col rename (#14153)

# Introduction
When udpating a flat object metadata name we need to search for RELATION
field that has a MORPH RELATION target flat field metadata with
MANY_TO_ONE relationType as its settings are binded to the updated flat
object metadata name

In the best of the world we would remove this complexity to be computed
at runtime only and deprecate implemented logic here

close https://github.com/twentyhq/core-team-issues/issues/1412
This commit is contained in:
Paul Rastoin
2025-08-29 16:46:15 +02:00
committed by GitHub
parent 28f1481d15
commit 6397a4d906
10 changed files with 201 additions and 35 deletions
@@ -1,5 +1,5 @@
import diff from 'microdiff';
import { FieldMetadataType, type FromTo } from 'twenty-shared/types';
import { type FromTo } from 'twenty-shared/types';
import { isDefined, parseJson } from 'twenty-shared/utils';
import { FLAT_FIELD_METADATA_JSONB_PROPERTIES } from 'src/engine/metadata-modules/flat-field-metadata/constants/flat-field-metadata-jsonb-properties.constant';
@@ -10,6 +10,7 @@ import { type FlatFieldMetadataRelationPropertiesToCompare } from 'src/engine/me
import { type FlatFieldMetadata } from 'src/engine/metadata-modules/flat-field-metadata/types/flat-field-metadata.type';
import { isFlatFieldMetadataJsonbProperty } from 'src/engine/metadata-modules/flat-field-metadata/utils/is-flat-field-metadata-jsonb-property.util';
import { isStandardMetadata } from 'src/engine/metadata-modules/utils/is-standard-metadata.util';
import { isRelationFieldMetadataType } from 'src/engine/utils/is-relation-field-metadata-type.util';
import { type UpdateFieldAction } from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-builder-v2/types/workspace-migration-field-action-v2';
import { transformMetadataForComparison } from 'src/engine/workspace-manager/workspace-sync-metadata/comparators/utils/transform-metadata-for-comparison.util';
@@ -40,8 +41,7 @@ export const compareTwoFlatFieldMetadata = ({
// Remove below assertion when we authorize relation edition, see https://github.com/twentyhq/twenty/commit/39f6f3c4bb101272a9014e142a842d0801a3c33b
const isRelationFieldType =
isDefined(fieldMetadata.type) &&
(fieldMetadata.type === FieldMetadataType.RELATION ||
fieldMetadata.type === FieldMetadataType.MORPH_RELATION);
isRelationFieldMetadataType(fieldMetadata.type);
if (
isRelationFieldType &&
@@ -1,6 +1,7 @@
import { FieldMetadataType } from 'twenty-shared/types';
import { isDefined } from 'twenty-shared/utils';
import { type RelationFieldMetadataType } from 'src/engine/metadata-modules/field-metadata/types/relation-field-metadata-type.type';
import { type FlatFieldMetadata } from 'src/engine/metadata-modules/flat-field-metadata/types/flat-field-metadata.type';
import { findRelationFlatFieldMetadataTargetFlatFieldMetadataOrThrow } from 'src/engine/metadata-modules/flat-field-metadata/utils/find-relation-flat-field-metadatas-target-flat-field-metadata-or-throw.util';
import { isFlatFieldMetadataEntityOfType } from 'src/engine/metadata-modules/flat-field-metadata/utils/is-flat-field-metadata-of-type.util';
@@ -17,7 +18,7 @@ export type FindFlatFieldMetadatasRelatedToMorphRelationOrThrowArgs = {
export const findFlatFieldMetadatasRelatedToMorphRelationOrThrow = ({
flatObjectMetadataMaps,
flatFieldMetadata: morphRelationFlatFieldMetadata,
}: FindFlatFieldMetadatasRelatedToMorphRelationOrThrowArgs): FlatFieldMetadata[] => {
}: FindFlatFieldMetadatasRelatedToMorphRelationOrThrowArgs): FlatFieldMetadata<RelationFieldMetadataType>[] => {
const flatObjectMetadataWithFlatFieldMaps =
flatObjectMetadataMaps.byId[
morphRelationFlatFieldMetadata.objectMetadataId
@@ -1,24 +1,24 @@
import { type FieldMetadataType } from 'twenty-shared/types';
import { isDefined } from 'twenty-shared/utils';
import { FieldMetadataType } from 'twenty-shared/types';
import {
FieldMetadataException,
FieldMetadataExceptionCode,
} from 'src/engine/metadata-modules/field-metadata/field-metadata.exception';
import { type RelationFieldMetadataType } from 'src/engine/metadata-modules/field-metadata/types/relation-field-metadata-type.type';
import { type FlatFieldMetadata } from 'src/engine/metadata-modules/flat-field-metadata/types/flat-field-metadata.type';
import { isFlatFieldMetadataEntityOfType } from 'src/engine/metadata-modules/flat-field-metadata/utils/is-flat-field-metadata-of-type.util';
import { type FlatObjectMetadataMaps } from 'src/engine/metadata-modules/flat-object-metadata-maps/types/flat-object-metadata-maps.type';
export type GetRelationFlatFieldMetadatasUtilArgs = {
flatObjectMetadataMaps: FlatObjectMetadataMaps;
flatFieldMetadata: FlatFieldMetadata<
FieldMetadataType.RELATION | FieldMetadataType.MORPH_RELATION
>;
flatFieldMetadata: FlatFieldMetadata<RelationFieldMetadataType>;
};
// TODO prastoin handle morph relation
export const findRelationFlatFieldMetadataTargetFlatFieldMetadataOrThrow = ({
flatObjectMetadataMaps,
flatFieldMetadata,
}: GetRelationFlatFieldMetadatasUtilArgs): FlatFieldMetadata => {
}: GetRelationFlatFieldMetadatasUtilArgs): FlatFieldMetadata<FieldMetadataType.RELATION> => {
const { relationTargetFieldMetadataId, relationTargetObjectMetadataId } =
flatFieldMetadata;
@@ -41,5 +41,17 @@ export const findRelationFlatFieldMetadataTargetFlatFieldMetadataOrThrow = ({
);
}
if (
!isFlatFieldMetadataEntityOfType(
relatedFlatFieldMetadata,
FieldMetadataType.RELATION,
)
) {
throw new FieldMetadataException(
`Relation target field metadata is not a relation field metadata`,
FieldMetadataExceptionCode.FIELD_METADATA_RELATION_MALFORMED,
);
}
return relatedFlatFieldMetadata;
};
@@ -1,4 +1,3 @@
import { type FlatFieldMetadata } from 'src/engine/metadata-modules/flat-field-metadata/types/flat-field-metadata.type';
import {
findRelationFlatFieldMetadataTargetFlatFieldMetadataOrThrow,
type GetRelationFlatFieldMetadatasUtilArgs,
@@ -6,7 +5,11 @@ import {
export const findRelationFlatFieldMetadataTargetFlatFieldMetadata = (
args: GetRelationFlatFieldMetadatasUtilArgs,
): FlatFieldMetadata | undefined => {
):
| ReturnType<
typeof findRelationFlatFieldMetadataTargetFlatFieldMetadataOrThrow
>
| undefined => {
try {
return findRelationFlatFieldMetadataTargetFlatFieldMetadataOrThrow(args);
} catch {