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:
+11
-4
@@ -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;
|
||||
|
||||
|
||||
+5
-2
@@ -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(
|
||||
|
||||
+5
-1
@@ -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(
|
||||
|
||||
+9
-2
@@ -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;
|
||||
|
||||
+5
-2
@@ -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(
|
||||
|
||||
+4
-4
@@ -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;
|
||||
},
|
||||
|
||||
+6
-3
@@ -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(
|
||||
|
||||
+17
-8
@@ -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;
|
||||
|
||||
+16
-9
@@ -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);
|
||||
|
||||
|
||||
+8
-8
@@ -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: {},
|
||||
};
|
||||
|
||||
+5
-3
@@ -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}`);
|
||||
|
||||
+10
-4
@@ -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}.`);
|
||||
|
||||
+13
-7
@@ -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;
|
||||
|
||||
+9
-3
@@ -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(
|
||||
|
||||
+7
-1
@@ -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> =
|
||||
|
||||
+5
-4
@@ -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 ||
|
||||
|
||||
+5
-1
@@ -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)) {
|
||||
|
||||
+5
-1
@@ -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(
|
||||
|
||||
+5
-4
@@ -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;
|
||||
|
||||
+4
-4
@@ -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;
|
||||
|
||||
|
||||
+8
-8
@@ -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;
|
||||
|
||||
+5
-3
@@ -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 (
|
||||
|
||||
+5
-1
@@ -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
|
||||
|
||||
+5
-2
@@ -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(
|
||||
|
||||
+1
-1
@@ -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) {
|
||||
|
||||
+1
-1
@@ -81,7 +81,7 @@ export class GqlTypeGenerator {
|
||||
) {
|
||||
const { flatObjectMetadataMaps, flatFieldMetadataMaps } = context;
|
||||
const objectMetadataCollection = Object.values(
|
||||
flatObjectMetadataMaps.byId,
|
||||
flatObjectMetadataMaps.byUniversalIdentifier,
|
||||
).filter(isDefined);
|
||||
|
||||
this.logger.log(
|
||||
|
||||
+10
-13
@@ -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,
|
||||
|
||||
+9
-8
@@ -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(
|
||||
|
||||
+5
-4
@@ -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(
|
||||
|
||||
+1
-1
@@ -49,7 +49,7 @@ export class RootTypeGenerator {
|
||||
}
|
||||
|
||||
const objectMetadataCollection = Object.values(
|
||||
context.flatObjectMetadataMaps.byId,
|
||||
context.flatObjectMetadataMaps.byUniversalIdentifier,
|
||||
).filter(isDefined);
|
||||
|
||||
this.gqlTypesStorage.addGqlType(
|
||||
|
||||
+5
-5
@@ -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';
|
||||
|
||||
+4
-4
@@ -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;
|
||||
},
|
||||
|
||||
+4
-4
@@ -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;
|
||||
|
||||
+13
-7
@@ -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: {},
|
||||
};
|
||||
|
||||
+19
-15
@@ -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(
|
||||
|
||||
+17
-5
@@ -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: {},
|
||||
},
|
||||
}),
|
||||
},
|
||||
|
||||
+5
-1
@@ -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
|
||||
|
||||
+69
-43
@@ -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) &&
|
||||
|
||||
+2
-2
@@ -42,8 +42,8 @@ const mockObjectMetadata: FlatObjectMetadata = {
|
||||
};
|
||||
|
||||
const mockFlatFieldMetadataMaps: FlatEntityMaps<FlatFieldMetadata> = {
|
||||
byId: {},
|
||||
idByUniversalIdentifier: {},
|
||||
byUniversalIdentifier: {},
|
||||
universalIdentifierById: {},
|
||||
universalIdentifiersByApplicationId: {},
|
||||
};
|
||||
|
||||
|
||||
+7
-1
@@ -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];
|
||||
|
||||
+5
-1
@@ -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) =>
|
||||
|
||||
+36
-14
@@ -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;
|
||||
|
||||
+5
-1
@@ -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(
|
||||
|
||||
+5
-1
@@ -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;
|
||||
|
||||
+3
-1
@@ -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);
|
||||
|
||||
|
||||
+3
-1
@@ -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);
|
||||
|
||||
|
||||
+1
-1
@@ -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,
|
||||
|
||||
+3
-1
@@ -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;
|
||||
|
||||
+5
-1
@@ -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(
|
||||
|
||||
+3
-3
@@ -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,
|
||||
);
|
||||
|
||||
+2
-2
@@ -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>;
|
||||
|
||||
+6
-3
@@ -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[]>>;
|
||||
};
|
||||
|
||||
+13
-7
@@ -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],
|
||||
});
|
||||
|
||||
+13
-7
@@ -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: [],
|
||||
});
|
||||
|
||||
+11
-7
@@ -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,
|
||||
|
||||
+2
-2
@@ -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,
|
||||
),
|
||||
|
||||
+14
-11
@@ -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,
|
||||
|
||||
+1
-7
@@ -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;
|
||||
|
||||
+11
-1
@@ -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(
|
||||
|
||||
+2
-18
@@ -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];
|
||||
};
|
||||
|
||||
+5
-3
@@ -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,
|
||||
);
|
||||
};
|
||||
|
||||
+28
@@ -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);
|
||||
};
|
||||
+1
-1
@@ -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,
|
||||
}: {
|
||||
+2
-2
@@ -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,
|
||||
});
|
||||
|
||||
+5
-1
@@ -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) => {
|
||||
|
||||
+7
-1
@@ -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',
|
||||
|
||||
+5
-2
@@ -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(
|
||||
|
||||
+5
-2
@@ -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 {
|
||||
|
||||
+3
-3
@@ -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) => {
|
||||
|
||||
+5
-1
@@ -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 =
|
||||
|
||||
+5
-1
@@ -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({
|
||||
|
||||
+6
-1
@@ -115,7 +115,12 @@ export const validateMorphOrRelationFlatFieldMetadata = ({
|
||||
});
|
||||
|
||||
const targetFlatFieldMetadata =
|
||||
remainingFlatEntityMapsToValidate?.byId[relationTargetFieldMetadataId] ??
|
||||
(remainingFlatEntityMapsToValidate
|
||||
? findFlatEntityByIdInFlatEntityMaps({
|
||||
flatEntityId: relationTargetFieldMetadataId,
|
||||
flatEntityMaps: remainingFlatEntityMapsToValidate,
|
||||
})
|
||||
: undefined) ??
|
||||
findFlatEntityByIdInFlatEntityMaps({
|
||||
flatEntityId: relationTargetFieldMetadataId,
|
||||
flatEntityMaps: flatFieldMetadataMaps,
|
||||
|
||||
+6
-1
@@ -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,
|
||||
|
||||
+5
-4
@@ -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 {
|
||||
|
||||
+4
-4
@@ -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 };
|
||||
|
||||
+3
-1
@@ -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,
|
||||
|
||||
+1
-1
@@ -23,7 +23,7 @@ export const doesOtherObjectWithSameNameExists = ({
|
||||
objectMetadataNameSingular,
|
||||
existingObjectMetadataId,
|
||||
}: ValidateNoOtherObjectWithSameNameExistsOrThrowsParams) =>
|
||||
Object.values(objectMetadataMaps.byId)
|
||||
Object.values(objectMetadataMaps.byUniversalIdentifier)
|
||||
.filter(isDefined)
|
||||
.some(
|
||||
(objectMetadata) =>
|
||||
|
||||
+7
-2
@@ -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
-2
@@ -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(
|
||||
|
||||
+3
-1
@@ -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
-1
@@ -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
-1
@@ -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
-1
@@ -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
-2
@@ -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(
|
||||
|
||||
+4
-2
@@ -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) =>
|
||||
|
||||
+3
-3
@@ -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
-1
@@ -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
-1
@@ -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(
|
||||
|
||||
+5
-2
@@ -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(
|
||||
|
||||
+5
-1
@@ -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(
|
||||
|
||||
+5
-1
@@ -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
-1
@@ -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
Reference in New Issue
Block a user