Refactor flat entity maps to be universal oriented (#17665)
# Introduction
In preparation of the workspace agnostic builder, we're migrating
`FlatEntityMaps` to be universal identifier oriented and based
As in the builder context there're won't be any ids at all
Please also note that the FlatEntity is a UniversalFlatEntity superset
From
```ts
import { type SyncableFlatEntity } from 'src/engine/metadata-modules/flat-entity/types/flat-entity-from.type';
export type FlatEntityMaps<T extends SyncableFlatEntity> = {
byId: Partial<Record<string, T>>;
idByUniversalIdentifier: Partial<Record<string, string>>;
universalIdentifiersByApplicationId: Partial<Record<string, string[]>>;
};
```
To
```ts
export type FlatEntityMaps<
T extends SyncableFlatEntity | UniversalSyncableFlatEntity,
> = {
byUniversalIdentifier: Partial<Record<string, T>>;
universalIdentifierById: Partial<Record<string, string>>;
universalIdentifiersByApplicationId: Partial<Record<string, string[]>>; // this might make more sense to be migrated to universalIdentifiersByApplicationUniversalIdentifier but it's the main topic of this PR
};
```
## Low level maps tools
Had to refactor find | create | delete | replace | find-many | get-sub
tools ( through mutations and or throw equivalent )
This commit is contained in:
+10
-10
@@ -179,20 +179,20 @@ describe('WorkspaceEntityManager', () => {
|
||||
};
|
||||
|
||||
const flatObjectMetadataMaps: FlatEntityMaps<FlatObjectMetadata> = {
|
||||
byId: {
|
||||
byUniversalIdentifier: {
|
||||
'test-entity-id': mockFlatObjectMetadata,
|
||||
},
|
||||
idByUniversalIdentifier: {
|
||||
universalIdentifierById: {
|
||||
'test-entity-id': 'test-entity-id',
|
||||
},
|
||||
universalIdentifiersByApplicationId: {},
|
||||
};
|
||||
|
||||
const flatFieldMetadataMaps: FlatEntityMaps<FlatFieldMetadata> = {
|
||||
byId: {
|
||||
byUniversalIdentifier: {
|
||||
'field-id': mockFlatFieldMetadata,
|
||||
},
|
||||
idByUniversalIdentifier: {
|
||||
universalIdentifierById: {
|
||||
'field-id': 'field-id',
|
||||
},
|
||||
universalIdentifiersByApplicationId: {},
|
||||
@@ -203,18 +203,18 @@ describe('WorkspaceEntityManager', () => {
|
||||
flatObjectMetadataMaps,
|
||||
flatFieldMetadataMaps,
|
||||
flatIndexMaps: {
|
||||
byId: {},
|
||||
idByUniversalIdentifier: {},
|
||||
byUniversalIdentifier: {},
|
||||
universalIdentifierById: {},
|
||||
universalIdentifiersByApplicationId: {},
|
||||
},
|
||||
flatRowLevelPermissionPredicateMaps: {
|
||||
byId: {},
|
||||
idByUniversalIdentifier: {},
|
||||
byUniversalIdentifier: {},
|
||||
universalIdentifierById: {},
|
||||
universalIdentifiersByApplicationId: {},
|
||||
},
|
||||
flatRowLevelPermissionPredicateGroupMaps: {
|
||||
byId: {},
|
||||
idByUniversalIdentifier: {},
|
||||
byUniversalIdentifier: {},
|
||||
universalIdentifierById: {},
|
||||
universalIdentifiersByApplicationId: {},
|
||||
},
|
||||
objectIdByNameSingular: {
|
||||
|
||||
+6
-3
@@ -36,10 +36,11 @@ import { InstanceChecker } from 'typeorm/util/InstanceChecker';
|
||||
import { type FeatureFlagMap } from 'src/engine/core-modules/feature-flag/interfaces/feature-flag-map.interface';
|
||||
import { type WorkspaceInternalContext } from 'src/engine/twenty-orm/interfaces/workspace-internal-context.interface';
|
||||
|
||||
import { type WorkspaceAuthContext } from 'src/engine/core-modules/auth/types/workspace-auth-context.type';
|
||||
import { DatabaseEventAction } from 'src/engine/api/graphql/graphql-query-runner/enums/database-event-action';
|
||||
import { type AuthContext } from 'src/engine/core-modules/auth/types/auth-context.type';
|
||||
import { type WorkspaceAuthContext } from 'src/engine/core-modules/auth/types/workspace-auth-context.type';
|
||||
import { InternalServerError } from 'src/engine/core-modules/graphql/utils/graphql-errors.util';
|
||||
import { findFlatEntityByIdInFlatEntityMaps } from 'src/engine/metadata-modules/flat-entity/utils/find-flat-entity-by-id-in-flat-entity-maps.util';
|
||||
import { type FlatObjectMetadata } from 'src/engine/metadata-modules/flat-object-metadata/types/flat-object-metadata.type';
|
||||
import {
|
||||
PermissionsException,
|
||||
@@ -1390,8 +1391,10 @@ export class WorkspaceEntityManager extends EntityManager {
|
||||
Object.entries(restrictedFields)
|
||||
.filter(([_, fieldPermissions]) => fieldPermissions.canRead === false)
|
||||
.map(([fieldMetadataId]) => {
|
||||
const fieldMetadata =
|
||||
this.internalContext.flatFieldMetadataMaps.byId[fieldMetadataId];
|
||||
const fieldMetadata = findFlatEntityByIdInFlatEntityMaps({
|
||||
flatEntityId: fieldMetadataId,
|
||||
flatEntityMaps: this.internalContext.flatFieldMetadataMaps,
|
||||
});
|
||||
|
||||
if (!isDefined(fieldMetadata)) {
|
||||
throw new InternalServerError(
|
||||
|
||||
+5
-2
@@ -19,6 +19,7 @@ import { type WorkspaceInternalContext } from 'src/engine/twenty-orm/interfaces/
|
||||
import { STANDARD_ERROR_MESSAGE } from 'src/engine/api/common/common-query-runners/errors/standard-error-message.constant';
|
||||
import { getFlatFieldsFromFlatObjectMetadata } from 'src/engine/api/graphql/workspace-schema-builder/utils/get-flat-fields-for-flat-object-metadata.util';
|
||||
import { FileEntity } from 'src/engine/core-modules/file/entities/file.entity';
|
||||
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 {
|
||||
TwentyORMException,
|
||||
@@ -597,8 +598,10 @@ export class FilesFieldSync {
|
||||
}
|
||||
|
||||
private getFilesFields(objectMetadataId: string): FlatFieldMetadata[] {
|
||||
const objectMetadata =
|
||||
this.internalContext.flatObjectMetadataMaps.byId[objectMetadataId];
|
||||
const objectMetadata = findFlatEntityByIdInFlatEntityMaps({
|
||||
flatEntityId: objectMetadataId,
|
||||
flatEntityMaps: this.internalContext.flatObjectMetadataMaps,
|
||||
});
|
||||
|
||||
if (!objectMetadata) {
|
||||
return [];
|
||||
|
||||
+13
-11
@@ -111,30 +111,32 @@ describe('WorkspaceRepository', () => {
|
||||
mockInternalContext = {
|
||||
workspaceId: 'test-workspace-id',
|
||||
flatObjectMetadataMaps: {
|
||||
byId: {},
|
||||
idByUniversalIdentifier: {},
|
||||
byUniversalIdentifier: {},
|
||||
universalIdentifierById: {},
|
||||
universalIdentifiersByApplicationId: {},
|
||||
},
|
||||
flatFieldMetadataMaps: {
|
||||
byId: {
|
||||
'test-field-id': mockFieldMetadata,
|
||||
byUniversalIdentifier: {
|
||||
'id-field-universal-id': mockFieldMetadata,
|
||||
},
|
||||
universalIdentifierById: {
|
||||
'test-field-id': 'id-field-universal-id',
|
||||
},
|
||||
idByUniversalIdentifier: {},
|
||||
universalIdentifiersByApplicationId: {},
|
||||
},
|
||||
flatIndexMaps: {
|
||||
byId: {},
|
||||
idByUniversalIdentifier: {},
|
||||
byUniversalIdentifier: {},
|
||||
universalIdentifierById: {},
|
||||
universalIdentifiersByApplicationId: {},
|
||||
},
|
||||
flatRowLevelPermissionPredicateMaps: {
|
||||
byId: {},
|
||||
idByUniversalIdentifier: {},
|
||||
byUniversalIdentifier: {},
|
||||
universalIdentifierById: {},
|
||||
universalIdentifiersByApplicationId: {},
|
||||
},
|
||||
flatRowLevelPermissionPredicateGroupMaps: {
|
||||
byId: {},
|
||||
idByUniversalIdentifier: {},
|
||||
byUniversalIdentifier: {},
|
||||
universalIdentifierById: {},
|
||||
universalIdentifiersByApplicationId: {},
|
||||
},
|
||||
objectIdByNameSingular: {},
|
||||
|
||||
@@ -10,6 +10,7 @@ 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 { 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 { type FlatObjectMetadata } from 'src/engine/metadata-modules/flat-object-metadata/types/flat-object-metadata.type';
|
||||
import {
|
||||
@@ -96,7 +97,10 @@ export const validateOperationIsPermittedOrThrow = ({
|
||||
);
|
||||
}
|
||||
|
||||
const objectMetadata = flatObjectMetadataMaps.byId[objectMetadataIdForEntity];
|
||||
const objectMetadata = findFlatEntityByIdInFlatEntityMaps({
|
||||
flatEntityId: objectMetadataIdForEntity,
|
||||
flatEntityMaps: flatObjectMetadataMaps,
|
||||
});
|
||||
|
||||
if (!isDefined(objectMetadata)) {
|
||||
throw new PermissionsException(
|
||||
|
||||
+8
-8
@@ -183,17 +183,17 @@ describe('computeRelationConnectQueryConfigs', () => {
|
||||
const allFields = [...personFields, ...companyFields];
|
||||
|
||||
const flatFieldMetadataMaps: FlatEntityMaps<FlatFieldMetadata> = {
|
||||
byId: allFields.reduce(
|
||||
byUniversalIdentifier: allFields.reduce(
|
||||
(acc, field) => {
|
||||
acc[field.id] = field;
|
||||
acc[field.universalIdentifier] = field;
|
||||
|
||||
return acc;
|
||||
},
|
||||
{} as Record<string, FlatFieldMetadata>,
|
||||
),
|
||||
idByUniversalIdentifier: allFields.reduce(
|
||||
universalIdentifierById: allFields.reduce(
|
||||
(acc, field) => {
|
||||
acc[field.universalIdentifier] = field.id;
|
||||
acc[field.id] = field.universalIdentifier;
|
||||
|
||||
return acc;
|
||||
},
|
||||
@@ -258,11 +258,11 @@ describe('computeRelationConnectQueryConfigs', () => {
|
||||
});
|
||||
|
||||
const flatObjectMetadataMaps: FlatEntityMaps<FlatObjectMetadata> = {
|
||||
byId: {
|
||||
byUniversalIdentifier: {
|
||||
'person-object-metadata-id': personMetadata,
|
||||
'company-object-metadata-id': companyMetadata,
|
||||
},
|
||||
idByUniversalIdentifier: {
|
||||
universalIdentifierById: {
|
||||
'person-object-metadata-id': 'person-object-metadata-id',
|
||||
'company-object-metadata-id': 'company-object-metadata-id',
|
||||
},
|
||||
@@ -284,7 +284,7 @@ describe('computeRelationConnectQueryConfigs', () => {
|
||||
});
|
||||
|
||||
const flatIndexMaps: FlatEntityMaps<FlatIndexMetadata> = {
|
||||
byId: {
|
||||
byUniversalIdentifier: {
|
||||
'company-id-index-metadata-id': {
|
||||
id: 'company-id-index-metadata-id',
|
||||
name: 'company-id-index-metadata-name',
|
||||
@@ -337,7 +337,7 @@ describe('computeRelationConnectQueryConfigs', () => {
|
||||
],
|
||||
} as unknown as FlatIndexMetadata,
|
||||
},
|
||||
idByUniversalIdentifier: {
|
||||
universalIdentifierById: {
|
||||
'company-id-index-metadata-id': 'company-id-index-metadata-id',
|
||||
'company-domain-index-metadata-id': 'company-domain-index-metadata-id',
|
||||
'company-composite-index-metadata-id':
|
||||
|
||||
+2
-2
@@ -48,10 +48,10 @@ describe('formatTwentyOrmEventToDatabaseBatchEvent', () => {
|
||||
});
|
||||
|
||||
const flatFieldMetadataMaps: FlatEntityMaps<FlatFieldMetadata> = {
|
||||
byId: {
|
||||
byUniversalIdentifier: {
|
||||
'name-id': nameField,
|
||||
},
|
||||
idByUniversalIdentifier: {
|
||||
universalIdentifierById: {
|
||||
'name-id': 'name-id',
|
||||
},
|
||||
universalIdentifiersByApplicationId: {},
|
||||
|
||||
+4
-4
@@ -75,17 +75,17 @@ describe('getColumnNameToFieldMetadataIdMap', () => {
|
||||
const buildFlatFieldMetadataMaps = (
|
||||
fields: FlatFieldMetadata[],
|
||||
): FlatEntityMaps<FlatFieldMetadata> => ({
|
||||
byId: fields.reduce(
|
||||
byUniversalIdentifier: fields.reduce(
|
||||
(acc, field) => {
|
||||
acc[field.id] = field;
|
||||
acc[field.universalIdentifier] = field;
|
||||
|
||||
return acc;
|
||||
},
|
||||
{} as Record<string, FlatFieldMetadata>,
|
||||
),
|
||||
idByUniversalIdentifier: fields.reduce(
|
||||
universalIdentifierById: fields.reduce(
|
||||
(acc, field) => {
|
||||
acc[field.universalIdentifier] = field.id;
|
||||
acc[field.id] = field.universalIdentifier;
|
||||
|
||||
return acc;
|
||||
},
|
||||
|
||||
+4
-4
@@ -73,17 +73,17 @@ describe('getFieldMetadataIdToColumnNamesMap', () => {
|
||||
const buildFlatFieldMetadataMaps = (
|
||||
fields: FlatFieldMetadata[],
|
||||
): FlatEntityMaps<FlatFieldMetadata> => ({
|
||||
byId: fields.reduce(
|
||||
byUniversalIdentifier: fields.reduce(
|
||||
(acc, field) => {
|
||||
acc[field.id] = field;
|
||||
acc[field.universalIdentifier] = field;
|
||||
|
||||
return acc;
|
||||
},
|
||||
{} as Record<string, FlatFieldMetadata>,
|
||||
),
|
||||
idByUniversalIdentifier: fields.reduce(
|
||||
universalIdentifierById: fields.reduce(
|
||||
(acc, field) => {
|
||||
acc[field.universalIdentifier] = field.id;
|
||||
acc[field.id] = field.universalIdentifier;
|
||||
|
||||
return acc;
|
||||
},
|
||||
|
||||
+4
-4
@@ -75,17 +75,17 @@ describe('isRecordMatchingRLSRowLevelPermissionPredicate', () => {
|
||||
const buildFlatFieldMetadataMaps = (
|
||||
fields: FlatFieldMetadata[],
|
||||
): FlatEntityMaps<FlatFieldMetadata> => ({
|
||||
byId: fields.reduce(
|
||||
byUniversalIdentifier: fields.reduce(
|
||||
(accumulator, field) => {
|
||||
accumulator[field.id] = field;
|
||||
accumulator[field.universalIdentifier] = field;
|
||||
|
||||
return accumulator;
|
||||
},
|
||||
{} as Record<string, FlatFieldMetadata>,
|
||||
),
|
||||
idByUniversalIdentifier: fields.reduce(
|
||||
universalIdentifierById: fields.reduce(
|
||||
(accumulator, field) => {
|
||||
accumulator[field.universalIdentifier] = field.id;
|
||||
accumulator[field.id] = field.universalIdentifier;
|
||||
|
||||
return accumulator;
|
||||
},
|
||||
|
||||
+34
-16
@@ -21,6 +21,7 @@ import {
|
||||
import { type AuthContext } from 'src/engine/core-modules/auth/types/auth-context.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 { type FlatObjectMetadata } from 'src/engine/metadata-modules/flat-object-metadata/types/flat-object-metadata.type';
|
||||
import {
|
||||
@@ -52,7 +53,9 @@ export const buildRowLevelPermissionRecordFilter = ({
|
||||
return null;
|
||||
}
|
||||
|
||||
const predicates = Object.values(flatRowLevelPermissionPredicateMaps.byId)
|
||||
const predicates = Object.values(
|
||||
flatRowLevelPermissionPredicateMaps.byUniversalIdentifier,
|
||||
)
|
||||
.filter(isDefined)
|
||||
.filter(
|
||||
(predicate) =>
|
||||
@@ -65,13 +68,14 @@ export const buildRowLevelPermissionRecordFilter = ({
|
||||
return null;
|
||||
}
|
||||
|
||||
const fieldMetadataMapById = flatFieldMetadataMaps.byId;
|
||||
|
||||
const workspaceMember = authContext.workspaceMember;
|
||||
|
||||
const recordFilters = predicates
|
||||
.map((predicate) => {
|
||||
const fieldMetadata = fieldMetadataMapById[predicate.fieldMetadataId];
|
||||
const fieldMetadata = findFlatEntityByIdInFlatEntityMaps({
|
||||
flatEntityId: predicate.fieldMetadataId,
|
||||
flatEntityMaps: flatFieldMetadataMaps,
|
||||
});
|
||||
|
||||
if (!isDefined(fieldMetadata)) {
|
||||
throw new PermissionsException(
|
||||
@@ -85,8 +89,12 @@ export const buildRowLevelPermissionRecordFilter = ({
|
||||
let predicateValue: RowLevelPermissionPredicateValue = predicate.value;
|
||||
|
||||
if (isDefined(workspaceMemberFieldMetadataId)) {
|
||||
const workspaceMemberFieldMetadata =
|
||||
fieldMetadataMapById[workspaceMemberFieldMetadataId];
|
||||
const workspaceMemberFieldMetadata = findFlatEntityByIdInFlatEntityMaps(
|
||||
{
|
||||
flatEntityId: workspaceMemberFieldMetadataId,
|
||||
flatEntityMaps: flatFieldMetadataMaps,
|
||||
},
|
||||
);
|
||||
|
||||
if (!isDefined(workspaceMemberFieldMetadata)) {
|
||||
throw new PermissionsException(
|
||||
@@ -162,29 +170,34 @@ export const buildRowLevelPermissionRecordFilter = ({
|
||||
})
|
||||
.filter(isDefined);
|
||||
|
||||
const predicateGroupsById = flatRowLevelPermissionPredicateGroupMaps.byId;
|
||||
|
||||
const relevantGroupIds = new Set<string>();
|
||||
|
||||
for (const predicate of predicates) {
|
||||
if (isDefined(predicate.rowLevelPermissionPredicateGroupId)) {
|
||||
relevantGroupIds.add(predicate.rowLevelPermissionPredicateGroupId);
|
||||
|
||||
let parentGroupId =
|
||||
predicateGroupsById[predicate.rowLevelPermissionPredicateGroupId]
|
||||
?.parentRowLevelPermissionPredicateGroupId;
|
||||
let parentGroupId = findFlatEntityByIdInFlatEntityMaps({
|
||||
flatEntityId: predicate.rowLevelPermissionPredicateGroupId,
|
||||
flatEntityMaps: flatRowLevelPermissionPredicateGroupMaps,
|
||||
})?.parentRowLevelPermissionPredicateGroupId;
|
||||
|
||||
while (isDefined(parentGroupId) && !relevantGroupIds.has(parentGroupId)) {
|
||||
relevantGroupIds.add(parentGroupId);
|
||||
parentGroupId =
|
||||
predicateGroupsById[parentGroupId]
|
||||
?.parentRowLevelPermissionPredicateGroupId;
|
||||
parentGroupId = findFlatEntityByIdInFlatEntityMaps({
|
||||
flatEntityId: parentGroupId,
|
||||
flatEntityMaps: flatRowLevelPermissionPredicateGroupMaps,
|
||||
})?.parentRowLevelPermissionPredicateGroupId;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
const recordFilterGroups: RecordFilterGroup[] = [...relevantGroupIds]
|
||||
.map((groupId) => predicateGroupsById[groupId])
|
||||
.map((groupId) =>
|
||||
findFlatEntityByIdInFlatEntityMaps({
|
||||
flatEntityId: groupId,
|
||||
flatEntityMaps: flatRowLevelPermissionPredicateGroupMaps,
|
||||
}),
|
||||
)
|
||||
.filter(isDefined)
|
||||
.filter(
|
||||
(predicateGroup) =>
|
||||
@@ -203,7 +216,12 @@ export const buildRowLevelPermissionRecordFilter = ({
|
||||
}));
|
||||
|
||||
const fieldMetadataItems = predicates
|
||||
.map((predicate) => fieldMetadataMapById[predicate.fieldMetadataId])
|
||||
.map((predicate) =>
|
||||
findFlatEntityByIdInFlatEntityMaps({
|
||||
flatEntityId: predicate.fieldMetadataId,
|
||||
flatEntityMaps: flatFieldMetadataMaps,
|
||||
}),
|
||||
)
|
||||
.filter(isDefined)
|
||||
.map((field) => ({
|
||||
id: field.id,
|
||||
|
||||
+22
-16
@@ -8,6 +8,8 @@ import { RelationType } from 'src/engine/metadata-modules/field-metadata/interfa
|
||||
import { getFlatFieldsFromFlatObjectMetadata } from 'src/engine/api/graphql/workspace-schema-builder/utils/get-flat-fields-for-flat-object-metadata.util';
|
||||
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 { findManyFlatEntityByIdInFlatEntityMaps } from 'src/engine/metadata-modules/flat-entity/utils/find-many-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,
|
||||
@@ -147,8 +149,10 @@ const computeRecordToConnectCondition = (
|
||||
uniqueConstraintFields: FlatFieldMetadata<FieldMetadataType>[];
|
||||
targetObjectNameSingular: string;
|
||||
} => {
|
||||
const field =
|
||||
flatFieldMetadataMaps.byId[fieldMaps.fieldIdByName[connectFieldName]];
|
||||
const field = findFlatEntityByIdInFlatEntityMaps({
|
||||
flatEntityId: fieldMaps.fieldIdByName[connectFieldName],
|
||||
flatEntityMaps: flatFieldMetadataMaps,
|
||||
});
|
||||
|
||||
if (
|
||||
!isDefined(field) ||
|
||||
@@ -168,8 +172,12 @@ const computeRecordToConnectCondition = (
|
||||
}
|
||||
checkNoRelationFieldConflictOrThrow(entity, connectFieldName);
|
||||
|
||||
const targetObjectMetadata =
|
||||
flatObjectMetadataMaps.byId[field.relationTargetObjectMetadataId || ''];
|
||||
const targetObjectMetadata = field.relationTargetObjectMetadataId
|
||||
? findFlatEntityByIdInFlatEntityMaps({
|
||||
flatEntityId: field.relationTargetObjectMetadataId,
|
||||
flatEntityMaps: flatObjectMetadataMaps,
|
||||
})
|
||||
: undefined;
|
||||
|
||||
if (!isDefined(targetObjectMetadata)) {
|
||||
throw new TwentyORMException(
|
||||
@@ -211,18 +219,16 @@ const checkUniqueConstraintFullyPopulated = (
|
||||
flatFieldMetadataMaps,
|
||||
);
|
||||
|
||||
const indexMetadatas = flatObjectMetadata.indexMetadataIds
|
||||
.map((indexId) => flatIndexMaps.byId[indexId])
|
||||
.filter(isDefined)
|
||||
.map((index) => ({
|
||||
id: index.id,
|
||||
isUnique: index.isUnique,
|
||||
indexFieldMetadatas: index.flatIndexFieldMetadatas.map(
|
||||
(fieldMetadata) => ({
|
||||
fieldMetadataId: fieldMetadata.fieldMetadataId,
|
||||
}),
|
||||
),
|
||||
}));
|
||||
const indexMetadatas = findManyFlatEntityByIdInFlatEntityMaps({
|
||||
flatEntityIds: flatObjectMetadata.indexMetadataIds,
|
||||
flatEntityMaps: flatIndexMaps,
|
||||
}).map((index) => ({
|
||||
id: index.id,
|
||||
isUnique: index.isUnique,
|
||||
indexFieldMetadatas: index.flatIndexFieldMetadatas.map((fieldMetadata) => ({
|
||||
fieldMetadataId: fieldMetadata.fieldMetadataId,
|
||||
})),
|
||||
}));
|
||||
|
||||
const uniqueConstraintsFields = getUniqueConstraintsFields<
|
||||
FlatFieldMetadata,
|
||||
|
||||
@@ -7,6 +7,7 @@ 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,
|
||||
@@ -45,7 +46,10 @@ export function formatData<T>(
|
||||
for (const [key, value] of Object.entries(data)) {
|
||||
const fieldMetadataId = fieldIdByName[key] || fieldIdByJoinColumnName[key];
|
||||
|
||||
const fieldMetadata = flatFieldMetadataMaps.byId[fieldMetadataId];
|
||||
const fieldMetadata = findFlatEntityByIdInFlatEntityMaps({
|
||||
flatEntityId: fieldMetadataId,
|
||||
flatEntityMaps: flatFieldMetadataMaps,
|
||||
});
|
||||
|
||||
if (!fieldMetadata) {
|
||||
throw new Error(
|
||||
|
||||
@@ -16,6 +16,7 @@ import {
|
||||
import { getFlatFieldsFromFlatObjectMetadata } from 'src/engine/api/graphql/workspace-schema-builder/utils/get-flat-fields-for-flat-object-metadata.util';
|
||||
import { computeCompositeColumnName } from 'src/engine/metadata-modules/field-metadata/utils/compute-column-name.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,
|
||||
@@ -80,9 +81,10 @@ export function formatResult<T>(
|
||||
fieldIdByName[key] ||
|
||||
fieldIdByName[compositePropertyArgs?.parentField ?? ''];
|
||||
|
||||
const fieldMetadata = flatFieldMetadataMaps.byId[fieldMetadataId] as
|
||||
| FlatFieldMetadata<FieldMetadataType>
|
||||
| undefined;
|
||||
const fieldMetadata = findFlatEntityByIdInFlatEntityMaps({
|
||||
flatEntityId: fieldMetadataId,
|
||||
flatEntityMaps: flatFieldMetadataMaps,
|
||||
});
|
||||
|
||||
const isRelation = fieldMetadata
|
||||
? isFieldMetadataEntityOfType(fieldMetadata, FieldMetadataType.RELATION)
|
||||
@@ -116,10 +118,10 @@ export function formatResult<T>(
|
||||
);
|
||||
}
|
||||
|
||||
const targetObjectMetadata =
|
||||
flatObjectMetadataMaps.byId[
|
||||
fieldMetadata.relationTargetObjectMetadataId
|
||||
];
|
||||
const targetObjectMetadata = findFlatEntityByIdInFlatEntityMaps({
|
||||
flatEntityId: fieldMetadata.relationTargetObjectMetadataId,
|
||||
flatEntityMaps: flatObjectMetadataMaps,
|
||||
});
|
||||
|
||||
if (!targetObjectMetadata) {
|
||||
throw new Error(
|
||||
|
||||
+5
-2
@@ -2,6 +2,7 @@ import { type EntityTarget, type ObjectLiteral } from 'typeorm';
|
||||
|
||||
import { type WorkspaceInternalContext } from 'src/engine/twenty-orm/interfaces/workspace-internal-context.interface';
|
||||
|
||||
import { findFlatEntityByIdInFlatEntityMaps } from 'src/engine/metadata-modules/flat-entity/utils/find-flat-entity-by-id-in-flat-entity-maps.util';
|
||||
import { type FlatObjectMetadata } from 'src/engine/metadata-modules/flat-object-metadata/types/flat-object-metadata.type';
|
||||
import {
|
||||
TwentyORMException,
|
||||
@@ -35,8 +36,10 @@ export const getObjectMetadataFromEntityTarget = <T extends ObjectLiteral>(
|
||||
);
|
||||
}
|
||||
|
||||
const objectMetadata =
|
||||
internalContext.flatObjectMetadataMaps.byId[objectMetadataId];
|
||||
const objectMetadata = findFlatEntityByIdInFlatEntityMaps({
|
||||
flatEntityId: objectMetadataId,
|
||||
flatEntityMaps: internalContext.flatObjectMetadataMaps,
|
||||
});
|
||||
|
||||
if (!objectMetadata) {
|
||||
throw new TwentyORMException(
|
||||
|
||||
Reference in New Issue
Block a user