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
@@ -3,7 +3,7 @@ import { FieldMetadataType } from 'twenty-shared/types';
import { type FlatFieldMetadata } from 'src/engine/metadata-modules/flat-field-metadata/types/flat-field-metadata.type';
import { findFlatFieldMetadatasRelatedToMorphRelationOrThrow } from 'src/engine/metadata-modules/flat-field-metadata/utils/find-flat-field-metadatas-related-to-morph-relation-or-throw.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 { 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';
export const computeFlatFieldMetadataRelatedFlatFieldMetadata = ({
@@ -14,10 +14,7 @@ export const computeFlatFieldMetadataRelatedFlatFieldMetadata = ({
flatObjectMetadataMaps: FlatObjectMetadataMaps;
}): FlatFieldMetadata[] => {
if (
isFlatFieldMetadataEntityOfType(
flatFieldMetadata,
FieldMetadataType.RELATION,
)
isFlatFieldMetadataOfType(flatFieldMetadata, FieldMetadataType.RELATION)
) {
return [
findRelationFlatFieldMetadataTargetFlatFieldMetadataOrThrow({
@@ -28,7 +25,7 @@ export const computeFlatFieldMetadataRelatedFlatFieldMetadata = ({
}
if (
isFlatFieldMetadataEntityOfType(
isFlatFieldMetadataOfType(
flatFieldMetadata,
FieldMetadataType.MORPH_RELATION,
)
@@ -4,7 +4,7 @@ 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 { 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';
import { isFlatFieldMetadataOfType } from 'src/engine/metadata-modules/flat-field-metadata/utils/is-flat-field-metadata-of-type.util';
import {
FlatObjectMetadataMapsException,
FlatObjectMetadataMapsExceptionCode,
@@ -47,7 +47,7 @@ export const findFlatFieldMetadatasRelatedToMorphRelationOrThrow = ({
return flatObjectMetadataWithFlatFieldMaps.flatFieldMetadatas.flatMap(
(flatFieldMetadata) => {
if (
!isFlatFieldMetadataEntityOfType(
!isFlatFieldMetadataOfType(
flatFieldMetadata,
FieldMetadataType.MORPH_RELATION,
) ||
@@ -1,4 +1,3 @@
import { FieldMetadataType } from 'twenty-shared/types';
import { isDefined } from 'twenty-shared/utils';
import {
@@ -7,7 +6,7 @@ import {
} from 'src/engine/metadata-modules/field-metadata/field-metadata.exception';
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 { isFlatFieldMetadataEntityOfType } from 'src/engine/metadata-modules/flat-field-metadata/utils/is-flat-field-metadata-of-type.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';
export type GetRelationFlatFieldMetadatasUtilArgs = {
@@ -18,7 +17,7 @@ export type GetRelationFlatFieldMetadatasUtilArgs = {
export const findRelationFlatFieldMetadataTargetFlatFieldMetadataOrThrow = ({
flatObjectMetadataMaps,
flatFieldMetadata,
}: GetRelationFlatFieldMetadatasUtilArgs): FlatFieldMetadata<FieldMetadataType.RELATION> => {
}: GetRelationFlatFieldMetadatasUtilArgs): FlatFieldMetadata<MorphOrRelationFieldMetadataType> => {
const { relationTargetFieldMetadataId, relationTargetObjectMetadataId } =
flatFieldMetadata;
@@ -41,14 +40,9 @@ export const findRelationFlatFieldMetadataTargetFlatFieldMetadataOrThrow = ({
);
}
if (
!isFlatFieldMetadataEntityOfType(
relatedFlatFieldMetadata,
FieldMetadataType.RELATION,
)
) {
if (!isMorphOrRelationFlatFieldMetadata(relatedFlatFieldMetadata)) {
throw new FieldMetadataException(
`Relation target field metadata is not a relation field metadata`,
`Relation target field metadata is not a relation or morph relation field metadata`,
FieldMetadataExceptionCode.FIELD_METADATA_RELATION_MALFORMED,
);
}
@@ -55,6 +55,7 @@ export const fromMorphRelationCreateFieldInputToFlatFieldMetadatas = async ({
await validateMorphRelationCreationPayload({
existingFlatObjectMetadataMaps,
morphRelationCreationPayload: rawMorphCreationPayload,
objectMetadataId: sourceFlatObjectMetadata.id,
});
if (morphRelationCreationPayloadValidation.status === 'fail') {
@@ -3,9 +3,9 @@ import {
type CompositeFieldMetadataType,
} from 'src/engine/metadata-modules/field-metadata/types/composite-field-metadata-type.type';
import { type FlatFieldMetadata } from 'src/engine/metadata-modules/flat-field-metadata/types/flat-field-metadata.type';
import { isFlatFieldMetadataEntityOfTypes } from 'src/engine/metadata-modules/flat-field-metadata/utils/is-flat-field-metadata-of-types.util';
import { isFlatFieldMetadataOfTypes } from 'src/engine/metadata-modules/flat-field-metadata/utils/is-flat-field-metadata-of-types.util';
export const isCompositeFlatFieldMetadata = (
flatFieldMetadata: FlatFieldMetadata,
): flatFieldMetadata is FlatFieldMetadata<CompositeFieldMetadataType> =>
isFlatFieldMetadataEntityOfTypes(flatFieldMetadata, COMPOSITE_FIELD_TYPES);
isFlatFieldMetadataOfTypes(flatFieldMetadata, COMPOSITE_FIELD_TYPES);
@@ -3,9 +3,9 @@ import {
type EnumFieldMetadataType,
} from 'src/engine/metadata-modules/field-metadata/types/enum-field-metadata-type.type';
import { type FlatFieldMetadata } from 'src/engine/metadata-modules/flat-field-metadata/types/flat-field-metadata.type';
import { isFlatFieldMetadataEntityOfTypes } from 'src/engine/metadata-modules/flat-field-metadata/utils/is-flat-field-metadata-of-types.util';
import { isFlatFieldMetadataOfTypes } from 'src/engine/metadata-modules/flat-field-metadata/utils/is-flat-field-metadata-of-types.util';
export const isEnumFlatFieldMetadata = (
flatFieldMetadata: FlatFieldMetadata,
): flatFieldMetadata is FlatFieldMetadata<EnumFieldMetadataType> =>
isFlatFieldMetadataEntityOfTypes(flatFieldMetadata, ENUM_FIELD_TYPES);
isFlatFieldMetadataOfTypes(flatFieldMetadata, ENUM_FIELD_TYPES);
@@ -2,7 +2,7 @@ import { FieldMetadataType } from 'twenty-shared/types';
import { FLAT_FIELD_METADATA_JSONB_PROPERTIES } from 'src/engine/metadata-modules/flat-field-metadata/constants/flat-field-metadata-jsonb-properties.constant';
import { type FlatFieldMetadata } from 'src/engine/metadata-modules/flat-field-metadata/types/flat-field-metadata.type';
import { isFlatFieldMetadataEntityOfTypes } from 'src/engine/metadata-modules/flat-field-metadata/utils/is-flat-field-metadata-of-types.util';
import { isFlatFieldMetadataOfTypes } from 'src/engine/metadata-modules/flat-field-metadata/utils/is-flat-field-metadata-of-types.util';
export const isFlatFieldMetadataJsonbProperty = ({
flatFieldMetadata,
@@ -12,7 +12,7 @@ export const isFlatFieldMetadataJsonbProperty = ({
property: keyof FlatFieldMetadata;
}): boolean => {
if (property === 'defaultValue') {
return isFlatFieldMetadataEntityOfTypes(flatFieldMetadata, [
return isFlatFieldMetadataOfTypes(flatFieldMetadata, [
FieldMetadataType.LINKS,
FieldMetadataType.PHONES,
FieldMetadataType.EMAILS,
@@ -2,7 +2,7 @@ import { type FieldMetadataType } from 'twenty-shared/types';
import { type FlatFieldMetadata } from 'src/engine/metadata-modules/flat-field-metadata/types/flat-field-metadata.type';
export function isFlatFieldMetadataEntityOfType<
export function isFlatFieldMetadataOfType<
Field extends FlatFieldMetadata<FieldMetadataType>,
Type extends FieldMetadataType,
>(
@@ -2,7 +2,7 @@ import { type FieldMetadataType } from 'twenty-shared/types';
import { type FlatFieldMetadata } from 'src/engine/metadata-modules/flat-field-metadata/types/flat-field-metadata.type';
export function isFlatFieldMetadataEntityOfTypes<
export function isFlatFieldMetadataOfTypes<
Field extends FlatFieldMetadata<FieldMetadataType>,
Types extends FieldMetadataType[],
>(
@@ -3,11 +3,11 @@ 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 { isFlatFieldMetadataEntityOfTypes } from 'src/engine/metadata-modules/flat-field-metadata/utils/is-flat-field-metadata-of-types.util';
import { isFlatFieldMetadataOfTypes } from 'src/engine/metadata-modules/flat-field-metadata/utils/is-flat-field-metadata-of-types.util';
export const isMorphOrRelationFlatFieldMetadata = (
flatFieldMetadata: FlatFieldMetadata,
): flatFieldMetadata is FlatFieldMetadata<MorphOrRelationFieldMetadataType> =>
isFlatFieldMetadataEntityOfTypes(flatFieldMetadata, [
isFlatFieldMetadataOfTypes(flatFieldMetadata, [
...MORPH_OR_RELATION_FIELD_TYPES,
]);