Deprecate object metadata maps in favor of flat entities (#16080)

## Context
Deprecating the old objectMetadataMap type in favour of split flat
entities to match with our new caching.
In the long run, trying to achieve:
- Better performance through caching
- Consistent data access patterns across the codebase
- Reduced database queries

Now that everything is based on flat entities, which are cached, we can
finish the refactoring of workspace context cache which should already
improve performances.
Then the last step will be to consume that new cache in the new global
datasource to get rid of the many workspace datasources stored in the
server
This commit is contained in:
Weiko
2025-11-27 13:43:34 +01:00
committed by GitHub
parent 978c0acb90
commit 1607aebcc6
281 changed files with 6510 additions and 6627 deletions
@@ -1,4 +1,7 @@
import { type ObjectsPermissions } from 'twenty-shared/types';
import {
FieldMetadataType,
type ObjectsPermissions,
} from 'twenty-shared/types';
import {
type DeepPartial,
type FindManyOptions,
@@ -12,6 +15,7 @@ import { type FeatureFlagMap } from 'src/engine/core-modules/feature-flag/interf
import { type WorkspaceInternalContext } from 'src/engine/twenty-orm/interfaces/workspace-internal-context.interface';
import { FeatureFlagKey } from 'src/engine/core-modules/feature-flag/enums/feature-flag-key.enum';
import { type FlatFieldMetadata } from 'src/engine/metadata-modules/flat-field-metadata/types/flat-field-metadata.type';
import { type WorkspaceEntityManager } from 'src/engine/twenty-orm/entity-manager/workspace-entity-manager';
import { WorkspaceRepository } from 'src/engine/twenty-orm/repository/workspace.repository';
@@ -57,13 +61,64 @@ describe('WorkspaceRepository', () => {
clear: jest.fn(),
} as unknown as jest.Mocked<WorkspaceEntityManager>;
const mockFieldMetadata: FlatFieldMetadata = {
id: 'test-field-id',
name: 'id',
type: FieldMetadataType.UUID,
objectMetadataId: 'test-metadata-id',
isActive: true,
isNullable: false,
isUnique: true,
isSystem: true,
isCustom: false,
isUIReadOnly: false,
isLabelSyncedWithName: false,
label: 'ID',
description: 'Record ID',
icon: 'IconKey',
workspaceId: 'test-workspace-id',
universalIdentifier: 'id-field-universal-id',
createdAt: new Date(),
updatedAt: new Date(),
defaultValue: null,
options: null,
settings: null,
morphId: null,
standardId: null,
standardOverrides: null,
applicationId: null,
relationTargetFieldMetadataId: null,
relationTargetObjectMetadataId: null,
calendarViewIds: [],
viewFilterIds: [],
viewGroupIds: [],
kanbanAggregateOperationViewIds: [],
viewFieldIds: [],
};
mockInternalContext = {
workspaceId: 'test-workspace-id',
objectMetadataMaps: {
idByNameSingular: {},
flatObjectMetadataMaps: {
byId: {},
idByUniversalIdentifier: {},
universalIdentifiersByApplicationId: {},
},
flatFieldMetadataMaps: {
byId: {
'test-field-id': mockFieldMetadata,
},
idByUniversalIdentifier: {},
universalIdentifiersByApplicationId: {},
},
flatIndexMaps: {
byId: {},
idByUniversalIdentifier: {},
universalIdentifiersByApplicationId: {},
},
objectIdByNameSingular: {},
featureFlagsMap: {},
} as WorkspaceInternalContext;
eventEmitterService: {} as unknown,
} as unknown as WorkspaceInternalContext;
mockFeatureFlagMap = Object.values(FeatureFlagKey).reduce(
(acc, key) => ({ ...acc, [key]: false }),
@@ -97,6 +152,7 @@ describe('WorkspaceRepository', () => {
id: 'test-metadata-id',
nameSingular: 'test-entity',
namePlural: 'test-entities',
fieldMetadataIds: ['test-field-id'],
fieldIdByName: {
id: 'test-field-id',
},
@@ -9,12 +9,14 @@ import { type QueryExpressionMap } from 'typeorm/query-builder/QueryExpressionMa
import { ProcessAggregateHelper } from 'src/engine/api/graphql/graphql-query-runner/helpers/process-aggregate.helper';
import { InternalServerError } from 'src/engine/core-modules/graphql/utils/graphql-errors.util';
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 { type FlatObjectMetadata } from 'src/engine/metadata-modules/flat-object-metadata/types/flat-object-metadata.type';
import {
PermissionsException,
PermissionsExceptionCode,
PermissionsExceptionMessage,
} from 'src/engine/metadata-modules/permissions/permissions.exception';
import { type ObjectMetadataMaps } from 'src/engine/metadata-modules/types/object-metadata-maps';
import { getColumnNameToFieldMetadataIdMap } from 'src/engine/twenty-orm/utils/get-column-name-to-field-metadata-id.util';
const getTargetEntityAndOperationType = (
@@ -66,7 +68,9 @@ type ValidateOperationIsPermittedOrThrowArgs = {
entityName: string;
operationType: OperationType;
objectsPermissions: ObjectsPermissions;
objectMetadataMaps: ObjectMetadataMaps;
flatObjectMetadataMaps: FlatEntityMaps<FlatObjectMetadata>;
flatFieldMetadataMaps: FlatEntityMaps<FlatFieldMetadata>;
objectIdByNameSingular: Record<string, string>;
selectedColumns: string[] | '*';
allFieldsSelected: boolean;
updatedColumns: string[];
@@ -76,13 +80,14 @@ export const validateOperationIsPermittedOrThrow = ({
entityName,
operationType,
objectsPermissions,
objectMetadataMaps,
flatObjectMetadataMaps,
flatFieldMetadataMaps,
objectIdByNameSingular,
selectedColumns,
allFieldsSelected,
updatedColumns,
}: ValidateOperationIsPermittedOrThrowArgs) => {
const objectMetadataIdForEntity =
objectMetadataMaps.idByNameSingular[entityName];
const objectMetadataIdForEntity = objectIdByNameSingular[entityName];
if (!isNonEmptyString(objectMetadataIdForEntity)) {
throw new PermissionsException(
@@ -91,7 +96,7 @@ export const validateOperationIsPermittedOrThrow = ({
);
}
const objectMetadata = objectMetadataMaps.byId[objectMetadataIdForEntity];
const objectMetadata = flatObjectMetadataMaps.byId[objectMetadataIdForEntity];
if (!isDefined(objectMetadata)) {
throw new PermissionsException(
@@ -106,8 +111,10 @@ export const validateOperationIsPermittedOrThrow = ({
return;
}
const columnNameToFieldMetadataIdMap =
getColumnNameToFieldMetadataIdMap(objectMetadata);
const columnNameToFieldMetadataIdMap = getColumnNameToFieldMetadataIdMap(
objectMetadata,
flatFieldMetadataMaps,
);
const permissionsForEntity = objectsPermissions[objectMetadataIdForEntity];
@@ -194,14 +201,18 @@ export const validateOperationIsPermittedOrThrow = ({
type ValidateQueryIsPermittedOrThrowArgs = {
expressionMap: QueryExpressionMap;
objectsPermissions: ObjectsPermissions;
objectMetadataMaps: ObjectMetadataMaps;
flatObjectMetadataMaps: FlatEntityMaps<FlatObjectMetadata>;
flatFieldMetadataMaps: FlatEntityMaps<FlatFieldMetadata>;
objectIdByNameSingular: Record<string, string>;
shouldBypassPermissionChecks: boolean;
};
export const validateQueryIsPermittedOrThrow = ({
expressionMap,
objectsPermissions,
objectMetadataMaps,
flatObjectMetadataMaps,
flatFieldMetadataMaps,
objectIdByNameSingular,
shouldBypassPermissionChecks,
}: ValidateQueryIsPermittedOrThrowArgs) => {
if (shouldBypassPermissionChecks) {
@@ -222,7 +233,9 @@ export const validateQueryIsPermittedOrThrow = ({
validatePermissionsForJoinsAndReturnSelectsWithoutJoins({
expressionMap,
objectsPermissions,
objectMetadataMaps,
flatObjectMetadataMaps,
flatFieldMetadataMaps,
objectIdByNameSingular,
});
expressionMapSelectsOnMainEntity = selectsWithoutJoinedAliases;
@@ -266,7 +279,9 @@ export const validateQueryIsPermittedOrThrow = ({
entityName: mainEntity,
operationType: operationType as OperationType,
objectsPermissions,
objectMetadataMaps,
flatObjectMetadataMaps,
flatFieldMetadataMaps,
objectIdByNameSingular,
selectedColumns,
allFieldsSelected,
updatedColumns,
@@ -276,11 +291,15 @@ export const validateQueryIsPermittedOrThrow = ({
const validatePermissionsForJoinsAndReturnSelectsWithoutJoins = ({
expressionMap,
objectsPermissions,
objectMetadataMaps,
flatObjectMetadataMaps,
flatFieldMetadataMaps,
objectIdByNameSingular,
}: {
expressionMap: QueryExpressionMap;
objectsPermissions: ObjectsPermissions;
objectMetadataMaps: ObjectMetadataMaps;
flatObjectMetadataMaps: FlatEntityMaps<FlatObjectMetadata>;
flatFieldMetadataMaps: FlatEntityMaps<FlatFieldMetadata>;
objectIdByNameSingular: Record<string, string>;
}) => {
const joinAttributesAliases = new Set(
expressionMap.joinAttributes.map((join) => join.alias.name),
@@ -313,7 +332,9 @@ const validatePermissionsForJoinsAndReturnSelectsWithoutJoins = ({
entityName: entity.name,
operationType: 'select' as OperationType,
objectsPermissions,
objectMetadataMaps,
flatObjectMetadataMaps,
flatFieldMetadataMaps,
objectIdByNameSingular,
selectedColumns,
allFieldsSelected: false,
updatedColumns: [],
@@ -72,7 +72,9 @@ export class WorkspaceDeleteQueryBuilder<
validateQueryIsPermittedOrThrow({
expressionMap: this.expressionMap,
objectsPermissions: this.objectRecordsPermissions,
objectMetadataMaps: this.internalContext.objectMetadataMaps,
flatObjectMetadataMaps: this.internalContext.flatObjectMetadataMaps,
flatFieldMetadataMaps: this.internalContext.flatFieldMetadataMaps,
objectIdByNameSingular: this.internalContext.objectIdByNameSingular,
shouldBypassPermissionChecks: this.shouldBypassPermissionChecks,
});
@@ -110,19 +112,22 @@ export class WorkspaceDeleteQueryBuilder<
const formattedResult = formatResult<T[]>(
result.raw,
objectMetadata,
this.internalContext.objectMetadataMaps,
this.internalContext.flatObjectMetadataMaps,
this.internalContext.flatFieldMetadataMaps,
);
const formattedBefore = formatResult<T[]>(
before,
objectMetadata,
this.internalContext.objectMetadataMaps,
this.internalContext.flatObjectMetadataMaps,
this.internalContext.flatFieldMetadataMaps,
);
this.internalContext.eventEmitterService.emitDatabaseBatchEvent(
formatTwentyOrmEventToDatabaseBatchEvent({
action: DatabaseEventAction.DESTROYED,
objectMetadataItem: objectMetadata,
flatFieldMetadataMaps: this.internalContext.flatFieldMetadataMaps,
workspaceId: this.internalContext.workspaceId,
entities: formattedBefore,
authContext: this.authContext,
@@ -95,7 +95,11 @@ export class WorkspaceInsertQueryBuilder<
this.internalContext,
);
const formattedValues = formatData(values, objectMetadata);
const formattedValues = formatData(
values,
objectMetadata,
this.internalContext.flatFieldMetadataMaps,
);
return super.values(formattedValues);
}
@@ -105,7 +109,9 @@ export class WorkspaceInsertQueryBuilder<
validateQueryIsPermittedOrThrow({
expressionMap: this.expressionMap,
objectsPermissions: this.objectRecordsPermissions,
objectMetadataMaps: this.internalContext.objectMetadataMaps,
flatObjectMetadataMaps: this.internalContext.flatObjectMetadataMaps,
flatFieldMetadataMaps: this.internalContext.flatFieldMetadataMaps,
objectIdByNameSingular: this.internalContext.objectIdByNameSingular,
shouldBypassPermissionChecks: this.shouldBypassPermissionChecks,
});
@@ -159,13 +165,15 @@ export class WorkspaceInsertQueryBuilder<
const formattedResultForEvent = formatResult<T[]>(
afterResult,
objectMetadata,
this.internalContext.objectMetadataMaps,
this.internalContext.flatObjectMetadataMaps,
this.internalContext.flatFieldMetadataMaps,
);
this.internalContext.eventEmitterService.emitDatabaseBatchEvent(
formatTwentyOrmEventToDatabaseBatchEvent({
action: DatabaseEventAction.CREATED,
objectMetadataItem: objectMetadata,
flatFieldMetadataMaps: this.internalContext.flatFieldMetadataMaps,
workspaceId: this.internalContext.workspaceId,
entities: formattedResultForEvent,
authContext: this.authContext,
@@ -176,6 +184,7 @@ export class WorkspaceInsertQueryBuilder<
formatTwentyOrmEventToDatabaseBatchEvent({
action: DatabaseEventAction.UPSERTED,
objectMetadataItem: objectMetadata,
flatFieldMetadataMaps: this.internalContext.flatFieldMetadataMaps,
workspaceId: this.internalContext.workspaceId,
entities: formattedResultForEvent,
authContext: this.authContext,
@@ -202,7 +211,8 @@ export class WorkspaceInsertQueryBuilder<
const formattedResult = formatResult<T[]>(
resultWithoutInsertionExtraColumns,
objectMetadata,
this.internalContext.objectMetadataMaps,
this.internalContext.flatObjectMetadataMaps,
this.internalContext.flatFieldMetadataMaps,
);
return {
@@ -85,7 +85,8 @@ export class WorkspaceSelectQueryBuilder<
const formattedResult = formatResult<T[]>(
result,
objectMetadata,
this.internalContext.objectMetadataMaps,
this.internalContext.flatObjectMetadataMaps,
this.internalContext.flatFieldMetadataMaps,
);
return {
@@ -114,7 +115,8 @@ export class WorkspaceSelectQueryBuilder<
const formattedResult = formatResult<T[]>(
result,
objectMetadata,
this.internalContext.objectMetadataMaps,
this.internalContext.flatObjectMetadataMaps,
this.internalContext.flatFieldMetadataMaps,
);
return formattedResult;
@@ -163,7 +165,8 @@ export class WorkspaceSelectQueryBuilder<
const formattedResult = formatResult<T>(
result,
objectMetadata,
this.internalContext.objectMetadataMaps,
this.internalContext.flatObjectMetadataMaps,
this.internalContext.flatFieldMetadataMaps,
);
return formattedResult;
@@ -188,7 +191,8 @@ export class WorkspaceSelectQueryBuilder<
const formattedResult = formatResult<T>(
result,
objectMetadata,
this.internalContext.objectMetadataMaps,
this.internalContext.flatObjectMetadataMaps,
this.internalContext.flatFieldMetadataMaps,
);
return formattedResult[0];
@@ -230,7 +234,8 @@ export class WorkspaceSelectQueryBuilder<
const formattedResult = formatResult<T[]>(
result,
objectMetadata,
this.internalContext.objectMetadataMaps,
this.internalContext.flatObjectMetadataMaps,
this.internalContext.flatFieldMetadataMaps,
);
return [formattedResult, count];
@@ -325,7 +330,9 @@ export class WorkspaceSelectQueryBuilder<
validateQueryIsPermittedOrThrow({
expressionMap: this.expressionMap,
objectsPermissions: this.objectRecordsPermissions,
objectMetadataMaps: this.internalContext.objectMetadataMaps,
flatObjectMetadataMaps: this.internalContext.flatObjectMetadataMaps,
flatFieldMetadataMaps: this.internalContext.flatFieldMetadataMaps,
objectIdByNameSingular: this.internalContext.objectIdByNameSingular,
shouldBypassPermissionChecks: this.shouldBypassPermissionChecks,
});
}
@@ -72,7 +72,9 @@ export class WorkspaceSoftDeleteQueryBuilder<
validateQueryIsPermittedOrThrow({
expressionMap: this.expressionMap,
objectsPermissions: this.objectRecordsPermissions,
objectMetadataMaps: this.internalContext.objectMetadataMaps,
flatObjectMetadataMaps: this.internalContext.flatObjectMetadataMaps,
flatFieldMetadataMaps: this.internalContext.flatFieldMetadataMaps,
objectIdByNameSingular: this.internalContext.objectIdByNameSingular,
shouldBypassPermissionChecks: this.shouldBypassPermissionChecks,
});
@@ -110,19 +112,22 @@ export class WorkspaceSoftDeleteQueryBuilder<
const formattedAfter = formatResult<T[]>(
after.raw,
objectMetadata,
this.internalContext.objectMetadataMaps,
this.internalContext.flatObjectMetadataMaps,
this.internalContext.flatFieldMetadataMaps,
);
const formattedBefore = formatResult<T[]>(
before,
objectMetadata,
this.internalContext.objectMetadataMaps,
this.internalContext.flatObjectMetadataMaps,
this.internalContext.flatFieldMetadataMaps,
);
this.internalContext.eventEmitterService.emitDatabaseBatchEvent(
formatTwentyOrmEventToDatabaseBatchEvent({
action: DatabaseEventAction.DELETED,
objectMetadataItem: objectMetadata,
flatFieldMetadataMaps: this.internalContext.flatFieldMetadataMaps,
workspaceId: this.internalContext.workspaceId,
entities: formattedBefore,
authContext: this.authContext,
@@ -95,7 +95,9 @@ export class WorkspaceUpdateQueryBuilder<
validateQueryIsPermittedOrThrow({
expressionMap: this.expressionMap,
objectsPermissions: this.objectRecordsPermissions,
objectMetadataMaps: this.internalContext.objectMetadataMaps,
flatObjectMetadataMaps: this.internalContext.flatObjectMetadataMaps,
flatFieldMetadataMaps: this.internalContext.flatFieldMetadataMaps,
objectIdByNameSingular: this.internalContext.objectIdByNameSingular,
shouldBypassPermissionChecks: this.shouldBypassPermissionChecks,
});
@@ -164,7 +166,8 @@ export class WorkspaceUpdateQueryBuilder<
const formattedBefore = formatResult<T[]>(
before,
objectMetadata,
this.internalContext.objectMetadataMaps,
this.internalContext.flatObjectMetadataMaps,
this.internalContext.flatFieldMetadataMaps,
);
const result = await super.execute();
@@ -174,13 +177,15 @@ export class WorkspaceUpdateQueryBuilder<
const formattedAfter = formatResult<T[]>(
after,
objectMetadata,
this.internalContext.objectMetadataMaps,
this.internalContext.flatObjectMetadataMaps,
this.internalContext.flatFieldMetadataMaps,
);
this.internalContext.eventEmitterService.emitDatabaseBatchEvent(
formatTwentyOrmEventToDatabaseBatchEvent({
action: DatabaseEventAction.UPDATED,
objectMetadataItem: objectMetadata,
flatFieldMetadataMaps: this.internalContext.flatFieldMetadataMaps,
workspaceId: this.internalContext.workspaceId,
entities: formattedAfter,
beforeEntities: formattedBefore,
@@ -192,6 +197,7 @@ export class WorkspaceUpdateQueryBuilder<
formatTwentyOrmEventToDatabaseBatchEvent({
action: DatabaseEventAction.UPSERTED,
objectMetadataItem: objectMetadata,
flatFieldMetadataMaps: this.internalContext.flatFieldMetadataMaps,
workspaceId: this.internalContext.workspaceId,
entities: formattedAfter,
beforeEntities: formattedBefore,
@@ -202,7 +208,8 @@ export class WorkspaceUpdateQueryBuilder<
const formattedResult = formatResult<T[]>(
result.raw,
objectMetadata,
this.internalContext.objectMetadataMaps,
this.internalContext.flatObjectMetadataMaps,
this.internalContext.flatFieldMetadataMaps,
);
return {
@@ -235,7 +242,9 @@ export class WorkspaceUpdateQueryBuilder<
validateQueryIsPermittedOrThrow({
expressionMap: fakeExpressionMapToValidatePermissions,
objectsPermissions: this.objectRecordsPermissions,
objectMetadataMaps: this.internalContext.objectMetadataMaps,
flatObjectMetadataMaps: this.internalContext.flatObjectMetadataMaps,
flatFieldMetadataMaps: this.internalContext.flatFieldMetadataMaps,
objectIdByNameSingular: this.internalContext.objectIdByNameSingular,
shouldBypassPermissionChecks: this.shouldBypassPermissionChecks,
});
}
@@ -265,7 +274,8 @@ export class WorkspaceUpdateQueryBuilder<
const formattedBefore = formatResult<T[]>(
beforeRecords,
objectMetadata,
this.internalContext.objectMetadataMaps,
this.internalContext.flatObjectMetadataMaps,
this.internalContext.flatFieldMetadataMaps,
);
const results: UpdateResult[] = [];
@@ -317,13 +327,15 @@ export class WorkspaceUpdateQueryBuilder<
const formattedAfter = formatResult<T[]>(
afterRecords,
objectMetadata,
this.internalContext.objectMetadataMaps,
this.internalContext.flatObjectMetadataMaps,
this.internalContext.flatFieldMetadataMaps,
);
this.internalContext.eventEmitterService.emitDatabaseBatchEvent(
formatTwentyOrmEventToDatabaseBatchEvent({
action: DatabaseEventAction.UPDATED,
objectMetadataItem: objectMetadata,
flatFieldMetadataMaps: this.internalContext.flatFieldMetadataMaps,
workspaceId: this.internalContext.workspaceId,
entities: formattedAfter,
beforeEntities: formattedBefore,
@@ -335,6 +347,7 @@ export class WorkspaceUpdateQueryBuilder<
formatTwentyOrmEventToDatabaseBatchEvent({
action: DatabaseEventAction.UPSERTED,
objectMetadataItem: objectMetadata,
flatFieldMetadataMaps: this.internalContext.flatFieldMetadataMaps,
workspaceId: this.internalContext.workspaceId,
entities: formattedAfter,
beforeEntities: formattedBefore,
@@ -345,7 +358,8 @@ export class WorkspaceUpdateQueryBuilder<
const formattedResults = formatResult<T[]>(
results.flatMap((result) => result.raw),
objectMetadata,
this.internalContext.objectMetadataMaps,
this.internalContext.flatObjectMetadataMaps,
this.internalContext.flatFieldMetadataMaps,
);
return {
@@ -395,7 +409,11 @@ export class WorkspaceUpdateQueryBuilder<
mainAliasTarget,
);
const formattedUpdateSet = formatData(_values, objectMetadata);
const formattedUpdateSet = formatData(
_values,
objectMetadata,
this.internalContext.flatFieldMetadataMaps,
);
return super.set(formattedUpdateSet as QueryDeepPartialEntity<T>);
}
@@ -456,7 +474,11 @@ export class WorkspaceUpdateQueryBuilder<
this.manyInputs = inputs.map((input) => ({
criteria: input.criteria,
partialEntity: formatData(input.partialEntity, objectMetadata),
partialEntity: formatData(
input.partialEntity,
objectMetadata,
this.internalContext.flatFieldMetadataMaps,
),
}));
return this;
@@ -37,13 +37,17 @@ import { getObjectMetadataFromEntityTarget } from 'src/engine/twenty-orm/utils/g
export class WorkspaceRepository<
T extends ObjectLiteral,
> extends Repository<T> {
private readonly internalContext: WorkspaceInternalContext;
private readonly _internalContext: WorkspaceInternalContext;
private shouldBypassPermissionChecks: boolean;
private featureFlagMap: FeatureFlagMap;
public readonly objectRecordsPermissions?: ObjectsPermissions;
private authContext?: AuthContext;
declare manager: WorkspaceEntityManager;
get internalContext(): WorkspaceInternalContext {
return this._internalContext;
}
constructor(
internalContext: WorkspaceInternalContext,
target: EntityTarget<T>,
@@ -55,7 +59,7 @@ export class WorkspaceRepository<
authContext?: AuthContext,
) {
super(target, manager, queryRunner);
this.internalContext = internalContext;
this._internalContext = internalContext;
this.featureFlagMap = featureFlagMap;
this.objectRecordsPermissions = objectRecordsPermissions;
this.shouldBypassPermissionChecks = shouldBypassPermissionChecks;
@@ -79,7 +83,7 @@ export class WorkspaceRepository<
return new WorkspaceSelectQueryBuilder(
queryBuilder,
this.objectRecordsPermissions,
this.internalContext,
this._internalContext,
this.shouldBypassPermissionChecks,
this.authContext ?? {},
this.featureFlagMap,
@@ -944,7 +948,10 @@ export class WorkspaceRepository<
* PRIVATE METHODS
*/
private async getObjectMetadataFromTarget() {
return getObjectMetadataFromEntityTarget(this.target, this.internalContext);
return getObjectMetadataFromEntityTarget(
this.target,
this._internalContext,
);
}
private async transformOptions<
@@ -968,6 +975,10 @@ export class WorkspaceRepository<
private async formatData<T>(data: T): Promise<T> {
const objectMetadata = await this.getObjectMetadataFromTarget();
return formatData(data, objectMetadata) as T;
return formatData(
data,
objectMetadata,
this._internalContext.flatFieldMetadataMaps,
) as T;
}
}