Refactor morph field name and morph data loader (#14299)

# Introduction
Storing morph relation field names directly in database, using morphId
to aggregate them
Removing dynamic morph field metadata computation in schemas and data
loader

Will add integration tests on morph data loader entry

closes https://github.com/twentyhq/core-team-issues/issues/1425 
closes https://github.com/twentyhq/core-team-issues/issues/1424 
closes https://github.com/twentyhq/core-team-issues/issues/1423
This commit is contained in:
Paul Rastoin
2025-09-08 17:20:18 +02:00
committed by GitHub
parent 49ee73a16c
commit 9e81618773
54 changed files with 807 additions and 1019 deletions
@@ -6,11 +6,7 @@ import { getObjectPermissionsForObject } from '@/object-metadata/utils/getObject
import { type RecordGqlFields } from '@/object-record/graphql/types/RecordGqlFields';
import { isNonCompositeField } from '@/object-record/object-filter-dropdown/utils/isNonCompositeField';
import { type ObjectPermissions } from 'twenty-shared/types';
import {
computeMorphRelationFieldJoinColumnName,
computeMorphRelationFieldName,
isDefined,
} from 'twenty-shared/utils';
import { isDefined } from 'twenty-shared/utils';
import { type FieldMetadataItem } from '../types/FieldMetadataItem';
type MapFieldMetadataToGraphQLQueryArgs = {
@@ -44,6 +40,8 @@ export const mapFieldMetadataToGraphQLQuery = ({
return gqlField;
}
// We could factorize morph relation fields mapping to be passing through the RELATION handler too as now they share
// the same name and join column name logic
if (
fieldType === FieldMetadataType.MORPH_RELATION &&
(fieldMetadata.settings?.relationType === RelationType.ONE_TO_MANY ||
@@ -51,12 +49,7 @@ export const mapFieldMetadataToGraphQLQuery = ({
) {
let gqlMorphField = '';
for (const morphRelation of fieldMetadata.morphRelations ?? []) {
const relationFieldName = computeMorphRelationFieldName({
fieldName: fieldMetadata.name,
relationDirection: fieldMetadata.settings?.relationType,
nameSingular: morphRelation.targetObjectMetadata.nameSingular,
namePlural: morphRelation.targetObjectMetadata.namePlural,
});
const relationFieldName = morphRelation.sourceFieldMetadata.name;
const relationMetadataItem = objectMetadataItems.find(
(objectMetadataItem) =>
objectMetadataItem.id === morphRelation.targetObjectMetadata.id,
@@ -103,12 +96,7 @@ export const mapFieldMetadataToGraphQLQuery = ({
}
if (fieldMetadata.settings?.relationType === RelationType.MANY_TO_ONE) {
const joinColumnName = computeMorphRelationFieldJoinColumnName({
name: fieldMetadata.name,
targetObjectMetadataNameSingular:
morphRelation.targetObjectMetadata.nameSingular,
});
if (gqlField === joinColumnName) {
if (gqlField === fieldMetadata.settings?.joinColumnName) {
gqlMorphField += `${gqlField}
`;
continue;