V2 centralize relation optimistic logic (#15552)

# Introduction
This PR aims to deprecate having to manually handle optimistic side
effect foreign key addition in the whole v2 experience.
This PR implements the strong basis + builder refactor of the optimistic
computation of a given flat entity maps with its related flat entity
maps ( runner needs a small refactor on actions type definition first )
Flat entity maps updates through mutations are now only scoped to the
generic entity builder ( very isolated )

## What's next
- Refactor actions v2 type definition to gain grain over `metadataName`
and action operation ( `create` `delete` `update` ).
from `{type: 'create_view_field'}` to `{metadataName: 'view_field',
type: 'create' }`
- Use new optimistic tool computation tools
- Only invalidate impacted flat maps cache

## New tools
Strictly dynamically typed new flat entity maps tools
- `addFlatEntityToFlatEntityAndRelatedEntityMapsThroughMutationOrThrow`
-
`deleteFlatEntityFromFlatEntityAndRelatedEntityMapsThroughMutationOrThrow`

## Unit test
Adding basic unit testing coverage to introduced tools

## `FlatEntityValidationArgs`
From 
```ts
export type FlatEntityValidationArgs<T extends AllMetadataName> = {
  flatEntityToValidate: MetadataFlatEntity<T>;
  optimisticFlatEntityMaps: MetadataFlatEntityMaps<T>;
  mutableDependencyOptimisticFlatEntityMaps: MetadataValidationRelatedFlatEntityMaps<T>;
  workspaceId: string;
  remainingFlatEntityMapsToValidate: MetadataFlatEntityMaps<T>;
  buildOptions: WorkspaceMigrationBuilderOptions;
};

```

To
```ts
export type FlatEntityValidationArgs<T extends AllMetadataName> = {
  flatEntityToValidate: MetadataFlatEntity<T>;
  optimisticFlatEntityMapsAndRelatedFlatEntityMaps: MetadataFlatEntityAndRelatedFlatEntityMapsForValidation<T>;
  workspaceId: string;
  remainingFlatEntityMapsToValidate: MetadataFlatEntityMaps<T>;
  buildOptions: WorkspaceMigrationBuilderOptions;
};

```
This commit is contained in:
Paul Rastoin
2025-11-04 12:28:28 +01:00
committed by GitHub
parent 281070423f
commit 3514054235
39 changed files with 946 additions and 807 deletions
@@ -1,9 +1,11 @@
import { Injectable } from '@nestjs/common';
import { AllMetadataName } from 'twenty-shared/metadata';
import { isDefined } from 'twenty-shared/utils';
import { createEmptyAllFlatEntityMaps } from 'src/engine/metadata-modules/flat-entity/constant/create-empty-all-flat-entity-maps.constant';
import { AllFlatEntityMaps } from 'src/engine/metadata-modules/flat-entity/types/all-flat-entity-maps.type';
import { MetadataFlatEntityAndRelatedFlatEntityMaps } from 'src/engine/metadata-modules/flat-entity/types/metadata-related-types.type';
import { createEmptyOrchestratorActionsReport } from 'src/engine/workspace-manager/workspace-migration-v2/constant/empty-orchestrator-actions-report.constant';
import { EMPTY_ORCHESTRATOR_FAILURE_REPORT } from 'src/engine/workspace-manager/workspace-migration-v2/constant/empty-orchestrator-failure-report.constant';
import {
@@ -71,6 +73,26 @@ export class WorkspaceMigrationBuildOrchestratorService {
);
}
private mergeFlatEntityMapsAndRelatedFlatEntityMapsInAllFlatEntityMapsThroughMutation<
T extends AllMetadataName,
>({
allFlatEntityMaps,
flatEntityMapsAndRelatedFlatEntityMaps,
}: {
flatEntityMapsAndRelatedFlatEntityMaps: MetadataFlatEntityAndRelatedFlatEntityMaps<T>;
allFlatEntityMaps: AllFlatEntityMaps;
}) {
const flatEntityMapsKeys = Object.keys(
flatEntityMapsAndRelatedFlatEntityMaps,
) as (keyof MetadataFlatEntityAndRelatedFlatEntityMaps<T>)[];
for (const flatEntityMapsKey of flatEntityMapsKeys) {
// @ts-expect-error TODO improve
allFlatEntityMaps[flatEntityMapsKey] =
flatEntityMapsAndRelatedFlatEntityMaps[flatEntityMapsKey];
}
}
public async buildWorkspaceMigration({
workspaceId,
buildOptions,
@@ -144,8 +166,13 @@ export class WorkspaceMigrationBuildOrchestratorService {
},
);
optimisticAllFlatEntityMaps.flatObjectMetadataMaps =
objectResult.optimisticFlatEntityMaps;
this.mergeFlatEntityMapsAndRelatedFlatEntityMapsInAllFlatEntityMapsThroughMutation(
{
allFlatEntityMaps: optimisticAllFlatEntityMaps,
flatEntityMapsAndRelatedFlatEntityMaps:
objectResult.optimisticFlatEntityMapsAndRelatedFlatEntityMaps,
},
);
if (objectResult.status === 'fail') {
orchestratorFailureReport.objectMetadata.push(...objectResult.errors);
@@ -171,10 +198,13 @@ export class WorkspaceMigrationBuildOrchestratorService {
},
);
optimisticAllFlatEntityMaps.flatFieldMetadataMaps =
fieldResult.optimisticFlatEntityMaps;
optimisticAllFlatEntityMaps.flatObjectMetadataMaps =
fieldResult.dependencyOptimisticFlatEntityMaps.flatObjectMetadataMaps;
this.mergeFlatEntityMapsAndRelatedFlatEntityMapsInAllFlatEntityMapsThroughMutation(
{
allFlatEntityMaps: optimisticAllFlatEntityMaps,
flatEntityMapsAndRelatedFlatEntityMaps:
fieldResult.optimisticFlatEntityMapsAndRelatedFlatEntityMaps,
},
);
if (fieldResult.status === 'fail') {
orchestratorFailureReport.fieldMetadata.push(...fieldResult.errors);
@@ -201,10 +231,13 @@ export class WorkspaceMigrationBuildOrchestratorService {
},
);
optimisticAllFlatEntityMaps.flatIndexMaps =
indexResult.optimisticFlatEntityMaps;
optimisticAllFlatEntityMaps.flatObjectMetadataMaps =
indexResult.dependencyOptimisticFlatEntityMaps.flatObjectMetadataMaps;
this.mergeFlatEntityMapsAndRelatedFlatEntityMapsInAllFlatEntityMapsThroughMutation(
{
allFlatEntityMaps: optimisticAllFlatEntityMaps,
flatEntityMapsAndRelatedFlatEntityMaps:
indexResult.optimisticFlatEntityMapsAndRelatedFlatEntityMaps,
},
);
if (indexResult.status === 'fail') {
orchestratorFailureReport.index.push(...indexResult.errors);
@@ -231,10 +264,13 @@ export class WorkspaceMigrationBuildOrchestratorService {
},
);
optimisticAllFlatEntityMaps.flatViewMaps =
viewResult.optimisticFlatEntityMaps;
optimisticAllFlatEntityMaps.flatObjectMetadataMaps =
viewResult.dependencyOptimisticFlatEntityMaps.flatObjectMetadataMaps;
this.mergeFlatEntityMapsAndRelatedFlatEntityMapsInAllFlatEntityMapsThroughMutation(
{
allFlatEntityMaps: optimisticAllFlatEntityMaps,
flatEntityMapsAndRelatedFlatEntityMaps:
viewResult.optimisticFlatEntityMapsAndRelatedFlatEntityMaps,
},
);
if (viewResult.status === 'fail') {
orchestratorFailureReport.view.push(...viewResult.errors);
@@ -263,12 +299,13 @@ export class WorkspaceMigrationBuildOrchestratorService {
},
);
optimisticAllFlatEntityMaps.flatViewFieldMaps =
viewFieldResult.optimisticFlatEntityMaps;
optimisticAllFlatEntityMaps.flatViewMaps =
viewFieldResult.dependencyOptimisticFlatEntityMaps.flatViewMaps;
optimisticAllFlatEntityMaps.flatFieldMetadataMaps =
viewFieldResult.dependencyOptimisticFlatEntityMaps.flatFieldMetadataMaps;
this.mergeFlatEntityMapsAndRelatedFlatEntityMapsInAllFlatEntityMapsThroughMutation(
{
allFlatEntityMaps: optimisticAllFlatEntityMaps,
flatEntityMapsAndRelatedFlatEntityMaps:
viewFieldResult.optimisticFlatEntityMapsAndRelatedFlatEntityMaps,
},
);
if (viewFieldResult.status === 'fail') {
orchestratorFailureReport.viewField.push(...viewFieldResult.errors);
@@ -295,10 +332,13 @@ export class WorkspaceMigrationBuildOrchestratorService {
},
);
optimisticAllFlatEntityMaps.flatViewFilterMaps =
viewFilterResult.optimisticFlatEntityMaps;
optimisticAllFlatEntityMaps.flatViewMaps =
viewFilterResult.dependencyOptimisticFlatEntityMaps.flatViewMaps;
this.mergeFlatEntityMapsAndRelatedFlatEntityMapsInAllFlatEntityMapsThroughMutation(
{
allFlatEntityMaps: optimisticAllFlatEntityMaps,
flatEntityMapsAndRelatedFlatEntityMaps:
viewFilterResult.optimisticFlatEntityMapsAndRelatedFlatEntityMaps,
},
);
if (viewFilterResult.status === 'fail') {
orchestratorFailureReport.viewFilter.push(...viewFilterResult.errors);
@@ -325,10 +365,13 @@ export class WorkspaceMigrationBuildOrchestratorService {
},
);
optimisticAllFlatEntityMaps.flatViewGroupMaps =
viewGroupResult.optimisticFlatEntityMaps;
optimisticAllFlatEntityMaps.flatViewMaps =
viewGroupResult.dependencyOptimisticFlatEntityMaps.flatViewMaps;
this.mergeFlatEntityMapsAndRelatedFlatEntityMapsInAllFlatEntityMapsThroughMutation(
{
allFlatEntityMaps: optimisticAllFlatEntityMaps,
flatEntityMapsAndRelatedFlatEntityMaps:
viewGroupResult.optimisticFlatEntityMapsAndRelatedFlatEntityMaps,
},
);
if (viewGroupResult.status === 'fail') {
orchestratorFailureReport.viewGroup.push(...viewGroupResult.errors);
@@ -354,8 +397,13 @@ export class WorkspaceMigrationBuildOrchestratorService {
},
);
optimisticAllFlatEntityMaps.flatServerlessFunctionMaps =
serverlessFunctionResult.optimisticFlatEntityMaps;
this.mergeFlatEntityMapsAndRelatedFlatEntityMapsInAllFlatEntityMapsThroughMutation(
{
allFlatEntityMaps: optimisticAllFlatEntityMaps,
flatEntityMapsAndRelatedFlatEntityMaps:
serverlessFunctionResult.optimisticFlatEntityMapsAndRelatedFlatEntityMaps,
},
);
if (serverlessFunctionResult.status === 'fail') {
orchestratorFailureReport.serverlessFunction.push(
@@ -387,8 +435,13 @@ export class WorkspaceMigrationBuildOrchestratorService {
},
);
optimisticAllFlatEntityMaps.flatDatabaseEventTriggerMaps =
databaseEventTriggerResult.optimisticFlatEntityMaps;
this.mergeFlatEntityMapsAndRelatedFlatEntityMapsInAllFlatEntityMapsThroughMutation(
{
allFlatEntityMaps: optimisticAllFlatEntityMaps,
flatEntityMapsAndRelatedFlatEntityMaps:
databaseEventTriggerResult.optimisticFlatEntityMapsAndRelatedFlatEntityMaps,
},
);
if (databaseEventTriggerResult.status === 'fail') {
orchestratorFailureReport.databaseEventTrigger.push(
@@ -418,8 +471,13 @@ export class WorkspaceMigrationBuildOrchestratorService {
},
);
optimisticAllFlatEntityMaps.flatCronTriggerMaps =
cronTriggerResult.optimisticFlatEntityMaps;
this.mergeFlatEntityMapsAndRelatedFlatEntityMapsInAllFlatEntityMapsThroughMutation(
{
allFlatEntityMaps: optimisticAllFlatEntityMaps,
flatEntityMapsAndRelatedFlatEntityMaps:
cronTriggerResult.optimisticFlatEntityMapsAndRelatedFlatEntityMaps,
},
);
if (cronTriggerResult.status === 'fail') {
orchestratorFailureReport.cronTrigger.push(...cronTriggerResult.errors);
@@ -446,8 +504,13 @@ export class WorkspaceMigrationBuildOrchestratorService {
},
);
optimisticAllFlatEntityMaps.flatRouteTriggerMaps =
routeTriggerResult.optimisticFlatEntityMaps;
this.mergeFlatEntityMapsAndRelatedFlatEntityMapsInAllFlatEntityMapsThroughMutation(
{
allFlatEntityMaps: optimisticAllFlatEntityMaps,
flatEntityMapsAndRelatedFlatEntityMaps:
routeTriggerResult.optimisticFlatEntityMapsAndRelatedFlatEntityMaps,
},
);
if (routeTriggerResult.status === 'fail') {
orchestratorFailureReport.routeTrigger.push(
@@ -1,11 +1,8 @@
import { Injectable } from '@nestjs/common';
import { ALL_METADATA_NAME } from 'twenty-shared/metadata';
import { isDefined } from 'twenty-shared/utils';
import { findFlatEntityByIdInFlatEntityMapsOrThrow } from 'src/engine/metadata-modules/flat-entity/utils/find-flat-entity-by-id-in-flat-entity-maps-or-throw.util';
import { findFlatEntityByIdInFlatEntityMaps } from 'src/engine/metadata-modules/flat-entity/utils/find-flat-entity-by-id-in-flat-entity-maps.util';
import { replaceFlatEntityInFlatEntityMapsThroughMutationOrThrow } from 'src/engine/workspace-manager/workspace-migration-v2/utils/replace-flat-entity-in-flat-entity-maps-through-mutation-or-throw.util';
import { UpdateFieldAction } from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-builder-v2/builders/field/types/workspace-migration-field-action-v2';
import { WorkspaceEntityMigrationBuilderV2Service } from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-builder-v2/services/workspace-entity-migration-builder-v2.service';
import { FlatEntityUpdateValidationArgs } from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-builder-v2/types/flat-entity-update-validation-args.type';
@@ -43,28 +40,7 @@ export class WorkspaceMigrationV2FieldActionsBuilderService extends WorkspaceEnt
};
}
const {
flatEntityToValidate: flatFieldMetadataToValidate,
mutableDependencyOptimisticFlatEntityMaps,
} = args;
const flatObjectMetadata = findFlatEntityByIdInFlatEntityMapsOrThrow({
flatEntityId: flatFieldMetadataToValidate.objectMetadataId,
flatEntityMaps:
mutableDependencyOptimisticFlatEntityMaps.flatObjectMetadataMaps,
});
replaceFlatEntityInFlatEntityMapsThroughMutationOrThrow({
flatEntity: {
...flatObjectMetadata,
fieldMetadataIds: [
...flatObjectMetadata.fieldMetadataIds,
flatFieldMetadataToValidate.id,
],
},
flatEntityMapsToMutate:
mutableDependencyOptimisticFlatEntityMaps.flatObjectMetadataMaps,
});
const { flatEntityToValidate: flatFieldMetadataToValidate } = args;
return {
status: 'success',
@@ -94,29 +70,7 @@ export class WorkspaceMigrationV2FieldActionsBuilderService extends WorkspaceEnt
};
}
const {
flatEntityToValidate: flatFieldMetadataToValidate,
mutableDependencyOptimisticFlatEntityMaps,
} = args;
const flatObjectMetadata = findFlatEntityByIdInFlatEntityMaps({
flatEntityId: flatFieldMetadataToValidate.objectMetadataId,
flatEntityMaps:
mutableDependencyOptimisticFlatEntityMaps.flatObjectMetadataMaps,
});
if (isDefined(flatObjectMetadata)) {
replaceFlatEntityInFlatEntityMapsThroughMutationOrThrow({
flatEntity: {
...flatObjectMetadata,
fieldMetadataIds: flatObjectMetadata.fieldMetadataIds.filter(
(id) => id !== flatFieldMetadataToValidate.id,
),
},
flatEntityMapsToMutate:
mutableDependencyOptimisticFlatEntityMaps.flatObjectMetadataMaps,
});
}
const { flatEntityToValidate: flatFieldMetadataToValidate } = args;
return {
status: 'success',
@@ -150,11 +104,16 @@ export class WorkspaceMigrationV2FieldActionsBuilderService extends WorkspaceEnt
};
}
const { flatEntityId, flatEntityUpdates, optimisticFlatEntityMaps } = args;
const {
flatEntityId,
flatEntityUpdates,
optimisticFlatEntityMapsAndRelatedFlatEntityMaps,
} = args;
const flatFieldMetadata = findFlatEntityByIdInFlatEntityMapsOrThrow({
flatEntityId: flatEntityId,
flatEntityMaps: optimisticFlatEntityMaps,
flatEntityMaps:
optimisticFlatEntityMapsAndRelatedFlatEntityMaps.flatFieldMetadataMaps,
});
const updateFieldAction: UpdateFieldAction = {
@@ -6,10 +6,8 @@ import { isDefined } from 'twenty-shared/utils';
import { createEmptyFlatEntityMaps } from 'src/engine/metadata-modules/flat-entity/constant/create-empty-flat-entity-maps.constant';
import { FlatEntityMapsExceptionCode } from 'src/engine/metadata-modules/flat-entity/exceptions/flat-entity-maps.exception';
import { findFlatEntityByIdInFlatEntityMapsOrThrow } from 'src/engine/metadata-modules/flat-entity/utils/find-flat-entity-by-id-in-flat-entity-maps-or-throw.util';
import { findFlatEntityByIdInFlatEntityMaps } from 'src/engine/metadata-modules/flat-entity/utils/find-flat-entity-by-id-in-flat-entity-maps.util';
import { deleteFlatEntityFromFlatEntityMapsThroughMutationOrThrow } from 'src/engine/workspace-manager/workspace-migration-v2/utils/delete-flat-entity-from-flat-entity-maps-through-mutation-or-throw.util';
import { replaceFlatEntityInFlatEntityMapsThroughMutationOrThrow } from 'src/engine/workspace-manager/workspace-migration-v2/utils/replace-flat-entity-in-flat-entity-maps-through-mutation-or-throw.util';
import { WorkspaceEntityMigrationBuilderV2Service } from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-builder-v2/services/workspace-entity-migration-builder-v2.service';
import { FlatEntityUpdateValidationArgs } from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-builder-v2/types/flat-entity-update-validation-args.type';
import { FlatEntityValidationArgs } from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-builder-v2/types/flat-entity-validation-args.type';
@@ -42,28 +40,7 @@ export class WorkspaceMigrationV2IndexActionsBuilderService extends WorkspaceEnt
};
}
const {
flatEntityToValidate: flatIndexToValidate,
mutableDependencyOptimisticFlatEntityMaps,
} = args;
const flatObjectMetadata = findFlatEntityByIdInFlatEntityMapsOrThrow({
flatEntityId: flatIndexToValidate.objectMetadataId,
flatEntityMaps:
mutableDependencyOptimisticFlatEntityMaps.flatObjectMetadataMaps,
});
replaceFlatEntityInFlatEntityMapsThroughMutationOrThrow({
flatEntity: {
...flatObjectMetadata,
indexMetadataIds: [
...flatObjectMetadata.indexMetadataIds,
flatIndexToValidate.id,
],
},
flatEntityMapsToMutate:
mutableDependencyOptimisticFlatEntityMaps.flatObjectMetadataMaps,
});
const { flatEntityToValidate: flatIndexToValidate } = args;
return {
status: 'success',
@@ -89,29 +66,7 @@ export class WorkspaceMigrationV2IndexActionsBuilderService extends WorkspaceEnt
};
}
const {
flatEntityToValidate: flatIndexToValidate,
mutableDependencyOptimisticFlatEntityMaps,
} = args;
const flatObjectMetadata = findFlatEntityByIdInFlatEntityMaps({
flatEntityId: flatIndexToValidate.objectMetadataId,
flatEntityMaps:
mutableDependencyOptimisticFlatEntityMaps.flatObjectMetadataMaps,
});
if (isDefined(flatObjectMetadata)) {
replaceFlatEntityInFlatEntityMapsThroughMutationOrThrow({
flatEntity: {
...flatObjectMetadata,
indexMetadataIds: flatObjectMetadata.indexMetadataIds.filter(
(id) => id !== flatIndexToValidate.id,
),
},
flatEntityMapsToMutate:
mutableDependencyOptimisticFlatEntityMaps.flatObjectMetadataMaps,
});
}
const { flatEntityToValidate: flatIndexToValidate } = args;
return {
status: 'success',
@@ -123,10 +78,9 @@ export class WorkspaceMigrationV2IndexActionsBuilderService extends WorkspaceEnt
}
protected async validateFlatEntityUpdate({
optimisticFlatEntityMapsAndRelatedFlatEntityMaps,
flatEntityId,
flatEntityUpdates,
optimisticFlatEntityMaps: optimisticFlatIndexMaps,
mutableDependencyOptimisticFlatEntityMaps,
buildOptions,
workspaceId,
}: FlatEntityUpdateValidationArgs<typeof ALL_METADATA_NAME.index>): Promise<
@@ -134,7 +88,8 @@ export class WorkspaceMigrationV2IndexActionsBuilderService extends WorkspaceEnt
> {
const flatEntity = findFlatEntityByIdInFlatEntityMaps({
flatEntityId,
flatEntityMaps: optimisticFlatIndexMaps,
flatEntityMaps:
optimisticFlatEntityMapsAndRelatedFlatEntityMaps.flatIndexMaps,
});
if (!isDefined(flatEntity)) {
@@ -153,8 +108,7 @@ export class WorkspaceMigrationV2IndexActionsBuilderService extends WorkspaceEnt
const deletionValidationResult =
this.flatIndexValidatorService.validateFlatIndexDeletion({
buildOptions,
mutableDependencyOptimisticFlatEntityMaps,
optimisticFlatEntityMaps: optimisticFlatIndexMaps,
optimisticFlatEntityMapsAndRelatedFlatEntityMaps,
workspaceId,
flatEntityToValidate: flatEntity,
remainingFlatEntityMapsToValidate: createEmptyFlatEntityMaps(),
@@ -175,7 +129,7 @@ export class WorkspaceMigrationV2IndexActionsBuilderService extends WorkspaceEnt
};
const tempOptimisticFlatIndexMaps = structuredClone(
optimisticFlatIndexMaps,
optimisticFlatEntityMapsAndRelatedFlatEntityMaps.flatIndexMaps,
);
deleteFlatEntityFromFlatEntityMapsThroughMutationOrThrow({
@@ -186,10 +140,12 @@ export class WorkspaceMigrationV2IndexActionsBuilderService extends WorkspaceEnt
const creationValidationResult =
this.flatIndexValidatorService.validateFlatIndexCreation({
buildOptions,
mutableDependencyOptimisticFlatEntityMaps,
workspaceId,
flatEntityToValidate: updatedFlatIndex,
optimisticFlatEntityMaps: tempOptimisticFlatIndexMaps,
optimisticFlatEntityMapsAndRelatedFlatEntityMaps: {
...optimisticFlatEntityMapsAndRelatedFlatEntityMaps,
flatIndexMaps: tempOptimisticFlatIndexMaps,
},
remainingFlatEntityMapsToValidate: createEmptyFlatEntityMaps(),
});
@@ -1,11 +1,7 @@
import { Injectable } from '@nestjs/common';
import { ALL_METADATA_NAME } from 'twenty-shared/metadata';
import { isDefined } from 'twenty-shared/utils';
import { findFlatEntityByIdInFlatEntityMapsOrThrow } from 'src/engine/metadata-modules/flat-entity/utils/find-flat-entity-by-id-in-flat-entity-maps-or-throw.util';
import { findFlatEntityByIdInFlatEntityMaps } from 'src/engine/metadata-modules/flat-entity/utils/find-flat-entity-by-id-in-flat-entity-maps.util';
import { replaceFlatEntityInFlatEntityMapsThroughMutationOrThrow } from 'src/engine/workspace-manager/workspace-migration-v2/utils/replace-flat-entity-in-flat-entity-maps-through-mutation-or-throw.util';
import { UpdateViewFieldAction } from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-builder-v2/builders/view-field/types/workspace-migration-view-field-action-v2.type';
import { WorkspaceEntityMigrationBuilderV2Service } from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-builder-v2/services/workspace-entity-migration-builder-v2.service';
import { FlatEntityUpdateValidationArgs } from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-builder-v2/types/flat-entity-update-validation-args.type';
@@ -41,48 +37,11 @@ export class WorkspaceMigrationV2ViewFieldActionsBuilderService extends Workspac
};
}
const {
flatEntityToValidate: flatViewFieldToValidate,
mutableDependencyOptimisticFlatEntityMaps,
} = args;
const flatFieldMetadata = findFlatEntityByIdInFlatEntityMapsOrThrow({
flatEntityId: flatViewFieldToValidate.fieldMetadataId,
flatEntityMaps:
mutableDependencyOptimisticFlatEntityMaps.flatFieldMetadataMaps,
});
replaceFlatEntityInFlatEntityMapsThroughMutationOrThrow({
flatEntity: {
...flatFieldMetadata,
viewFieldIds: [
...flatFieldMetadata.viewFieldIds,
flatViewFieldToValidate.id,
],
},
flatEntityMapsToMutate:
mutableDependencyOptimisticFlatEntityMaps.flatFieldMetadataMaps,
});
const flatView = findFlatEntityByIdInFlatEntityMapsOrThrow({
flatEntityId: flatViewFieldToValidate.viewId,
flatEntityMaps: mutableDependencyOptimisticFlatEntityMaps.flatViewMaps,
});
replaceFlatEntityInFlatEntityMapsThroughMutationOrThrow({
flatEntity: {
...flatView,
viewFieldIds: [...flatView.viewFieldIds, flatViewFieldToValidate.id],
},
flatEntityMapsToMutate:
mutableDependencyOptimisticFlatEntityMaps.flatViewMaps,
});
return {
status: 'success',
action: {
type: 'create_view_field',
viewField: flatViewFieldToValidate,
viewField: args.flatEntityToValidate,
},
};
}
@@ -105,47 +64,7 @@ export class WorkspaceMigrationV2ViewFieldActionsBuilderService extends Workspac
};
}
const {
flatEntityToValidate: flatViewFieldToValidate,
mutableDependencyOptimisticFlatEntityMaps,
} = args;
const flatFieldMetadata = findFlatEntityByIdInFlatEntityMaps({
flatEntityId: flatViewFieldToValidate.fieldMetadataId,
flatEntityMaps:
mutableDependencyOptimisticFlatEntityMaps.flatFieldMetadataMaps,
});
if (isDefined(flatFieldMetadata)) {
replaceFlatEntityInFlatEntityMapsThroughMutationOrThrow({
flatEntity: {
...flatFieldMetadata,
viewFieldIds: flatFieldMetadata.viewFieldIds.filter(
(id) => id !== flatViewFieldToValidate.id,
),
},
flatEntityMapsToMutate:
mutableDependencyOptimisticFlatEntityMaps.flatFieldMetadataMaps,
});
}
const flatView = findFlatEntityByIdInFlatEntityMaps({
flatEntityId: flatViewFieldToValidate.viewId,
flatEntityMaps: mutableDependencyOptimisticFlatEntityMaps.flatViewMaps,
});
if (isDefined(flatView)) {
replaceFlatEntityInFlatEntityMapsThroughMutationOrThrow({
flatEntity: {
...flatView,
viewFieldIds: flatView.viewFieldIds.filter(
(id) => id !== flatViewFieldToValidate.id,
),
},
flatEntityMapsToMutate:
mutableDependencyOptimisticFlatEntityMaps.flatViewMaps,
});
}
const { flatEntityToValidate: flatViewFieldToValidate } = args;
return {
status: 'success',
@@ -1,11 +1,7 @@
import { Injectable } from '@nestjs/common';
import { ALL_METADATA_NAME } from 'twenty-shared/metadata';
import { isDefined } from 'twenty-shared/utils';
import { findFlatEntityByIdInFlatEntityMapsOrThrow } from 'src/engine/metadata-modules/flat-entity/utils/find-flat-entity-by-id-in-flat-entity-maps-or-throw.util';
import { findFlatEntityByIdInFlatEntityMaps } from 'src/engine/metadata-modules/flat-entity/utils/find-flat-entity-by-id-in-flat-entity-maps.util';
import { replaceFlatEntityInFlatEntityMapsThroughMutationOrThrow } from 'src/engine/workspace-manager/workspace-migration-v2/utils/replace-flat-entity-in-flat-entity-maps-through-mutation-or-throw.util';
import { UpdateViewFilterAction } from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-builder-v2/builders/view-filter/types/workspace-migration-view-filter-action-v2.type';
import { WorkspaceEntityMigrationBuilderV2Service } from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-builder-v2/services/workspace-entity-migration-builder-v2.service';
import { FlatEntityUpdateValidationArgs } from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-builder-v2/types/flat-entity-update-validation-args.type';
@@ -41,42 +37,7 @@ export class WorkspaceMigrationV2ViewFilterActionsBuilderService extends Workspa
};
}
const {
flatEntityToValidate: flatViewFilterToValidate,
mutableDependencyOptimisticFlatEntityMaps,
} = args;
const flatView = findFlatEntityByIdInFlatEntityMapsOrThrow({
flatEntityId: flatViewFilterToValidate.viewId,
flatEntityMaps: mutableDependencyOptimisticFlatEntityMaps.flatViewMaps,
});
replaceFlatEntityInFlatEntityMapsThroughMutationOrThrow({
flatEntity: {
...flatView,
viewFilterIds: [...flatView.viewFilterIds, flatViewFilterToValidate.id],
},
flatEntityMapsToMutate:
mutableDependencyOptimisticFlatEntityMaps.flatViewMaps,
});
const flatFieldMetadata = findFlatEntityByIdInFlatEntityMapsOrThrow({
flatEntityId: flatViewFilterToValidate.fieldMetadataId,
flatEntityMaps:
mutableDependencyOptimisticFlatEntityMaps.flatFieldMetadataMaps,
});
replaceFlatEntityInFlatEntityMapsThroughMutationOrThrow({
flatEntity: {
...flatFieldMetadata,
viewFilterIds: [
...flatFieldMetadata.viewFilterIds,
flatViewFilterToValidate.id,
],
},
flatEntityMapsToMutate:
mutableDependencyOptimisticFlatEntityMaps.flatFieldMetadataMaps,
});
const { flatEntityToValidate: flatViewFilterToValidate } = args;
return {
status: 'success',
@@ -105,28 +66,7 @@ export class WorkspaceMigrationV2ViewFilterActionsBuilderService extends Workspa
};
}
const {
flatEntityToValidate: flatViewFilterToValidate,
mutableDependencyOptimisticFlatEntityMaps,
} = args;
const flatView = findFlatEntityByIdInFlatEntityMaps({
flatEntityId: flatViewFilterToValidate.viewId,
flatEntityMaps: mutableDependencyOptimisticFlatEntityMaps.flatViewMaps,
});
if (isDefined(flatView)) {
replaceFlatEntityInFlatEntityMapsThroughMutationOrThrow({
flatEntity: {
...flatView,
viewFilterIds: flatView.viewFilterIds.filter(
(id) => id !== flatViewFilterToValidate.id,
),
},
flatEntityMapsToMutate:
mutableDependencyOptimisticFlatEntityMaps.flatViewMaps,
});
}
const { flatEntityToValidate: flatViewFilterToValidate } = args;
return {
status: 'success',
@@ -1,11 +1,7 @@
import { Injectable } from '@nestjs/common';
import { ALL_METADATA_NAME } from 'twenty-shared/metadata';
import { isDefined } from 'twenty-shared/utils';
import { findFlatEntityByIdInFlatEntityMapsOrThrow } from 'src/engine/metadata-modules/flat-entity/utils/find-flat-entity-by-id-in-flat-entity-maps-or-throw.util';
import { findFlatEntityByIdInFlatEntityMaps } from 'src/engine/metadata-modules/flat-entity/utils/find-flat-entity-by-id-in-flat-entity-maps.util';
import { replaceFlatEntityInFlatEntityMapsThroughMutationOrThrow } from 'src/engine/workspace-manager/workspace-migration-v2/utils/replace-flat-entity-in-flat-entity-maps-through-mutation-or-throw.util';
import { UpdateViewGroupAction } from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-builder-v2/builders/view-group/types/workspace-migration-view-group-action-v2.type';
import { WorkspaceEntityMigrationBuilderV2Service } from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-builder-v2/services/workspace-entity-migration-builder-v2.service';
import { FlatEntityUpdateValidationArgs } from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-builder-v2/types/flat-entity-update-validation-args.type';
@@ -41,42 +37,7 @@ export class WorkspaceMigrationV2ViewGroupActionsBuilderService extends Workspac
};
}
const {
flatEntityToValidate: flatViewGroupToValidate,
mutableDependencyOptimisticFlatEntityMaps,
} = args;
const flatView = findFlatEntityByIdInFlatEntityMapsOrThrow({
flatEntityId: flatViewGroupToValidate.viewId,
flatEntityMaps: mutableDependencyOptimisticFlatEntityMaps.flatViewMaps,
});
replaceFlatEntityInFlatEntityMapsThroughMutationOrThrow({
flatEntity: {
...flatView,
viewGroupIds: [...flatView.viewGroupIds, flatViewGroupToValidate.id],
},
flatEntityMapsToMutate:
mutableDependencyOptimisticFlatEntityMaps.flatViewMaps,
});
const flatFieldMetadata = findFlatEntityByIdInFlatEntityMapsOrThrow({
flatEntityId: flatViewGroupToValidate.fieldMetadataId,
flatEntityMaps:
mutableDependencyOptimisticFlatEntityMaps.flatFieldMetadataMaps,
});
replaceFlatEntityInFlatEntityMapsThroughMutationOrThrow({
flatEntity: {
...flatFieldMetadata,
viewGroupIds: [
...flatFieldMetadata.viewGroupIds,
flatViewGroupToValidate.id,
],
},
flatEntityMapsToMutate:
mutableDependencyOptimisticFlatEntityMaps.flatFieldMetadataMaps,
});
const { flatEntityToValidate: flatViewGroupToValidate } = args;
return {
status: 'success',
@@ -105,47 +66,7 @@ export class WorkspaceMigrationV2ViewGroupActionsBuilderService extends Workspac
};
}
const {
flatEntityToValidate: flatViewGroupToValidate,
mutableDependencyOptimisticFlatEntityMaps,
} = args;
const flatView = findFlatEntityByIdInFlatEntityMaps({
flatEntityId: flatViewGroupToValidate.viewId,
flatEntityMaps: mutableDependencyOptimisticFlatEntityMaps.flatViewMaps,
});
if (isDefined(flatView)) {
replaceFlatEntityInFlatEntityMapsThroughMutationOrThrow({
flatEntity: {
...flatView,
viewGroupIds: flatView.viewGroupIds.filter(
(id) => id !== flatViewGroupToValidate.id,
),
},
flatEntityMapsToMutate:
mutableDependencyOptimisticFlatEntityMaps.flatViewMaps,
});
}
const flatFieldMetadata = findFlatEntityByIdInFlatEntityMaps({
flatEntityId: flatViewGroupToValidate.fieldMetadataId,
flatEntityMaps:
mutableDependencyOptimisticFlatEntityMaps.flatFieldMetadataMaps,
});
if (isDefined(flatFieldMetadata)) {
replaceFlatEntityInFlatEntityMapsThroughMutationOrThrow({
flatEntity: {
...flatFieldMetadata,
viewGroupIds: flatFieldMetadata.viewGroupIds.filter(
(id) => id !== flatViewGroupToValidate.id,
),
},
flatEntityMapsToMutate:
mutableDependencyOptimisticFlatEntityMaps.flatFieldMetadataMaps,
});
}
const { flatEntityToValidate: flatViewGroupToValidate } = args;
return {
status: 'success',
@@ -1,11 +1,7 @@
import { Injectable } from '@nestjs/common';
import { ALL_METADATA_NAME } from 'twenty-shared/metadata';
import { isDefined } from 'twenty-shared/utils';
import { findFlatEntityByIdInFlatEntityMapsOrThrow } from 'src/engine/metadata-modules/flat-entity/utils/find-flat-entity-by-id-in-flat-entity-maps-or-throw.util';
import { findFlatEntityByIdInFlatEntityMaps } from 'src/engine/metadata-modules/flat-entity/utils/find-flat-entity-by-id-in-flat-entity-maps.util';
import { replaceFlatEntityInFlatEntityMapsThroughMutationOrThrow } from 'src/engine/workspace-manager/workspace-migration-v2/utils/replace-flat-entity-in-flat-entity-maps-through-mutation-or-throw.util';
import { UpdateViewAction } from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-builder-v2/builders/view/types/workspace-migration-view-action-v2.type';
import { WorkspaceEntityMigrationBuilderV2Service } from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-builder-v2/services/workspace-entity-migration-builder-v2.service';
import { FlatEntityUpdateValidationArgs } from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-builder-v2/types/flat-entity-update-validation-args.type';
@@ -38,74 +34,7 @@ export class WorkspaceMigrationV2ViewActionsBuilderService extends WorkspaceEnti
};
}
const {
flatEntityToValidate: flatViewToValidate,
mutableDependencyOptimisticFlatEntityMaps,
} = args;
const flatObjectMetadata = findFlatEntityByIdInFlatEntityMapsOrThrow({
flatEntityId: flatViewToValidate.objectMetadataId,
flatEntityMaps:
mutableDependencyOptimisticFlatEntityMaps.flatObjectMetadataMaps,
});
replaceFlatEntityInFlatEntityMapsThroughMutationOrThrow({
flatEntity: {
...flatObjectMetadata,
viewIds: [...flatObjectMetadata.viewIds, flatViewToValidate.id],
},
flatEntityMapsToMutate:
mutableDependencyOptimisticFlatEntityMaps.flatObjectMetadataMaps,
});
const kanbanFieldMetadata = isDefined(
flatViewToValidate.kanbanAggregateOperationFieldMetadataId,
)
? findFlatEntityByIdInFlatEntityMapsOrThrow({
flatEntityId:
flatViewToValidate.kanbanAggregateOperationFieldMetadataId,
flatEntityMaps:
mutableDependencyOptimisticFlatEntityMaps.flatFieldMetadataMaps,
})
: undefined;
if (isDefined(kanbanFieldMetadata)) {
replaceFlatEntityInFlatEntityMapsThroughMutationOrThrow({
flatEntity: {
...kanbanFieldMetadata,
kanbanAggregateOperationViewIds: [
...kanbanFieldMetadata.kanbanAggregateOperationViewIds,
flatViewToValidate.id,
],
},
flatEntityMapsToMutate:
mutableDependencyOptimisticFlatEntityMaps.flatFieldMetadataMaps,
});
}
const calendarFieldMetadata = isDefined(
flatViewToValidate.calendarFieldMetadataId,
)
? findFlatEntityByIdInFlatEntityMapsOrThrow({
flatEntityId: flatViewToValidate.calendarFieldMetadataId,
flatEntityMaps:
mutableDependencyOptimisticFlatEntityMaps.flatFieldMetadataMaps,
})
: undefined;
if (isDefined(calendarFieldMetadata)) {
replaceFlatEntityInFlatEntityMapsThroughMutationOrThrow({
flatEntity: {
...calendarFieldMetadata,
calendarViewIds: [
...calendarFieldMetadata.calendarViewIds,
flatViewToValidate.id,
],
},
flatEntityMapsToMutate:
mutableDependencyOptimisticFlatEntityMaps.flatFieldMetadataMaps,
});
}
const { flatEntityToValidate: flatViewToValidate } = args;
return {
status: 'success',
@@ -131,77 +60,7 @@ export class WorkspaceMigrationV2ViewActionsBuilderService extends WorkspaceEnti
};
}
const {
flatEntityToValidate: flatViewToValidate,
mutableDependencyOptimisticFlatEntityMaps,
} = args;
const flatObjectMetadata = findFlatEntityByIdInFlatEntityMaps({
flatEntityId: flatViewToValidate.objectMetadataId,
flatEntityMaps:
mutableDependencyOptimisticFlatEntityMaps.flatObjectMetadataMaps,
});
if (isDefined(flatObjectMetadata)) {
replaceFlatEntityInFlatEntityMapsThroughMutationOrThrow({
flatEntity: {
...flatObjectMetadata,
viewIds: flatObjectMetadata.viewIds.filter(
(id) => id !== flatViewToValidate.id,
),
},
flatEntityMapsToMutate:
mutableDependencyOptimisticFlatEntityMaps.flatObjectMetadataMaps,
});
}
const kanbanFieldMetadata = isDefined(
flatViewToValidate.kanbanAggregateOperationFieldMetadataId,
)
? findFlatEntityByIdInFlatEntityMaps({
flatEntityId:
flatViewToValidate.kanbanAggregateOperationFieldMetadataId,
flatEntityMaps:
mutableDependencyOptimisticFlatEntityMaps.flatFieldMetadataMaps,
})
: undefined;
if (isDefined(kanbanFieldMetadata)) {
replaceFlatEntityInFlatEntityMapsThroughMutationOrThrow({
flatEntity: {
...kanbanFieldMetadata,
kanbanAggregateOperationViewIds:
kanbanFieldMetadata.kanbanAggregateOperationViewIds.filter(
(id) => id !== flatViewToValidate.id,
),
},
flatEntityMapsToMutate:
mutableDependencyOptimisticFlatEntityMaps.flatFieldMetadataMaps,
});
}
const calendarFieldMetadata = isDefined(
flatViewToValidate.calendarFieldMetadataId,
)
? findFlatEntityByIdInFlatEntityMaps({
flatEntityId: flatViewToValidate.calendarFieldMetadataId,
flatEntityMaps:
mutableDependencyOptimisticFlatEntityMaps.flatFieldMetadataMaps,
})
: undefined;
if (isDefined(calendarFieldMetadata)) {
replaceFlatEntityInFlatEntityMapsThroughMutationOrThrow({
flatEntity: {
...calendarFieldMetadata,
calendarViewIds: calendarFieldMetadata.calendarViewIds.filter(
(id) => id !== flatViewToValidate.id,
),
},
flatEntityMapsToMutate:
mutableDependencyOptimisticFlatEntityMaps.flatFieldMetadataMaps,
});
}
const { flatEntityToValidate: flatViewToValidate } = args;
return {
status: 'success',
@@ -9,10 +9,13 @@ import {
FlatEntityMapsException,
FlatEntityMapsExceptionCode,
} from 'src/engine/metadata-modules/flat-entity/exceptions/flat-entity-maps.exception';
import { MetadataFlatEntityAndRelatedFlatEntityMapsForValidation } from 'src/engine/metadata-modules/flat-entity/types/metadata-flat-entity-and-related-flat-entity-maps-for-validation.type';
import { MetadataFlatEntityMaps } from 'src/engine/metadata-modules/flat-entity/types/metadata-flat-entity-maps.type';
import { MetadataValidationRelatedFlatEntityMaps } from 'src/engine/metadata-modules/flat-entity/types/metadata-related-types.type';
import { addFlatEntityToFlatEntityAndRelatedEntityMapsThroughMutationOrThrow } from 'src/engine/metadata-modules/flat-entity/utils/add-flat-entity-to-flat-entity-and-related-entity-maps-through-mutation-or-throw.util';
import { 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 { addFlatEntityToFlatEntityMapsThroughMutationOrThrow } from 'src/engine/workspace-manager/workspace-migration-v2/utils/add-flat-entity-to-flat-entity-maps-through-mutation-or-throw.util';
import { getMetadataFlatEntityMapsKey } from 'src/engine/metadata-modules/flat-entity/utils/get-metadata-flat-entity-maps-key.util';
import { deleteFlatEntityFromFlatEntityMapsThroughMutationOrThrow } from 'src/engine/workspace-manager/workspace-migration-v2/utils/delete-flat-entity-from-flat-entity-maps-through-mutation-or-throw.util';
import { flatEntityDeletedCreatedUpdatedMatrixDispatcher } from 'src/engine/workspace-manager/workspace-migration-v2/utils/flat-entity-deleted-created-updated-matrix-dispatcher.util';
import { getMetadataEmptyWorkspaceMigrationActionRecord } from 'src/engine/workspace-manager/workspace-migration-v2/utils/get-metadata-empty-workspace-migration-action-record.util';
@@ -53,10 +56,6 @@ export abstract class WorkspaceEntityMigrationBuilderV2Service<
to: toFlatEntityMaps,
workspaceId,
}: ValidateAndBuildArgs<T>): Promise<ValidateAndBuildReturnType<T>> {
const mutableDependencyOptimisticFlatEntityMaps = structuredClone(
inputDependencyOptimisticFlatEntityMaps,
);
this.logger.time(`EntityBuilder ${this.metadataName}`, 'validateAndBuild');
this.logger.time(
`EntityBuilder ${this.metadataName}`,
@@ -87,7 +86,12 @@ export abstract class WorkspaceEntityMigrationBuilderV2Service<
);
this.logger.time(`EntityBuilder ${this.metadataName}`, 'entity processing');
const optimisticFlatEntityMaps = structuredClone(fromFlatEntityMaps);
const flatEntityMapsKey = getMetadataFlatEntityMapsKey(this.metadataName);
const optimisticFlatEntityMapsAndRelatedFlatEntityMaps = {
[flatEntityMapsKey]: structuredClone(fromFlatEntityMaps),
...structuredClone(inputDependencyOptimisticFlatEntityMaps),
} as MetadataFlatEntityAndRelatedFlatEntityMapsForValidation<T>;
const actionsResult = getMetadataEmptyWorkspaceMigrationActionRecord(
this.metadataName,
);
@@ -118,10 +122,9 @@ export abstract class WorkspaceEntityMigrationBuilderV2Service<
});
const validationResult = await this.validateFlatEntityCreation({
mutableDependencyOptimisticFlatEntityMaps,
flatEntityToValidate: flatEntityToCreate,
optimisticFlatEntityMaps,
workspaceId,
optimisticFlatEntityMapsAndRelatedFlatEntityMaps,
remainingFlatEntityMapsToValidate: remainingFlatEntityMapsToCreate,
buildOptions,
});
@@ -131,9 +134,11 @@ export abstract class WorkspaceEntityMigrationBuilderV2Service<
continue;
}
addFlatEntityToFlatEntityMapsThroughMutationOrThrow({
addFlatEntityToFlatEntityAndRelatedEntityMapsThroughMutationOrThrow({
flatEntity: flatEntityToCreate,
flatEntityMapsToMutate: optimisticFlatEntityMaps,
flatEntityAndRelatedMapsToMutate:
optimisticFlatEntityMapsAndRelatedFlatEntityMaps,
metadataName: this.metadataName,
});
actionsResult.created.push(
@@ -176,12 +181,11 @@ export abstract class WorkspaceEntityMigrationBuilderV2Service<
});
const validationResult = await this.validateFlatEntityDeletion({
mutableDependencyOptimisticFlatEntityMaps,
flatEntityToValidate: flatEntityToDelete,
optimisticFlatEntityMaps: optimisticFlatEntityMaps,
workspaceId,
remainingFlatEntityMapsToValidate: remainingFlatEntityMapsToDelete,
buildOptions,
optimisticFlatEntityMapsAndRelatedFlatEntityMaps,
});
if (validationResult.status === 'fail') {
@@ -189,9 +193,11 @@ export abstract class WorkspaceEntityMigrationBuilderV2Service<
continue;
}
deleteFlatEntityFromFlatEntityMapsThroughMutationOrThrow({
entityToDeleteId: flatEntityToDelete.id,
flatEntityMapsToMutate: optimisticFlatEntityMaps,
deleteFlatEntityFromFlatEntityAndRelatedEntityMapsThroughMutationOrThrow({
flatEntity: flatEntityToDelete,
flatEntityAndRelatedMapsToMutate:
optimisticFlatEntityMapsAndRelatedFlatEntityMaps,
metadataName: this.metadataName,
});
actionsResult.deleted.push(
@@ -221,8 +227,7 @@ export abstract class WorkspaceEntityMigrationBuilderV2Service<
const validationResult = await this.validateFlatEntityUpdate({
flatEntityUpdates: flatEntityToUpdate.updates,
flatEntityId: flatEntityToUpdateId,
mutableDependencyOptimisticFlatEntityMaps,
optimisticFlatEntityMaps: optimisticFlatEntityMaps,
optimisticFlatEntityMapsAndRelatedFlatEntityMaps,
workspaceId,
buildOptions,
});
@@ -234,7 +239,9 @@ export abstract class WorkspaceEntityMigrationBuilderV2Service<
const existingFlatEntity = findFlatEntityByIdInFlatEntityMaps({
flatEntityId: flatEntityToUpdateId,
flatEntityMaps: optimisticFlatEntityMaps,
flatEntityMaps: optimisticFlatEntityMapsAndRelatedFlatEntityMaps[
flatEntityMapsKey
] as MetadataFlatEntityMaps<T>,
});
if (!isDefined(existingFlatEntity)) {
@@ -253,7 +260,8 @@ export abstract class WorkspaceEntityMigrationBuilderV2Service<
replaceFlatEntityInFlatEntityMapsThroughMutationOrThrow({
flatEntity: updatedFlatEntity,
flatEntityMapsToMutate: optimisticFlatEntityMaps,
flatEntityMapsToMutate:
optimisticFlatEntityMapsAndRelatedFlatEntityMaps[flatEntityMapsKey],
});
actionsResult.updated.push(
@@ -276,9 +284,7 @@ export abstract class WorkspaceEntityMigrationBuilderV2Service<
return {
status: 'fail',
errors: allValidationResult,
optimisticFlatEntityMaps,
dependencyOptimisticFlatEntityMaps:
mutableDependencyOptimisticFlatEntityMaps,
optimisticFlatEntityMapsAndRelatedFlatEntityMaps,
};
}
@@ -290,9 +296,7 @@ export abstract class WorkspaceEntityMigrationBuilderV2Service<
return {
status: 'success',
actions: actionsResult,
optimisticFlatEntityMaps,
dependencyOptimisticFlatEntityMaps:
mutableDependencyOptimisticFlatEntityMaps,
optimisticFlatEntityMapsAndRelatedFlatEntityMaps,
};
}
@@ -1,13 +1,11 @@
import { type AllMetadataName } from 'twenty-shared/metadata';
import { type MetadataFlatEntityMaps } from 'src/engine/metadata-modules/flat-entity/types/metadata-flat-entity-maps.type';
import { type MetadataFlatEntity } from 'src/engine/metadata-modules/flat-entity/types/metadata-flat-entity.type';
import { type MetadataValidationRelatedFlatEntityMaps } from 'src/engine/metadata-modules/flat-entity/types/metadata-related-types.type';
import { type MetadataFlatEntityAndRelatedFlatEntityMaps } from 'src/engine/metadata-modules/flat-entity/types/metadata-related-types.type';
import { type FailedFlatEntityValidation } from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-builder-v2/builders/types/failed-flat-entity-validation.type';
export type FailedFlatEntityValidateAndBuild<T extends AllMetadataName> = {
status: 'fail';
errors: FailedFlatEntityValidation<MetadataFlatEntity<T>>[];
optimisticFlatEntityMaps: MetadataFlatEntityMaps<T>;
dependencyOptimisticFlatEntityMaps: MetadataValidationRelatedFlatEntityMaps<T>;
optimisticFlatEntityMapsAndRelatedFlatEntityMaps: MetadataFlatEntityAndRelatedFlatEntityMaps<T>;
};
@@ -1,14 +1,13 @@
import { type AllMetadataName } from 'twenty-shared/metadata';
import { type MetadataFlatEntityAndRelatedFlatEntityMapsForValidation } from 'src/engine/metadata-modules/flat-entity/types/metadata-flat-entity-and-related-flat-entity-maps-for-validation.type';
import { type MetadataFlatEntityMaps } from 'src/engine/metadata-modules/flat-entity/types/metadata-flat-entity-maps.type';
import { type MetadataFlatEntity } from 'src/engine/metadata-modules/flat-entity/types/metadata-flat-entity.type';
import { type MetadataValidationRelatedFlatEntityMaps } from 'src/engine/metadata-modules/flat-entity/types/metadata-related-types.type';
import { type WorkspaceMigrationBuilderOptions } from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-builder-v2/types/workspace-migration-builder-options.type';
export type FlatEntityValidationArgs<T extends AllMetadataName> = {
flatEntityToValidate: MetadataFlatEntity<T>;
optimisticFlatEntityMaps: MetadataFlatEntityMaps<T>;
mutableDependencyOptimisticFlatEntityMaps: MetadataValidationRelatedFlatEntityMaps<T>;
optimisticFlatEntityMapsAndRelatedFlatEntityMaps: MetadataFlatEntityAndRelatedFlatEntityMapsForValidation<T>;
workspaceId: string;
remainingFlatEntityMapsToValidate: MetadataFlatEntityMaps<T>;
buildOptions: WorkspaceMigrationBuilderOptions;
@@ -1,12 +1,10 @@
import { type AllMetadataName } from 'twenty-shared/metadata';
import { type MetadataFlatEntityMaps } from 'src/engine/metadata-modules/flat-entity/types/metadata-flat-entity-maps.type';
import { type MetadataValidationRelatedFlatEntityMaps } from 'src/engine/metadata-modules/flat-entity/types/metadata-related-types.type';
import { type MetadataFlatEntityAndRelatedFlatEntityMaps } from 'src/engine/metadata-modules/flat-entity/types/metadata-related-types.type';
import { type MetadataWorkspaceMigrationActionsRecord } from 'src/engine/metadata-modules/flat-entity/types/metadata-workspace-migration-action.type';
export type SuccessfulFlatEntityValidateAndBuild<T extends AllMetadataName> = {
status: 'success';
actions: MetadataWorkspaceMigrationActionsRecord<T>;
optimisticFlatEntityMaps: MetadataFlatEntityMaps<T>;
dependencyOptimisticFlatEntityMaps: MetadataValidationRelatedFlatEntityMaps<T>;
optimisticFlatEntityMapsAndRelatedFlatEntityMaps: MetadataFlatEntityAndRelatedFlatEntityMaps<T>;
};
@@ -18,8 +18,10 @@ export class FlatCronTriggerValidatorService {
public validateFlatCronTriggerUpdate({
flatEntityId,
flatEntityUpdates,
optimisticFlatEntityMaps: optimisticFlatCronTriggerMaps,
mutableDependencyOptimisticFlatEntityMaps,
optimisticFlatEntityMapsAndRelatedFlatEntityMaps: {
flatCronTriggerMaps: optimisticFlatCronTriggerMaps,
flatServerlessFunctionMaps,
},
}: FlatEntityUpdateValidationArgs<
typeof ALL_METADATA_NAME.cronTrigger
>): FailedFlatEntityValidation<FlatCronTrigger> {
@@ -52,7 +54,7 @@ export class FlatCronTriggerValidatorService {
};
const serverlessFunction =
mutableDependencyOptimisticFlatEntityMaps.flatServerlessFunctionMaps.byId[
flatServerlessFunctionMaps.byId[
updatedFlatCronTrigger.serverlessFunctionId
];
@@ -69,7 +71,9 @@ export class FlatCronTriggerValidatorService {
public validateFlatCronTriggerDeletion({
flatEntityToValidate: { id: cronTriggerIdToDelete },
optimisticFlatEntityMaps: optimisticFlatCronTriggerMaps,
optimisticFlatEntityMapsAndRelatedFlatEntityMaps: {
flatCronTriggerMaps: optimisticFlatCronTriggerMaps,
},
}: FlatEntityValidationArgs<
typeof ALL_METADATA_NAME.cronTrigger
>): FailedFlatEntityValidation<FlatCronTrigger> {
@@ -97,8 +101,10 @@ export class FlatCronTriggerValidatorService {
public async validateFlatCronTriggerCreation({
flatEntityToValidate: flatCronTriggerToValidate,
optimisticFlatEntityMaps: optimisticFlatCronTriggerMaps,
mutableDependencyOptimisticFlatEntityMaps,
optimisticFlatEntityMapsAndRelatedFlatEntityMaps: {
flatCronTriggerMaps: optimisticFlatCronTriggerMaps,
flatServerlessFunctionMaps,
},
}: FlatEntityValidationArgs<typeof ALL_METADATA_NAME.cronTrigger>): Promise<
FailedFlatEntityValidation<FlatCronTrigger>
> {
@@ -123,8 +129,9 @@ export class FlatCronTriggerValidatorService {
}
const serverlessFunction =
mutableDependencyOptimisticFlatEntityMaps.flatServerlessFunctionMaps
?.byId?.[flatCronTriggerToValidate.serverlessFunctionId];
flatServerlessFunctionMaps.byId[
flatCronTriggerToValidate.serverlessFunctionId
];
if (!isDefined(serverlessFunction)) {
validationResult.errors.push({
@@ -19,8 +19,10 @@ export class FlatDatabaseEventTriggerValidatorService {
public validateFlatDatabaseEventTriggerUpdate({
flatEntityId,
flatEntityUpdates,
optimisticFlatEntityMaps: optimisticFlatDatabaseEventTriggerMaps,
mutableDependencyOptimisticFlatEntityMaps,
optimisticFlatEntityMapsAndRelatedFlatEntityMaps: {
flatDatabaseEventTriggerMaps: optimisticFlatDatabaseEventTriggerMaps,
flatServerlessFunctionMaps,
},
}: FlatEntityUpdateValidationArgs<
typeof ALL_METADATA_NAME.databaseEventTrigger
>): FailedFlatEntityValidation<FlatDatabaseEventTrigger> {
@@ -54,8 +56,9 @@ export class FlatDatabaseEventTriggerValidatorService {
};
const serverlessFunction =
mutableDependencyOptimisticFlatEntityMaps.flatServerlessFunctionMaps
?.byId?.[updatedFlatDatabaseEventTrigger.serverlessFunctionId];
flatServerlessFunctionMaps.byId[
updatedFlatDatabaseEventTrigger.serverlessFunctionId
];
if (!isDefined(serverlessFunction)) {
validationResult.errors.push({
@@ -70,7 +73,9 @@ export class FlatDatabaseEventTriggerValidatorService {
public validateFlatDatabaseEventTriggerDeletion({
flatEntityToValidate: { id: databaseEventTriggerIdToDelete },
optimisticFlatEntityMaps: optimisticFlatDatabaseEventTriggerMaps,
optimisticFlatEntityMapsAndRelatedFlatEntityMaps: {
flatDatabaseEventTriggerMaps: optimisticFlatDatabaseEventTriggerMaps,
},
}: FlatEntityValidationArgs<
typeof ALL_METADATA_NAME.databaseEventTrigger
>): FailedFlatEntityValidation<FlatDatabaseEventTrigger> {
@@ -101,8 +106,10 @@ export class FlatDatabaseEventTriggerValidatorService {
public async validateFlatDatabaseEventTriggerCreation({
flatEntityToValidate: flatDatabaseEventTriggerToValidate,
optimisticFlatEntityMaps: optimisticFlatDatabaseEventTriggerMaps,
mutableDependencyOptimisticFlatEntityMaps,
optimisticFlatEntityMapsAndRelatedFlatEntityMaps: {
flatDatabaseEventTriggerMaps: optimisticFlatDatabaseEventTriggerMaps,
flatServerlessFunctionMaps,
},
}: FlatEntityValidationArgs<
typeof ALL_METADATA_NAME.databaseEventTrigger
>): Promise<FailedFlatEntityValidation<FlatDatabaseEventTrigger>> {
@@ -130,8 +137,9 @@ export class FlatDatabaseEventTriggerValidatorService {
}
const serverlessFunction =
mutableDependencyOptimisticFlatEntityMaps.flatServerlessFunctionMaps
?.byId?.[flatDatabaseEventTriggerToValidate.serverlessFunctionId];
flatServerlessFunctionMaps?.byId?.[
flatDatabaseEventTriggerToValidate.serverlessFunctionId
];
if (!isDefined(serverlessFunction)) {
validationResult.errors.push({
@@ -30,8 +30,10 @@ export class FlatFieldMetadataValidatorService {
async validateFlatFieldMetadataUpdate({
flatEntityId,
flatEntityUpdates: updates,
optimisticFlatEntityMaps: optimisticFlatFieldMetadataMaps,
mutableDependencyOptimisticFlatEntityMaps,
optimisticFlatEntityMapsAndRelatedFlatEntityMaps: {
flatFieldMetadataMaps: optimisticFlatFieldMetadataMaps,
flatObjectMetadataMaps,
},
workspaceId,
buildOptions,
}: FlatEntityUpdateValidationArgs<
@@ -70,9 +72,7 @@ export class FlatFieldMetadataValidatorService {
};
const flatObjectMetadata =
mutableDependencyOptimisticFlatEntityMaps.flatObjectMetadataMaps.byId[
flatFieldMetadataToValidate.objectMetadataId
];
flatObjectMetadataMaps.byId[flatFieldMetadataToValidate.objectMetadataId];
if (!isDefined(flatObjectMetadata)) {
validationResult.errors.push({
@@ -152,11 +152,10 @@ export class FlatFieldMetadataValidatorService {
const fieldMetadataTypeValidationErrors =
await this.flatFieldMetadataTypeValidatorService.validateFlatFieldMetadataTypeSpecificities(
{
mutableDependencyOptimisticFlatEntityMaps: {
flatObjectMetadataMaps:
mutableDependencyOptimisticFlatEntityMaps.flatObjectMetadataMaps,
optimisticFlatEntityMapsAndRelatedFlatEntityMaps: {
flatFieldMetadataMaps: optimisticFlatFieldMetadataMaps,
flatObjectMetadataMaps,
},
optimisticFlatEntityMaps: optimisticFlatFieldMetadataMaps,
flatEntityToValidate: flatFieldMetadataToValidate,
buildOptions,
remainingFlatEntityMapsToValidate: createEmptyFlatEntityMaps(),
@@ -173,8 +172,10 @@ export class FlatFieldMetadataValidatorService {
validateFlatFieldMetadataDeletion({
flatEntityToValidate: { id: flatFieldMetadataToDeleteId },
optimisticFlatEntityMaps: optimisticFlatFieldMetadataMaps,
mutableDependencyOptimisticFlatEntityMaps,
optimisticFlatEntityMapsAndRelatedFlatEntityMaps: {
flatFieldMetadataMaps: optimisticFlatFieldMetadataMaps,
flatObjectMetadataMaps,
},
}: FlatEntityValidationArgs<
typeof ALL_METADATA_NAME.fieldMetadata
>): FailedFlatEntityValidation<FlatFieldMetadata> {
@@ -205,9 +206,7 @@ export class FlatFieldMetadataValidatorService {
};
const relatedFlatObjectMetadata =
mutableDependencyOptimisticFlatEntityMaps.flatObjectMetadataMaps.byId[
flatFieldMetadataToDelete.objectMetadataId
];
flatObjectMetadataMaps.byId[flatFieldMetadataToDelete.objectMetadataId];
if (
isDefined(relatedFlatObjectMetadata) &&
@@ -225,14 +224,12 @@ export class FlatFieldMetadataValidatorService {
const relationTargetObjectMetadataHasBeenDeleted =
isMorphOrRelationFlatFieldMetadata(flatFieldMetadataToDelete) &&
!isDefined(
mutableDependencyOptimisticFlatEntityMaps.flatObjectMetadataMaps.byId[
flatObjectMetadataMaps.byId[
flatFieldMetadataToDelete.relationTargetObjectMetadataId
],
);
const parentObjectMetadataHasBeenDeleted = !isDefined(
mutableDependencyOptimisticFlatEntityMaps.flatObjectMetadataMaps.byId[
flatFieldMetadataToDelete.objectMetadataId
],
flatObjectMetadataMaps.byId[flatFieldMetadataToDelete.objectMetadataId],
);
if (
@@ -264,8 +261,10 @@ export class FlatFieldMetadataValidatorService {
async validateFlatFieldMetadataCreation({
flatEntityToValidate: flatFieldMetadataToValidate,
optimisticFlatEntityMaps: optimisticFlatFieldMetadataMaps,
mutableDependencyOptimisticFlatEntityMaps,
optimisticFlatEntityMapsAndRelatedFlatEntityMaps: {
flatFieldMetadataMaps: optimisticFlatFieldMetadataMaps,
flatObjectMetadataMaps,
},
workspaceId,
buildOptions,
remainingFlatEntityMapsToValidate,
@@ -283,9 +282,7 @@ export class FlatFieldMetadataValidatorService {
};
const parentFlatObjectMetadata =
mutableDependencyOptimisticFlatEntityMaps.flatObjectMetadataMaps.byId[
flatFieldMetadataToValidate.objectMetadataId
];
flatObjectMetadataMaps.byId[flatFieldMetadataToValidate.objectMetadataId];
if (!isDefined(parentFlatObjectMetadata)) {
validationResult.errors.push({
@@ -343,10 +340,12 @@ export class FlatFieldMetadataValidatorService {
validationResult.errors.push(
...(await this.flatFieldMetadataTypeValidatorService.validateFlatFieldMetadataTypeSpecificities(
{
mutableDependencyOptimisticFlatEntityMaps,
optimisticFlatEntityMapsAndRelatedFlatEntityMaps: {
flatFieldMetadataMaps: optimisticFlatFieldMetadataMaps,
flatObjectMetadataMaps,
},
flatEntityToValidate: flatFieldMetadataToValidate,
buildOptions,
optimisticFlatEntityMaps: optimisticFlatFieldMetadataMaps,
workspaceId,
remainingFlatEntityMapsToValidate,
},
@@ -18,7 +18,9 @@ import { FlatEntityValidationArgs } from 'src/engine/workspace-manager/workspace
@Injectable()
export class FlatIndexValidatorService {
public validateFlatIndexDeletion({
optimisticFlatEntityMaps: optimisticFlatIndexMaps,
optimisticFlatEntityMapsAndRelatedFlatEntityMaps: {
flatIndexMaps: optimisticFlatIndexMaps,
},
flatEntityToValidate: { id: indexIdToDelete },
}: FlatEntityValidationArgs<
typeof ALL_METADATA_NAME.index
@@ -48,8 +50,11 @@ export class FlatIndexValidatorService {
public validateFlatIndexCreation({
flatEntityToValidate: flatIndexToValidate,
optimisticFlatEntityMaps: optimisticFlatIndexMaps,
mutableDependencyOptimisticFlatEntityMaps,
optimisticFlatEntityMapsAndRelatedFlatEntityMaps: {
flatIndexMaps: optimisticFlatIndexMaps,
flatObjectMetadataMaps,
flatFieldMetadataMaps,
},
}: FlatEntityValidationArgs<
typeof ALL_METADATA_NAME.index
>): FailedFlatEntityValidation<FlatIndexMetadata> {
@@ -77,8 +82,7 @@ export class FlatIndexValidatorService {
const relatedObjectMetadata = findFlatEntityByIdInFlatEntityMaps({
flatEntityId: flatIndexToValidate.objectMetadataId,
flatEntityMaps:
mutableDependencyOptimisticFlatEntityMaps.flatObjectMetadataMaps,
flatEntityMaps: flatObjectMetadataMaps,
});
if (!isDefined(relatedObjectMetadata)) {
@@ -117,8 +121,7 @@ export class FlatIndexValidatorService {
flatIndexToValidate.flatIndexFieldMetadatas.forEach((flatIndexField) => {
const relatedFlatField = findFlatEntityByIdInFlatEntityMaps({
flatEntityId: flatIndexField.fieldMetadataId,
flatEntityMaps:
mutableDependencyOptimisticFlatEntityMaps.flatFieldMetadataMaps,
flatEntityMaps: flatFieldMetadataMaps,
});
if (!isDefined(relatedFlatField)) {
@@ -19,8 +19,10 @@ export class FlatObjectMetadataValidatorService {
public validateFlatObjectMetadataUpdate({
flatEntityId,
flatEntityUpdates,
optimisticFlatEntityMaps: optimisticFlatObjectMetadataMaps,
mutableDependencyOptimisticFlatEntityMaps,
optimisticFlatEntityMapsAndRelatedFlatEntityMaps: {
flatObjectMetadataMaps: optimisticFlatObjectMetadataMaps,
flatFieldMetadataMaps,
},
}: FlatEntityUpdateValidationArgs<
typeof ALL_METADATA_NAME.objectMetadata
>): FailedFlatEntityValidation<FlatObjectMetadata> {
@@ -82,8 +84,7 @@ export class FlatObjectMetadataValidatorService {
validationResult.errors.push(
...validateFlatObjectMetadataIdentifiers({
flatObjectMetadata: updatedFlatObjectMetadata,
flatFieldMetadataMaps:
mutableDependencyOptimisticFlatEntityMaps.flatFieldMetadataMaps,
flatFieldMetadataMaps,
}),
);
}
@@ -93,7 +94,9 @@ export class FlatObjectMetadataValidatorService {
public validateFlatObjectMetadataDeletion({
flatEntityToValidate: { id: objectMetadataToDeleteId },
optimisticFlatEntityMaps: optimisticFlatObjectMetadataMaps,
optimisticFlatEntityMapsAndRelatedFlatEntityMaps: {
flatObjectMetadataMaps: optimisticFlatObjectMetadataMaps,
},
buildOptions,
}: FlatEntityValidationArgs<
typeof ALL_METADATA_NAME.objectMetadata
@@ -155,8 +158,10 @@ export class FlatObjectMetadataValidatorService {
public async validateFlatObjectMetadataCreation({
flatEntityToValidate: flatObjectMetadataToValidate,
optimisticFlatEntityMaps: optimisticFlatObjectMetadataMaps,
mutableDependencyOptimisticFlatEntityMaps,
optimisticFlatEntityMapsAndRelatedFlatEntityMaps: {
flatObjectMetadataMaps: optimisticFlatObjectMetadataMaps,
flatFieldMetadataMaps,
},
}: FlatEntityValidationArgs<
typeof ALL_METADATA_NAME.objectMetadata
>): Promise<FailedFlatEntityValidation<FlatObjectMetadata>> {
@@ -194,8 +199,7 @@ export class FlatObjectMetadataValidatorService {
objectValidationResult.errors.push(
...validateFlatObjectMetadataIdentifiers({
flatObjectMetadata: flatObjectMetadataToValidate,
flatFieldMetadataMaps:
mutableDependencyOptimisticFlatEntityMaps.flatFieldMetadataMaps,
flatFieldMetadataMaps,
}),
);
objectValidationResult.errors.push(
@@ -18,8 +18,10 @@ export class FlatRouteTriggerValidatorService {
public validateFlatRouteTriggerUpdate({
flatEntityId,
flatEntityUpdates,
optimisticFlatEntityMaps: optimisticFlatRouteTriggerMaps,
mutableDependencyOptimisticFlatEntityMaps,
optimisticFlatEntityMapsAndRelatedFlatEntityMaps: {
flatRouteTriggerMaps: optimisticFlatRouteTriggerMaps,
flatServerlessFunctionMaps,
},
}: FlatEntityUpdateValidationArgs<
typeof ALL_METADATA_NAME.routeTrigger
>): FailedFlatEntityValidation<FlatRouteTrigger> {
@@ -52,7 +54,7 @@ export class FlatRouteTriggerValidatorService {
};
const serverlessFunction =
mutableDependencyOptimisticFlatEntityMaps.flatServerlessFunctionMaps.byId[
flatServerlessFunctionMaps.byId[
updatedFlatRouteTrigger.serverlessFunctionId
];
@@ -69,7 +71,9 @@ export class FlatRouteTriggerValidatorService {
public validateFlatRouteTriggerDeletion({
flatEntityToValidate: { id: routeTriggerIdToDelete },
optimisticFlatEntityMaps: optimisticFlatRouteTriggerMaps,
optimisticFlatEntityMapsAndRelatedFlatEntityMaps: {
flatRouteTriggerMaps: optimisticFlatRouteTriggerMaps,
},
}: FlatEntityValidationArgs<
typeof ALL_METADATA_NAME.routeTrigger
>): FailedFlatEntityValidation<FlatRouteTrigger> {
@@ -97,8 +101,10 @@ export class FlatRouteTriggerValidatorService {
public async validateFlatRouteTriggerCreation({
flatEntityToValidate: flatRouteTriggerToValidate,
optimisticFlatEntityMaps: optimisticFlatRouteTriggerMaps,
mutableDependencyOptimisticFlatEntityMaps,
optimisticFlatEntityMapsAndRelatedFlatEntityMaps: {
flatRouteTriggerMaps: optimisticFlatRouteTriggerMaps,
flatServerlessFunctionMaps,
},
}: FlatEntityValidationArgs<typeof ALL_METADATA_NAME.routeTrigger>): Promise<
FailedFlatEntityValidation<FlatRouteTrigger>
> {
@@ -140,7 +146,7 @@ export class FlatRouteTriggerValidatorService {
}
const serverlessFunction =
mutableDependencyOptimisticFlatEntityMaps.flatServerlessFunctionMaps.byId[
flatServerlessFunctionMaps.byId[
flatRouteTriggerToValidate.serverlessFunctionId
];
@@ -1,8 +1,8 @@
import { Injectable } from '@nestjs/common';
import { msg, t } from '@lingui/core/macro';
import { isDefined } from 'twenty-shared/utils';
import { ALL_METADATA_NAME } from 'twenty-shared/metadata';
import { isDefined } from 'twenty-shared/utils';
import { ServerlessFunctionExceptionCode } from 'src/engine/metadata-modules/serverless-function/serverless-function.exception';
import { FlatServerlessFunction } from 'src/engine/metadata-modules/serverless-function/types/flat-serverless-function.type';
@@ -16,7 +16,9 @@ export class FlatServerlessFunctionValidatorService {
public validateFlatServerlessFunctionUpdate({
flatEntityId,
optimisticFlatEntityMaps: optimisticFlatServerlessFunctionMaps,
optimisticFlatEntityMapsAndRelatedFlatEntityMaps: {
flatServerlessFunctionMaps: optimisticFlatServerlessFunctionMaps,
},
}: FlatEntityUpdateValidationArgs<
typeof ALL_METADATA_NAME.serverlessFunction
>): FailedFlatEntityValidation<FlatServerlessFunction> {
@@ -45,7 +47,9 @@ export class FlatServerlessFunctionValidatorService {
public validateFlatServerlessFunctionDeletion({
flatEntityToValidate: { id: serverlessFunctionIdToDelete },
optimisticFlatEntityMaps: optimisticFlatServerlessFunctionMaps,
optimisticFlatEntityMapsAndRelatedFlatEntityMaps: {
flatServerlessFunctionMaps: optimisticFlatServerlessFunctionMaps,
},
}: FlatEntityValidationArgs<
typeof ALL_METADATA_NAME.serverlessFunction
>): FailedFlatEntityValidation<FlatServerlessFunction> {
@@ -74,7 +78,9 @@ export class FlatServerlessFunctionValidatorService {
public async validateFlatServerlessFunctionCreation({
flatEntityToValidate: flatServerlessFunctionToValidate,
optimisticFlatEntityMaps: optimisticFlatServerlessFunctionMaps,
optimisticFlatEntityMapsAndRelatedFlatEntityMaps: {
flatServerlessFunctionMaps: optimisticFlatServerlessFunctionMaps,
},
}: FlatEntityValidationArgs<
typeof ALL_METADATA_NAME.serverlessFunction
>): Promise<FailedFlatEntityValidation<FlatServerlessFunction>> {
@@ -22,8 +22,11 @@ export class FlatViewFieldValidatorService {
public validateFlatViewFieldUpdate({
flatEntityId,
flatEntityUpdates,
optimisticFlatEntityMaps: optimisticFlatViewFieldMaps,
mutableDependencyOptimisticFlatEntityMaps,
optimisticFlatEntityMapsAndRelatedFlatEntityMaps: {
flatViewFieldMaps: optimisticFlatViewFieldMaps,
flatViewMaps,
flatObjectMetadataMaps,
},
}: FlatEntityUpdateValidationArgs<
typeof ALL_METADATA_NAME.viewField
>): FailedFlatEntityValidation<FlatViewField> {
@@ -63,7 +66,7 @@ export class FlatViewFieldValidatorService {
const flatView = findFlatEntityByIdInFlatEntityMaps({
flatEntityId: updatedFlatViewField.viewId,
flatEntityMaps: mutableDependencyOptimisticFlatEntityMaps.flatViewMaps,
flatEntityMaps: flatViewMaps,
});
if (!isDefined(flatView)) {
@@ -78,8 +81,7 @@ export class FlatViewFieldValidatorService {
const flatObjectMetadata = findFlatEntityByIdInFlatEntityMaps({
flatEntityId: flatView.objectMetadataId,
flatEntityMaps:
mutableDependencyOptimisticFlatEntityMaps.flatObjectMetadataMaps,
flatEntityMaps: flatObjectMetadataMaps,
});
if (!isDefined(flatObjectMetadata)) {
@@ -118,8 +120,8 @@ export class FlatViewFieldValidatorService {
public validateFlatViewFieldDeletion({
flatEntityToValidate: { id: viewFieldIdToDelete },
optimisticFlatEntityMaps: optimisticFlatViewFieldMaps,
mutableDependencyOptimisticFlatEntityMaps: {
optimisticFlatEntityMapsAndRelatedFlatEntityMaps: {
flatViewFieldMaps: optimisticFlatViewFieldMaps,
flatFieldMetadataMaps,
flatObjectMetadataMaps,
},
@@ -181,8 +183,12 @@ export class FlatViewFieldValidatorService {
public validateFlatViewFieldCreation({
flatEntityToValidate: flatViewFieldToValidate,
optimisticFlatEntityMaps: optimisticFlatViewFieldMaps,
mutableDependencyOptimisticFlatEntityMaps,
optimisticFlatEntityMapsAndRelatedFlatEntityMaps: {
flatViewFieldMaps: optimisticFlatViewFieldMaps,
flatFieldMetadataMaps,
flatViewMaps,
flatObjectMetadataMaps,
},
}: FlatEntityValidationArgs<
typeof ALL_METADATA_NAME.viewField
>): FailedFlatEntityValidation<FlatViewField> {
@@ -211,8 +217,7 @@ export class FlatViewFieldValidatorService {
const flatFieldMetadata = findFlatEntityByIdInFlatEntityMaps({
flatEntityId: flatViewFieldToValidate.fieldMetadataId,
flatEntityMaps:
mutableDependencyOptimisticFlatEntityMaps.flatFieldMetadataMaps,
flatEntityMaps: flatFieldMetadataMaps,
});
if (!isDefined(flatFieldMetadata)) {
@@ -223,10 +228,7 @@ export class FlatViewFieldValidatorService {
});
}
const flatView =
mutableDependencyOptimisticFlatEntityMaps.flatViewMaps.byId[
flatViewFieldToValidate.viewId
];
const flatView = flatViewMaps.byId[flatViewFieldToValidate.viewId];
if (!isDefined(flatView)) {
validationResult.errors.push({
@@ -258,8 +260,7 @@ export class FlatViewFieldValidatorService {
}
const flatObjectMetadata = findFlatEntityByIdInFlatEntityMaps({
flatEntityMaps:
mutableDependencyOptimisticFlatEntityMaps.flatObjectMetadataMaps,
flatEntityMaps: flatObjectMetadataMaps,
flatEntityId: flatView.objectMetadataId,
});
@@ -18,8 +18,11 @@ export class FlatViewFilterValidatorService {
validateFlatViewFilterCreation({
flatEntityToValidate: flatViewFilterToValidate,
optimisticFlatEntityMaps: optimisticFlatViewFilterMaps,
mutableDependencyOptimisticFlatEntityMaps,
optimisticFlatEntityMapsAndRelatedFlatEntityMaps: {
flatViewFilterMaps: optimisticFlatViewFilterMaps,
flatViewMaps,
flatFieldMetadataMaps,
},
}: FlatEntityValidationArgs<
typeof ALL_METADATA_NAME.viewFilter
>): FailedFlatEntityValidation<FlatViewFilter> {
@@ -46,7 +49,7 @@ export class FlatViewFilterValidatorService {
const referencedView = findFlatEntityByIdInFlatEntityMaps({
flatEntityId: flatViewFilterToValidate.viewId,
flatEntityMaps: mutableDependencyOptimisticFlatEntityMaps.flatViewMaps,
flatEntityMaps: flatViewMaps,
});
if (!isDefined(referencedView)) {
@@ -59,8 +62,7 @@ export class FlatViewFilterValidatorService {
const referencedFieldMetadata = findFlatEntityByIdInFlatEntityMaps({
flatEntityId: flatViewFilterToValidate.fieldMetadataId,
flatEntityMaps:
mutableDependencyOptimisticFlatEntityMaps.flatFieldMetadataMaps,
flatEntityMaps: flatFieldMetadataMaps,
});
if (!isDefined(referencedFieldMetadata)) {
@@ -76,7 +78,9 @@ export class FlatViewFilterValidatorService {
validateFlatViewFilterDeletion({
flatEntityToValidate: flatViewFilterToValidate,
optimisticFlatEntityMaps: optimisticFlatViewFilterMaps,
optimisticFlatEntityMapsAndRelatedFlatEntityMaps: {
flatViewFilterMaps: optimisticFlatViewFilterMaps,
},
}: FlatEntityValidationArgs<
typeof ALL_METADATA_NAME.viewFilter
>): FailedFlatEntityValidation<FlatViewFilter> {
@@ -109,8 +113,10 @@ export class FlatViewFilterValidatorService {
validateFlatViewFilterUpdate({
flatEntityId,
flatEntityUpdates,
optimisticFlatEntityMaps: optimisticFlatViewFilterMaps,
mutableDependencyOptimisticFlatEntityMaps,
optimisticFlatEntityMapsAndRelatedFlatEntityMaps: {
flatViewFilterMaps: optimisticFlatViewFilterMaps,
flatFieldMetadataMaps,
},
}: FlatEntityUpdateValidationArgs<
typeof ALL_METADATA_NAME.viewFilter
>): FailedFlatEntityValidation<FlatViewFilter> {
@@ -143,8 +149,7 @@ export class FlatViewFilterValidatorService {
const referencedFieldMetadata = findFlatEntityByIdInFlatEntityMaps({
flatEntityId: updatedFlatViewFilter.fieldMetadataId,
flatEntityMaps:
mutableDependencyOptimisticFlatEntityMaps.flatFieldMetadataMaps,
flatEntityMaps: flatFieldMetadataMaps,
});
if (!isDefined(referencedFieldMetadata)) {
@@ -17,8 +17,11 @@ export class FlatViewGroupValidatorService {
public validateFlatViewGroupUpdate({
flatEntityId,
flatEntityUpdates,
optimisticFlatEntityMaps: optimisticFlatViewGroupMaps,
mutableDependencyOptimisticFlatEntityMaps,
optimisticFlatEntityMapsAndRelatedFlatEntityMaps: {
flatViewGroupMaps: optimisticFlatViewGroupMaps,
flatViewMaps,
flatFieldMetadataMaps,
},
}: FlatEntityUpdateValidationArgs<
typeof ALL_METADATA_NAME.viewGroup
>): FailedFlatEntityValidation<FlatViewGroup> {
@@ -58,7 +61,7 @@ export class FlatViewGroupValidatorService {
const flatView = findFlatEntityByIdInFlatEntityMaps({
flatEntityId: updatedFlatViewGroup.viewId,
flatEntityMaps: mutableDependencyOptimisticFlatEntityMaps.flatViewMaps,
flatEntityMaps: flatViewMaps,
});
if (!isDefined(flatView)) {
@@ -71,8 +74,7 @@ export class FlatViewGroupValidatorService {
const flatFieldMetadata = findFlatEntityByIdInFlatEntityMaps({
flatEntityId: updatedFlatViewGroup.fieldMetadataId,
flatEntityMaps:
mutableDependencyOptimisticFlatEntityMaps.flatFieldMetadataMaps,
flatEntityMaps: flatFieldMetadataMaps,
});
if (!isDefined(flatFieldMetadata)) {
@@ -88,7 +90,9 @@ export class FlatViewGroupValidatorService {
public validateFlatViewGroupDeletion({
flatEntityToValidate: { id: viewGroupIdToDelete },
optimisticFlatEntityMaps: optimisticFlatViewGroupMaps,
optimisticFlatEntityMapsAndRelatedFlatEntityMaps: {
flatViewGroupMaps: optimisticFlatViewGroupMaps,
},
}: FlatEntityValidationArgs<
typeof ALL_METADATA_NAME.viewGroup
>): FailedFlatEntityValidation<FlatViewGroup> {
@@ -116,8 +120,11 @@ export class FlatViewGroupValidatorService {
public validateFlatViewGroupCreation({
flatEntityToValidate: flatViewGroupToValidate,
optimisticFlatEntityMaps: optimisticFlatViewGroupMaps,
mutableDependencyOptimisticFlatEntityMaps,
optimisticFlatEntityMapsAndRelatedFlatEntityMaps: {
flatViewGroupMaps: optimisticFlatViewGroupMaps,
flatFieldMetadataMaps,
flatViewMaps,
},
}: FlatEntityValidationArgs<
typeof ALL_METADATA_NAME.viewGroup
>): FailedFlatEntityValidation<FlatViewGroup> {
@@ -146,8 +153,7 @@ export class FlatViewGroupValidatorService {
const flatFieldMetadata = findFlatEntityByIdInFlatEntityMaps({
flatEntityId: flatViewGroupToValidate.fieldMetadataId,
flatEntityMaps:
mutableDependencyOptimisticFlatEntityMaps.flatFieldMetadataMaps,
flatEntityMaps: flatFieldMetadataMaps,
});
if (!isDefined(flatFieldMetadata)) {
@@ -158,10 +164,7 @@ export class FlatViewGroupValidatorService {
});
}
const flatView =
mutableDependencyOptimisticFlatEntityMaps.flatViewMaps.byId[
flatViewGroupToValidate.viewId
];
const flatView = flatViewMaps.byId[flatViewGroupToValidate.viewId];
if (!isDefined(flatView)) {
validationResult.errors.push({
@@ -16,8 +16,10 @@ export class FlatViewValidatorService {
public validateFlatViewUpdate({
flatEntityId,
flatEntityUpdates,
optimisticFlatEntityMaps: optimisticFlatViewMaps,
mutableDependencyOptimisticFlatEntityMaps: { flatFieldMetadataMaps },
optimisticFlatEntityMapsAndRelatedFlatEntityMaps: {
flatViewMaps: optimisticFlatViewMaps,
flatFieldMetadataMaps,
},
}: FlatEntityUpdateValidationArgs<
typeof ALL_METADATA_NAME.view
>): FailedFlatEntityValidation<FlatView> {
@@ -67,7 +69,9 @@ export class FlatViewValidatorService {
public validateFlatViewDeletion({
flatEntityToValidate: { id: viewIdToDelete },
optimisticFlatEntityMaps: optimisticFlatViewMaps,
optimisticFlatEntityMapsAndRelatedFlatEntityMaps: {
flatViewMaps: optimisticFlatViewMaps,
},
}: FlatEntityValidationArgs<
typeof ALL_METADATA_NAME.view
>): FailedFlatEntityValidation<FlatView> {
@@ -94,8 +98,8 @@ export class FlatViewValidatorService {
public async validateFlatViewCreation({
flatEntityToValidate: flatViewToValidate,
optimisticFlatEntityMaps: optimisticFlatViewMaps,
mutableDependencyOptimisticFlatEntityMaps: {
optimisticFlatEntityMapsAndRelatedFlatEntityMaps: {
flatViewMaps: optimisticFlatViewMaps,
flatFieldMetadataMaps,
flatObjectMetadataMaps,
},
@@ -4,8 +4,8 @@ import { isDefined } from 'twenty-shared/utils';
import { WorkspaceMigrationRunnerActionHandler } from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-runner-v2/interfaces/workspace-migration-runner-action-handler-service.interface';
import { type Sources } from 'src/engine/core-modules/file-storage/types/source.type';
import { FileStorageService } from 'src/engine/core-modules/file-storage/file-storage.service';
import { type Sources } from 'src/engine/core-modules/file-storage/types/source.type';
import { ServerlessService } from 'src/engine/core-modules/serverless/serverless.service';
import { getServerlessFolder } from 'src/engine/core-modules/serverless/utils/serverless-get-folder.utils';
import { findFlatEntityByIdInFlatEntityMapsOrThrow } from 'src/engine/metadata-modules/flat-entity/utils/find-flat-entity-by-id-in-flat-entity-maps-or-throw.util';
@@ -68,7 +68,7 @@ export class UpdateServerlessFunctionActionHandlerService extends WorkspaceMigra
serverlessFunction: FlatServerlessFunction;
}) {
this.serverlessService.delete(
serverlessFunction as ServerlessFunctionEntity,
serverlessFunction as unknown as ServerlessFunctionEntity,
);
}