Failing morph relation creation v2 integration testing & fixes (#14253)

# Introduction
closes https://github.com/twentyhq/core-team-issues/issues/1408
This commit is contained in:
Paul Rastoin
2025-09-03 12:14:43 +02:00
committed by GitHub
parent 2e7fe238ed
commit 6522498df0
43 changed files with 4022 additions and 2730 deletions
@@ -1,6 +1,7 @@
import { FieldMetadataType } from 'twenty-shared/types';
import { isDefined } from 'twenty-shared/utils';
import { type MorphOrRelationFieldMetadataType } from 'src/engine/metadata-modules/field-metadata/types/morph-or-relation-field-metadata-type.type';
import { type FlatFieldMetadata } from 'src/engine/metadata-modules/flat-field-metadata/types/flat-field-metadata.type';
import { type FlatRelationTargetFieldMetadata } from 'src/engine/metadata-modules/flat-field-metadata/types/flat-relation-target-field-metadata.type';
import { fromObjectMetadataItemWithFieldMapsToFlatObjectMetadataWithoutFields } from 'src/engine/metadata-modules/flat-object-metadata/utils/from-object-metadata-item-with-field-maps-to-flat-object-metadata-without-fields.util';
@@ -12,10 +13,8 @@ import {
} from 'src/engine/metadata-modules/workspace-metadata-cache/exceptions/workspace-metadata-cache.exception';
import { isCachedFieldMetadataEntityOfType } from 'src/engine/utils/is-cached-field-metadata-of-type.util';
const fromCachedRelationFieldMetadataEntityToFlatRelationTargetFieldMetadata = <
T extends FieldMetadataType.RELATION | FieldMetadataType.MORPH_RELATION,
>(
cachedFieldMetadataEntity: CachedFieldMetadataEntity<T>,
const fromCachedRelationFieldMetadataEntityToFlatRelationTargetFieldMetadata = (
cachedFieldMetadataEntity: CachedFieldMetadataEntity<MorphOrRelationFieldMetadataType>,
): FlatRelationTargetFieldMetadata => {
return {
...cachedFieldMetadataEntity,
@@ -4,7 +4,8 @@ import {
} from 'twenty-shared/utils';
import { type FlatFieldMetadata } from 'src/engine/metadata-modules/flat-field-metadata/types/flat-field-metadata.type';
import { computeFlatFieldMetadataRelatedFlatFieldMetadata } from 'src/engine/metadata-modules/flat-field-metadata/utils/compute-flat-field-metadata-related-flat-field-metadata.util';
import { findRelationFlatFieldMetadataTargetFlatFieldMetadataOrThrow } from 'src/engine/metadata-modules/flat-field-metadata/utils/find-relation-flat-field-metadatas-target-flat-field-metadata-or-throw.util';
import { isMorphOrRelationFlatFieldMetadata } from 'src/engine/metadata-modules/flat-field-metadata/utils/is-morph-or-relation-flat-field-metadata.util';
import { type FlatObjectMetadataMaps } from 'src/engine/metadata-modules/flat-object-metadata-maps/types/flat-object-metadata-maps.type';
import { findFlatObjectMetadataInFlatObjectMetadataMaps } from 'src/engine/metadata-modules/flat-object-metadata-maps/utils/find-flat-object-metadata-in-flat-object-metadata-maps.util';
import { type FlatObjectMetadata } from 'src/engine/metadata-modules/flat-object-metadata/types/flat-object-metadata.type';
@@ -46,13 +47,17 @@ export const fromDeleteObjectInputToFlatFieldMetadatasToDelete = ({
const flatFieldMetadatasToDelete =
flatObjectMetadataToDelete.flatFieldMetadatas.flatMap(
(flatFieldMetadata) => {
const relatedFlatFieldMetadata =
computeFlatFieldMetadataRelatedFlatFieldMetadata({
flatFieldMetadata,
flatObjectMetadataMaps: existingFlatObjectMetadataMaps,
});
if (isMorphOrRelationFlatFieldMetadata(flatFieldMetadata)) {
const relationTargetFlatFieldMetadata =
findRelationFlatFieldMetadataTargetFlatFieldMetadataOrThrow({
flatFieldMetadata,
flatObjectMetadataMaps: existingFlatObjectMetadataMaps,
});
return [flatFieldMetadata, ...relatedFlatFieldMetadata];
return [flatFieldMetadata, relationTargetFlatFieldMetadata];
}
return [flatFieldMetadata];
},
);
@@ -3,7 +3,7 @@ import { FieldMetadataType } from 'twenty-shared/types';
import { RelationType } from 'src/engine/metadata-modules/field-metadata/interfaces/relation-type.interface';
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 { isFlatFieldMetadataOfType } 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';
import { findFlatFieldMetadataInFlatObjectMetadataMapsOrThrow } from 'src/engine/metadata-modules/flat-object-metadata-maps/utils/find-flat-field-metadata-in-flat-object-metadata-maps-or-throw.util';
import { type FlatObjectMetadata } from 'src/engine/metadata-modules/flat-object-metadata/types/flat-object-metadata.type';
@@ -23,13 +23,13 @@ export const getFlatObjectMetadataManyToOneTargetMorphRelationFlatFieldMetadatas
(
flatFieldMetadata,
): flatFieldMetadata is FlatFieldMetadata<FieldMetadataType.RELATION> =>
isFlatFieldMetadataEntityOfType(
isFlatFieldMetadataOfType(
flatFieldMetadata,
FieldMetadataType.RELATION,
) &&
flatFieldMetadata.settings.relationType ===
RelationType.MANY_TO_ONE &&
isFlatFieldMetadataEntityOfType(
isFlatFieldMetadataOfType(
flatFieldMetadata.flatRelationTargetFieldMetadata,
FieldMetadataType.MORPH_RELATION,
),