Refactor flat entity maps to be universal oriented (#17665)

# Introduction
In preparation of the workspace agnostic builder, we're migrating
`FlatEntityMaps` to be universal identifier oriented and based
As in the builder context there're won't be any ids at all
Please also note that the FlatEntity is a UniversalFlatEntity superset

From
```ts
import { type SyncableFlatEntity } from 'src/engine/metadata-modules/flat-entity/types/flat-entity-from.type';

export type FlatEntityMaps<T extends SyncableFlatEntity> = {
  byId: Partial<Record<string, T>>;
  idByUniversalIdentifier: Partial<Record<string, string>>;
  universalIdentifiersByApplicationId: Partial<Record<string, string[]>>;
};
```

To
```ts
export type FlatEntityMaps<
  T extends SyncableFlatEntity | UniversalSyncableFlatEntity,
> = {
  byUniversalIdentifier: Partial<Record<string, T>>;
  universalIdentifierById: Partial<Record<string, string>>;
  universalIdentifiersByApplicationId: Partial<Record<string, string[]>>; // this might make more sense to be migrated to universalIdentifiersByApplicationUniversalIdentifier but it's the main topic of this PR
};
```

## Low level maps tools
Had to refactor find | create | delete | replace | find-many | get-sub
tools ( through mutations and or throw equivalent )
This commit is contained in:
Paul Rastoin
2026-02-03 17:16:02 +01:00
committed by GitHub
parent 43042d55b2
commit 476bdf764c
202 changed files with 1853 additions and 909 deletions
@@ -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;
}
}
@@ -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');
@@ -81,7 +81,7 @@ export class TwentyStandardApplicationService {
);
const existingWorkspaceItems = Object.values(
existingFlatNavigationMenuItemMaps.byId,
existingFlatNavigationMenuItemMaps.byUniversalIdentifier,
).filter(
(item) =>
isDefined(item) &&
@@ -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
@@ -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": {},
},
}
`;
@@ -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: {},
});
@@ -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 =
@@ -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);
@@ -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,
};
}
@@ -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;
@@ -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>,
@@ -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);
@@ -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({
@@ -97,7 +97,7 @@ export class FlatIndexValidatorService {
}
const allExistingFlatIndex = Object.values(
optimisticFlatIndexMaps.byId,
optimisticFlatIndexMaps.byUniversalIdentifier,
).filter(isDefined);
const existingFlatIndexOnName = allExistingFlatIndex.find(
@@ -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({
@@ -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({
@@ -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;
@@ -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: {
@@ -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({
@@ -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:
@@ -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: {
@@ -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);
@@ -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({
@@ -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: {
@@ -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: {
@@ -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({
@@ -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`,
@@ -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;
};
@@ -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(
@@ -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 = ({