Migrate metadata cache (#16030)

## Context
Deprecating legacy ObjectMetadata from cache in favor of flat entities.
Introducing utils to build byName/byNameSingular/byNamePlural in
isolated cases

## Next
- I had to introduce a util to build from flat to legacy
objectMetadataMaps, we should instead use flat maps directly when needed
(datasource, schema generation, etc)
- Deprecate metadata version in the cache
- Use the new cache strategy for flat entities with permissions and
feature flags and inject in the global datasource context
This commit is contained in:
Weiko
2025-11-24 19:50:47 +01:00
committed by GitHub
parent 26e2fe349f
commit 04562b11fb
49 changed files with 764 additions and 598 deletions
@@ -0,0 +1,45 @@
import { isDefined } from 'twenty-shared/utils';
import { type FlatEntityMaps } from 'src/engine/metadata-modules/flat-entity/types/flat-entity-maps.type';
import { type FlatFieldMetadata } from 'src/engine/metadata-modules/flat-field-metadata/types/flat-field-metadata.type';
import { isMorphOrRelationFlatFieldMetadata } from 'src/engine/metadata-modules/flat-field-metadata/utils/is-morph-or-relation-flat-field-metadata.util';
export type FieldMapsForObject = {
fieldIdByName: Record<string, string>;
fieldIdByJoinColumnName: Record<string, string>;
};
export const buildFieldMapsForObject = (
flatFieldMetadataMaps: FlatEntityMaps<FlatFieldMetadata>,
objectMetadataId: string,
): FieldMapsForObject => {
const fieldIdByName: Record<string, string> = {};
const fieldIdByJoinColumnName: Record<string, string> = {};
for (const [fieldId, field] of Object.entries(flatFieldMetadataMaps.byId)) {
if (!isDefined(field)) {
continue;
}
if (field.objectMetadataId !== objectMetadataId) {
continue;
}
fieldIdByName[field.name] = fieldId;
if (isMorphOrRelationFlatFieldMetadata(field)) {
const joinColumnName = (
field.settings as { joinColumnName?: string } | undefined
)?.joinColumnName;
if (joinColumnName) {
fieldIdByJoinColumnName[joinColumnName] = fieldId;
}
}
}
return {
fieldIdByName,
fieldIdByJoinColumnName,
};
};