diff --git a/packages/twenty-server/nest-cli.json b/packages/twenty-server/nest-cli.json index e209071e648..4fadb8b25ca 100644 --- a/packages/twenty-server/nest-cli.json +++ b/packages/twenty-server/nest-cli.json @@ -11,23 +11,23 @@ "watchAssets": true, "assets": [ { - "include": "engine/core-modules/logic-function-executor/drivers/constants/seed-project/**", + "include": "engine/core-modules/logic-function/logic-function-drivers/constants/seed-project/**", "outDir": "dist/assets" }, { - "include": "engine/core-modules/logic-function-executor/drivers/layers/*/package.json", + "include": "engine/core-modules/logic-function/logic-function-drivers/layers/*/package.json", "outDir": "dist/assets" }, { - "include": "engine/core-modules/logic-function-executor/drivers/layers/*/yarn.lock", + "include": "engine/core-modules/logic-function/logic-function-drivers/layers/*/yarn.lock", "outDir": "dist/assets" }, { - "include": "engine/core-modules/logic-function-executor/drivers/layers/engine/**", + "include": "engine/core-modules/logic-function/logic-function-drivers/layers/engine/**", "outDir": "dist/assets" }, { - "include": "engine/core-modules/logic-function-executor/drivers/constants/executor/index.mjs", + "include": "engine/core-modules/logic-function/logic-function-drivers/constants/executor/index.mjs", "outDir": "dist/assets" }, { diff --git a/packages/twenty-server/src/database/commands/cron-register-all.command.ts b/packages/twenty-server/src/database/commands/cron-register-all.command.ts index 2a119b16af4..883c5334089 100644 --- a/packages/twenty-server/src/database/commands/cron-register-all.command.ts +++ b/packages/twenty-server/src/database/commands/cron-register-all.command.ts @@ -4,7 +4,7 @@ import { Command, CommandRunner } from 'nest-commander'; import { CheckPublicDomainsValidRecordsCronCommand } from 'src/engine/core-modules/public-domain/crons/commands/check-public-domains-valid-records.cron.command'; import { CheckCustomDomainValidRecordsCronCommand } from 'src/engine/core-modules/workspace/crons/commands/check-custom-domain-valid-records.cron.command'; -import { CronTriggerCronCommand } from 'src/engine/metadata-modules/cron-trigger/crons/commands/cron-trigger.cron.command'; +import { CronTriggerCronCommand } from 'src/engine/core-modules/logic-function/logic-function-trigger/triggers/cron/cron-trigger.cron.command'; import { TrashCleanupCronCommand } from 'src/engine/trash-cleanup/commands/trash-cleanup.cron.command'; import { CleanOnboardingWorkspacesCronCommand } from 'src/engine/workspace-manager/workspace-cleaner/commands/clean-onboarding-workspaces.cron.command'; import { CleanSuspendedWorkspacesCronCommand } from 'src/engine/workspace-manager/workspace-cleaner/commands/clean-suspended-workspaces.cron.command'; diff --git a/packages/twenty-server/src/database/commands/database-command.module.ts b/packages/twenty-server/src/database/commands/database-command.module.ts index f8e9ff79bff..919b8b0cb25 100644 --- a/packages/twenty-server/src/database/commands/database-command.module.ts +++ b/packages/twenty-server/src/database/commands/database-command.module.ts @@ -14,9 +14,7 @@ import { FileModule } from 'src/engine/core-modules/file/file.module'; import { PublicDomainModule } from 'src/engine/core-modules/public-domain/public-domain.module'; import { WorkspaceEntity } from 'src/engine/core-modules/workspace/workspace.entity'; import { WorkspaceModule } from 'src/engine/core-modules/workspace/workspace.module'; -import { CronTriggerModule } from 'src/engine/metadata-modules/cron-trigger/cron-trigger.module'; import { DataSourceModule } from 'src/engine/metadata-modules/data-source/data-source.module'; -import { DatabaseEventTriggerModule } from 'src/engine/metadata-modules/database-event-trigger/database-event-trigger.module'; import { FieldMetadataModule } from 'src/engine/metadata-modules/field-metadata/field-metadata.module'; import { ObjectMetadataModule } from 'src/engine/metadata-modules/object-metadata/object-metadata.module'; import { TrashCleanupModule } from 'src/engine/trash-cleanup/trash-cleanup.module'; @@ -51,8 +49,6 @@ import { AutomatedTriggerModule } from 'src/modules/workflow/workflow-trigger/au WorkspaceCacheStorageModule, ApiKeyModule, FeatureFlagModule, - CronTriggerModule, - DatabaseEventTriggerModule, WorkspaceCleanerModule, WorkspaceMigrationModule, TrashCleanupModule, diff --git a/packages/twenty-server/src/engine/api/graphql/workspace-query-runner/listeners/entity-events-to-db.listener.ts b/packages/twenty-server/src/engine/api/graphql/workspace-query-runner/listeners/entity-events-to-db.listener.ts index 8c25e770672..a7a18fa9fb5 100644 --- a/packages/twenty-server/src/engine/api/graphql/workspace-query-runner/listeners/entity-events-to-db.listener.ts +++ b/packages/twenty-server/src/engine/api/graphql/workspace-query-runner/listeners/entity-events-to-db.listener.ts @@ -18,7 +18,7 @@ import { MessageQueue } from 'src/engine/core-modules/message-queue/message-queu import { MessageQueueService } from 'src/engine/core-modules/message-queue/services/message-queue.service'; import { CallWebhookJobsJob } from 'src/engine/metadata-modules/webhook/jobs/call-webhook-jobs.job'; import { WorkspaceEventBatchForWebhook } from 'src/engine/metadata-modules/webhook/types/workspace-event-batch-for-webhook.type'; -import { CallDatabaseEventTriggerJobsJob } from 'src/engine/metadata-modules/database-event-trigger/jobs/call-database-event-trigger-jobs.job'; +import { CallDatabaseEventTriggerJobsJob } from 'src/engine/core-modules/logic-function/logic-function-trigger/triggers/database-event/call-database-event-trigger-jobs.job'; import { WorkspaceEventBatch } from 'src/engine/workspace-event-emitter/types/workspace-event-batch.type'; import { WorkspaceEventEmitterService } from 'src/engine/workspace-event-emitter/workspace-event-emitter.service'; import { UpsertTimelineActivityFromInternalEvent } from 'src/modules/timeline/jobs/upsert-timeline-activity-from-internal-event.job'; diff --git a/packages/twenty-server/src/engine/core-modules/application/services/application-sync.service.ts b/packages/twenty-server/src/engine/core-modules/application/services/application-sync.service.ts index a67f07922b4..5cf8fd4f03a 100644 --- a/packages/twenty-server/src/engine/core-modules/application/services/application-sync.service.ts +++ b/packages/twenty-server/src/engine/core-modules/application/services/application-sync.service.ts @@ -34,7 +34,7 @@ import { FieldPermissionService } from 'src/engine/metadata-modules/object-permi import { ObjectPermissionService } from 'src/engine/metadata-modules/object-permission/object-permission.service'; import { PermissionFlagService } from 'src/engine/metadata-modules/permission-flag/permission-flag.service'; import { RoleService } from 'src/engine/metadata-modules/role/role.service'; -import { LogicFunctionLayerService } from 'src/engine/metadata-modules/logic-function-layer/logic-function-layer.service'; +import { LogicFunctionLayerService } from 'src/engine/core-modules/logic-function/logic-function-layer/services/logic-function-layer.service'; import { CronTriggerSettings, DatabaseEventTriggerSettings, diff --git a/packages/twenty-server/src/engine/core-modules/core-engine.module.ts b/packages/twenty-server/src/engine/core-modules/core-engine.module.ts index 6dd5947b58b..ed93e20056d 100644 --- a/packages/twenty-server/src/engine/core-modules/core-engine.module.ts +++ b/packages/twenty-server/src/engine/core-modules/core-engine.module.ts @@ -47,8 +47,8 @@ import { PublicDomainModule } from 'src/engine/core-modules/public-domain/public import { RedisClientModule } from 'src/engine/core-modules/redis-client/redis-client.module'; import { RedisClientService } from 'src/engine/core-modules/redis-client/redis-client.service'; import { SearchModule } from 'src/engine/core-modules/search/search.module'; -import { logicFunctionExecutorModuleFactory } from 'src/engine/core-modules/logic-function-executor/logic-function-executor-module.factory'; -import { LogicFunctionExecutorModule } from 'src/engine/core-modules/logic-function-executor/logic-function-executor.module'; +import { logicFunctionModuleFactory } from 'src/engine/core-modules/logic-function/logic-function-executor/factories/logic-function-module.factory'; +import { LogicFunctionModule } from 'src/engine/core-modules/logic-function/logic-function.module'; import { WorkspaceSSOModule } from 'src/engine/core-modules/sso/sso.module'; import { TelemetryModule } from 'src/engine/core-modules/telemetry/telemetry.module'; import { TwentyConfigModule } from 'src/engine/core-modules/twenty-config/twenty-config.module'; @@ -141,8 +141,8 @@ import { FileModule } from './file/file.module'; CacheStorageModule, AiModelsModule, AiBillingModule, - LogicFunctionExecutorModule.forRootAsync({ - useFactory: logicFunctionExecutorModuleFactory, + LogicFunctionModule.forRootAsync({ + useFactory: logicFunctionModuleFactory, inject: [TwentyConfigService, FileStorageService], }), CodeInterpreterModule.forRootAsync({ diff --git a/packages/twenty-server/src/engine/core-modules/logic-function-executor/logic-function-executor.service.ts b/packages/twenty-server/src/engine/core-modules/logic-function-executor/logic-function-executor.service.ts deleted file mode 100644 index dc54d31aa6e..00000000000 --- a/packages/twenty-server/src/engine/core-modules/logic-function-executor/logic-function-executor.service.ts +++ /dev/null @@ -1,30 +0,0 @@ -import { Inject, Injectable } from '@nestjs/common'; - -import { - LogicFunctionExecutorDriver, - type LogicFunctionExecuteParams, - type LogicFunctionExecuteResult, -} from 'src/engine/core-modules/logic-function-executor/drivers/interfaces/logic-function-executor-driver.interface'; - -import { LOGIC_FUNCTION_EXECUTOR_DRIVER } from 'src/engine/core-modules/logic-function-executor/logic-function-executor.constants'; -import { type FlatLogicFunction } from 'src/engine/metadata-modules/logic-function/types/flat-logic-function.type'; - -@Injectable() -export class LogicFunctionExecutorService - implements LogicFunctionExecutorDriver -{ - constructor( - @Inject(LOGIC_FUNCTION_EXECUTOR_DRIVER) - private driver: LogicFunctionExecutorDriver, - ) {} - - async delete(flatLogicFunction: FlatLogicFunction): Promise { - return this.driver.delete(flatLogicFunction); - } - - async execute( - params: LogicFunctionExecuteParams, - ): Promise { - return this.driver.execute(params); - } -} diff --git a/packages/twenty-server/src/engine/metadata-modules/logic-function-build/logic-function-build.module.ts b/packages/twenty-server/src/engine/core-modules/logic-function/logic-function-build/logic-function-build.module.ts similarity index 55% rename from packages/twenty-server/src/engine/metadata-modules/logic-function-build/logic-function-build.module.ts rename to packages/twenty-server/src/engine/core-modules/logic-function/logic-function-build/logic-function-build.module.ts index 420fdbf6059..d217ec54d26 100644 --- a/packages/twenty-server/src/engine/metadata-modules/logic-function-build/logic-function-build.module.ts +++ b/packages/twenty-server/src/engine/core-modules/logic-function/logic-function-build/logic-function-build.module.ts @@ -1,6 +1,6 @@ import { Module } from '@nestjs/common'; -import { LogicFunctionBuildService } from 'src/engine/metadata-modules/logic-function-build/logic-function-build.service'; +import { LogicFunctionBuildService } from 'src/engine/core-modules/logic-function/logic-function-build/services/logic-function-build.service'; @Module({ providers: [LogicFunctionBuildService], diff --git a/packages/twenty-server/src/engine/metadata-modules/logic-function-build/logic-function-build.service.ts b/packages/twenty-server/src/engine/core-modules/logic-function/logic-function-build/services/logic-function-build.service.ts similarity index 94% rename from packages/twenty-server/src/engine/metadata-modules/logic-function-build/logic-function-build.service.ts rename to packages/twenty-server/src/engine/core-modules/logic-function/logic-function-build/services/logic-function-build.service.ts index 01be8727d80..6fe0a60a220 100644 --- a/packages/twenty-server/src/engine/metadata-modules/logic-function-build/logic-function-build.service.ts +++ b/packages/twenty-server/src/engine/core-modules/logic-function/logic-function-build/services/logic-function-build.service.ts @@ -7,12 +7,12 @@ import { build } from 'esbuild'; import { FileFolder } from 'twenty-shared/types'; import { FileStorageService } from 'src/engine/core-modules/file-storage/file-storage.service'; -import { LambdaBuildDirectoryManager } from 'src/engine/core-modules/logic-function-executor/drivers/utils/lambda-build-directory-manager'; +import { LambdaBuildDirectoryManager } from 'src/engine/core-modules/logic-function/logic-function-drivers/utils/lambda-build-directory-manager'; import { type FlatLogicFunction } from 'src/engine/metadata-modules/logic-function/types/flat-logic-function.type'; import { getLogicFunctionBaseFolderPath, getRelativePathFromBase, -} from 'src/engine/metadata-modules/logic-function/utils/get-logic-function-base-folder-path.util'; +} from 'src/engine/core-modules/logic-function/logic-function-build/utils/get-logic-function-base-folder-path.util'; export type FunctionBuildParams = { flatLogicFunction: FlatLogicFunction; diff --git a/packages/twenty-server/src/engine/metadata-modules/logic-function/utils/get-logic-function-base-folder-path.util.ts b/packages/twenty-server/src/engine/core-modules/logic-function/logic-function-build/utils/get-logic-function-base-folder-path.util.ts similarity index 100% rename from packages/twenty-server/src/engine/metadata-modules/logic-function/utils/get-logic-function-base-folder-path.util.ts rename to packages/twenty-server/src/engine/core-modules/logic-function/logic-function-build/utils/get-logic-function-base-folder-path.util.ts diff --git a/packages/twenty-server/src/engine/core-modules/logic-function-executor/drivers/constants/executor/index.mjs b/packages/twenty-server/src/engine/core-modules/logic-function/logic-function-drivers/constants/executor/index.mjs similarity index 100% rename from packages/twenty-server/src/engine/core-modules/logic-function-executor/drivers/constants/executor/index.mjs rename to packages/twenty-server/src/engine/core-modules/logic-function/logic-function-drivers/constants/executor/index.mjs diff --git a/packages/twenty-server/src/engine/core-modules/logic-function-executor/drivers/constants/logic-function-executor-tmpdir-folder.ts b/packages/twenty-server/src/engine/core-modules/logic-function/logic-function-drivers/constants/logic-function-executor-tmpdir-folder.ts similarity index 100% rename from packages/twenty-server/src/engine/core-modules/logic-function-executor/drivers/constants/logic-function-executor-tmpdir-folder.ts rename to packages/twenty-server/src/engine/core-modules/logic-function/logic-function-drivers/constants/logic-function-executor-tmpdir-folder.ts diff --git a/packages/twenty-server/src/engine/core-modules/logic-function-executor/drivers/constants/seed-project-input-schema.ts b/packages/twenty-server/src/engine/core-modules/logic-function/logic-function-drivers/constants/seed-project-input-schema.ts similarity index 100% rename from packages/twenty-server/src/engine/core-modules/logic-function-executor/drivers/constants/seed-project-input-schema.ts rename to packages/twenty-server/src/engine/core-modules/logic-function/logic-function-drivers/constants/seed-project-input-schema.ts diff --git a/packages/twenty-server/src/engine/core-modules/logic-function-executor/drivers/constants/seed-project/src/index.ts b/packages/twenty-server/src/engine/core-modules/logic-function/logic-function-drivers/constants/seed-project/src/index.ts similarity index 100% rename from packages/twenty-server/src/engine/core-modules/logic-function-executor/drivers/constants/seed-project/src/index.ts rename to packages/twenty-server/src/engine/core-modules/logic-function/logic-function-drivers/constants/seed-project/src/index.ts diff --git a/packages/twenty-server/src/engine/core-modules/logic-function-executor/drivers/disabled.driver.ts b/packages/twenty-server/src/engine/core-modules/logic-function/logic-function-drivers/drivers/disabled.driver.ts similarity index 83% rename from packages/twenty-server/src/engine/core-modules/logic-function-executor/drivers/disabled.driver.ts rename to packages/twenty-server/src/engine/core-modules/logic-function/logic-function-drivers/drivers/disabled.driver.ts index a9bf7fe022e..691f80bb24b 100644 --- a/packages/twenty-server/src/engine/core-modules/logic-function-executor/drivers/disabled.driver.ts +++ b/packages/twenty-server/src/engine/core-modules/logic-function/logic-function-drivers/drivers/disabled.driver.ts @@ -1,7 +1,7 @@ import { type LogicFunctionExecutorDriver, type LogicFunctionExecuteResult, -} from 'src/engine/core-modules/logic-function-executor/drivers/interfaces/logic-function-executor-driver.interface'; +} from 'src/engine/core-modules/logic-function/logic-function-drivers/interfaces/logic-function-executor-driver.interface'; import { LogicFunctionException, diff --git a/packages/twenty-server/src/engine/core-modules/logic-function-executor/drivers/lambda.driver.ts b/packages/twenty-server/src/engine/core-modules/logic-function/logic-function-drivers/drivers/lambda.driver.ts similarity index 96% rename from packages/twenty-server/src/engine/core-modules/logic-function-executor/drivers/lambda.driver.ts rename to packages/twenty-server/src/engine/core-modules/logic-function/logic-function-drivers/drivers/lambda.driver.ts index 2e6391d774e..b113a713550 100644 --- a/packages/twenty-server/src/engine/core-modules/logic-function-executor/drivers/lambda.driver.ts +++ b/packages/twenty-server/src/engine/core-modules/logic-function/logic-function-drivers/drivers/lambda.driver.ts @@ -26,16 +26,16 @@ import { type LogicFunctionExecuteParams, type LogicFunctionExecuteResult, type LogicFunctionExecutorDriver, -} from 'src/engine/core-modules/logic-function-executor/drivers/interfaces/logic-function-executor-driver.interface'; +} from 'src/engine/core-modules/logic-function/logic-function-drivers/interfaces/logic-function-executor-driver.interface'; import { type FileStorageService } from 'src/engine/core-modules/file-storage/file-storage.service'; -import { copyAndBuildDependencies } from 'src/engine/core-modules/logic-function-executor/drivers/utils/copy-and-build-dependencies'; -import { copyExecutor } from 'src/engine/core-modules/logic-function-executor/drivers/utils/copy-executor'; -import { createZipFile } from 'src/engine/core-modules/logic-function-executor/drivers/utils/create-zip-file'; +import { copyAndBuildDependencies } from 'src/engine/core-modules/logic-function/logic-function-drivers/utils/copy-and-build-dependencies'; +import { copyExecutor } from 'src/engine/core-modules/logic-function/logic-function-drivers/utils/copy-executor'; +import { createZipFile } from 'src/engine/core-modules/logic-function/logic-function-drivers/utils/create-zip-file'; import { LambdaBuildDirectoryManager, NODE_LAYER_SUBFOLDER, -} from 'src/engine/core-modules/logic-function-executor/drivers/utils/lambda-build-directory-manager'; +} from 'src/engine/core-modules/logic-function/logic-function-drivers/utils/lambda-build-directory-manager'; import { type FlatLogicFunctionLayer } from 'src/engine/metadata-modules/logic-function-layer/types/flat-logic-function-layer.type'; import { LogicFunctionExecutionStatus } from 'src/engine/metadata-modules/logic-function/dtos/logic-function-execution-result.dto'; import { LogicFunctionRuntime } from 'src/engine/metadata-modules/logic-function/logic-function.entity'; diff --git a/packages/twenty-server/src/engine/core-modules/logic-function-executor/drivers/local.driver.ts b/packages/twenty-server/src/engine/core-modules/logic-function/logic-function-drivers/drivers/local.driver.ts similarity index 94% rename from packages/twenty-server/src/engine/core-modules/logic-function-executor/drivers/local.driver.ts rename to packages/twenty-server/src/engine/core-modules/logic-function/logic-function-drivers/drivers/local.driver.ts index 3201f7bdc6c..1b03083a055 100644 --- a/packages/twenty-server/src/engine/core-modules/logic-function-executor/drivers/local.driver.ts +++ b/packages/twenty-server/src/engine/core-modules/logic-function/logic-function-drivers/drivers/local.driver.ts @@ -8,19 +8,19 @@ import { type LogicFunctionExecutorDriver, type LogicFunctionExecuteParams, type LogicFunctionExecuteResult, -} from 'src/engine/core-modules/logic-function-executor/drivers/interfaces/logic-function-executor-driver.interface'; +} from 'src/engine/core-modules/logic-function/logic-function-drivers/interfaces/logic-function-executor-driver.interface'; import { type FileStorageService } from 'src/engine/core-modules/file-storage/file-storage.service'; -import { LOGIC_FUNCTION_EXECUTOR_TMPDIR_FOLDER } from 'src/engine/core-modules/logic-function-executor/drivers/constants/logic-function-executor-tmpdir-folder'; -import { copyAndBuildDependencies } from 'src/engine/core-modules/logic-function-executor/drivers/utils/copy-and-build-dependencies'; -import { ConsoleListener } from 'src/engine/core-modules/logic-function-executor/drivers/utils/intercept-console'; -import { LambdaBuildDirectoryManager } from 'src/engine/core-modules/logic-function-executor/drivers/utils/lambda-build-directory-manager'; +import { LOGIC_FUNCTION_EXECUTOR_TMPDIR_FOLDER } from 'src/engine/core-modules/logic-function/logic-function-drivers/constants/logic-function-executor-tmpdir-folder'; +import { copyAndBuildDependencies } from 'src/engine/core-modules/logic-function/logic-function-drivers/utils/copy-and-build-dependencies'; +import { ConsoleListener } from 'src/engine/core-modules/logic-function/logic-function-drivers/utils/intercept-console'; +import { LambdaBuildDirectoryManager } from 'src/engine/core-modules/logic-function/logic-function-drivers/utils/lambda-build-directory-manager'; import { type FlatLogicFunctionLayer } from 'src/engine/metadata-modules/logic-function-layer/types/flat-logic-function-layer.type'; import { LogicFunctionExecutionStatus } from 'src/engine/metadata-modules/logic-function/dtos/logic-function-execution-result.dto'; import { getLogicFunctionBaseFolderPath, getRelativePathFromBase, -} from 'src/engine/metadata-modules/logic-function/utils/get-logic-function-base-folder-path.util'; +} from 'src/engine/core-modules/logic-function/logic-function-build/utils/get-logic-function-base-folder-path.util'; export interface LocalDriverOptions { fileStorageService: FileStorageService; diff --git a/packages/twenty-server/src/engine/core-modules/logic-function-executor/drivers/interfaces/logic-function-executor-driver.interface.ts b/packages/twenty-server/src/engine/core-modules/logic-function/logic-function-drivers/interfaces/logic-function-executor-driver.interface.ts similarity index 100% rename from packages/twenty-server/src/engine/core-modules/logic-function-executor/drivers/interfaces/logic-function-executor-driver.interface.ts rename to packages/twenty-server/src/engine/core-modules/logic-function/logic-function-drivers/interfaces/logic-function-executor-driver.interface.ts diff --git a/packages/twenty-server/src/engine/core-modules/logic-function-executor/drivers/layers/1/package.json b/packages/twenty-server/src/engine/core-modules/logic-function/logic-function-drivers/layers/1/package.json similarity index 100% rename from packages/twenty-server/src/engine/core-modules/logic-function-executor/drivers/layers/1/package.json rename to packages/twenty-server/src/engine/core-modules/logic-function/logic-function-drivers/layers/1/package.json diff --git a/packages/twenty-server/src/engine/core-modules/logic-function-executor/drivers/layers/1/yarn.lock b/packages/twenty-server/src/engine/core-modules/logic-function/logic-function-drivers/layers/1/yarn.lock similarity index 100% rename from packages/twenty-server/src/engine/core-modules/logic-function-executor/drivers/layers/1/yarn.lock rename to packages/twenty-server/src/engine/core-modules/logic-function/logic-function-drivers/layers/1/yarn.lock diff --git a/packages/twenty-server/src/engine/core-modules/logic-function-executor/drivers/layers/engine/.yarn/releases/yarn-4.9.2.cjs b/packages/twenty-server/src/engine/core-modules/logic-function/logic-function-drivers/layers/engine/.yarn/releases/yarn-4.9.2.cjs similarity index 100% rename from packages/twenty-server/src/engine/core-modules/logic-function-executor/drivers/layers/engine/.yarn/releases/yarn-4.9.2.cjs rename to packages/twenty-server/src/engine/core-modules/logic-function/logic-function-drivers/layers/engine/.yarn/releases/yarn-4.9.2.cjs diff --git a/packages/twenty-server/src/engine/core-modules/logic-function-executor/drivers/layers/engine/.yarnrc.yml b/packages/twenty-server/src/engine/core-modules/logic-function/logic-function-drivers/layers/engine/.yarnrc.yml similarity index 100% rename from packages/twenty-server/src/engine/core-modules/logic-function-executor/drivers/layers/engine/.yarnrc.yml rename to packages/twenty-server/src/engine/core-modules/logic-function/logic-function-drivers/layers/engine/.yarnrc.yml diff --git a/packages/twenty-server/src/engine/core-modules/logic-function-executor/drivers/layers/last-layer-version.ts b/packages/twenty-server/src/engine/core-modules/logic-function/logic-function-drivers/layers/last-layer-version.ts similarity index 100% rename from packages/twenty-server/src/engine/core-modules/logic-function-executor/drivers/layers/last-layer-version.ts rename to packages/twenty-server/src/engine/core-modules/logic-function/logic-function-drivers/layers/last-layer-version.ts diff --git a/packages/twenty-server/src/engine/core-modules/logic-function-executor/logic-function-executor.module.ts b/packages/twenty-server/src/engine/core-modules/logic-function/logic-function-drivers/logic-function-drivers.module.ts similarity index 63% rename from packages/twenty-server/src/engine/core-modules/logic-function-executor/logic-function-executor.module.ts rename to packages/twenty-server/src/engine/core-modules/logic-function/logic-function-drivers/logic-function-drivers.module.ts index 108b39421f3..b2dc7024261 100644 --- a/packages/twenty-server/src/engine/core-modules/logic-function-executor/logic-function-executor.module.ts +++ b/packages/twenty-server/src/engine/core-modules/logic-function/logic-function-drivers/logic-function-drivers.module.ts @@ -1,18 +1,17 @@ -import { type DynamicModule, Global } from '@nestjs/common'; +import { type DynamicModule, Module } from '@nestjs/common'; -import { AddPackagesCommand } from 'src/engine/core-modules/logic-function-executor/commands/add-packages.command'; -import { DisabledDriver } from 'src/engine/core-modules/logic-function-executor/drivers/disabled.driver'; -import { LambdaDriver } from 'src/engine/core-modules/logic-function-executor/drivers/lambda.driver'; -import { LocalDriver } from 'src/engine/core-modules/logic-function-executor/drivers/local.driver'; -import { LOGIC_FUNCTION_EXECUTOR_DRIVER } from 'src/engine/core-modules/logic-function-executor/logic-function-executor.constants'; import { LogicFunctionExecutorDriverType, type LogicFunctionExecutorModuleAsyncOptions, -} from 'src/engine/core-modules/logic-function-executor/logic-function-executor.interface'; -import { LogicFunctionExecutorService } from 'src/engine/core-modules/logic-function-executor/logic-function-executor.service'; +} from 'src/engine/core-modules/logic-function/logic-function-executor/interfaces/logic-function-executor.interface'; -@Global() -export class LogicFunctionExecutorModule { +import { DisabledDriver } from 'src/engine/core-modules/logic-function/logic-function-drivers/drivers/disabled.driver'; +import { LambdaDriver } from 'src/engine/core-modules/logic-function/logic-function-drivers/drivers/lambda.driver'; +import { LocalDriver } from 'src/engine/core-modules/logic-function/logic-function-drivers/drivers/local.driver'; +import { LOGIC_FUNCTION_EXECUTOR_DRIVER } from 'src/engine/core-modules/logic-function/logic-function-executor/constants/logic-function-executor.constants'; + +@Module({}) +export class LogicFunctionDriversModule { static forRootAsync( options: LogicFunctionExecutorModuleAsyncOptions, ): DynamicModule { @@ -42,10 +41,10 @@ export class LogicFunctionExecutorModule { }; return { - module: LogicFunctionExecutorModule, + module: LogicFunctionDriversModule, imports: options.imports || [], - providers: [LogicFunctionExecutorService, provider, AddPackagesCommand], - exports: [LogicFunctionExecutorService], + providers: [provider], + exports: [LOGIC_FUNCTION_EXECUTOR_DRIVER], }; } } diff --git a/packages/twenty-server/src/engine/core-modules/logic-function-executor/drivers/utils/__tests__/build-env-var.spec.ts b/packages/twenty-server/src/engine/core-modules/logic-function/logic-function-drivers/utils/__tests__/build-env-var.spec.ts similarity index 98% rename from packages/twenty-server/src/engine/core-modules/logic-function-executor/drivers/utils/__tests__/build-env-var.spec.ts rename to packages/twenty-server/src/engine/core-modules/logic-function/logic-function-drivers/utils/__tests__/build-env-var.spec.ts index e0a95534dea..a8c3391491f 100644 --- a/packages/twenty-server/src/engine/core-modules/logic-function-executor/drivers/utils/__tests__/build-env-var.spec.ts +++ b/packages/twenty-server/src/engine/core-modules/logic-function/logic-function-drivers/utils/__tests__/build-env-var.spec.ts @@ -1,6 +1,6 @@ import { type FlatApplicationVariable } from 'src/engine/core-modules/applicationVariable/types/flat-application-variable.type'; import { type SecretEncryptionService } from 'src/engine/core-modules/secret-encryption/secret-encryption.service'; -import { buildEnvVar } from 'src/engine/core-modules/logic-function-executor/drivers/utils/build-env-var'; +import { buildEnvVar } from 'src/engine/core-modules/logic-function/logic-function-drivers/utils/build-env-var'; describe('buildEnvVar', () => { const mockSecretEncryptionService = { diff --git a/packages/twenty-server/src/engine/core-modules/logic-function-executor/drivers/utils/build-env-var.ts b/packages/twenty-server/src/engine/core-modules/logic-function/logic-function-drivers/utils/build-env-var.ts similarity index 100% rename from packages/twenty-server/src/engine/core-modules/logic-function-executor/drivers/utils/build-env-var.ts rename to packages/twenty-server/src/engine/core-modules/logic-function/logic-function-drivers/utils/build-env-var.ts diff --git a/packages/twenty-server/src/engine/core-modules/logic-function-executor/drivers/utils/copy-and-build-dependencies.ts b/packages/twenty-server/src/engine/core-modules/logic-function/logic-function-drivers/utils/copy-and-build-dependencies.ts similarity index 96% rename from packages/twenty-server/src/engine/core-modules/logic-function-executor/drivers/utils/copy-and-build-dependencies.ts rename to packages/twenty-server/src/engine/core-modules/logic-function/logic-function-drivers/utils/copy-and-build-dependencies.ts index 95d1564806f..3d26d474f16 100644 --- a/packages/twenty-server/src/engine/core-modules/logic-function-executor/drivers/utils/copy-and-build-dependencies.ts +++ b/packages/twenty-server/src/engine/core-modules/logic-function/logic-function-drivers/utils/copy-and-build-dependencies.ts @@ -3,7 +3,7 @@ import { promises as fs, statSync } from 'fs'; import { join } from 'path'; import { promisify } from 'util'; -import { getLayerDependenciesDirName } from 'src/engine/core-modules/logic-function-executor/drivers/utils/get-layer-dependencies-dir-name'; +import { getLayerDependenciesDirName } from 'src/engine/core-modules/logic-function/logic-function-drivers/utils/get-layer-dependencies-dir-name'; import { type FlatLogicFunctionLayer } from 'src/engine/metadata-modules/logic-function-layer/types/flat-logic-function-layer.type'; const execFilePromise = promisify(execFile); diff --git a/packages/twenty-server/src/engine/core-modules/logic-function-executor/drivers/utils/copy-executor.ts b/packages/twenty-server/src/engine/core-modules/logic-function/logic-function-drivers/utils/copy-executor.ts similarity index 82% rename from packages/twenty-server/src/engine/core-modules/logic-function-executor/drivers/utils/copy-executor.ts rename to packages/twenty-server/src/engine/core-modules/logic-function/logic-function-drivers/utils/copy-executor.ts index e838692397b..3229ae0925c 100644 --- a/packages/twenty-server/src/engine/core-modules/logic-function-executor/drivers/utils/copy-executor.ts +++ b/packages/twenty-server/src/engine/core-modules/logic-function/logic-function-drivers/utils/copy-executor.ts @@ -1,6 +1,6 @@ import { promises as fs } from 'fs'; -import { getExecutorFilePath } from 'src/engine/core-modules/logic-function-executor/drivers/utils/get-executor-file-path'; +import { getExecutorFilePath } from 'src/engine/core-modules/logic-function/logic-function-drivers/utils/get-executor-file-path'; export const copyExecutor = async (buildDirectory: string) => { await fs.mkdir(buildDirectory, { diff --git a/packages/twenty-server/src/engine/core-modules/logic-function-executor/drivers/utils/create-zip-file.ts b/packages/twenty-server/src/engine/core-modules/logic-function/logic-function-drivers/utils/create-zip-file.ts similarity index 100% rename from packages/twenty-server/src/engine/core-modules/logic-function-executor/drivers/utils/create-zip-file.ts rename to packages/twenty-server/src/engine/core-modules/logic-function/logic-function-drivers/utils/create-zip-file.ts diff --git a/packages/twenty-server/src/engine/core-modules/logic-function-executor/drivers/utils/get-executor-file-path.ts b/packages/twenty-server/src/engine/core-modules/logic-function/logic-function-drivers/utils/get-executor-file-path.ts similarity index 76% rename from packages/twenty-server/src/engine/core-modules/logic-function-executor/drivers/utils/get-executor-file-path.ts rename to packages/twenty-server/src/engine/core-modules/logic-function/logic-function-drivers/utils/get-executor-file-path.ts index 0a1eef8fe02..8b83a0e4f5a 100644 --- a/packages/twenty-server/src/engine/core-modules/logic-function-executor/drivers/utils/get-executor-file-path.ts +++ b/packages/twenty-server/src/engine/core-modules/logic-function/logic-function-drivers/utils/get-executor-file-path.ts @@ -5,7 +5,7 @@ import { ASSET_PATH } from 'src/constants/assets-path'; export const getExecutorFilePath = (): string => { const baseTypescriptProjectPath = path.join( ASSET_PATH, - `engine/core-modules/logic-function-executor/drivers/constants/executor`, + `engine/core-modules/logic-function/logic-function-drivers/constants/executor`, ); return path.resolve(__dirname, baseTypescriptProjectPath); diff --git a/packages/twenty-server/src/engine/core-modules/logic-function-executor/drivers/utils/get-last-common-layer-dependencies.ts b/packages/twenty-server/src/engine/core-modules/logic-function/logic-function-drivers/utils/get-last-common-layer-dependencies.ts similarity index 84% rename from packages/twenty-server/src/engine/core-modules/logic-function-executor/drivers/utils/get-last-common-layer-dependencies.ts rename to packages/twenty-server/src/engine/core-modules/logic-function/logic-function-drivers/utils/get-last-common-layer-dependencies.ts index 5657229a451..94a8a2841c8 100644 --- a/packages/twenty-server/src/engine/core-modules/logic-function-executor/drivers/utils/get-last-common-layer-dependencies.ts +++ b/packages/twenty-server/src/engine/core-modules/logic-function/logic-function-drivers/utils/get-last-common-layer-dependencies.ts @@ -3,8 +3,8 @@ import { join } from 'path'; import { type PackageJson } from 'twenty-shared/application'; -import { getLayerDependenciesDirName } from 'src/engine/core-modules/logic-function-executor/drivers/utils/get-layer-dependencies-dir-name'; -import { LAST_LAYER_VERSION } from 'src/engine/core-modules/logic-function-executor/drivers/layers/last-layer-version'; +import { getLayerDependenciesDirName } from 'src/engine/core-modules/logic-function/logic-function-drivers/utils/get-layer-dependencies-dir-name'; +import { LAST_LAYER_VERSION } from 'src/engine/core-modules/logic-function/logic-function-drivers/layers/last-layer-version'; export type LayerDependencies = { packageJson: PackageJson; diff --git a/packages/twenty-server/src/engine/core-modules/logic-function-executor/drivers/utils/get-layer-dependencies-dir-name.ts b/packages/twenty-server/src/engine/core-modules/logic-function/logic-function-drivers/utils/get-layer-dependencies-dir-name.ts similarity index 78% rename from packages/twenty-server/src/engine/core-modules/logic-function-executor/drivers/utils/get-layer-dependencies-dir-name.ts rename to packages/twenty-server/src/engine/core-modules/logic-function/logic-function-drivers/utils/get-layer-dependencies-dir-name.ts index 40fed485cb5..82eb0c0b0cb 100644 --- a/packages/twenty-server/src/engine/core-modules/logic-function-executor/drivers/utils/get-layer-dependencies-dir-name.ts +++ b/packages/twenty-server/src/engine/core-modules/logic-function/logic-function-drivers/utils/get-layer-dependencies-dir-name.ts @@ -7,7 +7,7 @@ export const getLayerDependenciesDirName = ( ): string => { const baseTypescriptProjectPath = path.join( ASSET_PATH, - `engine/core-modules/logic-function-executor/drivers/layers/${version}`, + `engine/core-modules/logic-function/logic-function-drivers/layers/${version}`, ); return path.resolve(__dirname, baseTypescriptProjectPath); diff --git a/packages/twenty-server/src/engine/core-modules/logic-function-executor/drivers/utils/get-seed-project-files.ts b/packages/twenty-server/src/engine/core-modules/logic-function/logic-function-drivers/utils/get-seed-project-files.ts similarity index 91% rename from packages/twenty-server/src/engine/core-modules/logic-function-executor/drivers/utils/get-seed-project-files.ts rename to packages/twenty-server/src/engine/core-modules/logic-function/logic-function-drivers/utils/get-seed-project-files.ts index 2c8f4e3a62a..ba5cc930280 100644 --- a/packages/twenty-server/src/engine/core-modules/logic-function-executor/drivers/utils/get-seed-project-files.ts +++ b/packages/twenty-server/src/engine/core-modules/logic-function/logic-function-drivers/utils/get-seed-project-files.ts @@ -32,7 +32,7 @@ const getAllFiles = async ( export const getSeedProjectFiles = (async () => { const seedProjectPath = join( ASSET_PATH, - `engine/core-modules/logic-function-executor/drivers/constants/seed-project`, + `engine/core-modules/logic-function/logic-function-drivers/constants/seed-project`, ); return await getAllFiles(seedProjectPath); diff --git a/packages/twenty-server/src/engine/core-modules/logic-function-executor/drivers/utils/intercept-console.ts b/packages/twenty-server/src/engine/core-modules/logic-function/logic-function-drivers/utils/intercept-console.ts similarity index 100% rename from packages/twenty-server/src/engine/core-modules/logic-function-executor/drivers/utils/intercept-console.ts rename to packages/twenty-server/src/engine/core-modules/logic-function/logic-function-drivers/utils/intercept-console.ts diff --git a/packages/twenty-server/src/engine/core-modules/logic-function-executor/drivers/utils/lambda-build-directory-manager.ts b/packages/twenty-server/src/engine/core-modules/logic-function/logic-function-drivers/utils/lambda-build-directory-manager.ts similarity index 89% rename from packages/twenty-server/src/engine/core-modules/logic-function-executor/drivers/utils/lambda-build-directory-manager.ts rename to packages/twenty-server/src/engine/core-modules/logic-function/logic-function-drivers/utils/lambda-build-directory-manager.ts index 8197d4380a5..9f0a60189f2 100644 --- a/packages/twenty-server/src/engine/core-modules/logic-function-executor/drivers/utils/lambda-build-directory-manager.ts +++ b/packages/twenty-server/src/engine/core-modules/logic-function/logic-function-drivers/utils/lambda-build-directory-manager.ts @@ -3,7 +3,7 @@ import * as fs from 'fs/promises'; import { v4 } from 'uuid'; -import { LOGIC_FUNCTION_EXECUTOR_TMPDIR_FOLDER } from 'src/engine/core-modules/logic-function-executor/drivers/constants/logic-function-executor-tmpdir-folder'; +import { LOGIC_FUNCTION_EXECUTOR_TMPDIR_FOLDER } from 'src/engine/core-modules/logic-function/logic-function-drivers/constants/logic-function-executor-tmpdir-folder'; export const NODE_LAYER_SUBFOLDER = 'nodejs'; diff --git a/packages/twenty-server/src/engine/core-modules/logic-function-executor/commands/add-packages.command.ts b/packages/twenty-server/src/engine/core-modules/logic-function/logic-function-executor/commands/add-packages.command.ts similarity index 93% rename from packages/twenty-server/src/engine/core-modules/logic-function-executor/commands/add-packages.command.ts rename to packages/twenty-server/src/engine/core-modules/logic-function/logic-function-executor/commands/add-packages.command.ts index 90aeae07967..a6cd9d1227b 100644 --- a/packages/twenty-server/src/engine/core-modules/logic-function-executor/commands/add-packages.command.ts +++ b/packages/twenty-server/src/engine/core-modules/logic-function/logic-function-executor/commands/add-packages.command.ts @@ -36,7 +36,7 @@ export class AddPackagesCommand extends CommandRunner { this.logger.log(''); const layersFolder = this.getAbsoluteFilePath( - `src/engine/core-modules/logic-function-executor/drivers/layers`, + `src/engine/core-modules/logic-function/logic-function-drivers/layers`, ); const currentVersion = await this.getLastLayerVersion(); @@ -108,7 +108,7 @@ export class AddPackagesCommand extends CommandRunner { private async getLastLayerVersion() { const filePath = this.getAbsoluteFilePath( - 'src/engine/core-modules/logic-function-executor/drivers/layers/last-layer-version.ts', + 'src/engine/core-modules/logic-function/logic-function-drivers/layers/last-layer-version.ts', ); const content = await fs.readFile(filePath, 'utf8'); @@ -123,7 +123,7 @@ export class AddPackagesCommand extends CommandRunner { private async updateLastLayerVersion(newVersion: number) { const filePath = this.getAbsoluteFilePath( - 'src/engine/core-modules/logic-function-executor/drivers/layers/last-layer-version.ts', + 'src/engine/core-modules/logic-function/logic-function-drivers/layers/last-layer-version.ts', ); await fs.writeFile( diff --git a/packages/twenty-server/src/engine/core-modules/logic-function-executor/logic-function-executor.constants.ts b/packages/twenty-server/src/engine/core-modules/logic-function/logic-function-executor/constants/logic-function-executor.constants.ts similarity index 100% rename from packages/twenty-server/src/engine/core-modules/logic-function-executor/logic-function-executor.constants.ts rename to packages/twenty-server/src/engine/core-modules/logic-function/logic-function-executor/constants/logic-function-executor.constants.ts diff --git a/packages/twenty-server/src/engine/core-modules/logic-function-executor/logic-function-executor-module.factory.ts b/packages/twenty-server/src/engine/core-modules/logic-function/logic-function-executor/factories/logic-function-module.factory.ts similarity index 92% rename from packages/twenty-server/src/engine/core-modules/logic-function-executor/logic-function-executor-module.factory.ts rename to packages/twenty-server/src/engine/core-modules/logic-function/logic-function-executor/factories/logic-function-module.factory.ts index 37e8fab5e45..aa5d73bb65b 100644 --- a/packages/twenty-server/src/engine/core-modules/logic-function-executor/logic-function-executor-module.factory.ts +++ b/packages/twenty-server/src/engine/core-modules/logic-function/logic-function-executor/factories/logic-function-module.factory.ts @@ -1,13 +1,14 @@ import { fromNodeProviderChain } from '@aws-sdk/credential-providers'; -import { type FileStorageService } from 'src/engine/core-modules/file-storage/file-storage.service'; import { LogicFunctionExecutorDriverType, type LogicFunctionExecutorModuleOptions, -} from 'src/engine/core-modules/logic-function-executor/logic-function-executor.interface'; +} from 'src/engine/core-modules/logic-function/logic-function-executor/interfaces/logic-function-executor.interface'; + +import { type FileStorageService } from 'src/engine/core-modules/file-storage/file-storage.service'; import { type TwentyConfigService } from 'src/engine/core-modules/twenty-config/twenty-config.service'; -export const logicFunctionExecutorModuleFactory = async ( +export const logicFunctionModuleFactory = async ( twentyConfigService: TwentyConfigService, fileStorageService: FileStorageService, ): Promise => { diff --git a/packages/twenty-server/src/engine/core-modules/logic-function-executor/logic-function-executor.interface.ts b/packages/twenty-server/src/engine/core-modules/logic-function/logic-function-executor/interfaces/logic-function-executor.interface.ts similarity index 90% rename from packages/twenty-server/src/engine/core-modules/logic-function-executor/logic-function-executor.interface.ts rename to packages/twenty-server/src/engine/core-modules/logic-function/logic-function-executor/interfaces/logic-function-executor.interface.ts index 4fafb1232fd..ecdf3541b04 100644 --- a/packages/twenty-server/src/engine/core-modules/logic-function-executor/logic-function-executor.interface.ts +++ b/packages/twenty-server/src/engine/core-modules/logic-function/logic-function-executor/interfaces/logic-function-executor.interface.ts @@ -1,7 +1,7 @@ import { type FactoryProvider, type ModuleMetadata } from '@nestjs/common'; -import { type LambdaDriverOptions } from 'src/engine/core-modules/logic-function-executor/drivers/lambda.driver'; -import { type LocalDriverOptions } from 'src/engine/core-modules/logic-function-executor/drivers/local.driver'; +import { type LambdaDriverOptions } from 'src/engine/core-modules/logic-function/logic-function-drivers/drivers/lambda.driver'; +import { type LocalDriverOptions } from 'src/engine/core-modules/logic-function/logic-function-drivers/drivers/local.driver'; export enum LogicFunctionExecutorDriverType { DISABLED = 'DISABLED', diff --git a/packages/twenty-server/src/engine/core-modules/logic-function/logic-function-executor/logic-function-executor.module.ts b/packages/twenty-server/src/engine/core-modules/logic-function/logic-function-executor/logic-function-executor.module.ts new file mode 100644 index 00000000000..3e0d900f691 --- /dev/null +++ b/packages/twenty-server/src/engine/core-modules/logic-function/logic-function-executor/logic-function-executor.module.ts @@ -0,0 +1,26 @@ +import { Module } from '@nestjs/common'; + +import { AuditModule } from 'src/engine/core-modules/audit/audit.module'; +import { TokenModule } from 'src/engine/core-modules/auth/token/token.module'; +import { LogicFunctionBuildModule } from 'src/engine/core-modules/logic-function/logic-function-build/logic-function-build.module'; +import { AddPackagesCommand } from 'src/engine/core-modules/logic-function/logic-function-executor/commands/add-packages.command'; +import { LogicFunctionExecutorService } from 'src/engine/core-modules/logic-function/logic-function-executor/services/logic-function-executor.service'; +import { SecretEncryptionModule } from 'src/engine/core-modules/secret-encryption/secret-encryption.module'; +import { ThrottlerModule } from 'src/engine/core-modules/throttler/throttler.module'; +import { SubscriptionsModule } from 'src/engine/subscriptions/subscriptions.module'; +import { WorkspaceCacheModule } from 'src/engine/workspace-cache/workspace-cache.module'; + +@Module({ + imports: [ + ThrottlerModule, + AuditModule, + TokenModule, + SecretEncryptionModule, + SubscriptionsModule, + WorkspaceCacheModule, + LogicFunctionBuildModule, + ], + providers: [LogicFunctionExecutorService, AddPackagesCommand], + exports: [LogicFunctionExecutorService], +}) +export class LogicFunctionExecutorModule {} diff --git a/packages/twenty-server/src/engine/core-modules/logic-function/logic-function-executor/services/logic-function-executor.service.ts b/packages/twenty-server/src/engine/core-modules/logic-function/logic-function-executor/services/logic-function-executor.service.ts new file mode 100644 index 00000000000..8109029c564 --- /dev/null +++ b/packages/twenty-server/src/engine/core-modules/logic-function/logic-function-executor/services/logic-function-executor.service.ts @@ -0,0 +1,261 @@ +import { Inject, Injectable } from '@nestjs/common'; + +import { + DEFAULT_API_KEY_NAME, + DEFAULT_API_URL_NAME, +} from 'twenty-shared/application'; +import { isDefined } from 'twenty-shared/utils'; + +import { + LogicFunctionExecutorDriver, + type LogicFunctionExecuteParams, + type LogicFunctionExecuteResult, +} from 'src/engine/core-modules/logic-function/logic-function-drivers/interfaces/logic-function-executor-driver.interface'; + +import { AuditService } from 'src/engine/core-modules/audit/services/audit.service'; +import { LOGIC_FUNCTION_EXECUTED_EVENT } from 'src/engine/core-modules/audit/utils/events/workspace-event/logic-function/logic-function-executed'; +import { ApplicationTokenService } from 'src/engine/core-modules/auth/token/services/application-token.service'; +import { LogicFunctionBuildService } from 'src/engine/core-modules/logic-function/logic-function-build/services/logic-function-build.service'; +import { buildEnvVar } from 'src/engine/core-modules/logic-function/logic-function-drivers/utils/build-env-var'; +import { LOGIC_FUNCTION_EXECUTOR_DRIVER } from 'src/engine/core-modules/logic-function/logic-function-executor/constants/logic-function-executor.constants'; +import { SecretEncryptionService } from 'src/engine/core-modules/secret-encryption/secret-encryption.service'; +import { ThrottlerService } from 'src/engine/core-modules/throttler/throttler.service'; +import { TwentyConfigService } from 'src/engine/core-modules/twenty-config/twenty-config.service'; +import { findFlatEntityByIdInFlatEntityMaps } from 'src/engine/metadata-modules/flat-entity/utils/find-flat-entity-by-id-in-flat-entity-maps.util'; +import { type FlatLogicFunction } from 'src/engine/metadata-modules/logic-function/types/flat-logic-function.type'; +import { SubscriptionChannel } from 'src/engine/subscriptions/enums/subscription-channel.enum'; +import { SubscriptionService } from 'src/engine/subscriptions/subscription.service'; +import { WorkspaceCacheService } from 'src/engine/workspace-cache/services/workspace-cache.service'; +import { cleanServerUrl } from 'src/utils/clean-server-url'; + +const MIN_TOKEN_EXPIRATION_IN_SECONDS = 5; + +export class LogicFunctionExecutionException extends Error { + constructor( + message: string, + public readonly code: LogicFunctionExecutionExceptionCode, + ) { + super(message); + this.name = 'LogicFunctionExecutionException'; + } +} + +export enum LogicFunctionExecutionExceptionCode { + LOGIC_FUNCTION_NOT_FOUND = 'LOGIC_FUNCTION_NOT_FOUND', + RATE_LIMIT_EXCEEDED = 'RATE_LIMIT_EXCEEDED', +} + +@Injectable() +export class LogicFunctionExecutorService + implements LogicFunctionExecutorDriver +{ + constructor( + @Inject(LOGIC_FUNCTION_EXECUTOR_DRIVER) + private driver: LogicFunctionExecutorDriver, + private readonly throttlerService: ThrottlerService, + private readonly twentyConfigService: TwentyConfigService, + private readonly workspaceCacheService: WorkspaceCacheService, + private readonly applicationTokenService: ApplicationTokenService, + private readonly secretEncryptionService: SecretEncryptionService, + private readonly functionBuildService: LogicFunctionBuildService, + private readonly subscriptionService: SubscriptionService, + private readonly auditService: AuditService, + ) {} + + async delete(flatLogicFunction: FlatLogicFunction): Promise { + return this.driver.delete(flatLogicFunction); + } + + async execute( + params: LogicFunctionExecuteParams, + ): Promise { + return this.driver.execute(params); + } + + async executeOneLogicFunction({ + id, + workspaceId, + payload, + }: { + id: string; + workspaceId: string; + payload: object; + }): Promise { + await this.throttleExecution(workspaceId); + + const { + flatLogicFunctionMaps, + flatApplicationMaps, + applicationVariableMaps, + logicFunctionLayerMaps, + } = await this.workspaceCacheService.getOrRecompute(workspaceId, [ + 'flatLogicFunctionMaps', + 'flatApplicationMaps', + 'applicationVariableMaps', + 'logicFunctionLayerMaps', + ]); + + const flatLogicFunction = findFlatEntityByIdInFlatEntityMaps({ + flatEntityId: id, + flatEntityMaps: flatLogicFunctionMaps, + }); + + if ( + !isDefined(flatLogicFunction) || + isDefined(flatLogicFunction.deletedAt) + ) { + throw new LogicFunctionExecutionException( + `Logic function with id ${id} not found`, + LogicFunctionExecutionExceptionCode.LOGIC_FUNCTION_NOT_FOUND, + ); + } + + const flatLogicFunctionLayer = + logicFunctionLayerMaps.byId[flatLogicFunction.logicFunctionLayerId]; + + if (!isDefined(flatLogicFunctionLayer)) { + throw new LogicFunctionExecutionException( + `Logic function layer with id ${flatLogicFunction.logicFunctionLayerId} not found`, + LogicFunctionExecutionExceptionCode.LOGIC_FUNCTION_NOT_FOUND, + ); + } + + const applicationAccessToken = isDefined(flatLogicFunction.applicationId) + ? await this.applicationTokenService.generateApplicationToken({ + workspaceId, + applicationId: flatLogicFunction.applicationId, + expiresInSeconds: Math.max( + flatLogicFunction.timeoutSeconds, + MIN_TOKEN_EXPIRATION_IN_SECONDS, + ), + }) + : undefined; + + const baseUrl = cleanServerUrl(this.twentyConfigService.get('SERVER_URL')); + + const flatApplicationVariables = isDefined(flatLogicFunction.applicationId) + ? (applicationVariableMaps.byApplicationId[ + flatLogicFunction.applicationId + ] ?? []) + : []; + + const envVariables = { + ...(isDefined(baseUrl) + ? { + [DEFAULT_API_URL_NAME]: baseUrl, + } + : {}), + ...(isDefined(applicationAccessToken) + ? { + [DEFAULT_API_KEY_NAME]: applicationAccessToken.token, + } + : {}), + ...buildEnvVar(flatApplicationVariables, this.secretEncryptionService), + }; + + const applicationUniversalIdentifier = isDefined( + flatLogicFunction.applicationId, + ) + ? flatApplicationMaps.byId[flatLogicFunction.applicationId] + ?.universalIdentifier + : undefined; + + if (!isDefined(applicationUniversalIdentifier)) { + throw new LogicFunctionExecutionException( + `Application universal identifier not found for logic function ${flatLogicFunction.id}`, + LogicFunctionExecutionExceptionCode.LOGIC_FUNCTION_NOT_FOUND, + ); + } + + if ( + !(await this.functionBuildService.isBuilt({ + flatLogicFunction, + applicationUniversalIdentifier, + })) + ) { + await this.functionBuildService.buildAndUpload({ + flatLogicFunction, + applicationUniversalIdentifier, + }); + } + + const resultLogicFunction = await this.callWithTimeout({ + callback: () => + this.execute({ + flatLogicFunction, + flatLogicFunctionLayer, + applicationUniversalIdentifier, + payload, + env: envVariables, + }), + timeoutMs: flatLogicFunction.timeoutSeconds * 1000, + }); + + if (this.twentyConfigService.get('LOGIC_FUNCTION_LOGS_ENABLED')) { + /* eslint-disable no-console */ + console.log(resultLogicFunction.logs); + } + + await this.subscriptionService.publish({ + channel: SubscriptionChannel.LOGIC_FUNCTION_LOGS_CHANNEL, + workspaceId, + payload: { + logicFunctionLogs: { + logs: resultLogicFunction.logs, + id: flatLogicFunction.id, + name: flatLogicFunction.name, + universalIdentifier: flatLogicFunction.universalIdentifier, + applicationId: flatLogicFunction.applicationId, + applicationUniversalIdentifier, + }, + }, + }); + + this.auditService + .createContext({ + workspaceId, + }) + .insertWorkspaceEvent(LOGIC_FUNCTION_EXECUTED_EVENT, { + duration: resultLogicFunction.duration, + status: resultLogicFunction.status, + ...(resultLogicFunction.error && { + errorType: resultLogicFunction.error.errorType, + }), + functionId: flatLogicFunction.id, + functionName: flatLogicFunction.name, + }); + + return resultLogicFunction; + } + + private async throttleExecution(workspaceId: string) { + try { + await this.throttlerService.tokenBucketThrottleOrThrow( + `${workspaceId}-logic-function-execution`, + 1, + this.twentyConfigService.get('LOGIC_FUNCTION_EXEC_THROTTLE_LIMIT'), + this.twentyConfigService.get('LOGIC_FUNCTION_EXEC_THROTTLE_TTL'), + ); + } catch { + throw new LogicFunctionExecutionException( + 'Logic function execution rate limit exceeded', + LogicFunctionExecutionExceptionCode.RATE_LIMIT_EXCEEDED, + ); + } + } + + private async callWithTimeout({ + callback, + timeoutMs, + }: { + callback: () => Promise; + timeoutMs: number; + }): Promise { + return Promise.race([ + callback(), + new Promise((_, reject) => + setTimeout(() => reject(new Error('Execution timed out')), timeoutMs), + ), + ]); + } +} diff --git a/packages/twenty-server/src/engine/core-modules/logic-function/logic-function-layer/logic-function-layer.module.ts b/packages/twenty-server/src/engine/core-modules/logic-function/logic-function-layer/logic-function-layer.module.ts new file mode 100644 index 00000000000..27afc7bf098 --- /dev/null +++ b/packages/twenty-server/src/engine/core-modules/logic-function/logic-function-layer/logic-function-layer.module.ts @@ -0,0 +1,16 @@ +import { Module } from '@nestjs/common'; +import { TypeOrmModule } from '@nestjs/typeorm'; + +import { LogicFunctionLayerService } from 'src/engine/core-modules/logic-function/logic-function-layer/services/logic-function-layer.service'; +import { LogicFunctionLayerEntity } from 'src/engine/metadata-modules/logic-function-layer/logic-function-layer.entity'; +import { WorkspaceCacheModule } from 'src/engine/workspace-cache/workspace-cache.module'; + +@Module({ + imports: [ + TypeOrmModule.forFeature([LogicFunctionLayerEntity]), + WorkspaceCacheModule, + ], + providers: [LogicFunctionLayerService], + exports: [LogicFunctionLayerService], +}) +export class CoreLogicFunctionLayerModule {} diff --git a/packages/twenty-server/src/engine/metadata-modules/logic-function-layer/logic-function-layer.service.ts b/packages/twenty-server/src/engine/core-modules/logic-function/logic-function-layer/services/logic-function-layer.service.ts similarity index 96% rename from packages/twenty-server/src/engine/metadata-modules/logic-function-layer/logic-function-layer.service.ts rename to packages/twenty-server/src/engine/core-modules/logic-function/logic-function-layer/services/logic-function-layer.service.ts index ac154dbde27..f056833a2c2 100644 --- a/packages/twenty-server/src/engine/metadata-modules/logic-function-layer/logic-function-layer.service.ts +++ b/packages/twenty-server/src/engine/core-modules/logic-function/logic-function-layer/services/logic-function-layer.service.ts @@ -8,7 +8,7 @@ import type { QueryDeepPartialEntity } from 'typeorm/query-builder/QueryPartialE import { LogicFunctionLayerEntity } from 'src/engine/metadata-modules/logic-function-layer/logic-function-layer.entity'; import { CreateLogicFunctionLayerInput } from 'src/engine/metadata-modules/logic-function-layer/dtos/create-logic-function-layer.input'; -import { getLastCommonLayerDependencies } from 'src/engine/core-modules/logic-function-executor/drivers/utils/get-last-common-layer-dependencies'; +import { getLastCommonLayerDependencies } from 'src/engine/core-modules/logic-function/logic-function-drivers/utils/get-last-common-layer-dependencies'; import { logicFunctionCreateHash } from 'src/engine/metadata-modules/logic-function/utils/logic-function-create-hash.utils'; import { WorkspaceCacheService } from 'src/engine/workspace-cache/services/workspace-cache.service'; diff --git a/packages/twenty-server/src/engine/metadata-modules/logic-function/jobs/logic-function-trigger.job.ts b/packages/twenty-server/src/engine/core-modules/logic-function/logic-function-trigger/jobs/logic-function-trigger.job.ts similarity index 70% rename from packages/twenty-server/src/engine/metadata-modules/logic-function/jobs/logic-function-trigger.job.ts rename to packages/twenty-server/src/engine/core-modules/logic-function/logic-function-trigger/jobs/logic-function-trigger.job.ts index 5efc6d24bd8..4f412385e83 100644 --- a/packages/twenty-server/src/engine/metadata-modules/logic-function/jobs/logic-function-trigger.job.ts +++ b/packages/twenty-server/src/engine/core-modules/logic-function/logic-function-trigger/jobs/logic-function-trigger.job.ts @@ -3,7 +3,7 @@ import { Scope } from '@nestjs/common'; import { Process } from 'src/engine/core-modules/message-queue/decorators/process.decorator'; import { Processor } from 'src/engine/core-modules/message-queue/decorators/processor.decorator'; import { MessageQueue } from 'src/engine/core-modules/message-queue/message-queue.constants'; -import { LogicFunctionService } from 'src/engine/metadata-modules/logic-function/logic-function.service'; +import { LogicFunctionExecutorService } from 'src/engine/core-modules/logic-function/logic-function-executor/services/logic-function-executor.service'; export type LogicFunctionTriggerJobData = { logicFunctionId: string; @@ -16,17 +16,19 @@ export type LogicFunctionTriggerJobData = { scope: Scope.REQUEST, }) export class LogicFunctionTriggerJob { - constructor(private readonly logicFunctionService: LogicFunctionService) {} + constructor( + private readonly logicFunctionExecutorService: LogicFunctionExecutorService, + ) {} @Process(LogicFunctionTriggerJob.name) async handle(logicFunctionPayloads: LogicFunctionTriggerJobData[]) { await Promise.all( logicFunctionPayloads.map( async (logicFunctionPayload) => - await this.logicFunctionService.executeOneLogicFunction({ + await this.logicFunctionExecutorService.executeOneLogicFunction({ id: logicFunctionPayload.logicFunctionId, workspaceId: logicFunctionPayload.workspaceId, - payload: logicFunctionPayload.payload || {}, + payload: logicFunctionPayload.payload ?? {}, }), ), ); diff --git a/packages/twenty-server/src/engine/core-modules/logic-function/logic-function-trigger/logic-function-trigger.module.ts b/packages/twenty-server/src/engine/core-modules/logic-function/logic-function-trigger/logic-function-trigger.module.ts new file mode 100644 index 00000000000..e90d4577765 --- /dev/null +++ b/packages/twenty-server/src/engine/core-modules/logic-function/logic-function-trigger/logic-function-trigger.module.ts @@ -0,0 +1,29 @@ +import { Module } from '@nestjs/common'; +import { TypeOrmModule } from '@nestjs/typeorm'; + +import { TokenModule } from 'src/engine/core-modules/auth/token/token.module'; +import { WorkspaceDomainsModule } from 'src/engine/core-modules/domain/workspace-domains/workspace-domains.module'; +import { LogicFunctionTriggerJob } from 'src/engine/core-modules/logic-function/logic-function-trigger/jobs/logic-function-trigger.job'; +import { CronTriggerCronCommand } from 'src/engine/core-modules/logic-function/logic-function-trigger/triggers/cron/cron-trigger.cron.command'; +import { CronTriggerCronJob } from 'src/engine/core-modules/logic-function/logic-function-trigger/triggers/cron/cron-trigger.cron.job'; +import { CallDatabaseEventTriggerJobsJob } from 'src/engine/core-modules/logic-function/logic-function-trigger/triggers/database-event/call-database-event-trigger-jobs.job'; +import { RouteTriggerService } from 'src/engine/core-modules/logic-function/logic-function-trigger/triggers/route/route-trigger.service'; +import { WorkspaceEntity } from 'src/engine/core-modules/workspace/workspace.entity'; +import { LogicFunctionEntity } from 'src/engine/metadata-modules/logic-function/logic-function.entity'; + +@Module({ + imports: [ + TypeOrmModule.forFeature([LogicFunctionEntity, WorkspaceEntity]), + TokenModule, + WorkspaceDomainsModule, + ], + providers: [ + LogicFunctionTriggerJob, + CronTriggerCronJob, + CronTriggerCronCommand, + CallDatabaseEventTriggerJobsJob, + RouteTriggerService, + ], + exports: [CronTriggerCronCommand, RouteTriggerService], +}) +export class LogicFunctionTriggerModule {} diff --git a/packages/twenty-server/src/engine/metadata-modules/cron-trigger/crons/commands/cron-trigger.cron.command.ts b/packages/twenty-server/src/engine/core-modules/logic-function/logic-function-trigger/triggers/cron/cron-trigger.cron.command.ts similarity index 90% rename from packages/twenty-server/src/engine/metadata-modules/cron-trigger/crons/commands/cron-trigger.cron.command.ts rename to packages/twenty-server/src/engine/core-modules/logic-function/logic-function-trigger/triggers/cron/cron-trigger.cron.command.ts index 1a327776060..afc2a46f37b 100644 --- a/packages/twenty-server/src/engine/metadata-modules/cron-trigger/crons/commands/cron-trigger.cron.command.ts +++ b/packages/twenty-server/src/engine/core-modules/logic-function/logic-function-trigger/triggers/cron/cron-trigger.cron.command.ts @@ -6,7 +6,8 @@ import { MessageQueueService } from 'src/engine/core-modules/message-queue/servi import { CRON_TRIGGER_CRON_PATTERN, CronTriggerCronJob, -} from 'src/engine/metadata-modules/cron-trigger/crons/jobs/cron-trigger.cron.job'; +} from 'src/engine/core-modules/logic-function/logic-function-trigger/triggers/cron/cron-trigger.cron.job'; + @Command({ name: 'cron:trigger:start-cron-trigger', description: 'Starts a cron job to trigger cron triggered logic functions', diff --git a/packages/twenty-server/src/engine/metadata-modules/cron-trigger/crons/jobs/cron-trigger.cron.job.ts b/packages/twenty-server/src/engine/core-modules/logic-function/logic-function-trigger/triggers/cron/cron-trigger.cron.job.ts similarity index 96% rename from packages/twenty-server/src/engine/metadata-modules/cron-trigger/crons/jobs/cron-trigger.cron.job.ts rename to packages/twenty-server/src/engine/core-modules/logic-function/logic-function-trigger/triggers/cron/cron-trigger.cron.job.ts index adf90908e20..3acae7f9d52 100644 --- a/packages/twenty-server/src/engine/metadata-modules/cron-trigger/crons/jobs/cron-trigger.cron.job.ts +++ b/packages/twenty-server/src/engine/core-modules/logic-function/logic-function-trigger/triggers/cron/cron-trigger.cron.job.ts @@ -14,7 +14,7 @@ import { WorkspaceEntity } from 'src/engine/core-modules/workspace/workspace.ent import { LogicFunctionTriggerJob, LogicFunctionTriggerJobData, -} from 'src/engine/metadata-modules/logic-function/jobs/logic-function-trigger.job'; +} from 'src/engine/core-modules/logic-function/logic-function-trigger/jobs/logic-function-trigger.job'; import { LogicFunctionEntity } from 'src/engine/metadata-modules/logic-function/logic-function.entity'; import { shouldRunNow } from 'src/utils/should-run-now.utils'; diff --git a/packages/twenty-server/src/engine/metadata-modules/database-event-trigger/jobs/call-database-event-trigger-jobs.job.ts b/packages/twenty-server/src/engine/core-modules/logic-function/logic-function-trigger/triggers/database-event/call-database-event-trigger-jobs.job.ts similarity index 91% rename from packages/twenty-server/src/engine/metadata-modules/database-event-trigger/jobs/call-database-event-trigger-jobs.job.ts rename to packages/twenty-server/src/engine/core-modules/logic-function/logic-function-trigger/triggers/database-event/call-database-event-trigger-jobs.job.ts index 9dce16e1f74..b8e89502cd3 100644 --- a/packages/twenty-server/src/engine/metadata-modules/database-event-trigger/jobs/call-database-event-trigger-jobs.job.ts +++ b/packages/twenty-server/src/engine/core-modules/logic-function/logic-function-trigger/triggers/database-event/call-database-event-trigger-jobs.job.ts @@ -11,11 +11,11 @@ import { Process } from 'src/engine/core-modules/message-queue/decorators/proces import { Processor } from 'src/engine/core-modules/message-queue/decorators/processor.decorator'; import { MessageQueue } from 'src/engine/core-modules/message-queue/message-queue.constants'; import { MessageQueueService } from 'src/engine/core-modules/message-queue/services/message-queue.service'; -import { transformEventBatchToEventPayloads } from 'src/engine/metadata-modules/database-event-trigger/utils/transform-event-batch-to-event-payloads'; +import { transformEventBatchToEventPayloads } from 'src/engine/core-modules/logic-function/logic-function-trigger/triggers/database-event/utils/transform-event-batch-to-event-payloads'; import { LogicFunctionTriggerJob, LogicFunctionTriggerJobData, -} from 'src/engine/metadata-modules/logic-function/jobs/logic-function-trigger.job'; +} from 'src/engine/core-modules/logic-function/logic-function-trigger/jobs/logic-function-trigger.job'; import { LogicFunctionEntity } from 'src/engine/metadata-modules/logic-function/logic-function.entity'; import { WorkspaceEventBatch } from 'src/engine/workspace-event-emitter/types/workspace-event-batch.type'; diff --git a/packages/twenty-server/src/engine/metadata-modules/database-event-trigger/utils/__tests__/transform-event-batch-to-event-payloads.spec.ts b/packages/twenty-server/src/engine/core-modules/logic-function/logic-function-trigger/triggers/database-event/utils/__tests__/transform-event-batch-to-event-payloads.spec.ts similarity index 98% rename from packages/twenty-server/src/engine/metadata-modules/database-event-trigger/utils/__tests__/transform-event-batch-to-event-payloads.spec.ts rename to packages/twenty-server/src/engine/core-modules/logic-function/logic-function-trigger/triggers/database-event/utils/__tests__/transform-event-batch-to-event-payloads.spec.ts index 738e9591f2e..6884bb783b9 100644 --- a/packages/twenty-server/src/engine/metadata-modules/database-event-trigger/utils/__tests__/transform-event-batch-to-event-payloads.spec.ts +++ b/packages/twenty-server/src/engine/core-modules/logic-function/logic-function-trigger/triggers/database-event/utils/__tests__/transform-event-batch-to-event-payloads.spec.ts @@ -1,6 +1,6 @@ import type { ObjectRecordEvent } from 'twenty-shared/database-events'; -import { transformEventBatchToEventPayloads } from 'src/engine/metadata-modules/database-event-trigger/utils/transform-event-batch-to-event-payloads'; +import { transformEventBatchToEventPayloads } from 'src/engine/core-modules/logic-function/logic-function-trigger/triggers/database-event/utils/transform-event-batch-to-event-payloads'; import { getFlatObjectMetadataMock } from 'src/engine/metadata-modules/flat-object-metadata/__mocks__/get-flat-object-metadata.mock'; import { type LogicFunctionEntity } from 'src/engine/metadata-modules/logic-function/logic-function.entity'; import type { WorkspaceEventBatch } from 'src/engine/workspace-event-emitter/types/workspace-event-batch.type'; diff --git a/packages/twenty-server/src/engine/metadata-modules/database-event-trigger/utils/transform-event-batch-to-event-payloads.ts b/packages/twenty-server/src/engine/core-modules/logic-function/logic-function-trigger/triggers/database-event/utils/transform-event-batch-to-event-payloads.ts similarity index 93% rename from packages/twenty-server/src/engine/metadata-modules/database-event-trigger/utils/transform-event-batch-to-event-payloads.ts rename to packages/twenty-server/src/engine/core-modules/logic-function/logic-function-trigger/triggers/database-event/utils/transform-event-batch-to-event-payloads.ts index d359e99bd62..fe62ed7bda6 100644 --- a/packages/twenty-server/src/engine/metadata-modules/database-event-trigger/utils/transform-event-batch-to-event-payloads.ts +++ b/packages/twenty-server/src/engine/core-modules/logic-function/logic-function-trigger/triggers/database-event/utils/transform-event-batch-to-event-payloads.ts @@ -5,7 +5,7 @@ import type { ObjectRecordEvent, } from 'twenty-shared/database-events'; -import { type LogicFunctionTriggerJobData } from 'src/engine/metadata-modules/logic-function/jobs/logic-function-trigger.job'; +import { type LogicFunctionTriggerJobData } from 'src/engine/core-modules/logic-function/logic-function-trigger/jobs/logic-function-trigger.job'; import { type LogicFunctionEntity } from 'src/engine/metadata-modules/logic-function/logic-function.entity'; import type { WorkspaceEventBatch } from 'src/engine/workspace-event-emitter/types/workspace-event-batch.type'; diff --git a/packages/twenty-server/src/engine/metadata-modules/route-trigger/exceptions/route-trigger-rest-api-exception-filter.ts b/packages/twenty-server/src/engine/core-modules/logic-function/logic-function-trigger/triggers/route/exceptions/route-trigger-rest-api-exception-filter.ts similarity index 93% rename from packages/twenty-server/src/engine/metadata-modules/route-trigger/exceptions/route-trigger-rest-api-exception-filter.ts rename to packages/twenty-server/src/engine/core-modules/logic-function/logic-function-trigger/triggers/route/exceptions/route-trigger-rest-api-exception-filter.ts index a97bdf7e918..ebcf97b15bf 100644 --- a/packages/twenty-server/src/engine/metadata-modules/route-trigger/exceptions/route-trigger-rest-api-exception-filter.ts +++ b/packages/twenty-server/src/engine/core-modules/logic-function/logic-function-trigger/triggers/route/exceptions/route-trigger-rest-api-exception-filter.ts @@ -9,7 +9,7 @@ import type { Response } from 'express'; import { RouteTriggerException, RouteTriggerExceptionCode, -} from 'src/engine/metadata-modules/route-trigger/exceptions/route-trigger.exception'; +} from 'src/engine/core-modules/logic-function/logic-function-trigger/triggers/route/exceptions/route-trigger.exception'; import type { CustomException } from 'src/utils/custom-exception'; import { HttpExceptionHandlerService } from 'src/engine/core-modules/exception-handler/http-exception-handler.service'; diff --git a/packages/twenty-server/src/engine/metadata-modules/route-trigger/exceptions/route-trigger.exception.ts b/packages/twenty-server/src/engine/core-modules/logic-function/logic-function-trigger/triggers/route/exceptions/route-trigger.exception.ts similarity index 100% rename from packages/twenty-server/src/engine/metadata-modules/route-trigger/exceptions/route-trigger.exception.ts rename to packages/twenty-server/src/engine/core-modules/logic-function/logic-function-trigger/triggers/route/exceptions/route-trigger.exception.ts diff --git a/packages/twenty-server/src/engine/metadata-modules/route-trigger/route-trigger.service.ts b/packages/twenty-server/src/engine/core-modules/logic-function/logic-function-trigger/triggers/route/route-trigger.service.ts similarity index 85% rename from packages/twenty-server/src/engine/metadata-modules/route-trigger/route-trigger.service.ts rename to packages/twenty-server/src/engine/core-modules/logic-function/logic-function-trigger/triggers/route/route-trigger.service.ts index 8efe1ba8406..eed78366a6a 100644 --- a/packages/twenty-server/src/engine/metadata-modules/route-trigger/route-trigger.service.ts +++ b/packages/twenty-server/src/engine/core-modules/logic-function/logic-function-trigger/triggers/route/route-trigger.service.ts @@ -9,19 +9,19 @@ import { HTTPMethod } from 'twenty-shared/types'; import { AccessTokenService } from 'src/engine/core-modules/auth/token/services/access-token.service'; import { WorkspaceDomainsService } from 'src/engine/core-modules/domain/workspace-domains/services/workspace-domains.service'; +import { LogicFunctionExecutorService } from 'src/engine/core-modules/logic-function/logic-function-executor/services/logic-function-executor.service'; import { RouteTriggerException, RouteTriggerExceptionCode, -} from 'src/engine/metadata-modules/route-trigger/exceptions/route-trigger.exception'; -import { buildLogicFunctionEvent } from 'src/engine/metadata-modules/route-trigger/utils/build-logic-function-event.util'; +} from 'src/engine/core-modules/logic-function/logic-function-trigger/triggers/route/exceptions/route-trigger.exception'; +import { buildLogicFunctionEvent } from 'src/engine/core-modules/logic-function/logic-function-trigger/triggers/route/utils/build-logic-function-event.util'; import { LogicFunctionEntity } from 'src/engine/metadata-modules/logic-function/logic-function.entity'; -import { LogicFunctionService } from 'src/engine/metadata-modules/logic-function/logic-function.service'; @Injectable() export class RouteTriggerService { constructor( private readonly accessTokenService: AccessTokenService, - private readonly logicFunctionService: LogicFunctionService, + private readonly logicFunctionExecutorService: LogicFunctionExecutorService, private readonly workspaceDomainsService: WorkspaceDomainsService, @InjectRepository(LogicFunctionEntity) private readonly logicFunctionRepository: Repository, @@ -146,11 +146,12 @@ export class RouteTriggerService { forwardedRequestHeaders: httpRouteSettings?.forwardedRequestHeaders ?? [], }); - const result = await this.logicFunctionService.executeOneLogicFunction({ - id: logicFunction.id, - workspaceId: logicFunction.workspaceId, - payload: event, - }); + const result = + await this.logicFunctionExecutorService.executeOneLogicFunction({ + id: logicFunction.id, + workspaceId: logicFunction.workspaceId, + payload: event, + }); if (!isDefined(result)) { return result; diff --git a/packages/twenty-server/src/engine/metadata-modules/route-trigger/utils/__tests__/build-logic-function-event.util.spec.ts b/packages/twenty-server/src/engine/core-modules/logic-function/logic-function-trigger/triggers/route/utils/__tests__/build-logic-function-event.util.spec.ts similarity index 98% rename from packages/twenty-server/src/engine/metadata-modules/route-trigger/utils/__tests__/build-logic-function-event.util.spec.ts rename to packages/twenty-server/src/engine/core-modules/logic-function/logic-function-trigger/triggers/route/utils/__tests__/build-logic-function-event.util.spec.ts index 9996f38b0dc..92b904517b5 100644 --- a/packages/twenty-server/src/engine/metadata-modules/route-trigger/utils/__tests__/build-logic-function-event.util.spec.ts +++ b/packages/twenty-server/src/engine/core-modules/logic-function/logic-function-trigger/triggers/route/utils/__tests__/build-logic-function-event.util.spec.ts @@ -6,7 +6,7 @@ import { filterRequestHeaders, normalizePathParameters, normalizeQueryStringParameters, -} from 'src/engine/metadata-modules/route-trigger/utils/build-logic-function-event.util'; +} from 'src/engine/core-modules/logic-function/logic-function-trigger/triggers/route/utils/build-logic-function-event.util'; describe('filterRequestHeaders', () => { it('should filter headers based on allowed names', () => { diff --git a/packages/twenty-server/src/engine/metadata-modules/route-trigger/utils/build-logic-function-event.util.ts b/packages/twenty-server/src/engine/core-modules/logic-function/logic-function-trigger/triggers/route/utils/build-logic-function-event.util.ts similarity index 89% rename from packages/twenty-server/src/engine/metadata-modules/route-trigger/utils/build-logic-function-event.util.ts rename to packages/twenty-server/src/engine/core-modules/logic-function/logic-function-trigger/triggers/route/utils/build-logic-function-event.util.ts index 0abef973e77..2442e04a2fe 100644 --- a/packages/twenty-server/src/engine/metadata-modules/route-trigger/utils/build-logic-function-event.util.ts +++ b/packages/twenty-server/src/engine/core-modules/logic-function/logic-function-trigger/triggers/route/utils/build-logic-function-event.util.ts @@ -22,7 +22,6 @@ export const filterRequestHeaders = ({ const headerValue = requestHeaders[headerName]; if (headerValue !== undefined) { - // Convert string[] to comma-separated string (as per HTTP spec) filteredHeaders[headerName] = Array.isArray(headerValue) ? headerValue.join(', ') : headerValue; @@ -42,22 +41,18 @@ export const extractBody = (request: Request): object | null => { return null; } - // If body is already an object (parsed JSON by body-parser), return as-is if (typeof request.body === 'object' && !Buffer.isBuffer(request.body)) { return request.body; } - // If body is a string, try to parse as JSON if (typeof request.body === 'string') { try { return JSON.parse(request.body); } catch { - // If not valid JSON, wrap in an object return { raw: request.body }; } } - // If body is a Buffer, try to parse as JSON if (Buffer.isBuffer(request.body)) { try { return JSON.parse(request.body.toString('utf-8')); @@ -84,7 +79,6 @@ export const normalizeQueryStringParameters = ( } if (Array.isArray(value)) { - // Join array values with commas const stringValues = value.filter( (v): v is string => typeof v === 'string', ); @@ -93,8 +87,6 @@ export const normalizeQueryStringParameters = ( } else if (typeof value === 'string') { normalized[key] = value; } else if (typeof value === 'object') { - // Handle nested query objects (e.g., ?foo[bar]=baz) - // This is uncommon in REST APIs, convert to JSON string as fallback normalized[key] = JSON.stringify(value); } } diff --git a/packages/twenty-server/src/engine/core-modules/logic-function/logic-function.module.ts b/packages/twenty-server/src/engine/core-modules/logic-function/logic-function.module.ts new file mode 100644 index 00000000000..a8b222e4b95 --- /dev/null +++ b/packages/twenty-server/src/engine/core-modules/logic-function/logic-function.module.ts @@ -0,0 +1,35 @@ +import { type DynamicModule, Global, Module } from '@nestjs/common'; + +import { type LogicFunctionExecutorModuleAsyncOptions } from 'src/engine/core-modules/logic-function/logic-function-executor/interfaces/logic-function-executor.interface'; + +import { LogicFunctionBuildModule } from 'src/engine/core-modules/logic-function/logic-function-build/logic-function-build.module'; +import { LogicFunctionDriversModule } from 'src/engine/core-modules/logic-function/logic-function-drivers/logic-function-drivers.module'; +import { LogicFunctionExecutorModule } from 'src/engine/core-modules/logic-function/logic-function-executor/logic-function-executor.module'; +import { CoreLogicFunctionLayerModule } from 'src/engine/core-modules/logic-function/logic-function-layer/logic-function-layer.module'; +import { LogicFunctionTriggerModule } from 'src/engine/core-modules/logic-function/logic-function-trigger/logic-function-trigger.module'; + +@Global() +@Module({}) +export class LogicFunctionModule { + static forRootAsync( + options: LogicFunctionExecutorModuleAsyncOptions, + ): DynamicModule { + return { + module: LogicFunctionModule, + imports: [ + LogicFunctionDriversModule.forRootAsync(options), + LogicFunctionExecutorModule, + LogicFunctionBuildModule, + CoreLogicFunctionLayerModule, + LogicFunctionTriggerModule, + ], + exports: [ + LogicFunctionDriversModule, + LogicFunctionExecutorModule, + LogicFunctionBuildModule, + CoreLogicFunctionLayerModule, + LogicFunctionTriggerModule, + ], + }; + } +} diff --git a/packages/twenty-server/src/engine/core-modules/message-queue/jobs.module.ts b/packages/twenty-server/src/engine/core-modules/message-queue/jobs.module.ts index d21334eabe2..952197b064b 100644 --- a/packages/twenty-server/src/engine/core-modules/message-queue/jobs.module.ts +++ b/packages/twenty-server/src/engine/core-modules/message-queue/jobs.module.ts @@ -20,9 +20,7 @@ import { HandleWorkspaceMemberDeletedJob } from 'src/engine/core-modules/workspa import { WorkspaceEntity } from 'src/engine/core-modules/workspace/workspace.entity'; import { WorkspaceModule } from 'src/engine/core-modules/workspace/workspace.module'; import { AiAgentMonitorModule } from 'src/engine/metadata-modules/ai/ai-agent-monitor/ai-agent-monitor.module'; -import { CronTriggerModule } from 'src/engine/metadata-modules/cron-trigger/cron-trigger.module'; import { DataSourceModule } from 'src/engine/metadata-modules/data-source/data-source.module'; -import { DatabaseEventTriggerModule } from 'src/engine/metadata-modules/database-event-trigger/database-event-trigger.module'; import { ObjectMetadataModule } from 'src/engine/metadata-modules/object-metadata/object-metadata.module'; import { LogicFunctionModule } from 'src/engine/metadata-modules/logic-function/logic-function.module'; import { SubscriptionsModule } from 'src/engine/subscriptions/subscriptions.module'; @@ -68,8 +66,6 @@ import { WorkflowModule } from 'src/modules/workflow/workflow.module'; SubscriptionsModule, AuditJobModule, AiAgentMonitorModule, - CronTriggerModule, - DatabaseEventTriggerModule, LogicFunctionModule, ], providers: [ diff --git a/packages/twenty-server/src/engine/core-modules/twenty-config/config-variables.ts b/packages/twenty-server/src/engine/core-modules/twenty-config/config-variables.ts index dd11813dd71..3715f21dc3a 100644 --- a/packages/twenty-server/src/engine/core-modules/twenty-config/config-variables.ts +++ b/packages/twenty-server/src/engine/core-modules/twenty-config/config-variables.ts @@ -15,6 +15,7 @@ import { type LoggerOptions } from 'typeorm/logger/LoggerOptions'; import { type AwsRegion } from 'src/engine/core-modules/twenty-config/interfaces/aws-region.interface'; import { NodeEnvironment } from 'src/engine/core-modules/twenty-config/interfaces/node-environment.interface'; import { SupportDriver } from 'src/engine/core-modules/twenty-config/interfaces/support.interface'; +import { LogicFunctionExecutorDriverType } from 'src/engine/core-modules/logic-function/logic-function-executor/interfaces/logic-function-executor.interface'; import { CaptchaDriverType } from 'src/engine/core-modules/captcha/interfaces'; import { CodeInterpreterDriverType } from 'src/engine/core-modules/code-interpreter/code-interpreter.interface'; @@ -22,7 +23,6 @@ import { EmailDriver } from 'src/engine/core-modules/email/enums/email-driver.en import { ExceptionHandlerDriver } from 'src/engine/core-modules/exception-handler/interfaces'; import { StorageDriverType } from 'src/engine/core-modules/file-storage/interfaces'; import { LoggerDriverType } from 'src/engine/core-modules/logger/interfaces'; -import { LogicFunctionExecutorDriverType } from 'src/engine/core-modules/logic-function-executor/logic-function-executor.interface'; import { type MeterDriver } from 'src/engine/core-modules/metrics/types/meter-driver.type'; import { CastToLogLevelArray } from 'src/engine/core-modules/twenty-config/decorators/cast-to-log-level-array.decorator'; import { CastToMeterDriverArray } from 'src/engine/core-modules/twenty-config/decorators/cast-to-meter-driver.decorator'; diff --git a/packages/twenty-server/src/engine/metadata-modules/cron-trigger/cron-trigger.module.ts b/packages/twenty-server/src/engine/metadata-modules/cron-trigger/cron-trigger.module.ts deleted file mode 100644 index 8b16ec048ba..00000000000 --- a/packages/twenty-server/src/engine/metadata-modules/cron-trigger/cron-trigger.module.ts +++ /dev/null @@ -1,14 +0,0 @@ -import { Module } from '@nestjs/common'; -import { TypeOrmModule } from '@nestjs/typeorm'; - -import { WorkspaceEntity } from 'src/engine/core-modules/workspace/workspace.entity'; -import { CronTriggerCronCommand } from 'src/engine/metadata-modules/cron-trigger/crons/commands/cron-trigger.cron.command'; -import { CronTriggerCronJob } from 'src/engine/metadata-modules/cron-trigger/crons/jobs/cron-trigger.cron.job'; -import { LogicFunctionEntity } from 'src/engine/metadata-modules/logic-function/logic-function.entity'; - -@Module({ - imports: [TypeOrmModule.forFeature([WorkspaceEntity, LogicFunctionEntity])], - providers: [CronTriggerCronJob, CronTriggerCronCommand], - exports: [CronTriggerCronCommand], -}) -export class CronTriggerModule {} diff --git a/packages/twenty-server/src/engine/metadata-modules/database-event-trigger/database-event-trigger.module.ts b/packages/twenty-server/src/engine/metadata-modules/database-event-trigger/database-event-trigger.module.ts deleted file mode 100644 index 60bdecfb8f2..00000000000 --- a/packages/twenty-server/src/engine/metadata-modules/database-event-trigger/database-event-trigger.module.ts +++ /dev/null @@ -1,12 +0,0 @@ -import { Module } from '@nestjs/common'; -import { TypeOrmModule } from '@nestjs/typeorm'; - -import { CallDatabaseEventTriggerJobsJob } from 'src/engine/metadata-modules/database-event-trigger/jobs/call-database-event-trigger-jobs.job'; -import { LogicFunctionEntity } from 'src/engine/metadata-modules/logic-function/logic-function.entity'; - -@Module({ - imports: [TypeOrmModule.forFeature([LogicFunctionEntity])], - providers: [CallDatabaseEventTriggerJobsJob], - exports: [], -}) -export class DatabaseEventTriggerModule {} diff --git a/packages/twenty-server/src/engine/metadata-modules/logic-function-layer/logic-function-layer.module.ts b/packages/twenty-server/src/engine/metadata-modules/logic-function-layer/logic-function-layer.module.ts index 1c717a2e88e..97b36fe34b0 100644 --- a/packages/twenty-server/src/engine/metadata-modules/logic-function-layer/logic-function-layer.module.ts +++ b/packages/twenty-server/src/engine/metadata-modules/logic-function-layer/logic-function-layer.module.ts @@ -4,24 +4,17 @@ import { TypeOrmModule } from '@nestjs/typeorm'; import { PermissionsModule } from 'src/engine/metadata-modules/permissions/permissions.module'; import { LogicFunctionLayerEntity } from 'src/engine/metadata-modules/logic-function-layer/logic-function-layer.entity'; import { LogicFunctionLayerResolver } from 'src/engine/metadata-modules/logic-function-layer/logic-function-layer.resolver'; -import { LogicFunctionLayerService } from 'src/engine/metadata-modules/logic-function-layer/logic-function-layer.service'; import { WorkspaceLogicFunctionLayerMapCacheService } from 'src/engine/metadata-modules/logic-function-layer/services/workspace-logic-function-layer-map-cache.service'; -import { WorkspaceCacheModule } from 'src/engine/workspace-cache/workspace-cache.module'; @Module({ imports: [ - PermissionsModule, TypeOrmModule.forFeature([LogicFunctionLayerEntity]), - WorkspaceCacheModule, + PermissionsModule, ], providers: [ - LogicFunctionLayerService, LogicFunctionLayerResolver, WorkspaceLogicFunctionLayerMapCacheService, ], - exports: [ - LogicFunctionLayerService, - WorkspaceLogicFunctionLayerMapCacheService, - ], + exports: [WorkspaceLogicFunctionLayerMapCacheService], }) export class LogicFunctionLayerModule {} diff --git a/packages/twenty-server/src/engine/metadata-modules/logic-function-layer/logic-function-layer.resolver.ts b/packages/twenty-server/src/engine/metadata-modules/logic-function-layer/logic-function-layer.resolver.ts index fc135426c25..11c5b1e3f84 100644 --- a/packages/twenty-server/src/engine/metadata-modules/logic-function-layer/logic-function-layer.resolver.ts +++ b/packages/twenty-server/src/engine/metadata-modules/logic-function-layer/logic-function-layer.resolver.ts @@ -9,7 +9,7 @@ import { SettingsPermissionGuard } from 'src/engine/guards/settings-permission.g import { WorkspaceAuthGuard } from 'src/engine/guards/workspace-auth.guard'; import { CreateLogicFunctionLayerInput } from 'src/engine/metadata-modules/logic-function-layer/dtos/create-logic-function-layer.input'; import { LogicFunctionLayerDTO } from 'src/engine/metadata-modules/logic-function-layer/dtos/logic-function-layer.dto'; -import { LogicFunctionLayerService } from 'src/engine/metadata-modules/logic-function-layer/logic-function-layer.service'; +import { LogicFunctionLayerService } from 'src/engine/core-modules/logic-function/logic-function-layer/services/logic-function-layer.service'; @UseGuards(WorkspaceAuthGuard) @Resolver() diff --git a/packages/twenty-server/src/engine/metadata-modules/logic-function/constants/logic-function-published.ts b/packages/twenty-server/src/engine/metadata-modules/logic-function/constants/logic-function-published.ts deleted file mode 100644 index 3bb979775fe..00000000000 --- a/packages/twenty-server/src/engine/metadata-modules/logic-function/constants/logic-function-published.ts +++ /dev/null @@ -1 +0,0 @@ -export const LOGIC_FUNCTION_PUBLISHED = 'logic_function_published'; diff --git a/packages/twenty-server/src/engine/metadata-modules/logic-function/dtos/build-draft-logic-function.input.ts b/packages/twenty-server/src/engine/metadata-modules/logic-function/dtos/build-draft-logic-function.input.ts deleted file mode 100644 index 7f887108522..00000000000 --- a/packages/twenty-server/src/engine/metadata-modules/logic-function/dtos/build-draft-logic-function.input.ts +++ /dev/null @@ -1,9 +0,0 @@ -import { ID, InputType } from '@nestjs/graphql'; - -import { IDField } from '@ptc-org/nestjs-query-graphql'; - -@InputType() -export class BuildDraftLogicFunctionInput { - @IDField(() => ID, { description: 'The id of the function.' }) - id!: string; -} diff --git a/packages/twenty-server/src/engine/metadata-modules/logic-function/logic-function.module.ts b/packages/twenty-server/src/engine/metadata-modules/logic-function/logic-function.module.ts index e15ec576ba6..c207b1cf155 100644 --- a/packages/twenty-server/src/engine/metadata-modules/logic-function/logic-function.module.ts +++ b/packages/twenty-server/src/engine/metadata-modules/logic-function/logic-function.module.ts @@ -14,9 +14,7 @@ import { FileModule } from 'src/engine/core-modules/file/file.module'; import { SecretEncryptionModule } from 'src/engine/core-modules/secret-encryption/secret-encryption.module'; import { ThrottlerModule } from 'src/engine/core-modules/throttler/throttler.module'; import { WorkspaceManyOrAllFlatEntityMapsCacheModule } from 'src/engine/metadata-modules/flat-entity/services/workspace-many-or-all-flat-entity-maps-cache.module'; -import { LogicFunctionBuildModule } from 'src/engine/metadata-modules/logic-function-build/logic-function-build.module'; import { LogicFunctionLayerModule } from 'src/engine/metadata-modules/logic-function-layer/logic-function-layer.module'; -import { LogicFunctionTriggerJob } from 'src/engine/metadata-modules/logic-function/jobs/logic-function-trigger.job'; import { LogicFunctionEntity } from 'src/engine/metadata-modules/logic-function/logic-function.entity'; import { LogicFunctionResolver } from 'src/engine/metadata-modules/logic-function/logic-function.resolver'; import { LogicFunctionService } from 'src/engine/metadata-modules/logic-function/logic-function.service'; @@ -40,7 +38,6 @@ import { WorkspaceMigrationModule } from 'src/engine/workspace-manager/workspace PermissionsModule, WorkspaceManyOrAllFlatEntityMapsCacheModule, WorkspaceMigrationModule, - LogicFunctionBuildModule, LogicFunctionLayerModule, SubscriptionsModule, WorkspaceCacheModule, @@ -50,7 +47,6 @@ import { WorkspaceMigrationModule } from 'src/engine/workspace-manager/workspace providers: [ LogicFunctionService, LogicFunctionV2Service, - LogicFunctionTriggerJob, LogicFunctionResolver, WorkspaceFlatLogicFunctionMapCacheService, ], diff --git a/packages/twenty-server/src/engine/metadata-modules/logic-function/logic-function.service.ts b/packages/twenty-server/src/engine/metadata-modules/logic-function/logic-function.service.ts index 9957061dfd0..976470b48e0 100644 --- a/packages/twenty-server/src/engine/metadata-modules/logic-function/logic-function.service.ts +++ b/packages/twenty-server/src/engine/metadata-modules/logic-function/logic-function.service.ts @@ -1,31 +1,25 @@ import { Injectable } from '@nestjs/common'; import { InjectRepository } from '@nestjs/typeorm'; -import { - DEFAULT_API_KEY_NAME, - DEFAULT_API_URL_NAME, -} from 'twenty-shared/application'; import { FileFolder } from 'twenty-shared/types'; import { isDefined } from 'twenty-shared/utils'; import { Repository } from 'typeorm'; import { FileStorageExceptionCode } from 'src/engine/core-modules/file-storage/interfaces/file-storage-exception'; -import { type LogicFunctionExecuteResult } from 'src/engine/core-modules/logic-function-executor/drivers/interfaces/logic-function-executor-driver.interface'; +import { type LogicFunctionExecuteResult } from 'src/engine/core-modules/logic-function/logic-function-drivers/interfaces/logic-function-executor-driver.interface'; import { ApplicationService } from 'src/engine/core-modules/application/services/application.service'; -import { AuditService } from 'src/engine/core-modules/audit/services/audit.service'; -import { LOGIC_FUNCTION_EXECUTED_EVENT } from 'src/engine/core-modules/audit/utils/events/workspace-event/logic-function/logic-function-executed'; -import { ApplicationTokenService } from 'src/engine/core-modules/auth/token/services/application-token.service'; import { FileStorageService } from 'src/engine/core-modules/file-storage/file-storage.service'; -import { SecretEncryptionService } from 'src/engine/core-modules/secret-encryption/secret-encryption.service'; -import { buildEnvVar } from 'src/engine/core-modules/logic-function-executor/drivers/utils/build-env-var'; -import { LogicFunctionExecutorService } from 'src/engine/core-modules/logic-function-executor/logic-function-executor.service'; -import { ThrottlerService } from 'src/engine/core-modules/throttler/throttler.service'; -import { TwentyConfigService } from 'src/engine/core-modules/twenty-config/twenty-config.service'; -import { getLogicFunctionBaseFolderPath } from 'src/engine/metadata-modules/logic-function/utils/get-logic-function-base-folder-path.util'; +import { LogicFunctionBuildService } from 'src/engine/core-modules/logic-function/logic-function-build/services/logic-function-build.service'; +import { getLogicFunctionBaseFolderPath } from 'src/engine/core-modules/logic-function/logic-function-build/utils/get-logic-function-base-folder-path.util'; +import { + LogicFunctionExecutionException, + LogicFunctionExecutionExceptionCode, + LogicFunctionExecutorService, +} from 'src/engine/core-modules/logic-function/logic-function-executor/services/logic-function-executor.service'; +import { LogicFunctionLayerService } from 'src/engine/core-modules/logic-function/logic-function-layer/services/logic-function-layer.service'; import { WorkspaceManyOrAllFlatEntityMapsCacheService } from 'src/engine/metadata-modules/flat-entity/services/workspace-many-or-all-flat-entity-maps-cache.service'; import { findFlatEntityByIdInFlatEntityMapsOrThrow } from 'src/engine/metadata-modules/flat-entity/utils/find-flat-entity-by-id-in-flat-entity-maps-or-throw.util'; -import { LogicFunctionLayerService } from 'src/engine/metadata-modules/logic-function-layer/logic-function-layer.service'; import { CreateLogicFunctionInput } from 'src/engine/metadata-modules/logic-function/dtos/create-logic-function.input'; import { type UpdateLogicFunctionInput } from 'src/engine/metadata-modules/logic-function/dtos/update-logic-function.input'; import { LogicFunctionEntity } from 'src/engine/metadata-modules/logic-function/logic-function.entity'; @@ -37,35 +31,23 @@ import { type FlatLogicFunction } from 'src/engine/metadata-modules/logic-functi import { findFlatLogicFunctionOrThrow } from 'src/engine/metadata-modules/logic-function/utils/find-flat-logic-function-or-throw.util'; import { fromCreateLogicFunctionInputToFlatLogicFunction } from 'src/engine/metadata-modules/logic-function/utils/from-create-logic-function-input-to-flat-logic-function.util'; import { fromUpdateLogicFunctionInputToFlatLogicFunctionToUpdateOrThrow } from 'src/engine/metadata-modules/logic-function/utils/from-update-logic-function-input-to-flat-logic-function-to-update-or-throw.util'; -import { SubscriptionChannel } from 'src/engine/subscriptions/enums/subscription-channel.enum'; -import { SubscriptionService } from 'src/engine/subscriptions/subscription.service'; import { WorkspaceCacheService } from 'src/engine/workspace-cache/services/workspace-cache.service'; import { WorkspaceMigrationBuilderException } from 'src/engine/workspace-manager/workspace-migration/exceptions/workspace-migration-builder-exception'; import { WorkspaceMigrationValidateBuildAndRunService } from 'src/engine/workspace-manager/workspace-migration/services/workspace-migration-validate-build-and-run-service'; -import { cleanServerUrl } from 'src/utils/clean-server-url'; -import { LogicFunctionBuildService } from 'src/engine/metadata-modules/logic-function-build/logic-function-build.service'; - -const MIN_TOKEN_EXPIRATION_IN_SECONDS = 5; @Injectable() export class LogicFunctionService { constructor( private readonly fileStorageService: FileStorageService, - private readonly logicFunctionExecutorService: LogicFunctionExecutorService, private readonly functionBuildService: LogicFunctionBuildService, private readonly logicFunctionLayerService: LogicFunctionLayerService, + private readonly logicFunctionExecutorService: LogicFunctionExecutorService, @InjectRepository(LogicFunctionEntity) private readonly logicFunctionRepository: Repository, - private readonly throttlerService: ThrottlerService, - private readonly twentyConfigService: TwentyConfigService, - private readonly auditService: AuditService, - private readonly applicationTokenService: ApplicationTokenService, - private readonly subscriptionService: SubscriptionService, private readonly flatEntityMapsCacheService: WorkspaceManyOrAllFlatEntityMapsCacheService, private readonly workspaceMigrationValidateBuildAndRunService: WorkspaceMigrationValidateBuildAndRunService, private readonly applicationService: ApplicationService, private readonly workspaceCacheService: WorkspaceCacheService, - private readonly secretEncryptionService: SecretEncryptionService, ) {} async getLogicFunctionSourceCode(workspaceId: string, id: string) { @@ -122,142 +104,29 @@ export class LogicFunctionService { workspaceId: string; payload: object; }): Promise { - await this.throttleExecution(workspaceId); - - const { - flatLogicFunctionMaps, - flatApplicationMaps, - applicationVariableMaps, - logicFunctionLayerMaps, - } = await this.workspaceCacheService.getOrRecompute(workspaceId, [ - 'flatLogicFunctionMaps', - 'flatApplicationMaps', - 'applicationVariableMaps', - 'logicFunctionLayerMaps', - ]); - - const flatLogicFunction = findFlatLogicFunctionOrThrow({ - id, - flatLogicFunctionMaps, - }); - - const flatLogicFunctionLayer = - logicFunctionLayerMaps.byId[flatLogicFunction.logicFunctionLayerId]; - - if (!isDefined(flatLogicFunctionLayer)) { - throw new LogicFunctionException( - `Logic function layer with id ${flatLogicFunction.logicFunctionLayerId} not found`, - LogicFunctionExceptionCode.LOGIC_FUNCTION_NOT_FOUND, - ); - } - - const applicationAccessToken = isDefined(flatLogicFunction.applicationId) - ? await this.applicationTokenService.generateApplicationToken({ - workspaceId, - applicationId: flatLogicFunction.applicationId, - expiresInSeconds: Math.max( - flatLogicFunction.timeoutSeconds, - MIN_TOKEN_EXPIRATION_IN_SECONDS, - ), - }) - : undefined; - - const baseUrl = cleanServerUrl(this.twentyConfigService.get('SERVER_URL')); - - const flatApplicationVariables = isDefined(flatLogicFunction.applicationId) - ? (applicationVariableMaps.byApplicationId[ - flatLogicFunction.applicationId - ] ?? []) - : []; - - const envVariables = { - ...(isDefined(baseUrl) - ? { - [DEFAULT_API_URL_NAME]: baseUrl, - } - : {}), - ...(isDefined(applicationAccessToken) - ? { - [DEFAULT_API_KEY_NAME]: applicationAccessToken.token, - } - : {}), - ...buildEnvVar(flatApplicationVariables, this.secretEncryptionService), - }; - - const applicationUniversalIdentifier = isDefined( - flatLogicFunction.applicationId, - ) - ? flatApplicationMaps.byId[flatLogicFunction.applicationId] - ?.universalIdentifier - : undefined; - - if (!isDefined(applicationUniversalIdentifier)) { - throw new LogicFunctionException( - `Application universal identifier not found for logic function ${flatLogicFunction.id}`, - LogicFunctionExceptionCode.LOGIC_FUNCTION_NOT_FOUND, - ); - } - - // We keep that check to build functions - if ( - !(await this.functionBuildService.isBuilt({ - flatLogicFunction, - applicationUniversalIdentifier, - })) - ) { - await this.functionBuildService.buildAndUpload({ - flatLogicFunction, - applicationUniversalIdentifier, - }); - } - - const resultLogicFunction = await this.callWithTimeout({ - callback: () => - this.logicFunctionExecutorService.execute({ - flatLogicFunction, - flatLogicFunctionLayer, - applicationUniversalIdentifier, - payload, - env: envVariables, - }), - timeoutMs: flatLogicFunction.timeoutSeconds * 1000, - }); - - if (this.twentyConfigService.get('LOGIC_FUNCTION_LOGS_ENABLED')) { - /* eslint-disable no-console */ - console.log(resultLogicFunction.logs); - } - - await this.subscriptionService.publish({ - channel: SubscriptionChannel.LOGIC_FUNCTION_LOGS_CHANNEL, - workspaceId, - payload: { - logicFunctionLogs: { - logs: resultLogicFunction.logs, - id: flatLogicFunction.id, - name: flatLogicFunction.name, - universalIdentifier: flatLogicFunction.universalIdentifier, - applicationId: flatLogicFunction.applicationId, - applicationUniversalIdentifier, - }, - }, - }); - - this.auditService - .createContext({ + try { + return await this.logicFunctionExecutorService.executeOneLogicFunction({ + id, workspaceId, - }) - .insertWorkspaceEvent(LOGIC_FUNCTION_EXECUTED_EVENT, { - duration: resultLogicFunction.duration, - status: resultLogicFunction.status, - ...(resultLogicFunction.error && { - errorType: resultLogicFunction.error.errorType, - }), - functionId: flatLogicFunction.id, - functionName: flatLogicFunction.name, + payload, }); - - return resultLogicFunction; + } catch (error) { + if (error instanceof LogicFunctionExecutionException) { + switch (error.code) { + case LogicFunctionExecutionExceptionCode.LOGIC_FUNCTION_NOT_FOUND: + throw new LogicFunctionException( + error.message, + LogicFunctionExceptionCode.LOGIC_FUNCTION_NOT_FOUND, + ); + case LogicFunctionExecutionExceptionCode.RATE_LIMIT_EXCEEDED: + throw new LogicFunctionException( + error.message, + LogicFunctionExceptionCode.LOGIC_FUNCTION_EXECUTION_LIMIT_REACHED, + ); + } + } + throw error; + } } async deleteOneLogicFunction({ @@ -672,47 +541,4 @@ export class LogicFunctionService { return newFlatLogicFunction; } - - private async throttleExecution(workspaceId: string) { - try { - await this.throttlerService.tokenBucketThrottleOrThrow( - `${workspaceId}-logic-function-execution`, - 1, - this.twentyConfigService.get('LOGIC_FUNCTION_EXEC_THROTTLE_LIMIT'), - this.twentyConfigService.get('LOGIC_FUNCTION_EXEC_THROTTLE_TTL'), - ); - } catch { - throw new LogicFunctionException( - 'Logic function execution rate limit exceeded', - LogicFunctionExceptionCode.LOGIC_FUNCTION_EXECUTION_LIMIT_REACHED, - ); - } - } - - private async callWithTimeout({ - callback, - timeoutMs, - }: { - callback: () => Promise; - timeoutMs: number; - }): Promise { - let timeoutId: NodeJS.Timeout; - - const timeoutPromise = new Promise((_, reject) => { - timeoutId = setTimeout( - () => - reject( - new LogicFunctionException( - `Execution timeout: ${timeoutMs / 1000}s`, - LogicFunctionExceptionCode.LOGIC_FUNCTION_EXECUTION_TIMEOUT, - ), - ), - timeoutMs, - ); - }); - - return Promise.race([callback(), timeoutPromise]).finally(() => - clearTimeout(timeoutId), - ) as Promise; - } } diff --git a/packages/twenty-server/src/engine/metadata-modules/route-trigger/route-trigger.controller.ts b/packages/twenty-server/src/engine/metadata-modules/route-trigger/route-trigger.controller.ts index 4d9de292191..11f2e2e3993 100644 --- a/packages/twenty-server/src/engine/metadata-modules/route-trigger/route-trigger.controller.ts +++ b/packages/twenty-server/src/engine/metadata-modules/route-trigger/route-trigger.controller.ts @@ -15,8 +15,8 @@ import { HTTPMethod } from 'twenty-shared/types'; import { NoPermissionGuard } from 'src/engine/guards/no-permission.guard'; import { PublicEndpointGuard } from 'src/engine/guards/public-endpoint.guard'; -import { RouteTriggerRestApiExceptionFilter } from 'src/engine/metadata-modules/route-trigger/exceptions/route-trigger-rest-api-exception-filter'; -import { RouteTriggerService } from 'src/engine/metadata-modules/route-trigger/route-trigger.service'; +import { RouteTriggerRestApiExceptionFilter } from 'src/engine/core-modules/logic-function/logic-function-trigger/triggers/route/exceptions/route-trigger-rest-api-exception-filter'; +import { RouteTriggerService } from 'src/engine/core-modules/logic-function/logic-function-trigger/triggers/route/route-trigger.service'; @Controller('s') @UseGuards(PublicEndpointGuard, NoPermissionGuard) diff --git a/packages/twenty-server/src/engine/metadata-modules/route-trigger/route-trigger.module.ts b/packages/twenty-server/src/engine/metadata-modules/route-trigger/route-trigger.module.ts index 0f3a7335061..ef4fe26203a 100644 --- a/packages/twenty-server/src/engine/metadata-modules/route-trigger/route-trigger.module.ts +++ b/packages/twenty-server/src/engine/metadata-modules/route-trigger/route-trigger.module.ts @@ -1,22 +1,8 @@ import { Module } from '@nestjs/common'; -import { TypeOrmModule } from '@nestjs/typeorm'; -import { TokenModule } from 'src/engine/core-modules/auth/token/token.module'; -import { WorkspaceDomainsModule } from 'src/engine/core-modules/domain/workspace-domains/workspace-domains.module'; import { RouteTriggerController } from 'src/engine/metadata-modules/route-trigger/route-trigger.controller'; -import { RouteTriggerService } from 'src/engine/metadata-modules/route-trigger/route-trigger.service'; -import { LogicFunctionEntity } from 'src/engine/metadata-modules/logic-function/logic-function.entity'; -import { LogicFunctionModule } from 'src/engine/metadata-modules/logic-function/logic-function.module'; @Module({ - imports: [ - TypeOrmModule.forFeature([LogicFunctionEntity]), - TokenModule, - WorkspaceDomainsModule, - LogicFunctionModule, - ], controllers: [RouteTriggerController], - providers: [RouteTriggerService], - exports: [], }) export class RouteTriggerModule {} diff --git a/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-runner/action-handlers/logic-function/services/create-logic-function-action-handler.service.ts b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-runner/action-handlers/logic-function/services/create-logic-function-action-handler.service.ts index 2f141ee984e..3df030ba6a2 100644 --- a/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-runner/action-handlers/logic-function/services/create-logic-function-action-handler.service.ts +++ b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-runner/action-handlers/logic-function/services/create-logic-function-action-handler.service.ts @@ -13,9 +13,9 @@ import { WorkspaceMigrationRunnerActionHandler } from 'src/engine/workspace-mana import { ApplicationEntity } from 'src/engine/core-modules/application/application.entity'; import { FileStorageService } from 'src/engine/core-modules/file-storage/file-storage.service'; -import { getSeedProjectFiles } from 'src/engine/core-modules/logic-function-executor/drivers/utils/get-seed-project-files'; -import { LambdaBuildDirectoryManager } from 'src/engine/core-modules/logic-function-executor/drivers/utils/lambda-build-directory-manager'; -import { getLogicFunctionBaseFolderPath } from 'src/engine/metadata-modules/logic-function/utils/get-logic-function-base-folder-path.util'; +import { getSeedProjectFiles } from 'src/engine/core-modules/logic-function/logic-function-drivers/utils/get-seed-project-files'; +import { LambdaBuildDirectoryManager } from 'src/engine/core-modules/logic-function/logic-function-drivers/utils/lambda-build-directory-manager'; +import { getLogicFunctionBaseFolderPath } from 'src/engine/core-modules/logic-function/logic-function-build/utils/get-logic-function-base-folder-path.util'; import { LogicFunctionEntity } from 'src/engine/metadata-modules/logic-function/logic-function.entity'; import { LogicFunctionException, @@ -24,7 +24,7 @@ import { import { CreateLogicFunctionAction } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/logic-function/types/workspace-migration-logic-function-action.type'; import { WorkspaceMigrationActionRunnerArgs } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-runner/types/workspace-migration-action-runner-args.type'; import { FlatLogicFunction } from 'src/engine/metadata-modules/logic-function/types/flat-logic-function.type'; -import { LogicFunctionBuildService } from 'src/engine/metadata-modules/logic-function-build/logic-function-build.service'; +import { LogicFunctionBuildService } from 'src/engine/core-modules/logic-function/logic-function-build/services/logic-function-build.service'; @Injectable() export class CreateLogicFunctionActionHandlerService extends WorkspaceMigrationRunnerActionHandler( diff --git a/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-runner/action-handlers/logic-function/services/delete-logic-function-action-handler.service.ts b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-runner/action-handlers/logic-function/services/delete-logic-function-action-handler.service.ts index a2cf97a0d2b..ec38259a2a5 100644 --- a/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-runner/action-handlers/logic-function/services/delete-logic-function-action-handler.service.ts +++ b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-runner/action-handlers/logic-function/services/delete-logic-function-action-handler.service.ts @@ -7,7 +7,7 @@ import { WorkspaceMigrationRunnerActionHandler } from 'src/engine/workspace-mana import { FileStorageService } from 'src/engine/core-modules/file-storage/file-storage.service'; import { findFlatEntityByUniversalIdentifierOrThrow } from 'src/engine/metadata-modules/flat-entity/utils/find-flat-entity-by-universal-identifier-or-throw.util'; import { LogicFunctionEntity } from 'src/engine/metadata-modules/logic-function/logic-function.entity'; -import { getLogicFunctionBaseFolderPath } from 'src/engine/metadata-modules/logic-function/utils/get-logic-function-base-folder-path.util'; +import { getLogicFunctionBaseFolderPath } from 'src/engine/core-modules/logic-function/logic-function-build/utils/get-logic-function-base-folder-path.util'; import { DeleteLogicFunctionAction } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/logic-function/types/workspace-migration-logic-function-action.type'; import { WorkspaceMigrationActionRunnerArgs } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-runner/types/workspace-migration-action-runner-args.type'; diff --git a/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-runner/action-handlers/logic-function/services/update-logic-function-action-handler.service.ts b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-runner/action-handlers/logic-function/services/update-logic-function-action-handler.service.ts index 34467f78852..93f554e9aaf 100644 --- a/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-runner/action-handlers/logic-function/services/update-logic-function-action-handler.service.ts +++ b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-runner/action-handlers/logic-function/services/update-logic-function-action-handler.service.ts @@ -13,8 +13,8 @@ import { WorkspaceMigrationRunnerActionHandler } from 'src/engine/workspace-mana import { ApplicationEntity } from 'src/engine/core-modules/application/application.entity'; import { FileStorageService } from 'src/engine/core-modules/file-storage/file-storage.service'; -import { LambdaBuildDirectoryManager } from 'src/engine/core-modules/logic-function-executor/drivers/utils/lambda-build-directory-manager'; -import { LogicFunctionExecutorService } from 'src/engine/core-modules/logic-function-executor/logic-function-executor.service'; +import { LambdaBuildDirectoryManager } from 'src/engine/core-modules/logic-function/logic-function-drivers/utils/lambda-build-directory-manager'; +import { LogicFunctionExecutorService } from 'src/engine/core-modules/logic-function/logic-function-executor/services/logic-function-executor.service'; import { findFlatEntityByIdInFlatEntityMapsOrThrow } from 'src/engine/metadata-modules/flat-entity/utils/find-flat-entity-by-id-in-flat-entity-maps-or-throw.util'; import { LogicFunctionEntity } from 'src/engine/metadata-modules/logic-function/logic-function.entity'; import { @@ -22,11 +22,11 @@ import { LogicFunctionExceptionCode, } from 'src/engine/metadata-modules/logic-function/logic-function.exception'; import { FlatLogicFunction } from 'src/engine/metadata-modules/logic-function/types/flat-logic-function.type'; -import { getLogicFunctionBaseFolderPath } from 'src/engine/metadata-modules/logic-function/utils/get-logic-function-base-folder-path.util'; +import { getLogicFunctionBaseFolderPath } from 'src/engine/core-modules/logic-function/logic-function-build/utils/get-logic-function-base-folder-path.util'; import { UpdateLogicFunctionAction } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-builder/builders/logic-function/types/workspace-migration-logic-function-action.type'; import { WorkspaceMigrationActionRunnerArgs } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-runner/types/workspace-migration-action-runner-args.type'; import { fromFlatEntityPropertiesUpdatesToPartialFlatEntity } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-runner/utils/from-flat-entity-properties-updates-to-partial-flat-entity'; -import { LogicFunctionBuildService } from 'src/engine/metadata-modules/logic-function-build/logic-function-build.service'; +import { LogicFunctionBuildService } from 'src/engine/core-modules/logic-function/logic-function-build/services/logic-function-build.service'; @Injectable() export class UpdateLogicFunctionActionHandlerService extends WorkspaceMigrationRunnerActionHandler( diff --git a/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-runner/action-handlers/workspace-schema-migration-runner-action-handlers.module.ts b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-runner/action-handlers/workspace-schema-migration-runner-action-handlers.module.ts index 740e0323a79..51967cd6f51 100644 --- a/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-runner/action-handlers/workspace-schema-migration-runner-action-handlers.module.ts +++ b/packages/twenty-server/src/engine/workspace-manager/workspace-migration/workspace-migration-runner/action-handlers/workspace-schema-migration-runner-action-handlers.module.ts @@ -69,13 +69,11 @@ import { UpdateViewGroupActionHandlerService } from 'src/engine/workspace-manage import { CreateViewActionHandlerService } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-runner/action-handlers/view/services/create-view-action-handler.service'; import { DeleteViewActionHandlerService } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-runner/action-handlers/view/services/delete-view-action-handler.service'; import { UpdateViewActionHandlerService } from 'src/engine/workspace-manager/workspace-migration/workspace-migration-runner/action-handlers/view/services/update-view-action-handler.service'; -import { LogicFunctionBuildModule } from 'src/engine/metadata-modules/logic-function-build/logic-function-build.module'; @Module({ imports: [ TypeOrmModule.forFeature([ApplicationEntity]), WorkspaceSchemaManagerModule, - LogicFunctionBuildModule, ], providers: [ CreateFieldActionHandlerService, diff --git a/packages/twenty-server/src/modules/workflow/workflow-builder/workflow-version-step/workflow-version-step-operations.workspace-service.ts b/packages/twenty-server/src/modules/workflow/workflow-builder/workflow-version-step/workflow-version-step-operations.workspace-service.ts index de8250ae6af..05d60bef6f1 100644 --- a/packages/twenty-server/src/modules/workflow/workflow-builder/workflow-version-step/workflow-version-step-operations.workspace-service.ts +++ b/packages/twenty-server/src/modules/workflow/workflow-builder/workflow-version-step/workflow-version-step-operations.workspace-service.ts @@ -15,7 +15,7 @@ import { Repository } from 'typeorm'; import { v4 } from 'uuid'; import { getFlatFieldsFromFlatObjectMetadata } from 'src/engine/api/graphql/workspace-schema-builder/utils/get-flat-fields-for-flat-object-metadata.util'; -import { SEED_PROJECT_INPUT_SCHEMA } from 'src/engine/core-modules/logic-function-executor/drivers/constants/seed-project-input-schema'; +import { SEED_PROJECT_INPUT_SCHEMA } from 'src/engine/core-modules/logic-function/logic-function-drivers/constants/seed-project-input-schema'; import { type WorkflowStepPositionInput } from 'src/engine/core-modules/workflow/dtos/update-workflow-step-position-input.dto'; import { AiAgentRoleService } from 'src/engine/metadata-modules/ai/ai-agent-role/ai-agent-role.service'; import { AgentEntity } from 'src/engine/metadata-modules/ai/ai-agent/entities/agent.entity';