import { FieldMetadataType, compositeTypeDefinitions, } from 'twenty-shared/types'; import { capitalize } from 'twenty-shared/utils'; import { type CompositeFieldMetadataType } from 'src/engine/metadata-modules/field-metadata/types/composite-field-metadata-type.type'; import { isCompositeFieldMetadataType } from 'src/engine/metadata-modules/field-metadata/utils/is-composite-field-metadata-type.util'; import { type FlatEntityMaps } from 'src/engine/metadata-modules/flat-entity/types/flat-entity-maps.type'; import { findFlatEntityByIdInFlatEntityMaps } from 'src/engine/metadata-modules/flat-entity/utils/find-flat-entity-by-id-in-flat-entity-maps.util'; import { type FlatFieldMetadata } from 'src/engine/metadata-modules/flat-field-metadata/types/flat-field-metadata.type'; import { buildFieldMapsFromFlatObjectMetadata, type FieldMapsForObject, } from 'src/engine/metadata-modules/flat-field-metadata/utils/build-field-maps-from-flat-object-metadata.util'; import { type FlatObjectMetadata } from 'src/engine/metadata-modules/flat-object-metadata/types/flat-object-metadata.type'; export function formatData( data: T, flatObjectMetadata: FlatObjectMetadata, flatFieldMetadataMaps: FlatEntityMaps, fieldMapsForObject?: FieldMapsForObject, ): T { if (!data) { return data; } const fieldMaps = fieldMapsForObject ?? buildFieldMapsFromFlatObjectMetadata( flatFieldMetadataMaps, flatObjectMetadata, ); if (Array.isArray(data)) { return data.map((item) => formatData(item, flatObjectMetadata, flatFieldMetadataMaps, fieldMaps), ) as T; } const { fieldIdByName, fieldIdByJoinColumnName } = fieldMaps; // oxlint-disable-next-line typescript/no-explicit-any const newData: Record = {}; for (const [key, value] of Object.entries(data)) { const fieldMetadataId = fieldIdByName[key] || fieldIdByJoinColumnName[key]; const fieldMetadata = findFlatEntityByIdInFlatEntityMaps({ flatEntityId: fieldMetadataId, flatEntityMaps: flatFieldMetadataMaps, }); if (!fieldMetadata) { throw new Error( `Field metadata for field "${key}" is missing in object metadata ${flatObjectMetadata.nameSingular}`, ); } if (isCompositeFieldMetadataType(fieldMetadata.type)) { const formattedCompositeField = formatCompositeField( value, fieldMetadata, ); Object.assign(newData, formattedCompositeField); } else { newData[key] = formatFieldMetadataValue(value, fieldMetadata); } } return newData as T; } export function formatCompositeField( // oxlint-disable-next-line typescript/no-explicit-any value: any, fieldMetadata: FlatFieldMetadata, // oxlint-disable-next-line typescript/no-explicit-any ): Record { const compositeType = compositeTypeDefinitions.get( fieldMetadata.type as CompositeFieldMetadataType, ); if (!compositeType) { throw new Error( `Composite type definition not found for type: ${fieldMetadata.type}`, ); } // oxlint-disable-next-line typescript/no-explicit-any const formattedCompositeField: Record = {}; for (const property of compositeType.properties) { const subFieldKey = property.name; const fullFieldName = `${fieldMetadata.name}${capitalize(subFieldKey)}`; if (value && value[subFieldKey] !== undefined) { formattedCompositeField[fullFieldName] = formatFieldMetadataValue( value[subFieldKey], property as unknown as FlatFieldMetadata, ); } } return formattedCompositeField; } function formatFieldMetadataValue( // oxlint-disable-next-line typescript/no-explicit-any value: any, fieldMetadata: FlatFieldMetadata, ) { if ( fieldMetadata.type === FieldMetadataType.RAW_JSON && typeof value === 'string' ) { return JSON.parse(value as string); } return value; }