Async validators and additional cache maps in v2 Builder (#16618)
# Introduction @bosiraphael has to introduce async validators and feature flag contextual validator In this way in this PR we make all entity validators asyncable Also added an `additionalCacheDataMaps` to the low level args validators
This commit is contained in:
+4
@@ -6,6 +6,7 @@ import { Command, CommandRunner } from 'nest-commander';
|
||||
import { WorkspaceMigrationV2ExceptionCode } from 'twenty-shared/metadata';
|
||||
|
||||
import { createEmptyFlatEntityMaps } from 'src/engine/metadata-modules/flat-entity/constant/create-empty-flat-entity-maps.constant';
|
||||
import { AdditionalCacheDataMaps } from 'src/engine/workspace-cache/types/workspace-cache-key.type';
|
||||
import { computeTwentyStandardApplicationAllFlatEntityMaps } from 'src/engine/workspace-manager/twenty-standard-application/utils/twenty-standard-application-all-flat-entity-maps.constant';
|
||||
import { WorkspaceMigrationBuildOrchestratorService } from 'src/engine/workspace-manager/workspace-migration-v2/services/workspace-migration-build-orchestrator.service';
|
||||
import { WorkspaceMigrationV2Exception } from 'src/engine/workspace-manager/workspace-migration.exception';
|
||||
@@ -87,6 +88,9 @@ export class ComputeTwentyStandardWorkspaceMigrationCommand extends CommandRunne
|
||||
to: twentyStandardAllFlatEntityMaps.flatRoleMaps,
|
||||
},
|
||||
},
|
||||
additionalCacheDataMaps: {
|
||||
featureFlagsMap: {} as AdditionalCacheDataMaps['featureFlagsMap'],
|
||||
},
|
||||
workspaceId,
|
||||
})
|
||||
.catch((error) => {
|
||||
|
||||
@@ -34,7 +34,7 @@ export const WORKSPACE_CACHE_KEYS_V2 = {
|
||||
flatPageLayoutTabMaps: 'flat-maps:flatPageLayoutTabMaps',
|
||||
} as const satisfies Record<WorkspaceCacheKeyName, string>;
|
||||
|
||||
type AdditionalCacheDataMap = {
|
||||
export type AdditionalCacheDataMaps = {
|
||||
featureFlagsMap: Record<FeatureFlagKey, boolean>;
|
||||
rolesPermissions: ObjectsPermissionsByRoleId;
|
||||
userWorkspaceRoleMap: UserWorkspaceRoleMap;
|
||||
@@ -44,7 +44,7 @@ type AdditionalCacheDataMap = {
|
||||
flatRoleTargetByAgentIdMaps: FlatRoleTargetByAgentIdMaps;
|
||||
};
|
||||
|
||||
export type WorkspaceCacheDataMap = AllFlatEntityMaps & AdditionalCacheDataMap;
|
||||
export type WorkspaceCacheDataMap = AllFlatEntityMaps & AdditionalCacheDataMaps;
|
||||
|
||||
export type WorkspaceCacheKeyName = keyof WorkspaceCacheDataMap;
|
||||
|
||||
|
||||
+5
@@ -0,0 +1,5 @@
|
||||
import { type AdditionalCacheDataMaps } from 'src/engine/workspace-cache/types/workspace-cache-key.type';
|
||||
|
||||
export const WORKSPACE_MIGRATION_ADDITIONAL_CACHE_DATA_MAPS_KEY = [
|
||||
'featureFlagsMap',
|
||||
] as const satisfies (keyof AdditionalCacheDataMaps)[];
|
||||
+115
-85
@@ -113,6 +113,7 @@ export class WorkspaceMigrationBuildOrchestratorService {
|
||||
buildOptions,
|
||||
fromToAllFlatEntityMaps,
|
||||
dependencyAllFlatEntityMaps,
|
||||
additionalCacheDataMaps,
|
||||
}: WorkspaceMigrationOrchestratorBuildArgs): Promise<
|
||||
| WorkspaceMigrationOrchestratorFailedResult
|
||||
| WorkspaceMigrationOrchestratorSuccessfulResult
|
||||
@@ -153,37 +154,40 @@ export class WorkspaceMigrationBuildOrchestratorService {
|
||||
flatObjectMetadataMaps;
|
||||
|
||||
const objectResult =
|
||||
this.workspaceMigrationV2ObjectActionsBuilderService.validateAndBuild({
|
||||
buildOptions,
|
||||
// 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: {
|
||||
...dependencyAllFlatEntityMaps?.flatFieldMetadataMaps
|
||||
?.idByUniversalIdentifier,
|
||||
...flatFieldMetadataMaps?.from.idByUniversalIdentifier,
|
||||
...flatFieldMetadataMaps?.to.idByUniversalIdentifier,
|
||||
},
|
||||
universalIdentifiersByApplicationId: {
|
||||
...dependencyAllFlatEntityMaps?.flatFieldMetadataMaps
|
||||
?.universalIdentifiersByApplicationId,
|
||||
...flatFieldMetadataMaps?.from
|
||||
.universalIdentifiersByApplicationId,
|
||||
...flatFieldMetadataMaps?.to
|
||||
.universalIdentifiersByApplicationId,
|
||||
await this.workspaceMigrationV2ObjectActionsBuilderService.validateAndBuild(
|
||||
{
|
||||
additionalCacheDataMaps,
|
||||
buildOptions,
|
||||
// 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: {
|
||||
...dependencyAllFlatEntityMaps?.flatFieldMetadataMaps
|
||||
?.idByUniversalIdentifier,
|
||||
...flatFieldMetadataMaps?.from.idByUniversalIdentifier,
|
||||
...flatFieldMetadataMaps?.to.idByUniversalIdentifier,
|
||||
},
|
||||
universalIdentifiersByApplicationId: {
|
||||
...dependencyAllFlatEntityMaps?.flatFieldMetadataMaps
|
||||
?.universalIdentifiersByApplicationId,
|
||||
...flatFieldMetadataMaps?.from
|
||||
.universalIdentifiersByApplicationId,
|
||||
...flatFieldMetadataMaps?.to
|
||||
.universalIdentifiersByApplicationId,
|
||||
},
|
||||
},
|
||||
},
|
||||
///
|
||||
from: fromFlatObjectMetadataMaps,
|
||||
to: toFlatObjectMetadataMaps,
|
||||
workspaceId,
|
||||
},
|
||||
///
|
||||
from: fromFlatObjectMetadataMaps,
|
||||
to: toFlatObjectMetadataMaps,
|
||||
workspaceId,
|
||||
});
|
||||
);
|
||||
|
||||
this.mergeFlatEntityMapsAndRelatedFlatEntityMapsInAllFlatEntityMapsThroughMutation(
|
||||
{
|
||||
@@ -204,16 +208,19 @@ export class WorkspaceMigrationBuildOrchestratorService {
|
||||
const { from: fromFlatFieldMetadataMaps, to: toFlatFieldMetadataMaps } =
|
||||
flatFieldMetadataMaps;
|
||||
const fieldResult =
|
||||
this.workspaceMigrationV2FieldActionsBuilderService.validateAndBuild({
|
||||
from: fromFlatFieldMetadataMaps,
|
||||
to: toFlatFieldMetadataMaps,
|
||||
buildOptions,
|
||||
dependencyOptimisticFlatEntityMaps: {
|
||||
flatObjectMetadataMaps:
|
||||
optimisticAllFlatEntityMaps.flatObjectMetadataMaps,
|
||||
await this.workspaceMigrationV2FieldActionsBuilderService.validateAndBuild(
|
||||
{
|
||||
additionalCacheDataMaps,
|
||||
from: fromFlatFieldMetadataMaps,
|
||||
to: toFlatFieldMetadataMaps,
|
||||
buildOptions,
|
||||
dependencyOptimisticFlatEntityMaps: {
|
||||
flatObjectMetadataMaps:
|
||||
optimisticAllFlatEntityMaps.flatObjectMetadataMaps,
|
||||
},
|
||||
workspaceId,
|
||||
},
|
||||
workspaceId,
|
||||
});
|
||||
);
|
||||
|
||||
this.mergeFlatEntityMapsAndRelatedFlatEntityMapsInAllFlatEntityMapsThroughMutation(
|
||||
{
|
||||
@@ -233,18 +240,21 @@ export class WorkspaceMigrationBuildOrchestratorService {
|
||||
if (isDefined(flatIndexMaps)) {
|
||||
const { from: fromFlatIndexMaps, to: toFlatIndexMaps } = flatIndexMaps;
|
||||
const indexResult =
|
||||
this.workspaceMigrationV2IndexActionsBuilderService.validateAndBuild({
|
||||
from: fromFlatIndexMaps,
|
||||
to: toFlatIndexMaps,
|
||||
buildOptions,
|
||||
dependencyOptimisticFlatEntityMaps: {
|
||||
flatFieldMetadataMaps:
|
||||
optimisticAllFlatEntityMaps.flatFieldMetadataMaps,
|
||||
flatObjectMetadataMaps:
|
||||
optimisticAllFlatEntityMaps.flatObjectMetadataMaps,
|
||||
await this.workspaceMigrationV2IndexActionsBuilderService.validateAndBuild(
|
||||
{
|
||||
additionalCacheDataMaps,
|
||||
from: fromFlatIndexMaps,
|
||||
to: toFlatIndexMaps,
|
||||
buildOptions,
|
||||
dependencyOptimisticFlatEntityMaps: {
|
||||
flatFieldMetadataMaps:
|
||||
optimisticAllFlatEntityMaps.flatFieldMetadataMaps,
|
||||
flatObjectMetadataMaps:
|
||||
optimisticAllFlatEntityMaps.flatObjectMetadataMaps,
|
||||
},
|
||||
workspaceId,
|
||||
},
|
||||
workspaceId,
|
||||
});
|
||||
);
|
||||
|
||||
this.mergeFlatEntityMapsAndRelatedFlatEntityMapsInAllFlatEntityMapsThroughMutation(
|
||||
{
|
||||
@@ -264,18 +274,21 @@ export class WorkspaceMigrationBuildOrchestratorService {
|
||||
if (isDefined(flatViewMaps)) {
|
||||
const { from: fromFlatViewMaps, to: toFlatViewMaps } = flatViewMaps;
|
||||
const viewResult =
|
||||
this.workspaceMigrationV2ViewActionsBuilderService.validateAndBuild({
|
||||
dependencyOptimisticFlatEntityMaps: {
|
||||
flatObjectMetadataMaps:
|
||||
optimisticAllFlatEntityMaps.flatObjectMetadataMaps,
|
||||
flatFieldMetadataMaps:
|
||||
optimisticAllFlatEntityMaps.flatFieldMetadataMaps,
|
||||
await this.workspaceMigrationV2ViewActionsBuilderService.validateAndBuild(
|
||||
{
|
||||
additionalCacheDataMaps,
|
||||
dependencyOptimisticFlatEntityMaps: {
|
||||
flatObjectMetadataMaps:
|
||||
optimisticAllFlatEntityMaps.flatObjectMetadataMaps,
|
||||
flatFieldMetadataMaps:
|
||||
optimisticAllFlatEntityMaps.flatFieldMetadataMaps,
|
||||
},
|
||||
from: fromFlatViewMaps,
|
||||
to: toFlatViewMaps,
|
||||
buildOptions,
|
||||
workspaceId,
|
||||
},
|
||||
from: fromFlatViewMaps,
|
||||
to: toFlatViewMaps,
|
||||
buildOptions,
|
||||
workspaceId,
|
||||
});
|
||||
);
|
||||
|
||||
this.mergeFlatEntityMapsAndRelatedFlatEntityMapsInAllFlatEntityMapsThroughMutation(
|
||||
{
|
||||
@@ -296,8 +309,9 @@ export class WorkspaceMigrationBuildOrchestratorService {
|
||||
const { from: fromFlatViewFieldMaps, to: toFlatViewFieldMaps } =
|
||||
flatViewFieldMaps;
|
||||
const viewFieldResult =
|
||||
this.workspaceMigrationV2ViewFieldActionsBuilderService.validateAndBuild(
|
||||
await this.workspaceMigrationV2ViewFieldActionsBuilderService.validateAndBuild(
|
||||
{
|
||||
additionalCacheDataMaps,
|
||||
from: fromFlatViewFieldMaps,
|
||||
to: toFlatViewFieldMaps,
|
||||
buildOptions,
|
||||
@@ -331,8 +345,9 @@ export class WorkspaceMigrationBuildOrchestratorService {
|
||||
const { from: fromFlatViewFilterMaps, to: toFlatViewFilterMaps } =
|
||||
flatViewFilterMaps;
|
||||
const viewFilterResult =
|
||||
this.workspaceMigrationV2ViewFilterActionsBuilderService.validateAndBuild(
|
||||
await this.workspaceMigrationV2ViewFilterActionsBuilderService.validateAndBuild(
|
||||
{
|
||||
additionalCacheDataMaps,
|
||||
from: fromFlatViewFilterMaps,
|
||||
to: toFlatViewFilterMaps,
|
||||
buildOptions,
|
||||
@@ -364,8 +379,9 @@ export class WorkspaceMigrationBuildOrchestratorService {
|
||||
const { from: fromFlatViewGroupMaps, to: toFlatViewGroupMaps } =
|
||||
flatViewGroupMaps;
|
||||
const viewGroupResult =
|
||||
this.workspaceMigrationV2ViewGroupActionsBuilderService.validateAndBuild(
|
||||
await this.workspaceMigrationV2ViewGroupActionsBuilderService.validateAndBuild(
|
||||
{
|
||||
additionalCacheDataMaps,
|
||||
from: fromFlatViewGroupMaps,
|
||||
to: toFlatViewGroupMaps,
|
||||
buildOptions,
|
||||
@@ -400,8 +416,9 @@ export class WorkspaceMigrationBuildOrchestratorService {
|
||||
} = flatServerlessFunctionMaps;
|
||||
|
||||
const serverlessFunctionResult =
|
||||
this.workspaceMigrationV2ServerlessFunctionActionsBuilderService.validateAndBuild(
|
||||
await this.workspaceMigrationV2ServerlessFunctionActionsBuilderService.validateAndBuild(
|
||||
{
|
||||
additionalCacheDataMaps,
|
||||
from: fromFlatServerlessFunctionMaps,
|
||||
to: toFlatServerlessFunctionMaps,
|
||||
buildOptions,
|
||||
@@ -435,8 +452,9 @@ export class WorkspaceMigrationBuildOrchestratorService {
|
||||
} = flatDatabaseEventTriggerMaps;
|
||||
|
||||
const databaseEventTriggerResult =
|
||||
this.workspaceMigrationV2DatabaseEventTriggerActionsBuilderService.validateAndBuild(
|
||||
await this.workspaceMigrationV2DatabaseEventTriggerActionsBuilderService.validateAndBuild(
|
||||
{
|
||||
additionalCacheDataMaps,
|
||||
from: fromFlatDatabaseEventTriggerMaps,
|
||||
to: toFlatDatabaseEventTriggerMaps,
|
||||
buildOptions,
|
||||
@@ -471,8 +489,9 @@ export class WorkspaceMigrationBuildOrchestratorService {
|
||||
flatCronTriggerMaps;
|
||||
|
||||
const cronTriggerResult =
|
||||
this.workspaceMigrationV2CronTriggerActionsBuilderService.validateAndBuild(
|
||||
await this.workspaceMigrationV2CronTriggerActionsBuilderService.validateAndBuild(
|
||||
{
|
||||
additionalCacheDataMaps,
|
||||
from: fromFlatCronTriggerMaps,
|
||||
to: toFlatCronTriggerMaps,
|
||||
buildOptions,
|
||||
@@ -504,8 +523,9 @@ export class WorkspaceMigrationBuildOrchestratorService {
|
||||
flatRouteTriggerMaps;
|
||||
|
||||
const routeTriggerResult =
|
||||
this.workspaceMigrationV2RouteTriggerActionsBuilderService.validateAndBuild(
|
||||
await this.workspaceMigrationV2RouteTriggerActionsBuilderService.validateAndBuild(
|
||||
{
|
||||
additionalCacheDataMaps,
|
||||
from: fromFlatRouteTriggerMaps,
|
||||
to: toFlatRouteTriggerMaps,
|
||||
buildOptions,
|
||||
@@ -538,13 +558,16 @@ export class WorkspaceMigrationBuildOrchestratorService {
|
||||
const { from: fromFlatRoleMaps, to: toFlatRoleMaps } = flatRoleMaps;
|
||||
|
||||
const roleResult =
|
||||
this.workspaceMigrationV2RoleActionsBuilderService.validateAndBuild({
|
||||
from: fromFlatRoleMaps,
|
||||
to: toFlatRoleMaps,
|
||||
buildOptions,
|
||||
dependencyOptimisticFlatEntityMaps: undefined,
|
||||
workspaceId,
|
||||
});
|
||||
await this.workspaceMigrationV2RoleActionsBuilderService.validateAndBuild(
|
||||
{
|
||||
additionalCacheDataMaps,
|
||||
from: fromFlatRoleMaps,
|
||||
to: toFlatRoleMaps,
|
||||
buildOptions,
|
||||
dependencyOptimisticFlatEntityMaps: undefined,
|
||||
workspaceId,
|
||||
},
|
||||
);
|
||||
|
||||
this.mergeFlatEntityMapsAndRelatedFlatEntityMapsInAllFlatEntityMapsThroughMutation(
|
||||
{
|
||||
@@ -566,8 +589,9 @@ export class WorkspaceMigrationBuildOrchestratorService {
|
||||
flatRoleTargetMaps;
|
||||
|
||||
const roleTargetResult =
|
||||
this.workspaceMigrationV2RoleTargetActionsBuilderService.validateAndBuild(
|
||||
await this.workspaceMigrationV2RoleTargetActionsBuilderService.validateAndBuild(
|
||||
{
|
||||
additionalCacheDataMaps,
|
||||
from: fromFlatRoleTargetMaps,
|
||||
to: toFlatRoleTargetMaps,
|
||||
buildOptions,
|
||||
@@ -598,15 +622,18 @@ export class WorkspaceMigrationBuildOrchestratorService {
|
||||
const { from: fromFlatAgentMaps, to: toFlatAgentMaps } = flatAgentMaps;
|
||||
|
||||
const agentResult =
|
||||
this.workspaceMigrationV2AgentActionsBuilderService.validateAndBuild({
|
||||
from: fromFlatAgentMaps,
|
||||
to: toFlatAgentMaps,
|
||||
buildOptions,
|
||||
dependencyOptimisticFlatEntityMaps: {
|
||||
flatRoleMaps: optimisticAllFlatEntityMaps.flatRoleMaps,
|
||||
await this.workspaceMigrationV2AgentActionsBuilderService.validateAndBuild(
|
||||
{
|
||||
additionalCacheDataMaps,
|
||||
from: fromFlatAgentMaps,
|
||||
to: toFlatAgentMaps,
|
||||
buildOptions,
|
||||
dependencyOptimisticFlatEntityMaps: {
|
||||
flatRoleMaps: optimisticAllFlatEntityMaps.flatRoleMaps,
|
||||
},
|
||||
workspaceId,
|
||||
},
|
||||
workspaceId,
|
||||
});
|
||||
);
|
||||
|
||||
this.mergeFlatEntityMapsAndRelatedFlatEntityMapsInAllFlatEntityMapsThroughMutation(
|
||||
{
|
||||
@@ -628,8 +655,9 @@ export class WorkspaceMigrationBuildOrchestratorService {
|
||||
flatPageLayoutMaps;
|
||||
|
||||
const pageLayoutResult =
|
||||
this.workspaceMigrationV2PageLayoutActionsBuilderService.validateAndBuild(
|
||||
await this.workspaceMigrationV2PageLayoutActionsBuilderService.validateAndBuild(
|
||||
{
|
||||
additionalCacheDataMaps,
|
||||
from: fromFlatPageLayoutMaps,
|
||||
to: toFlatPageLayoutMaps,
|
||||
buildOptions,
|
||||
@@ -661,8 +689,9 @@ export class WorkspaceMigrationBuildOrchestratorService {
|
||||
flatPageLayoutTabMaps;
|
||||
|
||||
const pageLayoutTabResult =
|
||||
this.workspaceMigrationV2PageLayoutTabActionsBuilderService.validateAndBuild(
|
||||
await this.workspaceMigrationV2PageLayoutTabActionsBuilderService.validateAndBuild(
|
||||
{
|
||||
additionalCacheDataMaps,
|
||||
from: fromFlatPageLayoutTabMaps,
|
||||
to: toFlatPageLayoutTabMaps,
|
||||
buildOptions,
|
||||
@@ -698,8 +727,9 @@ export class WorkspaceMigrationBuildOrchestratorService {
|
||||
} = flatPageLayoutWidgetMaps;
|
||||
|
||||
const pageLayoutWidgetResult =
|
||||
this.workspaceMigrationV2PageLayoutWidgetActionsBuilderService.validateAndBuild(
|
||||
await this.workspaceMigrationV2PageLayoutWidgetActionsBuilderService.validateAndBuild(
|
||||
{
|
||||
additionalCacheDataMaps,
|
||||
from: fromFlatPageLayoutWidgetMaps,
|
||||
to: toFlatPageLayoutWidgetMaps,
|
||||
buildOptions,
|
||||
|
||||
+35
-12
@@ -13,7 +13,9 @@ import { FlatEntityToCreateDeleteUpdate } from 'src/engine/metadata-modules/flat
|
||||
import { computeFlatEntityMapsFromTo } from 'src/engine/metadata-modules/flat-entity/utils/compute-flat-entity-maps-from-to.util';
|
||||
import { getMetadataFlatEntityMapsKey } from 'src/engine/metadata-modules/flat-entity/utils/get-metadata-flat-entity-maps-key.util';
|
||||
import { WorkspaceCacheService } from 'src/engine/workspace-cache/services/workspace-cache.service';
|
||||
import { WORKSPACE_MIGRATION_ADDITIONAL_CACHE_DATA_MAPS_KEY } from 'src/engine/workspace-manager/workspace-migration-v2/constant/workspace-migration-additional-cache-data-maps-key.constant';
|
||||
import { WorkspaceMigrationBuildOrchestratorService } from 'src/engine/workspace-manager/workspace-migration-v2/services/workspace-migration-build-orchestrator.service';
|
||||
import { WorkspaceMigrationBuilderAdditionalCacheDataMaps } from 'src/engine/workspace-manager/workspace-migration-v2/types/workspace-migration-builder-additional-cache-data-maps.type';
|
||||
import {
|
||||
WorkspaceMigrationOrchestratorBuildArgs,
|
||||
WorkspaceMigrationOrchestratorFailedResult,
|
||||
@@ -62,10 +64,10 @@ export class WorkspaceMigrationValidateBuildAndRunService {
|
||||
allMetadataNameCacheToCompute.map(getMetadataFlatEntityMapsKey);
|
||||
|
||||
const allRelatedFlatEntityMaps =
|
||||
await this.workspaceCacheService.getOrRecompute(
|
||||
workspaceId,
|
||||
allFlatEntityMapsCacheKeysToCompute,
|
||||
);
|
||||
await this.workspaceCacheService.getOrRecompute(workspaceId, [
|
||||
...allFlatEntityMapsCacheKeysToCompute,
|
||||
...WORKSPACE_MIGRATION_ADDITIONAL_CACHE_DATA_MAPS_KEY,
|
||||
]);
|
||||
|
||||
const initialAccumulator = allDependencyMetadataName.reduce<
|
||||
Partial<AllFlatEntityMaps>
|
||||
@@ -91,9 +93,22 @@ export class WorkspaceMigrationValidateBuildAndRunService {
|
||||
initialAccumulator,
|
||||
);
|
||||
|
||||
const additionalCacheDataMaps =
|
||||
WORKSPACE_MIGRATION_ADDITIONAL_CACHE_DATA_MAPS_KEY.reduce<WorkspaceMigrationBuilderAdditionalCacheDataMaps>(
|
||||
(acc, additionalCacheDataMapsKey) => {
|
||||
return {
|
||||
...acc,
|
||||
[additionalCacheDataMapsKey]:
|
||||
allRelatedFlatEntityMaps[additionalCacheDataMapsKey],
|
||||
};
|
||||
},
|
||||
{} as WorkspaceMigrationBuilderAdditionalCacheDataMaps,
|
||||
);
|
||||
|
||||
return {
|
||||
allRelatedFlatEntityMaps,
|
||||
dependencyAllFlatEntityMaps,
|
||||
additionalCacheDataMaps,
|
||||
};
|
||||
}
|
||||
|
||||
@@ -104,12 +119,16 @@ export class WorkspaceMigrationValidateBuildAndRunService {
|
||||
fromToAllFlatEntityMaps: WorkspaceMigrationOrchestratorBuildArgs['fromToAllFlatEntityMaps'];
|
||||
inferDeletionFromMissingEntities: InferDeletionFromMissingEntities;
|
||||
dependencyAllFlatEntityMaps: Partial<AllFlatEntityMaps>;
|
||||
additionalCacheDataMaps: WorkspaceMigrationBuilderAdditionalCacheDataMaps;
|
||||
}> {
|
||||
const { allRelatedFlatEntityMaps, dependencyAllFlatEntityMaps } =
|
||||
await this.computeAllRelatedFlatEntityMaps({
|
||||
allFlatEntityOperationByMetadataName,
|
||||
workspaceId,
|
||||
});
|
||||
const {
|
||||
allRelatedFlatEntityMaps,
|
||||
dependencyAllFlatEntityMaps,
|
||||
additionalCacheDataMaps,
|
||||
} = await this.computeAllRelatedFlatEntityMaps({
|
||||
allFlatEntityOperationByMetadataName,
|
||||
workspaceId,
|
||||
});
|
||||
|
||||
const fromToAllFlatEntityMaps: WorkspaceMigrationOrchestratorBuildArgs['fromToAllFlatEntityMaps'] =
|
||||
{};
|
||||
@@ -120,13 +139,14 @@ export class WorkspaceMigrationValidateBuildAndRunService {
|
||||
) as AllMetadataName[];
|
||||
|
||||
for (const metadataName of allMetadataNameToCompare) {
|
||||
const tmp = allFlatEntityOperationByMetadataName[metadataName];
|
||||
const flatEntityOperations =
|
||||
allFlatEntityOperationByMetadataName[metadataName];
|
||||
|
||||
if (!isDefined(tmp)) {
|
||||
if (!isDefined(flatEntityOperations)) {
|
||||
throw new Error('Should never occurs');
|
||||
}
|
||||
const { flatEntityToCreate, flatEntityToDelete, flatEntityToUpdate } =
|
||||
tmp;
|
||||
flatEntityOperations;
|
||||
const flatEntityMapsKey = getMetadataFlatEntityMapsKey(metadataName);
|
||||
const flatEntityMaps = allRelatedFlatEntityMaps[flatEntityMapsKey];
|
||||
|
||||
@@ -147,6 +167,7 @@ export class WorkspaceMigrationValidateBuildAndRunService {
|
||||
fromToAllFlatEntityMaps,
|
||||
inferDeletionFromMissingEntities,
|
||||
dependencyAllFlatEntityMaps,
|
||||
additionalCacheDataMaps,
|
||||
};
|
||||
}
|
||||
|
||||
@@ -161,6 +182,7 @@ export class WorkspaceMigrationValidateBuildAndRunService {
|
||||
fromToAllFlatEntityMaps,
|
||||
inferDeletionFromMissingEntities,
|
||||
dependencyAllFlatEntityMaps,
|
||||
additionalCacheDataMaps,
|
||||
} = await this.computeFromToAllFlatEntityMapsAndBuildOptions({
|
||||
allFlatEntityOperationByMetadataName: allFlatEntities,
|
||||
workspaceId,
|
||||
@@ -176,6 +198,7 @@ export class WorkspaceMigrationValidateBuildAndRunService {
|
||||
fromToAllFlatEntityMaps,
|
||||
workspaceId,
|
||||
dependencyAllFlatEntityMaps,
|
||||
additionalCacheDataMaps,
|
||||
})
|
||||
.catch((error) => {
|
||||
this.logger.error(error);
|
||||
|
||||
+7
@@ -0,0 +1,7 @@
|
||||
import { type AdditionalCacheDataMaps } from 'src/engine/workspace-cache/types/workspace-cache-key.type';
|
||||
import { type WORKSPACE_MIGRATION_ADDITIONAL_CACHE_DATA_MAPS_KEY } from 'src/engine/workspace-manager/workspace-migration-v2/constant/workspace-migration-additional-cache-data-maps-key.constant';
|
||||
|
||||
export type WorkspaceMigrationBuilderAdditionalCacheDataMaps = Pick<
|
||||
AdditionalCacheDataMaps,
|
||||
(typeof WORKSPACE_MIGRATION_ADDITIONAL_CACHE_DATA_MAPS_KEY)[number]
|
||||
>;
|
||||
+3
-1
@@ -1,9 +1,10 @@
|
||||
import { type FromTo } from 'twenty-shared/types';
|
||||
import { type AllMetadataName } from 'twenty-shared/metadata';
|
||||
import { type FromTo } from 'twenty-shared/types';
|
||||
|
||||
import { type AllFlatEntityMaps } from 'src/engine/metadata-modules/flat-entity/types/all-flat-entity-maps.type';
|
||||
import { type MetadataFlatEntity } from 'src/engine/metadata-modules/flat-entity/types/metadata-flat-entity.type';
|
||||
import { type MetadataWorkspaceMigrationActionsRecord } from 'src/engine/metadata-modules/flat-entity/types/metadata-workspace-migration-action.type';
|
||||
import { type WorkspaceMigrationBuilderAdditionalCacheDataMaps } from 'src/engine/workspace-manager/workspace-migration-v2/types/workspace-migration-builder-additional-cache-data-maps.type';
|
||||
import { type FailedFlatEntityValidation } from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-builder-v2/builders/types/failed-flat-entity-validation.type';
|
||||
import { type WorkspaceMigrationBuilderOptions } from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-builder-v2/types/workspace-migration-builder-options.type';
|
||||
import { type WorkspaceMigrationV2 } from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-builder-v2/types/workspace-migration-v2';
|
||||
@@ -15,6 +16,7 @@ export type WorkspaceMigrationOrchestratorBuildArgs = {
|
||||
[P in keyof AllFlatEntityMaps]?: FromTo<AllFlatEntityMaps[P]>;
|
||||
};
|
||||
dependencyAllFlatEntityMaps?: Partial<AllFlatEntityMaps>;
|
||||
additionalCacheDataMaps: WorkspaceMigrationBuilderAdditionalCacheDataMaps;
|
||||
};
|
||||
|
||||
export type OrchestratorFailureReport = {
|
||||
|
||||
+12
-8
@@ -19,11 +19,13 @@ export class WorkspaceMigrationV2PageLayoutActionsBuilderService extends Workspa
|
||||
super(ALL_METADATA_NAME.pageLayout);
|
||||
}
|
||||
|
||||
protected validateFlatEntityCreation(
|
||||
protected async validateFlatEntityCreation(
|
||||
args: FlatEntityValidationArgs<typeof ALL_METADATA_NAME.pageLayout>,
|
||||
): FlatEntityValidationReturnType<
|
||||
typeof ALL_METADATA_NAME.pageLayout,
|
||||
'created'
|
||||
): Promise<
|
||||
FlatEntityValidationReturnType<
|
||||
typeof ALL_METADATA_NAME.pageLayout,
|
||||
'created'
|
||||
>
|
||||
> {
|
||||
const validationResult =
|
||||
this.flatPageLayoutValidatorService.validateFlatPageLayoutCreation(args);
|
||||
@@ -73,11 +75,13 @@ export class WorkspaceMigrationV2PageLayoutActionsBuilderService extends Workspa
|
||||
};
|
||||
}
|
||||
|
||||
protected validateFlatEntityUpdate(
|
||||
protected async validateFlatEntityUpdate(
|
||||
args: FlatEntityUpdateValidationArgs<typeof ALL_METADATA_NAME.pageLayout>,
|
||||
): FlatEntityValidationReturnType<
|
||||
typeof ALL_METADATA_NAME.pageLayout,
|
||||
'updated'
|
||||
): Promise<
|
||||
FlatEntityValidationReturnType<
|
||||
typeof ALL_METADATA_NAME.pageLayout,
|
||||
'updated'
|
||||
>
|
||||
> {
|
||||
const validationResult =
|
||||
this.flatPageLayoutValidatorService.validateFlatPageLayoutUpdate(args);
|
||||
|
||||
+2
-2
@@ -24,11 +24,11 @@ export class WorkspaceMigrationV2ServerlessFunctionActionsBuilderService extends
|
||||
super(ALL_METADATA_NAME.serverlessFunction);
|
||||
}
|
||||
|
||||
public validateAndBuild(
|
||||
public async validateAndBuild(
|
||||
args: ValidateAndBuildArgs<typeof ALL_METADATA_NAME.serverlessFunction>,
|
||||
): ValidateAndBuildReturnType<typeof ALL_METADATA_NAME.serverlessFunction> {
|
||||
const { to: toFlatEntityMaps } = args;
|
||||
const baseResult = super.validateAndBuild(args);
|
||||
const baseResult = await super.validateAndBuild(args);
|
||||
|
||||
if (baseResult.status === 'fail') {
|
||||
return baseResult;
|
||||
|
||||
+18
-10
@@ -16,6 +16,7 @@ import { addFlatEntityToFlatEntityAndRelatedEntityMapsThroughMutationOrThrow } f
|
||||
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 { 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-v2/types/workspace-migration-builder-additional-cache-data-maps.type';
|
||||
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';
|
||||
@@ -33,11 +34,12 @@ export type ValidateAndBuildArgs<T extends AllMetadataName> = {
|
||||
buildOptions: WorkspaceMigrationBuilderOptions;
|
||||
dependencyOptimisticFlatEntityMaps: MetadataValidationRelatedFlatEntityMaps<T>;
|
||||
workspaceId: string;
|
||||
additionalCacheDataMaps: WorkspaceMigrationBuilderAdditionalCacheDataMaps;
|
||||
} & FromTo<MetadataFlatEntityMaps<T>>;
|
||||
|
||||
export type ValidateAndBuildReturnType<T extends AllMetadataName> =
|
||||
| SuccessfulFlatEntityValidateAndBuild<T>
|
||||
| FailedFlatEntityValidateAndBuild<T>;
|
||||
export type ValidateAndBuildReturnType<T extends AllMetadataName> = Promise<
|
||||
SuccessfulFlatEntityValidateAndBuild<T> | FailedFlatEntityValidateAndBuild<T>
|
||||
>;
|
||||
|
||||
export abstract class WorkspaceEntityMigrationBuilderV2Service<
|
||||
T extends AllMetadataName,
|
||||
@@ -50,7 +52,7 @@ export abstract class WorkspaceEntityMigrationBuilderV2Service<
|
||||
this.metadataName = metadataName;
|
||||
}
|
||||
|
||||
public validateAndBuild({
|
||||
public async validateAndBuild({
|
||||
buildOptions,
|
||||
dependencyOptimisticFlatEntityMaps: inputDependencyOptimisticFlatEntityMaps,
|
||||
from: fromFlatEntityMaps,
|
||||
@@ -122,7 +124,7 @@ export abstract class WorkspaceEntityMigrationBuilderV2Service<
|
||||
flatEntityMapsToMutate: remainingFlatEntityMapsToCreate,
|
||||
});
|
||||
|
||||
const validationResult = this.validateFlatEntityCreation({
|
||||
const validationResult = await this.validateFlatEntityCreation({
|
||||
flatEntityToValidate: flatEntityToCreate,
|
||||
workspaceId,
|
||||
optimisticFlatEntityMapsAndRelatedFlatEntityMaps,
|
||||
@@ -185,7 +187,7 @@ export abstract class WorkspaceEntityMigrationBuilderV2Service<
|
||||
flatEntityMapsToMutate: remainingFlatEntityMapsToDelete,
|
||||
});
|
||||
|
||||
const validationResult = this.validateFlatEntityDeletion({
|
||||
const validationResult = await this.validateFlatEntityDeletion({
|
||||
flatEntityToValidate: flatEntityToDelete,
|
||||
workspaceId,
|
||||
remainingFlatEntityMapsToValidate: remainingFlatEntityMapsToDelete,
|
||||
@@ -229,7 +231,7 @@ export abstract class WorkspaceEntityMigrationBuilderV2Service<
|
||||
);
|
||||
}
|
||||
|
||||
const validationResult = this.validateFlatEntityUpdate({
|
||||
const validationResult = await this.validateFlatEntityUpdate({
|
||||
flatEntityUpdates: flatEntityToUpdate.updates,
|
||||
flatEntityId: flatEntityToUpdateId,
|
||||
optimisticFlatEntityMapsAndRelatedFlatEntityMaps,
|
||||
@@ -307,13 +309,19 @@ export abstract class WorkspaceEntityMigrationBuilderV2Service<
|
||||
|
||||
protected abstract validateFlatEntityCreation(
|
||||
args: FlatEntityValidationArgs<T>,
|
||||
): FlatEntityValidationReturnType<T, 'created'>;
|
||||
):
|
||||
| FlatEntityValidationReturnType<T, 'created'>
|
||||
| Promise<FlatEntityValidationReturnType<T, 'created'>>;
|
||||
|
||||
protected abstract validateFlatEntityDeletion(
|
||||
args: FlatEntityValidationArgs<T>,
|
||||
): FlatEntityValidationReturnType<T, 'deleted'>;
|
||||
):
|
||||
| FlatEntityValidationReturnType<T, 'deleted'>
|
||||
| Promise<FlatEntityValidationReturnType<T, 'deleted'>>;
|
||||
|
||||
protected abstract validateFlatEntityUpdate(
|
||||
args: FlatEntityUpdateValidationArgs<T>,
|
||||
): FlatEntityValidationReturnType<T, 'updated'>;
|
||||
):
|
||||
| FlatEntityValidationReturnType<T, 'updated'>
|
||||
| Promise<FlatEntityValidationReturnType<T, 'updated'>>;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user