Add custom routes to migration v2 (#14846)

## Context
Add routes to migration V2
- Resolvers
- Service v2
- Builder
- Validator
- Action runner

Next PR: Add to twenty-cli to sync routes with serverless
This commit is contained in:
Weiko
2025-10-03 00:20:21 +02:00
committed by GitHub
parent dcfae3821c
commit 0b60aa4249
80 changed files with 2242 additions and 151 deletions
@@ -18,4 +18,5 @@ export const EMPTY_ORCHESTRATOR_ACTIONS_REPORT = {
serverlessFunction: emptyCreatedDeletedUpdated,
databaseEventTrigger: emptyCreatedDeletedUpdated,
cronTrigger: emptyCreatedDeletedUpdated,
routeTrigger: emptyCreatedDeletedUpdated,
} as const satisfies OrchestratorActionsReport;
@@ -13,6 +13,7 @@ export const fromWorkspaceMigrationBuilderExceptionToValidationResponseError = (
invalidServerlessFunction: 0,
invalidDatabaseEventTrigger: 0,
invalidCronTrigger: 0,
invalidRouteTrigger: 0,
invalidFieldMetadata: 0,
totalErrors: 0,
},
@@ -25,6 +26,7 @@ export const fromWorkspaceMigrationBuilderExceptionToValidationResponseError = (
serverlessFunction: [],
databaseEventTrigger: [],
cronTrigger: [],
routeTrigger: [],
},
};
@@ -17,6 +17,7 @@ import { WorkspaceMigrationV2DatabaseEventTriggerActionsBuilderService } from 's
import { WorkspaceMigrationV2FieldActionsBuilderService } from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-builder-v2/builders/field/services/workspace-migration-v2-field-actions-builder.service';
import { WorkspaceMigrationV2IndexActionsBuilderService } from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-builder-v2/builders/index/workspace-migration-v2-index-actions-builder.service';
import { WorkspaceMigrationV2ObjectActionsBuilderService } from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-builder-v2/builders/object/services/workspace-migration-v2-object-actions-builder.service';
import { WorkspaceMigrationV2RouteTriggerActionsBuilderService } from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-builder-v2/builders/route-trigger/workspace-migration-v2-route-trigger-actions-builder.service';
import { WorkspaceMigrationV2ServerlessFunctionActionsBuilderService } from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-builder-v2/builders/serverless-function/workspace-migration-v2-serverless-function-actions-builder.service';
import { WorkspaceMigrationV2ViewFieldActionsBuilderService } from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-builder-v2/builders/view-field/workspace-migration-v2-view-field-actions-builder.service';
import { WorkspaceMigrationV2ViewActionsBuilderService } from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-builder-v2/builders/view/workspace-migration-v2-view-actions-builder.service';
@@ -30,6 +31,7 @@ export class WorkspaceMigrationBuildOrchestratorService {
private readonly workspaceMigrationV2ServerlessFunctionActionsBuilderService: WorkspaceMigrationV2ServerlessFunctionActionsBuilderService,
private readonly workspaceMigrationV2DatabaseEventTriggerActionsBuilderService: WorkspaceMigrationV2DatabaseEventTriggerActionsBuilderService,
private readonly workspaceMigrationV2CronTriggerActionsBuilderService: WorkspaceMigrationV2CronTriggerActionsBuilderService,
private readonly workspaceMigrationV2RouteTriggerActionsBuilderService: WorkspaceMigrationV2RouteTriggerActionsBuilderService,
private readonly workspaceMigrationV2FieldActionsBuilderService: WorkspaceMigrationV2FieldActionsBuilderService,
) {}
@@ -84,6 +86,7 @@ export class WorkspaceMigrationBuildOrchestratorService {
serverlessFunction: [],
databaseEventTrigger: [],
cronTrigger: [],
routeTrigger: [],
fieldMetadata: [],
};
@@ -99,6 +102,7 @@ export class WorkspaceMigrationBuildOrchestratorService {
flatServerlessFunctionMaps,
flatDatabaseEventTriggerMaps,
flatCronTriggerMaps,
flatRouteTriggerMaps,
flatFieldMetadataMaps,
} = fromToAllFlatEntityMaps;
@@ -289,8 +293,11 @@ export class WorkspaceMigrationBuildOrchestratorService {
from: fromFlatDatabaseEventTriggerMaps,
to: toFlatDatabaseEventTriggerMaps,
buildOptions,
dependencyOptimisticFlatEntityMaps: {
flatServerlessFunctionMaps:
optimisticAllFlatEntityMaps.flatServerlessFunctionMaps,
},
workspaceId,
dependencyOptimisticFlatEntityMaps: undefined,
},
);
@@ -317,8 +324,11 @@ export class WorkspaceMigrationBuildOrchestratorService {
from: fromFlatCronTriggerMaps,
to: toFlatCronTriggerMaps,
buildOptions,
dependencyOptimisticFlatEntityMaps: {
flatServerlessFunctionMaps:
optimisticAllFlatEntityMaps.flatServerlessFunctionMaps,
},
workspaceId,
dependencyOptimisticFlatEntityMaps: undefined,
},
);
@@ -332,6 +342,36 @@ export class WorkspaceMigrationBuildOrchestratorService {
}
}
if (isDefined(flatRouteTriggerMaps)) {
const { from: fromFlatRouteTriggerMaps, to: toFlatRouteTriggerMaps } =
flatRouteTriggerMaps;
const routeTriggerResult =
await this.workspaceMigrationV2RouteTriggerActionsBuilderService.validateAndBuild(
{
from: fromFlatRouteTriggerMaps,
to: toFlatRouteTriggerMaps,
buildOptions,
dependencyOptimisticFlatEntityMaps: {
flatServerlessFunctionMaps:
optimisticAllFlatEntityMaps.flatServerlessFunctionMaps,
},
workspaceId,
},
);
optimisticAllFlatEntityMaps.flatRouteTriggerMaps =
routeTriggerResult.optimisticFlatEntityMaps;
if (routeTriggerResult.status === 'fail') {
orchestratorFailureReport.routeTrigger.push(
...routeTriggerResult.errors,
);
} else {
orchestratorActionsReport.routeTrigger = routeTriggerResult.actions;
}
}
const allErrors = Object.values(orchestratorFailureReport);
if (allErrors.some((report) => report.length > 0)) {
@@ -396,6 +436,12 @@ export class WorkspaceMigrationBuildOrchestratorService {
...aggregatedOrchestratorActionsReport.cronTrigger.created,
...aggregatedOrchestratorActionsReport.cronTrigger.updated,
///
// Route triggers
...orchestratorActionsReport.routeTrigger.deleted,
...orchestratorActionsReport.routeTrigger.created,
...orchestratorActionsReport.routeTrigger.updated,
///
],
workspaceId,
},
@@ -0,0 +1,6 @@
import { type AllFlatEntityMaps } from 'src/engine/core-modules/common/types/all-flat-entity-maps.type';
export type CronTriggerRelatedFlatEntityMaps = Pick<
AllFlatEntityMaps,
'flatServerlessFunctionMaps'
>;
@@ -2,6 +2,7 @@ import { Injectable } from '@nestjs/common';
import { FlatCronTrigger } from 'src/engine/metadata-modules/cron-trigger/types/flat-cron-trigger.type';
import { compareTwoFlatCronTrigger } from 'src/engine/metadata-modules/cron-trigger/utils/compare-two-flat-cron-trigger.util';
import { CronTriggerRelatedFlatEntityMaps } from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-builder-v2/builders/cron-trigger/types/cron-trigger-related-flat-entity-maps.type';
import {
FlatEntityUpdateValidationArgs,
FlatEntityValidationArgs,
@@ -19,7 +20,7 @@ export class WorkspaceMigrationV2CronTriggerActionsBuilderService extends Worksp
'cronTrigger',
FlatCronTrigger,
WorkspaceMigrationCronTriggerActionV2,
undefined
CronTriggerRelatedFlatEntityMaps
> {
constructor(
private readonly flatCronTriggerValidatorService: FlatCronTriggerValidatorService,
@@ -31,10 +32,14 @@ export class WorkspaceMigrationV2CronTriggerActionsBuilderService extends Worksp
flatEntityToValidate: flatCronTriggerToValidate,
optimisticFlatEntityMaps: optimisticFlatCronTriggerMaps,
dependencyOptimisticFlatEntityMaps,
}: FlatEntityValidationArgs<FlatCronTrigger>): Promise<
}: FlatEntityValidationArgs<
FlatCronTrigger,
CronTriggerRelatedFlatEntityMaps
>): Promise<
FlatEntityValidationReturnType<
WorkspaceMigrationCronTriggerActionV2,
FlatCronTrigger
FlatCronTrigger,
CronTriggerRelatedFlatEntityMaps
>
> {
const validationResult =
@@ -42,6 +47,7 @@ export class WorkspaceMigrationV2CronTriggerActionsBuilderService extends Worksp
{
flatCronTriggerToValidate,
optimisticFlatCronTriggerMaps,
dependencyOptimisticFlatEntityMaps,
},
);
@@ -66,16 +72,21 @@ export class WorkspaceMigrationV2CronTriggerActionsBuilderService extends Worksp
flatEntityToValidate: flatCronTriggerToValidate,
optimisticFlatEntityMaps: optimisticFlatCronTriggerMaps,
dependencyOptimisticFlatEntityMaps,
}: FlatEntityValidationArgs<FlatCronTrigger>): Promise<
}: FlatEntityValidationArgs<
FlatCronTrigger,
CronTriggerRelatedFlatEntityMaps
>): Promise<
FlatEntityValidationReturnType<
WorkspaceMigrationCronTriggerActionV2,
FlatCronTrigger
FlatCronTrigger,
CronTriggerRelatedFlatEntityMaps
>
> {
const validationResult =
this.flatCronTriggerValidatorService.validateFlatCronTriggerDeletion({
flatCronTriggerToValidate,
optimisticFlatCronTriggerMaps,
dependencyOptimisticFlatEntityMaps,
});
if (validationResult.errors.length > 0) {
@@ -99,10 +110,14 @@ export class WorkspaceMigrationV2CronTriggerActionsBuilderService extends Worksp
flatEntityUpdate: { from: fromFlatCronTrigger, to: toFlatCronTrigger },
optimisticFlatEntityMaps: optimisticFlatCronTriggerMaps,
dependencyOptimisticFlatEntityMaps,
}: FlatEntityUpdateValidationArgs<FlatCronTrigger>): Promise<
}: FlatEntityUpdateValidationArgs<
FlatCronTrigger,
CronTriggerRelatedFlatEntityMaps
>): Promise<
| FlatEntityValidationReturnType<
WorkspaceMigrationCronTriggerActionV2,
FlatCronTrigger
FlatCronTrigger,
CronTriggerRelatedFlatEntityMaps
>
| undefined
> {
@@ -119,6 +134,7 @@ export class WorkspaceMigrationV2CronTriggerActionsBuilderService extends Worksp
this.flatCronTriggerValidatorService.validateFlatCronTriggerUpdate({
flatCronTriggerToValidate: toFlatCronTrigger,
optimisticFlatCronTriggerMaps,
dependencyOptimisticFlatEntityMaps,
});
if (validationResult.errors.length > 0) {
@@ -0,0 +1,6 @@
import { type AllFlatEntityMaps } from 'src/engine/core-modules/common/types/all-flat-entity-maps.type';
export type DatabaseEventTriggerRelatedFlatEntityMaps = Pick<
AllFlatEntityMaps,
'flatServerlessFunctionMaps'
>;
@@ -2,6 +2,7 @@ import { Injectable } from '@nestjs/common';
import { FlatDatabaseEventTrigger } from 'src/engine/metadata-modules/database-event-trigger/types/flat-database-event-trigger.type';
import { compareTwoFlatDatabaseEventTrigger } from 'src/engine/metadata-modules/database-event-trigger/utils/compare-two-flat-database-event-trigger.util';
import { DatabaseEventTriggerRelatedFlatEntityMaps } from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-builder-v2/builders/database-event-trigger/types/database-event-trigger-related-flat-entity-maps.type';
import {
FlatEntityUpdateValidationArgs,
FlatEntityValidationArgs,
@@ -19,7 +20,7 @@ export class WorkspaceMigrationV2DatabaseEventTriggerActionsBuilderService exten
'databaseEventTrigger',
FlatDatabaseEventTrigger,
WorkspaceMigrationDatabaseEventTriggerActionV2,
undefined
DatabaseEventTriggerRelatedFlatEntityMaps
> {
constructor(
private readonly flatDatabaseEventTriggerValidatorService: FlatDatabaseEventTriggerValidatorService,
@@ -31,10 +32,14 @@ export class WorkspaceMigrationV2DatabaseEventTriggerActionsBuilderService exten
flatEntityToValidate: flatDatabaseEventTriggerToValidate,
optimisticFlatEntityMaps: optimisticFlatDatabaseEventTriggerMaps,
dependencyOptimisticFlatEntityMaps,
}: FlatEntityValidationArgs<FlatDatabaseEventTrigger>): Promise<
}: FlatEntityValidationArgs<
FlatDatabaseEventTrigger,
DatabaseEventTriggerRelatedFlatEntityMaps
>): Promise<
FlatEntityValidationReturnType<
WorkspaceMigrationDatabaseEventTriggerActionV2,
FlatDatabaseEventTrigger
FlatDatabaseEventTrigger,
DatabaseEventTriggerRelatedFlatEntityMaps
>
> {
const validationResult =
@@ -42,6 +47,7 @@ export class WorkspaceMigrationV2DatabaseEventTriggerActionsBuilderService exten
{
flatDatabaseEventTriggerToValidate,
optimisticFlatDatabaseEventTriggerMaps,
dependencyOptimisticFlatEntityMaps,
},
);
@@ -66,10 +72,14 @@ export class WorkspaceMigrationV2DatabaseEventTriggerActionsBuilderService exten
flatEntityToValidate: flatDatabaseEventTriggerToValidate,
optimisticFlatEntityMaps: optimisticFlatDatabaseEventTriggerMaps,
dependencyOptimisticFlatEntityMaps,
}: FlatEntityValidationArgs<FlatDatabaseEventTrigger>): Promise<
}: FlatEntityValidationArgs<
FlatDatabaseEventTrigger,
DatabaseEventTriggerRelatedFlatEntityMaps
>): Promise<
FlatEntityValidationReturnType<
WorkspaceMigrationDatabaseEventTriggerActionV2,
FlatDatabaseEventTrigger
FlatDatabaseEventTrigger,
DatabaseEventTriggerRelatedFlatEntityMaps
>
> {
const validationResult =
@@ -77,6 +87,7 @@ export class WorkspaceMigrationV2DatabaseEventTriggerActionsBuilderService exten
{
flatDatabaseEventTriggerToValidate,
optimisticFlatDatabaseEventTriggerMaps,
dependencyOptimisticFlatEntityMaps,
},
);
@@ -104,10 +115,14 @@ export class WorkspaceMigrationV2DatabaseEventTriggerActionsBuilderService exten
},
optimisticFlatEntityMaps: optimisticFlatDatabaseEventTriggerMaps,
dependencyOptimisticFlatEntityMaps,
}: FlatEntityUpdateValidationArgs<FlatDatabaseEventTrigger>): Promise<
}: FlatEntityUpdateValidationArgs<
FlatDatabaseEventTrigger,
DatabaseEventTriggerRelatedFlatEntityMaps
>): Promise<
| FlatEntityValidationReturnType<
WorkspaceMigrationDatabaseEventTriggerActionV2,
FlatDatabaseEventTrigger
FlatDatabaseEventTrigger,
DatabaseEventTriggerRelatedFlatEntityMaps
>
| undefined
> {
@@ -126,6 +141,7 @@ export class WorkspaceMigrationV2DatabaseEventTriggerActionsBuilderService exten
{
flatDatabaseEventTriggerToValidate: toFlatDatabaseEventTrigger,
optimisticFlatDatabaseEventTriggerMaps,
dependencyOptimisticFlatEntityMaps,
},
);
@@ -0,0 +1,6 @@
import { type AllFlatEntityMaps } from 'src/engine/core-modules/common/types/all-flat-entity-maps.type';
export type RouteTriggerRelatedFlatEntityMaps = Pick<
AllFlatEntityMaps,
'flatServerlessFunctionMaps'
>;
@@ -0,0 +1,159 @@
import { Injectable } from '@nestjs/common';
import { FlatRouteTrigger } from 'src/engine/metadata-modules/route-trigger/types/flat-route-trigger.type';
import { compareTwoFlatRouteTrigger } from 'src/engine/metadata-modules/route-trigger/utils/compare-two-flat-route-trigger.util';
import { RouteTriggerRelatedFlatEntityMaps } from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-builder-v2/builders/route-trigger/types/route-trigger-related-flat-entity-maps.type';
import {
FlatEntityUpdateValidationArgs,
FlatEntityValidationArgs,
FlatEntityValidationReturnType,
WorkspaceEntityMigrationBuilderV2Service,
} from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-builder-v2/services/workspace-entity-migration-builder-v2.service';
import {
UpdateRouteTriggerAction,
WorkspaceMigrationRouteTriggerActionV2,
} from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-builder-v2/types/workspace-migration-route-trigger-action-v2.type';
import { FlatRouteTriggerValidatorService } from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-builder-v2/validators/services/flat-route-trigger-validator.service';
@Injectable()
export class WorkspaceMigrationV2RouteTriggerActionsBuilderService extends WorkspaceEntityMigrationBuilderV2Service<
'routeTrigger',
FlatRouteTrigger,
WorkspaceMigrationRouteTriggerActionV2,
RouteTriggerRelatedFlatEntityMaps
> {
constructor(
private readonly flatRouteTriggerValidatorService: FlatRouteTriggerValidatorService,
) {
super('routeTrigger');
}
protected async validateFlatEntityCreation({
flatEntityToValidate: flatRouteTriggerToValidate,
optimisticFlatEntityMaps: optimisticFlatRouteTriggerMaps,
dependencyOptimisticFlatEntityMaps,
}: FlatEntityValidationArgs<
FlatRouteTrigger,
RouteTriggerRelatedFlatEntityMaps
>): Promise<
FlatEntityValidationReturnType<
WorkspaceMigrationRouteTriggerActionV2,
FlatRouteTrigger,
RouteTriggerRelatedFlatEntityMaps
>
> {
const validationResult =
await this.flatRouteTriggerValidatorService.validateFlatRouteTriggerCreation(
{
flatRouteTriggerToValidate,
optimisticFlatRouteTriggerMaps,
dependencyOptimisticFlatEntityMaps,
},
);
if (validationResult.errors.length > 0) {
return {
status: 'fail',
...validationResult,
};
}
return {
status: 'success',
action: {
type: 'create_route_trigger',
routeTrigger: flatRouteTriggerToValidate,
},
dependencyOptimisticFlatEntityMaps,
};
}
protected async validateFlatEntityDeletion({
flatEntityToValidate: flatRouteTriggerToValidate,
optimisticFlatEntityMaps: optimisticFlatRouteTriggerMaps,
dependencyOptimisticFlatEntityMaps,
}: FlatEntityValidationArgs<
FlatRouteTrigger,
RouteTriggerRelatedFlatEntityMaps
>): Promise<
FlatEntityValidationReturnType<
WorkspaceMigrationRouteTriggerActionV2,
FlatRouteTrigger,
RouteTriggerRelatedFlatEntityMaps
>
> {
const validationResult =
this.flatRouteTriggerValidatorService.validateFlatRouteTriggerDeletion({
flatRouteTriggerToValidate,
optimisticFlatRouteTriggerMaps,
dependencyOptimisticFlatEntityMaps,
});
if (validationResult.errors.length > 0) {
return {
status: 'fail',
...validationResult,
};
}
return {
status: 'success',
action: {
type: 'delete_route_trigger',
routeTriggerId: flatRouteTriggerToValidate.id,
},
dependencyOptimisticFlatEntityMaps,
};
}
protected async validateFlatEntityUpdate({
flatEntityUpdate: { from: fromFlatRouteTrigger, to: toFlatRouteTrigger },
optimisticFlatEntityMaps: optimisticFlatRouteTriggerMaps,
dependencyOptimisticFlatEntityMaps,
}: FlatEntityUpdateValidationArgs<
FlatRouteTrigger,
RouteTriggerRelatedFlatEntityMaps
>): Promise<
| FlatEntityValidationReturnType<
WorkspaceMigrationRouteTriggerActionV2,
FlatRouteTrigger,
RouteTriggerRelatedFlatEntityMaps
>
| undefined
> {
const routeTriggerUpdatedProperties = compareTwoFlatRouteTrigger({
fromFlatRouteTrigger,
toFlatRouteTrigger,
});
if (routeTriggerUpdatedProperties.length === 0) {
return undefined;
}
const validationResult =
this.flatRouteTriggerValidatorService.validateFlatRouteTriggerUpdate({
flatRouteTriggerToValidate: toFlatRouteTrigger,
optimisticFlatRouteTriggerMaps,
dependencyOptimisticFlatEntityMaps,
});
if (validationResult.errors.length > 0) {
return {
status: 'fail',
...validationResult,
};
}
const updateRouteTriggerAction: UpdateRouteTriggerAction = {
type: 'update_route_trigger',
routeTriggerId: toFlatRouteTrigger.id,
updates: routeTriggerUpdatedProperties,
};
return {
status: 'success',
action: updateRouteTriggerAction,
dependencyOptimisticFlatEntityMaps,
};
}
}
@@ -7,7 +7,7 @@ import { findFlatEntityByIdInFlatEntityMaps } from 'src/engine/core-modules/comm
import { replaceFlatEntityInFlatEntityMapsOrThrow } from 'src/engine/core-modules/common/utils/replace-flat-entity-in-flat-entity-maps-or-throw.util';
import { FlatViewField } from 'src/engine/core-modules/view/flat-view/types/flat-view-field.type';
import { compareTwoFlatViewField } from 'src/engine/core-modules/view/flat-view/utils/compare-two-flat-view-field.util';
import { ViewFieldRelatedFlatEntityMaps } from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-builder-v2/builders/types/view-field-related-flat-entity-maps.type';
import { ViewFieldRelatedFlatEntityMaps } from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-builder-v2/builders/view-field/types/view-field-related-flat-entity-maps.type';
import {
FlatEntityUpdateValidationArgs,
FlatEntityValidationArgs,
@@ -3,6 +3,7 @@ import { type WorkspaceMigrationDatabaseEventTriggerActionV2 } from 'src/engine/
import { type WorkspaceMigrationFieldActionV2 } from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-builder-v2/types/workspace-migration-field-action-v2';
import { type WorkspaceMigrationIndexActionV2 } from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-builder-v2/types/workspace-migration-index-action-v2';
import { type WorkspaceMigrationObjectActionV2 } from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-builder-v2/types/workspace-migration-object-action-v2';
import { type WorkspaceMigrationRouteTriggerActionV2 } from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-builder-v2/types/workspace-migration-route-trigger-action-v2.type';
import { type WorkspaceMigrationServerlessFunctionActionV2 } from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-builder-v2/types/workspace-migration-serverless-function-action-v2.type';
import { type WorkspaceMigrationViewActionV2 } from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-builder-v2/types/workspace-migration-view-action-v2.type';
import { type WorkspaceMigrationViewFieldActionV2 } from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-builder-v2/types/workspace-migration-view-field-action-v2.type';
@@ -15,7 +16,8 @@ export type WorkspaceMigrationActionV2 =
| WorkspaceMigrationViewFieldActionV2
| WorkspaceMigrationServerlessFunctionActionV2
| WorkspaceMigrationDatabaseEventTriggerActionV2
| WorkspaceMigrationCronTriggerActionV2;
| WorkspaceMigrationCronTriggerActionV2
| WorkspaceMigrationRouteTriggerActionV2;
export type WorkspaceMigrationActionTypeV2 = WorkspaceMigrationActionV2['type'];
export type ExtractAction<T extends WorkspaceMigrationActionTypeV2> = Extract<
@@ -0,0 +1,31 @@
import { type FlatRouteTriggerPropertiesToCompare } from 'src/engine/metadata-modules/route-trigger/types/flat-route-trigger-properties-to-compare.type';
import { type FlatRouteTrigger } from 'src/engine/metadata-modules/route-trigger/types/flat-route-trigger.type';
import { type PropertyUpdate } from 'src/engine/workspace-manager/workspace-migration-v2/types/property-update.type';
export type CreateRouteTriggerAction = {
type: 'create_route_trigger';
routeTrigger: FlatRouteTrigger;
};
export type UpdateRouteTriggerAction = {
type: 'update_route_trigger';
routeTriggerId: string;
updates: Array<
{
[P in FlatRouteTriggerPropertiesToCompare]: PropertyUpdate<
FlatRouteTrigger,
P
>;
}[FlatRouteTriggerPropertiesToCompare]
>;
};
export type DeleteRouteTriggerAction = {
type: 'delete_route_trigger';
routeTriggerId: string;
};
export type WorkspaceMigrationRouteTriggerActionV2 =
| CreateRouteTriggerAction
| UpdateRouteTriggerAction
| DeleteRouteTriggerAction;
@@ -6,11 +6,13 @@ import { isDefined } from 'twenty-shared/utils';
import { FlatEntityMaps } from 'src/engine/core-modules/common/types/flat-entity-maps.type';
import { CronTriggerExceptionCode } from 'src/engine/metadata-modules/cron-trigger/exceptions/cron-trigger.exception';
import { FlatCronTrigger } from 'src/engine/metadata-modules/cron-trigger/types/flat-cron-trigger.type';
import { CronTriggerRelatedFlatEntityMaps } from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-builder-v2/builders/cron-trigger/types/cron-trigger-related-flat-entity-maps.type';
import { FailedFlatEntityValidation } from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-builder-v2/builders/types/failed-flat-entity-validation.type';
type CronTriggerValidationArgs = {
flatCronTriggerToValidate: FlatCronTrigger;
optimisticFlatCronTriggerMaps: FlatEntityMaps<FlatCronTrigger>;
dependencyOptimisticFlatEntityMaps: CronTriggerRelatedFlatEntityMaps;
};
// TODO: validate settings integrity
@Injectable()
@@ -20,6 +22,7 @@ export class FlatCronTriggerValidatorService {
public validateFlatCronTriggerUpdate({
flatCronTriggerToValidate: updatedFlatCronTrigger,
optimisticFlatCronTriggerMaps,
dependencyOptimisticFlatEntityMaps,
}: CronTriggerValidationArgs): FailedFlatEntityValidation<FlatCronTrigger> {
const errors = [];
@@ -34,6 +37,19 @@ export class FlatCronTriggerValidatorService {
});
}
const serverlessFunction =
dependencyOptimisticFlatEntityMaps.flatServerlessFunctionMaps?.byId?.[
updatedFlatCronTrigger.serverlessFunctionId
];
if (!isDefined(serverlessFunction)) {
errors.push({
code: CronTriggerExceptionCode.SERVERLESS_FUNCTION_NOT_FOUND,
message: t`Serverless function not found`,
userFriendlyMessage: t`Serverless function not found`,
});
}
return {
type: 'update_cron_trigger',
errors,
@@ -72,6 +88,7 @@ export class FlatCronTriggerValidatorService {
public async validateFlatCronTriggerCreation({
flatCronTriggerToValidate,
optimisticFlatCronTriggerMaps,
dependencyOptimisticFlatEntityMaps,
}: CronTriggerValidationArgs): Promise<
FailedFlatEntityValidation<FlatCronTrigger>
> {
@@ -89,6 +106,19 @@ export class FlatCronTriggerValidatorService {
});
}
const serverlessFunction =
dependencyOptimisticFlatEntityMaps.flatServerlessFunctionMaps?.byId?.[
flatCronTriggerToValidate.serverlessFunctionId
];
if (!isDefined(serverlessFunction)) {
errors.push({
code: CronTriggerExceptionCode.SERVERLESS_FUNCTION_NOT_FOUND,
message: t`Serverless function not found`,
userFriendlyMessage: t`Serverless function not found`,
});
}
return {
type: 'create_cron_trigger',
errors,
@@ -6,11 +6,13 @@ import { isDefined } from 'twenty-shared/utils';
import { FlatEntityMaps } from 'src/engine/core-modules/common/types/flat-entity-maps.type';
import { DatabaseEventTriggerExceptionCode } from 'src/engine/metadata-modules/database-event-trigger/exceptions/database-event-trigger.exception';
import { FlatDatabaseEventTrigger } from 'src/engine/metadata-modules/database-event-trigger/types/flat-database-event-trigger.type';
import { DatabaseEventTriggerRelatedFlatEntityMaps } from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-builder-v2/builders/database-event-trigger/types/database-event-trigger-related-flat-entity-maps.type';
import { FailedFlatEntityValidation } from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-builder-v2/builders/types/failed-flat-entity-validation.type';
type DatabaseEventTriggerValidationArgs = {
flatDatabaseEventTriggerToValidate: FlatDatabaseEventTrigger;
optimisticFlatDatabaseEventTriggerMaps: FlatEntityMaps<FlatDatabaseEventTrigger>;
dependencyOptimisticFlatEntityMaps: DatabaseEventTriggerRelatedFlatEntityMaps;
};
// TODO: validate settings integrity
@Injectable()
@@ -20,6 +22,7 @@ export class FlatDatabaseEventTriggerValidatorService {
public validateFlatDatabaseEventTriggerUpdate({
flatDatabaseEventTriggerToValidate: updatedFlatDatabaseEventTrigger,
optimisticFlatDatabaseEventTriggerMaps,
dependencyOptimisticFlatEntityMaps,
}: DatabaseEventTriggerValidationArgs): FailedFlatEntityValidation<FlatDatabaseEventTrigger> {
const errors = [];
@@ -36,6 +39,19 @@ export class FlatDatabaseEventTriggerValidatorService {
});
}
const serverlessFunction =
dependencyOptimisticFlatEntityMaps.flatServerlessFunctionMaps?.byId?.[
updatedFlatDatabaseEventTrigger.serverlessFunctionId
];
if (!isDefined(serverlessFunction)) {
errors.push({
code: DatabaseEventTriggerExceptionCode.SERVERLESS_FUNCTION_NOT_FOUND,
message: t`Serverless function not found`,
userFriendlyMessage: t`Serverless function not found`,
});
}
return {
type: 'update_database_event_trigger',
errors,
@@ -76,6 +92,7 @@ export class FlatDatabaseEventTriggerValidatorService {
public async validateFlatDatabaseEventTriggerCreation({
flatDatabaseEventTriggerToValidate,
optimisticFlatDatabaseEventTriggerMaps,
dependencyOptimisticFlatEntityMaps,
}: DatabaseEventTriggerValidationArgs): Promise<
FailedFlatEntityValidation<FlatDatabaseEventTrigger>
> {
@@ -95,6 +112,19 @@ export class FlatDatabaseEventTriggerValidatorService {
});
}
const serverlessFunction =
dependencyOptimisticFlatEntityMaps.flatServerlessFunctionMaps?.byId?.[
flatDatabaseEventTriggerToValidate.serverlessFunctionId
];
if (!isDefined(serverlessFunction)) {
errors.push({
code: DatabaseEventTriggerExceptionCode.SERVERLESS_FUNCTION_NOT_FOUND,
message: t`Serverless function not found`,
userFriendlyMessage: t`Serverless function not found`,
});
}
return {
type: 'create_database_event_trigger',
errors,
@@ -0,0 +1,147 @@
import { Injectable } from '@nestjs/common';
import { t } from '@lingui/core/macro';
import { isDefined } from 'twenty-shared/utils';
import { FlatEntityMaps } from 'src/engine/core-modules/common/types/flat-entity-maps.type';
import { RouteTriggerExceptionCode } from 'src/engine/metadata-modules/route-trigger/exceptions/route-trigger.exception';
import { FlatRouteTrigger } from 'src/engine/metadata-modules/route-trigger/types/flat-route-trigger.type';
import { RouteTriggerRelatedFlatEntityMaps } from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-builder-v2/builders/route-trigger/types/route-trigger-related-flat-entity-maps.type';
import { FailedFlatEntityValidation } from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-builder-v2/builders/types/failed-flat-entity-validation.type';
type RouteTriggerValidationArgs = {
flatRouteTriggerToValidate: FlatRouteTrigger;
optimisticFlatRouteTriggerMaps: FlatEntityMaps<FlatRouteTrigger>;
dependencyOptimisticFlatEntityMaps: RouteTriggerRelatedFlatEntityMaps;
};
@Injectable()
export class FlatRouteTriggerValidatorService {
constructor() {}
public validateFlatRouteTriggerUpdate({
flatRouteTriggerToValidate: updatedFlatRouteTrigger,
optimisticFlatRouteTriggerMaps,
dependencyOptimisticFlatEntityMaps,
}: RouteTriggerValidationArgs): FailedFlatEntityValidation<FlatRouteTrigger> {
const errors = [];
const existingFlatRouteTrigger =
optimisticFlatRouteTriggerMaps.byId[updatedFlatRouteTrigger.id];
if (!isDefined(existingFlatRouteTrigger)) {
errors.push({
code: RouteTriggerExceptionCode.ROUTE_NOT_FOUND,
message: t`Route not found`,
userFriendlyMessage: t`Route not found`,
});
}
const serverlessFunction =
dependencyOptimisticFlatEntityMaps.flatServerlessFunctionMaps.byId[
updatedFlatRouteTrigger.serverlessFunctionId
];
if (!isDefined(serverlessFunction)) {
errors.push({
code: RouteTriggerExceptionCode.SERVERLESS_FUNCTION_NOT_FOUND,
message: t`Serverless function not found`,
userFriendlyMessage: t`Serverless function not found`,
});
}
return {
type: 'update_route_trigger',
errors,
flatEntityMinimalInformation: {
id: updatedFlatRouteTrigger.id,
},
};
}
public validateFlatRouteTriggerDeletion({
flatRouteTriggerToValidate: { id: routeTriggerIdToDelete },
optimisticFlatRouteTriggerMaps,
}: RouteTriggerValidationArgs): FailedFlatEntityValidation<FlatRouteTrigger> {
const errors = [];
const existingFlatRouteTrigger =
optimisticFlatRouteTriggerMaps.byId[routeTriggerIdToDelete];
if (!isDefined(existingFlatRouteTrigger)) {
errors.push({
code: RouteTriggerExceptionCode.ROUTE_NOT_FOUND,
message: t`Route not found`,
userFriendlyMessage: t`Route not found`,
});
}
return {
type: 'delete_route_trigger',
errors,
flatEntityMinimalInformation: {
id: routeTriggerIdToDelete,
},
};
}
public async validateFlatRouteTriggerCreation({
flatRouteTriggerToValidate,
optimisticFlatRouteTriggerMaps,
dependencyOptimisticFlatEntityMaps,
}: RouteTriggerValidationArgs): Promise<
FailedFlatEntityValidation<FlatRouteTrigger>
> {
const errors = [];
if (
isDefined(
optimisticFlatRouteTriggerMaps.byId[flatRouteTriggerToValidate.id],
)
) {
errors.push({
code: RouteTriggerExceptionCode.ROUTE_ALREADY_EXIST,
message: t`Route with same id already exists`,
userFriendlyMessage: t`Route already exists`,
});
}
const existingFlatRouteTriggers = Object.values(
optimisticFlatRouteTriggerMaps.byId,
).filter(isDefined);
if (
existingFlatRouteTriggers.find(
(flatRouteTrigger) =>
flatRouteTrigger.path === flatRouteTriggerToValidate.path,
)
) {
errors.push({
code: RouteTriggerExceptionCode.ROUTE_PATH_ALREADY_EXIST,
message: t`Route with same path already exists`,
userFriendlyMessage: t`Route path already exists`,
});
}
const serverlessFunction =
dependencyOptimisticFlatEntityMaps.flatServerlessFunctionMaps.byId[
flatRouteTriggerToValidate.serverlessFunctionId
];
if (!isDefined(serverlessFunction)) {
errors.push({
code: RouteTriggerExceptionCode.SERVERLESS_FUNCTION_NOT_FOUND,
message: t`Serverless function not found`,
userFriendlyMessage: t`Serverless function not found`,
});
}
return {
type: 'create_route_trigger',
errors,
flatEntityMinimalInformation: {
id: flatRouteTriggerToValidate.id,
},
};
}
}
@@ -8,7 +8,7 @@ import { ViewExceptionCode } from 'src/engine/core-modules/view/exceptions/view.
import { FlatViewFieldMaps } from 'src/engine/core-modules/view/flat-view/types/flat-view-field-maps.type';
import { FlatViewField } from 'src/engine/core-modules/view/flat-view/types/flat-view-field.type';
import { FailedFlatEntityValidation } from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-builder-v2/builders/types/failed-flat-entity-validation.type';
import { ViewFieldRelatedFlatEntityMaps } from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-builder-v2/builders/types/view-field-related-flat-entity-maps.type';
import { ViewFieldRelatedFlatEntityMaps } from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-builder-v2/builders/view-field/types/view-field-related-flat-entity-maps.type';
type ViewFieldValidationArgs = {
flatViewFieldToValidate: FlatViewField;
@@ -1,12 +1,13 @@
import { Module } from '@nestjs/common';
import { FlatFieldMetadataValidatorService } from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-builder-v2/validators/services/flat-field-metadata-validator.service';
import { FlatObjectMetadataValidatorService } from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-builder-v2/validators/services/flat-object-metadata-validator.service';
import { FeatureFlagModule } from 'src/engine/core-modules/feature-flag/feature-flag.module';
import { FlatFieldMetadataTypeValidatorService } from 'src/engine/metadata-modules/flat-field-metadata/services/flat-field-metadata-type-validator.service';
import { FlatCronTriggerValidatorService } from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-builder-v2/validators/services/flat-cron-trigger-validator.service';
import { FlatDatabaseEventTriggerValidatorService } from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-builder-v2/validators/services/flat-database-event-trigger-validator.service';
import { FlatFieldMetadataValidatorService } from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-builder-v2/validators/services/flat-field-metadata-validator.service';
import { FlatIndexValidatorService } from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-builder-v2/validators/services/flat-index-metadata-validator.service';
import { FlatObjectMetadataValidatorService } from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-builder-v2/validators/services/flat-object-metadata-validator.service';
import { FlatRouteTriggerValidatorService } from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-builder-v2/validators/services/flat-route-trigger-validator.service';
import { FlatServerlessFunctionValidatorService } from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-builder-v2/validators/services/flat-serverless-function-validator.service';
import { FlatViewFieldValidatorService } from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-builder-v2/validators/services/flat-view-field-validator.service';
import { FlatViewValidatorService } from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-builder-v2/validators/services/flat-view-validator.service';
@@ -23,6 +24,7 @@ import { FlatViewValidatorService } from 'src/engine/workspace-manager/workspace
FlatDatabaseEventTriggerValidatorService,
FlatCronTriggerValidatorService,
FlatFieldMetadataTypeValidatorService,
FlatRouteTriggerValidatorService,
],
exports: [
FlatViewValidatorService,
@@ -34,6 +36,7 @@ import { FlatViewValidatorService } from 'src/engine/workspace-manager/workspace
FlatDatabaseEventTriggerValidatorService,
FlatCronTriggerValidatorService,
FlatFieldMetadataTypeValidatorService,
FlatRouteTriggerValidatorService,
],
})
export class WorkspaceMigrationBuilderValidatorsModule {}
@@ -7,6 +7,7 @@ import { WorkspaceMigrationV2DatabaseEventTriggerActionsBuilderService } from 's
import { WorkspaceMigrationV2FieldActionsBuilderService } from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-builder-v2/builders/field/services/workspace-migration-v2-field-actions-builder.service';
import { WorkspaceMigrationV2IndexActionsBuilderService } from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-builder-v2/builders/index/workspace-migration-v2-index-actions-builder.service';
import { WorkspaceMigrationV2ObjectActionsBuilderService } from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-builder-v2/builders/object/services/workspace-migration-v2-object-actions-builder.service';
import { WorkspaceMigrationV2RouteTriggerActionsBuilderService } from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-builder-v2/builders/route-trigger/workspace-migration-v2-route-trigger-actions-builder.service';
import { WorkspaceMigrationV2ServerlessFunctionActionsBuilderService } from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-builder-v2/builders/serverless-function/workspace-migration-v2-serverless-function-actions-builder.service';
import { WorkspaceMigrationV2ViewFieldActionsBuilderService } from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-builder-v2/builders/view-field/workspace-migration-v2-view-field-actions-builder.service';
import { WorkspaceMigrationV2ViewActionsBuilderService } from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-builder-v2/builders/view/workspace-migration-v2-view-actions-builder.service';
@@ -24,6 +25,7 @@ import { WorkspaceMigrationBuilderValidatorsModule } from 'src/engine/workspace-
WorkspaceMigrationV2DatabaseEventTriggerActionsBuilderService,
WorkspaceMigrationV2FieldActionsBuilderService,
WorkspaceMigrationV2CronTriggerActionsBuilderService,
WorkspaceMigrationV2RouteTriggerActionsBuilderService,
],
exports: [
WorkspaceMigrationV2ViewActionsBuilderService,
@@ -34,6 +36,8 @@ import { WorkspaceMigrationBuilderValidatorsModule } from 'src/engine/workspace-
WorkspaceMigrationV2ServerlessFunctionActionsBuilderService,
WorkspaceMigrationV2DatabaseEventTriggerActionsBuilderService,
WorkspaceMigrationV2CronTriggerActionsBuilderService,
WorkspaceMigrationV2RouteTriggerActionsBuilderService,
FlatFieldMetadataTypeValidatorService,
],
})
export class WorkspaceMigrationBuilderV2Module {}
@@ -0,0 +1,31 @@
import { Injectable } from '@nestjs/common';
import { WorkspaceMigrationRunnerActionHandler } from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-runner-v2/interfaces/workspace-migration-runner-action-handler-service.interface';
import { RouteTrigger } from 'src/engine/metadata-modules/route-trigger/route-trigger.entity';
import { CreateRouteTriggerAction } from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-builder-v2/types/workspace-migration-route-trigger-action-v2.type';
import { WorkspaceMigrationActionRunnerArgs } from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-runner-v2/types/workspace-migration-action-runner-args.type';
@Injectable()
export class CreateRouteTriggerActionHandlerService extends WorkspaceMigrationRunnerActionHandler(
'create_route_trigger',
) {
constructor() {
super();
}
async executeForMetadata(
context: WorkspaceMigrationActionRunnerArgs<CreateRouteTriggerAction>,
): Promise<void> {
const { action, queryRunner, workspaceId } = context;
const { routeTrigger } = action;
const routeTriggerRepository =
queryRunner.manager.getRepository<RouteTrigger>(RouteTrigger);
await routeTriggerRepository.insert({
...routeTrigger,
workspaceId,
});
}
}
@@ -0,0 +1,31 @@
import { Injectable } from '@nestjs/common';
import { WorkspaceMigrationRunnerActionHandler } from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-runner-v2/interfaces/workspace-migration-runner-action-handler-service.interface';
import { RouteTrigger } from 'src/engine/metadata-modules/route-trigger/route-trigger.entity';
import { DeleteRouteTriggerAction } from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-builder-v2/types/workspace-migration-route-trigger-action-v2.type';
import { WorkspaceMigrationActionRunnerArgs } from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-runner-v2/types/workspace-migration-action-runner-args.type';
@Injectable()
export class DeleteRouteTriggerActionHandlerService extends WorkspaceMigrationRunnerActionHandler(
'delete_route_trigger',
) {
constructor() {
super();
}
async executeForMetadata(
context: WorkspaceMigrationActionRunnerArgs<DeleteRouteTriggerAction>,
): Promise<void> {
const { action, queryRunner, workspaceId } = context;
const { routeTriggerId } = action;
const routeTriggerRepository =
queryRunner.manager.getRepository<RouteTrigger>(RouteTrigger);
await routeTriggerRepository.delete({
id: routeTriggerId,
workspaceId,
});
}
}
@@ -0,0 +1,32 @@
import { Injectable } from '@nestjs/common';
import { WorkspaceMigrationRunnerActionHandler } from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-runner-v2/interfaces/workspace-migration-runner-action-handler-service.interface';
import { RouteTrigger } from 'src/engine/metadata-modules/route-trigger/route-trigger.entity';
import { UpdateRouteTriggerAction } from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-builder-v2/types/workspace-migration-route-trigger-action-v2.type';
import { WorkspaceMigrationActionRunnerArgs } from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-runner-v2/types/workspace-migration-action-runner-args.type';
import { fromWorkspaceMigrationUpdateActionToPartialEntity } from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-runner-v2/utils/from-workspace-migration-update-action-to-partial-field-or-object-entity.util';
@Injectable()
export class UpdateRouteTriggerActionHandlerService extends WorkspaceMigrationRunnerActionHandler(
'update_route_trigger',
) {
constructor() {
super();
}
async executeForMetadata(
context: WorkspaceMigrationActionRunnerArgs<UpdateRouteTriggerAction>,
): Promise<void> {
const { action, queryRunner } = context;
const { routeTriggerId } = action;
const routeTriggerRepository =
queryRunner.manager.getRepository<RouteTrigger>(RouteTrigger);
await routeTriggerRepository.update(
routeTriggerId,
fromWorkspaceMigrationUpdateActionToPartialEntity(action),
);
}
}
@@ -15,6 +15,9 @@ import { DeleteIndexActionHandlerService } from 'src/engine/workspace-manager/wo
import { CreateObjectActionHandlerService } from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-runner-v2/action-handlers/object/services/create-object-action-handler.service';
import { DeleteObjectActionHandlerService } from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-runner-v2/action-handlers/object/services/delete-object-action-handler.service';
import { UpdateObjectActionHandlerService } from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-runner-v2/action-handlers/object/services/update-object-action-handler.service';
import { CreateRouteTriggerActionHandlerService } from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-runner-v2/action-handlers/route-trigger/services/create-route-trigger-action-handler.service';
import { DeleteRouteTriggerActionHandlerService } from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-runner-v2/action-handlers/route-trigger/services/delete-route-trigger-action-handler.service';
import { UpdateRouteTriggerActionHandlerService } from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-runner-v2/action-handlers/route-trigger/services/update-route-trigger-action-handler.service';
import { CreateServerlessFunctionActionHandlerService } from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-runner-v2/action-handlers/serverless-function/services/create-serverless-function-action-handler.service';
import { DeleteServerlessFunctionActionHandlerService } from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-runner-v2/action-handlers/serverless-function/services/delete-serverless-function-action-handler.service';
import { UpdateServerlessFunctionActionHandlerService } from 'src/engine/workspace-manager/workspace-migration-v2/workspace-migration-runner-v2/action-handlers/serverless-function/services/update-serverless-function-action-handler.service';
@@ -58,6 +61,10 @@ import { UpdateViewActionHandlerService } from 'src/engine/workspace-manager/wor
CreateCronTriggerActionHandlerService,
DeleteCronTriggerActionHandlerService,
UpdateCronTriggerActionHandlerService,
CreateRouteTriggerActionHandlerService,
DeleteRouteTriggerActionHandlerService,
UpdateRouteTriggerActionHandlerService,
],
})
export class WorkspaceSchemaMigrationRunnerActionHandlersModule {}