morph fix for release 1.4 (#14029)

DataLoader Specific update du to Morph relations that have many rows

Fixes https://github.com/twentyhq/twenty/issues/14018
This commit is contained in:
Guillim
2025-08-21 16:43:14 +02:00
committed by GitHub
parent 707043c3ba
commit 35df56e7d8
3 changed files with 41 additions and 6 deletions
@@ -250,7 +250,9 @@ export class DataloaderService {
});
});
return filterMorphRelationDuplicateFieldsDTO(fields);
return filterMorphRelationDuplicateFieldsDTO<FieldMetadataDTO>(
fields,
);
});
return fieldMetadataCollection;
@@ -1,7 +1,7 @@
import { type FieldMetadataDTO } from 'src/engine/metadata-modules/field-metadata/dtos/field-metadata.dto';
export const filterMorphRelationDuplicateFieldsDTO = (
fields: FieldMetadataDTO[],
export const filterMorphRelationDuplicateFieldsDTO = <
T extends { name: string; id: string },
>(
fields: T[],
) => {
return fields.filter((currentField) => {
return !fields.some(
@@ -10,6 +10,7 @@ import { v4 } from 'uuid';
import { type FieldMetadataSettings } from 'src/engine/metadata-modules/field-metadata/interfaces/field-metadata-settings.interface';
import { RelationType } from 'src/engine/metadata-modules/field-metadata/interfaces/relation-type.interface';
import { filterMorphRelationDuplicateFieldsDTO } from 'src/engine/dataloaders/utils/filter-morph-relation-duplicate-fields.util';
import { type CreateFieldInput } from 'src/engine/metadata-modules/field-metadata/dtos/create-field.input';
import { type UpdateFieldInput } from 'src/engine/metadata-modules/field-metadata/dtos/update-field.input';
import { type FieldMetadataEntity } from 'src/engine/metadata-modules/field-metadata/field-metadata.entity';
@@ -18,6 +19,7 @@ import {
FieldMetadataExceptionCode,
} from 'src/engine/metadata-modules/field-metadata/field-metadata.exception';
import { computeRelationFieldJoinColumnName } from 'src/engine/metadata-modules/field-metadata/utils/compute-relation-field-join-column-name.util';
import { isFieldMetadataTypeMorphRelation } from 'src/engine/metadata-modules/field-metadata/utils/is-field-metadata-type-morph-relation.util';
import { prepareCustomFieldMetadataForCreation } from 'src/engine/metadata-modules/field-metadata/utils/prepare-field-metadata-for-creation.util';
import { validateRelationCreationPayloadOrThrow } from 'src/engine/metadata-modules/field-metadata/utils/validate-relation-creation-payload-or-throw.util';
import { type ObjectMetadataEntity } from 'src/engine/metadata-modules/object-metadata/object-metadata.entity';
@@ -272,6 +274,37 @@ export class FieldMetadataRelationService {
);
}
// Morph relation specific:
// to keep the fieldMetadata API simple
// we decided to override the targetFieldMetadata with the existing one
// in case the relation target is a morph relation
const isRelationTargetMorphRelation =
isFieldMetadataTypeMorphRelation(targetFieldMetadata);
const targetObjectMetadataFields = Object.values(
targetObjectMetadata.fieldsById,
);
const targetObjectMetadataWithoutDuplicates =
filterMorphRelationDuplicateFieldsDTO<FieldMetadataEntity>(
targetObjectMetadataFields,
);
const targetFieldMetadataSelected =
targetObjectMetadataWithoutDuplicates.find(
(fieldMetadata) => fieldMetadata.name === targetFieldMetadata.name,
);
if (!isDefined(targetFieldMetadataSelected)) {
throw new FieldMetadataException(
`Target field metadata not found for field metadata ${id}`,
FieldMetadataExceptionCode.FIELD_METADATA_RELATION_MALFORMED,
);
}
const targetFieldMetadataOverride = isRelationTargetMorphRelation
? targetFieldMetadataSelected
: targetFieldMetadata;
return {
sourceObjectMetadata:
getObjectMetadataFromObjectMetadataItemWithFieldMaps(
@@ -282,7 +315,7 @@ export class FieldMetadataRelationService {
getObjectMetadataFromObjectMetadataItemWithFieldMaps(
targetObjectMetadata,
) as ObjectMetadataEntity,
targetFieldMetadata: targetFieldMetadata as FieldMetadataEntity,
targetFieldMetadata: targetFieldMetadataOverride as FieldMetadataEntity,
};
});
}