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:
+18
-7
@@ -6,6 +6,10 @@ import { isDefined } from 'twenty-shared/utils';
|
||||
import { type DataSourceEntity } from 'src/engine/metadata-modules/data-source/data-source.entity';
|
||||
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 { findFlatEntityByIdInFlatEntityMaps } from 'src/engine/metadata-modules/flat-entity/utils/find-flat-entity-by-id-in-flat-entity-maps.util';
|
||||
import { type FlatFieldMetadata } from 'src/engine/metadata-modules/flat-field-metadata/types/flat-field-metadata.type';
|
||||
import { type FlatObjectMetadata } from 'src/engine/metadata-modules/flat-object-metadata/types/flat-object-metadata.type';
|
||||
import { buildObjectIdByNameMaps } from 'src/engine/metadata-modules/flat-object-metadata/utils/build-object-id-by-name-maps.util';
|
||||
import { ObjectMetadataService } from 'src/engine/metadata-modules/object-metadata/object-metadata.service';
|
||||
import {
|
||||
@@ -47,10 +51,9 @@ type JunctionConfigSeed = {
|
||||
label?: string;
|
||||
};
|
||||
|
||||
// Helper type for flat entity maps
|
||||
type FlatMaps = {
|
||||
fieldMaps: { byId: Record<string, { name: string; morphId?: string }> };
|
||||
objectMaps: { byId: Record<string, { fieldIds: string[] }> };
|
||||
flatFieldMetadataMaps: FlatEntityMaps<FlatFieldMetadata>;
|
||||
flatObjectMetadataMaps: FlatEntityMaps<FlatObjectMetadata>;
|
||||
objectIdByName: Record<string, string>;
|
||||
};
|
||||
|
||||
@@ -324,8 +327,8 @@ export class DevSeederMetadataService {
|
||||
);
|
||||
|
||||
return {
|
||||
fieldMaps: flatFieldMetadataMaps as FlatMaps['fieldMaps'],
|
||||
objectMaps: flatObjectMetadataMaps as FlatMaps['objectMaps'],
|
||||
flatFieldMetadataMaps,
|
||||
flatObjectMetadataMaps,
|
||||
objectIdByName: idByNameSingular,
|
||||
};
|
||||
}
|
||||
@@ -476,14 +479,22 @@ export class DevSeederMetadataService {
|
||||
throw new Error(`Object not found: ${objectName}`);
|
||||
}
|
||||
|
||||
const objectMetadata = flatMaps.objectMaps.byId[objectId];
|
||||
const objectMetadata = findFlatEntityByIdInFlatEntityMaps({
|
||||
flatEntityId: objectId,
|
||||
flatEntityMaps: flatMaps.flatObjectMetadataMaps,
|
||||
});
|
||||
|
||||
if (!isDefined(objectMetadata)) {
|
||||
throw new Error(`Object metadata not found: ${objectName}`);
|
||||
}
|
||||
|
||||
for (const fieldId of objectMetadata.fieldIds) {
|
||||
if (flatMaps.fieldMaps.byId[fieldId]?.name === fieldName) {
|
||||
const field = findFlatEntityByIdInFlatEntityMaps({
|
||||
flatEntityId: fieldId,
|
||||
flatEntityMaps: flatMaps.flatFieldMetadataMaps,
|
||||
});
|
||||
|
||||
if (field?.name === fieldName) {
|
||||
return fieldId;
|
||||
}
|
||||
}
|
||||
|
||||
+9
-4
@@ -3,6 +3,7 @@ import { isDefined } from 'twenty-shared/utils';
|
||||
import { type EntityManager } from 'typeorm';
|
||||
|
||||
import { type FlatEntityMaps } from 'src/engine/metadata-modules/flat-entity/types/flat-entity-maps.type';
|
||||
import { findFlatEntityByIdInFlatEntityMaps } from 'src/engine/metadata-modules/flat-entity/utils/find-flat-entity-by-id-in-flat-entity-maps.util';
|
||||
import { type FlatFieldMetadata } from 'src/engine/metadata-modules/flat-field-metadata/types/flat-field-metadata.type';
|
||||
import { type FlatObjectMetadata } from 'src/engine/metadata-modules/flat-object-metadata/types/flat-object-metadata.type';
|
||||
import { buildObjectIdByNameMaps } from 'src/engine/metadata-modules/flat-object-metadata/utils/build-object-id-by-name-maps.util';
|
||||
@@ -31,11 +32,15 @@ export const prefillWorkflows = async (
|
||||
throw new Error('Company or person object metadata not found');
|
||||
}
|
||||
|
||||
const companyObjectMetadata =
|
||||
flatObjectMetadataMaps.byId[companyObjectMetadataId];
|
||||
const companyObjectMetadata = findFlatEntityByIdInFlatEntityMaps({
|
||||
flatEntityId: companyObjectMetadataId,
|
||||
flatEntityMaps: flatObjectMetadataMaps,
|
||||
});
|
||||
|
||||
const personObjectMetadata =
|
||||
flatObjectMetadataMaps.byId[personObjectMetadataId];
|
||||
const personObjectMetadata = findFlatEntityByIdInFlatEntityMaps({
|
||||
flatEntityId: personObjectMetadataId,
|
||||
flatEntityMaps: flatObjectMetadataMaps,
|
||||
});
|
||||
|
||||
if (!isDefined(companyObjectMetadata) || !isDefined(personObjectMetadata)) {
|
||||
throw new Error('Company or person object metadata not found');
|
||||
|
||||
+1
-1
@@ -81,7 +81,7 @@ export class TwentyStandardApplicationService {
|
||||
);
|
||||
|
||||
const existingWorkspaceItems = Object.values(
|
||||
existingFlatNavigationMenuItemMaps.byId,
|
||||
existingFlatNavigationMenuItemMaps.byUniversalIdentifier,
|
||||
).filter(
|
||||
(item) =>
|
||||
isDefined(item) &&
|
||||
|
||||
+10
-9
@@ -177,16 +177,17 @@ export class WorkspaceMigrationBuildOrchestratorService {
|
||||
// Note: That's a hacky way to allow validating object against field metadatas, not optimal
|
||||
dependencyOptimisticFlatEntityMaps: {
|
||||
flatFieldMetadataMaps: {
|
||||
byId: {
|
||||
...dependencyAllFlatEntityMaps?.flatFieldMetadataMaps?.byId,
|
||||
...flatFieldMetadataMaps?.from.byId,
|
||||
...flatFieldMetadataMaps?.to.byId,
|
||||
},
|
||||
idByUniversalIdentifier: {
|
||||
byUniversalIdentifier: {
|
||||
...dependencyAllFlatEntityMaps?.flatFieldMetadataMaps
|
||||
?.idByUniversalIdentifier,
|
||||
...flatFieldMetadataMaps?.from.idByUniversalIdentifier,
|
||||
...flatFieldMetadataMaps?.to.idByUniversalIdentifier,
|
||||
?.byUniversalIdentifier,
|
||||
...flatFieldMetadataMaps?.from.byUniversalIdentifier,
|
||||
...flatFieldMetadataMaps?.to.byUniversalIdentifier,
|
||||
},
|
||||
universalIdentifierById: {
|
||||
...dependencyAllFlatEntityMaps?.flatFieldMetadataMaps
|
||||
?.universalIdentifierById,
|
||||
...flatFieldMetadataMaps?.from.universalIdentifierById,
|
||||
...flatFieldMetadataMaps?.to.universalIdentifierById,
|
||||
},
|
||||
universalIdentifiersByApplicationId: {
|
||||
...dependencyAllFlatEntityMaps?.flatFieldMetadataMaps
|
||||
|
||||
+37
-37
@@ -3,8 +3,8 @@
|
||||
exports[`flatEntityDeletedCreatedUpdatedMatrixDispatcher It should detect a created entity 1`] = `
|
||||
{
|
||||
"createdFlatEntityMaps": {
|
||||
"byId": {
|
||||
"field-id-1": {
|
||||
"byUniversalIdentifier": {
|
||||
"universal-identifier-1": {
|
||||
"applicationId": "application-id-1",
|
||||
"applicationUniversalIdentifier": "application-universal-identifier-1",
|
||||
"calendarViewIds": [],
|
||||
@@ -48,8 +48,8 @@ exports[`flatEntityDeletedCreatedUpdatedMatrixDispatcher It should detect a crea
|
||||
"workspaceId": "workspace-id-1",
|
||||
},
|
||||
},
|
||||
"idByUniversalIdentifier": {
|
||||
"universal-identifier-1": "field-id-1",
|
||||
"universalIdentifierById": {
|
||||
"field-id-1": "universal-identifier-1",
|
||||
},
|
||||
"universalIdentifiersByApplicationId": {
|
||||
"application-id-1": [
|
||||
@@ -58,12 +58,12 @@ exports[`flatEntityDeletedCreatedUpdatedMatrixDispatcher It should detect a crea
|
||||
},
|
||||
},
|
||||
"deletedFlatEntityMaps": {
|
||||
"byId": {},
|
||||
"idByUniversalIdentifier": {},
|
||||
"byUniversalIdentifier": {},
|
||||
"universalIdentifierById": {},
|
||||
"universalIdentifiersByApplicationId": {},
|
||||
},
|
||||
"updatedFlatEntityMaps": {
|
||||
"byId": {},
|
||||
"byUniversalIdentifier": {},
|
||||
},
|
||||
}
|
||||
`;
|
||||
@@ -71,13 +71,13 @@ exports[`flatEntityDeletedCreatedUpdatedMatrixDispatcher It should detect a crea
|
||||
exports[`flatEntityDeletedCreatedUpdatedMatrixDispatcher It should detect a deleted entity 1`] = `
|
||||
{
|
||||
"createdFlatEntityMaps": {
|
||||
"byId": {},
|
||||
"idByUniversalIdentifier": {},
|
||||
"byUniversalIdentifier": {},
|
||||
"universalIdentifierById": {},
|
||||
"universalIdentifiersByApplicationId": {},
|
||||
},
|
||||
"deletedFlatEntityMaps": {
|
||||
"byId": {
|
||||
"field-id-1": {
|
||||
"byUniversalIdentifier": {
|
||||
"universal-identifier-1": {
|
||||
"applicationId": "application-id-1",
|
||||
"applicationUniversalIdentifier": "application-universal-identifier-1",
|
||||
"calendarViewIds": [],
|
||||
@@ -121,8 +121,8 @@ exports[`flatEntityDeletedCreatedUpdatedMatrixDispatcher It should detect a dele
|
||||
"workspaceId": "workspace-id-1",
|
||||
},
|
||||
},
|
||||
"idByUniversalIdentifier": {
|
||||
"universal-identifier-1": "field-id-1",
|
||||
"universalIdentifierById": {
|
||||
"field-id-1": "universal-identifier-1",
|
||||
},
|
||||
"universalIdentifiersByApplicationId": {
|
||||
"application-id-1": [
|
||||
@@ -131,7 +131,7 @@ exports[`flatEntityDeletedCreatedUpdatedMatrixDispatcher It should detect a dele
|
||||
},
|
||||
},
|
||||
"updatedFlatEntityMaps": {
|
||||
"byId": {},
|
||||
"byUniversalIdentifier": {},
|
||||
},
|
||||
}
|
||||
`;
|
||||
@@ -139,19 +139,19 @@ exports[`flatEntityDeletedCreatedUpdatedMatrixDispatcher It should detect a dele
|
||||
exports[`flatEntityDeletedCreatedUpdatedMatrixDispatcher It should detect an updated entity 1`] = `
|
||||
{
|
||||
"createdFlatEntityMaps": {
|
||||
"byId": {},
|
||||
"idByUniversalIdentifier": {},
|
||||
"byUniversalIdentifier": {},
|
||||
"universalIdentifierById": {},
|
||||
"universalIdentifiersByApplicationId": {},
|
||||
},
|
||||
"deletedFlatEntityMaps": {
|
||||
"byId": {},
|
||||
"idByUniversalIdentifier": {},
|
||||
"byUniversalIdentifier": {},
|
||||
"universalIdentifierById": {},
|
||||
"universalIdentifiersByApplicationId": {},
|
||||
},
|
||||
"updatedFlatEntityMaps": {
|
||||
"byId": {
|
||||
"field-id-1": {
|
||||
"universalIdentifier": "universal-identifier-1",
|
||||
"byUniversalIdentifier": {
|
||||
"universal-identifier-1": {
|
||||
"id": "field-id-1",
|
||||
"updates": [
|
||||
{
|
||||
"from": false,
|
||||
@@ -168,8 +168,8 @@ exports[`flatEntityDeletedCreatedUpdatedMatrixDispatcher It should detect an upd
|
||||
exports[`flatEntityDeletedCreatedUpdatedMatrixDispatcher It should detect created, deleted and updated entities 1`] = `
|
||||
{
|
||||
"createdFlatEntityMaps": {
|
||||
"byId": {
|
||||
"field-id-3": {
|
||||
"byUniversalIdentifier": {
|
||||
"universal-identifier-3": {
|
||||
"applicationId": "application-id-1",
|
||||
"applicationUniversalIdentifier": "application-universal-identifier-1",
|
||||
"calendarViewIds": [],
|
||||
@@ -213,8 +213,8 @@ exports[`flatEntityDeletedCreatedUpdatedMatrixDispatcher It should detect create
|
||||
"workspaceId": "workspace-id-1",
|
||||
},
|
||||
},
|
||||
"idByUniversalIdentifier": {
|
||||
"universal-identifier-3": "field-id-3",
|
||||
"universalIdentifierById": {
|
||||
"field-id-3": "universal-identifier-3",
|
||||
},
|
||||
"universalIdentifiersByApplicationId": {
|
||||
"application-id-1": [
|
||||
@@ -223,8 +223,8 @@ exports[`flatEntityDeletedCreatedUpdatedMatrixDispatcher It should detect create
|
||||
},
|
||||
},
|
||||
"deletedFlatEntityMaps": {
|
||||
"byId": {
|
||||
"field-id-2": {
|
||||
"byUniversalIdentifier": {
|
||||
"universal-identifier-2": {
|
||||
"applicationId": "application-id-1",
|
||||
"applicationUniversalIdentifier": "application-universal-identifier-1",
|
||||
"calendarViewIds": [],
|
||||
@@ -268,8 +268,8 @@ exports[`flatEntityDeletedCreatedUpdatedMatrixDispatcher It should detect create
|
||||
"workspaceId": "workspace-id-1",
|
||||
},
|
||||
},
|
||||
"idByUniversalIdentifier": {
|
||||
"universal-identifier-2": "field-id-2",
|
||||
"universalIdentifierById": {
|
||||
"field-id-2": "universal-identifier-2",
|
||||
},
|
||||
"universalIdentifiersByApplicationId": {
|
||||
"application-id-1": [
|
||||
@@ -278,9 +278,9 @@ exports[`flatEntityDeletedCreatedUpdatedMatrixDispatcher It should detect create
|
||||
},
|
||||
},
|
||||
"updatedFlatEntityMaps": {
|
||||
"byId": {
|
||||
"field-id-1": {
|
||||
"universalIdentifier": "universal-identifier-1",
|
||||
"byUniversalIdentifier": {
|
||||
"universal-identifier-1": {
|
||||
"id": "field-id-1",
|
||||
"updates": [
|
||||
{
|
||||
"from": true,
|
||||
@@ -297,17 +297,17 @@ exports[`flatEntityDeletedCreatedUpdatedMatrixDispatcher It should detect create
|
||||
exports[`flatEntityDeletedCreatedUpdatedMatrixDispatcher It should not detect deleted entities when inferDeletionFromMissingEntities is false 1`] = `
|
||||
{
|
||||
"createdFlatEntityMaps": {
|
||||
"byId": {},
|
||||
"idByUniversalIdentifier": {},
|
||||
"byUniversalIdentifier": {},
|
||||
"universalIdentifierById": {},
|
||||
"universalIdentifiersByApplicationId": {},
|
||||
},
|
||||
"deletedFlatEntityMaps": {
|
||||
"byId": {},
|
||||
"idByUniversalIdentifier": {},
|
||||
"byUniversalIdentifier": {},
|
||||
"universalIdentifierById": {},
|
||||
"universalIdentifiersByApplicationId": {},
|
||||
},
|
||||
"updatedFlatEntityMaps": {
|
||||
"byId": {},
|
||||
"byUniversalIdentifier": {},
|
||||
},
|
||||
}
|
||||
`;
|
||||
|
||||
+5
-3
@@ -14,9 +14,11 @@ type TestFlatEntity = SyncableFlatEntity & {
|
||||
const createFlatEntityMaps = (
|
||||
entities: TestFlatEntity[],
|
||||
): FlatEntityMaps<TestFlatEntity> => ({
|
||||
byId: Object.fromEntries(entities.map((entity) => [entity.id, entity])),
|
||||
idByUniversalIdentifier: Object.fromEntries(
|
||||
entities.map((entity) => [entity.universalIdentifier, entity.id]),
|
||||
byUniversalIdentifier: Object.fromEntries(
|
||||
entities.map((entity) => [entity.universalIdentifier, entity]),
|
||||
),
|
||||
universalIdentifierById: Object.fromEntries(
|
||||
entities.map((entity) => [entity.id, entity.universalIdentifier]),
|
||||
),
|
||||
universalIdentifiersByApplicationId: {},
|
||||
});
|
||||
|
||||
+11
-5
@@ -20,18 +20,24 @@ export const addFlatEntityToFlatEntityMapsThroughMutationOrThrow = <
|
||||
flatEntity,
|
||||
flatEntityMapsToMutate,
|
||||
}: AddFlatEntityToFlatEntityMapsThroughMutationOrThrowArgs<T>): void => {
|
||||
if (isDefined(flatEntityMapsToMutate.byId[flatEntity.id])) {
|
||||
if (
|
||||
isDefined(
|
||||
flatEntityMapsToMutate.byUniversalIdentifier[
|
||||
flatEntity.universalIdentifier
|
||||
],
|
||||
)
|
||||
) {
|
||||
throw new FlatEntityMapsException(
|
||||
'addFlatEntityToFlatEntityMapsThroughMutationOrThrow: flat entity to add already exists',
|
||||
FlatEntityMapsExceptionCode.ENTITY_ALREADY_EXISTS,
|
||||
);
|
||||
}
|
||||
|
||||
flatEntityMapsToMutate.byId[flatEntity.id] = flatEntity;
|
||||
flatEntityMapsToMutate.byUniversalIdentifier[flatEntity.universalIdentifier] =
|
||||
flatEntity;
|
||||
|
||||
flatEntityMapsToMutate.idByUniversalIdentifier[
|
||||
flatEntity.universalIdentifier
|
||||
] = flatEntity.id;
|
||||
flatEntityMapsToMutate.universalIdentifierById[flatEntity.id] =
|
||||
flatEntity.universalIdentifier;
|
||||
|
||||
if (isDefined(flatEntity.applicationId)) {
|
||||
const existingUniversalIdentifiers =
|
||||
|
||||
+11
-9
@@ -20,31 +20,33 @@ export const deleteFlatEntityFromFlatEntityMapsThroughMutationOrThrow = <
|
||||
flatEntityMapsToMutate,
|
||||
entityToDeleteId,
|
||||
}: DeleteFlatEntityFromFlatEntityMapsThroughMutationOrThrowArgs<T>): void => {
|
||||
const entityToDelete = flatEntityMapsToMutate.byId[entityToDeleteId];
|
||||
const universalIdentifierToDelete =
|
||||
flatEntityMapsToMutate.universalIdentifierById[entityToDeleteId];
|
||||
|
||||
if (!isDefined(entityToDelete)) {
|
||||
if (!isDefined(universalIdentifierToDelete)) {
|
||||
throw new FlatEntityMapsException(
|
||||
'deleteFlatEntityFromFlatEntityMapsThroughMutationOrThrow: entity to delete not found',
|
||||
FlatEntityMapsExceptionCode.ENTITY_NOT_FOUND,
|
||||
);
|
||||
}
|
||||
|
||||
delete flatEntityMapsToMutate.byId[entityToDeleteId];
|
||||
const entityToDelete =
|
||||
flatEntityMapsToMutate.byUniversalIdentifier[universalIdentifierToDelete];
|
||||
|
||||
delete flatEntityMapsToMutate.idByUniversalIdentifier[
|
||||
entityToDelete.universalIdentifier
|
||||
delete flatEntityMapsToMutate.byUniversalIdentifier[
|
||||
universalIdentifierToDelete
|
||||
];
|
||||
|
||||
if (isDefined(entityToDelete.applicationId)) {
|
||||
delete flatEntityMapsToMutate.universalIdentifierById[entityToDeleteId];
|
||||
|
||||
if (isDefined(entityToDelete?.applicationId)) {
|
||||
const universalIdentifiers =
|
||||
flatEntityMapsToMutate.universalIdentifiersByApplicationId[
|
||||
entityToDelete.applicationId
|
||||
];
|
||||
|
||||
if (isDefined(universalIdentifiers)) {
|
||||
const index = universalIdentifiers.indexOf(
|
||||
entityToDelete.universalIdentifier,
|
||||
);
|
||||
const index = universalIdentifiers.indexOf(universalIdentifierToDelete);
|
||||
|
||||
if (index !== -1) {
|
||||
universalIdentifiers.splice(index, 1);
|
||||
|
||||
+7
-5
@@ -18,12 +18,12 @@ export type DeletedCreatedUpdatedMatrix<T extends AllMetadataName> = {
|
||||
createdFlatEntityMaps: MetadataFlatEntityMaps<T>;
|
||||
deletedFlatEntityMaps: MetadataFlatEntityMaps<T>;
|
||||
updatedFlatEntityMaps: {
|
||||
byId: Record<
|
||||
byUniversalIdentifier: Record<
|
||||
string,
|
||||
{
|
||||
updates: FlatEntityPropertiesUpdates<T>;
|
||||
// TMP remove when maps is universal based
|
||||
universalIdentifier: string;
|
||||
id: string;
|
||||
}
|
||||
>;
|
||||
};
|
||||
@@ -51,7 +51,7 @@ export const flatEntityDeletedCreatedUpdatedMatrixDispatcher = <
|
||||
const initialDispatcher: DeletedCreatedUpdatedMatrix<T> = {
|
||||
createdFlatEntityMaps: createEmptyFlatEntityMaps(),
|
||||
deletedFlatEntityMaps: createEmptyFlatEntityMaps(),
|
||||
updatedFlatEntityMaps: { byId: {} },
|
||||
updatedFlatEntityMaps: { byUniversalIdentifier: {} },
|
||||
};
|
||||
|
||||
const fromMap = new Map(from.map((obj) => [obj.universalIdentifier, obj]));
|
||||
@@ -105,8 +105,10 @@ export const flatEntityDeletedCreatedUpdatedMatrixDispatcher = <
|
||||
continue;
|
||||
}
|
||||
|
||||
initialDispatcher.updatedFlatEntityMaps.byId[toFlatEntity.id] = {
|
||||
universalIdentifier: fromFlatEntity.universalIdentifier,
|
||||
initialDispatcher.updatedFlatEntityMaps.byUniversalIdentifier[
|
||||
fromFlatEntity.universalIdentifier
|
||||
] = {
|
||||
id: toFlatEntity.id,
|
||||
updates,
|
||||
};
|
||||
}
|
||||
|
||||
+5
-1
@@ -1,5 +1,6 @@
|
||||
import { isDefined } from 'twenty-shared/utils';
|
||||
|
||||
import { findFlatEntityByIdInFlatEntityMaps } from 'src/engine/metadata-modules/flat-entity/utils/find-flat-entity-by-id-in-flat-entity-maps.util';
|
||||
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';
|
||||
|
||||
@@ -76,7 +77,10 @@ export const validateFlatEntityCircularDependency = <
|
||||
|
||||
visited.add(currentParentId);
|
||||
|
||||
const parentEntity: T | undefined = flatEntityMaps.byId[currentParentId];
|
||||
const parentEntity: T | undefined = findFlatEntityByIdInFlatEntityMaps({
|
||||
flatEntityId: currentParentId,
|
||||
flatEntityMaps,
|
||||
});
|
||||
|
||||
if (!isDefined(parentEntity)) {
|
||||
break;
|
||||
|
||||
+25
-23
@@ -15,6 +15,7 @@ import { MetadataValidationRelatedFlatEntityMaps } from 'src/engine/metadata-mod
|
||||
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 { 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 { findFlatEntityByUniversalIdentifierOrThrow } from 'src/engine/metadata-modules/flat-entity/utils/find-flat-entity-by-universal-identifier-or-throw.util';
|
||||
import { getMetadataFlatEntityMapsKey } from 'src/engine/metadata-modules/flat-entity/utils/get-metadata-flat-entity-maps-key.util';
|
||||
import { WorkspaceMigrationBuilderAdditionalCacheDataMaps } from 'src/engine/workspace-manager/workspace-migration/types/workspace-migration-builder-additional-cache-data-maps.type';
|
||||
import { deleteFlatEntityFromFlatEntityMapsThroughMutationOrThrow } from 'src/engine/workspace-manager/workspace-migration/utils/delete-flat-entity-from-flat-entity-maps-through-mutation-or-throw.util';
|
||||
@@ -66,12 +67,12 @@ export abstract class WorkspaceEntityMigrationBuilderService<
|
||||
'matrix computation',
|
||||
);
|
||||
|
||||
const fromFlatEntities = Object.values(fromFlatEntityMaps.byId).filter(
|
||||
isDefined,
|
||||
);
|
||||
const toFlatEntities = Object.values(toFlatEntityMaps.byId).filter(
|
||||
isDefined,
|
||||
);
|
||||
const fromFlatEntities = Object.values(
|
||||
fromFlatEntityMaps.byUniversalIdentifier,
|
||||
).filter(isDefined);
|
||||
const toFlatEntities = Object.values(
|
||||
toFlatEntityMaps.byUniversalIdentifier,
|
||||
).filter(isDefined);
|
||||
|
||||
const {
|
||||
createdFlatEntityMaps,
|
||||
@@ -109,16 +110,13 @@ export abstract class WorkspaceEntityMigrationBuilderService<
|
||||
`EntityBuilder ${this.metadataName}`,
|
||||
'creation validation',
|
||||
);
|
||||
for (const flatEntityToCreateId in createdFlatEntityMaps.byId) {
|
||||
const flatEntityToCreate =
|
||||
createdFlatEntityMaps.byId[flatEntityToCreateId];
|
||||
for (const flatEntityToCreateUniversalIdentifier in createdFlatEntityMaps.byUniversalIdentifier) {
|
||||
const flatEntityToCreate = findFlatEntityByUniversalIdentifierOrThrow({
|
||||
universalIdentifier: flatEntityToCreateUniversalIdentifier,
|
||||
flatEntityMaps: createdFlatEntityMaps,
|
||||
});
|
||||
|
||||
if (!isDefined(flatEntityToCreate)) {
|
||||
throw new FlatEntityMapsException(
|
||||
'Could not find flat entity to create in maps should never occur',
|
||||
FlatEntityMapsExceptionCode.ENTITY_NOT_FOUND,
|
||||
);
|
||||
}
|
||||
const flatEntityToCreateId = flatEntityToCreate.id;
|
||||
|
||||
deleteFlatEntityFromFlatEntityMapsThroughMutationOrThrow({
|
||||
entityToDeleteId: flatEntityToCreateId,
|
||||
@@ -170,12 +168,14 @@ export abstract class WorkspaceEntityMigrationBuilderService<
|
||||
buildOptions,
|
||||
metadataName: this.metadataName,
|
||||
})
|
||||
? Object.keys(deletedFlatEntityMaps.byId)
|
||||
? Object.keys(deletedFlatEntityMaps.universalIdentifierById)
|
||||
: [];
|
||||
|
||||
for (const flatEntityToDeleteId of flatEntityToDeleteIds) {
|
||||
const flatEntityToDelete =
|
||||
deletedFlatEntityMaps.byId[flatEntityToDeleteId];
|
||||
const flatEntityToDelete = findFlatEntityByIdInFlatEntityMaps({
|
||||
flatEntityId: flatEntityToDeleteId,
|
||||
flatEntityMaps: deletedFlatEntityMaps,
|
||||
});
|
||||
|
||||
if (!isDefined(flatEntityToDelete)) {
|
||||
throw new FlatEntityMapsException(
|
||||
@@ -223,9 +223,11 @@ export abstract class WorkspaceEntityMigrationBuilderService<
|
||||
);
|
||||
this.logger.time(`EntityBuilder ${this.metadataName}`, 'update validation');
|
||||
|
||||
for (const flatEntityToUpdateId in updatedFlatEntityMaps.byId) {
|
||||
for (const flatEntityToUpdateUniversalIdentifier in updatedFlatEntityMaps.byUniversalIdentifier) {
|
||||
const flatEntityToUpdate =
|
||||
updatedFlatEntityMaps.byId[flatEntityToUpdateId];
|
||||
updatedFlatEntityMaps.byUniversalIdentifier[
|
||||
flatEntityToUpdateUniversalIdentifier
|
||||
];
|
||||
|
||||
if (!isDefined(flatEntityToUpdate)) {
|
||||
throw new FlatEntityMapsException(
|
||||
@@ -236,12 +238,12 @@ export abstract class WorkspaceEntityMigrationBuilderService<
|
||||
|
||||
const validationResult = await this.validateFlatEntityUpdate({
|
||||
flatEntityUpdates: flatEntityToUpdate.updates,
|
||||
flatEntityId: flatEntityToUpdateId,
|
||||
flatEntityId: flatEntityToUpdate.id,
|
||||
optimisticFlatEntityMapsAndRelatedFlatEntityMaps,
|
||||
workspaceId,
|
||||
buildOptions,
|
||||
additionalCacheDataMaps,
|
||||
universalIdentifier: flatEntityToUpdate.universalIdentifier,
|
||||
universalIdentifier: flatEntityToUpdateUniversalIdentifier,
|
||||
});
|
||||
|
||||
if (validationResult.status === 'fail') {
|
||||
@@ -250,7 +252,7 @@ export abstract class WorkspaceEntityMigrationBuilderService<
|
||||
}
|
||||
|
||||
const existingFlatEntity = findFlatEntityByIdInFlatEntityMaps({
|
||||
flatEntityId: flatEntityToUpdateId,
|
||||
flatEntityId: flatEntityToUpdate.id,
|
||||
flatEntityMaps: optimisticFlatEntityMapsAndRelatedFlatEntityMaps[
|
||||
flatEntityMapsKey
|
||||
] as MetadataFlatEntityMaps<T>,
|
||||
|
||||
+6
-4
@@ -37,9 +37,9 @@ export class FlatAgentValidatorService {
|
||||
type: 'create',
|
||||
});
|
||||
|
||||
const existingAgents = Object.values(optimisticFlatAgentMaps.byId).filter(
|
||||
isDefined,
|
||||
);
|
||||
const existingAgents = Object.values(
|
||||
optimisticFlatAgentMaps.byUniversalIdentifier,
|
||||
).filter(isDefined);
|
||||
|
||||
validationResult.errors.push(
|
||||
...validateAgentRequiredProperties({
|
||||
@@ -180,7 +180,9 @@ export class FlatAgentValidatorService {
|
||||
...partialFlatAgent,
|
||||
};
|
||||
|
||||
const existingAgents = Object.values(optimisticFlatAgentMaps.byId)
|
||||
const existingAgents = Object.values(
|
||||
optimisticFlatAgentMaps.byUniversalIdentifier,
|
||||
)
|
||||
.filter(isDefined)
|
||||
.filter((agent) => agent.id !== flatEntityId);
|
||||
|
||||
|
||||
+34
-14
@@ -6,6 +6,7 @@ import { isDefined } from 'twenty-shared/utils';
|
||||
|
||||
import { FieldMetadataExceptionCode } from 'src/engine/metadata-modules/field-metadata/field-metadata.exception';
|
||||
import { createEmptyFlatEntityMaps } from 'src/engine/metadata-modules/flat-entity/constant/create-empty-flat-entity-maps.constant';
|
||||
import { findFlatEntityByIdInFlatEntityMaps } from 'src/engine/metadata-modules/flat-entity/utils/find-flat-entity-by-id-in-flat-entity-maps.util';
|
||||
import { FLAT_FIELD_METADATA_RELATION_PROPERTIES_TO_COMPARE } from 'src/engine/metadata-modules/flat-field-metadata/constants/flat-field-metadata-relation-properties-to-compare.constant';
|
||||
import { FlatFieldMetadataTypeValidatorService } from 'src/engine/metadata-modules/flat-field-metadata/services/flat-field-metadata-type-validator.service';
|
||||
import { FlatFieldMetadataRelationPropertiesToCompare } from 'src/engine/metadata-modules/flat-field-metadata/types/flat-field-metadata-relation-properties-to-compare.type';
|
||||
@@ -41,7 +42,10 @@ export class FlatFieldMetadataValidatorService {
|
||||
typeof ALL_METADATA_NAME.fieldMetadata
|
||||
>): FailedFlatEntityValidation<'fieldMetadata', 'update'> {
|
||||
const existingFlatFieldMetadataToUpdate =
|
||||
optimisticFlatFieldMetadataMaps.byId[flatEntityId];
|
||||
findFlatEntityByIdInFlatEntityMaps({
|
||||
flatEntityId,
|
||||
flatEntityMaps: optimisticFlatFieldMetadataMaps,
|
||||
});
|
||||
|
||||
const validationResult = getEmptyFlatEntityValidationError({
|
||||
flatEntityMinimalInformation: {
|
||||
@@ -75,8 +79,10 @@ export class FlatFieldMetadataValidatorService {
|
||||
objectMetadataId: flatFieldMetadataToValidate.objectMetadataId,
|
||||
};
|
||||
|
||||
const flatObjectMetadata =
|
||||
flatObjectMetadataMaps.byId[flatFieldMetadataToValidate.objectMetadataId];
|
||||
const flatObjectMetadata = findFlatEntityByIdInFlatEntityMaps({
|
||||
flatEntityId: flatFieldMetadataToValidate.objectMetadataId,
|
||||
flatEntityMaps: flatObjectMetadataMaps,
|
||||
});
|
||||
|
||||
if (!isDefined(flatObjectMetadata)) {
|
||||
validationResult.errors.push({
|
||||
@@ -217,8 +223,10 @@ export class FlatFieldMetadataValidatorService {
|
||||
type: 'delete',
|
||||
});
|
||||
|
||||
const flatFieldMetadataToDelete =
|
||||
optimisticFlatFieldMetadataMaps.byId[flatFieldMetadataToDeleteId];
|
||||
const flatFieldMetadataToDelete = findFlatEntityByIdInFlatEntityMaps({
|
||||
flatEntityId: flatFieldMetadataToDeleteId,
|
||||
flatEntityMaps: optimisticFlatFieldMetadataMaps,
|
||||
});
|
||||
|
||||
if (!isDefined(flatFieldMetadataToDelete)) {
|
||||
validationResult.errors.push({
|
||||
@@ -236,8 +244,10 @@ export class FlatFieldMetadataValidatorService {
|
||||
objectMetadataId: flatFieldMetadataToDelete.objectMetadataId,
|
||||
};
|
||||
|
||||
const relatedFlatObjectMetadata =
|
||||
flatObjectMetadataMaps.byId[flatFieldMetadataToDelete.objectMetadataId];
|
||||
const relatedFlatObjectMetadata = findFlatEntityByIdInFlatEntityMaps({
|
||||
flatEntityId: flatFieldMetadataToDelete.objectMetadataId,
|
||||
flatEntityMaps: flatObjectMetadataMaps,
|
||||
});
|
||||
|
||||
if (
|
||||
isDefined(relatedFlatObjectMetadata) &&
|
||||
@@ -255,12 +265,17 @@ export class FlatFieldMetadataValidatorService {
|
||||
const relationTargetObjectMetadataHasBeenDeleted =
|
||||
isMorphOrRelationFlatFieldMetadata(flatFieldMetadataToDelete) &&
|
||||
!isDefined(
|
||||
flatObjectMetadataMaps.byId[
|
||||
flatFieldMetadataToDelete.relationTargetObjectMetadataId
|
||||
],
|
||||
findFlatEntityByIdInFlatEntityMaps({
|
||||
flatEntityId:
|
||||
flatFieldMetadataToDelete.relationTargetObjectMetadataId,
|
||||
flatEntityMaps: flatObjectMetadataMaps,
|
||||
}),
|
||||
);
|
||||
const parentObjectMetadataHasBeenDeleted = !isDefined(
|
||||
flatObjectMetadataMaps.byId[flatFieldMetadataToDelete.objectMetadataId],
|
||||
findFlatEntityByIdInFlatEntityMaps({
|
||||
flatEntityId: flatFieldMetadataToDelete.objectMetadataId,
|
||||
flatEntityMaps: flatObjectMetadataMaps,
|
||||
}),
|
||||
);
|
||||
|
||||
if (
|
||||
@@ -302,8 +317,10 @@ export class FlatFieldMetadataValidatorService {
|
||||
type: 'create',
|
||||
});
|
||||
|
||||
const parentFlatObjectMetadata =
|
||||
flatObjectMetadataMaps.byId[flatFieldMetadataToValidate.objectMetadataId];
|
||||
const parentFlatObjectMetadata = findFlatEntityByIdInFlatEntityMaps({
|
||||
flatEntityId: flatFieldMetadataToValidate.objectMetadataId,
|
||||
flatEntityMaps: flatObjectMetadataMaps,
|
||||
});
|
||||
|
||||
if (!isDefined(parentFlatObjectMetadata)) {
|
||||
validationResult.errors.push({
|
||||
@@ -314,7 +331,10 @@ export class FlatFieldMetadataValidatorService {
|
||||
} else {
|
||||
if (
|
||||
isDefined(
|
||||
optimisticFlatFieldMetadataMaps.byId[flatFieldMetadataToValidate.id],
|
||||
findFlatEntityByIdInFlatEntityMaps({
|
||||
flatEntityId: flatFieldMetadataToValidate.id,
|
||||
flatEntityMaps: optimisticFlatFieldMetadataMaps,
|
||||
}),
|
||||
)
|
||||
) {
|
||||
validationResult.errors.push({
|
||||
|
||||
+1
-1
@@ -97,7 +97,7 @@ export class FlatIndexValidatorService {
|
||||
}
|
||||
|
||||
const allExistingFlatIndex = Object.values(
|
||||
optimisticFlatIndexMaps.byId,
|
||||
optimisticFlatIndexMaps.byUniversalIdentifier,
|
||||
).filter(isDefined);
|
||||
|
||||
const existingFlatIndexOnName = allExistingFlatIndex.find(
|
||||
|
||||
+13
-5
@@ -5,6 +5,7 @@ import { ALL_METADATA_NAME } from 'twenty-shared/metadata';
|
||||
import { isDefined } from 'twenty-shared/utils';
|
||||
|
||||
import { LogicFunctionExceptionCode } from 'src/engine/metadata-modules/logic-function/logic-function.exception';
|
||||
import { findFlatEntityByIdInFlatEntityMaps } from 'src/engine/metadata-modules/flat-entity/utils/find-flat-entity-by-id-in-flat-entity-maps.util';
|
||||
import { FailedFlatEntityValidation } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/types/failed-flat-entity-validation.type';
|
||||
import { getEmptyFlatEntityValidationError } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/utils/get-flat-entity-validation-error.util';
|
||||
import { FlatEntityUpdateValidationArgs } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/types/flat-entity-update-validation-args.type';
|
||||
@@ -22,8 +23,10 @@ export class FlatLogicFunctionValidatorService {
|
||||
}: FlatEntityUpdateValidationArgs<
|
||||
typeof ALL_METADATA_NAME.logicFunction
|
||||
>): FailedFlatEntityValidation<'logicFunction', 'update'> {
|
||||
const existingFlatLogicFunction =
|
||||
optimisticFlatLogicFunctionMaps.byId[flatEntityId];
|
||||
const existingFlatLogicFunction = findFlatEntityByIdInFlatEntityMaps({
|
||||
flatEntityId,
|
||||
flatEntityMaps: optimisticFlatLogicFunctionMaps,
|
||||
});
|
||||
|
||||
const validationResult = getEmptyFlatEntityValidationError({
|
||||
flatEntityMinimalInformation: {
|
||||
@@ -62,8 +65,10 @@ export class FlatLogicFunctionValidatorService {
|
||||
type: 'delete',
|
||||
});
|
||||
|
||||
const existingFlatLogicFunction =
|
||||
optimisticFlatLogicFunctionMaps.byId[logicFunctionIdToDelete];
|
||||
const existingFlatLogicFunction = findFlatEntityByIdInFlatEntityMaps({
|
||||
flatEntityId: logicFunctionIdToDelete,
|
||||
flatEntityMaps: optimisticFlatLogicFunctionMaps,
|
||||
});
|
||||
|
||||
if (!isDefined(existingFlatLogicFunction)) {
|
||||
validationResult.errors.push({
|
||||
@@ -95,7 +100,10 @@ export class FlatLogicFunctionValidatorService {
|
||||
|
||||
if (
|
||||
isDefined(
|
||||
optimisticFlatLogicFunctionMaps.byId[flatLogicFunctionToValidate.id],
|
||||
findFlatEntityByIdInFlatEntityMaps({
|
||||
flatEntityId: flatLogicFunctionToValidate.id,
|
||||
flatEntityMaps: optimisticFlatLogicFunctionMaps,
|
||||
}),
|
||||
)
|
||||
) {
|
||||
validationResult.errors.push({
|
||||
|
||||
+13
-5
@@ -4,6 +4,7 @@ import { msg, t } from '@lingui/core/macro';
|
||||
import { ALL_METADATA_NAME } from 'twenty-shared/metadata';
|
||||
import { isDefined } from 'twenty-shared/utils';
|
||||
|
||||
import { findFlatEntityByIdInFlatEntityMaps } from 'src/engine/metadata-modules/flat-entity/utils/find-flat-entity-by-id-in-flat-entity-maps.util';
|
||||
import { validateFlatObjectMetadataIdentifiers } from 'src/engine/metadata-modules/flat-object-metadata/validators/utils/validate-flat-object-metadata-identifiers.util';
|
||||
import { validateFlatObjectMetadataNameAndLabels } from 'src/engine/metadata-modules/flat-object-metadata/validators/utils/validate-flat-object-metadata-name-and-labels.util';
|
||||
import { ObjectMetadataExceptionCode } from 'src/engine/metadata-modules/object-metadata/object-metadata.exception';
|
||||
@@ -27,8 +28,10 @@ export class FlatObjectMetadataValidatorService {
|
||||
}: FlatEntityUpdateValidationArgs<
|
||||
typeof ALL_METADATA_NAME.objectMetadata
|
||||
>): FailedFlatEntityValidation<'objectMetadata', 'update'> {
|
||||
const existingFlatObjectMetadata =
|
||||
optimisticFlatObjectMetadataMaps.byId[flatEntityId];
|
||||
const existingFlatObjectMetadata = findFlatEntityByIdInFlatEntityMaps({
|
||||
flatEntityId,
|
||||
flatEntityMaps: optimisticFlatObjectMetadataMaps,
|
||||
});
|
||||
|
||||
const validationResult = getEmptyFlatEntityValidationError({
|
||||
flatEntityMinimalInformation: {
|
||||
@@ -114,8 +117,10 @@ export class FlatObjectMetadataValidatorService {
|
||||
type: 'delete',
|
||||
});
|
||||
|
||||
const flatObjectMetadataToDelete =
|
||||
optimisticFlatObjectMetadataMaps.byId[objectMetadataToDeleteId];
|
||||
const flatObjectMetadataToDelete = findFlatEntityByIdInFlatEntityMaps({
|
||||
flatEntityId: objectMetadataToDeleteId,
|
||||
flatEntityMaps: optimisticFlatObjectMetadataMaps,
|
||||
});
|
||||
|
||||
if (!isDefined(flatObjectMetadataToDelete)) {
|
||||
validationResult.errors.push({
|
||||
@@ -176,7 +181,10 @@ export class FlatObjectMetadataValidatorService {
|
||||
|
||||
if (
|
||||
isDefined(
|
||||
optimisticFlatObjectMetadataMaps.byId[flatObjectMetadataToValidate.id],
|
||||
findFlatEntityByIdInFlatEntityMaps({
|
||||
flatEntityId: flatObjectMetadataToValidate.id,
|
||||
flatEntityMaps: optimisticFlatObjectMetadataMaps,
|
||||
}),
|
||||
)
|
||||
) {
|
||||
objectValidationResult.errors.push({
|
||||
|
||||
+9
-5
@@ -156,8 +156,10 @@ export class FlatPageLayoutWidgetValidatorService {
|
||||
type: 'delete',
|
||||
});
|
||||
|
||||
const existingFlatPageLayoutWidget =
|
||||
optimisticFlatPageLayoutWidgetMaps.byId[pageLayoutWidgetIdToDelete];
|
||||
const existingFlatPageLayoutWidget = findFlatEntityByIdInFlatEntityMaps({
|
||||
flatEntityId: pageLayoutWidgetIdToDelete,
|
||||
flatEntityMaps: optimisticFlatPageLayoutWidgetMaps,
|
||||
});
|
||||
|
||||
if (!isDefined(existingFlatPageLayoutWidget)) {
|
||||
validationResult.errors.push({
|
||||
@@ -195,9 +197,11 @@ export class FlatPageLayoutWidgetValidatorService {
|
||||
type: 'create',
|
||||
});
|
||||
|
||||
const existingFlatPageLayoutWidget =
|
||||
optimisticFlatEntityMapsAndRelatedFlatEntityMaps.flatPageLayoutWidgetMaps
|
||||
.byId[flatPageLayoutWidgetToValidate.id];
|
||||
const existingFlatPageLayoutWidget = findFlatEntityByIdInFlatEntityMaps({
|
||||
flatEntityId: flatPageLayoutWidgetToValidate.id,
|
||||
flatEntityMaps:
|
||||
optimisticFlatEntityMapsAndRelatedFlatEntityMaps.flatPageLayoutWidgetMaps,
|
||||
});
|
||||
|
||||
if (isDefined(existingFlatPageLayoutWidget)) {
|
||||
const flatPageLayoutWidgetId = flatPageLayoutWidgetToValidate.id;
|
||||
|
||||
+4
-1
@@ -121,7 +121,10 @@ export class FlatRoleTargetValidatorService {
|
||||
}: FlatEntityUpdateValidationArgs<
|
||||
typeof ALL_METADATA_NAME.roleTarget
|
||||
>): FailedFlatEntityValidation<'roleTarget', 'update'> {
|
||||
const existingRoleTarget = optimisticFlatRoleTargetMaps.byId[flatEntityId];
|
||||
const existingRoleTarget = findFlatEntityByIdInFlatEntityMaps({
|
||||
flatEntityId,
|
||||
flatEntityMaps: optimisticFlatRoleTargetMaps,
|
||||
});
|
||||
|
||||
const validationResult = getEmptyFlatEntityValidationError({
|
||||
flatEntityMinimalInformation: {
|
||||
|
||||
+15
-8
@@ -4,6 +4,7 @@ import { msg, t } from '@lingui/core/macro';
|
||||
import { ALL_METADATA_NAME } from 'twenty-shared/metadata';
|
||||
import { isDefined } from 'twenty-shared/utils';
|
||||
|
||||
import { findFlatEntityByIdInFlatEntityMaps } from 'src/engine/metadata-modules/flat-entity/utils/find-flat-entity-by-id-in-flat-entity-maps.util';
|
||||
import { PermissionsExceptionCode } from 'src/engine/metadata-modules/permissions/permissions.exception';
|
||||
import { findFlatEntityPropertyUpdate } from 'src/engine/workspace-manager/workspace-migration/utils/find-flat-entity-property-update.util';
|
||||
import { type FailedFlatEntityValidation } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/types/failed-flat-entity-validation.type';
|
||||
@@ -36,9 +37,9 @@ export class FlatRoleValidatorService {
|
||||
type: 'create',
|
||||
});
|
||||
|
||||
const existingRoles = Object.values(optimisticFlatRoleMaps.byId).filter(
|
||||
isDefined,
|
||||
);
|
||||
const existingRoles = Object.values(
|
||||
optimisticFlatRoleMaps.byUniversalIdentifier,
|
||||
).filter(isDefined);
|
||||
|
||||
validationResult.errors.push(
|
||||
...validateRoleRequiredPropertiesAreDefined({
|
||||
@@ -81,7 +82,10 @@ export class FlatRoleValidatorService {
|
||||
type: 'delete',
|
||||
});
|
||||
|
||||
const existingRole = optimisticFlatRoleMaps.byId[flatEntityToValidate.id];
|
||||
const existingRole = findFlatEntityByIdInFlatEntityMaps({
|
||||
flatEntityId: flatEntityToValidate.id,
|
||||
flatEntityMaps: optimisticFlatRoleMaps,
|
||||
});
|
||||
|
||||
if (!isDefined(existingRole)) {
|
||||
validationResult.errors.push({
|
||||
@@ -113,7 +117,10 @@ export class FlatRoleValidatorService {
|
||||
}: FlatEntityUpdateValidationArgs<
|
||||
typeof ALL_METADATA_NAME.role
|
||||
>): FailedFlatEntityValidation<'role', 'update'> {
|
||||
const fromFlatRole = optimisticFlatRoleMaps.byId[flatEntityId];
|
||||
const fromFlatRole = findFlatEntityByIdInFlatEntityMaps({
|
||||
flatEntityId,
|
||||
flatEntityMaps: optimisticFlatRoleMaps,
|
||||
});
|
||||
|
||||
const validationResult = getEmptyFlatEntityValidationError({
|
||||
flatEntityMinimalInformation: {
|
||||
@@ -160,9 +167,9 @@ export class FlatRoleValidatorService {
|
||||
});
|
||||
|
||||
if (isDefined(flatRoleLabelUpdate)) {
|
||||
const existingRoles = Object.values(optimisticFlatRoleMaps.byId).filter(
|
||||
isDefined,
|
||||
);
|
||||
const existingRoles = Object.values(
|
||||
optimisticFlatRoleMaps.byUniversalIdentifier,
|
||||
).filter(isDefined);
|
||||
|
||||
validationResult.errors.push(
|
||||
...validateRoleLabelUniqueness({
|
||||
|
||||
+18
-25
@@ -27,11 +27,7 @@ export class FlatRowLevelPermissionPredicateGroupValidatorService {
|
||||
optimisticFlatPredicateGroupMaps,
|
||||
flatRoleMaps,
|
||||
flatObjectMetadataMaps,
|
||||
} = optimisticFlatEntityMapsAndRelatedFlatEntityMaps as Partial<{
|
||||
flatRowLevelPermissionPredicateGroupMaps: typeof optimisticFlatEntityMapsAndRelatedFlatEntityMaps.flatRowLevelPermissionPredicateGroupMaps;
|
||||
flatRoleMaps: typeof optimisticFlatEntityMapsAndRelatedFlatEntityMaps.flatRoleMaps;
|
||||
flatObjectMetadataMaps: typeof optimisticFlatEntityMapsAndRelatedFlatEntityMaps.flatObjectMetadataMaps;
|
||||
}>;
|
||||
} = optimisticFlatEntityMapsAndRelatedFlatEntityMaps;
|
||||
const validationResult = getEmptyFlatEntityValidationError({
|
||||
flatEntityMinimalInformation: {
|
||||
id: flatPredicateGroupToValidate.id,
|
||||
@@ -41,8 +37,10 @@ export class FlatRowLevelPermissionPredicateGroupValidatorService {
|
||||
type: 'create',
|
||||
});
|
||||
|
||||
const existingPredicateGroup =
|
||||
optimisticFlatPredicateGroupMaps?.byId[flatPredicateGroupToValidate.id];
|
||||
const existingPredicateGroup = findFlatEntityByIdInFlatEntityMaps({
|
||||
flatEntityId: flatPredicateGroupToValidate.id,
|
||||
flatEntityMaps: optimisticFlatPredicateGroupMaps,
|
||||
});
|
||||
|
||||
if (isDefined(existingPredicateGroup)) {
|
||||
validationResult.errors.push({
|
||||
@@ -55,8 +53,7 @@ export class FlatRowLevelPermissionPredicateGroupValidatorService {
|
||||
if (
|
||||
isDefined(
|
||||
flatPredicateGroupToValidate.parentRowLevelPermissionPredicateGroupId,
|
||||
) &&
|
||||
optimisticFlatPredicateGroupMaps
|
||||
)
|
||||
) {
|
||||
const parentGroup = findFlatEntityByIdInFlatEntityMaps({
|
||||
flatEntityId:
|
||||
@@ -115,9 +112,8 @@ export class FlatRowLevelPermissionPredicateGroupValidatorService {
|
||||
const {
|
||||
flatRowLevelPermissionPredicateGroupMaps:
|
||||
optimisticFlatPredicateGroupMaps,
|
||||
} = optimisticFlatEntityMapsAndRelatedFlatEntityMaps as Partial<{
|
||||
flatRowLevelPermissionPredicateGroupMaps: typeof optimisticFlatEntityMapsAndRelatedFlatEntityMaps.flatRowLevelPermissionPredicateGroupMaps;
|
||||
}>;
|
||||
} = optimisticFlatEntityMapsAndRelatedFlatEntityMaps;
|
||||
|
||||
const validationResult = getEmptyFlatEntityValidationError({
|
||||
flatEntityMinimalInformation: {
|
||||
id: flatPredicateGroupToDelete.id,
|
||||
@@ -127,8 +123,10 @@ export class FlatRowLevelPermissionPredicateGroupValidatorService {
|
||||
type: 'delete',
|
||||
});
|
||||
|
||||
const existingPredicateGroup =
|
||||
optimisticFlatPredicateGroupMaps?.byId[flatPredicateGroupToDelete.id];
|
||||
const existingPredicateGroup = findFlatEntityByIdInFlatEntityMaps({
|
||||
flatEntityId: flatPredicateGroupToDelete.id,
|
||||
flatEntityMaps: optimisticFlatPredicateGroupMaps,
|
||||
});
|
||||
|
||||
if (!isDefined(existingPredicateGroup)) {
|
||||
validationResult.errors.push({
|
||||
@@ -153,14 +151,12 @@ export class FlatRowLevelPermissionPredicateGroupValidatorService {
|
||||
optimisticFlatPredicateGroupMaps,
|
||||
flatRoleMaps,
|
||||
flatObjectMetadataMaps,
|
||||
} = optimisticFlatEntityMapsAndRelatedFlatEntityMaps as Partial<{
|
||||
flatRowLevelPermissionPredicateGroupMaps: typeof optimisticFlatEntityMapsAndRelatedFlatEntityMaps.flatRowLevelPermissionPredicateGroupMaps;
|
||||
flatRoleMaps: typeof optimisticFlatEntityMapsAndRelatedFlatEntityMaps.flatRoleMaps;
|
||||
flatObjectMetadataMaps: typeof optimisticFlatEntityMapsAndRelatedFlatEntityMaps.flatObjectMetadataMaps;
|
||||
}>;
|
||||
} = optimisticFlatEntityMapsAndRelatedFlatEntityMaps;
|
||||
|
||||
const existingPredicateGroup =
|
||||
optimisticFlatPredicateGroupMaps?.byId[flatEntityId];
|
||||
const existingPredicateGroup = findFlatEntityByIdInFlatEntityMaps({
|
||||
flatEntityId,
|
||||
flatEntityMaps: optimisticFlatPredicateGroupMaps,
|
||||
});
|
||||
|
||||
const validationResult = getEmptyFlatEntityValidationError({
|
||||
flatEntityMinimalInformation: {
|
||||
@@ -214,10 +210,7 @@ export class FlatRowLevelPermissionPredicateGroupValidatorService {
|
||||
}
|
||||
|
||||
if (
|
||||
isDefined(
|
||||
updatedPredicateGroup.parentRowLevelPermissionPredicateGroupId,
|
||||
) &&
|
||||
optimisticFlatPredicateGroupMaps
|
||||
isDefined(updatedPredicateGroup.parentRowLevelPermissionPredicateGroupId)
|
||||
) {
|
||||
const parentGroup = findFlatEntityByIdInFlatEntityMaps({
|
||||
flatEntityId:
|
||||
|
||||
+15
-22
@@ -28,13 +28,7 @@ export class FlatRowLevelPermissionPredicateValidatorService {
|
||||
flatObjectMetadataMaps,
|
||||
flatRowLevelPermissionPredicateGroupMaps,
|
||||
flatRoleMaps,
|
||||
} = optimisticFlatEntityMapsAndRelatedFlatEntityMaps as Partial<{
|
||||
flatRowLevelPermissionPredicateMaps: typeof optimisticFlatEntityMapsAndRelatedFlatEntityMaps.flatRowLevelPermissionPredicateMaps;
|
||||
flatFieldMetadataMaps: typeof optimisticFlatEntityMapsAndRelatedFlatEntityMaps.flatFieldMetadataMaps;
|
||||
flatObjectMetadataMaps: typeof optimisticFlatEntityMapsAndRelatedFlatEntityMaps.flatObjectMetadataMaps;
|
||||
flatRowLevelPermissionPredicateGroupMaps: typeof optimisticFlatEntityMapsAndRelatedFlatEntityMaps.flatRowLevelPermissionPredicateGroupMaps;
|
||||
flatRoleMaps: typeof optimisticFlatEntityMapsAndRelatedFlatEntityMaps.flatRoleMaps;
|
||||
}>;
|
||||
} = optimisticFlatEntityMapsAndRelatedFlatEntityMaps;
|
||||
|
||||
const validationResult = getEmptyFlatEntityValidationError({
|
||||
flatEntityMinimalInformation: {
|
||||
@@ -45,8 +39,10 @@ export class FlatRowLevelPermissionPredicateValidatorService {
|
||||
type: 'create',
|
||||
});
|
||||
|
||||
const existingPredicate =
|
||||
optimisticFlatPredicateMaps?.byId[flatPredicateToValidate.id];
|
||||
const existingPredicate = findFlatEntityByIdInFlatEntityMaps({
|
||||
flatEntityId: flatPredicateToValidate.id,
|
||||
flatEntityMaps: optimisticFlatPredicateMaps,
|
||||
});
|
||||
|
||||
if (isDefined(existingPredicate)) {
|
||||
validationResult.errors.push({
|
||||
@@ -130,9 +126,7 @@ export class FlatRowLevelPermissionPredicateValidatorService {
|
||||
typeof ALL_METADATA_NAME.rowLevelPermissionPredicate
|
||||
>): FailedFlatEntityValidation<'rowLevelPermissionPredicate', 'delete'> {
|
||||
const { flatRowLevelPermissionPredicateMaps: optimisticFlatPredicateMaps } =
|
||||
optimisticFlatEntityMapsAndRelatedFlatEntityMaps as Partial<{
|
||||
flatRowLevelPermissionPredicateMaps: typeof optimisticFlatEntityMapsAndRelatedFlatEntityMaps.flatRowLevelPermissionPredicateMaps;
|
||||
}>;
|
||||
optimisticFlatEntityMapsAndRelatedFlatEntityMaps;
|
||||
const validationResult = getEmptyFlatEntityValidationError({
|
||||
flatEntityMinimalInformation: {
|
||||
id: flatPredicateToDelete.id,
|
||||
@@ -142,8 +136,10 @@ export class FlatRowLevelPermissionPredicateValidatorService {
|
||||
type: 'delete',
|
||||
});
|
||||
|
||||
const existingPredicate =
|
||||
optimisticFlatPredicateMaps?.byId[flatPredicateToDelete.id];
|
||||
const existingPredicate = findFlatEntityByIdInFlatEntityMaps({
|
||||
flatEntityId: flatPredicateToDelete.id,
|
||||
flatEntityMaps: optimisticFlatPredicateMaps,
|
||||
});
|
||||
|
||||
if (!isDefined(existingPredicate)) {
|
||||
validationResult.errors.push({
|
||||
@@ -169,15 +165,12 @@ export class FlatRowLevelPermissionPredicateValidatorService {
|
||||
flatObjectMetadataMaps,
|
||||
flatRowLevelPermissionPredicateGroupMaps,
|
||||
flatRoleMaps,
|
||||
} = optimisticFlatEntityMapsAndRelatedFlatEntityMaps as Partial<{
|
||||
flatRowLevelPermissionPredicateMaps: typeof optimisticFlatEntityMapsAndRelatedFlatEntityMaps.flatRowLevelPermissionPredicateMaps;
|
||||
flatFieldMetadataMaps: typeof optimisticFlatEntityMapsAndRelatedFlatEntityMaps.flatFieldMetadataMaps;
|
||||
flatObjectMetadataMaps: typeof optimisticFlatEntityMapsAndRelatedFlatEntityMaps.flatObjectMetadataMaps;
|
||||
flatRowLevelPermissionPredicateGroupMaps: typeof optimisticFlatEntityMapsAndRelatedFlatEntityMaps.flatRowLevelPermissionPredicateGroupMaps;
|
||||
flatRoleMaps: typeof optimisticFlatEntityMapsAndRelatedFlatEntityMaps.flatRoleMaps;
|
||||
}>;
|
||||
} = optimisticFlatEntityMapsAndRelatedFlatEntityMaps;
|
||||
|
||||
const existingPredicate = optimisticFlatPredicateMaps?.byId[flatEntityId];
|
||||
const existingPredicate = findFlatEntityByIdInFlatEntityMaps({
|
||||
flatEntityId,
|
||||
flatEntityMaps: optimisticFlatPredicateMaps,
|
||||
});
|
||||
|
||||
const validationResult = getEmptyFlatEntityValidationError({
|
||||
flatEntityMinimalInformation: {
|
||||
|
||||
+6
-4
@@ -41,9 +41,9 @@ export class FlatSkillValidatorService {
|
||||
type: 'create',
|
||||
});
|
||||
|
||||
const existingSkills = Object.values(optimisticFlatSkillMaps.byId).filter(
|
||||
isDefined,
|
||||
);
|
||||
const existingSkills = Object.values(
|
||||
optimisticFlatSkillMaps.byUniversalIdentifier,
|
||||
).filter(isDefined);
|
||||
|
||||
validationResult.errors.push(
|
||||
...validateSkillRequiredProperties({ flatSkill }),
|
||||
@@ -222,7 +222,9 @@ export class FlatSkillValidatorService {
|
||||
});
|
||||
|
||||
if (isDefined(nameUpdate)) {
|
||||
const existingSkills = Object.values(optimisticFlatSkillMaps.byId)
|
||||
const existingSkills = Object.values(
|
||||
optimisticFlatSkillMaps.byUniversalIdentifier,
|
||||
)
|
||||
.filter(isDefined)
|
||||
.filter((skill) => skill.id !== flatEntityId);
|
||||
|
||||
|
||||
+16
-7
@@ -30,8 +30,10 @@ export class FlatViewFieldValidatorService {
|
||||
}: FlatEntityUpdateValidationArgs<
|
||||
typeof ALL_METADATA_NAME.viewField
|
||||
>): FailedFlatEntityValidation<'viewField', 'update'> {
|
||||
const existingFlatViewField =
|
||||
optimisticFlatViewFieldMaps.byId[flatEntityId];
|
||||
const existingFlatViewField = findFlatEntityByIdInFlatEntityMaps({
|
||||
flatEntityId,
|
||||
flatEntityMaps: optimisticFlatViewFieldMaps,
|
||||
});
|
||||
|
||||
const validationResult = getEmptyFlatEntityValidationError({
|
||||
flatEntityMinimalInformation: {
|
||||
@@ -139,8 +141,10 @@ export class FlatViewFieldValidatorService {
|
||||
type: 'delete',
|
||||
});
|
||||
|
||||
const existingFlatViewField =
|
||||
optimisticFlatViewFieldMaps.byId[viewFieldIdToDelete];
|
||||
const existingFlatViewField = findFlatEntityByIdInFlatEntityMaps({
|
||||
flatEntityId: viewFieldIdToDelete,
|
||||
flatEntityMaps: optimisticFlatViewFieldMaps,
|
||||
});
|
||||
|
||||
if (!isDefined(existingFlatViewField)) {
|
||||
validationResult.errors.push({
|
||||
@@ -206,8 +210,10 @@ export class FlatViewFieldValidatorService {
|
||||
type: 'create',
|
||||
});
|
||||
|
||||
const existingFlatViewField =
|
||||
optimisticFlatViewFieldMaps.byId[flatViewFieldToValidate.id];
|
||||
const existingFlatViewField = findFlatEntityByIdInFlatEntityMaps({
|
||||
flatEntityId: flatViewFieldToValidate.id,
|
||||
flatEntityMaps: optimisticFlatViewFieldMaps,
|
||||
});
|
||||
|
||||
if (isDefined(existingFlatViewField)) {
|
||||
const flatViewFieldId = flatViewFieldToValidate.id;
|
||||
@@ -232,7 +238,10 @@ export class FlatViewFieldValidatorService {
|
||||
});
|
||||
}
|
||||
|
||||
const flatView = flatViewMaps.byId[flatViewFieldToValidate.viewId];
|
||||
const flatView = findFlatEntityByIdInFlatEntityMaps({
|
||||
flatEntityId: flatViewFieldToValidate.viewId,
|
||||
flatEntityMaps: flatViewMaps,
|
||||
});
|
||||
|
||||
if (!isDefined(flatView)) {
|
||||
validationResult.errors.push({
|
||||
|
||||
+4
-2
@@ -198,8 +198,10 @@ export class FlatViewFilterGroupValidatorService {
|
||||
}: FlatEntityUpdateValidationArgs<
|
||||
typeof ALL_METADATA_NAME.viewFilterGroup
|
||||
>): FailedFlatEntityValidation<'viewFilterGroup', 'update'> {
|
||||
const existingViewFilterGroup =
|
||||
optimisticFlatViewFilterGroupMaps.byId[flatEntityId];
|
||||
const existingViewFilterGroup = findFlatEntityByIdInFlatEntityMaps({
|
||||
flatEntityId,
|
||||
flatEntityMaps: optimisticFlatViewFilterGroupMaps,
|
||||
});
|
||||
|
||||
const validationResult = getEmptyFlatEntityValidationError({
|
||||
flatEntityMinimalInformation: {
|
||||
|
||||
+4
-1
@@ -139,7 +139,10 @@ export class FlatViewFilterValidatorService {
|
||||
}: FlatEntityUpdateValidationArgs<
|
||||
typeof ALL_METADATA_NAME.viewFilter
|
||||
>): FailedFlatEntityValidation<'viewFilter', 'update'> {
|
||||
const existingViewFilter = optimisticFlatViewFilterMaps.byId[flatEntityId];
|
||||
const existingViewFilter = findFlatEntityByIdInFlatEntityMaps({
|
||||
flatEntityId,
|
||||
flatEntityMaps: optimisticFlatViewFilterMaps,
|
||||
});
|
||||
|
||||
const validationResult = getEmptyFlatEntityValidationError({
|
||||
flatEntityMinimalInformation: {
|
||||
|
||||
+16
-7
@@ -24,8 +24,10 @@ export class FlatViewGroupValidatorService {
|
||||
}: FlatEntityUpdateValidationArgs<
|
||||
typeof ALL_METADATA_NAME.viewGroup
|
||||
>): FailedFlatEntityValidation<'viewGroup', 'update'> {
|
||||
const existingFlatViewGroup =
|
||||
optimisticFlatViewGroupMaps.byId[flatEntityId];
|
||||
const existingFlatViewGroup = findFlatEntityByIdInFlatEntityMaps({
|
||||
flatEntityId,
|
||||
flatEntityMaps: optimisticFlatViewGroupMaps,
|
||||
});
|
||||
|
||||
const validationResult = getEmptyFlatEntityValidationError({
|
||||
flatEntityMinimalInformation: {
|
||||
@@ -100,8 +102,10 @@ export class FlatViewGroupValidatorService {
|
||||
type: 'delete',
|
||||
});
|
||||
|
||||
const existingFlatViewGroup =
|
||||
optimisticFlatViewGroupMaps.byId[viewGroupIdToDelete];
|
||||
const existingFlatViewGroup = findFlatEntityByIdInFlatEntityMaps({
|
||||
flatEntityId: viewGroupIdToDelete,
|
||||
flatEntityMaps: optimisticFlatViewGroupMaps,
|
||||
});
|
||||
|
||||
if (!isDefined(existingFlatViewGroup)) {
|
||||
validationResult.errors.push({
|
||||
@@ -133,8 +137,10 @@ export class FlatViewGroupValidatorService {
|
||||
type: 'create',
|
||||
});
|
||||
|
||||
const existingFlatViewGroup =
|
||||
optimisticFlatViewGroupMaps.byId[flatViewGroupToValidate.id];
|
||||
const existingFlatViewGroup = findFlatEntityByIdInFlatEntityMaps({
|
||||
flatEntityId: flatViewGroupToValidate.id,
|
||||
flatEntityMaps: optimisticFlatViewGroupMaps,
|
||||
});
|
||||
|
||||
if (isDefined(existingFlatViewGroup)) {
|
||||
const flatViewGroupId = flatViewGroupToValidate.id;
|
||||
@@ -146,7 +152,10 @@ export class FlatViewGroupValidatorService {
|
||||
});
|
||||
}
|
||||
|
||||
const flatView = flatViewMaps.byId[flatViewGroupToValidate.viewId];
|
||||
const flatView = findFlatEntityByIdInFlatEntityMaps({
|
||||
flatEntityId: flatViewGroupToValidate.viewId,
|
||||
flatEntityMaps: flatViewMaps,
|
||||
});
|
||||
|
||||
if (!isDefined(flatView)) {
|
||||
validationResult.errors.push({
|
||||
|
||||
+20
-6
@@ -27,7 +27,10 @@ export class FlatViewValidatorService {
|
||||
}: FlatEntityUpdateValidationArgs<
|
||||
typeof ALL_METADATA_NAME.view
|
||||
>): FailedFlatEntityValidation<'view', 'update'> {
|
||||
const existingFlatView = optimisticFlatViewMaps.byId[flatEntityId];
|
||||
const existingFlatView = findFlatEntityByIdInFlatEntityMaps({
|
||||
flatEntityId,
|
||||
flatEntityMaps: optimisticFlatViewMaps,
|
||||
});
|
||||
|
||||
const validationResult = getEmptyFlatEntityValidationError({
|
||||
flatEntityMinimalInformation: {
|
||||
@@ -164,8 +167,10 @@ export class FlatViewValidatorService {
|
||||
type: 'delete',
|
||||
});
|
||||
|
||||
const existingFlatView =
|
||||
optimisticFlatViewMaps.byId[flatEntityToValidate.id];
|
||||
const existingFlatView = findFlatEntityByIdInFlatEntityMaps({
|
||||
flatEntityId: flatEntityToValidate.id,
|
||||
flatEntityMaps: optimisticFlatViewMaps,
|
||||
});
|
||||
|
||||
if (!isDefined(existingFlatView)) {
|
||||
validationResult.errors.push({
|
||||
@@ -197,8 +202,10 @@ export class FlatViewValidatorService {
|
||||
type: 'create',
|
||||
});
|
||||
|
||||
const optimisticFlatObjectMetadata =
|
||||
flatObjectMetadataMaps.byId[flatViewToValidate.objectMetadataId];
|
||||
const optimisticFlatObjectMetadata = findFlatEntityByIdInFlatEntityMaps({
|
||||
flatEntityId: flatViewToValidate.objectMetadataId,
|
||||
flatEntityMaps: flatObjectMetadataMaps,
|
||||
});
|
||||
|
||||
if (!isDefined(optimisticFlatObjectMetadata)) {
|
||||
validationResult.errors.push({
|
||||
@@ -208,7 +215,14 @@ export class FlatViewValidatorService {
|
||||
});
|
||||
}
|
||||
|
||||
if (isDefined(optimisticFlatViewMaps.byId[flatViewToValidate.id])) {
|
||||
if (
|
||||
isDefined(
|
||||
findFlatEntityByIdInFlatEntityMaps({
|
||||
flatEntityId: flatViewToValidate.id,
|
||||
flatEntityMaps: optimisticFlatViewMaps,
|
||||
}),
|
||||
)
|
||||
) {
|
||||
validationResult.errors.push({
|
||||
code: ViewExceptionCode.INVALID_VIEW_DATA,
|
||||
message: t`View with same id is already exists`,
|
||||
|
||||
+3
-3
@@ -20,8 +20,8 @@ export const findFieldMetadataIdInCreateFieldContext = ({
|
||||
return generatedId;
|
||||
}
|
||||
|
||||
const existingFieldId =
|
||||
flatFieldMetadataMaps.idByUniversalIdentifier[universalIdentifier];
|
||||
const existingField =
|
||||
flatFieldMetadataMaps.byUniversalIdentifier[universalIdentifier];
|
||||
|
||||
return existingFieldId ?? null;
|
||||
return existingField?.id ?? null;
|
||||
};
|
||||
|
||||
+8
-15
@@ -19,13 +19,6 @@ export type FromUniversalFlatFieldMetadataToFlatFieldMetadataArgs = {
|
||||
objectMetadataId?: string;
|
||||
};
|
||||
|
||||
const getIdFromUniversalIdentifier = (
|
||||
universalIdentifier: string,
|
||||
flatEntityMaps: { idByUniversalIdentifier: Partial<Record<string, string>> },
|
||||
): string | null => {
|
||||
return flatEntityMaps.idByUniversalIdentifier[universalIdentifier] ?? null;
|
||||
};
|
||||
|
||||
export const fromUniversalFlatFieldMetadataToFlatFieldMetadata = ({
|
||||
universalFlatFieldMetadata,
|
||||
allFieldIdToBeCreatedInActionByUniversalIdentifierMap,
|
||||
@@ -66,10 +59,10 @@ export const fromUniversalFlatFieldMetadataToFlatFieldMetadata = ({
|
||||
|
||||
const objectMetadataId =
|
||||
optionalObjectMetadataId ??
|
||||
getIdFromUniversalIdentifier(
|
||||
objectMetadataUniversalIdentifier,
|
||||
allFlatEntityMaps.flatObjectMetadataMaps,
|
||||
);
|
||||
allFlatEntityMaps.flatObjectMetadataMaps.byUniversalIdentifier[
|
||||
objectMetadataUniversalIdentifier
|
||||
]?.id ??
|
||||
null;
|
||||
|
||||
if (!isDefined(objectMetadataId)) {
|
||||
throw new Error(
|
||||
@@ -96,10 +89,10 @@ export const fromUniversalFlatFieldMetadataToFlatFieldMetadata = ({
|
||||
let relationTargetObjectMetadataId: string | null = null;
|
||||
|
||||
if (isDefined(relationTargetObjectMetadataUniversalIdentifier)) {
|
||||
relationTargetObjectMetadataId = getIdFromUniversalIdentifier(
|
||||
relationTargetObjectMetadataUniversalIdentifier,
|
||||
allFlatEntityMaps.flatObjectMetadataMaps,
|
||||
);
|
||||
relationTargetObjectMetadataId =
|
||||
allFlatEntityMaps.flatObjectMetadataMaps.byUniversalIdentifier[
|
||||
relationTargetObjectMetadataUniversalIdentifier
|
||||
]?.id ?? null;
|
||||
|
||||
if (!isDefined(relationTargetObjectMetadataId)) {
|
||||
throw new Error(
|
||||
|
||||
+3
-3
@@ -36,10 +36,10 @@ const findFieldMetadataIdInCreateObjectContext = ({
|
||||
return generatedId;
|
||||
}
|
||||
|
||||
const existingFieldId =
|
||||
flatFieldMetadataMaps.idByUniversalIdentifier[universalIdentifier];
|
||||
const existingField =
|
||||
flatFieldMetadataMaps.byUniversalIdentifier[universalIdentifier];
|
||||
|
||||
return existingFieldId ?? null;
|
||||
return existingField?.id ?? null;
|
||||
};
|
||||
|
||||
export const fromUniversalFlatObjectMetadataToFlatObjectMetadata = ({
|
||||
|
||||
Reference in New Issue
Block a user