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:
Paul Rastoin
2025-12-17 15:43:25 +01:00
committed by GitHub
parent ca976afa10
commit 0e6a8c04c4
10 changed files with 203 additions and 120 deletions
@@ -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;
@@ -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)[];
@@ -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,
@@ -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);
@@ -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]
>;
@@ -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 = {
@@ -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);
@@ -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;
@@ -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'>>;
}