FlatObjectMetadataMaps and non FP style refactor (#13590)

# Introduction
- Retrieveing flat-object-metadata-maps for input transpilation, we
decided not to introduce map merge for remaining validation operation
for the moment
- Refactored the field metadata service v2 to sequentially
optimistically render on each iteration
This commit is contained in:
Paul Rastoin
2025-08-05 10:46:28 +02:00
committed by GitHub
parent ca9464e19d
commit 6af99ab1ea
14 changed files with 316 additions and 94 deletions
@@ -1,7 +1,7 @@
import { isDefined } from 'twenty-shared/utils';
import { fromArrayToValuesByKeyRecord, isDefined } from 'twenty-shared/utils';
import { FlatFieldMetadata } from 'src/engine/metadata-modules/flat-field-metadata/types/flat-field-metadata.type';
import { mergeTwoFlatFieldMetadatas } from 'src/engine/metadata-modules/flat-field-metadata/utils/merge-two-flat-field-metadatas.util';
import { mergeFlatFieldMetadatasInFlatObjectMetadata } from 'src/engine/metadata-modules/flat-field-metadata/utils/merge-flat-field-metadatas-in-flat-object-metadata.util';
import { FlatObjectMetadata } from 'src/engine/metadata-modules/flat-object-metadata/types/flat-object-metadata.type';
type DispatchAndMergeFlatFieldMetadatasInFlatObjectMetadatasArgs = {
@@ -12,23 +12,15 @@ export const dispatchAndMergeFlatFieldMetadatasInFlatObjectMetadatas = ({
flatFieldMetadatas,
flatObjectMetadatas,
}: DispatchAndMergeFlatFieldMetadatasInFlatObjectMetadatasArgs): FlatObjectMetadata[] => {
const initialAccumulator: Record<string, FlatFieldMetadata[]> = {};
if (flatFieldMetadatas.length === 0) {
return flatObjectMetadatas;
}
const flatFieldMetadataGroupedByFlatObjectMetadataId =
flatFieldMetadatas.reduce((acc, flatFieldMetadata) => {
const { objectMetadataId } = flatFieldMetadata;
const occurrence = acc[objectMetadataId];
if (isDefined(occurrence)) {
return {
...acc,
[objectMetadataId]: [...occurrence, flatFieldMetadata],
};
}
return {
[flatFieldMetadata.objectMetadataId]: [flatFieldMetadata],
};
}, initialAccumulator);
fromArrayToValuesByKeyRecord({
array: flatFieldMetadatas,
key: 'objectMetadataId',
});
return flatObjectMetadatas.map((flatObjectMetadata) => {
const toMergeFlatFieldMetadatas =
@@ -38,12 +30,9 @@ export const dispatchAndMergeFlatFieldMetadatasInFlatObjectMetadatas = ({
return flatObjectMetadata;
}
return {
...flatObjectMetadata,
flatFieldMetadatas: mergeTwoFlatFieldMetadatas({
destFlatFieldMetadatas: flatObjectMetadata.flatFieldMetadatas,
toMergeFlatFieldMetadatas,
}),
};
return mergeFlatFieldMetadatasInFlatObjectMetadata({
flatFieldMetadatas: toMergeFlatFieldMetadatas,
flatObjectMetadata,
});
});
};
@@ -0,0 +1,14 @@
import { removePropertiesFromRecord } from 'twenty-shared/utils';
import { FlatObjectMetadataWithFlatFieldMaps } from 'src/engine/metadata-modules/flat-object-metadata-maps/types/flat-object-metadata-with-flat-field-metadata-maps.type';
import { FlatObjectMetadata } from 'src/engine/metadata-modules/flat-object-metadata/types/flat-object-metadata.type';
export const fromFlatObjectMetadataWithFlatFieldMapsToFlatObjectMetadata = (
flatObjectMetadataWithFlatFieldMaps: FlatObjectMetadataWithFlatFieldMaps,
): FlatObjectMetadata => {
return removePropertiesFromRecord(flatObjectMetadataWithFlatFieldMaps, [
'fieldsById',
'fieldIdByName',
'fieldIdByJoinColumnName',
]);
};
@@ -3,30 +3,16 @@ import { isDefined } from 'twenty-shared/utils';
import { FlatObjectMetadata } from 'src/engine/metadata-modules/flat-object-metadata/types/flat-object-metadata.type';
import { fromObjectMetadataItemWithFieldMapsToFlatObjectMetadata } from 'src/engine/metadata-modules/flat-object-metadata/utils/from-object-metadata-item-with-field-maps-to-flat-object-metadata.util';
import { ObjectMetadataMaps } from 'src/engine/metadata-modules/types/object-metadata-maps';
import {
WorkspaceMetadataCacheException,
WorkspaceMetadataCacheExceptionCode,
} from 'src/engine/metadata-modules/workspace-metadata-cache/exceptions/workspace-metadata-cache.exception';
export const fromObjectMetadataMapsToFlatObjectMetadatas = (
objectMetadataMaps: ObjectMetadataMaps,
): FlatObjectMetadata[] => {
const objectMetadataIds = Object.keys(objectMetadataMaps.byId);
return objectMetadataIds.flatMap<FlatObjectMetadata>((objectMetadataId) => {
const objectMetadataItemWithFieldMaps =
objectMetadataMaps.byId[objectMetadataId];
if (!isDefined(objectMetadataItemWithFieldMaps)) {
throw new WorkspaceMetadataCacheException(
'Object metadata not found in cache',
WorkspaceMetadataCacheExceptionCode.OBJECT_METADATA_MAP_NOT_FOUND,
);
}
return fromObjectMetadataItemWithFieldMapsToFlatObjectMetadata({
objectMetadataItemWithFieldMaps,
objectMetadataMaps,
});
});
return Object.values(objectMetadataMaps.byId)
.filter(isDefined)
.map((objectMetadataItemWithFieldMaps) =>
fromObjectMetadataItemWithFieldMapsToFlatObjectMetadata({
objectMetadataItemWithFieldMaps,
objectMetadataMaps,
}),
);
};