Migrate cron, databaseEventTrigger, httpRoute triggers to serverless functions (#17488)

## Summary

Migrates trigger entities (`CronTriggerEntity`,
`DatabaseEventTriggerEntity`, `RouteTriggerEntity`) into
`ServerlessFunctionEntity` by storing trigger settings as JSONB columns
directly on the serverless function. This simplifies the architecture
since these relationships were effectively one-to-one.

## Changes

### Schema Changes
- Added three new nullable JSONB columns to `ServerlessFunctionEntity`:
  - `cronTriggerSettings` - stores cron pattern
- `databaseEventTriggerSettings` - stores event name and updated fields
filter
- `httpRouteTriggerSettings` - stores path, HTTP method, auth
requirements, and forwarded headers

### Core Logic Updates
- `CronTriggerCronJob` - now queries `ServerlessFunctionEntity` directly
instead of `CronTriggerEntity`
- `CallDatabaseEventTriggerJobsJob` - now queries
`ServerlessFunctionEntity` directly
- `RouteTriggerService` - now queries `ServerlessFunctionEntity`
directly
- `ApplicationSyncService` - extracts trigger settings from manifest and
writes to serverless function
This commit is contained in:
Charles Bochet
2026-01-27 20:54:09 +01:00
committed by GitHub
parent e1f92bd951
commit a4499d21bb
110 changed files with 439 additions and 5193 deletions
@@ -16,8 +16,6 @@ import {
import { aggregateOrchestratorActionsReport } from 'src/engine/workspace-manager/workspace-migration/utils/aggregate-orchestrator-actions-report.util';
import { WorkspaceMigrationAgentActionsBuilderService } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/agent/workspace-migration-agent-actions-builder.service';
import { WorkspaceMigrationCommandMenuItemActionsBuilderService } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/command-menu-item/workspace-migration-command-menu-item-actions-builder.service';
import { WorkspaceMigrationCronTriggerActionsBuilderService } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/cron-trigger/workspace-migration-cron-trigger-action-builder.service';
import { WorkspaceMigrationDatabaseEventTriggerActionsBuilderService } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/database-event-trigger/workspace-migration-database-event-trigger-actions-builder.service';
import { WorkspaceMigrationFieldActionsBuilderService } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/field/workspace-migration-field-actions-builder.service';
import { WorkspaceMigrationFrontComponentActionsBuilderService } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/front-component/workspace-migration-front-component-actions-builder.service';
import { WorkspaceMigrationIndexActionsBuilderService } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/index/workspace-migration-index-actions-builder.service';
@@ -28,7 +26,6 @@ import { WorkspaceMigrationPageLayoutWidgetActionsBuilderService } from 'src/eng
import { WorkspaceMigrationPageLayoutActionsBuilderService } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/page-layout/workspace-migration-page-layout-actions-builder.service';
import { WorkspaceMigrationRoleTargetActionsBuilderService } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/role-target/workspace-migration-role-target-actions-builder.service';
import { WorkspaceMigrationRoleActionsBuilderService } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/role/workspace-migration-role-actions-builder.service';
import { WorkspaceMigrationRouteTriggerActionsBuilderService } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/route-trigger/workspace-migration-route-trigger-actions-builder.service';
import { WorkspaceMigrationRowLevelPermissionPredicateGroupActionsBuilderService } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/row-level-permission-predicate-group/workspace-migration-row-level-permission-predicate-group-actions-builder.service';
import { WorkspaceMigrationRowLevelPermissionPredicateActionsBuilderService } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/row-level-permission-predicate/workspace-migration-row-level-permission-predicate-actions-builder.service';
import { WorkspaceMigrationServerlessFunctionActionsBuilderService } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/serverless-function/workspace-migration-serverless-function-actions-builder.service';
@@ -51,9 +48,6 @@ export class WorkspaceMigrationBuildOrchestratorService {
private readonly workspaceMigrationViewFilterGroupActionsBuilderService: WorkspaceMigrationViewFilterGroupActionsBuilderService,
private readonly workspaceMigrationViewGroupActionsBuilderService: WorkspaceMigrationViewGroupActionsBuilderService,
private readonly workspaceMigrationServerlessFunctionActionsBuilderService: WorkspaceMigrationServerlessFunctionActionsBuilderService,
private readonly workspaceMigrationDatabaseEventTriggerActionsBuilderService: WorkspaceMigrationDatabaseEventTriggerActionsBuilderService,
private readonly workspaceMigrationCronTriggerActionsBuilderService: WorkspaceMigrationCronTriggerActionsBuilderService,
private readonly workspaceMigrationRouteTriggerActionsBuilderService: WorkspaceMigrationRouteTriggerActionsBuilderService,
private readonly workspaceMigrationRoleTargetActionsBuilderService: WorkspaceMigrationRoleTargetActionsBuilderService,
private readonly workspaceMigrationFieldActionsBuilderService: WorkspaceMigrationFieldActionsBuilderService,
private readonly workspaceMigrationRoleActionsBuilderService: WorkspaceMigrationRoleActionsBuilderService,
@@ -151,9 +145,6 @@ export class WorkspaceMigrationBuildOrchestratorService {
flatViewMaps,
flatIndexMaps,
flatServerlessFunctionMaps,
flatDatabaseEventTriggerMaps,
flatCronTriggerMaps,
flatRouteTriggerMaps,
flatFieldMetadataMaps,
flatViewFilterMaps,
flatViewFilterGroupMaps,
@@ -591,115 +582,6 @@ export class WorkspaceMigrationBuildOrchestratorService {
}
}
if (isDefined(flatDatabaseEventTriggerMaps)) {
const {
from: fromFlatDatabaseEventTriggerMaps,
to: toFlatDatabaseEventTriggerMaps,
} = flatDatabaseEventTriggerMaps;
const databaseEventTriggerResult =
await this.workspaceMigrationDatabaseEventTriggerActionsBuilderService.validateAndBuild(
{
additionalCacheDataMaps,
from: fromFlatDatabaseEventTriggerMaps,
to: toFlatDatabaseEventTriggerMaps,
buildOptions,
dependencyOptimisticFlatEntityMaps: {
flatServerlessFunctionMaps:
optimisticAllFlatEntityMaps.flatServerlessFunctionMaps,
},
workspaceId,
},
);
this.mergeFlatEntityMapsAndRelatedFlatEntityMapsInAllFlatEntityMapsThroughMutation(
{
allFlatEntityMaps: optimisticAllFlatEntityMaps,
flatEntityMapsAndRelatedFlatEntityMaps:
databaseEventTriggerResult.optimisticFlatEntityMapsAndRelatedFlatEntityMaps,
},
);
if (databaseEventTriggerResult.status === 'fail') {
orchestratorFailureReport.databaseEventTrigger.push(
...databaseEventTriggerResult.errors,
);
} else {
orchestratorActionsReport.databaseEventTrigger =
databaseEventTriggerResult.actions;
}
}
if (isDefined(flatCronTriggerMaps)) {
const { from: fromFlatCronTriggerMaps, to: toFlatCronTriggerMaps } =
flatCronTriggerMaps;
const cronTriggerResult =
await this.workspaceMigrationCronTriggerActionsBuilderService.validateAndBuild(
{
additionalCacheDataMaps,
from: fromFlatCronTriggerMaps,
to: toFlatCronTriggerMaps,
buildOptions,
dependencyOptimisticFlatEntityMaps: {
flatServerlessFunctionMaps:
optimisticAllFlatEntityMaps.flatServerlessFunctionMaps,
},
workspaceId,
},
);
this.mergeFlatEntityMapsAndRelatedFlatEntityMapsInAllFlatEntityMapsThroughMutation(
{
allFlatEntityMaps: optimisticAllFlatEntityMaps,
flatEntityMapsAndRelatedFlatEntityMaps:
cronTriggerResult.optimisticFlatEntityMapsAndRelatedFlatEntityMaps,
},
);
if (cronTriggerResult.status === 'fail') {
orchestratorFailureReport.cronTrigger.push(...cronTriggerResult.errors);
} else {
orchestratorActionsReport.cronTrigger = cronTriggerResult.actions;
}
}
if (isDefined(flatRouteTriggerMaps)) {
const { from: fromFlatRouteTriggerMaps, to: toFlatRouteTriggerMaps } =
flatRouteTriggerMaps;
const routeTriggerResult =
await this.workspaceMigrationRouteTriggerActionsBuilderService.validateAndBuild(
{
additionalCacheDataMaps,
from: fromFlatRouteTriggerMaps,
to: toFlatRouteTriggerMaps,
buildOptions,
dependencyOptimisticFlatEntityMaps: {
flatServerlessFunctionMaps:
optimisticAllFlatEntityMaps.flatServerlessFunctionMaps,
},
workspaceId,
},
);
this.mergeFlatEntityMapsAndRelatedFlatEntityMapsInAllFlatEntityMapsThroughMutation(
{
allFlatEntityMaps: optimisticAllFlatEntityMaps,
flatEntityMapsAndRelatedFlatEntityMaps:
routeTriggerResult.optimisticFlatEntityMapsAndRelatedFlatEntityMaps,
},
);
if (routeTriggerResult.status === 'fail') {
orchestratorFailureReport.routeTrigger.push(
...routeTriggerResult.errors,
);
} else {
orchestratorActionsReport.routeTrigger = routeTriggerResult.actions;
}
}
if (isDefined(flatRoleMaps)) {
const { from: fromFlatRoleMaps, to: toFlatRoleMaps } = flatRoleMaps;