diff --git a/packages/twenty-server/src/database/commands/compute-twenty-standard-workspace-migration.command.ts b/packages/twenty-server/src/database/commands/compute-twenty-standard-workspace-migration.command.ts index 30ea6d367c..50b4f562cb 100644 --- a/packages/twenty-server/src/database/commands/compute-twenty-standard-workspace-migration.command.ts +++ b/packages/twenty-server/src/database/commands/compute-twenty-standard-workspace-migration.command.ts @@ -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) => { diff --git a/packages/twenty-server/src/engine/workspace-cache/types/workspace-cache-key.type.ts b/packages/twenty-server/src/engine/workspace-cache/types/workspace-cache-key.type.ts index 27ac6ba2d0..518d35922a 100644 --- a/packages/twenty-server/src/engine/workspace-cache/types/workspace-cache-key.type.ts +++ b/packages/twenty-server/src/engine/workspace-cache/types/workspace-cache-key.type.ts @@ -34,7 +34,7 @@ export const WORKSPACE_CACHE_KEYS_V2 = { flatPageLayoutTabMaps: 'flat-maps:flatPageLayoutTabMaps', } as const satisfies Record; -type AdditionalCacheDataMap = { +export type AdditionalCacheDataMaps = { featureFlagsMap: Record; 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; diff --git a/packages/twenty-server/src/engine/workspace-manager/workspace-migration-v2/constant/workspace-migration-additional-cache-data-maps-key.constant.ts b/packages/twenty-server/src/engine/workspace-manager/workspace-migration-v2/constant/workspace-migration-additional-cache-data-maps-key.constant.ts new file mode 100644 index 0000000000..e9e6fb6022 --- /dev/null +++ b/packages/twenty-server/src/engine/workspace-manager/workspace-migration-v2/constant/workspace-migration-additional-cache-data-maps-key.constant.ts @@ -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)[]; diff --git a/packages/twenty-server/src/engine/workspace-manager/workspace-migration-v2/services/workspace-migration-build-orchestrator.service.ts b/packages/twenty-server/src/engine/workspace-manager/workspace-migration-v2/services/workspace-migration-build-orchestrator.service.ts index 739f7c5b9f..2396441f01 100644 --- a/packages/twenty-server/src/engine/workspace-manager/workspace-migration-v2/services/workspace-migration-build-orchestrator.service.ts +++ b/packages/twenty-server/src/engine/workspace-manager/workspace-migration-v2/services/workspace-migration-build-orchestrator.service.ts @@ -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, diff --git a/packages/twenty-server/src/engine/workspace-manager/workspace-migration-v2/services/workspace-migration-validate-build-and-run-service.ts b/packages/twenty-server/src/engine/workspace-manager/workspace-migration-v2/services/workspace-migration-validate-build-and-run-service.ts index 620eb4db46..42357d6f67 100644 --- a/packages/twenty-server/src/engine/workspace-manager/workspace-migration-v2/services/workspace-migration-validate-build-and-run-service.ts +++ b/packages/twenty-server/src/engine/workspace-manager/workspace-migration-v2/services/workspace-migration-validate-build-and-run-service.ts @@ -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 @@ -91,9 +93,22 @@ export class WorkspaceMigrationValidateBuildAndRunService { initialAccumulator, ); + const additionalCacheDataMaps = + WORKSPACE_MIGRATION_ADDITIONAL_CACHE_DATA_MAPS_KEY.reduce( + (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; + 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); diff --git a/packages/twenty-server/src/engine/workspace-manager/workspace-migration-v2/types/workspace-migration-builder-additional-cache-data-maps.type.ts b/packages/twenty-server/src/engine/workspace-manager/workspace-migration-v2/types/workspace-migration-builder-additional-cache-data-maps.type.ts new file mode 100644 index 0000000000..5114dc3f06 --- /dev/null +++ b/packages/twenty-server/src/engine/workspace-manager/workspace-migration-v2/types/workspace-migration-builder-additional-cache-data-maps.type.ts @@ -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] +>; diff --git a/packages/twenty-server/src/engine/workspace-manager/workspace-migration-v2/types/workspace-migration-orchestrator.type.ts b/packages/twenty-server/src/engine/workspace-manager/workspace-migration-v2/types/workspace-migration-orchestrator.type.ts index 73a53ca7ed..9150a167ea 100644 --- a/packages/twenty-server/src/engine/workspace-manager/workspace-migration-v2/types/workspace-migration-orchestrator.type.ts +++ b/packages/twenty-server/src/engine/workspace-manager/workspace-migration-v2/types/workspace-migration-orchestrator.type.ts @@ -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; }; dependencyAllFlatEntityMaps?: Partial; + additionalCacheDataMaps: WorkspaceMigrationBuilderAdditionalCacheDataMaps; }; export type OrchestratorFailureReport = { diff --git a/packages/twenty-server/src/engine/workspace-manager/workspace-migration-v2/workspace-migration-builder-v2/builders/page-layout/workspace-migration-v2-page-layout-actions-builder.service.ts b/packages/twenty-server/src/engine/workspace-manager/workspace-migration-v2/workspace-migration-builder-v2/builders/page-layout/workspace-migration-v2-page-layout-actions-builder.service.ts index b9357b64bd..1ff79ee1ee 100644 --- a/packages/twenty-server/src/engine/workspace-manager/workspace-migration-v2/workspace-migration-builder-v2/builders/page-layout/workspace-migration-v2-page-layout-actions-builder.service.ts +++ b/packages/twenty-server/src/engine/workspace-manager/workspace-migration-v2/workspace-migration-builder-v2/builders/page-layout/workspace-migration-v2-page-layout-actions-builder.service.ts @@ -19,11 +19,13 @@ export class WorkspaceMigrationV2PageLayoutActionsBuilderService extends Workspa super(ALL_METADATA_NAME.pageLayout); } - protected validateFlatEntityCreation( + protected async validateFlatEntityCreation( args: FlatEntityValidationArgs, - ): 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, - ): FlatEntityValidationReturnType< - typeof ALL_METADATA_NAME.pageLayout, - 'updated' + ): Promise< + FlatEntityValidationReturnType< + typeof ALL_METADATA_NAME.pageLayout, + 'updated' + > > { const validationResult = this.flatPageLayoutValidatorService.validateFlatPageLayoutUpdate(args); diff --git a/packages/twenty-server/src/engine/workspace-manager/workspace-migration-v2/workspace-migration-builder-v2/builders/serverless-function/workspace-migration-v2-serverless-function-actions-builder.service.ts b/packages/twenty-server/src/engine/workspace-manager/workspace-migration-v2/workspace-migration-builder-v2/builders/serverless-function/workspace-migration-v2-serverless-function-actions-builder.service.ts index 3ca817f3d9..a701236d16 100644 --- a/packages/twenty-server/src/engine/workspace-manager/workspace-migration-v2/workspace-migration-builder-v2/builders/serverless-function/workspace-migration-v2-serverless-function-actions-builder.service.ts +++ b/packages/twenty-server/src/engine/workspace-manager/workspace-migration-v2/workspace-migration-builder-v2/builders/serverless-function/workspace-migration-v2-serverless-function-actions-builder.service.ts @@ -24,11 +24,11 @@ export class WorkspaceMigrationV2ServerlessFunctionActionsBuilderService extends super(ALL_METADATA_NAME.serverlessFunction); } - public validateAndBuild( + public async validateAndBuild( args: ValidateAndBuildArgs, ): ValidateAndBuildReturnType { const { to: toFlatEntityMaps } = args; - const baseResult = super.validateAndBuild(args); + const baseResult = await super.validateAndBuild(args); if (baseResult.status === 'fail') { return baseResult; diff --git a/packages/twenty-server/src/engine/workspace-manager/workspace-migration-v2/workspace-migration-builder-v2/services/workspace-entity-migration-builder-v2.service.ts b/packages/twenty-server/src/engine/workspace-manager/workspace-migration-v2/workspace-migration-builder-v2/services/workspace-entity-migration-builder-v2.service.ts index 87cf45705a..92fd9fbfea 100644 --- a/packages/twenty-server/src/engine/workspace-manager/workspace-migration-v2/workspace-migration-builder-v2/services/workspace-entity-migration-builder-v2.service.ts +++ b/packages/twenty-server/src/engine/workspace-manager/workspace-migration-v2/workspace-migration-builder-v2/services/workspace-entity-migration-builder-v2.service.ts @@ -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 = { buildOptions: WorkspaceMigrationBuilderOptions; dependencyOptimisticFlatEntityMaps: MetadataValidationRelatedFlatEntityMaps; workspaceId: string; + additionalCacheDataMaps: WorkspaceMigrationBuilderAdditionalCacheDataMaps; } & FromTo>; -export type ValidateAndBuildReturnType = - | SuccessfulFlatEntityValidateAndBuild - | FailedFlatEntityValidateAndBuild; +export type ValidateAndBuildReturnType = Promise< + SuccessfulFlatEntityValidateAndBuild | FailedFlatEntityValidateAndBuild +>; 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, - ): FlatEntityValidationReturnType; + ): + | FlatEntityValidationReturnType + | Promise>; protected abstract validateFlatEntityDeletion( args: FlatEntityValidationArgs, - ): FlatEntityValidationReturnType; + ): + | FlatEntityValidationReturnType + | Promise>; protected abstract validateFlatEntityUpdate( args: FlatEntityUpdateValidationArgs, - ): FlatEntityValidationReturnType; + ): + | FlatEntityValidationReturnType + | Promise>; }