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:
Paul Rastoin
2026-02-03 17:16:02 +01:00
committed by GitHub
parent 43042d55b2
commit 476bdf764c
202 changed files with 1853 additions and 909 deletions
@@ -18,9 +18,11 @@ import { FeatureFlagService } from 'src/engine/core-modules/feature-flag/service
import { WorkspaceEntity } from 'src/engine/core-modules/workspace/workspace.entity';
import { DataSourceService } from 'src/engine/metadata-modules/data-source/data-source.service';
import { computeMorphOrRelationFieldJoinColumnName } from 'src/engine/metadata-modules/field-metadata/utils/compute-morph-or-relation-field-join-column-name.util';
import { findFlatEntityByIdInFlatEntityMapsOrThrow } from 'src/engine/metadata-modules/flat-entity/utils/find-flat-entity-by-id-in-flat-entity-maps-or-throw.util';
import { findFlatEntityByUniversalIdentifier } from 'src/engine/metadata-modules/flat-entity/utils/find-flat-entity-by-universal-identifier.util';
import { getMetadataFlatEntityMapsKey } from 'src/engine/metadata-modules/flat-entity/utils/get-metadata-flat-entity-maps-key.util';
import { getMetadataRelatedMetadataNames } from 'src/engine/metadata-modules/flat-entity/utils/get-metadata-related-metadata-names.util';
import { 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';
import { type FlatObjectMetadata } from 'src/engine/metadata-modules/flat-object-metadata/types/flat-object-metadata.type';
import { WorkspaceMetadataVersionService } from 'src/engine/metadata-modules/workspace-metadata-version/services/workspace-metadata-version.service';
@@ -131,7 +133,10 @@ export class MigrateAttachmentToMorphRelationsCommand extends ActiveOrSuspendedW
const attachmentTargetRelationFields = attachmentFieldMetadatas
.filter(isMorphOrRelationFlatFieldMetadata)
.filter((field) => field.type === FieldMetadataType.RELATION)
.filter(
(field): field is FlatFieldMetadata<FieldMetadataType.RELATION> =>
field.type === FieldMetadataType.RELATION,
)
.filter((field) => {
const isStandardAppField = this.isTwentyStandardApplicationField({
field,
@@ -143,9 +148,11 @@ export class MigrateAttachmentToMorphRelationsCommand extends ActiveOrSuspendedW
attachmentTargetFieldUniversalIdentifiers.has(
field.universalIdentifier,
);
const targetObjectMetadata = field.relationTargetObjectMetadataId
? flatObjectMetadataMaps.byId[field.relationTargetObjectMetadataId]
: undefined;
const targetObjectMetadata =
findFlatEntityByIdInFlatEntityMapsOrThrow({
flatEntityId: field.relationTargetObjectMetadataId,
flatEntityMaps: flatObjectMetadataMaps,
});
const isCustomTarget =
!isStandardAppField && targetObjectMetadata?.isCustom === true;
@@ -14,6 +14,7 @@ import { MAX_DEPTH } from 'src/engine/api/rest/input-request-parsers/constants/m
import { Depth } from 'src/engine/api/rest/input-request-parsers/types/depth.type';
import { type FlatEntityMaps } from 'src/engine/metadata-modules/flat-entity/types/flat-entity-maps.type';
import { findFlatEntityByIdInFlatEntityMapsOrThrow } from 'src/engine/metadata-modules/flat-entity/utils/find-flat-entity-by-id-in-flat-entity-maps-or-throw.util';
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 { isFlatFieldMetadataOfType } from 'src/engine/metadata-modules/flat-field-metadata/utils/is-flat-field-metadata-of-type.util';
import { type FlatObjectMetadata } from 'src/engine/metadata-modules/flat-object-metadata/types/flat-object-metadata.type';
@@ -100,8 +101,10 @@ export class CommonSelectedFieldsHandler {
if (!field.relationTargetObjectMetadataId) continue;
const relationTargetObjectMetadata =
flatObjectMetadataMaps.byId[field.relationTargetObjectMetadataId];
const relationTargetObjectMetadata = findFlatEntityByIdInFlatEntityMaps({
flatEntityId: field.relationTargetObjectMetadataId,
flatEntityMaps: flatObjectMetadataMaps,
});
if (!isDefined(relationTargetObjectMetadata)) {
throw new CommonQueryRunnerException(
@@ -55,6 +55,7 @@ import { transformPhonesValue } from 'src/engine/core-modules/record-transformer
import { transformRichTextV2Value } from 'src/engine/core-modules/record-transformer/utils/transform-rich-text-v2.util';
import { WorkspaceNotFoundDefaultError } from 'src/engine/core-modules/workspace/workspace.exception';
import { 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 { FlatFieldMetadata } from 'src/engine/metadata-modules/flat-field-metadata/types/flat-field-metadata.type';
import { buildFieldMapsFromFlatObjectMetadata } from 'src/engine/metadata-modules/flat-field-metadata/utils/build-field-maps-from-flat-object-metadata.util';
import { FlatObjectMetadata } from 'src/engine/metadata-modules/flat-object-metadata/types/flat-object-metadata.type';
@@ -119,7 +120,10 @@ export class DataArgProcessor {
);
}
const fieldMetadata = flatFieldMetadataMaps.byId[fieldMetadataId];
const fieldMetadata = findFlatEntityByIdInFlatEntityMaps({
flatEntityId: fieldMetadataId,
flatEntityMaps: flatFieldMetadataMaps,
});
if (!fieldMetadata) {
throw new CommonQueryRunnerException(
@@ -7,6 +7,7 @@ import { type ObjectRecordFilter } from 'src/engine/api/graphql/workspace-query-
import { RecordInputTransformerService } from 'src/engine/core-modules/record-transformer/services/record-input-transformer.service';
import { 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 { FlatFieldMetadata } from 'src/engine/metadata-modules/flat-field-metadata/types/flat-field-metadata.type';
import { buildFieldMapsFromFlatObjectMetadata } from 'src/engine/metadata-modules/flat-field-metadata/utils/build-field-maps-from-flat-object-metadata.util';
import { FlatObjectMetadata } from 'src/engine/metadata-modules/flat-object-metadata/types/flat-object-metadata.type';
@@ -69,7 +70,10 @@ export class QueryRunnerArgsFactory {
) {
const fieldMetadataId = fieldIdByName[key];
const fieldMetadata = fieldMetadataId
? flatFieldMetadataMaps.byId[fieldMetadataId]
? findFlatEntityByIdInFlatEntityMaps({
flatEntityId: fieldMetadataId,
flatEntityMaps: flatFieldMetadataMaps,
})
: undefined;
if (!fieldMetadata) {
@@ -103,7 +107,10 @@ export class QueryRunnerArgsFactory {
flatObjectMetadata: FlatObjectMetadata,
flatFieldMetadataMaps: FlatEntityMaps<FlatFieldMetadata>,
) {
const fieldMetadata = flatFieldMetadataMaps.byId[fieldIdByName[key]];
const fieldMetadata = findFlatEntityByIdInFlatEntityMaps({
flatEntityId: fieldIdByName[key],
flatEntityMaps: flatFieldMetadataMaps,
});
if (!fieldMetadata) {
return value;
@@ -32,6 +32,7 @@ import { getAllSelectableColumnNames } from 'src/engine/api/utils/get-all-select
import { AuthContext } from 'src/engine/core-modules/auth/types/auth-context.type';
import { WorkspaceAuthContext } from 'src/engine/core-modules/auth/types/workspace-auth-context.type';
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 } 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';
@@ -468,8 +469,10 @@ export class CommonCreateManyQueryRunnerService extends CommonBaseQueryRunnerSer
flatObjectMetadata,
);
const createdByFieldMetadata =
flatFieldMetadataMaps.byId[fieldIdByName['createdBy']];
const createdByFieldMetadata = findFlatEntityByIdInFlatEntityMaps({
flatEntityId: fieldIdByName['createdBy'],
flatEntityMaps: flatFieldMetadataMaps,
});
if (!isDefined(createdByFieldMetadata)) {
throw new CommonQueryRunnerException(
@@ -94,17 +94,17 @@ describe('getConflictingFields', () => {
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;
},
@@ -17,7 +17,6 @@ import { ObjectLiteral } from 'typeorm';
import { ObjectRecordFilter } from 'src/engine/api/graphql/workspace-query-builder/interfaces/object-record.interface';
import { WorkspaceAuthContext } from 'src/engine/core-modules/auth/types/workspace-auth-context.type';
import { CommonBaseQueryRunnerService } from 'src/engine/api/common/common-query-runners/common-base-query-runner.service';
import {
CommonQueryRunnerException,
@@ -46,7 +45,9 @@ import { GroupByWithRecordsService } from 'src/engine/api/graphql/graphql-query-
import { getGroupLimit } from 'src/engine/api/graphql/graphql-query-runner/group-by/utils/get-group-limit.util';
import { ProcessAggregateHelper } from 'src/engine/api/graphql/graphql-query-runner/helpers/process-aggregate.helper';
import { getFlatFieldsFromFlatObjectMetadata } from 'src/engine/api/graphql/workspace-schema-builder/utils/get-flat-fields-for-flat-object-metadata.util';
import { WorkspaceAuthContext } from 'src/engine/core-modules/auth/types/workspace-auth-context.type';
import { 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 { 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';
import { FlatObjectMetadata } from 'src/engine/metadata-modules/flat-object-metadata/types/flat-object-metadata.type';
@@ -208,8 +209,10 @@ export class CommonGroupByQueryRunnerService extends CommonBaseQueryRunnerServic
);
const recordFilters = viewFilters.map((viewFilter) => {
const fieldMetadata =
flatFieldMetadataMaps.byId[viewFilter.fieldMetadataId];
const fieldMetadata = findFlatEntityByIdInFlatEntityMaps({
flatEntityId: viewFilter.fieldMetadataId,
flatEntityMaps: flatFieldMetadataMaps,
});
if (!fieldMetadata) {
throw new CommonQueryRunnerException(
@@ -15,7 +15,6 @@ import { isDefined } from 'twenty-shared/utils';
import { FindOptionsRelations, In, ObjectLiteral } from 'typeorm';
import { v4 as uuidv4 } from 'uuid';
import { WorkspaceAuthContext } from 'src/engine/core-modules/auth/types/workspace-auth-context.type';
import { CommonBaseQueryRunnerService } from 'src/engine/api/common/common-query-runners/common-base-query-runner.service';
import {
CommonQueryRunnerException,
@@ -34,7 +33,9 @@ import { buildColumnsToReturn } from 'src/engine/api/graphql/graphql-query-runne
import { buildColumnsToSelect } from 'src/engine/api/graphql/graphql-query-runner/utils/build-columns-to-select';
import { hasRecordFieldValue } from 'src/engine/api/graphql/graphql-query-runner/utils/has-record-field-value.util';
import { mergeFieldValues } from 'src/engine/api/graphql/graphql-query-runner/utils/merge-field-values.util';
import { WorkspaceAuthContext } from 'src/engine/core-modules/auth/types/workspace-auth-context.type';
import { 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 { FlatFieldMetadata } from 'src/engine/metadata-modules/flat-field-metadata/types/flat-field-metadata.type';
import { buildFieldMapsFromFlatObjectMetadata } from 'src/engine/metadata-modules/flat-field-metadata/utils/build-field-maps-from-flat-object-metadata.util';
import { isFlatFieldMetadataOfType } from 'src/engine/metadata-modules/flat-field-metadata/utils/is-flat-field-metadata-of-type.util';
@@ -246,8 +247,10 @@ export class CommonMergeManyQueryRunnerService extends CommonBaseQueryRunnerServ
flatFieldMetadataMaps,
flatObjectMetadata,
);
const fieldMetadata =
flatFieldMetadataMaps.byId[fieldIdByName[fieldName]];
const fieldMetadata = findFlatEntityByIdInFlatEntityMaps({
flatEntityId: fieldIdByName[fieldName],
flatEntityMaps: flatFieldMetadataMaps,
});
if (!fieldMetadata) {
return;
@@ -282,7 +285,10 @@ export class CommonMergeManyQueryRunnerService extends CommonBaseQueryRunnerServ
flatFieldMetadataMaps,
flatObjectMetadata,
);
const fieldMetadata = flatFieldMetadataMaps.byId[fieldIdByName[fieldName]];
const fieldMetadata = findFlatEntityByIdInFlatEntityMaps({
flatEntityId: fieldIdByName[fieldName],
flatEntityMaps: flatFieldMetadataMaps,
});
return fieldMetadata?.isSystem ?? false;
}
@@ -364,9 +370,9 @@ export class CommonMergeManyQueryRunnerService extends CommonBaseQueryRunnerServ
joinColumnName: string | undefined;
}> = [];
for (const field of Object.values(flatFieldMetadataMaps.byId).filter(
isDefined,
)) {
for (const field of Object.values(
flatFieldMetadataMaps.byUniversalIdentifier,
).filter(isDefined)) {
if (
!isFlatFieldMetadataOfType(field, FieldMetadataType.RELATION) ||
field.relationTargetObjectMetadataId !== flatObjectMetadata.id ||
@@ -386,7 +392,10 @@ export class CommonMergeManyQueryRunnerService extends CommonBaseQueryRunnerServ
continue;
}
const objMetadata = flatObjectMetadataMaps.byId[field.objectMetadataId];
const objMetadata = findFlatEntityByIdInFlatEntityMaps({
flatEntityId: field.objectMetadataId,
flatEntityMaps: flatObjectMetadataMaps,
});
if (!objMetadata) {
continue;
@@ -18,6 +18,7 @@ import { WorkspaceMemberQueryResultGetterHandler } from 'src/engine/api/graphql/
import { FilesFieldService } from 'src/engine/core-modules/file/files-field/files-field.service';
import { FileService } from 'src/engine/core-modules/file/services/file.service';
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 { findFlatEntityByIdInFlatEntityMapsOrThrow } from 'src/engine/metadata-modules/flat-entity/utils/find-flat-entity-by-id-in-flat-entity-maps-or-throw.util';
import { type FlatFieldMetadata } from 'src/engine/metadata-modules/flat-field-metadata/types/flat-field-metadata.type';
import {
@@ -118,9 +119,11 @@ export class CommonResultGettersService {
const handlers = [
this.getObjectHandler(flatObjectMetadata.nameSingular),
...Object.keys(record)
.map(
(recordFieldName) =>
flatFieldMetadataMaps.byId[fieldIdByName[recordFieldName]],
.map((recordFieldName) =>
findFlatEntityByIdInFlatEntityMaps({
flatEntityId: fieldIdByName[recordFieldName],
flatEntityMaps: flatFieldMetadataMaps,
}),
)
.filter(isDefined)
.map((fieldMetadata) => this.fieldHandlers.get(fieldMetadata.type))
@@ -128,9 +131,11 @@ export class CommonResultGettersService {
];
const relationFields = Object.keys(record)
.map(
(recordFieldName) =>
flatFieldMetadataMaps.byId[fieldIdByName[recordFieldName]],
.map((recordFieldName) =>
findFlatEntityByIdInFlatEntityMaps({
flatEntityId: fieldIdByName[recordFieldName],
flatEntityMaps: flatFieldMetadataMaps,
}),
)
.filter(isDefined)
.filter((fieldMetadata) =>
@@ -178,9 +183,11 @@ export class CommonResultGettersService {
}
const fieldMetadata = Object.keys(record)
.map(
(recordFieldName) =>
flatFieldMetadataMaps.byId[fieldIdByName[recordFieldName]],
.map((recordFieldName) =>
findFlatEntityByIdInFlatEntityMaps({
flatEntityId: fieldIdByName[recordFieldName],
flatEntityMaps: flatFieldMetadataMaps,
}),
)
.filter(isDefined);
@@ -95,17 +95,17 @@ const mockFieldMetadatas: FlatFieldMetadata[] = [
export const mockPersonFlatFieldMetadataMaps =
(): FlatEntityMaps<FlatFieldMetadata> => ({
byId: mockFieldMetadatas.reduce(
byUniversalIdentifier: mockFieldMetadatas.reduce(
(acc, field) => {
acc[field.id] = field;
acc[field.universalIdentifier] = field;
return acc;
},
{} as Record<string, FlatFieldMetadata>,
),
idByUniversalIdentifier: mockFieldMetadatas.reduce(
universalIdentifierById: mockFieldMetadatas.reduce(
(acc, field) => {
acc[field.universalIdentifier] = field.id;
acc[field.id] = field.universalIdentifier;
return acc;
},
@@ -120,11 +120,11 @@ export const mockPersonFlatObjectMetadataMaps = (
const flatObjectMetadata = mockPersonFlatObjectMetadata(duplicateCriteria);
return {
byId: {
[flatObjectMetadata.id]: flatObjectMetadata,
byUniversalIdentifier: {
[flatObjectMetadata.universalIdentifier as string]: flatObjectMetadata,
},
idByUniversalIdentifier: {
[flatObjectMetadata.universalIdentifier as string]: flatObjectMetadata.id,
universalIdentifierById: {
[flatObjectMetadata.id]: flatObjectMetadata.universalIdentifier as string,
},
universalIdentifiersByApplicationId: {},
};
@@ -11,6 +11,7 @@ import { computeWhereConditionParts } from 'src/engine/api/graphql/graphql-query
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 } 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';
@@ -18,7 +19,6 @@ import { type FlatObjectMetadata } from 'src/engine/metadata-modules/flat-object
const ARRAY_OPERATORS = ['in', 'contains', 'notContains'];
export class GraphqlQueryFilterFieldParser {
private flatObjectMetadata: FlatObjectMetadata;
private flatFieldMetadataMaps: FlatEntityMaps<FlatFieldMetadata>;
private fieldIdByName: Record<string, string>;
private fieldIdByJoinColumnName: Record<string, string>;
@@ -27,7 +27,6 @@ export class GraphqlQueryFilterFieldParser {
flatObjectMetadata: FlatObjectMetadata,
flatFieldMetadataMaps: FlatEntityMaps<FlatFieldMetadata>,
) {
this.flatObjectMetadata = flatObjectMetadata;
this.flatFieldMetadataMaps = flatFieldMetadataMaps;
const fieldMaps = buildFieldMapsFromFlatObjectMetadata(
@@ -51,7 +50,10 @@ export class GraphqlQueryFilterFieldParser {
const fieldMetadataId =
this.fieldIdByName[`${key}`] || this.fieldIdByJoinColumnName[`${key}`];
const fieldMetadata = this.flatFieldMetadataMaps.byId[fieldMetadataId];
const fieldMetadata = findFlatEntityByIdInFlatEntityMaps({
flatEntityId: fieldMetadataId,
flatEntityMaps: this.flatFieldMetadataMaps,
});
if (!isDefined(fieldMetadata)) {
throw new Error(`Field metadata not found for field: ${key}`);
@@ -30,11 +30,13 @@ import {
import { UserInputError } from 'src/engine/core-modules/graphql/utils/graphql-errors.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 { type FlatFieldMetadata } from 'src/engine/metadata-modules/flat-field-metadata/types/flat-field-metadata.type';
import { buildFieldMapsFromFlatObjectMetadata } from 'src/engine/metadata-modules/flat-field-metadata/utils/build-field-maps-from-flat-object-metadata.util';
import { isMorphOrRelationFlatFieldMetadata } from 'src/engine/metadata-modules/flat-field-metadata/utils/is-morph-or-relation-flat-field-metadata.util';
import { type FlatObjectMetadata } from 'src/engine/metadata-modules/flat-object-metadata/types/flat-object-metadata.type';
import { formatColumnNamesFromCompositeFieldAndSubfields } from 'src/engine/twenty-orm/utils/format-column-names-from-composite-field-and-subfield.util';
import { findManyFlatEntityByIdInFlatEntityMaps } from 'src/engine/metadata-modules/flat-entity/utils/find-many-flat-entity-by-id-in-flat-entity-maps.util';
import { type OrderByClause } from './types/order-by-condition.type';
@@ -70,9 +72,10 @@ export class GraphqlQueryOrderGroupByParser {
}): Record<string, OrderByClause>[] {
const parsedOrderBy: Record<string, OrderByClause>[] = [];
const fields = this.flatObjectMetadata.fieldIds
.map((id) => this.flatFieldMetadataMaps.byId[id])
.filter(isDefined);
const fields = findManyFlatEntityByIdInFlatEntityMaps({
flatEntityIds: this.flatObjectMetadata.fieldIds,
flatEntityMaps: this.flatFieldMetadataMaps,
});
const availableAggregations: Record<string, AggregationField> =
getAvailableAggregationsFromObjectFields(fields);
@@ -97,7 +100,10 @@ export class GraphqlQueryOrderGroupByParser {
const fieldName = Object.keys(orderByArg)[0];
const fieldMetadataId = this.fieldIdByName[fieldName];
const fieldMetadata = this.flatFieldMetadataMaps.byId[fieldMetadataId];
const fieldMetadata = findFlatEntityByIdInFlatEntityMaps({
flatEntityId: fieldMetadataId,
flatEntityMaps: this.flatFieldMetadataMaps,
});
if (!isDefined(fieldMetadata)) {
throw new UserInputError(`Cannot orderBy unknown field: ${fieldName}.`);
@@ -18,6 +18,7 @@ import { isOrderByDirection } from 'src/engine/api/graphql/graphql-query-runner/
import { parseCompositeFieldForOrder } from 'src/engine/api/graphql/graphql-query-runner/graphql-query-parsers/graphql-query-order/utils/parse-composite-field-for-order.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 { type FlatFieldMetadata } from 'src/engine/metadata-modules/flat-field-metadata/types/flat-field-metadata.type';
import { buildFieldMapsFromFlatObjectMetadata } from 'src/engine/metadata-modules/flat-field-metadata/utils/build-field-maps-from-flat-object-metadata.util';
import { isMorphOrRelationFlatFieldMetadata } from 'src/engine/metadata-modules/flat-field-metadata/utils/is-morph-or-relation-flat-field-metadata.util';
@@ -71,7 +72,10 @@ export class GraphqlQueryOrderFieldParser {
const fieldMetadataId =
this.fieldIdByName[fieldName] ||
this.fieldIdByJoinColumnName[fieldName];
const fieldMetadata = this.flatFieldMetadataMaps.byId[fieldMetadataId];
const fieldMetadata = findFlatEntityByIdInFlatEntityMaps({
flatEntityId: fieldMetadataId,
flatEntityMaps: this.flatFieldMetadataMaps,
});
if (!fieldMetadata || orderByDirection === undefined) {
throw new GraphqlQueryRunnerException(
@@ -173,10 +177,10 @@ export class GraphqlQueryOrderFieldParser {
return null;
}
const targetObjectMetadata =
this.flatObjectMetadataMaps.byId[
fieldMetadata.relationTargetObjectMetadataId
];
const targetObjectMetadata = findFlatEntityByIdInFlatEntityMaps({
flatEntityId: fieldMetadata.relationTargetObjectMetadataId,
flatEntityMaps: this.flatObjectMetadataMaps,
});
if (!isDefined(targetObjectMetadata)) {
return null;
@@ -205,8 +209,10 @@ export class GraphqlQueryOrderFieldParser {
);
}
const nestedFieldMetadata =
this.flatFieldMetadataMaps.byId[nestedFieldMetadataId];
const nestedFieldMetadata = findFlatEntityByIdInFlatEntityMaps({
flatEntityId: nestedFieldMetadataId,
flatEntityMaps: this.flatFieldMetadataMaps,
});
if (!isDefined(nestedFieldMetadata)) {
return null;
@@ -10,6 +10,7 @@ import { isGroupByRelationField } from 'src/engine/api/graphql/graphql-query-run
import { UserInputError } from 'src/engine/core-modules/graphql/utils/graphql-errors.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 { type FlatFieldMetadata } from 'src/engine/metadata-modules/flat-field-metadata/types/flat-field-metadata.type';
import { buildFieldMapsFromFlatObjectMetadata } 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';
@@ -56,8 +57,10 @@ export const prepareForOrderByRelationFieldParsing = ({
);
}
const targetObjectMetadata =
flatObjectMetadataMaps.byId[fieldMetadata.relationTargetObjectMetadataId];
const targetObjectMetadata = findFlatEntityByIdInFlatEntityMaps({
flatEntityId: fieldMetadata.relationTargetObjectMetadataId,
flatEntityMaps: flatObjectMetadataMaps,
});
if (!isDefined(targetObjectMetadata)) {
throw new UserInputError(
@@ -79,7 +82,10 @@ export const prepareForOrderByRelationFieldParsing = ({
);
}
const nestedFieldMetadata = flatFieldMetadataMaps.byId[nestedFieldMetadataId];
const nestedFieldMetadata = findFlatEntityByIdInFlatEntityMaps({
flatEntityId: nestedFieldMetadataId,
flatEntityMaps: flatFieldMetadataMaps,
});
if (!isDefined(nestedFieldMetadata) || !isDefined(nestedFieldMetadataId)) {
throw new UserInputError(
@@ -6,6 +6,7 @@ import {
getAvailableAggregationsFromObjectFields,
} from 'src/engine/api/graphql/workspace-schema-builder/utils/get-available-aggregations-from-object-fields.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';
@@ -18,7 +19,12 @@ export class GraphqlQuerySelectedFieldsAggregateParser {
accumulator: GraphqlQuerySelectedFieldsResult,
): void {
const fields = flatObjectMetadata.fieldIds
.map((id) => flatFieldMetadataMaps.byId[id])
.map((id) =>
findFlatEntityByIdInFlatEntityMaps({
flatEntityId: id,
flatEntityMaps: flatFieldMetadataMaps,
}),
)
.filter(isDefined);
const availableAggregations: Record<string, AggregationField> =
@@ -9,6 +9,7 @@ import { GraphqlQuerySelectedFieldsRelationParser } from 'src/engine/api/graphql
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 { findFlatEntityByIdInFlatEntityMapsOrThrow } from 'src/engine/metadata-modules/flat-entity/utils/find-flat-entity-by-id-in-flat-entity-maps-or-throw.util';
import { type FlatFieldMetadata } from 'src/engine/metadata-modules/flat-field-metadata/types/flat-field-metadata.type';
import { isFlatFieldMetadataOfType } from 'src/engine/metadata-modules/flat-field-metadata/utils/is-flat-field-metadata-of-type.util';
@@ -136,10 +137,10 @@ export class GraphqlQuerySelectedFieldsParser {
FieldMetadataType.MORPH_RELATION,
)
) {
const targetObjectMetadata =
this.flatObjectMetadataMaps.byId[
fieldMetadata.relationTargetObjectMetadataId
];
const targetObjectMetadata = findFlatEntityByIdInFlatEntityMaps({
flatEntityId: fieldMetadata.relationTargetObjectMetadataId,
flatEntityMaps: this.flatObjectMetadataMaps,
});
if (
!fieldMetadata.settings?.relationType ||
@@ -8,6 +8,7 @@ import { isGroupByDateFieldDefinition } from 'src/engine/api/graphql/graphql-que
import { parseGroupByRelationField } from 'src/engine/api/graphql/graphql-query-runner/group-by/resolvers/utils/parse-group-by-relation-field.util';
import { validateSingleKeyForGroupByOrThrow } from 'src/engine/api/graphql/graphql-query-runner/group-by/resolvers/utils/validate-single-key-for-group-by-or-throw.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 } from 'src/engine/metadata-modules/flat-field-metadata/utils/build-field-maps-from-flat-object-metadata.util';
import { isMorphOrRelationFlatFieldMetadata } from 'src/engine/metadata-modules/flat-field-metadata/utils/is-morph-or-relation-flat-field-metadata.util';
@@ -40,7 +41,10 @@ export const parseGroupByArgs = (
const fieldMetadataId =
fieldIdByName[fieldName] || fieldIdByJoinColumnName[fieldName];
const fieldMetadata = fieldMetadataId
? flatFieldMetadataMaps.byId[fieldMetadataId]
? findFlatEntityByIdInFlatEntityMaps({
flatEntityId: fieldMetadataId,
flatEntityMaps: flatFieldMetadataMaps,
})
: undefined;
if (!isDefined(fieldMetadata) || !isDefined(fieldMetadataId)) {
@@ -14,6 +14,7 @@ import { validateSingleKeyForGroupByOrThrow } from 'src/engine/api/graphql/graph
import { UserInputError } from 'src/engine/core-modules/graphql/utils/graphql-errors.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 { findFlatEntityByIdInFlatEntityMapsOrThrow } from 'src/engine/metadata-modules/flat-entity/utils/find-flat-entity-by-id-in-flat-entity-maps-or-throw.util';
import { type FlatFieldMetadata } from 'src/engine/metadata-modules/flat-field-metadata/types/flat-field-metadata.type';
import { buildFieldMapsFromFlatObjectMetadata } from 'src/engine/metadata-modules/flat-field-metadata/utils/build-field-maps-from-flat-object-metadata.util';
@@ -63,7 +64,10 @@ const getNestedFieldMetadataDetails = ({
);
const nestedFieldMetadataId = fieldIdByName[nestedFieldName];
const nestedFieldMetadata = flatFieldMetadataMaps.byId[nestedFieldMetadataId];
const nestedFieldMetadata = findFlatEntityByIdInFlatEntityMaps({
flatEntityId: nestedFieldMetadataId,
flatEntityMaps: flatFieldMetadataMaps,
});
if (!isDefined(nestedFieldMetadata) || !isDefined(nestedFieldMetadataId)) {
throw new GraphqlQueryRunnerException(
@@ -21,6 +21,7 @@ import { type CompositeFieldMetadataType } from 'src/engine/metadata-modules/fie
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 { findFlatEntityByIdInFlatEntityMapsOrThrow } from 'src/engine/metadata-modules/flat-entity/utils/find-flat-entity-by-id-in-flat-entity-maps-or-throw.util';
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 { isMorphOrRelationFlatFieldMetadata } from 'src/engine/metadata-modules/flat-field-metadata/utils/is-morph-or-relation-flat-field-metadata.util';
import { type FlatObjectMetadata } from 'src/engine/metadata-modules/flat-object-metadata/types/flat-object-metadata.type';
@@ -193,10 +194,10 @@ export class ObjectRecordsToGraphqlConnectionHelper {
}
if (isMorphOrRelationFlatFieldMetadata(fieldMetadata)) {
const targetObjectMetadata =
this.flatObjectMetadataMaps.byId[
fieldMetadata.relationTargetObjectMetadataId
];
const targetObjectMetadata = findFlatEntityByIdInFlatEntityMaps({
flatEntityId: fieldMetadata.relationTargetObjectMetadataId,
flatEntityMaps: this.flatObjectMetadataMaps,
});
if (!isDefined(targetObjectMetadata)) {
continue;
@@ -293,10 +293,10 @@ export class ProcessNestedRelationsV2Helper {
);
}
const targetRelation =
flatFieldMetadataMaps.byId[
targetFieldMetadata.relationTargetFieldMetadataId
];
const targetRelation = findFlatEntityByIdInFlatEntityMaps({
flatEntityId: targetFieldMetadata.relationTargetFieldMetadataId,
flatEntityMaps: flatFieldMetadataMaps,
});
const targetRelationName = targetRelation?.name;
@@ -115,17 +115,17 @@ describe('buildColumnsToSelect', () => {
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;
},
@@ -137,18 +137,18 @@ describe('buildColumnsToSelect', () => {
const buildFlatObjectMetadataMaps = (
objects: FlatObjectMetadata[],
): FlatEntityMaps<FlatObjectMetadata> => ({
byId: objects.reduce(
byUniversalIdentifier: objects.reduce(
(acc, obj) => {
acc[obj.id] = obj;
acc[obj.universalIdentifier as string] = obj;
return acc;
},
{} as Record<string, FlatObjectMetadata>,
),
idByUniversalIdentifier: objects.reduce(
universalIdentifierById: objects.reduce(
(acc, obj) => {
if (obj.universalIdentifier) {
acc[obj.universalIdentifier] = obj.id;
acc[obj.id] = obj.universalIdentifier;
}
return acc;
@@ -4,6 +4,7 @@ import { isDefined } from 'twenty-shared/utils';
import { RelationType } from 'src/engine/metadata-modules/field-metadata/interfaces/relation-type.interface';
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 { findFlatEntityByIdInFlatEntityMapsOrThrow } from 'src/engine/metadata-modules/flat-entity/utils/find-flat-entity-by-id-in-flat-entity-maps-or-throw.util';
import { type FlatFieldMetadata } from 'src/engine/metadata-modules/flat-field-metadata/types/flat-field-metadata.type';
import { isFlatFieldMetadataOfType } from 'src/engine/metadata-modules/flat-field-metadata/utils/is-flat-field-metadata-of-type.util';
@@ -74,9 +75,10 @@ const getRequiredRelationColumns = (
isFlatFieldMetadataOfType(fieldMetadata, FieldMetadataType.MORPH_RELATION)
) {
const targetObjectMetadata = fieldMetadata.relationTargetObjectMetadataId
? flatObjectMetadataMaps.byId[
fieldMetadata.relationTargetObjectMetadataId
]
? findFlatEntityByIdInFlatEntityMaps({
flatEntityId: fieldMetadata.relationTargetObjectMetadataId,
flatEntityMaps: flatObjectMetadataMaps,
})
: undefined;
if (
@@ -4,6 +4,7 @@ import { isDefined } from 'twenty-shared/utils';
import { getTargetObjectMetadataOrThrow } from 'src/engine/api/graphql/graphql-query-runner/utils/get-target-object-metadata.util';
import { getFlatFieldsFromFlatObjectMetadata } from 'src/engine/api/graphql/workspace-schema-builder/utils/get-flat-fields-for-flat-object-metadata.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 } from 'src/engine/metadata-modules/flat-field-metadata/utils/build-field-maps-from-flat-object-metadata.util';
import { isFlatFieldMetadataOfType } from 'src/engine/metadata-modules/flat-field-metadata/utils/is-flat-field-metadata-of-type.util';
@@ -29,7 +30,10 @@ export function getFieldMetadataFromGraphQLField({
const sourceFieldMetadataId = fieldIdByName[graphQLField];
let sourceFieldMetadata = sourceFieldMetadataId
? flatFieldMetadataMaps.byId[sourceFieldMetadataId]
? findFlatEntityByIdInFlatEntityMaps({
flatEntityId: sourceFieldMetadataId,
flatEntityMaps: flatFieldMetadataMaps,
})
: undefined;
// If empty, it could be a morph relation
@@ -4,6 +4,7 @@ import {
GraphqlQueryRunnerExceptionCode,
} from 'src/engine/api/graphql/graphql-query-runner/errors/graphql-query-runner.exception';
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';
@@ -19,8 +20,10 @@ export const getTargetObjectMetadataOrThrow = (
);
}
const targetObjectMetadata =
flatObjectMetadataMaps.byId[fieldMetadata.relationTargetObjectMetadataId];
const targetObjectMetadata = findFlatEntityByIdInFlatEntityMaps({
flatEntityId: fieldMetadata.relationTargetObjectMetadataId,
flatEntityMaps: flatObjectMetadataMaps,
});
if (!targetObjectMetadata) {
throw new GraphqlQueryRunnerException(
@@ -85,7 +85,7 @@ export class WorkspaceResolverFactory {
};
for (const flatObjectMetadata of Object.values(
flatObjectMetadataMaps.byId,
flatObjectMetadataMaps.byUniversalIdentifier,
).filter(isDefined)) {
// Generate query resolvers
for (const methodName of workspaceResolverBuilderMethods.queries) {
@@ -81,7 +81,7 @@ export class GqlTypeGenerator {
) {
const { flatObjectMetadataMaps, flatFieldMetadataMaps } = context;
const objectMetadataCollection = Object.values(
flatObjectMetadataMaps.byId,
flatObjectMetadataMaps.byUniversalIdentifier,
).filter(isDefined);
this.logger.log(
@@ -9,16 +9,13 @@ import {
} from 'graphql';
import { RELATION_NESTED_QUERY_KEYWORDS } from 'twenty-shared/constants';
import { compositeTypeDefinitions } from 'twenty-shared/types';
import {
getUniqueConstraintsFields,
isDefined,
pascalCase,
} from 'twenty-shared/utils';
import { getUniqueConstraintsFields, pascalCase } from 'twenty-shared/utils';
import { TypeMapperService } from 'src/engine/api/graphql/workspace-schema-builder/services/type-mapper.service';
import { GqlTypesStorage } from 'src/engine/api/graphql/workspace-schema-builder/storages/gql-types.storage';
import { type SchemaGenerationContext } from 'src/engine/api/graphql/workspace-schema-builder/types/schema-generation-context.type';
import { computeRelationConnectInputTypeKey } from 'src/engine/api/graphql/workspace-schema-builder/utils/compute-stored-gql-type-key-utils/compute-relation-connect-input-type-key.util';
import { findManyFlatEntityByIdInFlatEntityMaps } from 'src/engine/metadata-modules/flat-entity/utils/find-many-flat-entity-by-id-in-flat-entity-maps.util';
import { isCompositeFieldMetadataType } from 'src/engine/metadata-modules/field-metadata/utils/is-composite-field-metadata-type.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';
@@ -79,14 +76,14 @@ export class RelationConnectGqlInputTypeGenerator {
): Record<string, GraphQLInputFieldConfig> {
const { flatIndexMaps } = context;
const indexMetadatas = flatObjectMetadata.indexMetadataIds
.map((indexId) => flatIndexMaps.byId[indexId])
.filter(isDefined)
.map((flatIndex) => ({
id: flatIndex.id,
isUnique: flatIndex.isUnique,
indexFieldMetadatas: flatIndex.flatIndexFieldMetadatas,
}));
const indexMetadatas = findManyFlatEntityByIdInFlatEntityMaps({
flatEntityIds: flatObjectMetadata.indexMetadataIds,
flatEntityMaps: flatIndexMaps,
}).map((flatIndex) => ({
id: flatIndex.id,
isUnique: flatIndex.isUnique,
indexFieldMetadatas: flatIndex.flatIndexFieldMetadatas,
}));
const objectWithIndexes = {
id: flatObjectMetadata.id,
@@ -18,6 +18,7 @@ import { type SchemaGenerationContext } from 'src/engine/api/graphql/workspace-s
import { computeObjectMetadataInputTypeKey } from 'src/engine/api/graphql/workspace-schema-builder/utils/compute-stored-gql-type-key-utils/compute-object-metadata-input-type.util';
import { computeRelationConnectInputTypeKey } from 'src/engine/api/graphql/workspace-schema-builder/utils/compute-stored-gql-type-key-utils/compute-relation-connect-input-type-key.util';
import { extractGraphQLRelationFieldNames } from 'src/engine/api/graphql/workspace-schema-builder/utils/extract-graphql-relation-field-names.util';
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';
@Injectable()
@@ -162,10 +163,10 @@ export class RelationFieldMetadataGqlInputTypeGenerator {
isDefined(fieldMetadata.relationTargetObjectMetadataId) &&
isDefined(context)
) {
const targetObjectMetadata =
context.flatObjectMetadataMaps.byId[
fieldMetadata.relationTargetObjectMetadataId
];
const targetObjectMetadata = findFlatEntityByIdInFlatEntityMaps({
flatEntityId: fieldMetadata.relationTargetObjectMetadataId,
flatEntityMaps: context.flatObjectMetadataMaps,
});
if (isDefined(targetObjectMetadata)) {
const targetOrderByInputTypeKey = computeObjectMetadataInputTypeKey(
@@ -212,10 +213,10 @@ export class RelationFieldMetadataGqlInputTypeGenerator {
isDefined(fieldMetadata.relationTargetObjectMetadataId) &&
isDefined(context)
) {
const targetObjectMetadata =
context.flatObjectMetadataMaps.byId[
fieldMetadata.relationTargetObjectMetadataId
];
const targetObjectMetadata = findFlatEntityByIdInFlatEntityMaps({
flatEntityId: fieldMetadata.relationTargetObjectMetadataId,
flatEntityMaps: context.flatObjectMetadataMaps,
});
if (isDefined(targetObjectMetadata)) {
const targetGroupByInputTypeKey = computeObjectMetadataInputTypeKey(
@@ -18,6 +18,7 @@ import { GraphQLOutputTypeFieldConfigMap } from 'src/engine/api/graphql/workspac
import { type SchemaGenerationContext } from 'src/engine/api/graphql/workspace-schema-builder/types/schema-generation-context.type';
import { computeObjectMetadataObjectTypeKey } from 'src/engine/api/graphql/workspace-schema-builder/utils/compute-stored-gql-type-key-utils/compute-object-metadata-object-type-key.util';
import { getResolverArgs } from 'src/engine/api/graphql/workspace-schema-builder/utils/get-resolver-args.util';
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 { isMorphOrRelationFlatFieldMetadata } from 'src/engine/metadata-modules/flat-field-metadata/utils/is-morph-or-relation-flat-field-metadata.util';
import { type FlatObjectMetadata } from 'src/engine/metadata-modules/flat-object-metadata/types/flat-object-metadata.type';
@@ -110,10 +111,10 @@ export class ObjectMetadataWithRelationsGqlObjectTypeGenerator {
);
}
const objectMetadataTarget =
context.flatObjectMetadataMaps.byId[
flatFieldMetadata.relationTargetObjectMetadataId
];
const objectMetadataTarget = findFlatEntityByIdInFlatEntityMaps({
flatEntityId: flatFieldMetadata.relationTargetObjectMetadataId,
flatEntityMaps: context.flatObjectMetadataMaps,
});
if (!isDefined(objectMetadataTarget)) {
throw new Error(
@@ -49,7 +49,7 @@ export class RootTypeGenerator {
}
const objectMetadataCollection = Object.values(
context.flatObjectMetadataMaps.byId,
context.flatObjectMetadataMaps.byUniversalIdentifier,
).filter(isDefined);
this.gqlTypesStorage.addGqlType(
@@ -1,6 +1,5 @@
import { isDefined } from 'twenty-shared/utils';
import { type FlatEntityMaps } from 'src/engine/metadata-modules/flat-entity/types/flat-entity-maps.type';
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 { type FlatObjectMetadata } from 'src/engine/metadata-modules/flat-object-metadata/types/flat-object-metadata.type';
@@ -8,7 +7,8 @@ export const getFlatFieldsFromFlatObjectMetadata = (
flatObjectMetadata: FlatObjectMetadata,
flatFieldMetadataMaps: FlatEntityMaps<FlatFieldMetadata>,
): FlatFieldMetadata[] => {
return flatObjectMetadata.fieldIds
.map((fieldId) => flatFieldMetadataMaps.byId[fieldId])
.filter(isDefined);
return findManyFlatEntityByIdInFlatEntityMaps({
flatEntityIds: flatObjectMetadata.fieldIds,
flatEntityMaps: flatFieldMetadataMaps,
});
};
@@ -25,6 +25,7 @@ import { FeatureFlagService } from 'src/engine/core-modules/feature-flag/service
import { WorkspaceNotFoundDefaultError } from 'src/engine/core-modules/workspace/workspace.exception';
import { WorkspaceManyOrAllFlatEntityMapsCacheService } from 'src/engine/metadata-modules/flat-entity/services/workspace-many-or-all-flat-entity-maps-cache.service';
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 FlatIndexMetadata } from 'src/engine/metadata-modules/flat-index-metadata/types/flat-index-metadata.type';
import { type FlatObjectMetadata } from 'src/engine/metadata-modules/flat-object-metadata/types/flat-object-metadata.type';
@@ -226,13 +227,19 @@ export abstract class RestApiBaseHandler {
let objectId = idByNamePlural[parsedObject];
let flatObjectMetadataItem = objectId
? flatObjectMetadataMaps.byId[objectId]
? findFlatEntityByIdInFlatEntityMaps({
flatEntityId: objectId,
flatEntityMaps: flatObjectMetadataMaps,
})
: undefined;
if (!flatObjectMetadataItem) {
const wrongObjectId = idByNameSingular[parsedObject];
const wrongFlatObjectMetadataItem = wrongObjectId
? flatObjectMetadataMaps.byId[wrongObjectId]
? findFlatEntityByIdInFlatEntityMaps({
flatEntityId: wrongObjectId,
flatEntityMaps: flatObjectMetadataMaps,
})
: undefined;
let hint = 'eg: companies';
@@ -33,17 +33,17 @@ describe('getAllSelectableFields', () => {
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;
},
@@ -58,17 +58,17 @@ describe('computeCursorArgFilter', () => {
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;
},
@@ -15,6 +15,7 @@ import {
GraphqlQueryRunnerExceptionCode,
} from 'src/engine/api/graphql/graphql-query-runner/errors/graphql-query-runner.exception';
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';
const isOrderByDirection = (value: unknown): value is OrderByDirection => {
@@ -103,7 +104,10 @@ export const countRelationFieldsInOrderBy = (
return orderBy.filter((orderByItem) => {
const fieldName = Object.keys(orderByItem)[0];
const fieldMetadataId = fieldIdByName[fieldName];
const fieldMetadata = flatFieldMetadataMaps.byId[fieldMetadataId];
const fieldMetadata = findFlatEntityByIdInFlatEntityMaps({
flatEntityId: fieldMetadataId,
flatEntityMaps: flatFieldMetadataMaps,
});
return fieldMetadata?.type === FieldMetadataType.RELATION;
}).length;
@@ -87,8 +87,8 @@ export const mockFlatObjectMetadatas: FlatObjectMetadata[] = [
];
export const mockFlatFieldMetadataMaps: FlatEntityMaps<FlatFieldMetadata> = {
byId: {
[personNameFieldId]: getFlatFieldMetadataMock({
byUniversalIdentifier: {
'person-name-field-universal-id': getFlatFieldMetadataMock({
id: personNameFieldId,
type: FieldMetadataType.FULL_NAME,
icon: 'test-field-icon',
@@ -102,7 +102,7 @@ export const mockFlatFieldMetadataMaps: FlatEntityMaps<FlatFieldMetadata> = {
universalIdentifier: 'person-name-field-universal-id',
applicationId: workspaceId,
}),
[companyNameFieldId]: getFlatFieldMetadataMock({
'company-name-field-universal-id': getFlatFieldMetadataMock({
id: companyNameFieldId,
type: FieldMetadataType.TEXT,
icon: 'test-field-icon',
@@ -116,7 +116,7 @@ export const mockFlatFieldMetadataMaps: FlatEntityMaps<FlatFieldMetadata> = {
universalIdentifier: 'company-name-field-universal-id',
applicationId: workspaceId,
}),
[companyDomainNameFieldId]: getFlatFieldMetadataMock({
'company-domain-name-field-universal-id': getFlatFieldMetadataMock({
id: companyDomainNameFieldId,
type: FieldMetadataType.LINKS,
icon: 'test-field-icon',
@@ -134,7 +134,7 @@ export const mockFlatFieldMetadataMaps: FlatEntityMaps<FlatFieldMetadata> = {
universalIdentifier: 'company-domain-name-field-universal-id',
applicationId: workspaceId,
}),
[customObjectNameFieldId]: getFlatFieldMetadataMock({
'custom-object-name-field-universal-id': getFlatFieldMetadataMock({
id: customObjectNameFieldId,
type: FieldMetadataType.TEXT,
icon: 'test-field-icon',
@@ -148,7 +148,7 @@ export const mockFlatFieldMetadataMaps: FlatEntityMaps<FlatFieldMetadata> = {
universalIdentifier: 'custom-object-name-field-universal-id',
applicationId: workspaceId,
}),
[customObjectImageFieldId]: getFlatFieldMetadataMock({
'custom-object-image-field-universal-id': getFlatFieldMetadataMock({
id: customObjectImageFieldId,
type: FieldMetadataType.TEXT,
icon: 'test-field-icon',
@@ -163,6 +163,12 @@ export const mockFlatFieldMetadataMaps: FlatEntityMaps<FlatFieldMetadata> = {
applicationId: workspaceId,
}),
},
idByUniversalIdentifier: {},
universalIdentifierById: {
[personNameFieldId]: 'person-name-field-universal-id',
[companyNameFieldId]: 'company-name-field-universal-id',
[companyDomainNameFieldId]: 'company-domain-name-field-universal-id',
[customObjectNameFieldId]: 'custom-object-name-field-universal-id',
[customObjectImageFieldId]: 'custom-object-image-field-universal-id',
},
universalIdentifiersByApplicationId: {},
};
@@ -2,10 +2,11 @@ import { FieldMetadataType } from 'twenty-shared/types';
import { createEmptyFlatEntityMaps } from 'src/engine/metadata-modules/flat-entity/constant/create-empty-flat-entity-maps.constant';
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 { findFlatEntityByIdInFlatEntityMaps } from 'src/engine/metadata-modules/flat-entity/utils/find-flat-entity-by-id-in-flat-entity-maps.util';
import { getFlatFieldMetadataMock } from 'src/engine/metadata-modules/flat-field-metadata/__mocks__/get-flat-field-metadata.mock';
import { type FlatObjectMetadata } from 'src/engine/metadata-modules/flat-object-metadata/types/flat-object-metadata.type';
import { type FlatFieldMetadata } from 'src/engine/metadata-modules/flat-field-metadata/types/flat-field-metadata.type';
import { getFlatObjectMetadataMock } from 'src/engine/metadata-modules/flat-object-metadata/__mocks__/get-flat-object-metadata.mock';
import { type FlatObjectMetadata } from 'src/engine/metadata-modules/flat-object-metadata/types/flat-object-metadata.type';
import { type ObjectMetadataInfo } from 'src/modules/workflow/common/workspace-services/workflow-common.workspace-service';
const workspaceId = '20202020-0000-0000-0000-000000000000';
@@ -219,13 +220,13 @@ export const mockFlatObjectMetadataMaps: FlatEntityMaps<FlatObjectMetadata> =
ALL_FLAT_OBJECTS.reduce(
(acc, object) => ({
...acc,
byId: {
...acc.byId,
[object.id]: object,
byUniversalIdentifier: {
...acc.byUniversalIdentifier,
[object.universalIdentifier]: object,
},
idByUniversalIdentifier: {
...acc.idByUniversalIdentifier,
[object.universalIdentifier]: object.id,
universalIdentifierById: {
...acc.universalIdentifierById,
[object.id]: object.universalIdentifier,
},
}),
createEmptyFlatEntityMaps() as FlatEntityMaps<FlatObjectMetadata>,
@@ -235,13 +236,13 @@ export const mockFlatFieldMetadataMaps: FlatEntityMaps<FlatFieldMetadata> =
ALL_FLAT_FIELDS.reduce(
(acc, field) => ({
...acc,
byId: {
...acc.byId,
[field.id]: field,
byUniversalIdentifier: {
...acc.byUniversalIdentifier,
[field.universalIdentifier]: field,
},
idByUniversalIdentifier: {
...acc.idByUniversalIdentifier,
[field.universalIdentifier]: field.id,
universalIdentifierById: {
...acc.universalIdentifierById,
[field.id]: field.universalIdentifier,
},
}),
createEmptyFlatEntityMaps() as FlatEntityMaps<FlatFieldMetadata>,
@@ -260,7 +261,10 @@ export const getMockObjectMetadataInfo = (
nameSingular: string,
): ObjectMetadataInfo => {
const objectId = mockObjectIdByNameSingular[nameSingular];
const flatObjectMetadata = mockFlatObjectMetadataMaps.byId[objectId];
const flatObjectMetadata = findFlatEntityByIdInFlatEntityMaps({
flatEntityId: objectId,
flatEntityMaps: mockFlatObjectMetadataMaps,
});
if (!flatObjectMetadata) {
throw new Error(
@@ -67,25 +67,37 @@ describe('ActorFromAuthContextService', () => {
useValue: {
getOrRecomputeManyOrAllFlatEntityMaps: jest.fn().mockResolvedValue({
flatObjectMetadataMaps: {
byId: {
'person-id': {
byUniversalIdentifier: {
'person-universal-id': {
id: 'person-id',
nameSingular: 'person',
fieldIds: ['createdBy-id'],
universalIdentifier: 'person-universal-id',
},
},
universalIdentifierById: {
'person-id': 'person-universal-id',
},
universalIdentifiersByApplicationId: {},
},
flatFieldMetadataMaps: {
byId: {
'createdBy-id': {
byUniversalIdentifier: {
'createdBy-universal-id': {
id: 'createdBy-id',
name: 'createdBy',
objectMetadataId: 'person-id',
universalIdentifier: 'createdBy-universal-id',
},
},
universalIdentifierById: {
'createdBy-id': 'createdBy-universal-id',
},
universalIdentifiersByApplicationId: {},
},
flatIndexMaps: {
byId: {},
byUniversalIdentifier: {},
universalIdentifierById: {},
universalIdentifiersByApplicationId: {},
},
}),
},
@@ -10,6 +10,7 @@ import { buildCreatedByFromFullNameMetadata } from 'src/engine/core-modules/acto
import { type AuthContext } from 'src/engine/core-modules/auth/types/auth-context.type';
import { WorkspaceNotFoundDefaultError } from 'src/engine/core-modules/workspace/workspace.exception';
import { WorkspaceManyOrAllFlatEntityMapsCacheService } from 'src/engine/metadata-modules/flat-entity/services/workspace-many-or-all-flat-entity-maps-cache.service';
import { findFlatEntityByIdInFlatEntityMaps } from 'src/engine/metadata-modules/flat-entity/utils/find-flat-entity-by-id-in-flat-entity-maps.util';
import { buildFieldMapsFromFlatObjectMetadata } from 'src/engine/metadata-modules/flat-field-metadata/utils/build-field-maps-from-flat-object-metadata.util';
import { buildObjectIdByNameMaps } from 'src/engine/metadata-modules/flat-object-metadata/utils/build-object-id-by-name-maps.util';
import { GlobalWorkspaceOrmManager } from 'src/engine/twenty-orm/global-workspace-datasource/global-workspace-orm.manager';
@@ -103,7 +104,10 @@ export class ActorFromAuthContextService {
);
const objectId = idByNameSingular[objectMetadataNameSingular];
const objectMetadata = objectId
? flatObjectMetadataMaps.byId[objectId]
? findFlatEntityByIdInFlatEntityMaps({
flatEntityId: objectId,
flatEntityMaps: flatObjectMetadataMaps,
})
: undefined;
const fieldIdByName = objectMetadata
@@ -29,8 +29,11 @@ import { DataSourceService } from 'src/engine/metadata-modules/data-source/data-
import { CreateFieldInput } from 'src/engine/metadata-modules/field-metadata/dtos/create-field.input';
import { FieldMetadataService } from 'src/engine/metadata-modules/field-metadata/services/field-metadata.service';
import { WorkspaceManyOrAllFlatEntityMapsCacheService } from 'src/engine/metadata-modules/flat-entity/services/workspace-many-or-all-flat-entity-maps-cache.service';
import { type FlatEntityMaps } from 'src/engine/metadata-modules/flat-entity/types/flat-entity-maps.type';
import { findFlatEntitiesByApplicationId } from 'src/engine/metadata-modules/flat-entity/utils/find-flat-entities-by-application-id.util';
import { findFlatEntityByUniversalIdentifier } from 'src/engine/metadata-modules/flat-entity/utils/find-flat-entity-by-universal-identifier.util';
import { 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 { LogicFunctionService } from 'src/engine/metadata-modules/logic-function/services/logic-function.service';
import { FlatLogicFunction } from 'src/engine/metadata-modules/logic-function/types/flat-logic-function.type';
import { ObjectMetadataService } from 'src/engine/metadata-modules/object-metadata/object-metadata.service';
@@ -286,13 +289,24 @@ export class ApplicationSyncService {
);
const formattedObjectPermissions = role.objectPermissions
?.map((perm) => ({
...perm,
objectMetadataId:
flatObjectMetadataMaps.idByUniversalIdentifier[
perm.objectUniversalIdentifier
],
}))
?.map((perm) => {
const flatObjectMetadata = findFlatEntityByUniversalIdentifier({
flatEntityMaps: flatObjectMetadataMaps,
universalIdentifier: perm.objectUniversalIdentifier,
});
if (!isDefined(flatObjectMetadata)) {
throw new ApplicationException(
`Failed to find object with universalIdentifier ${perm.objectUniversalIdentifier}`,
ApplicationExceptionCode.OBJECT_NOT_FOUND,
);
}
return {
...perm,
objectMetadataId: flatObjectMetadata.id,
};
})
.filter((perm): perm is typeof perm & { objectMetadataId: string } =>
isDefined(perm.objectMetadataId),
);
@@ -309,20 +323,34 @@ export class ApplicationSyncService {
const formattedFieldPermissions = role?.fieldPermissions
?.map((perm) => {
const objectMetadataId =
flatObjectMetadataMaps.idByUniversalIdentifier[
perm.objectUniversalIdentifier
];
const flatObjectMetadata = findFlatEntityByUniversalIdentifier({
flatEntityMaps: flatObjectMetadataMaps,
universalIdentifier: perm.objectUniversalIdentifier,
});
const fieldMetadataId =
flatFieldMetadataMaps.idByUniversalIdentifier[
perm.fieldUniversalIdentifier
];
if (!isDefined(flatObjectMetadata)) {
throw new ApplicationException(
`Failed to find object with universalIdentifier ${perm.objectUniversalIdentifier}`,
ApplicationExceptionCode.OBJECT_NOT_FOUND,
);
}
const flatFieldMetadata = findFlatEntityByUniversalIdentifier({
flatEntityMaps: flatFieldMetadataMaps,
universalIdentifier: perm.fieldUniversalIdentifier,
});
if (!isDefined(flatFieldMetadata)) {
throw new ApplicationException(
`Failed to find field with universalIdentifier ${perm.fieldUniversalIdentifier}`,
ApplicationExceptionCode.FIELD_NOT_FOUND,
);
}
return {
...perm,
objectMetadataId,
fieldMetadataId,
objectMetadataId: flatObjectMetadata.id,
fieldMetadataId: flatFieldMetadata.id,
};
})
.filter(
@@ -395,7 +423,7 @@ export class ApplicationSyncService {
);
const existingFields = Object.values(
existingFlatFieldMetadataMaps.byId,
existingFlatFieldMetadataMaps.byUniversalIdentifier,
).filter(
(field) =>
isDefined(field) &&
@@ -514,9 +542,7 @@ export class ApplicationSyncService {
fieldsToSync: ObjectFieldManifest[];
workspaceId: string;
ownerFlatApplication: FlatApplication;
flatObjectMetadataMaps: {
idByUniversalIdentifier: Partial<Record<string, string>>;
};
flatObjectMetadataMaps: FlatEntityMaps<FlatObjectMetadata>;
}) {
const relationFields = fieldsToSync.filter((field) =>
this.isRelationFieldManifest(field),
@@ -532,7 +558,7 @@ export class ApplicationSyncService {
for (const relation of relationFields) {
const existingRelationField = Object.values(
flatFieldMetadataMaps.byId,
flatFieldMetadataMaps.byUniversalIdentifier,
).find(
(field) =>
isDefined(field) &&
@@ -543,12 +569,12 @@ export class ApplicationSyncService {
continue;
}
const targetObjectId =
flatObjectMetadataMaps.idByUniversalIdentifier[
relation.targetObjectUniversalIdentifier
];
const targetObjectMetadata = findFlatEntityByUniversalIdentifier({
flatEntityMaps: flatObjectMetadataMaps,
universalIdentifier: relation.targetObjectUniversalIdentifier,
});
if (!isDefined(targetObjectId)) {
if (!isDefined(targetObjectMetadata)) {
throw new ApplicationException(
`Failed to find target object with universalIdentifier ${relation.targetObjectUniversalIdentifier}`,
ApplicationExceptionCode.OBJECT_NOT_FOUND,
@@ -568,7 +594,7 @@ export class ApplicationSyncService {
workspaceId,
relationCreationPayload: {
type: relation.relationType,
targetObjectMetadataId: targetObjectId,
targetObjectMetadataId: targetObjectMetadata.id,
targetFieldLabel: relation.targetFieldLabel,
targetFieldIcon: relation.targetFieldIcon ?? 'IconRelationOneToMany',
},
@@ -600,7 +626,7 @@ export class ApplicationSyncService {
);
const applicationObjects = Object.values(
existingFlatObjectMetadataMaps.byId,
existingFlatObjectMetadataMaps.byUniversalIdentifier,
).filter(
(obj) => isDefined(obj) && obj.applicationId === ownerFlatApplication.id,
// TODO handle when migrating to trinite usage
@@ -732,12 +758,12 @@ export class ApplicationSyncService {
);
for (const objectToSync of objectsToSync) {
const sourceObjectId =
flatObjectMetadataMaps.idByUniversalIdentifier[
objectToSync.universalIdentifier
];
const sourceObjectMetadata = findFlatEntityByUniversalIdentifier({
flatEntityMaps: flatObjectMetadataMaps,
universalIdentifier: objectToSync.universalIdentifier,
});
if (!isDefined(sourceObjectId)) {
if (!isDefined(sourceObjectMetadata)) {
throw new ApplicationException(
`Failed to find source object with universalIdentifier ${objectToSync.universalIdentifier}`,
ApplicationExceptionCode.OBJECT_NOT_FOUND,
@@ -745,7 +771,7 @@ export class ApplicationSyncService {
}
await this.syncObjectFieldsRelationOnly({
objectId: sourceObjectId,
objectId: sourceObjectMetadata.id,
fieldsToSync: objectToSync.fields,
workspaceId,
ownerFlatApplication,
@@ -772,12 +798,12 @@ export class ApplicationSyncService {
);
for (const fieldToSync of fieldsToSync) {
const targetObjectId =
flatObjectMetadataMaps.idByUniversalIdentifier[
fieldToSync.objectUniversalIdentifier
];
const targetObjectMetadata = findFlatEntityByUniversalIdentifier({
flatEntityMaps: flatObjectMetadataMaps,
universalIdentifier: fieldToSync.objectUniversalIdentifier,
});
if (!isDefined(targetObjectId)) {
if (!isDefined(targetObjectMetadata)) {
throw new ApplicationException(
'Object extension must specify either nameSingular or universalIdentifier in targetObject',
ApplicationExceptionCode.INVALID_INPUT,
@@ -785,14 +811,14 @@ export class ApplicationSyncService {
}
await this.syncObjectFieldsWithoutRelations({
objectId: targetObjectId,
objectId: targetObjectMetadata.id,
fieldsToSync: [fieldToSync],
workspaceId,
ownerFlatApplication,
});
await this.syncObjectFieldsRelationOnly({
objectId: targetObjectId,
objectId: targetObjectMetadata.id,
fieldsToSync: [fieldToSync],
workspaceId,
ownerFlatApplication,
@@ -823,7 +849,7 @@ export class ApplicationSyncService {
);
const applicationLogicFunctions = Object.values(
flatLogicFunctionMaps.byId,
flatLogicFunctionMaps.byUniversalIdentifier,
).filter(
(logicFunction) =>
isDefined(logicFunction) &&
@@ -42,8 +42,8 @@ const mockObjectMetadata: FlatObjectMetadata = {
};
const mockFlatFieldMetadataMaps: FlatEntityMaps<FlatFieldMetadata> = {
byId: {},
idByUniversalIdentifier: {},
byUniversalIdentifier: {},
universalIdentifierById: {},
universalIdentifiersByApplicationId: {},
};
@@ -4,6 +4,7 @@ import { fastDeepEqual } from 'twenty-shared/utils';
import { STANDARD_OBJECTS } from 'twenty-shared/metadata';
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 } 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';
@@ -42,7 +43,12 @@ export const objectRecordChangedValues = (
return Object.keys(newRecord).reduce(
(acc, key) => {
const fieldId = fieldIdByName[key];
const field = fieldId ? flatFieldMetadataMaps.byId[fieldId] : undefined;
const field = fieldId
? findFlatEntityByIdInFlatEntityMaps({
flatEntityId: fieldId,
flatEntityMaps: flatFieldMetadataMaps,
})
: undefined;
const oldRecordValue = oldRecord[key];
const newRecordValue = newRecord[key];
@@ -15,6 +15,7 @@ import { InjectMessageQueue } from 'src/engine/core-modules/message-queue/decora
import { MessageQueue } from 'src/engine/core-modules/message-queue/message-queue.constants';
import { MessageQueueService } from 'src/engine/core-modules/message-queue/services/message-queue.service';
import { WorkspaceManyOrAllFlatEntityMapsCacheService } from 'src/engine/metadata-modules/flat-entity/services/workspace-many-or-all-flat-entity-maps-cache.service';
import { findFlatEntityByIdInFlatEntityMaps } from 'src/engine/metadata-modules/flat-entity/utils/find-flat-entity-by-id-in-flat-entity-maps.util';
import { buildObjectIdByNameMaps } from 'src/engine/metadata-modules/flat-object-metadata/utils/build-object-id-by-name-maps.util';
import { WorkspaceEventBatch } from 'src/engine/workspace-event-emitter/types/workspace-event-batch.type';
@@ -57,7 +58,10 @@ export class FilesFieldDeletionListener {
return;
}
const flatObjectMetadata = flatObjectMetadataMaps.byId[objectId];
const flatObjectMetadata = findFlatEntityByIdInFlatEntityMaps({
flatEntityId: objectId,
flatEntityMaps: flatObjectMetadataMaps,
});
if (!isDefined(flatObjectMetadata)) {
return;
@@ -80,7 +80,7 @@ export class OpenApiService {
);
const flatObjectMetadataArray = Object.values(
flatObjectMetadataMaps.byId,
flatObjectMetadataMaps.byUniversalIdentifier,
).filter(isDefined);
flatObjectMetadataArray.sort((a, b) =>
@@ -17,10 +17,18 @@ describe('computeSchemaComponents', () => {
} as any;
const flatFieldMetadataMaps = {
byId: Object.fromEntries(
objectMetadataItemMock.fields.map((f) => [f.id, f as any]),
byUniversalIdentifier: Object.fromEntries(
objectMetadataItemMock.fields.map((f) => [
f.universalIdentifier || f.id,
f as any,
]),
),
universalIdentifierById: Object.fromEntries(
objectMetadataItemMock.fields.map((f) => [
f.id,
f.universalIdentifier || f.id,
]),
),
idByUniversalIdentifier: {},
universalIdentifiersByApplicationId: {},
};
@@ -33,11 +41,17 @@ describe('computeSchemaComponents', () => {
} as any;
const flatObjectMetadataMaps = {
byId: {
[flatObjectMetadata.id]: flatObjectMetadata,
[relationTargetObjectMetadata.id]: relationTargetObjectMetadata,
byUniversalIdentifier: {
[flatObjectMetadata.universalIdentifier as string]: flatObjectMetadata,
[relationTargetObjectMetadata.universalIdentifier as string]:
relationTargetObjectMetadata,
},
universalIdentifierById: {
[flatObjectMetadata.id]:
flatObjectMetadata.universalIdentifier as string,
[relationTargetObjectMetadata.id]:
relationTargetObjectMetadata.universalIdentifier as string,
},
idByUniversalIdentifier: {},
universalIdentifiersByApplicationId: {},
};
@@ -814,7 +828,7 @@ describe('computeSchemaComponents', () => {
Pick<
FieldMetadataEntity<FieldMetadataType.NUMBER>,
'id' | 'name' | 'type' | 'isNullable' | 'defaultValue' | 'settings'
>
> & { universalIdentifier: string }
>[] = [
{
title: 'Integer dataType with decimals',
@@ -825,6 +839,7 @@ describe('computeSchemaComponents', () => {
isNullable: false,
defaultValue: null,
settings: { type: 'number', decimals: 1, dataType: NumberDataType.INT },
universalIdentifier: 'number1',
},
},
{
@@ -836,6 +851,7 @@ describe('computeSchemaComponents', () => {
isNullable: false,
defaultValue: null,
settings: { type: 'number', dataType: NumberDataType.FLOAT },
universalIdentifier: 'number2',
},
},
{
@@ -847,6 +863,7 @@ describe('computeSchemaComponents', () => {
isNullable: false,
defaultValue: null,
settings: { type: 'number', decimals: 0, dataType: NumberDataType.INT },
universalIdentifier: 'number3',
},
},
];
@@ -862,18 +879,23 @@ describe('computeSchemaComponents', () => {
} as any;
const flatFieldMetadataMaps = {
byId: {
[field.id]: field as any,
byUniversalIdentifier: {
[field.universalIdentifier || field.id]: field as any,
},
universalIdentifierById: {
[field.id]: field.universalIdentifier || field.id,
},
idByUniversalIdentifier: {},
universalIdentifiersByApplicationId: {},
};
const flatObjectMetadataMaps = {
byId: {
[flatObjectMetadata.id]: flatObjectMetadata,
byUniversalIdentifier: {
[flatObjectMetadata.universalIdentifier as string]: flatObjectMetadata,
},
universalIdentifierById: {
[flatObjectMetadata.id]:
flatObjectMetadata.universalIdentifier as string,
},
idByUniversalIdentifier: {},
universalIdentifiersByApplicationId: {},
};
@@ -25,6 +25,7 @@ import {
computeViewIdParameters,
} from 'src/engine/core-modules/open-api/utils/parameters.utils';
import { type AllFlatEntityMaps } from 'src/engine/metadata-modules/flat-entity/types/all-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 { findManyFlatEntityByIdInFlatEntityMapsOrThrow } from 'src/engine/metadata-modules/flat-entity/utils/find-many-flat-entity-by-id-in-flat-entity-maps-or-throw.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';
@@ -105,8 +106,10 @@ const getSchemaComponentsRelationProperties = (
let itemProperty = {} as Property;
if (isFieldMetadataEntityOfType(field, FieldMetadataType.RELATION)) {
const targetObjectMetadata =
flatObjectMetadataMaps.byId[field.relationTargetObjectMetadataId];
const targetObjectMetadata = findFlatEntityByIdInFlatEntityMaps({
flatEntityId: field.relationTargetObjectMetadataId,
flatEntityMaps: flatObjectMetadataMaps,
});
if (!targetObjectMetadata) {
return node;
@@ -16,6 +16,7 @@ import {
RecordCrudExceptionCode,
} from 'src/engine/core-modules/record-crud/exceptions/record-crud.exception';
import { WorkspaceManyOrAllFlatEntityMapsCacheService } from 'src/engine/metadata-modules/flat-entity/services/workspace-many-or-all-flat-entity-maps-cache.service';
import { findFlatEntityByIdInFlatEntityMaps } from 'src/engine/metadata-modules/flat-entity/utils/find-flat-entity-by-id-in-flat-entity-maps.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';
@@ -77,7 +78,10 @@ export class CommonApiContextBuilderService {
);
}
const flatObjectMetadata = flatObjectMetadataMaps.byId[objectId];
const flatObjectMetadata = findFlatEntityByIdInFlatEntityMaps({
flatEntityId: objectId,
flatEntityMaps: flatObjectMetadataMaps,
});
if (!isDefined(flatObjectMetadata)) {
throw new RecordCrudException(
@@ -12,6 +12,7 @@ import { transformLinksValue } from 'src/engine/core-modules/record-transformer/
import { transformPhonesValue } from 'src/engine/core-modules/record-transformer/utils/transform-phones-value.util';
import { transformRichTextV2Value } from 'src/engine/core-modules/record-transformer/utils/transform-rich-text-v2.util';
import { 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 { FlatFieldMetadata } from 'src/engine/metadata-modules/flat-field-metadata/types/flat-field-metadata.type';
import { buildFieldMapsFromFlatObjectMetadata } from 'src/engine/metadata-modules/flat-field-metadata/utils/build-field-maps-from-flat-object-metadata.util';
import { FlatObjectMetadata } from 'src/engine/metadata-modules/flat-object-metadata/types/flat-object-metadata.type';
@@ -37,7 +38,10 @@ export class RecordInputTransformerService {
for (const [key, value] of Object.entries(recordInput)) {
const fieldMetadataId = fieldIdByName[key];
const fieldMetadata = fieldMetadataId
? flatFieldMetadataMaps.byId[fieldMetadataId]
? findFlatEntityByIdInFlatEntityMaps({
flatEntityId: fieldMetadataId,
flatEntityMaps: flatFieldMetadataMaps,
})
: undefined;
if (!fieldMetadata) {
@@ -57,7 +57,7 @@ export class SearchResolver {
);
const flatObjectMetadatas = Object.values(
flatObjectMetadataMaps.byId,
flatObjectMetadataMaps.byUniversalIdentifier,
).filter(isDefined);
const filteredObjectMetadataItems =
@@ -26,6 +26,7 @@ import {
} from 'src/engine/core-modules/search/exceptions/search.exception';
import { type RecordsWithObjectMetadataItem } from 'src/engine/core-modules/search/types/records-with-object-metadata-item';
import { formatSearchTerms } from 'src/engine/core-modules/search/utils/format-search-terms';
import { findFlatEntityByIdInFlatEntityMaps } from 'src/engine/metadata-modules/flat-entity/utils/find-flat-entity-by-id-in-flat-entity-maps.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';
@@ -308,10 +309,10 @@ export class SearchService {
);
}
const labelIdentifierField =
flatFieldMetadataMaps.byId[
flatObjectMetadata.labelIdentifierFieldMetadataId
];
const labelIdentifierField = findFlatEntityByIdInFlatEntityMaps({
flatEntityId: flatObjectMetadata.labelIdentifierFieldMetadataId,
flatEntityMaps: flatFieldMetadataMaps,
});
if (!isDefined(labelIdentifierField)) {
throw new SearchException(
@@ -355,10 +356,10 @@ export class SearchService {
return null;
}
const imageIdentifierField =
flatFieldMetadataMaps.byId[
flatObjectMetadata.imageIdentifierFieldMetadataId
];
const imageIdentifierField = findFlatEntityByIdInFlatEntityMaps({
flatEntityId: flatObjectMetadata.imageIdentifierFieldMetadataId,
flatEntityMaps: flatFieldMetadataMaps,
});
if (!isDefined(imageIdentifierField)) {
return null;
@@ -90,7 +90,9 @@ export class PerObjectToolGeneratorService {
},
);
const allFlatObjects = Object.values(flatObjectMetadataMaps.byId)
const allFlatObjects = Object.values(
flatObjectMetadataMaps.byUniversalIdentifier,
)
.filter(isDefined)
.filter((obj) => obj.isActive && !obj.isSystem);
@@ -123,7 +123,9 @@ export class DatabaseToolProvider implements ToolProvider {
},
);
const allFlatObjects = Object.values(flatObjectMetadataMaps.byId)
const allFlatObjects = Object.values(
flatObjectMetadataMaps.byUniversalIdentifier,
)
.filter(isDefined)
.filter((obj) => obj.isActive && !obj.isSystem);
@@ -39,7 +39,7 @@ export class LogicFunctionToolProvider implements ToolProvider {
// Filter logic functions that are marked as tools
const logicFunctionsWithSchema = Object.values(
flatLogicFunctionMaps.byId,
flatLogicFunctionMaps.byUniversalIdentifier,
).filter(
(fn): fn is FlatLogicFunction =>
isDefined(fn) && fn.isTool === true && fn.deletedAt === null,
@@ -420,7 +420,9 @@ export class WorkspaceService extends TypeOrmQueryService<WorkspaceEntity> {
},
);
const fields = Object.values(flatFieldMetadataMaps.byId).filter(isDefined);
const fields = Object.values(
flatFieldMetadataMaps.byUniversalIdentifier,
).filter(isDefined);
if (fields.length === 0) {
return 0;
@@ -16,6 +16,7 @@ import { RelationDTO } from 'src/engine/metadata-modules/field-metadata/dtos/rel
import { type FieldMetadataEntity } from 'src/engine/metadata-modules/field-metadata/field-metadata.entity';
import { resolveFieldMetadataStandardOverride } from 'src/engine/metadata-modules/field-metadata/utils/resolve-field-metadata-standard-override.util';
import { WorkspaceManyOrAllFlatEntityMapsCacheService } from 'src/engine/metadata-modules/flat-entity/services/workspace-many-or-all-flat-entity-maps-cache.service';
import { findFlatEntityByIdInFlatEntityMaps } from 'src/engine/metadata-modules/flat-entity/utils/find-flat-entity-by-id-in-flat-entity-maps.util';
import { findFlatEntityByIdInFlatEntityMapsOrThrow } from 'src/engine/metadata-modules/flat-entity/utils/find-flat-entity-by-id-in-flat-entity-maps-or-throw.util';
import { findManyFlatEntityByIdInFlatEntityMapsOrThrow } from 'src/engine/metadata-modules/flat-entity/utils/find-many-flat-entity-by-id-in-flat-entity-maps-or-throw.util';
import { findAllOthersMorphRelationFlatFieldMetadatasOrThrow } from 'src/engine/metadata-modules/flat-field-metadata/utils/find-all-others-morph-relation-flat-field-metadatas-or-throw.util';
@@ -458,7 +459,10 @@ export class DataloaderService {
return dataLoaderParams.map(
({ indexMetadata: { id: indexMetadataId } }) => {
const indexMetadataEntity = flatIndexMaps.byId[indexMetadataId];
const indexMetadataEntity = findFlatEntityByIdInFlatEntityMaps({
flatEntityId: indexMetadataId,
flatEntityMaps: flatIndexMaps,
});
if (!isDefined(indexMetadataEntity)) {
return [];
@@ -498,8 +502,10 @@ export class DataloaderService {
);
return dataLoaderParams.map((dataLoaderParam) => {
const flatObjectMetadata =
flatObjectMetadataMaps.byId[dataLoaderParam.objectMetadataId];
const flatObjectMetadata = findFlatEntityByIdInFlatEntityMaps({
flatEntityId: dataLoaderParam.objectMetadataId,
flatEntityMaps: flatObjectMetadataMaps,
});
if (!isDefined(flatObjectMetadata)) {
return null;
@@ -37,7 +37,7 @@ export class AgentService {
'flatRoleTargetByAgentIdMaps',
]);
return Object.values(flatAgentMaps.byId)
return Object.values(flatAgentMaps.byUniversalIdentifier)
.filter(isDefined)
.map((flatAgent) => {
const roleId = flatRoleTargetByAgentIdMaps[flatAgent.id]?.roleId;
@@ -13,6 +13,7 @@ import {
import { type UpdateAgentInput } from 'src/engine/metadata-modules/ai/ai-agent/dtos/update-agent.input';
import { FLAT_AGENT_EDITABLE_PROPERTIES } from 'src/engine/metadata-modules/flat-agent/constants/flat-agent-editable-properties.constant';
import { type FlatAgentMaps } from 'src/engine/metadata-modules/flat-agent/types/flat-agent-maps.type';
import { findFlatEntityByIdInFlatEntityMaps } from 'src/engine/metadata-modules/flat-entity/utils/find-flat-entity-by-id-in-flat-entity-maps.util';
import { type FlatAgent } from 'src/engine/metadata-modules/flat-agent/types/flat-agent.type';
import { type FlatRoleTargetByAgentIdMaps } from 'src/engine/metadata-modules/flat-agent/types/flat-role-target-by-agent-id-maps.type';
import { type FlatRoleTarget } from 'src/engine/metadata-modules/flat-role-target/types/flat-role-target.type';
@@ -95,7 +96,10 @@ export const fromUpdateAgentInputToFlatAgentToUpdate = ({
['id'],
);
const existingFlatAgent = flatAgentMaps.byId[agentIdToUpdate];
const existingFlatAgent = findFlatEntityByIdInFlatEntityMaps({
flatEntityId: agentIdToUpdate,
flatEntityMaps: flatAgentMaps,
});
if (!isDefined(existingFlatAgent)) {
throw new AgentException(
@@ -38,7 +38,7 @@ export class CommandMenuItemService {
},
);
return Object.values(flatCommandMenuItemMaps.byId)
return Object.values(flatCommandMenuItemMaps.byUniversalIdentifier)
.filter(isDefined)
.sort((a, b) => a.label.localeCompare(b.label))
.map(fromFlatCommandMenuItemToCommandMenuItemDto);
@@ -263,7 +263,7 @@ export class CommandMenuItemService {
},
);
return Object.values(flatCommandMenuItemMaps.byId)
return Object.values(flatCommandMenuItemMaps.byUniversalIdentifier)
.filter(isDefined)
.sort((a, b) => a.label.localeCompare(b.label));
}
@@ -281,7 +281,7 @@ export class CommandMenuItemService {
);
const flatCommandMenuItem = Object.values(
flatCommandMenuItemMaps.byId,
flatCommandMenuItemMaps.byUniversalIdentifier,
).find(
(item) => isDefined(item) && item.workflowVersionId === workflowVersionId,
);
@@ -3,7 +3,7 @@ import { type FlatEntityMaps } from 'src/engine/metadata-modules/flat-entity/typ
export const createEmptyFlatEntityMaps = () =>
({
byId: {},
idByUniversalIdentifier: {},
byUniversalIdentifier: {},
universalIdentifierById: {},
universalIdentifiersByApplicationId: {},
}) as const satisfies FlatEntityMaps<SyncableFlatEntity>;
@@ -1,7 +1,10 @@
import { type SyncableFlatEntity } from 'src/engine/metadata-modules/flat-entity/types/flat-entity-from.type';
import { type UniversalSyncableFlatEntity } from 'src/engine/workspace-manager/workspace-migration/universal-flat-entity/types/universal-flat-entity-from.type';
export type FlatEntityMaps<T extends SyncableFlatEntity> = {
byId: Partial<Record<string, T>>;
idByUniversalIdentifier: Partial<Record<string, string>>;
export type FlatEntityMaps<
T extends SyncableFlatEntity | UniversalSyncableFlatEntity,
> = {
byUniversalIdentifier: Partial<Record<string, T>>;
universalIdentifierById: Partial<Record<string, string>>;
universalIdentifiersByApplicationId: Partial<Record<string, string[]>>;
};
@@ -4,6 +4,7 @@ import { createEmptyFlatEntityMaps } from 'src/engine/metadata-modules/flat-enti
import { type MetadataFlatEntityAndRelatedFlatEntityMaps } from 'src/engine/metadata-modules/flat-entity/types/metadata-related-types.type';
import { addFlatEntityToFlatEntityAndRelatedEntityMapsThroughMutationOrThrow } from 'src/engine/metadata-modules/flat-entity/utils/add-flat-entity-to-flat-entity-and-related-entity-maps-through-mutation-or-throw.util';
import { addFlatEntityToFlatEntityMapsOrThrow } from 'src/engine/metadata-modules/flat-entity/utils/add-flat-entity-to-flat-entity-maps-or-throw.util';
import { findFlatEntityByIdInFlatEntityMaps } from 'src/engine/metadata-modules/flat-entity/utils/find-flat-entity-by-id-in-flat-entity-maps.util';
import { getFlatFieldMetadataMock } from 'src/engine/metadata-modules/flat-field-metadata/__mocks__/get-flat-field-metadata.mock';
import { type FlatFieldMetadata } from 'src/engine/metadata-modules/flat-field-metadata/types/flat-field-metadata.type';
import { getFlatObjectMetadataMock } from 'src/engine/metadata-modules/flat-object-metadata/__mocks__/get-flat-object-metadata.mock';
@@ -72,21 +73,26 @@ describe('addFlatEntityToFlatEntityAndRelatedEntityMapsThroughMutationOrThrow',
});
expect(
flatEntityAndRelatedMapsToMutate.flatViewMaps.byId[mockView.id],
findFlatEntityByIdInFlatEntityMaps({
flatEntityId: mockView.id,
flatEntityMaps: flatEntityAndRelatedMapsToMutate.flatViewMaps,
}),
).toMatchObject(mockView);
expect(
flatEntityAndRelatedMapsToMutate.flatObjectMetadataMaps.byId[
objectMetadataId
],
findFlatEntityByIdInFlatEntityMaps({
flatEntityId: objectMetadataId,
flatEntityMaps: flatEntityAndRelatedMapsToMutate.flatObjectMetadataMaps,
}),
).toMatchObject<Partial<FlatObjectMetadata>>({
viewIds: [mockView.id],
});
expect(
flatEntityAndRelatedMapsToMutate.flatFieldMetadataMaps.byId[
mockFieldMetadata.id
],
findFlatEntityByIdInFlatEntityMaps({
flatEntityId: mockFieldMetadata.id,
flatEntityMaps: flatEntityAndRelatedMapsToMutate.flatFieldMetadataMaps,
}),
).toMatchObject<Partial<FlatFieldMetadata>>({
calendarViewIds: [mockView.id],
});
@@ -4,6 +4,7 @@ import { createEmptyFlatEntityMaps } from 'src/engine/metadata-modules/flat-enti
import { type MetadataFlatEntityAndRelatedFlatEntityMaps } from 'src/engine/metadata-modules/flat-entity/types/metadata-related-types.type';
import { addFlatEntityToFlatEntityMapsOrThrow } from 'src/engine/metadata-modules/flat-entity/utils/add-flat-entity-to-flat-entity-maps-or-throw.util';
import { deleteFlatEntityFromFlatEntityAndRelatedEntityMapsThroughMutationOrThrow } from 'src/engine/metadata-modules/flat-entity/utils/delete-flat-entity-from-flat-entity-and-related-entity-maps-through-mutation-or-throw.util';
import { findFlatEntityByIdInFlatEntityMaps } from 'src/engine/metadata-modules/flat-entity/utils/find-flat-entity-by-id-in-flat-entity-maps.util';
import { getFlatFieldMetadataMock } from 'src/engine/metadata-modules/flat-field-metadata/__mocks__/get-flat-field-metadata.mock';
import { type FlatFieldMetadata } from 'src/engine/metadata-modules/flat-field-metadata/types/flat-field-metadata.type';
import { getFlatObjectMetadataMock } from 'src/engine/metadata-modules/flat-object-metadata/__mocks__/get-flat-object-metadata.mock';
@@ -82,21 +83,26 @@ describe('deleteFlatEntityFromFlatEntityAndRelatedEntityMapsThroughMutationOrThr
});
expect(
flatEntityAndRelatedMapsToMutate.flatViewMaps.byId[viewId],
findFlatEntityByIdInFlatEntityMaps({
flatEntityId: viewId,
flatEntityMaps: flatEntityAndRelatedMapsToMutate.flatViewMaps,
}),
).toBeUndefined();
expect(
flatEntityAndRelatedMapsToMutate.flatObjectMetadataMaps.byId[
objectMetadataId
],
findFlatEntityByIdInFlatEntityMaps({
flatEntityId: objectMetadataId,
flatEntityMaps: flatEntityAndRelatedMapsToMutate.flatObjectMetadataMaps,
}),
).toMatchObject<Partial<FlatObjectMetadata>>({
viewIds: ['something-else'],
});
expect(
flatEntityAndRelatedMapsToMutate.flatFieldMetadataMaps.byId[
mockFieldMetadata.id
],
findFlatEntityByIdInFlatEntityMaps({
flatEntityId: mockFieldMetadata.id,
flatEntityMaps: flatEntityAndRelatedMapsToMutate.flatFieldMetadataMaps,
}),
).toMatchObject<Partial<FlatFieldMetadata>>({
calendarViewIds: [],
});
@@ -18,7 +18,11 @@ export const addFlatEntityToFlatEntityMapsOrThrow = <
flatEntity,
flatEntityMaps,
}: AddFlatEntityToFlatEntityMapsOrThrowArgs<T>): FlatEntityMaps<T> => {
if (isDefined(flatEntityMaps.byId[flatEntity.id])) {
if (
isDefined(
flatEntityMaps.byUniversalIdentifier[flatEntity.universalIdentifier],
)
) {
throw new FlatEntityMapsException(
'addFlatEntityToFlatEntityMapsOrThrow: flat entity to add already exists',
FlatEntityMapsExceptionCode.ENTITY_ALREADY_EXISTS,
@@ -26,13 +30,13 @@ export const addFlatEntityToFlatEntityMapsOrThrow = <
}
return {
byId: {
...flatEntityMaps.byId,
[flatEntity.id]: flatEntity,
byUniversalIdentifier: {
...flatEntityMaps.byUniversalIdentifier,
[flatEntity.universalIdentifier]: flatEntity,
},
idByUniversalIdentifier: {
...flatEntityMaps.idByUniversalIdentifier,
[flatEntity.universalIdentifier]: flatEntity.id,
universalIdentifierById: {
...flatEntityMaps.universalIdentifierById,
[flatEntity.id]: flatEntity.universalIdentifier,
},
universalIdentifiersByApplicationId: {
...flatEntityMaps.universalIdentifiersByApplicationId,
@@ -4,7 +4,7 @@ import { type FlatEntityToCreateDeleteUpdate } from 'src/engine/metadata-modules
import { type MetadataFlatEntityMaps } from 'src/engine/metadata-modules/flat-entity/types/metadata-flat-entity-maps.type';
import { addFlatEntityToFlatEntityMapsOrThrow } from 'src/engine/metadata-modules/flat-entity/utils/add-flat-entity-to-flat-entity-maps-or-throw.util';
import { deleteFlatEntityFromFlatEntityMapsOrThrow } from 'src/engine/metadata-modules/flat-entity/utils/delete-flat-entity-from-flat-entity-maps-or-throw.util';
import { getSubFlatEntityMapsOrThrow } from 'src/engine/metadata-modules/flat-entity/utils/get-sub-flat-entity-maps-or-throw.util';
import { getSubFlatEntityByIdsMapsOrThrow } from 'src/engine/metadata-modules/flat-entity/utils/get-sub-flat-entity-by-ids-maps-or-throw.util';
import { replaceFlatEntityInFlatEntityMapsOrThrow } from 'src/engine/metadata-modules/flat-entity/utils/replace-flat-entity-in-flat-entity-maps-or-throw.util';
export type ComputeFlatEntityMapsFromToArgs<T extends AllMetadataName> = {
@@ -21,7 +21,7 @@ export const computeFlatEntityMapsFromTo = <T extends AllMetadataName>({
} => {
const fromFlatEntityMaps =
flatEntityToDelete.length > 0
? getSubFlatEntityMapsOrThrow({
? getSubFlatEntityByIdsMapsOrThrow({
flatEntityIds: [...flatEntityToDelete, ...flatEntityToUpdate].map(
({ id }) => id,
),
@@ -21,16 +21,19 @@ export const deleteFlatEntityFromFlatEntityMapsOrThrow = <
flatEntityMaps,
entityToDeleteId,
}: DeleteFlatEntityFromFlatEntityMapsOrThrowArgs<T>): FlatEntityMaps<T> => {
if (!isDefined(flatEntityMaps.byId[entityToDeleteId])) {
const universalIdentifierToDelete =
flatEntityMaps.universalIdentifierById[entityToDeleteId];
if (!isDefined(universalIdentifierToDelete)) {
throw new FlatEntityMapsException(
'deleteFlatEntityFromFlatEntityMapsOrThrow: entity to delete not found',
FlatEntityMapsExceptionCode.ENTITY_NOT_FOUND,
);
}
const updatedIdByUniversalIdentifierEntries = Object.entries(
flatEntityMaps.idByUniversalIdentifier,
).filter(([_universalIdentifier, id]) => id !== entityToDeleteId);
const updatedUniversalIdentifierByIdEntries = Object.entries(
flatEntityMaps.universalIdentifierById,
).filter(([id]) => id !== entityToDeleteId);
const updatedUniversalIdentifiersByApplicationIdEntries = Object.entries(
flatEntityMaps.universalIdentifiersByApplicationId,
@@ -38,10 +41,7 @@ export const deleteFlatEntityFromFlatEntityMapsOrThrow = <
.map(([applicationId, universalIdentifiers]) => {
const stillPresentUniversalIdentifiers = universalIdentifiers?.filter(
(universalIdentifier) =>
updatedIdByUniversalIdentifierEntries.some(
([existingUniversalIdentifier]) =>
existingUniversalIdentifier === universalIdentifier,
),
universalIdentifier !== universalIdentifierToDelete,
);
if (
@@ -56,9 +56,12 @@ export const deleteFlatEntityFromFlatEntityMapsOrThrow = <
.filter(isDefined);
return {
byId: removePropertiesFromRecord(flatEntityMaps.byId, [entityToDeleteId]),
idByUniversalIdentifier: Object.fromEntries(
updatedIdByUniversalIdentifierEntries,
byUniversalIdentifier: removePropertiesFromRecord(
flatEntityMaps.byUniversalIdentifier,
[universalIdentifierToDelete],
),
universalIdentifierById: Object.fromEntries(
updatedUniversalIdentifierByIdEntries,
),
universalIdentifiersByApplicationId: Object.fromEntries(
updatedUniversalIdentifiersByApplicationIdEntries,
@@ -19,13 +19,7 @@ export const findFlatEntitiesByApplicationId = <T extends SyncableFlatEntity>({
return universalIdentifiers
.map((universalId) => {
const id = flatEntityMaps.idByUniversalIdentifier[universalId];
if (!isDefined(id)) {
return undefined;
}
const entity = flatEntityMaps.byId[id];
const entity = flatEntityMaps.byUniversalIdentifier[universalId];
if (!isDefined(entity)) {
return undefined;
@@ -20,7 +20,17 @@ export const findFlatEntityByIdInFlatEntityMapsOrThrow = <
flatEntityMaps,
flatEntityId,
}: FindFlatEntityByIdInFlatEntityMapsOrThrowArgs<T>): T => {
const flatEntity = flatEntityMaps.byId[flatEntityId];
const universalIdentifier =
flatEntityMaps.universalIdentifierById[flatEntityId];
if (!isDefined(universalIdentifier)) {
throw new FlatEntityMapsException(
t`Could not find flat entity in maps`,
FlatEntityMapsExceptionCode.ENTITY_NOT_FOUND,
);
}
const flatEntity = flatEntityMaps.byUniversalIdentifier[universalIdentifier];
if (!isDefined(flatEntity)) {
throw new FlatEntityMapsException(
@@ -1,5 +1,3 @@
import { isDefined } from 'twenty-shared/utils';
import { type SyncableFlatEntity } from 'src/engine/metadata-modules/flat-entity/types/flat-entity-from.type';
import { type FlatEntityMaps } from 'src/engine/metadata-modules/flat-entity/types/flat-entity-maps.type';
@@ -11,20 +9,6 @@ export const findFlatEntityByUniversalIdentifier = <
}: {
flatEntityMaps: FlatEntityMaps<T>;
universalIdentifier: string;
}): (T & { id: string }) | undefined => {
const flatEntityId =
flatEntityMaps.idByUniversalIdentifier[universalIdentifier];
if (!isDefined(flatEntityId)) {
return;
}
const result = flatEntityMaps.byId[flatEntityId];
return isDefined(result)
? {
...result,
id: flatEntityId,
}
: undefined;
}): T | undefined => {
return flatEntityMaps.byUniversalIdentifier[universalIdentifier];
};
@@ -2,7 +2,7 @@ import { isDefined } from 'twenty-shared/utils';
import { type SyncableFlatEntity } from 'src/engine/metadata-modules/flat-entity/types/flat-entity-from.type';
import { type FlatEntityMaps } from 'src/engine/metadata-modules/flat-entity/types/flat-entity-maps.type';
import { getSubFlatEntityMapsOrThrow } from 'src/engine/metadata-modules/flat-entity/utils/get-sub-flat-entity-maps-or-throw.util';
import { getSubFlatEntityByIdsMapsOrThrow } from 'src/engine/metadata-modules/flat-entity/utils/get-sub-flat-entity-by-ids-maps-or-throw.util';
export type FindManyFlatEntityByIdInFlatEntityMapsOrThrowArgs<
T extends SyncableFlatEntity,
@@ -16,10 +16,12 @@ export const findManyFlatEntityByIdInFlatEntityMapsOrThrow = <
flatEntityMaps,
flatEntityIds,
}: FindManyFlatEntityByIdInFlatEntityMapsOrThrowArgs<T>): T[] => {
const subFlatEntityMaps = getSubFlatEntityMapsOrThrow<T>({
const subFlatEntityMaps = getSubFlatEntityByIdsMapsOrThrow<T>({
flatEntityIds,
flatEntityMaps,
});
return Object.values(subFlatEntityMaps.byId).filter(isDefined);
return Object.values(subFlatEntityMaps.byUniversalIdentifier).filter(
isDefined,
);
};
@@ -0,0 +1,28 @@
import { isDefined } from 'twenty-shared/utils';
import { type SyncableFlatEntity } from 'src/engine/metadata-modules/flat-entity/types/flat-entity-from.type';
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';
export type FindManyFlatEntityByIdInFlatEntityMapsArgs<
T extends SyncableFlatEntity,
> = {
flatEntityMaps: FlatEntityMaps<T>;
flatEntityIds: string[];
};
export const findManyFlatEntityByIdInFlatEntityMaps = <
T extends SyncableFlatEntity,
>({
flatEntityMaps,
flatEntityIds,
}: FindManyFlatEntityByIdInFlatEntityMapsArgs<T>): T[] => {
return flatEntityIds
.map((flatEntityId) =>
findFlatEntityByIdInFlatEntityMaps({
flatEntityId,
flatEntityMaps,
}),
)
.filter(isDefined);
};
@@ -4,7 +4,7 @@ import { type FlatEntityMaps } from 'src/engine/metadata-modules/flat-entity/typ
import { addFlatEntityToFlatEntityMapsOrThrow } from 'src/engine/metadata-modules/flat-entity/utils/add-flat-entity-to-flat-entity-maps-or-throw.util';
import { findFlatEntityByIdInFlatEntityMapsOrThrow } from 'src/engine/metadata-modules/flat-entity/utils/find-flat-entity-by-id-in-flat-entity-maps-or-throw.util';
export const getSubFlatEntityMapsOrThrow = <T extends SyncableFlatEntity>({
export const getSubFlatEntityByIdsMapsOrThrow = <T extends SyncableFlatEntity>({
flatEntityIds,
flatEntityMaps,
}: {
@@ -1,7 +1,7 @@
import { type SyncableFlatEntity } from 'src/engine/metadata-modules/flat-entity/types/flat-entity-from.type';
import { type FlatEntityMaps } from 'src/engine/metadata-modules/flat-entity/types/flat-entity-maps.type';
import { findFlatEntitiesByApplicationId } from 'src/engine/metadata-modules/flat-entity/utils/find-flat-entities-by-application-id.util';
import { getSubFlatEntityMapsOrThrow } from 'src/engine/metadata-modules/flat-entity/utils/get-sub-flat-entity-maps-or-throw.util';
import { getSubFlatEntityByIdsMapsOrThrow } from 'src/engine/metadata-modules/flat-entity/utils/get-sub-flat-entity-by-ids-maps-or-throw.util';
export const getSubFlatEntityMapsByApplicationIdOrThrow = <
T extends SyncableFlatEntity,
@@ -17,7 +17,7 @@ export const getSubFlatEntityMapsByApplicationIdOrThrow = <
flatEntityMaps,
});
return getSubFlatEntityMapsOrThrow({
return getSubFlatEntityByIdsMapsOrThrow({
flatEntityIds: allApplicationFlatEntity.map((flatEntity) => flatEntity.id),
flatEntityMaps,
});
@@ -7,6 +7,7 @@ import { computeMorphRelationFieldName, isDefined } from 'twenty-shared/utils';
import { type FlatApplication } from 'src/engine/core-modules/application/types/flat-application.type';
import { computeMorphOrRelationFieldJoinColumnName } from 'src/engine/metadata-modules/field-metadata/utils/compute-morph-or-relation-field-join-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 { findFlatEntityByIdInFlatEntityMapsOrThrow } from 'src/engine/metadata-modules/flat-entity/utils/find-flat-entity-by-id-in-flat-entity-maps-or-throw.util';
import { type FlatFieldMetadata } from 'src/engine/metadata-modules/flat-field-metadata/types/flat-field-metadata.type';
import { extractJunctionTargetSettingsFromSettings } from 'src/engine/metadata-modules/flat-field-metadata/utils/extract-junction-target-settings-from-settings.util';
@@ -74,7 +75,10 @@ export const computeFlatFieldToUpdateFromMorphRelationUpdatePayload = ({
fieldMetadataToUpdate.settings,
);
const junctionTargetFlatFieldMetadata = isDefined(junctionTargetFieldId)
? flatFieldMetadataMaps.byId[junctionTargetFieldId]
? findFlatEntityByIdInFlatEntityMaps({
flatEntityId: junctionTargetFieldId,
flatEntityMaps: flatFieldMetadataMaps,
})
: undefined;
morphRelationsUpdatePayload.forEach((morphRelationUpdatePayload) => {
@@ -6,6 +6,7 @@ import {
FlatEntityMapsExceptionCode,
} from 'src/engine/metadata-modules/flat-entity/exceptions/flat-entity-maps.exception';
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 { findManyFlatEntityByIdInFlatEntityMapsOrThrow } from 'src/engine/metadata-modules/flat-entity/utils/find-many-flat-entity-by-id-in-flat-entity-maps-or-throw.util';
import { type FlatFieldMetadata } from 'src/engine/metadata-modules/flat-field-metadata/types/flat-field-metadata.type';
import { isFlatFieldMetadataOfType } from 'src/engine/metadata-modules/flat-field-metadata/utils/is-flat-field-metadata-of-type.util';
@@ -22,7 +23,12 @@ export const findAllOthersMorphRelationFlatFieldMetadatasOrThrow = ({
flatFieldMetadata: morphRelationFlatFieldMetadata,
}: FindAllMorphRelationFlatFieldMetadatasOrThrowArgs): FlatFieldMetadata<FieldMetadataType.MORPH_RELATION>[] => {
if (
!isDefined(flatFieldMetadataMaps.byId[morphRelationFlatFieldMetadata.id])
!isDefined(
findFlatEntityByIdInFlatEntityMaps({
flatEntityId: morphRelationFlatFieldMetadata.id,
flatEntityMaps: flatFieldMetadataMaps,
}),
)
) {
throw new FlatEntityMapsException(
'Morph relation field not found in flat field metadata maps',
@@ -6,6 +6,7 @@ import {
} from 'src/engine/metadata-modules/field-metadata/field-metadata.exception';
import { type MorphOrRelationFieldMetadataType } from 'src/engine/metadata-modules/field-metadata/types/morph-or-relation-field-metadata-type.type';
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 { isMorphOrRelationFlatFieldMetadata } from 'src/engine/metadata-modules/flat-field-metadata/utils/is-morph-or-relation-flat-field-metadata.util';
@@ -20,8 +21,10 @@ export const findRelationFlatFieldMetadataTargetFlatFieldMetadataOrThrow = ({
}: GetRelationFlatFieldMetadatasUtilArgs): FlatFieldMetadata<MorphOrRelationFieldMetadataType> => {
const { relationTargetFieldMetadataId } = flatFieldMetadata;
const relatedFlatFieldMetadata =
flatFieldMetadataMaps.byId[relationTargetFieldMetadataId];
const relatedFlatFieldMetadata = findFlatEntityByIdInFlatEntityMaps({
flatEntityId: relationTargetFieldMetadataId,
flatEntityMaps: flatFieldMetadataMaps,
});
if (!isDefined(relatedFlatFieldMetadata)) {
throw new FieldMetadataException(
@@ -15,6 +15,7 @@ import { type CreateFieldInput } from 'src/engine/metadata-modules/field-metadat
import { FieldMetadataExceptionCode } from 'src/engine/metadata-modules/field-metadata/field-metadata.exception';
import { generateRatingOptions } from 'src/engine/metadata-modules/field-metadata/utils/generate-rating-optionts.util';
import { type AllFlatEntityMaps } from 'src/engine/metadata-modules/flat-entity/types/all-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 FieldInputTranspilationResult } from 'src/engine/metadata-modules/flat-field-metadata/types/field-input-transpilation-result.type';
import { type FlatFieldMetadata } from 'src/engine/metadata-modules/flat-field-metadata/types/flat-field-metadata.type';
import { fromMorphRelationCreateFieldInputToFlatFieldMetadatas } from 'src/engine/metadata-modules/flat-field-metadata/utils/from-morph-relation-create-field-input-to-flat-field-metadatas.util';
@@ -58,8 +59,10 @@ export const fromCreateFieldInputToFlatFieldMetadatasToCreate = async ({
rawCreateFieldInput,
['description', 'icon', 'label', 'name', 'objectMetadataId', 'type'],
);
const parentFlatObjectMetadata =
existingFlatObjectMetadataMaps.byId[createFieldInput.objectMetadataId];
const parentFlatObjectMetadata = findFlatEntityByIdInFlatEntityMaps({
flatEntityId: createFieldInput.objectMetadataId,
flatEntityMaps: existingFlatObjectMetadataMaps,
});
if (!isDefined(parentFlatObjectMetadata)) {
return {
@@ -77,9 +77,9 @@ export const fromDeleteFieldInputToFlatFieldMetadatasToDelete = ({
];
const flatIndexMap = new Map<string, FlatIndexMetadata>();
const allFlatIndexes = Object.values(existingFlatIndexMaps.byId).filter(
isDefined,
);
const allFlatIndexes = Object.values(
existingFlatIndexMaps.byUniversalIdentifier,
).filter(isDefined);
for (const flatFieldMetadata of flatFieldMetadatasToDelete) {
allFlatIndexes.forEach((flatIndex) => {
@@ -8,6 +8,7 @@ import { type CreateFieldInput } from 'src/engine/metadata-modules/field-metadat
import { FieldMetadataExceptionCode } from 'src/engine/metadata-modules/field-metadata/field-metadata.exception';
import { computeMorphOrRelationFieldJoinColumnName } from 'src/engine/metadata-modules/field-metadata/utils/compute-morph-or-relation-field-join-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 FieldInputTranspilationResult } from 'src/engine/metadata-modules/flat-field-metadata/types/field-input-transpilation-result.type';
import { type FlatFieldMetadata } from 'src/engine/metadata-modules/flat-field-metadata/types/flat-field-metadata.type';
import { extractJunctionTargetSettingsFromSettings } from 'src/engine/metadata-modules/flat-field-metadata/utils/extract-junction-target-settings-from-settings.util';
@@ -74,7 +75,10 @@ export const fromMorphRelationCreateFieldInputToFlatFieldMetadatas = async ({
createFieldInput.settings,
);
const junctionTargetFlatFieldMetadata = isDefined(junctionTargetFieldId)
? existingFlatFieldMetadataMaps.byId[junctionTargetFieldId]
? findFlatEntityByIdInFlatEntityMaps({
flatEntityId: junctionTargetFieldId,
flatEntityMaps: existingFlatFieldMetadataMaps,
})
: undefined;
const morphRelationCreationPayload =
@@ -7,6 +7,7 @@ import { type CreateFieldInput } from 'src/engine/metadata-modules/field-metadat
import { FieldMetadataExceptionCode } from 'src/engine/metadata-modules/field-metadata/field-metadata.exception';
import { computeMorphOrRelationFieldJoinColumnName } from 'src/engine/metadata-modules/field-metadata/utils/compute-morph-or-relation-field-join-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 FieldInputTranspilationResult } from 'src/engine/metadata-modules/flat-field-metadata/types/field-input-transpilation-result.type';
import { type FlatFieldMetadata } from 'src/engine/metadata-modules/flat-field-metadata/types/flat-field-metadata.type';
import { extractJunctionTargetSettingsFromSettings } from 'src/engine/metadata-modules/flat-field-metadata/utils/extract-junction-target-settings-from-settings.util';
@@ -68,7 +69,10 @@ export const fromRelationCreateFieldInputToFlatFieldMetadatas = async ({
createFieldInput.settings,
);
const junctionTargetFlatFieldMetadata = isDefined(junctionTargetFieldId)
? existingFlatFieldMetadataMaps.byId[junctionTargetFieldId]
? findFlatEntityByIdInFlatEntityMaps({
flatEntityId: junctionTargetFieldId,
flatEntityMaps: existingFlatFieldMetadataMaps,
})
: undefined;
const generateResult = generateMorphOrRelationFlatFieldMetadataPair({
@@ -115,7 +115,12 @@ export const validateMorphOrRelationFlatFieldMetadata = ({
});
const targetFlatFieldMetadata =
remainingFlatEntityMapsToValidate?.byId[relationTargetFieldMetadataId] ??
(remainingFlatEntityMapsToValidate
? findFlatEntityByIdInFlatEntityMaps({
flatEntityId: relationTargetFieldMetadataId,
flatEntityMaps: remainingFlatEntityMapsToValidate,
})
: undefined) ??
findFlatEntityByIdInFlatEntityMaps({
flatEntityId: relationTargetFieldMetadataId,
flatEntityMaps: flatFieldMetadataMaps,
@@ -24,7 +24,12 @@ export const validateMorphRelationFlatFieldMetadata = (
errors.push(...validateMorphOrRelationFlatFieldMetadata(args));
const targetFlatFieldMetadata =
remainingFlatEntityMapsToValidate?.byId[relationTargetFieldMetadataId] ??
(remainingFlatEntityMapsToValidate
? findFlatEntityByIdInFlatEntityMaps({
flatEntityId: relationTargetFieldMetadataId,
flatEntityMaps: remainingFlatEntityMapsToValidate,
})
: undefined) ??
findFlatEntityByIdInFlatEntityMaps({
flatEntityId: relationTargetFieldMetadataId,
flatEntityMaps: flatFieldMetadataMaps,
@@ -11,6 +11,7 @@ import {
} from 'src/engine/metadata-modules/field-metadata/field-metadata.exception';
import { validateRelationCreationPayloadOrThrow } from 'src/engine/metadata-modules/field-metadata/utils/validate-relation-creation-payload-or-throw.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 FieldInputTranspilationResult } from 'src/engine/metadata-modules/flat-field-metadata/types/field-input-transpilation-result.type';
import { type FlatObjectMetadata } from 'src/engine/metadata-modules/flat-object-metadata/types/flat-object-metadata.type';
@@ -53,10 +54,10 @@ export const validateRelationCreationPayload = async ({
}
}
const targetFlatObjectMetadata =
existingFlatObjectMetadataMaps.byId[
relationCreationPayload.targetObjectMetadataId
];
const targetFlatObjectMetadata = findFlatEntityByIdInFlatEntityMaps({
flatEntityId: relationCreationPayload.targetObjectMetadataId,
flatEntityMaps: existingFlatObjectMetadataMaps,
});
if (!isDefined(targetFlatObjectMetadata)) {
return {
@@ -12,15 +12,15 @@ export const buildObjectIdByNameMaps = (
const idByNameSingular: Record<string, string> = {};
const idByNamePlural: Record<string, string> = {};
for (const [objectId, objectMetadata] of Object.entries(
flatObjectMetadataMaps.byId,
for (const objectMetadata of Object.values(
flatObjectMetadataMaps.byUniversalIdentifier,
)) {
if (!isDefined(objectMetadata)) {
continue;
}
idByNameSingular[objectMetadata.nameSingular] = objectId;
idByNamePlural[objectMetadata.namePlural] = objectId;
idByNameSingular[objectMetadata.nameSingular] = objectMetadata.id;
idByNamePlural[objectMetadata.namePlural] = objectMetadata.id;
}
return { idByNameSingular, idByNamePlural };
@@ -78,7 +78,9 @@ export const fromDeleteObjectInputToFlatFieldMetadatasToDelete = ({
);
// TODO We should maintain a idsByObjectMetadataId in the flatIndexMaps
const flatIndexMetadataToDelete = Object.values(flatIndexMaps.byId).filter(
const flatIndexMetadataToDelete = Object.values(
flatIndexMaps.byUniversalIdentifier,
).filter(
(flatIndex): flatIndex is FlatIndexMetadata =>
isDefined(flatIndex) &&
flatIndex.objectMetadataId === flatObjectMetadataToDelete.id,
@@ -23,7 +23,7 @@ export const doesOtherObjectWithSameNameExists = ({
objectMetadataNameSingular,
existingObjectMetadataId,
}: ValidateNoOtherObjectWithSameNameExistsOrThrowsParams) =>
Object.values(objectMetadataMaps.byId)
Object.values(objectMetadataMaps.byUniversalIdentifier)
.filter(isDefined)
.some(
(objectMetadata) =>
@@ -5,6 +5,7 @@ import {
} from 'twenty-shared/utils';
import { type FlatPageLayoutTabMaps } from 'src/engine/metadata-modules/flat-page-layout-tab/types/flat-page-layout-tab-maps.type';
import { findFlatEntityByIdInFlatEntityMaps } from 'src/engine/metadata-modules/flat-entity/utils/find-flat-entity-by-id-in-flat-entity-maps.util';
import { type FlatPageLayoutTab } from 'src/engine/metadata-modules/flat-page-layout-tab/types/flat-page-layout-tab.type';
import {
PageLayoutTabException,
@@ -27,8 +28,12 @@ export const fromDestroyPageLayoutTabInputToFlatPageLayoutTabOrThrow = ({
['id'],
);
const existingFlatPageLayoutTabToDestroy =
flatPageLayoutTabMaps.byId[pageLayoutTabId];
const existingFlatPageLayoutTabToDestroy = findFlatEntityByIdInFlatEntityMaps(
{
flatEntityId: pageLayoutTabId,
flatEntityMaps: flatPageLayoutTabMaps,
},
);
if (!isDefined(existingFlatPageLayoutTabToDestroy)) {
throw new PageLayoutTabException(
@@ -5,6 +5,7 @@ import {
} from 'twenty-shared/utils';
import { FLAT_PAGE_LAYOUT_TAB_EDITABLE_PROPERTIES } from 'src/engine/metadata-modules/flat-page-layout-tab/constants/flat-page-layout-tab-editable-properties.constant';
import { findFlatEntityByIdInFlatEntityMaps } from 'src/engine/metadata-modules/flat-entity/utils/find-flat-entity-by-id-in-flat-entity-maps.util';
import { type FlatPageLayoutTabMaps } from 'src/engine/metadata-modules/flat-page-layout-tab/types/flat-page-layout-tab-maps.type';
import { type FlatPageLayoutTab } from 'src/engine/metadata-modules/flat-page-layout-tab/types/flat-page-layout-tab.type';
import { type UpdatePageLayoutTabInput } from 'src/engine/metadata-modules/page-layout-tab/dtos/inputs/update-page-layout-tab.input';
@@ -31,8 +32,10 @@ export const fromUpdatePageLayoutTabInputToFlatPageLayoutTabToUpdateOrThrow = ({
['id'],
);
const existingFlatPageLayoutTabToUpdate =
flatPageLayoutTabMaps.byId[pageLayoutTabToUpdateId];
const existingFlatPageLayoutTabToUpdate = findFlatEntityByIdInFlatEntityMaps({
flatEntityId: pageLayoutTabToUpdateId,
flatEntityMaps: flatPageLayoutTabMaps,
});
if (!isDefined(existingFlatPageLayoutTabToUpdate)) {
throw new PageLayoutTabException(
@@ -15,7 +15,9 @@ export const reconstructFlatPageLayoutTabWithWidgets = ({
tab: FlatPageLayoutTab;
flatPageLayoutWidgetMaps: FlatPageLayoutWidgetMaps;
}): FlatPageLayoutTabWithWidgets => {
const widgets = Object.values(flatPageLayoutWidgetMaps.byId).filter(
const widgets = Object.values(
flatPageLayoutWidgetMaps.byUniversalIdentifier,
).filter(
(widget): widget is FlatPageLayoutWidget =>
isDefined(widget) &&
widget.pageLayoutTabId === tab.id &&
@@ -5,6 +5,7 @@ import {
} from 'twenty-shared/utils';
import { type FlatPageLayoutWidgetMaps } from 'src/engine/metadata-modules/flat-page-layout-widget/types/flat-page-layout-widget-maps.type';
import { findFlatEntityByIdInFlatEntityMaps } from 'src/engine/metadata-modules/flat-entity/utils/find-flat-entity-by-id-in-flat-entity-maps.util';
import { type FlatPageLayoutWidget } from 'src/engine/metadata-modules/flat-page-layout-widget/types/flat-page-layout-widget.type';
import { type DestroyPageLayoutWidgetInput } from 'src/engine/metadata-modules/page-layout-widget/dtos/inputs/destroy-page-layout-widget.input';
import {
@@ -25,7 +26,10 @@ export const fromDestroyPageLayoutWidgetInputToFlatPageLayoutWidgetOrThrow = ({
);
const existingFlatPageLayoutWidgetToDestroy =
flatPageLayoutWidgetMaps.byId[pageLayoutWidgetId];
findFlatEntityByIdInFlatEntityMaps({
flatEntityId: pageLayoutWidgetId,
flatEntityMaps: flatPageLayoutWidgetMaps,
});
if (!isDefined(existingFlatPageLayoutWidgetToDestroy)) {
throw new PageLayoutWidgetException(
@@ -5,6 +5,7 @@ import {
} from 'twenty-shared/utils';
import { FLAT_PAGE_LAYOUT_WIDGET_EDITABLE_PROPERTIES } from 'src/engine/metadata-modules/flat-page-layout-widget/constants/flat-page-layout-widget-editable-properties.constant';
import { findFlatEntityByIdInFlatEntityMaps } from 'src/engine/metadata-modules/flat-entity/utils/find-flat-entity-by-id-in-flat-entity-maps.util';
import { type FlatPageLayoutWidgetMaps } from 'src/engine/metadata-modules/flat-page-layout-widget/types/flat-page-layout-widget-maps.type';
import { type FlatPageLayoutWidget } from 'src/engine/metadata-modules/flat-page-layout-widget/types/flat-page-layout-widget.type';
import { type UpdatePageLayoutWidgetInput } from 'src/engine/metadata-modules/page-layout-widget/dtos/inputs/update-page-layout-widget.input';
@@ -34,7 +35,10 @@ export const fromUpdatePageLayoutWidgetInputToFlatPageLayoutWidgetToUpdateOrThro
]);
const existingFlatPageLayoutWidgetToUpdate =
flatPageLayoutWidgetMaps.byId[pageLayoutWidgetToUpdateId];
findFlatEntityByIdInFlatEntityMaps({
flatEntityId: pageLayoutWidgetToUpdateId,
flatEntityMaps: flatPageLayoutWidgetMaps,
});
if (!isDefined(existingFlatPageLayoutWidgetToUpdate)) {
throw new PageLayoutWidgetException(
@@ -5,6 +5,7 @@ import {
} from 'twenty-shared/utils';
import { type FlatPageLayoutMaps } from 'src/engine/metadata-modules/flat-page-layout/types/flat-page-layout-maps.type';
import { findFlatEntityByIdInFlatEntityMaps } from 'src/engine/metadata-modules/flat-entity/utils/find-flat-entity-by-id-in-flat-entity-maps.util';
import { type FlatPageLayout } from 'src/engine/metadata-modules/flat-page-layout/types/flat-page-layout.type';
import {
PageLayoutException,
@@ -27,7 +28,10 @@ export const fromDestroyPageLayoutInputToFlatPageLayoutOrThrow = ({
['id'],
);
const existingFlatPageLayoutToDestroy = flatPageLayoutMaps.byId[pageLayoutId];
const existingFlatPageLayoutToDestroy = findFlatEntityByIdInFlatEntityMaps({
flatEntityId: pageLayoutId,
flatEntityMaps: flatPageLayoutMaps,
});
if (!isDefined(existingFlatPageLayoutToDestroy)) {
throw new PageLayoutException(
@@ -5,6 +5,7 @@ import {
} from 'twenty-shared/utils';
import { FLAT_PAGE_LAYOUT_EDITABLE_PROPERTIES } from 'src/engine/metadata-modules/flat-page-layout/constants/flat-page-layout-editable-properties.constant';
import { findFlatEntityByIdInFlatEntityMaps } from 'src/engine/metadata-modules/flat-entity/utils/find-flat-entity-by-id-in-flat-entity-maps.util';
import { type FlatPageLayoutMaps } from 'src/engine/metadata-modules/flat-page-layout/types/flat-page-layout-maps.type';
import { type FlatPageLayout } from 'src/engine/metadata-modules/flat-page-layout/types/flat-page-layout.type';
import { type UpdatePageLayoutInput } from 'src/engine/metadata-modules/page-layout/dtos/inputs/update-page-layout.input';
@@ -31,8 +32,10 @@ export const fromUpdatePageLayoutInputToFlatPageLayoutToUpdateOrThrow = ({
['id'],
);
const existingFlatPageLayoutToUpdate =
flatPageLayoutMaps.byId[pageLayoutToUpdateId];
const existingFlatPageLayoutToUpdate = findFlatEntityByIdInFlatEntityMaps({
flatEntityId: pageLayoutToUpdateId,
flatEntityMaps: flatPageLayoutMaps,
});
if (!isDefined(existingFlatPageLayoutToUpdate)) {
throw new PageLayoutException(
@@ -23,7 +23,7 @@ export const reconstructFlatPageLayoutWithTabsAndWidgets = ({
flatPageLayoutTabMaps: FlatPageLayoutTabMaps;
flatPageLayoutWidgetMaps: FlatPageLayoutWidgetMaps;
}): FlatPageLayoutWithTabsAndWidgets => {
const tabs = Object.values(flatPageLayoutTabMaps.byId)
const tabs = Object.values(flatPageLayoutTabMaps.byUniversalIdentifier)
.filter(isDefined)
.filter(
(tab) => tab.pageLayoutId === layout.id && !isDefined(tab.deletedAt),
@@ -31,7 +31,9 @@ export const reconstructFlatPageLayoutWithTabsAndWidgets = ({
.sort((a, b) => (a.position ?? 0) - (b.position ?? 0));
const tabsWithWidgets: FlatPageLayoutTabWithWidgets[] = tabs.map((tab) => {
const widgets = Object.values(flatPageLayoutWidgetMaps.byId)
const widgets = Object.values(
flatPageLayoutWidgetMaps.byUniversalIdentifier,
)
.filter(isDefined)
.filter(
(widget) =>
@@ -13,9 +13,9 @@ export const findFlatRoleTargetFromForeignKey = ({
targetMetadataForeignKey,
targetId,
}: FindAllFlatRoleTargetOfArgs): FlatRoleTarget | undefined => {
const allRoleTargets = Object.values(flatRoleTargetMaps.byId).filter(
isDefined,
);
const allRoleTargets = Object.values(
flatRoleTargetMaps.byUniversalIdentifier,
).filter(isDefined);
return allRoleTargets.find(
(roleTarget) => roleTarget[targetMetadataForeignKey] === targetId,
@@ -5,6 +5,7 @@ import {
} from 'twenty-shared/utils';
import { type FlatViewFieldMaps } from 'src/engine/metadata-modules/flat-view-field/types/flat-view-field-maps.type';
import { findFlatEntityByIdInFlatEntityMaps } from 'src/engine/metadata-modules/flat-entity/utils/find-flat-entity-by-id-in-flat-entity-maps.util';
import { type FlatViewField } from 'src/engine/metadata-modules/flat-view-field/types/flat-view-field.type';
import { type DeleteViewFieldInput } from 'src/engine/metadata-modules/view-field/dtos/inputs/delete-view-field.input';
import {
@@ -24,7 +25,10 @@ export const fromDeleteViewFieldInputToFlatViewFieldOrThrow = ({
['id'],
);
const existingFlatViewFieldToDelete = flatViewFieldMaps.byId[viewFieldId];
const existingFlatViewFieldToDelete = findFlatEntityByIdInFlatEntityMaps({
flatEntityId: viewFieldId,
flatEntityMaps: flatViewFieldMaps,
});
if (!isDefined(existingFlatViewFieldToDelete)) {
throw new ViewFieldException(
@@ -5,6 +5,7 @@ import {
} from 'twenty-shared/utils';
import { type FlatViewFieldMaps } from 'src/engine/metadata-modules/flat-view-field/types/flat-view-field-maps.type';
import { findFlatEntityByIdInFlatEntityMaps } from 'src/engine/metadata-modules/flat-entity/utils/find-flat-entity-by-id-in-flat-entity-maps.util';
import { type FlatViewField } from 'src/engine/metadata-modules/flat-view-field/types/flat-view-field.type';
import { type DestroyViewFieldInput } from 'src/engine/metadata-modules/view-field/dtos/inputs/destroy-view-field.input';
import {
@@ -24,7 +25,10 @@ export const fromDestroyViewFieldInputToFlatViewFieldOrThrow = ({
['id'],
);
const existingFlatViewFieldToDestroy = flatViewFieldMaps.byId[viewFieldId];
const existingFlatViewFieldToDestroy = findFlatEntityByIdInFlatEntityMaps({
flatEntityId: viewFieldId,
flatEntityMaps: flatViewFieldMaps,
});
if (!isDefined(existingFlatViewFieldToDestroy)) {
throw new ViewFieldException(
@@ -6,6 +6,7 @@ import {
} from 'twenty-shared/utils';
import { FLAT_VIEW_FIELD_EDITABLE_PROPERTIES } from 'src/engine/metadata-modules/flat-view-field/constants/flat-view-field-editable-properties.constant';
import { findFlatEntityByIdInFlatEntityMaps } from 'src/engine/metadata-modules/flat-entity/utils/find-flat-entity-by-id-in-flat-entity-maps.util';
import { type FlatViewFieldMaps } from 'src/engine/metadata-modules/flat-view-field/types/flat-view-field-maps.type';
import { type FlatViewField } from 'src/engine/metadata-modules/flat-view-field/types/flat-view-field.type';
import { type UpdateViewFieldInput } from 'src/engine/metadata-modules/view-field/dtos/inputs/update-view-field.input';
@@ -28,8 +29,10 @@ export const fromUpdateViewFieldInputToFlatViewFieldToUpdateOrThrow = ({
['id'],
);
const existingFlatViewFieldToUpdate =
flatViewFieldMaps.byId[viewFieldToUpdateId];
const existingFlatViewFieldToUpdate = findFlatEntityByIdInFlatEntityMaps({
flatEntityId: viewFieldToUpdateId,
flatEntityMaps: flatViewFieldMaps,
});
if (!isDefined(existingFlatViewFieldToUpdate)) {
throw new ViewFieldException(
@@ -4,6 +4,7 @@ import {
} from 'twenty-shared/utils';
import { type FlatViewFilterGroupMaps } from 'src/engine/metadata-modules/flat-view-filter-group/types/flat-view-filter-group-maps.type';
import { findFlatEntityByIdInFlatEntityMaps } from 'src/engine/metadata-modules/flat-entity/utils/find-flat-entity-by-id-in-flat-entity-maps.util';
import { type FlatViewFilterGroup } from 'src/engine/metadata-modules/flat-view-filter-group/types/flat-view-filter-group.type';
import { type DeleteViewFilterGroupInput } from 'src/engine/metadata-modules/view-filter-group/dtos/inputs/delete-view-filter-group.input';
import {
@@ -24,7 +25,10 @@ export const fromDeleteViewFilterGroupInputToFlatViewFilterGroupOrThrow = ({
);
const existingFlatViewFilterGroupToDelete =
flatViewFilterGroupMaps.byId[viewFilterGroupId];
findFlatEntityByIdInFlatEntityMaps({
flatEntityId: viewFilterGroupId,
flatEntityMaps: flatViewFilterGroupMaps,
});
if (!isDefined(existingFlatViewFilterGroupToDelete)) {
throw new ViewFilterGroupException(
@@ -4,6 +4,7 @@ import {
} from 'twenty-shared/utils';
import { type FlatViewFilterGroupMaps } from 'src/engine/metadata-modules/flat-view-filter-group/types/flat-view-filter-group-maps.type';
import { findFlatEntityByIdInFlatEntityMaps } from 'src/engine/metadata-modules/flat-entity/utils/find-flat-entity-by-id-in-flat-entity-maps.util';
import { type FlatViewFilterGroup } from 'src/engine/metadata-modules/flat-view-filter-group/types/flat-view-filter-group.type';
import { type DestroyViewFilterGroupInput } from 'src/engine/metadata-modules/view-filter-group/dtos/inputs/destroy-view-filter-group.input';
import {
@@ -24,7 +25,10 @@ export const fromDestroyViewFilterGroupInputToFlatViewFilterGroupOrThrow = ({
);
const existingFlatViewFilterGroupToDestroy =
flatViewFilterGroupMaps.byId[viewFilterGroupId];
findFlatEntityByIdInFlatEntityMaps({
flatEntityId: viewFilterGroupId,
flatEntityMaps: flatViewFilterGroupMaps,
});
if (!isDefined(existingFlatViewFilterGroupToDestroy)) {
throw new ViewFilterGroupException(
@@ -5,6 +5,7 @@ import {
} from 'twenty-shared/utils';
import { FLAT_VIEW_FILTER_GROUP_EDITABLE_PROPERTIES } from 'src/engine/metadata-modules/flat-view-filter-group/constants/flat-view-filter-group-editable-properties.constant';
import { findFlatEntityByIdInFlatEntityMaps } from 'src/engine/metadata-modules/flat-entity/utils/find-flat-entity-by-id-in-flat-entity-maps.util';
import { type FlatViewFilterGroupMaps } from 'src/engine/metadata-modules/flat-view-filter-group/types/flat-view-filter-group-maps.type';
import { type FlatViewFilterGroup } from 'src/engine/metadata-modules/flat-view-filter-group/types/flat-view-filter-group.type';
import { type UpdateViewFilterGroupInput } from 'src/engine/metadata-modules/view-filter-group/dtos/inputs/update-view-filter-group.input';
@@ -29,7 +30,10 @@ export const fromUpdateViewFilterGroupInputToFlatViewFilterGroupToUpdateOrThrow
);
const existingFlatViewFilterGroupToUpdate =
flatViewFilterGroupMaps.byId[viewFilterGroupToUpdateId];
findFlatEntityByIdInFlatEntityMaps({
flatEntityId: viewFilterGroupToUpdateId,
flatEntityMaps: flatViewFilterGroupMaps,
});
if (!isDefined(existingFlatViewFilterGroupToUpdate)) {
throw new ViewFilterGroupException(

Some files were not shown because too many files have changed in this diff Show More