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:
+5
-17
@@ -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;
|
||||
|
||||
+12
-21
@@ -5,7 +5,7 @@ import { shouldFieldBeQueried } from '@/object-metadata/utils/shouldFieldBeQueri
|
||||
import { type RecordGqlFields } from '@/object-record/graphql/types/RecordGqlFields';
|
||||
import { isRecordGqlFieldsNode } from '@/object-record/graphql/utils/isRecordGraphlFieldsNode';
|
||||
import { FieldMetadataType, type ObjectPermissions } from 'twenty-shared/types';
|
||||
import { computeMorphRelationFieldName, isDefined } from 'twenty-shared/utils';
|
||||
import { isDefined } from 'twenty-shared/utils';
|
||||
|
||||
type MapObjectMetadataToGraphQLQueryArgs = {
|
||||
objectMetadataItems: ObjectMetadataItem[];
|
||||
@@ -54,29 +54,25 @@ export const mapObjectMetadataToGraphQLQuery = ({
|
||||
.filter((field) => isDefined(field.settings?.joinColumnName));
|
||||
|
||||
const manyToOneRelationGqlFieldWithFieldMetadata =
|
||||
manyToOneRelationFields.flatMap((field) => {
|
||||
const isMorphRelation = field.type === FieldMetadataType.MORPH_RELATION;
|
||||
manyToOneRelationFields.flatMap((fieldMetadata) => {
|
||||
const isMorphRelation =
|
||||
fieldMetadata.type === FieldMetadataType.MORPH_RELATION;
|
||||
if (!isMorphRelation) {
|
||||
return {
|
||||
gqlField: field.settings?.joinColumnName,
|
||||
fieldMetadata: field,
|
||||
gqlField: fieldMetadata.settings?.joinColumnName,
|
||||
fieldMetadata: fieldMetadata,
|
||||
};
|
||||
}
|
||||
|
||||
if (!isDefined(field.morphRelations)) {
|
||||
if (!isDefined(fieldMetadata.morphRelations)) {
|
||||
throw new Error(
|
||||
`Field ${field.name} is missing, please refresh the page. If the problem persists, please contact support.`,
|
||||
`Field ${fieldMetadata.name} is missing, please refresh the page. If the problem persists, please contact support.`,
|
||||
);
|
||||
}
|
||||
|
||||
return field.morphRelations.map((morphRelation) => ({
|
||||
gqlField: computeMorphRelationFieldName({
|
||||
fieldName: field.name,
|
||||
relationDirection: morphRelation.type,
|
||||
nameSingular: morphRelation.targetObjectMetadata.nameSingular,
|
||||
namePlural: morphRelation.targetObjectMetadata.namePlural,
|
||||
}),
|
||||
fieldMetadata: field,
|
||||
return fieldMetadata.morphRelations.map((morphRelation) => ({
|
||||
gqlField: morphRelation.sourceFieldMetadata.name,
|
||||
fieldMetadata: fieldMetadata,
|
||||
}));
|
||||
});
|
||||
|
||||
@@ -103,12 +99,7 @@ export const mapObjectMetadataToGraphQLQuery = ({
|
||||
}
|
||||
|
||||
return fieldMetadata.morphRelations.map((morphRelation) => ({
|
||||
gqlField: computeMorphRelationFieldName({
|
||||
fieldName: fieldMetadata.name,
|
||||
relationDirection: morphRelation.type,
|
||||
nameSingular: morphRelation.targetObjectMetadata.nameSingular,
|
||||
namePlural: morphRelation.targetObjectMetadata.namePlural,
|
||||
}),
|
||||
gqlField: morphRelation.sourceFieldMetadata.name,
|
||||
fieldMetadata,
|
||||
}));
|
||||
});
|
||||
|
||||
Reference in New Issue
Block a user