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:
+35
-4
@@ -1,8 +1,11 @@
|
||||
import { type FlatObjectMetadata } from 'src/engine/metadata-modules/flat-object-metadata/types/flat-object-metadata.type';
|
||||
import {
|
||||
type FlatObjectMetadataWithoutFields,
|
||||
type FlatObjectMetadata,
|
||||
} from 'src/engine/metadata-modules/flat-object-metadata/types/flat-object-metadata.type';
|
||||
import { type ObjectMetadataDTO } from 'src/engine/metadata-modules/object-metadata/dtos/object-metadata.dto';
|
||||
|
||||
export const fromFlatObjectMetadataToObjectMetadataDto = (
|
||||
flatObjectMetadata: FlatObjectMetadata,
|
||||
flatObjectMetadata: FlatObjectMetadata | FlatObjectMetadataWithoutFields,
|
||||
): ObjectMetadataDTO => {
|
||||
const {
|
||||
createdAt,
|
||||
@@ -12,11 +15,39 @@ export const fromFlatObjectMetadataToObjectMetadataDto = (
|
||||
standardOverrides,
|
||||
shortcut,
|
||||
duplicateCriteria,
|
||||
...rest
|
||||
id,
|
||||
isActive,
|
||||
isCustom,
|
||||
isLabelSyncedWithName,
|
||||
isRemote,
|
||||
isSearchable,
|
||||
isSystem,
|
||||
isUIReadOnly,
|
||||
labelPlural,
|
||||
labelSingular,
|
||||
namePlural,
|
||||
nameSingular,
|
||||
workspaceId,
|
||||
imageIdentifierFieldMetadataId,
|
||||
labelIdentifierFieldMetadataId,
|
||||
} = flatObjectMetadata;
|
||||
|
||||
return {
|
||||
...rest,
|
||||
id,
|
||||
isActive,
|
||||
isCustom,
|
||||
isLabelSyncedWithName,
|
||||
isRemote,
|
||||
isSearchable,
|
||||
isSystem,
|
||||
isUIReadOnly,
|
||||
labelPlural,
|
||||
labelSingular,
|
||||
namePlural,
|
||||
nameSingular,
|
||||
workspaceId,
|
||||
imageIdentifierFieldMetadataId,
|
||||
labelIdentifierFieldMetadataId,
|
||||
createdAt: new Date(createdAt),
|
||||
updatedAt: new Date(updatedAt),
|
||||
description: description ?? undefined,
|
||||
|
||||
+7
-9
@@ -10,7 +10,7 @@ import { findFlatObjectMetadataInFlatObjectMetadataMaps } from 'src/engine/metad
|
||||
import { FLAT_OBJECT_METADATA_PROPERTIES_TO_COMPARE } from 'src/engine/metadata-modules/flat-object-metadata/constants/flat-object-metadata-properties-to-compare.constant';
|
||||
import { type FlatObjectMetadataPropertiesToCompare } from 'src/engine/metadata-modules/flat-object-metadata/types/flat-object-metadata-properties-to-compare.type';
|
||||
import { type FlatObjectMetadata } from 'src/engine/metadata-modules/flat-object-metadata/types/flat-object-metadata.type';
|
||||
import { renameFlatObjectMetadataManyToOneMorphRelationTargetFlatFieldMetadatasSettingsJoinColumnName } from 'src/engine/metadata-modules/flat-object-metadata/utils/rename-flat-object-metadata-morph-relation-flat-field-metadatas-settings-join-column-name.util';
|
||||
import { renameRelatedMorphFieldOnObjectNamesUpdate } from 'src/engine/metadata-modules/flat-object-metadata/utils/rename-related-morph-field-on-object-names-update.util';
|
||||
import { OBJECT_METADATA_STANDARD_OVERRIDES_PROPERTIES } from 'src/engine/metadata-modules/object-metadata/constants/object-metadata-standard-overrides-properties.constant';
|
||||
import { type UpdateOneObjectInput } from 'src/engine/metadata-modules/object-metadata/dtos/update-object.input';
|
||||
import {
|
||||
@@ -130,14 +130,12 @@ export const fromUpdateObjectInputToFlatObjectMetadata = ({
|
||||
[property]: updatedPropertyValue,
|
||||
};
|
||||
const newUpdatedOtherObjectFlatFieldMetadatas =
|
||||
property === 'nameSingular'
|
||||
? renameFlatObjectMetadataManyToOneMorphRelationTargetFlatFieldMetadatasSettingsJoinColumnName(
|
||||
{
|
||||
existingFlatObjectMetadataMaps,
|
||||
fromFlatObjectMetadata: updatedFlatObjectMetadata,
|
||||
toFlatObjectMetadata: updatedFlatObjectMetadata,
|
||||
},
|
||||
)
|
||||
property === 'nameSingular' || property === 'namePlural'
|
||||
? renameRelatedMorphFieldOnObjectNamesUpdate({
|
||||
existingFlatObjectMetadataMaps,
|
||||
fromFlatObjectMetadata: updatedFlatObjectMetadata,
|
||||
toFlatObjectMetadata: updatedFlatObjectMetadata,
|
||||
})
|
||||
: [];
|
||||
|
||||
return {
|
||||
|
||||
+3
-7
@@ -1,22 +1,20 @@
|
||||
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 { 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';
|
||||
|
||||
type GetFlatObjectMetadataMorphRelationFlatFieldMetadatasArgs = {
|
||||
type GetFlatObjectMetadataTargetMorphRelationFlatFieldMetadatasOrThrowArgs = {
|
||||
flatObjectMetadata: FlatObjectMetadata;
|
||||
existingFlatObjectMetadataMaps: FlatObjectMetadataMaps;
|
||||
};
|
||||
export const getFlatObjectMetadataManyToOneTargetMorphRelationFlatFieldMetadatasOrThrow =
|
||||
export const getFlatObjectMetadataTargetMorphRelationFlatFieldMetadatasOrThrow =
|
||||
({
|
||||
flatObjectMetadata,
|
||||
existingFlatObjectMetadataMaps,
|
||||
}: GetFlatObjectMetadataMorphRelationFlatFieldMetadatasArgs) => {
|
||||
}: GetFlatObjectMetadataTargetMorphRelationFlatFieldMetadatasOrThrowArgs): FlatFieldMetadata<FieldMetadataType.MORPH_RELATION>[] => {
|
||||
const manyToOneMorphRelationTargetFlatFieldMetadataIds =
|
||||
flatObjectMetadata.flatFieldMetadatas
|
||||
.filter(
|
||||
@@ -27,8 +25,6 @@ export const getFlatObjectMetadataManyToOneTargetMorphRelationFlatFieldMetadatas
|
||||
flatFieldMetadata,
|
||||
FieldMetadataType.RELATION,
|
||||
) &&
|
||||
flatFieldMetadata.settings.relationType ===
|
||||
RelationType.MANY_TO_ONE &&
|
||||
isFlatFieldMetadataOfType(
|
||||
flatFieldMetadata.flatRelationTargetFieldMetadata,
|
||||
FieldMetadataType.MORPH_RELATION,
|
||||
|
||||
-46
@@ -1,46 +0,0 @@
|
||||
import { type FieldMetadataType, type FromTo } from 'twenty-shared/types';
|
||||
import { computeMorphRelationFieldJoinColumnName } from 'twenty-shared/utils';
|
||||
|
||||
import { type FlatFieldMetadata } from 'src/engine/metadata-modules/flat-field-metadata/types/flat-field-metadata.type';
|
||||
import { type FlatObjectMetadataMaps } from 'src/engine/metadata-modules/flat-object-metadata-maps/types/flat-object-metadata-maps.type';
|
||||
import { type FlatObjectMetadata } from 'src/engine/metadata-modules/flat-object-metadata/types/flat-object-metadata.type';
|
||||
import { getFlatObjectMetadataManyToOneTargetMorphRelationFlatFieldMetadatasOrThrow } from 'src/engine/metadata-modules/flat-object-metadata/utils/get-flat-object-metadata-many-to-one-target-morph-relation-flat-field-metadatas-or-throw.util';
|
||||
|
||||
type RenameFlatObjectMetadataManyToOneMorphRelationTargetFlatFieldMetadatasSettingsJoinColumnNameArgs =
|
||||
FromTo<FlatObjectMetadata, 'flatObjectMetadata'> & {
|
||||
existingFlatObjectMetadataMaps: FlatObjectMetadataMaps;
|
||||
};
|
||||
export const renameFlatObjectMetadataManyToOneMorphRelationTargetFlatFieldMetadatasSettingsJoinColumnName =
|
||||
({
|
||||
fromFlatObjectMetadata,
|
||||
toFlatObjectMetadata,
|
||||
existingFlatObjectMetadataMaps,
|
||||
}: RenameFlatObjectMetadataManyToOneMorphRelationTargetFlatFieldMetadatasSettingsJoinColumnNameArgs): FlatFieldMetadata<FieldMetadataType.MORPH_RELATION>[] => {
|
||||
const manyToOneMorphRelationFlatFieldMetadatas =
|
||||
getFlatObjectMetadataManyToOneTargetMorphRelationFlatFieldMetadatasOrThrow(
|
||||
{
|
||||
flatObjectMetadata: fromFlatObjectMetadata,
|
||||
existingFlatObjectMetadataMaps,
|
||||
},
|
||||
);
|
||||
|
||||
const updatedFlatFieldMetadatas =
|
||||
manyToOneMorphRelationFlatFieldMetadatas.map(
|
||||
(morphRelationFlatFieldMetadata) => {
|
||||
const newJoinColumnName = computeMorphRelationFieldJoinColumnName({
|
||||
name: morphRelationFlatFieldMetadata.name,
|
||||
targetObjectMetadataNameSingular: toFlatObjectMetadata.nameSingular,
|
||||
});
|
||||
|
||||
return {
|
||||
...morphRelationFlatFieldMetadata,
|
||||
settings: {
|
||||
...morphRelationFlatFieldMetadata.settings,
|
||||
joinColumnName: newJoinColumnName,
|
||||
},
|
||||
};
|
||||
},
|
||||
);
|
||||
|
||||
return updatedFlatFieldMetadatas;
|
||||
};
|
||||
+87
@@ -0,0 +1,87 @@
|
||||
import {
|
||||
RelationType,
|
||||
type FieldMetadataType,
|
||||
type FromTo,
|
||||
} from 'twenty-shared/types';
|
||||
|
||||
import { computeMorphOrRelationFieldJoinColumnName } from 'src/engine/metadata-modules/field-metadata/utils/compute-morph-or-relation-field-join-column-name.util';
|
||||
import { computeMorphRelationFieldName } from 'src/engine/metadata-modules/field-metadata/utils/compute-morph-relation-field-name.util';
|
||||
import { type FlatFieldMetadata } from 'src/engine/metadata-modules/flat-field-metadata/types/flat-field-metadata.type';
|
||||
import { type FlatObjectMetadataMaps } from 'src/engine/metadata-modules/flat-object-metadata-maps/types/flat-object-metadata-maps.type';
|
||||
import { type FlatObjectMetadata } from 'src/engine/metadata-modules/flat-object-metadata/types/flat-object-metadata.type';
|
||||
import { getFlatObjectMetadataTargetMorphRelationFlatFieldMetadatasOrThrow } from 'src/engine/metadata-modules/flat-object-metadata/utils/get-flat-object-metadata-many-to-one-target-morph-relation-flat-field-metadatas-or-throw.util';
|
||||
|
||||
const searchAndReplaceLast = ({
|
||||
replace,
|
||||
search,
|
||||
source,
|
||||
}: {
|
||||
source: string;
|
||||
search: string;
|
||||
replace: string;
|
||||
}) => {
|
||||
const lastIndex = source.lastIndexOf(search);
|
||||
|
||||
if (lastIndex === -1) return source;
|
||||
|
||||
return (
|
||||
source.slice(0, lastIndex) +
|
||||
replace +
|
||||
source.slice(lastIndex + search.length)
|
||||
);
|
||||
};
|
||||
|
||||
type RenameRelatedMorphFieldOnObjectNamesUpdateArgs = FromTo<
|
||||
FlatObjectMetadata,
|
||||
'flatObjectMetadata'
|
||||
> & {
|
||||
existingFlatObjectMetadataMaps: FlatObjectMetadataMaps;
|
||||
};
|
||||
export const renameRelatedMorphFieldOnObjectNamesUpdate = ({
|
||||
fromFlatObjectMetadata,
|
||||
existingFlatObjectMetadataMaps,
|
||||
toFlatObjectMetadata,
|
||||
}: RenameRelatedMorphFieldOnObjectNamesUpdateArgs): FlatFieldMetadata<FieldMetadataType.MORPH_RELATION>[] => {
|
||||
const manyToOneMorphRelationFlatFieldMetadatas =
|
||||
getFlatObjectMetadataTargetMorphRelationFlatFieldMetadatasOrThrow({
|
||||
flatObjectMetadata: fromFlatObjectMetadata,
|
||||
existingFlatObjectMetadataMaps,
|
||||
});
|
||||
|
||||
const updatedFlatFieldMetadatas =
|
||||
manyToOneMorphRelationFlatFieldMetadatas.map(
|
||||
(morphRelationFlatFieldMetadata) => {
|
||||
const isManyToOneRelationType =
|
||||
morphRelationFlatFieldMetadata.settings.relationType ===
|
||||
RelationType.MANY_TO_ONE;
|
||||
const initialMorphRelationFieldName = searchAndReplaceLast({
|
||||
source: morphRelationFlatFieldMetadata.name,
|
||||
replace: '',
|
||||
search: isManyToOneRelationType
|
||||
? fromFlatObjectMetadata.nameSingular
|
||||
: fromFlatObjectMetadata.namePlural,
|
||||
});
|
||||
const newMorphFieldName = computeMorphRelationFieldName({
|
||||
fieldName: initialMorphRelationFieldName,
|
||||
relationType: morphRelationFlatFieldMetadata.settings.relationType,
|
||||
targetObjectMetadata: toFlatObjectMetadata,
|
||||
});
|
||||
const newJoinColumnName = isManyToOneRelationType
|
||||
? computeMorphOrRelationFieldJoinColumnName({
|
||||
name: newMorphFieldName,
|
||||
})
|
||||
: undefined;
|
||||
|
||||
return {
|
||||
...morphRelationFlatFieldMetadata,
|
||||
name: newMorphFieldName,
|
||||
settings: {
|
||||
...morphRelationFlatFieldMetadata.settings,
|
||||
joinColumnName: newJoinColumnName,
|
||||
},
|
||||
};
|
||||
},
|
||||
);
|
||||
|
||||
return updatedFlatFieldMetadatas;
|
||||
};
|
||||
Reference in New Issue
Block a user