From 504b785a0337920ba10e7887451938177dcef04a Mon Sep 17 00:00:00 2001 From: adrians5j Date: Mon, 13 Jul 2026 16:42:13 +0200 Subject: [PATCH 1/6] wip:1 (2xei9) --- .../api-event-handler-server/package.json | 2 ++ .../src/createWebinyApiHandler.ts | 32 ++++++++++++++++--- .../tsconfig.build.json | 6 ++++ .../api-event-handler-server/tsconfig.json | 6 ++++ yarn.lock | 4 ++- 5 files changed, 45 insertions(+), 5 deletions(-) diff --git a/packages/api-event-handler-server/package.json b/packages/api-event-handler-server/package.json index 9de048f0a7e..b2986b118d8 100644 --- a/packages/api-event-handler-server/package.json +++ b/packages/api-event-handler-server/package.json @@ -20,7 +20,9 @@ "dependencies": { "@webiny/api-core": "0.0.0", "@webiny/api-event-handler-core": "0.0.0", + "@webiny/api-scheduler-server": "0.0.0", "@webiny/api-websockets-server": "0.0.0", + "@webiny/background-tasks-server": "0.0.0", "@webiny/event-handler-core": "0.0.0", "@webiny/event-handler-server": "0.0.0", "@webiny/handler": "0.0.0" diff --git a/packages/api-event-handler-server/src/createWebinyApiHandler.ts b/packages/api-event-handler-server/src/createWebinyApiHandler.ts index 1076e3a12e4..aa04e891d0f 100644 --- a/packages/api-event-handler-server/src/createWebinyApiHandler.ts +++ b/packages/api-event-handler-server/src/createWebinyApiHandler.ts @@ -5,9 +5,11 @@ * plus the auth/tenant loader decorators (extract token / x-tenant from the IncomingMessage → shared * RequestIdentityLoader / RequestTenantLoader). The per-request feature stack is the transport-agnostic * `registerApiRequestStack` from `@webiny/api-event-handler-core` — the SAME stack the AWS handler uses. - * It is called with NEITHER the realtime nor the scheduler hook: those are AWS-specific (API Gateway - * WebSockets / EventBridge Scheduler) and this transport has no equivalent — the hooks being optional - * is the point. The storage variant (and its identity provider) is injected via `registerRootStorage`. + * Both interleave hooks are supplied with SINGLE-PROCESS, in-process equivalents of the AWS transports: + * the realtime hook installs the server WebSockets transport (vs AWS's API Gateway Management API), and + * the scheduler hook installs the Bree/in-process scheduler (vs AWS's EventBridge Scheduler). Background + * tasks are wired in the ROOT container (below), mirroring how the AWS handler registers its background- + * task transport at root. The storage variant (and its identity provider) is injected via `registerRootStorage`. * * The identity provider (e.g. `@webiny/self-hosted-auth`'s JWT IdP) must be registered by the variant * in `registerRootStorage`, so the RequestIdentityLoader driven by the identity decorator can resolve it. @@ -23,6 +25,8 @@ import { WebsocketsConnectionManager, attachWebsocketsServer } from "@webiny/api-websockets-server"; +import { BackgroundTasksServerFeature } from "@webiny/background-tasks-server"; +import { registerSchedulerServerExtension } from "@webiny/api-scheduler-server"; import { NodeHttpIdentityLoaderDecorator } from "~/handlers/NodeHttpIdentityLoaderDecorator.js"; import { NodeHttpTenantLoaderDecorator } from "~/handlers/NodeHttpTenantLoaderDecorator.js"; @@ -63,12 +67,25 @@ export function createWebinyApiHandler(config: CreateWebinyApiHandlerConfig) { // connection registry (ConnectionRegistry) is the storage variant's job (e.g. sql). container.register(ServerConnectionManager).inSingletonScope(); container.register(NodeWsAdapter).inSingletonScope(); + + // ── Background tasks (root) ──────────────────────────────── + // Mirrors the AWS handler registering its background-task transport at root. There is no + // Step Functions / Lambda re-invocation in a single process, so the transport is in-process: + // WorkerService (the BackgroundTasks/TaskService dispatch abstraction) runs each triggered + // task in a Node worker_thread that POSTs back to this server's `/background-task` HTTP route + // (BackgroundTaskRoute), which runs the task loop (continue/timeout/abort) in-process. Root, + // not per-request, is load-bearing: the shared InternalToken (registered here as a singleton) + // gates the route against the worker's callback, so dispatcher and route MUST see the SAME + // token — a per-request registration would mint a fresh token per request and always 403. + // The route is an HttpRoute; the per-request HttpRouter collects it via the parent chain. + BackgroundTasksServerFeature.register(container); }, request: async container => { // The transport-agnostic per-request stack. The realtime hook installs the server // WebSockets transport (overriding the domain's NullWebsocketsTransport); it resolves the - // shared connection manager + adapter from the root. No scheduler hook — that's AWS-only. + // shared connection manager + adapter from the root. The scheduler hook installs the + // Bree/in-process scheduler transport (the single-process equivalent of EventBridge). await registerApiRequestStack(container, { extensions: config.extensions, // Why a hook (and not just registering the transport ourselves): `.register()` calls @@ -82,6 +99,13 @@ export function createWebinyApiHandler(config: CreateWebinyApiHandlerConfig) { // default, so the override is guaranteed without the caller knowing the internal order. registerRealtimeTransport: requestContainer => { requestContainer.register(ServerWebsocketsTransport); + }, + // Scheduler transport: the Bree/in-process extension. Where AWS bridges EventBridge + // Scheduler, the single-process server drives delayed/scheduled action triggers with + // in-process timers (Bree). The hook runs right after SchedulerFeature so this transport + // overrides the domain default, same seam as the realtime hook above. + registerSchedulerTransport: requestContainer => { + registerSchedulerServerExtension(requestContainer); } }); }, diff --git a/packages/api-event-handler-server/tsconfig.build.json b/packages/api-event-handler-server/tsconfig.build.json index 3cb48dd9cba..3e3a53a0df5 100644 --- a/packages/api-event-handler-server/tsconfig.build.json +++ b/packages/api-event-handler-server/tsconfig.build.json @@ -4,7 +4,9 @@ "references": [ { "path": "../api-core/tsconfig.build.json" }, { "path": "../api-event-handler-core/tsconfig.build.json" }, + { "path": "../api-scheduler-server/tsconfig.build.json" }, { "path": "../api-websockets-server/tsconfig.build.json" }, + { "path": "../background-tasks-server/tsconfig.build.json" }, { "path": "../event-handler-core/tsconfig.build.json" }, { "path": "../event-handler-server/tsconfig.build.json" }, { "path": "../handler/tsconfig.build.json" } @@ -20,8 +22,12 @@ "@webiny/api-core": ["../api-core/src"], "@webiny/api-event-handler-core/*": ["../api-event-handler-core/src/*"], "@webiny/api-event-handler-core": ["../api-event-handler-core/src"], + "@webiny/api-scheduler-server/*": ["../api-scheduler-server/src/*"], + "@webiny/api-scheduler-server": ["../api-scheduler-server/src"], "@webiny/api-websockets-server/*": ["../api-websockets-server/src/*"], "@webiny/api-websockets-server": ["../api-websockets-server/src"], + "@webiny/background-tasks-server/*": ["../background-tasks-server/src/*"], + "@webiny/background-tasks-server": ["../background-tasks-server/src"], "@webiny/event-handler-core/*": ["../event-handler-core/src/*"], "@webiny/event-handler-core": ["../event-handler-core/src"], "@webiny/event-handler-server/*": ["../event-handler-server/src/*"], diff --git a/packages/api-event-handler-server/tsconfig.json b/packages/api-event-handler-server/tsconfig.json index eaa9a406a6b..62b474ebe3d 100644 --- a/packages/api-event-handler-server/tsconfig.json +++ b/packages/api-event-handler-server/tsconfig.json @@ -4,7 +4,9 @@ "references": [ { "path": "../api-core" }, { "path": "../api-event-handler-core" }, + { "path": "../api-scheduler-server" }, { "path": "../api-websockets-server" }, + { "path": "../background-tasks-server" }, { "path": "../event-handler-core" }, { "path": "../event-handler-server" }, { "path": "../handler" } @@ -20,8 +22,12 @@ "@webiny/api-core": ["../api-core/src"], "@webiny/api-event-handler-core/*": ["../api-event-handler-core/src/*"], "@webiny/api-event-handler-core": ["../api-event-handler-core/src"], + "@webiny/api-scheduler-server/*": ["../api-scheduler-server/src/*"], + "@webiny/api-scheduler-server": ["../api-scheduler-server/src"], "@webiny/api-websockets-server/*": ["../api-websockets-server/src/*"], "@webiny/api-websockets-server": ["../api-websockets-server/src"], + "@webiny/background-tasks-server/*": ["../background-tasks-server/src/*"], + "@webiny/background-tasks-server": ["../background-tasks-server/src"], "@webiny/event-handler-core/*": ["../event-handler-core/src/*"], "@webiny/event-handler-core": ["../event-handler-core/src"], "@webiny/event-handler-server/*": ["../event-handler-server/src/*"], diff --git a/yarn.lock b/yarn.lock index da78261f43c..2b2027cc8ef 100644 --- a/yarn.lock +++ b/yarn.lock @@ -10828,7 +10828,9 @@ __metadata: dependencies: "@webiny/api-core": "npm:0.0.0" "@webiny/api-event-handler-core": "npm:0.0.0" + "@webiny/api-scheduler-server": "npm:0.0.0" "@webiny/api-websockets-server": "npm:0.0.0" + "@webiny/background-tasks-server": "npm:0.0.0" "@webiny/build-tools": "npm:0.0.0" "@webiny/di": "npm:^1.0.2" "@webiny/event-handler-core": "npm:0.0.0" @@ -12439,7 +12441,7 @@ __metadata: languageName: unknown linkType: soft -"@webiny/background-tasks-server@workspace:packages/background-tasks-server": +"@webiny/background-tasks-server@npm:0.0.0, @webiny/background-tasks-server@workspace:packages/background-tasks-server": version: 0.0.0-use.local resolution: "@webiny/background-tasks-server@workspace:packages/background-tasks-server" dependencies: From 1eb46fb3598672254955dcbf5142f361ac703e5f Mon Sep 17 00:00:00 2001 From: adrians5j Date: Wed, 15 Jul 2026 07:29:24 +0200 Subject: [PATCH 2/6] feat(self-hosted): port background tasks, scheduler, and file manager to the server flavour Wire the AWS-only background-tasks, scheduler, and file-manager capabilities into the self-hosted Node server flavour, plus the transport fixes needed to run them in a single long-running process. Background tasks: - Register BackgroundTasksServerFeature in the server handler root (in-process worker_thread runner + /background-task route). Root, not per-request, so the shared InternalToken gate is a stable singleton. - WorkerService reads the runtime PORT env instead of the (unset) SERVER_PORT build param. Scheduler: - Wire registerSchedulerServerExtension via the registerSchedulerTransport hook. - Register its RequestContextInitializer via register() (not registerInstance) so it runs after SchedulerModelContextualSchema registers ScheduledActionModel. File manager: - Add a registerFileManagerTransport hook to the shared request stack (replaces the hardcoded FileManagerS3Feature); AWS passes S3, server passes FileManagerServerFeature. - FileManagerServerFeature: register local asset delivery, the upload GraphQL schema (mirrors S3 query names so the SDK is unchanged), and the domain Read/WriteFileMetadata features; resolve config lazily (build params are not registered at register() time). - Add Infra.FileStorage (bakes WEBINY_LOCAL_STORAGE_PATH + WEBINY_UPLOAD_SECRET build params). - resolveServerUrl derives the URL from WEBINY_API_URL/PORT (the DI-native gql context exposes no request headers to resolvers). - SettingsInstaller falls back to WEBINY_API_URL for srcPrefix when there is no CloudFront manifest (AWS-safe). Transport (event-handler-server): - Read binary request bodies as raw Buffers (multipart uploads were utf8-corrupted). - Write Buffer response bodies raw (image delivery was JSON-serialized -> ORB-blocked). Co-Authored-By: Claude Opus 4.8 (1M context) --- packages/api-event-handler-aws/package.json | 1 + .../src/createWebinyApiHandler.ts | 5 + .../api-event-handler-aws/tsconfig.build.json | 3 + packages/api-event-handler-aws/tsconfig.json | 3 + packages/api-event-handler-core/package.json | 1 - .../src/registerApiRequestStack.ts | 13 +- .../tsconfig.build.json | 3 - packages/api-event-handler-core/tsconfig.json | 3 - .../api-event-handler-server/package.json | 1 + .../src/createWebinyApiHandler.ts | 8 + .../tsconfig.build.json | 3 + .../api-event-handler-server/tsconfig.json | 3 + packages/api-file-manager-server/package.json | 2 + .../src/FileManagerServerFeature.ts | 56 ++++- .../CreateMultiPartUploadUseCase.ts | 6 +- .../FileManagerServerConfig.ts | 10 + .../GetUploadPayloadUseCase.ts | 6 +- .../src/graphql/schema.ts | 225 ++++++++++++++++++ .../src/utils/resolveServerUrl.ts | 29 ++- .../tsconfig.build.json | 3 + .../api-file-manager-server/tsconfig.json | 3 + .../SettingsInstaller/SettingsInstaller.ts | 6 +- packages/api-scheduler-server/src/context.ts | 111 +++++---- .../src/service/WorkerTaskService.ts | 10 +- .../src/createServerHandler.ts | 6 + .../src/translators/NodeHttpTranslator.ts | 22 +- .../src/extensions/FileStorage.tsx | 45 ++++ packages/project-server/src/infra.ts | 3 + webiny.config.server.tsx | 7 + yarn.lock | 7 +- 30 files changed, 509 insertions(+), 95 deletions(-) create mode 100644 packages/api-file-manager-server/src/graphql/schema.ts create mode 100644 packages/project-server/src/extensions/FileStorage.tsx diff --git a/packages/api-event-handler-aws/package.json b/packages/api-event-handler-aws/package.json index d0abc349f6d..058f1d4c497 100644 --- a/packages/api-event-handler-aws/package.json +++ b/packages/api-event-handler-aws/package.json @@ -20,6 +20,7 @@ "dependencies": { "@webiny/api-core": "0.0.0", "@webiny/api-event-handler-core": "0.0.0", + "@webiny/api-file-manager-s3": "0.0.0", "@webiny/api-scheduler-aws": "0.0.0", "@webiny/api-websockets": "0.0.0", "@webiny/api-websockets-aws": "0.0.0", diff --git a/packages/api-event-handler-aws/src/createWebinyApiHandler.ts b/packages/api-event-handler-aws/src/createWebinyApiHandler.ts index 650d2ea3a6f..f2e98334ef0 100644 --- a/packages/api-event-handler-aws/src/createWebinyApiHandler.ts +++ b/packages/api-event-handler-aws/src/createWebinyApiHandler.ts @@ -24,6 +24,7 @@ import { DbFeature } from "@webiny/handler-db"; import { registerApiRequestStack } from "@webiny/api-event-handler-core"; import { WebsocketsAwsFeature } from "@webiny/api-websockets-aws"; import { registerSchedulerAwsExtension } from "@webiny/api-scheduler-aws"; +import { FileManagerS3Feature } from "@webiny/api-file-manager-s3"; import { WebSocketLambdaHandler } from "@webiny/api-websockets"; // CognitoIdpFeature must be in the root container so the request auth step // (ApiGatewayIdentityLoaderDecorator → RequestIdentityLoader) sees CognitoIdentityProvider @@ -128,6 +129,10 @@ export function createWebinyApiHandler(config: CreateWebinyApiHandlerConfig) { registerSchedulerAwsExtension(c, { getClient: schedulerConfig => createSchedulerClient(schedulerConfig) }); + }, + // File-manager storage transport: S3 (asset delivery + S3 file operations + schema). + registerFileManagerTransport: c => { + FileManagerS3Feature.register(c, {}); } }); } diff --git a/packages/api-event-handler-aws/tsconfig.build.json b/packages/api-event-handler-aws/tsconfig.build.json index 0d76c2715b4..ec4bbcc3139 100644 --- a/packages/api-event-handler-aws/tsconfig.build.json +++ b/packages/api-event-handler-aws/tsconfig.build.json @@ -4,6 +4,7 @@ "references": [ { "path": "../api-core/tsconfig.build.json" }, { "path": "../api-event-handler-core/tsconfig.build.json" }, + { "path": "../api-file-manager-s3/tsconfig.build.json" }, { "path": "../api-scheduler-aws/tsconfig.build.json" }, { "path": "../api-websockets/tsconfig.build.json" }, { "path": "../api-websockets-aws/tsconfig.build.json" }, @@ -26,6 +27,8 @@ "@webiny/api-core": ["../api-core/src"], "@webiny/api-event-handler-core/*": ["../api-event-handler-core/src/*"], "@webiny/api-event-handler-core": ["../api-event-handler-core/src"], + "@webiny/api-file-manager-s3/*": ["../api-file-manager-s3/src/*"], + "@webiny/api-file-manager-s3": ["../api-file-manager-s3/src"], "@webiny/api-scheduler-aws/*": ["../api-scheduler-aws/src/*"], "@webiny/api-scheduler-aws": ["../api-scheduler-aws/src"], "@webiny/api-websockets/*": ["../api-websockets/src/*"], diff --git a/packages/api-event-handler-aws/tsconfig.json b/packages/api-event-handler-aws/tsconfig.json index c39a3e1aa7d..8b15571a75b 100644 --- a/packages/api-event-handler-aws/tsconfig.json +++ b/packages/api-event-handler-aws/tsconfig.json @@ -4,6 +4,7 @@ "references": [ { "path": "../api-core" }, { "path": "../api-event-handler-core" }, + { "path": "../api-file-manager-s3" }, { "path": "../api-scheduler-aws" }, { "path": "../api-websockets" }, { "path": "../api-websockets-aws" }, @@ -26,6 +27,8 @@ "@webiny/api-core": ["../api-core/src"], "@webiny/api-event-handler-core/*": ["../api-event-handler-core/src/*"], "@webiny/api-event-handler-core": ["../api-event-handler-core/src"], + "@webiny/api-file-manager-s3/*": ["../api-file-manager-s3/src/*"], + "@webiny/api-file-manager-s3": ["../api-file-manager-s3/src"], "@webiny/api-scheduler-aws/*": ["../api-scheduler-aws/src/*"], "@webiny/api-scheduler-aws": ["../api-scheduler-aws/src"], "@webiny/api-websockets/*": ["../api-websockets/src/*"], diff --git a/packages/api-event-handler-core/package.json b/packages/api-event-handler-core/package.json index 4342f55bad7..b63b961e973 100644 --- a/packages/api-event-handler-core/package.json +++ b/packages/api-event-handler-core/package.json @@ -23,7 +23,6 @@ "@webiny/api-core": "0.0.0", "@webiny/api-file-manager": "0.0.0", "@webiny/api-file-manager-aco": "0.0.0", - "@webiny/api-file-manager-s3": "0.0.0", "@webiny/api-headless-cms": "0.0.0", "@webiny/api-headless-cms-aco": "0.0.0", "@webiny/api-headless-cms-scheduler": "0.0.0", diff --git a/packages/api-event-handler-core/src/registerApiRequestStack.ts b/packages/api-event-handler-core/src/registerApiRequestStack.ts index 8a2aac5d0f0..c80c8881cdc 100644 --- a/packages/api-event-handler-core/src/registerApiRequestStack.ts +++ b/packages/api-event-handler-core/src/registerApiRequestStack.ts @@ -16,7 +16,6 @@ import { AcoFeature } from "@webiny/api-aco"; import { BackgroundTasksFeature } from "@webiny/background-tasks/api"; import { FileManagerAppFeature } from "@webiny/api-file-manager"; import { FileManagerAcoFeature } from "@webiny/api-file-manager-aco"; -import { FileManagerS3Feature } from "@webiny/api-file-manager-s3"; import { WebsiteBuilderFeature, setupWebsiteBuilderModels } from "@webiny/api-website-builder"; import { WebsiteBuilderWorkflowsFeature } from "@webiny/api-website-builder-workflows"; import { WebsiteBuilderSchedulerFeature } from "@webiny/api-website-builder-scheduler"; @@ -48,6 +47,14 @@ export interface RegisterApiRequestStackConfig { * On AWS this bridges the scheduler-aws extension (EventBridge Scheduler). Optional. */ registerSchedulerTransport?: (container: Container) => void | Promise; + /** + * Register the file-manager storage transport, run AFTER the transport-agnostic + * `FileManagerAppFeature` (which registers the AssetDeliveryRoute + NULL asset-delivery impls). The + * transport overrides those null impls with real ones and adds its file-operation features: on AWS + * `FileManagerS3Feature` (S3), on the server `FileManagerServerFeature` (local disk). Optional — + * omit for a deployment with no file storage. + */ + registerFileManagerTransport?: (container: Container) => void | Promise; } /** @@ -86,10 +93,10 @@ export async function registerApiRequestStack( AcoHcmsFeature.register(container); HcmsTasksFeature.register(container); - // ── File Manager ─────────────────────────────────────────── + // ── File Manager (domain) + storage transport ────────────── FileManagerAppFeature.register(container); FileManagerAcoFeature.register(container); - FileManagerS3Feature.register(container, {}); + await config.registerFileManagerTransport?.(container); // ── Website Builder ──────────────────────────────────────── WebsiteBuilderFeature.register(container); diff --git a/packages/api-event-handler-core/tsconfig.build.json b/packages/api-event-handler-core/tsconfig.build.json index 28f45f17fd5..57cd71d374f 100644 --- a/packages/api-event-handler-core/tsconfig.build.json +++ b/packages/api-event-handler-core/tsconfig.build.json @@ -7,7 +7,6 @@ { "path": "../api-core/tsconfig.build.json" }, { "path": "../api-file-manager/tsconfig.build.json" }, { "path": "../api-file-manager-aco/tsconfig.build.json" }, - { "path": "../api-file-manager-s3/tsconfig.build.json" }, { "path": "../api-headless-cms/tsconfig.build.json" }, { "path": "../api-headless-cms-aco/tsconfig.build.json" }, { "path": "../api-headless-cms-scheduler/tsconfig.build.json" }, @@ -44,8 +43,6 @@ "@webiny/api-file-manager": ["../api-file-manager/src"], "@webiny/api-file-manager-aco/*": ["../api-file-manager-aco/src/*"], "@webiny/api-file-manager-aco": ["../api-file-manager-aco/src"], - "@webiny/api-file-manager-s3/*": ["../api-file-manager-s3/src/*"], - "@webiny/api-file-manager-s3": ["../api-file-manager-s3/src"], "@webiny/api-headless-cms/*": ["../api-headless-cms/src/*"], "@webiny/api-headless-cms": ["../api-headless-cms/src"], "@webiny/api-headless-cms-aco/*": ["../api-headless-cms-aco/src/*"], diff --git a/packages/api-event-handler-core/tsconfig.json b/packages/api-event-handler-core/tsconfig.json index ae9c2d44d3a..ad03143207e 100644 --- a/packages/api-event-handler-core/tsconfig.json +++ b/packages/api-event-handler-core/tsconfig.json @@ -7,7 +7,6 @@ { "path": "../api-core" }, { "path": "../api-file-manager" }, { "path": "../api-file-manager-aco" }, - { "path": "../api-file-manager-s3" }, { "path": "../api-headless-cms" }, { "path": "../api-headless-cms-aco" }, { "path": "../api-headless-cms-scheduler" }, @@ -44,8 +43,6 @@ "@webiny/api-file-manager": ["../api-file-manager/src"], "@webiny/api-file-manager-aco/*": ["../api-file-manager-aco/src/*"], "@webiny/api-file-manager-aco": ["../api-file-manager-aco/src"], - "@webiny/api-file-manager-s3/*": ["../api-file-manager-s3/src/*"], - "@webiny/api-file-manager-s3": ["../api-file-manager-s3/src"], "@webiny/api-headless-cms/*": ["../api-headless-cms/src/*"], "@webiny/api-headless-cms": ["../api-headless-cms/src"], "@webiny/api-headless-cms-aco/*": ["../api-headless-cms-aco/src/*"], diff --git a/packages/api-event-handler-server/package.json b/packages/api-event-handler-server/package.json index b2986b118d8..1a9014a2012 100644 --- a/packages/api-event-handler-server/package.json +++ b/packages/api-event-handler-server/package.json @@ -20,6 +20,7 @@ "dependencies": { "@webiny/api-core": "0.0.0", "@webiny/api-event-handler-core": "0.0.0", + "@webiny/api-file-manager-server": "0.0.0", "@webiny/api-scheduler-server": "0.0.0", "@webiny/api-websockets-server": "0.0.0", "@webiny/background-tasks-server": "0.0.0", diff --git a/packages/api-event-handler-server/src/createWebinyApiHandler.ts b/packages/api-event-handler-server/src/createWebinyApiHandler.ts index aa04e891d0f..e02808a54f5 100644 --- a/packages/api-event-handler-server/src/createWebinyApiHandler.ts +++ b/packages/api-event-handler-server/src/createWebinyApiHandler.ts @@ -27,6 +27,7 @@ import { } from "@webiny/api-websockets-server"; import { BackgroundTasksServerFeature } from "@webiny/background-tasks-server"; import { registerSchedulerServerExtension } from "@webiny/api-scheduler-server"; +import { FileManagerServerFeature } from "@webiny/api-file-manager-server"; import { NodeHttpIdentityLoaderDecorator } from "~/handlers/NodeHttpIdentityLoaderDecorator.js"; import { NodeHttpTenantLoaderDecorator } from "~/handlers/NodeHttpTenantLoaderDecorator.js"; @@ -106,6 +107,13 @@ export function createWebinyApiHandler(config: CreateWebinyApiHandlerConfig) { // overrides the domain default, same seam as the realtime hook above. registerSchedulerTransport: requestContainer => { registerSchedulerServerExtension(requestContainer); + }, + // File-manager storage transport: local disk. Where AWS uses S3 (+ a separate asset- + // delivery Lambda), the single-process server stores files on disk and serves them + // in-process — FileManagerServerFeature registers local asset delivery (overriding the + // domain's null impls), the upload/multipart HTTP routes, and disk file operations. + registerFileManagerTransport: requestContainer => { + FileManagerServerFeature.register(requestContainer, {}); } }); }, diff --git a/packages/api-event-handler-server/tsconfig.build.json b/packages/api-event-handler-server/tsconfig.build.json index 3e3a53a0df5..0be429d65ca 100644 --- a/packages/api-event-handler-server/tsconfig.build.json +++ b/packages/api-event-handler-server/tsconfig.build.json @@ -4,6 +4,7 @@ "references": [ { "path": "../api-core/tsconfig.build.json" }, { "path": "../api-event-handler-core/tsconfig.build.json" }, + { "path": "../api-file-manager-server/tsconfig.build.json" }, { "path": "../api-scheduler-server/tsconfig.build.json" }, { "path": "../api-websockets-server/tsconfig.build.json" }, { "path": "../background-tasks-server/tsconfig.build.json" }, @@ -22,6 +23,8 @@ "@webiny/api-core": ["../api-core/src"], "@webiny/api-event-handler-core/*": ["../api-event-handler-core/src/*"], "@webiny/api-event-handler-core": ["../api-event-handler-core/src"], + "@webiny/api-file-manager-server/*": ["../api-file-manager-server/src/*"], + "@webiny/api-file-manager-server": ["../api-file-manager-server/src"], "@webiny/api-scheduler-server/*": ["../api-scheduler-server/src/*"], "@webiny/api-scheduler-server": ["../api-scheduler-server/src"], "@webiny/api-websockets-server/*": ["../api-websockets-server/src/*"], diff --git a/packages/api-event-handler-server/tsconfig.json b/packages/api-event-handler-server/tsconfig.json index 62b474ebe3d..13bb9049870 100644 --- a/packages/api-event-handler-server/tsconfig.json +++ b/packages/api-event-handler-server/tsconfig.json @@ -4,6 +4,7 @@ "references": [ { "path": "../api-core" }, { "path": "../api-event-handler-core" }, + { "path": "../api-file-manager-server" }, { "path": "../api-scheduler-server" }, { "path": "../api-websockets-server" }, { "path": "../background-tasks-server" }, @@ -22,6 +23,8 @@ "@webiny/api-core": ["../api-core/src"], "@webiny/api-event-handler-core/*": ["../api-event-handler-core/src/*"], "@webiny/api-event-handler-core": ["../api-event-handler-core/src"], + "@webiny/api-file-manager-server/*": ["../api-file-manager-server/src/*"], + "@webiny/api-file-manager-server": ["../api-file-manager-server/src"], "@webiny/api-scheduler-server/*": ["../api-scheduler-server/src/*"], "@webiny/api-scheduler-server": ["../api-scheduler-server/src"], "@webiny/api-websockets-server/*": ["../api-websockets-server/src/*"], diff --git a/packages/api-file-manager-server/package.json b/packages/api-file-manager-server/package.json index f685218507d..5c62c6e3b8b 100644 --- a/packages/api-file-manager-server/package.json +++ b/packages/api-file-manager-server/package.json @@ -20,10 +20,12 @@ "@webiny/event-handler-core": "0.0.0", "@webiny/feature": "0.0.0", "@webiny/handler": "0.0.0", + "@webiny/handler-graphql": "0.0.0", "@webiny/plugins": "0.0.0", "@webiny/utils": "0.0.0", "@webiny/validation": "0.0.0", "exifreader": "^4.41.0", + "p-map": "^7.0.5", "sharp": "^0.35.3" }, "devDependencies": { diff --git a/packages/api-file-manager-server/src/FileManagerServerFeature.ts b/packages/api-file-manager-server/src/FileManagerServerFeature.ts index 250015912d0..610fc840ad5 100644 --- a/packages/api-file-manager-server/src/FileManagerServerFeature.ts +++ b/packages/api-file-manager-server/src/FileManagerServerFeature.ts @@ -1,6 +1,10 @@ -import { existsSync, mkdirSync } from "node:fs"; import { type Container, createFeature } from "@webiny/feature/api"; -import { FileManagerServerConfig } from "~/features/FileManagerServerConfig/abstractions.js"; +import { CoreGraphQLSchemaFactory } from "@webiny/handler-graphql/graphql/abstractions.js"; +import { ReadFileMetadataFeature } from "@webiny/api-file-manager/features/upload/ReadFileMetadata/feature.js"; +import { WriteFileMetadataFeature } from "@webiny/api-file-manager/features/upload/WriteFileMetadata/feature.js"; +import { createLocalAssetDeliveryFeature } from "~/assetDelivery/feature.js"; +import type { AssetDeliveryParams } from "~/assetDelivery/types.js"; +import { createServerFileManagerGraphQLSchema } from "~/graphql/schema.js"; import { FileManagerServerConfigFeature } from "~/features/FileManagerServerConfig/feature.js"; import { UploadSingleFileRouteFeature } from "~/routes/UploadSingleFileRoute/feature.js"; import { UploadPartRouteFeature } from "~/routes/UploadPartRoute/feature.js"; @@ -14,15 +18,36 @@ import { GetUploadPayloadFeature } from "~/features/GetUploadPayload/feature.js" import { CreateMultiPartUploadFeature } from "~/features/CreateMultiPartUpload/feature.js"; import { CompleteMultiPartUploadFeature } from "~/features/CompleteMultiPartUpload/feature.js"; +export interface FileManagerServerFeatureConfig { + assetDelivery?: AssetDeliveryParams; +} + export const FileManagerServerFeature = createFeature({ name: "FileManagerServer", - register(container: Container) { + register(container: Container, config: FileManagerServerFeatureConfig = {}) { + // NOTE: do NOT resolve FileManagerServerConfig here. This runs at the file-manager transport + // hook, BEFORE project extensions (which register the WEBINY_LOCAL_STORAGE_PATH / + // WEBINY_UPLOAD_SECRET build params) are applied later in the request stack. Config is resolved + // lazily at request time by the routes/use-cases below; it also ensures its storage dir on + // construction. Resolving it eagerly here would read the build params before they exist. FileManagerServerConfigFeature.register(container); - const config = container.resolve(FileManagerServerConfig); - if (!existsSync(config.storagePath)) { - mkdirSync(config.storagePath, { recursive: true }); - } + // Local (disk) asset-delivery implementations (LocalAssetResolver/OutputStrategy/SharpTransform) + // override the null delivery registered by AssetDeliveryFeature in FileManagerAppFeature — the + // same seam FileManagerS3Feature uses with createS3AssetDeliveryFeature. Without this the domain + // AssetDeliveryRoute resolves the null impls and serves nothing. + createLocalAssetDeliveryFeature(config.assetDelivery).register(container); + + // Metadata reader (FileManager/Upload/MetadataReader) — the generic domain impl backed by the + // GlobalKeyValueStore. Required by the server's ExtractMetadata task + GetFileContentsById use + // cases; without it createFile fails with "No registration found for FileManager/Upload/MetadataReader". + ReadFileMetadataFeature.register(container); + + // Metadata writer — the generic domain WriteMetadataAfterCreate/BatchCreate event handlers write + // the asset metadata (id/tenant/size/contentType/bucketKey) to the GlobalKeyValueStore on file + // create. Asset delivery (LocalAssetResolver) reads that metadata to locate the file on disk; + // without it every delivered file 404s ("asset not found"). Mirrors S3's WriteFileMetadataFeature. + WriteFileMetadataFeature.register(container); FlushCacheFeature.register(container); DeleteFileFromDiskFeature.register(container); @@ -35,5 +60,22 @@ export const FileManagerServerFeature = createFeature({ CleanupStaleMultipartUploadsFeature.register(container); UploadSingleFileRouteFeature.register(container); UploadPartRouteFeature.register(container); + + // Upload GraphQL (getPreSignedPostPayload/getPreSignedPostPayloads + create/completeMultiPartUpload). + // Mirrors how FileManagerS3Feature contributes its schema — same query/mutation names so the SDK + // works unchanged; resolvers delegate to the server upload use cases registered above. + const serverSchema = createServerFileManagerGraphQLSchema(); + container.registerInstance(CoreGraphQLSchemaFactory, { + async execute(builder) { + const { schema } = serverSchema; + if (schema.typeDefs) { + builder.addTypeDefs(schema.typeDefs); + } + if (schema.resolvers) { + builder.addLegacyResolvers(schema.resolvers as Record); + } + return builder; + } + }); } }); diff --git a/packages/api-file-manager-server/src/features/CreateMultiPartUpload/CreateMultiPartUploadUseCase.ts b/packages/api-file-manager-server/src/features/CreateMultiPartUpload/CreateMultiPartUploadUseCase.ts index b644105485b..23963913448 100644 --- a/packages/api-file-manager-server/src/features/CreateMultiPartUpload/CreateMultiPartUploadUseCase.ts +++ b/packages/api-file-manager-server/src/features/CreateMultiPartUpload/CreateMultiPartUploadUseCase.ts @@ -2,7 +2,6 @@ import path from "node:path"; import { mkdir } from "node:fs/promises"; import { mdbid } from "@webiny/utils"; import { TenantContext } from "@webiny/api-core/features/tenancy/TenantContext/index.js"; -import { Request } from "@webiny/handler/abstractions/Request.js"; import { CreateMultiPartUploadUseCase as CreateMultiPartUploadUseCaseAbstraction } from "@webiny/api-file-manager/features/upload/CreateMultiPartUpload/index.js"; import type { CreateMultiPartUploadResult } from "@webiny/api-file-manager/features/upload/types.js"; import { createUploadToken } from "~/utils/uploadToken.js"; @@ -14,7 +13,6 @@ class CreateMultiPartUploadUseCaseImpl { public constructor( private readonly tenantContext: TenantContext.Interface, - private readonly request: Request.Interface, private readonly config: FileManagerServerConfig.Interface ) {} @@ -24,7 +22,7 @@ class CreateMultiPartUploadUseCaseImpl const { file, numberOfParts } = params; const storagePath = this.config.storagePath; const tenant = this.tenantContext.getTenant(); - const serverUrl = await resolveServerUrl(this.request); + const serverUrl = resolveServerUrl(); const uploadId = mdbid(); @@ -60,5 +58,5 @@ class CreateMultiPartUploadUseCaseImpl export const CreateMultiPartUploadUseCase = CreateMultiPartUploadUseCaseAbstraction.createImplementation({ implementation: CreateMultiPartUploadUseCaseImpl, - dependencies: [TenantContext, Request, FileManagerServerConfig] + dependencies: [TenantContext, FileManagerServerConfig] }); diff --git a/packages/api-file-manager-server/src/features/FileManagerServerConfig/FileManagerServerConfig.ts b/packages/api-file-manager-server/src/features/FileManagerServerConfig/FileManagerServerConfig.ts index 2beef5d4928..5849f18a9eb 100644 --- a/packages/api-file-manager-server/src/features/FileManagerServerConfig/FileManagerServerConfig.ts +++ b/packages/api-file-manager-server/src/features/FileManagerServerConfig/FileManagerServerConfig.ts @@ -1,3 +1,4 @@ +import { existsSync, mkdirSync } from "node:fs"; import { BuildParams } from "@webiny/api-core/features/buildParams/index.js"; import { FileManagerServerConfig as FileManagerServerConfigAbstraction } from "./abstractions.js"; @@ -22,6 +23,15 @@ class FileManagerServerConfigImpl implements FileManagerServerConfigAbstraction. this.storagePath = storagePath; this.uploadSecret = uploadSecret; + + // Ensure the storage directory exists. Done here (on first resolve, at request time) rather + // than in FileManagerServerFeature.register(): build params like WEBINY_LOCAL_STORAGE_PATH are + // only registered once project extensions are applied, which happens LATER in the request + // stack than the file-manager transport hook — so resolving this config at register() time + // would read the param before it exists and throw. + if (!existsSync(this.storagePath)) { + mkdirSync(this.storagePath, { recursive: true }); + } } } diff --git a/packages/api-file-manager-server/src/features/GetUploadPayload/GetUploadPayloadUseCase.ts b/packages/api-file-manager-server/src/features/GetUploadPayload/GetUploadPayloadUseCase.ts index 9b088245fa5..f5f3b99b08f 100644 --- a/packages/api-file-manager-server/src/features/GetUploadPayload/GetUploadPayloadUseCase.ts +++ b/packages/api-file-manager-server/src/features/GetUploadPayload/GetUploadPayloadUseCase.ts @@ -1,6 +1,5 @@ import { validation } from "@webiny/validation"; import { TenantContext } from "@webiny/api-core/features/tenancy/TenantContext/index.js"; -import { Request } from "@webiny/handler/abstractions/Request.js"; import { GetUploadPayloadUseCase as GetUploadPayloadUseCaseAbstraction } from "@webiny/api-file-manager/features/upload/GetUploadPayload/index.js"; import type { FileData } from "@webiny/api-file-manager/features/upload/types.js"; import type { UploadPayloadResponse } from "@webiny/api-file-manager/features/upload/types.js"; @@ -23,7 +22,6 @@ const sanitizeFileSizeValue = (value: number, defaultValue: number): number => { class GetUploadPayloadUseCaseImpl implements GetUploadPayloadUseCaseAbstraction.Interface { public constructor( private readonly tenantContext: TenantContext.Interface, - private readonly request: Request.Interface, private readonly config: FileManagerServerConfig.Interface ) {} @@ -53,7 +51,7 @@ class GetUploadPayloadUseCaseImpl implements GetUploadPayloadUseCaseAbstraction. secret ); - const serverUrl = await resolveServerUrl(this.request); + const serverUrl = resolveServerUrl(); const data = { url: `${serverUrl}/webiny-file-upload`, @@ -72,5 +70,5 @@ class GetUploadPayloadUseCaseImpl implements GetUploadPayloadUseCaseAbstraction. export const GetUploadPayloadUseCase = GetUploadPayloadUseCaseAbstraction.createImplementation({ implementation: GetUploadPayloadUseCaseImpl, - dependencies: [TenantContext, Request, FileManagerServerConfig] + dependencies: [TenantContext, FileManagerServerConfig] }); diff --git a/packages/api-file-manager-server/src/graphql/schema.ts b/packages/api-file-manager-server/src/graphql/schema.ts new file mode 100644 index 00000000000..6a01dc1d71c --- /dev/null +++ b/packages/api-file-manager-server/src/graphql/schema.ts @@ -0,0 +1,225 @@ +import pMap from "p-map"; +import { createGraphQLSchemaPlugin } from "@webiny/handler-graphql"; +import { IdentityContext } from "@webiny/api-core/features/security/IdentityContext/index.js"; +import { ErrorResponse, Response } from "@webiny/handler-graphql/responses.js"; +import { GetSettingsUseCase } from "@webiny/api-file-manager/features/settings/GetSettings/abstractions.js"; +import { GetUploadPayloadUseCase } from "@webiny/api-file-manager/features/upload/GetUploadPayload/index.js"; +import { CreateMultiPartUploadUseCase } from "@webiny/api-file-manager/features/upload/CreateMultiPartUpload/index.js"; +import { CompleteMultiPartUploadUseCase } from "@webiny/api-file-manager/features/upload/CompleteMultiPartUpload/index.js"; +import { + checkPermissions, + FileNormalizer +} from "@webiny/api-file-manager/features/upload/index.js"; +import type { FileData } from "@webiny/api-file-manager/features/upload/types.js"; + +// Build the normalizer WITHOUT the gql context: the domain's `createFileNormalizerFromContext` reads +// `context.plugins.byType(...)` (the legacy plugins registry), which the DI-native server gql context +// does not populate — calling it throws "Cannot read properties of undefined (reading 'byType')". The +// modifier is optional; FileNormalizer still generates the id/type/key. The server has no legacy +// FileUploadModifierPlugins, so an empty (no-modifier) normalizer is the correct behaviour here. +const createNormalizer = () => new FileNormalizer(); + +/** + * Upload GraphQL for the self-hosted (server) flavour. Mirrors the SDL that `api-file-manager-s3`'s + * `createS3GraphQLSchema` contributes (same query/mutation names + `PreSignedPostPayloadInput`), so the + * transport-agnostic SDK (`getPresignedPostPayload` + the generic multipart-form `uploadToS3`, and the + * multipart methods) works unchanged. The payload shape (`{ url, fields }`) is generic; only the + * resolvers differ from S3 — they resolve the server upload use cases from the container (local disk + + * the `/webiny-file-upload` HTTP routes) instead of constructing an S3 client. + */ +export const createServerFileManagerGraphQLSchema = () => { + return createGraphQLSchemaPlugin({ + typeDefs: /* GraphQL */ ` + type UploadFileResponseDataFile { + id: ID! + name: String! + type: String! + size: Long! + key: String! + } + + input PreSignedPostPayloadInput { + id: ID + name: String! + type: String! + size: Long! + key: String + keyPrefix: String + } + + type GetPreSignedPostPayloadResponseDataFile { + id: ID! + name: String! + type: String! + size: Long! + key: String! + } + + type GetPreSignedPostPayloadResponseData { + # Contains data that is necessary for initiating a file upload. + data: JSON! + file: UploadFileResponseDataFile! + } + + type GetPreSignedPostPayloadResponse { + error: FmError + data: GetPreSignedPostPayloadResponseData + } + + type MultiPartUploadFilePart { + partNumber: Int! + url: String! + } + + type CreateMultiPartUploadResponseData { + file: GetPreSignedPostPayloadResponseDataFile! + uploadId: String! + parts: [MultiPartUploadFilePart!]! + } + + type CompleteMultiPartUploadResponse { + data: Boolean + error: FmError + } + + type GetPreSignedPostPayloadsResponse { + error: FmError + data: [GetPreSignedPostPayloadResponseData!]! + } + + extend type FmQuery { + getPreSignedPostPayload( + data: PreSignedPostPayloadInput! + ): GetPreSignedPostPayloadResponse + getPreSignedPostPayloads( + data: [PreSignedPostPayloadInput]! + ): GetPreSignedPostPayloadsResponse + } + + type CreateMultiPartUploadResponse { + data: CreateMultiPartUploadResponseData + error: FmError + } + + input MultiPartUploadFilePartInput { + partNumber: Int! + etag: String! + } + + extend type FmMutation { + createMultiPartUpload( + data: PreSignedPostPayloadInput! + numberOfParts: Number! + ): CreateMultiPartUploadResponse + + completeMultiPartUpload( + fileKey: String! + uploadId: String! + ): CompleteMultiPartUploadResponse + } + `, + resolvers: { + FmQuery: { + getPreSignedPostPayload: async (_: unknown, args: any, context: any) => { + const identityContext = context.container.resolve(IdentityContext); + try { + await checkPermissions(identityContext, { rwd: "w" }); + + const getSettings = context.container.resolve(GetSettingsUseCase); + const settingsResult = await getSettings.execute(); + const settings = settingsResult.value; + + const normalizer = createNormalizer(); + const useCase = context.container.resolve(GetUploadPayloadUseCase); + + const payload = await useCase.execute( + (await normalizer.normalizeFile(args.data)) as FileData, + settings + ); + + return new Response(payload); + } catch (e) { + return new ErrorResponse({ + message: e.message, + code: e.code, + data: e.data + }); + } + }, + getPreSignedPostPayloads: async (_: unknown, args: any, context: any) => { + const identityContext = context.container.resolve(IdentityContext); + try { + await checkPermissions(identityContext, { rwd: "w" }); + + const getSettings = context.container.resolve(GetSettingsUseCase); + const settingsResult = await getSettings.execute(); + const settings = settingsResult.value; + + const normalizer = createNormalizer(); + const useCase = context.container.resolve(GetUploadPayloadUseCase); + + const files = args.data as any[]; + const payloads = await pMap(files, async (data: any) => { + return useCase.execute( + (await normalizer.normalizeFile(data)) as FileData, + settings + ); + }); + + return new Response(payloads); + } catch (e) { + return new ErrorResponse({ + message: e.message, + code: e.code, + data: e.data + }); + } + } + }, + FmMutation: { + createMultiPartUpload: async (_: unknown, args: any, context: any) => { + const identityContext = context.container.resolve(IdentityContext); + try { + await checkPermissions(identityContext, { rwd: "w" }); + + const normalizer = createNormalizer(); + const useCase = context.container.resolve(CreateMultiPartUploadUseCase); + + const result = await useCase.execute({ + file: (await normalizer.normalizeFile(args.data)) as FileData, + numberOfParts: args.numberOfParts + }); + + return new Response(result); + } catch (e) { + return new ErrorResponse({ + message: e.message, + code: e.code, + data: e.data + }); + } + }, + completeMultiPartUpload: async (_: unknown, args: any, context: any) => { + const identityContext = context.container.resolve(IdentityContext); + try { + await checkPermissions(identityContext, { rwd: "w" }); + + const useCase = context.container.resolve(CompleteMultiPartUploadUseCase); + await useCase.execute({ + fileKey: args.fileKey, + uploadId: args.uploadId + }); + + return new Response(true); + } catch (e) { + return new ErrorResponse({ + message: e.message, + code: e.code, + data: e.data + }); + } + } + } + } + }); +}; diff --git a/packages/api-file-manager-server/src/utils/resolveServerUrl.ts b/packages/api-file-manager-server/src/utils/resolveServerUrl.ts index 3d135d7cc4e..5e176978c42 100644 --- a/packages/api-file-manager-server/src/utils/resolveServerUrl.ts +++ b/packages/api-file-manager-server/src/utils/resolveServerUrl.ts @@ -1,16 +1,19 @@ -import { ServiceDiscovery } from "@webiny/api-core/features/serviceDiscovery/ServiceDiscovery.js"; -import type { Request } from "@webiny/handler/types.js"; - -export const resolveServerUrl = async (request: Request): Promise => { - const manifest = await ServiceDiscovery.load(); - const domain = manifest?.api?.cloudfront?.domain; - if (domain) { - return domain as string; +/** + * Resolve the base URL the file-upload endpoints (`/webiny-file-upload`) are reachable at. This URL is + * handed to the client (admin) in the upload payload, so it must be an origin the client can POST to. + * + * The DI-native server gql context exposes no request headers to resolvers (GraphQLRoute forwards only + * the body), so — unlike the AWS flavour — we cannot derive the host from the incoming request. Instead + * we use the configured API origin `WEBINY_API_URL` (the same value the admin app is pointed at via + * `Admin.ApiUrl`), falling back to `http://localhost:${PORT}` for local dev where the client and server + * share the machine (PORT is injected at runtime by runApiServer — the port the server listens on). + */ +export const resolveServerUrl = (): string => { + const configured = process.env.WEBINY_API_URL; + if (configured) { + return configured.replace(/\/+$/, ""); } - const headers = request.headers ?? {}; - const host = headers["host"] ?? headers["x-forwarded-host"] ?? "localhost"; - const protocol = headers["x-forwarded-proto"] ?? "https"; - - return `${protocol}://${host}`; + const port = process.env.PORT || "3002"; + return `http://localhost:${port}`; }; diff --git a/packages/api-file-manager-server/tsconfig.build.json b/packages/api-file-manager-server/tsconfig.build.json index d49750b2813..3d1bfa83ac6 100644 --- a/packages/api-file-manager-server/tsconfig.build.json +++ b/packages/api-file-manager-server/tsconfig.build.json @@ -8,6 +8,7 @@ { "path": "../event-handler-core/tsconfig.build.json" }, { "path": "../feature/tsconfig.build.json" }, { "path": "../handler/tsconfig.build.json" }, + { "path": "../handler-graphql/tsconfig.build.json" }, { "path": "../plugins/tsconfig.build.json" }, { "path": "../utils/tsconfig.build.json" }, { "path": "../validation/tsconfig.build.json" } @@ -31,6 +32,8 @@ "@webiny/feature": ["../feature/src"], "@webiny/handler/*": ["../handler/src/*"], "@webiny/handler": ["../handler/src"], + "@webiny/handler-graphql/*": ["../handler-graphql/src/*"], + "@webiny/handler-graphql": ["../handler-graphql/src"], "@webiny/plugins/*": ["../plugins/src/*"], "@webiny/plugins": ["../plugins/src"], "@webiny/utils/*": ["../utils/src/*"], diff --git a/packages/api-file-manager-server/tsconfig.json b/packages/api-file-manager-server/tsconfig.json index ac02f1d4e04..832fc3b6727 100644 --- a/packages/api-file-manager-server/tsconfig.json +++ b/packages/api-file-manager-server/tsconfig.json @@ -8,6 +8,7 @@ { "path": "../event-handler-core" }, { "path": "../feature" }, { "path": "../handler" }, + { "path": "../handler-graphql" }, { "path": "../plugins" }, { "path": "../utils" }, { "path": "../validation" } @@ -31,6 +32,8 @@ "@webiny/feature": ["../feature/src"], "@webiny/handler/*": ["../handler/src/*"], "@webiny/handler": ["../handler/src"], + "@webiny/handler-graphql/*": ["../handler-graphql/src/*"], + "@webiny/handler-graphql": ["../handler-graphql/src"], "@webiny/plugins/*": ["../plugins/src/*"], "@webiny/plugins": ["../plugins/src"], "@webiny/utils/*": ["../utils/src/*"], diff --git a/packages/api-file-manager/src/features/settings/SettingsInstaller/SettingsInstaller.ts b/packages/api-file-manager/src/features/settings/SettingsInstaller/SettingsInstaller.ts index f17a4c09f77..127e35778d5 100644 --- a/packages/api-file-manager/src/features/settings/SettingsInstaller/SettingsInstaller.ts +++ b/packages/api-file-manager/src/features/settings/SettingsInstaller/SettingsInstaller.ts @@ -21,7 +21,11 @@ class SettingsInstallerImpl implements AppInstaller.Interface { // If no records in the database, `manifest` object is empty POJO. // That's why the heavy `?.` usage. - const domain = manifest?.api?.cloudfront.domain; + // + // The AWS flavour serves files from a CloudFront domain (in the manifest). The self-hosted + // (server) flavour has no CloudFront — files are served by the api's own `/files/*` route — so + // fall back to the configured API origin (WEBINY_API_URL), the same origin the client uses. + const domain = manifest?.api?.cloudfront?.domain ?? process.env.WEBINY_API_URL ?? ""; await this.updateSettings.execute({ srcPrefix: `${domain}/files` diff --git a/packages/api-scheduler-server/src/context.ts b/packages/api-scheduler-server/src/context.ts index 0b6b3fb725e..90a56aa0a34 100644 --- a/packages/api-scheduler-server/src/context.ts +++ b/packages/api-scheduler-server/src/context.ts @@ -1,5 +1,6 @@ import type { Container } from "@webiny/di"; import { RequestContextInitializer } from "@webiny/event-handler-core"; +import type { IRequestContextInitializer } from "@webiny/event-handler-core"; import { SchedulerService } from "@webiny/api-scheduler/shared/abstractions.js"; import { ExecuteScheduledActionUseCase } from "@webiny/api-scheduler/features/ExecuteScheduledAction/index.js"; import { ListScheduledActionsUseCase } from "@webiny/api-scheduler/features/ListScheduledActions/index.js"; @@ -8,58 +9,80 @@ import { TenantContext } from "@webiny/api-core/features/tenancy/TenantContext/i import { BreeSchedulerService } from "~/BreeSchedulerService.js"; /** - * Registers the self-hosted (Bree, in-process) scheduler transport. Binds `SchedulerService` - * per-request via a RequestContextInitializer (post-tenant): builds the Bree service, wires the - * trigger to ExecuteScheduledActionUseCase, and starts it with the tenant's pending actions. + * Per-request scheduler initializer for the self-hosted (Bree, in-process) transport. Builds the Bree + * service, wires the trigger to ExecuteScheduledActionUseCase, binds `SchedulerService`, and starts it + * with the tenant's pending actions. + * + * IMPORTANT — this MUST be registered via `container.register()` (not `registerInstance()`), and hence + * runs in the LATER RequestContextInitializer bucket. Its `init()` lists scheduled actions, which needs + * `ScheduledActionModel` — and that model is registered by another RequestContextInitializer + * (`SchedulerModelContextualSchema`, registered by `SchedulerFeature` via `register()`). `@webiny/di` + * runs `registerInstance` initializers BEFORE `register` ones, so a `registerInstance` here would run + * before the model exists → "No registration found for ScheduledActionModel". Registering as an + * implementation keeps both in the same (register) bucket, ordered by registration: `SchedulerFeature` + * (which registers the model initializer) is registered before this transport hook, so the model is + * always available by the time this runs. */ -export const registerSchedulerServerExtension = (container: Container) => { - container.registerInstance(RequestContextInitializer, { - async init(ctx: Record) { - const requestContainer = ctx.container as Container; - const tenantContext = requestContainer.resolve(TenantContext); +class SchedulerServerContextInitializerImpl implements IRequestContextInitializer { + async init(ctx: Record): Promise { + const requestContainer = ctx.container as Container; + const tenantContext = requestContainer.resolve(TenantContext); - const tenant = tenantContext.getTenant(); - if (!tenant) { - return; - } + const tenant = tenantContext.getTenant(); + if (!tenant) { + return; + } - const logger = requestContainer.resolve(Logger); - const executeScheduledAction = requestContainer.resolve(ExecuteScheduledActionUseCase); + const logger = requestContainer.resolve(Logger); + const executeScheduledAction = requestContainer.resolve(ExecuteScheduledActionUseCase); - const service = new BreeSchedulerService({ - logger, - onTrigger: async (id, namespace) => { - const result = await executeScheduledAction.execute({ - id, - namespace, - tenant: tenant.id - }); + const service = new BreeSchedulerService({ + logger, + onTrigger: async (id, namespace) => { + const result = await executeScheduledAction.execute({ + id, + namespace, + tenant: tenant.id + }); - if (result.isFail()) { - logger.error( - `Scheduled action "${id}" execution failed: ${result.error.message}` - ); - } + if (result.isFail()) { + logger.error( + `Scheduled action "${id}" execution failed: ${result.error.message}` + ); } - }); + } + }); - requestContainer.registerInstance(SchedulerService, service); + requestContainer.registerInstance(SchedulerService, service); - const listScheduledActions = requestContainer.resolve(ListScheduledActionsUseCase); - const listResult = await listScheduledActions.execute({ - where: {}, - limit: 1000 - }); + const listScheduledActions = requestContainer.resolve(ListScheduledActionsUseCase); + const listResult = await listScheduledActions.execute({ + where: {}, + limit: 1000 + }); - const pendingActions = listResult.isOk() - ? listResult.value.items.map(action => ({ - id: action.id, - namespace: action.namespace, - scheduledFor: action.scheduledFor - })) - : undefined; + const pendingActions = listResult.isOk() + ? listResult.value.items.map(action => ({ + id: action.id, + namespace: action.namespace, + scheduledFor: action.scheduledFor + })) + : undefined; - await service.start(pendingActions); - } - }); + await service.start(pendingActions); + } +} + +const SchedulerServerContextInitializer = RequestContextInitializer.createImplementation({ + implementation: SchedulerServerContextInitializerImpl, + dependencies: [] +}); + +/** + * Registers the self-hosted (Bree, in-process) scheduler transport. Binds `SchedulerService` + * per-request via a RequestContextInitializer (post-tenant) — see the class doc for the ordering + * constraint that requires `register()` over `registerInstance()`. + */ +export const registerSchedulerServerExtension = (container: Container) => { + container.register(SchedulerServerContextInitializer); }; diff --git a/packages/background-tasks-server/src/service/WorkerTaskService.ts b/packages/background-tasks-server/src/service/WorkerTaskService.ts index 5813fbfdba5..3dae9d927f8 100644 --- a/packages/background-tasks-server/src/service/WorkerTaskService.ts +++ b/packages/background-tasks-server/src/service/WorkerTaskService.ts @@ -2,7 +2,6 @@ import { Worker } from "node:worker_threads"; import type { WorkerToParentMessage } from "~/worker/TaskOrchestratorMessage.js"; import { TaskService } from "@webiny/background-tasks/api/domain/TaskService.js"; import { TenantContext } from "@webiny/api-core/exports/api/tenancy.js"; -import { BuildParams } from "@webiny/api-core/exports/api.js"; import { InternalToken } from "~/domain/InternalToken.js"; const DEFAULT_SERVER_PORT = 3000; @@ -22,10 +21,13 @@ class WorkerServiceImpl implements TaskService.Interface { public constructor( private readonly tenantContext: TenantContext.Interface, - private readonly buildParams: BuildParams.Interface, private readonly internalToken: InternalToken.Interface ) { - const port = this.buildParams.get("SERVER_PORT") || DEFAULT_SERVER_PORT; + // Single-process server flavour: the worker POSTs the task back to THIS server's + // `/background-task` route. The port is the one the server actually listens on — injected at + // runtime as `process.env.PORT` by `runApiServer` (dynamic, chosen via findFreePort), NOT a + // build-time value. It cannot be a build param: the port isn't known until the process starts. + const port = process.env.PORT || DEFAULT_SERVER_PORT; this.serverUrl = `http://localhost:${port}/background-task`; } @@ -105,5 +107,5 @@ class WorkerServiceImpl implements TaskService.Interface { export const WorkerService = TaskService.createImplementation({ implementation: WorkerServiceImpl, - dependencies: [TenantContext, BuildParams, InternalToken] + dependencies: [TenantContext, InternalToken] }); diff --git a/packages/event-handler-server/src/createServerHandler.ts b/packages/event-handler-server/src/createServerHandler.ts index cc4d0eebb7d..221b1f582e5 100644 --- a/packages/event-handler-server/src/createServerHandler.ts +++ b/packages/event-handler-server/src/createServerHandler.ts @@ -37,6 +37,12 @@ export async function createServerHandler( res.end(); } else if (typeof body === "string") { res.end(body); + } else if (Buffer.isBuffer(body) || body instanceof Uint8Array) { + // Binary response (e.g. asset delivery returns an image Buffer). Write the raw bytes — + // JSON.stringify(buffer) would serialize it to `{"type":"Buffer","data":[...]}`, which + // the browser rejects (ERR_BLOCKED_BY_ORB) since it isn't the declared image content. + // The route's own Content-Type header (set via res.writeHead above) is preserved. + res.end(body); } else { res.end(JSON.stringify(body)); } diff --git a/packages/event-handler-server/src/translators/NodeHttpTranslator.ts b/packages/event-handler-server/src/translators/NodeHttpTranslator.ts index 7c39d7812eb..814d4de2a6f 100644 --- a/packages/event-handler-server/src/translators/NodeHttpTranslator.ts +++ b/packages/event-handler-server/src/translators/NodeHttpTranslator.ts @@ -5,23 +5,33 @@ import type { IHttpRequest } from "@webiny/event-handler-core"; async function readBody(req: IncomingMessage): Promise { return new Promise((resolve, reject) => { - let raw = ""; + // Collect raw Buffer chunks — do NOT string-concat: `raw += chunk` utf8-decodes each chunk and + // corrupts binary bodies (e.g. multipart/form-data file uploads), making them unparseable. + const chunks: Buffer[] = []; req.on("data", chunk => { - raw += chunk; + chunks.push(Buffer.isBuffer(chunk) ? chunk : Buffer.from(chunk)); }); req.on("end", () => { - if (!raw) { + if (chunks.length === 0) { return resolve(undefined); } + const buffer = Buffer.concat(chunks); const ct = (req.headers["content-type"] || "").toLowerCase(); if (ct.includes("application/json")) { + const text = buffer.toString("utf8"); try { - resolve(JSON.parse(raw)); + resolve(JSON.parse(text)); } catch { - resolve(raw); + resolve(text); } + } else if (ct.startsWith("text/") || ct.includes("application/x-www-form-urlencoded")) { + // Known text bodies → decode as a string. + resolve(buffer.toString("utf8")); } else { - resolve(raw); + // Everything else (multipart/form-data file uploads, octet-stream, or an unlabeled raw + // PUT body like a multipart upload part) is binary — hand routes the raw bytes. Decoding + // these as utf8 would corrupt the payload. + resolve(buffer); } }); req.on("error", reject); diff --git a/packages/project-server/src/extensions/FileStorage.tsx b/packages/project-server/src/extensions/FileStorage.tsx new file mode 100644 index 00000000000..09f0ada656f --- /dev/null +++ b/packages/project-server/src/extensions/FileStorage.tsx @@ -0,0 +1,45 @@ +import React from "react"; +import nodePath from "node:path"; +import { z } from "zod"; +import { defineExtension, BuildParam } from "@webiny/project/extensions/index.js"; + +/** + * Configure the self-hosted (server) flavour's local file storage (uploaded files) + upload secret. + * + * Emitted as the API build parameters `WEBINY_LOCAL_STORAGE_PATH` (the on-disk directory uploaded + * files are written to and served from) and `WEBINY_UPLOAD_SECRET` (used to sign upload tokens), + * which `FileManagerServerConfig` reads via `BuildParams`. Note this uses `BuildParam` (DI build + * params), NOT `EnvVar` like `Infra.Sqlite` — the SQLite connection reads `process.env` directly, + * whereas the file-manager server config resolves these through `BuildParams.get(...)`, so they must + * be registered as build params (same channel as `Infra.Crypto.Encryption`). + * + * A relative storage path is resolved against the project root (not the disposable app workspace), so + * uploaded files survive rebuilds — same rule as `Infra.Sqlite`. + * + * AWS-flavour counterpart concept: the S3 bucket (`ApiFileManager`). + */ +export const FileStorage = defineExtension({ + type: "Infra/FileStorage", + tags: { runtimeContext: "project" }, + description: "Configure the server flavour's local file storage directory and upload secret.", + paramsSchema: z.object({ + path: z + .string() + .describe( + "Path to the local file storage directory (absolute, or relative to the project root)." + ), + uploadSecret: z.string().describe("Secret string used to sign file upload tokens.") + }), + render({ path: storagePathParam, uploadSecret }) { + const storagePath = nodePath.isAbsolute(storagePathParam) + ? storagePathParam + : nodePath.join(process.cwd(), storagePathParam); + + return ( + <> + + + + ); + } +}); diff --git a/packages/project-server/src/infra.ts b/packages/project-server/src/infra.ts index 395bed9581f..82b6186ec77 100644 --- a/packages/project-server/src/infra.ts +++ b/packages/project-server/src/infra.ts @@ -11,6 +11,7 @@ import { } from "@webiny/project/extensions/index.js"; import { CiIs, CiIsNot } from "@webiny/project/extensions/infra/index.js"; import { Sqlite } from "./extensions/Sqlite.js"; +import { FileStorage } from "./extensions/FileStorage.js"; /** * Server-flavour counterpart to project-aws's `Infra`, limited to what applies off-AWS. Omits the @@ -30,6 +31,8 @@ export const Infra = { EnvVar, // Server-flavour SQL storage (engine-named, like Infra.OpenSearch on AWS). Sqlite, + // Server-flavour local file storage (counterpart to the AWS S3 bucket). + FileStorage, Ci: { Is: CiIs, IsNot: CiIsNot diff --git a/webiny.config.server.tsx b/webiny.config.server.tsx index e531606e113..5a2e5551c6d 100644 --- a/webiny.config.server.tsx +++ b/webiny.config.server.tsx @@ -16,6 +16,13 @@ export const ServerExtensions = () => { workspace), so data persists across builds/watch restarts. */} + {/* Local file storage (uploaded files) + upload signing secret. Storage path resolves like + the SQLite file — against the project root — so uploads persist across rebuilds. */} + + {/* Hand the admin app the API URL (AWS derives this from stack output; server has none). */} diff --git a/yarn.lock b/yarn.lock index 2b2027cc8ef..ecfca3d201d 100644 --- a/yarn.lock +++ b/yarn.lock @@ -10738,6 +10738,7 @@ __metadata: dependencies: "@webiny/api-core": "npm:0.0.0" "@webiny/api-event-handler-core": "npm:0.0.0" + "@webiny/api-file-manager-s3": "npm:0.0.0" "@webiny/api-scheduler-aws": "npm:0.0.0" "@webiny/api-websockets": "npm:0.0.0" "@webiny/api-websockets-aws": "npm:0.0.0" @@ -10767,7 +10768,6 @@ __metadata: "@webiny/api-core": "npm:0.0.0" "@webiny/api-file-manager": "npm:0.0.0" "@webiny/api-file-manager-aco": "npm:0.0.0" - "@webiny/api-file-manager-s3": "npm:0.0.0" "@webiny/api-headless-cms": "npm:0.0.0" "@webiny/api-headless-cms-aco": "npm:0.0.0" "@webiny/api-headless-cms-scheduler": "npm:0.0.0" @@ -10828,6 +10828,7 @@ __metadata: dependencies: "@webiny/api-core": "npm:0.0.0" "@webiny/api-event-handler-core": "npm:0.0.0" + "@webiny/api-file-manager-server": "npm:0.0.0" "@webiny/api-scheduler-server": "npm:0.0.0" "@webiny/api-websockets-server": "npm:0.0.0" "@webiny/background-tasks-server": "npm:0.0.0" @@ -10905,7 +10906,7 @@ __metadata: languageName: unknown linkType: soft -"@webiny/api-file-manager-server@workspace:packages/api-file-manager-server": +"@webiny/api-file-manager-server@npm:0.0.0, @webiny/api-file-manager-server@workspace:packages/api-file-manager-server": version: 0.0.0-use.local resolution: "@webiny/api-file-manager-server@workspace:packages/api-file-manager-server" dependencies: @@ -10916,10 +10917,12 @@ __metadata: "@webiny/event-handler-core": "npm:0.0.0" "@webiny/feature": "npm:0.0.0" "@webiny/handler": "npm:0.0.0" + "@webiny/handler-graphql": "npm:0.0.0" "@webiny/plugins": "npm:0.0.0" "@webiny/utils": "npm:0.0.0" "@webiny/validation": "npm:0.0.0" exifreader: "npm:^4.41.0" + p-map: "npm:^7.0.5" rimraf: "npm:^6.1.3" sharp: "npm:^0.35.3" typescript: "npm:^7.0.2" From 311b66bc47c6f827a53d88af0ce2fa60cec61137 Mon Sep 17 00:00:00 2001 From: adrians5j Date: Wed, 15 Jul 2026 07:56:37 +0200 Subject: [PATCH 3/6] refactor(self-hosted): group request-stack transport hooks under `transports` MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Collapse the three structurally-identical hooks (registerRealtimeTransport / registerSchedulerTransport / registerFileManagerTransport) into a single `transports: { realtime?, scheduler?, fileManager? }` object on RegisterApiRequestStackConfig, plus a shared `TransportRegistrar` type. Behaviour unchanged — the adapters still run at the same interleave points. Makes "these are all transport adapters" one named concept and adding a future request-seam transport a single key rather than a new top-level param. Updates the AWS and server handlers to match. Co-Authored-By: Claude Opus 4.8 (1M context) --- .../src/createWebinyApiHandler.ts | 34 +++++++------ .../src/registerApiRequestStack.ts | 51 +++++++++++-------- .../src/createWebinyApiHandler.ts | 45 ++++++++-------- 3 files changed, 71 insertions(+), 59 deletions(-) diff --git a/packages/api-event-handler-aws/src/createWebinyApiHandler.ts b/packages/api-event-handler-aws/src/createWebinyApiHandler.ts index f2e98334ef0..3d380f92240 100644 --- a/packages/api-event-handler-aws/src/createWebinyApiHandler.ts +++ b/packages/api-event-handler-aws/src/createWebinyApiHandler.ts @@ -114,25 +114,27 @@ export function createWebinyApiHandler(config: CreateWebinyApiHandlerConfig) { }, request: async container => { - // The per-request feature stack is transport-agnostic (shared with the future server - // transport). The two AWS-specific interleave points are supplied as hooks. + // The per-request feature stack is transport-agnostic (shared with the server transport). + // The AWS-specific interleave points are supplied as the `transports` adapters. await registerApiRequestStack(container, { extensions: config.extensions, registerRequestStorage: config.registerRequestStorage, - // Real AWS WebSocket transport (API Gateway Management API), registered right after - // WebsocketsFeature so it overrides the NullWebsocketsTransport. - registerRealtimeTransport: c => { - WebsocketsAwsFeature.register(c); - }, - // Scheduler transport: the scheduler-aws extension (EventBridge Scheduler). - registerSchedulerTransport: c => { - registerSchedulerAwsExtension(c, { - getClient: schedulerConfig => createSchedulerClient(schedulerConfig) - }); - }, - // File-manager storage transport: S3 (asset delivery + S3 file operations + schema). - registerFileManagerTransport: c => { - FileManagerS3Feature.register(c, {}); + transports: { + // Real AWS WebSocket transport (API Gateway Management API), registered right after + // WebsocketsFeature so it overrides the NullWebsocketsTransport. + realtime: c => { + WebsocketsAwsFeature.register(c); + }, + // Scheduler transport: the scheduler-aws extension (EventBridge Scheduler). + scheduler: c => { + registerSchedulerAwsExtension(c, { + getClient: schedulerConfig => createSchedulerClient(schedulerConfig) + }); + }, + // File-manager storage transport: S3 (asset delivery + S3 file operations + schema). + fileManager: c => { + FileManagerS3Feature.register(c, {}); + } } }); } diff --git a/packages/api-event-handler-core/src/registerApiRequestStack.ts b/packages/api-event-handler-core/src/registerApiRequestStack.ts index c80c8881cdc..15084a7c761 100644 --- a/packages/api-event-handler-core/src/registerApiRequestStack.ts +++ b/packages/api-event-handler-core/src/registerApiRequestStack.ts @@ -23,6 +23,9 @@ import { WebsocketsFeature } from "@webiny/api-websockets"; import { WorkflowsFeature } from "@webiny/api-workflows"; import { SchedulerFeature } from "@webiny/api-scheduler"; +/** Installs a flavour-specific transport adapter into the per-request container at its interleave point. */ +export type TransportRegistrar = (container: Container) => void | Promise; + export interface RegisterApiRequestStackConfig { /** * Project-defined extensions, applied at register() time (so extension features — including @@ -35,26 +38,30 @@ export interface RegisterApiRequestStackConfig { */ registerRequestStorage?: (container: Container) => void | Promise; /** - * Register the real-time (websockets) transport, run immediately AFTER the transport-agnostic - * `WebsocketsFeature`. On AWS this is `WebsocketsAwsFeature` (API Gateway Management API); it - * MUST register after WebsocketsFeature so it overrides the NullWebsocketsTransport - * (nearest-container-last-wins), otherwise every server→client send() is a silent no-op. - * Optional — omit for transports with no real-time push. - */ - registerRealtimeTransport?: (container: Container) => void | Promise; - /** - * Register the scheduler transport, run AFTER `SchedulerFeature` and BEFORE `CmsSchedulerFeature`. - * On AWS this bridges the scheduler-aws extension (EventBridge Scheduler). Optional. - */ - registerSchedulerTransport?: (container: Container) => void | Promise; - /** - * Register the file-manager storage transport, run AFTER the transport-agnostic - * `FileManagerAppFeature` (which registers the AssetDeliveryRoute + NULL asset-delivery impls). The - * transport overrides those null impls with real ones and adds its file-operation features: on AWS - * `FileManagerS3Feature` (S3), on the server `FileManagerServerFeature` (local disk). Optional — - * omit for a deployment with no file storage. + * Flavour-specific transport adapters, each installed at its exact interleave point in the stack. + * Every entry follows the same shape: it runs immediately AFTER the transport-agnostic domain + * Feature has registered its NULL default, and overrides that default (nearest-container-last-wins) + * with the real adapter. Each is optional — omit one for a deployment/transport that lacks that + * capability. AWS supplies AWS adapters (API Gateway Management API / EventBridge / S3); the + * self-hosted server supplies in-process adapters (server WebSockets / Bree / local disk). */ - registerFileManagerTransport?: (container: Container) => void | Promise; + transports?: { + /** + * Real-time (WebSockets) transport, run right after `WebsocketsFeature`. Overrides the + * NullWebsocketsTransport, otherwise every server→client send() is a silent no-op. + */ + realtime?: TransportRegistrar; + /** + * Scheduler transport, run AFTER `SchedulerFeature` and BEFORE `CmsSchedulerFeature`. + */ + scheduler?: TransportRegistrar; + /** + * File-manager storage transport, run AFTER `FileManagerAppFeature` (which registers the + * AssetDeliveryRoute + NULL asset-delivery impls). Overrides those nulls with real impls and + * adds the file-operation features. + */ + fileManager?: TransportRegistrar; + }; } /** @@ -96,7 +103,7 @@ export async function registerApiRequestStack( // ── File Manager (domain) + storage transport ────────────── FileManagerAppFeature.register(container); FileManagerAcoFeature.register(container); - await config.registerFileManagerTransport?.(container); + await config.transports?.fileManager?.(container); // ── Website Builder ──────────────────────────────────────── WebsiteBuilderFeature.register(container); @@ -106,7 +113,7 @@ export async function registerApiRequestStack( // ── Websockets (domain) + real-time transport ────────────── WebsocketsFeature.register(container); - await config.registerRealtimeTransport?.(container); + await config.transports?.realtime?.(container); // ── Supporting services ──────────────────────────────────── MailerFeature.register(container); @@ -121,7 +128,7 @@ export async function registerApiRequestStack( // ── Scheduler + scheduler transport ──────────────────────── SchedulerFeature.register(container); - await config.registerSchedulerTransport?.(container); + await config.transports?.scheduler?.(container); CmsSchedulerFeature.register(container); // ── Extensions ───────────────────────────────────────────── diff --git a/packages/api-event-handler-server/src/createWebinyApiHandler.ts b/packages/api-event-handler-server/src/createWebinyApiHandler.ts index e02808a54f5..d178e4db6f7 100644 --- a/packages/api-event-handler-server/src/createWebinyApiHandler.ts +++ b/packages/api-event-handler-server/src/createWebinyApiHandler.ts @@ -89,31 +89,34 @@ export function createWebinyApiHandler(config: CreateWebinyApiHandlerConfig) { // Bree/in-process scheduler transport (the single-process equivalent of EventBridge). await registerApiRequestStack(container, { extensions: config.extensions, - // Why a hook (and not just registering the transport ourselves): `.register()` calls + // Why hooks (and not just registering the transports ourselves): `.register()` calls // are otherwise order-independent — you can register Features in any order, because // they only REGISTER, they don't RESOLVE during registration (resolution happens // later, in Initializers / SchemaFactories). The one thing that makes order matter is - // a DEFAULT registration: `WebsocketsFeature` registers `NullWebsocketsTransport` so - // the abstraction is always resolvable. Overriding it (last-registration-wins) means - // our transport MUST be registered AFTER `WebsocketsFeature`. This hook is the seam - // `registerApiRequestStack` provides for exactly that — it runs right after the Null + // a DEFAULT registration: e.g. `WebsocketsFeature` registers `NullWebsocketsTransport` + // so the abstraction is always resolvable. Overriding it (last-registration-wins) means + // our transport MUST be registered AFTER that Feature. These hooks are the seams + // `registerApiRequestStack` provides for exactly that — each runs right after its Null // default, so the override is guaranteed without the caller knowing the internal order. - registerRealtimeTransport: requestContainer => { - requestContainer.register(ServerWebsocketsTransport); - }, - // Scheduler transport: the Bree/in-process extension. Where AWS bridges EventBridge - // Scheduler, the single-process server drives delayed/scheduled action triggers with - // in-process timers (Bree). The hook runs right after SchedulerFeature so this transport - // overrides the domain default, same seam as the realtime hook above. - registerSchedulerTransport: requestContainer => { - registerSchedulerServerExtension(requestContainer); - }, - // File-manager storage transport: local disk. Where AWS uses S3 (+ a separate asset- - // delivery Lambda), the single-process server stores files on disk and serves them - // in-process — FileManagerServerFeature registers local asset delivery (overriding the - // domain's null impls), the upload/multipart HTTP routes, and disk file operations. - registerFileManagerTransport: requestContainer => { - FileManagerServerFeature.register(requestContainer, {}); + transports: { + // Server WebSockets transport; resolves the shared connection manager + adapter + // from the root (registered as singletons above). + realtime: requestContainer => { + requestContainer.register(ServerWebsocketsTransport); + }, + // Scheduler transport: the Bree/in-process extension. Where AWS bridges EventBridge + // Scheduler, the single-process server drives delayed/scheduled action triggers with + // in-process timers (Bree). + scheduler: requestContainer => { + registerSchedulerServerExtension(requestContainer); + }, + // File-manager storage transport: local disk. Where AWS uses S3 (+ a separate asset- + // delivery Lambda), the single-process server stores files on disk and serves them + // in-process — FileManagerServerFeature registers local asset delivery (overriding + // the domain's null impls), the upload/multipart HTTP routes, and disk file ops. + fileManager: requestContainer => { + FileManagerServerFeature.register(requestContainer, {}); + } } }); }, From 07e6d2ac1d90bcb3ad7d20bebef27134e43705ce Mon Sep 17 00:00:00 2001 From: adrians5j Date: Wed, 15 Jul 2026 12:39:26 +0200 Subject: [PATCH 4/6] refactor(self-hosted): drop unused FileManagerServerFeatureConfig The `assetDelivery` config knob was never set (both S3 and server callers pass no config), so it was speculative parity. Remove the interface + param; register with `createLocalAssetDeliveryFeature()` defaults. Co-Authored-By: Claude Opus 4.8 (1M context) --- .../src/createWebinyApiHandler.ts | 2 +- .../src/FileManagerServerFeature.ts | 9 ++------- 2 files changed, 3 insertions(+), 8 deletions(-) diff --git a/packages/api-event-handler-server/src/createWebinyApiHandler.ts b/packages/api-event-handler-server/src/createWebinyApiHandler.ts index d178e4db6f7..682e4409655 100644 --- a/packages/api-event-handler-server/src/createWebinyApiHandler.ts +++ b/packages/api-event-handler-server/src/createWebinyApiHandler.ts @@ -115,7 +115,7 @@ export function createWebinyApiHandler(config: CreateWebinyApiHandlerConfig) { // in-process — FileManagerServerFeature registers local asset delivery (overriding // the domain's null impls), the upload/multipart HTTP routes, and disk file ops. fileManager: requestContainer => { - FileManagerServerFeature.register(requestContainer, {}); + FileManagerServerFeature.register(requestContainer); } } }); diff --git a/packages/api-file-manager-server/src/FileManagerServerFeature.ts b/packages/api-file-manager-server/src/FileManagerServerFeature.ts index 610fc840ad5..2b6e07de546 100644 --- a/packages/api-file-manager-server/src/FileManagerServerFeature.ts +++ b/packages/api-file-manager-server/src/FileManagerServerFeature.ts @@ -3,7 +3,6 @@ import { CoreGraphQLSchemaFactory } from "@webiny/handler-graphql/graphql/abstra import { ReadFileMetadataFeature } from "@webiny/api-file-manager/features/upload/ReadFileMetadata/feature.js"; import { WriteFileMetadataFeature } from "@webiny/api-file-manager/features/upload/WriteFileMetadata/feature.js"; import { createLocalAssetDeliveryFeature } from "~/assetDelivery/feature.js"; -import type { AssetDeliveryParams } from "~/assetDelivery/types.js"; import { createServerFileManagerGraphQLSchema } from "~/graphql/schema.js"; import { FileManagerServerConfigFeature } from "~/features/FileManagerServerConfig/feature.js"; import { UploadSingleFileRouteFeature } from "~/routes/UploadSingleFileRoute/feature.js"; @@ -18,13 +17,9 @@ import { GetUploadPayloadFeature } from "~/features/GetUploadPayload/feature.js" import { CreateMultiPartUploadFeature } from "~/features/CreateMultiPartUpload/feature.js"; import { CompleteMultiPartUploadFeature } from "~/features/CompleteMultiPartUpload/feature.js"; -export interface FileManagerServerFeatureConfig { - assetDelivery?: AssetDeliveryParams; -} - export const FileManagerServerFeature = createFeature({ name: "FileManagerServer", - register(container: Container, config: FileManagerServerFeatureConfig = {}) { + register(container: Container) { // NOTE: do NOT resolve FileManagerServerConfig here. This runs at the file-manager transport // hook, BEFORE project extensions (which register the WEBINY_LOCAL_STORAGE_PATH / // WEBINY_UPLOAD_SECRET build params) are applied later in the request stack. Config is resolved @@ -36,7 +31,7 @@ export const FileManagerServerFeature = createFeature({ // override the null delivery registered by AssetDeliveryFeature in FileManagerAppFeature — the // same seam FileManagerS3Feature uses with createS3AssetDeliveryFeature. Without this the domain // AssetDeliveryRoute resolves the null impls and serves nothing. - createLocalAssetDeliveryFeature(config.assetDelivery).register(container); + createLocalAssetDeliveryFeature().register(container); // Metadata reader (FileManager/Upload/MetadataReader) — the generic domain impl backed by the // GlobalKeyValueStore. Required by the server's ExtractMetadata task + GetFileContentsById use From 5309d3b52a95a1f13e49b2cd8886a6a40a400ff7 Mon Sep 17 00:00:00 2001 From: adrians5j Date: Wed, 15 Jul 2026 14:28:35 +0200 Subject: [PATCH 5/6] wip:6 (hap7r) --- .../ScheduledActionLambdaHandler.d.ts | 18 -- .../ScheduledActionLambdaHandler.js | 41 ---- .../ScheduledActionLambdaHandler.js.map | 1 - .../dist._build/SchedulerFeature.d.ts | 6 - .../dist._build/SchedulerFeature.js | 21 -- .../dist._build/SchedulerFeature.js.map | 1 - .../dist._build/SchedulerFeature.types.d.ts | 5 - .../dist._build/SchedulerFeature.types.js | 0 .../SchedulerModelContextualSchema.d.ts | 13 -- .../SchedulerModelContextualSchema.js | 32 --- .../SchedulerModelContextualSchema.js.map | 1 - .../api-scheduler/dist._build/constants.d.ts | 13 -- .../api-scheduler/dist._build/constants.js | 13 -- .../dist._build/constants.js.map | 1 - .../domain/SchedulePrivateModel.d.ts | 8 - .../domain/SchedulePrivateModel.js | 32 --- .../domain/SchedulePrivateModel.js.map | 1 - .../dist._build/domain/ScheduledActionId.d.ts | 8 - .../dist._build/domain/ScheduledActionId.js | 17 -- .../domain/ScheduledActionId.js.map | 1 - .../domain/ScheduledActionIdWithVersion.d.ts | 3 - .../domain/ScheduledActionIdWithVersion.js | 9 - .../ScheduledActionIdWithVersion.js.map | 1 - .../domain/ScheduledActionMapper.d.ts | 16 -- .../domain/ScheduledActionMapper.js | 37 --- .../domain/ScheduledActionMapper.js.map | 1 - .../dist._build/domain/errors.d.ts | 55 ----- .../dist._build/domain/errors.js | 61 ----- .../dist._build/domain/errors.js.map | 1 - .../dist._build/domain/isValidDate.d.ts | 6 - .../dist._build/domain/isValidDate.js | 8 - .../dist._build/domain/isValidDate.js.map | 1 - .../dist._build/domain/permissionsSchema.d.ts | 9 - .../dist._build/domain/permissionsSchema.js | 18 -- .../domain/permissionsSchema.js.map | 1 - .../dist._build/exports/api/scheduler.d.ts | 10 - .../dist._build/exports/api/scheduler.js | 8 - .../CancelScheduledActionUseCase.d.ts | 28 --- .../CancelScheduledActionUseCase.js | 58 ----- .../CancelScheduledActionUseCase.js.map | 1 - .../CancelScheduledAction/abstractions.d.ts | 32 --- .../CancelScheduledAction/abstractions.js | 5 - .../CancelScheduledAction/abstractions.js.map | 1 - .../CancelScheduledAction/feature.d.ts | 10 - .../features/CancelScheduledAction/feature.js | 11 - .../CancelScheduledAction/feature.js.map | 1 - .../features/CancelScheduledAction/index.d.ts | 1 - .../features/CancelScheduledAction/index.js | 1 - .../ExecuteScheduledActionUseCase.d.ts | 33 --- .../ExecuteScheduledActionUseCase.js | 82 ------- .../ExecuteScheduledActionUseCase.js.map | 1 - .../ScheduledActionHandlerComposite.d.ts | 19 -- .../ScheduledActionHandlerComposite.js | 28 --- .../ScheduledActionHandlerComposite.js.map | 1 - .../ExecuteScheduledAction/abstractions.d.ts | 54 ----- .../ExecuteScheduledAction/abstractions.js | 17 -- .../abstractions.js.map | 1 - .../ExecuteScheduledAction/feature.d.ts | 10 - .../ExecuteScheduledAction/feature.js | 13 -- .../ExecuteScheduledAction/feature.js.map | 1 - .../ExecuteScheduledAction/index.d.ts | 1 - .../features/ExecuteScheduledAction/index.js | 1 - .../GetScheduledActionUseCase.d.ts | 28 --- .../GetScheduledActionUseCase.js | 48 ---- .../GetScheduledActionUseCase.js.map | 1 - .../GetScheduledAction/abstractions.d.ts | 33 --- .../GetScheduledAction/abstractions.js | 5 - .../GetScheduledAction/abstractions.js.map | 1 - .../features/GetScheduledAction/feature.d.ts | 10 - .../features/GetScheduledAction/feature.js | 11 - .../GetScheduledAction/feature.js.map | 1 - .../features/GetScheduledAction/index.d.ts | 1 - .../features/GetScheduledAction/index.js | 1 - .../GetTargetScheduledActionUseCase.d.ts | 32 --- .../GetTargetScheduledActionUseCase.js | 64 ----- .../GetTargetScheduledActionUseCase.js.map | 1 - .../abstractions.d.ts | 24 -- .../GetTargetScheduledAction/abstractions.js | 5 - .../abstractions.js.map | 1 - .../GetTargetScheduledAction/feature.d.ts | 10 - .../GetTargetScheduledAction/feature.js | 11 - .../GetTargetScheduledAction/feature.js.map | 1 - .../GetTargetScheduledAction/index.d.ts | 1 - .../GetTargetScheduledAction/index.js | 1 - .../ListScheduledActionsUseCase.d.ts | 31 --- .../ListScheduledActionsUseCase.js | 63 ----- .../ListScheduledActionsUseCase.js.map | 1 - .../ListScheduledActions/abstractions.d.ts | 57 ----- .../ListScheduledActions/abstractions.js | 5 - .../ListScheduledActions/abstractions.js.map | 1 - .../ListScheduledActions/feature.d.ts | 10 - .../features/ListScheduledActions/feature.js | 11 - .../ListScheduledActions/feature.js.map | 1 - .../features/ListScheduledActions/index.d.ts | 1 - .../features/ListScheduledActions/index.js | 1 - .../NamespaceHandlerExecutioner.d.ts | 11 - .../NamespaceHandlerExecutioner.js | 26 --- .../NamespaceHandlerExecutioner.js.map | 1 - .../NamespaceHandler/abstractions.d.ts | 50 ---- .../features/NamespaceHandler/abstractions.js | 6 - .../NamespaceHandler/abstractions.js.map | 1 - .../features/NamespaceHandler/feature.d.ts | 4 - .../features/NamespaceHandler/feature.js | 11 - .../features/NamespaceHandler/feature.js.map | 1 - .../features/NamespaceHandler/index.d.ts | 1 - .../features/NamespaceHandler/index.js | 1 - .../ScheduleAction/ScheduleActionUseCase.d.ts | 45 ---- .../ScheduleAction/ScheduleActionUseCase.js | 171 -------------- .../ScheduleActionUseCase.js.map | 1 - .../features/ScheduleAction/abstractions.d.ts | 36 --- .../features/ScheduleAction/abstractions.js | 5 - .../ScheduleAction/abstractions.js.map | 1 - .../features/ScheduleAction/feature.d.ts | 10 - .../features/ScheduleAction/feature.js | 11 - .../features/ScheduleAction/feature.js.map | 1 - .../features/ScheduleAction/index.d.ts | 1 - .../features/ScheduleAction/index.js | 1 - .../features/SchedulerFeature.d.ts | 11 - .../dist._build/features/SchedulerFeature.js | 21 -- .../features/SchedulerFeature.js.map | 1 - .../VoidSchedulerService.d.ts | 15 -- .../SchedulerService/VoidSchedulerService.js | 24 -- .../VoidSchedulerService.js.map | 1 - .../features/permissions/abstractions.d.ts | 14 -- .../features/permissions/abstractions.js | 6 - .../features/permissions/abstractions.js.map | 1 - .../features/permissions/feature.d.ts | 4 - .../features/permissions/feature.js | 7 - .../features/permissions/feature.js.map | 1 - .../graphql/SchedulerGraphQLFactory.d.ts | 8 - .../graphql/SchedulerGraphQLFactory.js | 219 ------------------ .../graphql/SchedulerGraphQLFactory.js.map | 1 - .../dist._build/graphql/feature.d.ts | 4 - .../dist._build/graphql/feature.js | 11 - .../dist._build/graphql/feature.js.map | 1 - .../dist._build/graphql/index.d.ts | 1 - .../dist._build/graphql/index.js | 1 - packages/api-scheduler/dist._build/index.d.ts | 6 - packages/api-scheduler/dist._build/index.js | 4 - .../dist._build/shared/abstractions.d.ts | 107 --------- .../dist._build/shared/abstractions.js | 7 - .../dist._build/shared/abstractions.js.map | 1 - 142 files changed, 2235 deletions(-) delete mode 100644 packages/api-scheduler/dist._build/ScheduledActionLambdaHandler.d.ts delete mode 100644 packages/api-scheduler/dist._build/ScheduledActionLambdaHandler.js delete mode 100644 packages/api-scheduler/dist._build/ScheduledActionLambdaHandler.js.map delete mode 100644 packages/api-scheduler/dist._build/SchedulerFeature.d.ts delete mode 100644 packages/api-scheduler/dist._build/SchedulerFeature.js delete mode 100644 packages/api-scheduler/dist._build/SchedulerFeature.js.map delete mode 100644 packages/api-scheduler/dist._build/SchedulerFeature.types.d.ts delete mode 100644 packages/api-scheduler/dist._build/SchedulerFeature.types.js delete mode 100644 packages/api-scheduler/dist._build/SchedulerModelContextualSchema.d.ts delete mode 100644 packages/api-scheduler/dist._build/SchedulerModelContextualSchema.js delete mode 100644 packages/api-scheduler/dist._build/SchedulerModelContextualSchema.js.map delete mode 100644 packages/api-scheduler/dist._build/constants.d.ts delete mode 100644 packages/api-scheduler/dist._build/constants.js delete mode 100644 packages/api-scheduler/dist._build/constants.js.map delete mode 100644 packages/api-scheduler/dist._build/domain/SchedulePrivateModel.d.ts delete mode 100644 packages/api-scheduler/dist._build/domain/SchedulePrivateModel.js delete mode 100644 packages/api-scheduler/dist._build/domain/SchedulePrivateModel.js.map delete mode 100644 packages/api-scheduler/dist._build/domain/ScheduledActionId.d.ts delete mode 100644 packages/api-scheduler/dist._build/domain/ScheduledActionId.js delete mode 100644 packages/api-scheduler/dist._build/domain/ScheduledActionId.js.map delete mode 100644 packages/api-scheduler/dist._build/domain/ScheduledActionIdWithVersion.d.ts delete mode 100644 packages/api-scheduler/dist._build/domain/ScheduledActionIdWithVersion.js delete mode 100644 packages/api-scheduler/dist._build/domain/ScheduledActionIdWithVersion.js.map delete mode 100644 packages/api-scheduler/dist._build/domain/ScheduledActionMapper.d.ts delete mode 100644 packages/api-scheduler/dist._build/domain/ScheduledActionMapper.js delete mode 100644 packages/api-scheduler/dist._build/domain/ScheduledActionMapper.js.map delete mode 100644 packages/api-scheduler/dist._build/domain/errors.d.ts delete mode 100644 packages/api-scheduler/dist._build/domain/errors.js delete mode 100644 packages/api-scheduler/dist._build/domain/errors.js.map delete mode 100644 packages/api-scheduler/dist._build/domain/isValidDate.d.ts delete mode 100644 packages/api-scheduler/dist._build/domain/isValidDate.js delete mode 100644 packages/api-scheduler/dist._build/domain/isValidDate.js.map delete mode 100644 packages/api-scheduler/dist._build/domain/permissionsSchema.d.ts delete mode 100644 packages/api-scheduler/dist._build/domain/permissionsSchema.js delete mode 100644 packages/api-scheduler/dist._build/domain/permissionsSchema.js.map delete mode 100644 packages/api-scheduler/dist._build/exports/api/scheduler.d.ts delete mode 100644 packages/api-scheduler/dist._build/exports/api/scheduler.js delete mode 100644 packages/api-scheduler/dist._build/features/CancelScheduledAction/CancelScheduledActionUseCase.d.ts delete mode 100644 packages/api-scheduler/dist._build/features/CancelScheduledAction/CancelScheduledActionUseCase.js delete mode 100644 packages/api-scheduler/dist._build/features/CancelScheduledAction/CancelScheduledActionUseCase.js.map delete mode 100644 packages/api-scheduler/dist._build/features/CancelScheduledAction/abstractions.d.ts delete mode 100644 packages/api-scheduler/dist._build/features/CancelScheduledAction/abstractions.js delete mode 100644 packages/api-scheduler/dist._build/features/CancelScheduledAction/abstractions.js.map delete mode 100644 packages/api-scheduler/dist._build/features/CancelScheduledAction/feature.d.ts delete mode 100644 packages/api-scheduler/dist._build/features/CancelScheduledAction/feature.js delete mode 100644 packages/api-scheduler/dist._build/features/CancelScheduledAction/feature.js.map delete mode 100644 packages/api-scheduler/dist._build/features/CancelScheduledAction/index.d.ts delete mode 100644 packages/api-scheduler/dist._build/features/CancelScheduledAction/index.js delete mode 100644 packages/api-scheduler/dist._build/features/ExecuteScheduledAction/ExecuteScheduledActionUseCase.d.ts delete mode 100644 packages/api-scheduler/dist._build/features/ExecuteScheduledAction/ExecuteScheduledActionUseCase.js delete mode 100644 packages/api-scheduler/dist._build/features/ExecuteScheduledAction/ExecuteScheduledActionUseCase.js.map delete mode 100644 packages/api-scheduler/dist._build/features/ExecuteScheduledAction/ScheduledActionHandlerComposite.d.ts delete mode 100644 packages/api-scheduler/dist._build/features/ExecuteScheduledAction/ScheduledActionHandlerComposite.js delete mode 100644 packages/api-scheduler/dist._build/features/ExecuteScheduledAction/ScheduledActionHandlerComposite.js.map delete mode 100644 packages/api-scheduler/dist._build/features/ExecuteScheduledAction/abstractions.d.ts delete mode 100644 packages/api-scheduler/dist._build/features/ExecuteScheduledAction/abstractions.js delete mode 100644 packages/api-scheduler/dist._build/features/ExecuteScheduledAction/abstractions.js.map delete mode 100644 packages/api-scheduler/dist._build/features/ExecuteScheduledAction/feature.d.ts delete mode 100644 packages/api-scheduler/dist._build/features/ExecuteScheduledAction/feature.js delete mode 100644 packages/api-scheduler/dist._build/features/ExecuteScheduledAction/feature.js.map delete mode 100644 packages/api-scheduler/dist._build/features/ExecuteScheduledAction/index.d.ts delete mode 100644 packages/api-scheduler/dist._build/features/ExecuteScheduledAction/index.js delete mode 100644 packages/api-scheduler/dist._build/features/GetScheduledAction/GetScheduledActionUseCase.d.ts delete mode 100644 packages/api-scheduler/dist._build/features/GetScheduledAction/GetScheduledActionUseCase.js delete mode 100644 packages/api-scheduler/dist._build/features/GetScheduledAction/GetScheduledActionUseCase.js.map delete mode 100644 packages/api-scheduler/dist._build/features/GetScheduledAction/abstractions.d.ts delete mode 100644 packages/api-scheduler/dist._build/features/GetScheduledAction/abstractions.js delete mode 100644 packages/api-scheduler/dist._build/features/GetScheduledAction/abstractions.js.map delete mode 100644 packages/api-scheduler/dist._build/features/GetScheduledAction/feature.d.ts delete mode 100644 packages/api-scheduler/dist._build/features/GetScheduledAction/feature.js delete mode 100644 packages/api-scheduler/dist._build/features/GetScheduledAction/feature.js.map delete mode 100644 packages/api-scheduler/dist._build/features/GetScheduledAction/index.d.ts delete mode 100644 packages/api-scheduler/dist._build/features/GetScheduledAction/index.js delete mode 100644 packages/api-scheduler/dist._build/features/GetTargetScheduledAction/GetTargetScheduledActionUseCase.d.ts delete mode 100644 packages/api-scheduler/dist._build/features/GetTargetScheduledAction/GetTargetScheduledActionUseCase.js delete mode 100644 packages/api-scheduler/dist._build/features/GetTargetScheduledAction/GetTargetScheduledActionUseCase.js.map delete mode 100644 packages/api-scheduler/dist._build/features/GetTargetScheduledAction/abstractions.d.ts delete mode 100644 packages/api-scheduler/dist._build/features/GetTargetScheduledAction/abstractions.js delete mode 100644 packages/api-scheduler/dist._build/features/GetTargetScheduledAction/abstractions.js.map delete mode 100644 packages/api-scheduler/dist._build/features/GetTargetScheduledAction/feature.d.ts delete mode 100644 packages/api-scheduler/dist._build/features/GetTargetScheduledAction/feature.js delete mode 100644 packages/api-scheduler/dist._build/features/GetTargetScheduledAction/feature.js.map delete mode 100644 packages/api-scheduler/dist._build/features/GetTargetScheduledAction/index.d.ts delete mode 100644 packages/api-scheduler/dist._build/features/GetTargetScheduledAction/index.js delete mode 100644 packages/api-scheduler/dist._build/features/ListScheduledActions/ListScheduledActionsUseCase.d.ts delete mode 100644 packages/api-scheduler/dist._build/features/ListScheduledActions/ListScheduledActionsUseCase.js delete mode 100644 packages/api-scheduler/dist._build/features/ListScheduledActions/ListScheduledActionsUseCase.js.map delete mode 100644 packages/api-scheduler/dist._build/features/ListScheduledActions/abstractions.d.ts delete mode 100644 packages/api-scheduler/dist._build/features/ListScheduledActions/abstractions.js delete mode 100644 packages/api-scheduler/dist._build/features/ListScheduledActions/abstractions.js.map delete mode 100644 packages/api-scheduler/dist._build/features/ListScheduledActions/feature.d.ts delete mode 100644 packages/api-scheduler/dist._build/features/ListScheduledActions/feature.js delete mode 100644 packages/api-scheduler/dist._build/features/ListScheduledActions/feature.js.map delete mode 100644 packages/api-scheduler/dist._build/features/ListScheduledActions/index.d.ts delete mode 100644 packages/api-scheduler/dist._build/features/ListScheduledActions/index.js delete mode 100644 packages/api-scheduler/dist._build/features/NamespaceHandler/NamespaceHandlerExecutioner.d.ts delete mode 100644 packages/api-scheduler/dist._build/features/NamespaceHandler/NamespaceHandlerExecutioner.js delete mode 100644 packages/api-scheduler/dist._build/features/NamespaceHandler/NamespaceHandlerExecutioner.js.map delete mode 100644 packages/api-scheduler/dist._build/features/NamespaceHandler/abstractions.d.ts delete mode 100644 packages/api-scheduler/dist._build/features/NamespaceHandler/abstractions.js delete mode 100644 packages/api-scheduler/dist._build/features/NamespaceHandler/abstractions.js.map delete mode 100644 packages/api-scheduler/dist._build/features/NamespaceHandler/feature.d.ts delete mode 100644 packages/api-scheduler/dist._build/features/NamespaceHandler/feature.js delete mode 100644 packages/api-scheduler/dist._build/features/NamespaceHandler/feature.js.map delete mode 100644 packages/api-scheduler/dist._build/features/NamespaceHandler/index.d.ts delete mode 100644 packages/api-scheduler/dist._build/features/NamespaceHandler/index.js delete mode 100644 packages/api-scheduler/dist._build/features/ScheduleAction/ScheduleActionUseCase.d.ts delete mode 100644 packages/api-scheduler/dist._build/features/ScheduleAction/ScheduleActionUseCase.js delete mode 100644 packages/api-scheduler/dist._build/features/ScheduleAction/ScheduleActionUseCase.js.map delete mode 100644 packages/api-scheduler/dist._build/features/ScheduleAction/abstractions.d.ts delete mode 100644 packages/api-scheduler/dist._build/features/ScheduleAction/abstractions.js delete mode 100644 packages/api-scheduler/dist._build/features/ScheduleAction/abstractions.js.map delete mode 100644 packages/api-scheduler/dist._build/features/ScheduleAction/feature.d.ts delete mode 100644 packages/api-scheduler/dist._build/features/ScheduleAction/feature.js delete mode 100644 packages/api-scheduler/dist._build/features/ScheduleAction/feature.js.map delete mode 100644 packages/api-scheduler/dist._build/features/ScheduleAction/index.d.ts delete mode 100644 packages/api-scheduler/dist._build/features/ScheduleAction/index.js delete mode 100644 packages/api-scheduler/dist._build/features/SchedulerFeature.d.ts delete mode 100644 packages/api-scheduler/dist._build/features/SchedulerFeature.js delete mode 100644 packages/api-scheduler/dist._build/features/SchedulerFeature.js.map delete mode 100644 packages/api-scheduler/dist._build/features/SchedulerService/VoidSchedulerService.d.ts delete mode 100644 packages/api-scheduler/dist._build/features/SchedulerService/VoidSchedulerService.js delete mode 100644 packages/api-scheduler/dist._build/features/SchedulerService/VoidSchedulerService.js.map delete mode 100644 packages/api-scheduler/dist._build/features/permissions/abstractions.d.ts delete mode 100644 packages/api-scheduler/dist._build/features/permissions/abstractions.js delete mode 100644 packages/api-scheduler/dist._build/features/permissions/abstractions.js.map delete mode 100644 packages/api-scheduler/dist._build/features/permissions/feature.d.ts delete mode 100644 packages/api-scheduler/dist._build/features/permissions/feature.js delete mode 100644 packages/api-scheduler/dist._build/features/permissions/feature.js.map delete mode 100644 packages/api-scheduler/dist._build/graphql/SchedulerGraphQLFactory.d.ts delete mode 100644 packages/api-scheduler/dist._build/graphql/SchedulerGraphQLFactory.js delete mode 100644 packages/api-scheduler/dist._build/graphql/SchedulerGraphQLFactory.js.map delete mode 100644 packages/api-scheduler/dist._build/graphql/feature.d.ts delete mode 100644 packages/api-scheduler/dist._build/graphql/feature.js delete mode 100644 packages/api-scheduler/dist._build/graphql/feature.js.map delete mode 100644 packages/api-scheduler/dist._build/graphql/index.d.ts delete mode 100644 packages/api-scheduler/dist._build/graphql/index.js delete mode 100644 packages/api-scheduler/dist._build/index.d.ts delete mode 100644 packages/api-scheduler/dist._build/index.js delete mode 100644 packages/api-scheduler/dist._build/shared/abstractions.d.ts delete mode 100644 packages/api-scheduler/dist._build/shared/abstractions.js delete mode 100644 packages/api-scheduler/dist._build/shared/abstractions.js.map diff --git a/packages/api-scheduler/dist._build/ScheduledActionLambdaHandler.d.ts b/packages/api-scheduler/dist._build/ScheduledActionLambdaHandler.d.ts deleted file mode 100644 index 3f2ef7668c6..00000000000 --- a/packages/api-scheduler/dist._build/ScheduledActionLambdaHandler.d.ts +++ /dev/null @@ -1,18 +0,0 @@ -import { ScheduledActionEventHandler } from "@webiny/event-handler-aws/abstractions/handlers/ScheduledActionEventHandler.js"; -import type { IScheduledActionEvent } from "@webiny/event-handler-aws/eventTypes/ScheduledActionEventType.js"; -import type { IScheduledActionResult } from "@webiny/event-handler-aws/abstractions/handlers/ScheduledActionEventHandler.js"; -import type { EventContext, NextFunction } from "@webiny/event-handler-core"; -import type { IExecuteScheduledActionUseCase } from "~/features/ExecuteScheduledAction/abstractions.js"; -import { TenantContext } from "@webiny/api-core/features/tenancy/TenantContext/index.js"; -import { GetTenantByIdUseCase } from "@webiny/api-core/exports/api/tenancy.js"; -declare class ScheduledActionLambdaHandlerImpl implements ScheduledActionEventHandler.Interface { - private executeScheduledAction; - private tenantContext; - private getTenantById; - constructor(executeScheduledAction: IExecuteScheduledActionUseCase, tenantContext: TenantContext.Interface, getTenantById: GetTenantByIdUseCase.Interface); - execute(eventCtx: EventContext, _next: NextFunction): Promise; -} -export declare const ScheduledActionLambdaHandler: typeof ScheduledActionLambdaHandlerImpl & { - __abstraction: import("@webiny/di").Abstraction; -}; -export {}; diff --git a/packages/api-scheduler/dist._build/ScheduledActionLambdaHandler.js b/packages/api-scheduler/dist._build/ScheduledActionLambdaHandler.js deleted file mode 100644 index 1d730fc522d..00000000000 --- a/packages/api-scheduler/dist._build/ScheduledActionLambdaHandler.js +++ /dev/null @@ -1,41 +0,0 @@ -import { ScheduledActionEventHandler } from "@webiny/event-handler-aws/abstractions/handlers/ScheduledActionEventHandler.js"; -import { ExecuteScheduledActionUseCase } from "./features/ExecuteScheduledAction/index.js"; -import { TenantContext } from "@webiny/api-core/features/tenancy/TenantContext/index.js"; -import { GetTenantByIdUseCase } from "@webiny/api-core/exports/api/tenancy.js"; -import { SCHEDULED_ACTION_EVENT_IDENTIFIER } from "./constants.js"; -class ScheduledActionLambdaHandlerImpl { - constructor(executeScheduledAction, tenantContext, getTenantById){ - this.executeScheduledAction = executeScheduledAction; - this.tenantContext = tenantContext; - this.getTenantById = getTenantById; - } - async execute(eventCtx, _next) { - const input = eventCtx.event[SCHEDULED_ACTION_EVENT_IDENTIFIER]; - if (!input.tenant) input.tenant = this.tenantContext.getTenant().id; - const tenantResult = await this.getTenantById.execute(input.tenant); - if (tenantResult.isFail()) throw tenantResult.error; - const tenant = tenantResult.value; - return this.tenantContext.withTenant(tenant, async ()=>{ - const result = await this.executeScheduledAction.execute(input); - if (result.isFail()) { - const error = result.error; - console.error(error.code, error.message); - throw error; - } - return { - success: true - }; - }); - } -} -const ScheduledActionLambdaHandler = ScheduledActionEventHandler.createImplementation({ - implementation: ScheduledActionLambdaHandlerImpl, - dependencies: [ - ExecuteScheduledActionUseCase, - TenantContext, - GetTenantByIdUseCase - ] -}); -export { ScheduledActionLambdaHandler }; - -//# sourceMappingURL=ScheduledActionLambdaHandler.js.map \ No newline at end of file diff --git a/packages/api-scheduler/dist._build/ScheduledActionLambdaHandler.js.map b/packages/api-scheduler/dist._build/ScheduledActionLambdaHandler.js.map deleted file mode 100644 index b00864f601d..00000000000 --- a/packages/api-scheduler/dist._build/ScheduledActionLambdaHandler.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"ScheduledActionLambdaHandler.js","sources":["../src/ScheduledActionLambdaHandler.ts"],"sourcesContent":["import { ScheduledActionEventHandler } from \"@webiny/event-handler-aws/abstractions/handlers/ScheduledActionEventHandler.js\";\nimport type { IScheduledActionEvent } from \"@webiny/event-handler-aws/eventTypes/ScheduledActionEventType.js\";\nimport type { IScheduledActionResult } from \"@webiny/event-handler-aws/abstractions/handlers/ScheduledActionEventHandler.js\";\nimport type { EventContext, NextFunction } from \"@webiny/event-handler-core\";\nimport { ExecuteScheduledActionUseCase } from \"~/features/ExecuteScheduledAction/index.js\";\nimport type { IExecuteScheduledActionUseCase } from \"~/features/ExecuteScheduledAction/abstractions.js\";\nimport { TenantContext } from \"@webiny/api-core/features/tenancy/TenantContext/index.js\";\nimport { GetTenantByIdUseCase } from \"@webiny/api-core/exports/api/tenancy.js\";\nimport { SCHEDULED_ACTION_EVENT_IDENTIFIER } from \"~/constants.js\";\n\nclass ScheduledActionLambdaHandlerImpl implements ScheduledActionEventHandler.Interface {\n constructor(\n private executeScheduledAction: IExecuteScheduledActionUseCase,\n private tenantContext: TenantContext.Interface,\n private getTenantById: GetTenantByIdUseCase.Interface\n ) {}\n\n async execute(\n eventCtx: EventContext,\n _next: NextFunction\n ): Promise {\n const input = eventCtx.event[SCHEDULED_ACTION_EVENT_IDENTIFIER];\n\n /**\n * Use the current tenant if the payload doesn't carry one — keeps backward compatibility\n * with scheduled actions created before `tenant` was added to the payload. The actual\n * per-request DynamoDB queries run inside withTenant() below.\n */\n if (!input.tenant) {\n input.tenant = this.tenantContext.getTenant().id;\n }\n\n const tenantResult = await this.getTenantById.execute(input.tenant);\n if (tenantResult.isFail()) {\n throw tenantResult.error;\n }\n const tenant = tenantResult.value;\n\n return this.tenantContext.withTenant(tenant, async () => {\n const result = await this.executeScheduledAction.execute(input);\n\n if (result.isFail()) {\n const error = result.error;\n console.error(error.code, error.message);\n throw error;\n }\n\n return { success: true };\n });\n }\n}\n\nexport const ScheduledActionLambdaHandler = ScheduledActionEventHandler.createImplementation({\n implementation: ScheduledActionLambdaHandlerImpl,\n dependencies: [ExecuteScheduledActionUseCase, TenantContext, GetTenantByIdUseCase]\n});\n"],"names":["ScheduledActionLambdaHandlerImpl","executeScheduledAction","tenantContext","getTenantById","eventCtx","_next","input","SCHEDULED_ACTION_EVENT_IDENTIFIER","tenantResult","tenant","result","error","console","ScheduledActionLambdaHandler","ScheduledActionEventHandler","ExecuteScheduledActionUseCase","TenantContext","GetTenantByIdUseCase"],"mappings":";;;;;AAUA,MAAMA;IACF,YACYC,sBAAsD,EACtDC,aAAsC,EACtCC,aAA6C,CACvD;aAHUF,sBAAsB,GAAtBA;aACAC,aAAa,GAAbA;aACAC,aAAa,GAAbA;IACT;IAEH,MAAM,QACFC,QAA6C,EAC7CC,KAAmB,EACY;QAC/B,MAAMC,QAAQF,SAAS,KAAK,CAACG,kCAAkC;QAO/D,IAAI,CAACD,MAAM,MAAM,EACbA,MAAM,MAAM,GAAG,IAAI,CAAC,aAAa,CAAC,SAAS,GAAG,EAAE;QAGpD,MAAME,eAAe,MAAM,IAAI,CAAC,aAAa,CAAC,OAAO,CAACF,MAAM,MAAM;QAClE,IAAIE,aAAa,MAAM,IACnB,MAAMA,aAAa,KAAK;QAE5B,MAAMC,SAASD,aAAa,KAAK;QAEjC,OAAO,IAAI,CAAC,aAAa,CAAC,UAAU,CAACC,QAAQ;YACzC,MAAMC,SAAS,MAAM,IAAI,CAAC,sBAAsB,CAAC,OAAO,CAACJ;YAEzD,IAAII,OAAO,MAAM,IAAI;gBACjB,MAAMC,QAAQD,OAAO,KAAK;gBAC1BE,QAAQ,KAAK,CAACD,MAAM,IAAI,EAAEA,MAAM,OAAO;gBACvC,MAAMA;YACV;YAEA,OAAO;gBAAE,SAAS;YAAK;QAC3B;IACJ;AACJ;AAEO,MAAME,+BAA+BC,4BAA4B,oBAAoB,CAAC;IACzF,gBAAgBd;IAChB,cAAc;QAACe;QAA+BC;QAAeC;KAAqB;AACtF"} \ No newline at end of file diff --git a/packages/api-scheduler/dist._build/SchedulerFeature.d.ts b/packages/api-scheduler/dist._build/SchedulerFeature.d.ts deleted file mode 100644 index 4f5193d2e66..00000000000 --- a/packages/api-scheduler/dist._build/SchedulerFeature.d.ts +++ /dev/null @@ -1,6 +0,0 @@ -import { type Container } from "@webiny/feature/api"; -export type { ISchedulerFeatureConfig } from "./SchedulerFeature.types.js"; -export declare const SchedulerFeature: { - name: string; - register(container: Container): void; -}; diff --git a/packages/api-scheduler/dist._build/SchedulerFeature.js b/packages/api-scheduler/dist._build/SchedulerFeature.js deleted file mode 100644 index 9c39d616696..00000000000 --- a/packages/api-scheduler/dist._build/SchedulerFeature.js +++ /dev/null @@ -1,21 +0,0 @@ -import { createFeature } from "@webiny/feature/api"; -import { SchedulePrivateModel } from "./domain/SchedulePrivateModel.js"; -import { SchedulerPermissionsFeature } from "./features/permissions/feature.js"; -import { SchedulerGraphQLFactoryFeature } from "./graphql/feature.js"; -import { NamespaceHandlerExecutionerFeature } from "./features/NamespaceHandler/feature.js"; -import { SchedulerModelContextualSchema } from "./SchedulerModelContextualSchema.js"; -import { SchedulerFeature } from "./features/SchedulerFeature.js"; -const SchedulerFeature_SchedulerFeature = createFeature({ - name: "Scheduler", - register (container) { - container.register(SchedulePrivateModel); - SchedulerPermissionsFeature.register(container); - SchedulerGraphQLFactoryFeature.register(container); - NamespaceHandlerExecutionerFeature.register(container); - SchedulerFeature.register(container); - container.register(SchedulerModelContextualSchema); - } -}); -export { SchedulerFeature_SchedulerFeature as SchedulerFeature }; - -//# sourceMappingURL=SchedulerFeature.js.map \ No newline at end of file diff --git a/packages/api-scheduler/dist._build/SchedulerFeature.js.map b/packages/api-scheduler/dist._build/SchedulerFeature.js.map deleted file mode 100644 index 25c970591b7..00000000000 --- a/packages/api-scheduler/dist._build/SchedulerFeature.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"SchedulerFeature.js","sources":["../src/SchedulerFeature.ts"],"sourcesContent":["import { type Container, createFeature } from \"@webiny/feature/api\";\nimport { SchedulePrivateModel } from \"./domain/SchedulePrivateModel.js\";\nimport { SchedulerPermissionsFeature } from \"~/features/permissions/feature.js\";\nimport { SchedulerGraphQLFactoryFeature } from \"~/graphql/feature.js\";\nimport { NamespaceHandlerExecutionerFeature } from \"~/features/NamespaceHandler/feature.js\";\nimport { SchedulerModelContextualSchema } from \"./SchedulerModelContextualSchema.js\";\nimport { SchedulerFeature as SchedulerCoreFeature } from \"~/features/SchedulerFeature.js\";\n\nexport type { ISchedulerFeatureConfig } from \"./SchedulerFeature.types.js\";\n\nexport const SchedulerFeature = createFeature({\n name: \"Scheduler\",\n register(container: Container) {\n container.register(SchedulePrivateModel);\n SchedulerPermissionsFeature.register(container);\n SchedulerGraphQLFactoryFeature.register(container);\n NamespaceHandlerExecutionerFeature.register(container);\n SchedulerCoreFeature.register(container);\n container.register(SchedulerModelContextualSchema);\n }\n});\n"],"names":["SchedulerFeature","createFeature","container","SchedulePrivateModel","SchedulerPermissionsFeature","SchedulerGraphQLFactoryFeature","NamespaceHandlerExecutionerFeature","SchedulerCoreFeature","SchedulerModelContextualSchema"],"mappings":";;;;;;;AAUO,MAAMA,oCAAmBC,cAAc;IAC1C,MAAM;IACN,UAASC,SAAoB;QACzBA,UAAU,QAAQ,CAACC;QACnBC,4BAA4B,QAAQ,CAACF;QACrCG,+BAA+B,QAAQ,CAACH;QACxCI,mCAAmC,QAAQ,CAACJ;QAC5CK,iBAAAA,QAA6B,CAACL;QAC9BA,UAAU,QAAQ,CAACM;IACvB;AACJ"} \ No newline at end of file diff --git a/packages/api-scheduler/dist._build/SchedulerFeature.types.d.ts b/packages/api-scheduler/dist._build/SchedulerFeature.types.d.ts deleted file mode 100644 index 870eceb653e..00000000000 --- a/packages/api-scheduler/dist._build/SchedulerFeature.types.d.ts +++ /dev/null @@ -1,5 +0,0 @@ -import type { SchedulerClient, SchedulerClientConfig } from "@webiny/aws-sdk/client-scheduler/index.js"; -/** @deprecated getClient is now passed to registerSchedulerAwsExtension in @webiny/api-scheduler-aws */ -export interface ISchedulerFeatureConfig { - getClient(config?: SchedulerClientConfig): Pick; -} diff --git a/packages/api-scheduler/dist._build/SchedulerFeature.types.js b/packages/api-scheduler/dist._build/SchedulerFeature.types.js deleted file mode 100644 index e69de29bb2d..00000000000 diff --git a/packages/api-scheduler/dist._build/SchedulerModelContextualSchema.d.ts b/packages/api-scheduler/dist._build/SchedulerModelContextualSchema.d.ts deleted file mode 100644 index abdbf773a5e..00000000000 --- a/packages/api-scheduler/dist._build/SchedulerModelContextualSchema.d.ts +++ /dev/null @@ -1,13 +0,0 @@ -import type { IRequestContextInitializer } from "@webiny/event-handler-core"; -import { TenantContext } from "@webiny/api-core/features/tenancy/TenantContext/index.js"; -import { IdentityContext } from "@webiny/api-core/features/security/IdentityContext/abstractions.js"; -declare class SchedulerModelContextualSchemaImpl implements IRequestContextInitializer { - private tenantCtx; - private identityCtx; - constructor(tenantCtx: TenantContext.Interface, identityCtx: IdentityContext.Interface); - init(ctx: Record): Promise; -} -export declare const SchedulerModelContextualSchema: typeof SchedulerModelContextualSchemaImpl & { - __abstraction: import("@webiny/di").Abstraction; -}; -export {}; diff --git a/packages/api-scheduler/dist._build/SchedulerModelContextualSchema.js b/packages/api-scheduler/dist._build/SchedulerModelContextualSchema.js deleted file mode 100644 index 73ebd1aa0b7..00000000000 --- a/packages/api-scheduler/dist._build/SchedulerModelContextualSchema.js +++ /dev/null @@ -1,32 +0,0 @@ -import { RequestContextInitializer } from "@webiny/event-handler-core"; -import { TenantContext } from "@webiny/api-core/features/tenancy/TenantContext/index.js"; -import { IdentityContext } from "@webiny/api-core/features/security/IdentityContext/abstractions.js"; -import { GetModelUseCase } from "@webiny/api-headless-cms/features/contentModel/GetModel/index.js"; -import { ScheduledActionModel } from "./shared/abstractions.js"; -import { SCHEDULE_MODEL_ID } from "./constants.js"; -class SchedulerModelContextualSchemaImpl { - constructor(tenantCtx, identityCtx){ - this.tenantCtx = tenantCtx; - this.identityCtx = identityCtx; - } - async init(ctx) { - if (!this.tenantCtx.getTenant()) return; - const container = ctx.container; - const getModel = container.resolve(GetModelUseCase); - await this.identityCtx.withoutAuthorization(async ()=>{ - const result = await getModel.execute(SCHEDULE_MODEL_ID); - if (result.isFail()) throw result.error; - container.registerInstance(ScheduledActionModel, result.value); - }); - } -} -const SchedulerModelContextualSchema = RequestContextInitializer.createImplementation({ - implementation: SchedulerModelContextualSchemaImpl, - dependencies: [ - TenantContext, - IdentityContext - ] -}); -export { SchedulerModelContextualSchema }; - -//# sourceMappingURL=SchedulerModelContextualSchema.js.map \ No newline at end of file diff --git a/packages/api-scheduler/dist._build/SchedulerModelContextualSchema.js.map b/packages/api-scheduler/dist._build/SchedulerModelContextualSchema.js.map deleted file mode 100644 index 6e7aa12075e..00000000000 --- a/packages/api-scheduler/dist._build/SchedulerModelContextualSchema.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"SchedulerModelContextualSchema.js","sources":["../src/SchedulerModelContextualSchema.ts"],"sourcesContent":["import type { Container } from \"@webiny/di\";\nimport { RequestContextInitializer } from \"@webiny/event-handler-core\";\nimport type { IRequestContextInitializer } from \"@webiny/event-handler-core\";\nimport { TenantContext } from \"@webiny/api-core/features/tenancy/TenantContext/index.js\";\nimport { IdentityContext } from \"@webiny/api-core/features/security/IdentityContext/abstractions.js\";\nimport { GetModelUseCase } from \"@webiny/api-headless-cms/features/contentModel/GetModel/index.js\";\nimport { ScheduledActionModel } from \"~/shared/abstractions.js\";\nimport { SCHEDULE_MODEL_ID } from \"~/constants.js\";\n\nclass SchedulerModelContextualSchemaImpl implements IRequestContextInitializer {\n constructor(\n private tenantCtx: TenantContext.Interface,\n private identityCtx: IdentityContext.Interface\n ) {}\n\n async init(ctx: Record): Promise {\n if (!this.tenantCtx.getTenant()) {\n return;\n }\n\n const container = ctx.container as Container;\n // Resolved lazily here (build/request time), not as a constructor dep: GetModelUseCase\n // depends on AccessControl, which the CMS initializer only registers during its own init().\n const getModel = container.resolve(GetModelUseCase);\n\n await this.identityCtx.withoutAuthorization(async () => {\n const result = await getModel.execute(SCHEDULE_MODEL_ID);\n if (result.isFail()) {\n throw result.error;\n }\n container.registerInstance(ScheduledActionModel, result.value);\n });\n }\n}\n\nexport const SchedulerModelContextualSchema = RequestContextInitializer.createImplementation({\n implementation: SchedulerModelContextualSchemaImpl,\n dependencies: [TenantContext, IdentityContext]\n});\n"],"names":["SchedulerModelContextualSchemaImpl","tenantCtx","identityCtx","ctx","container","getModel","GetModelUseCase","result","SCHEDULE_MODEL_ID","ScheduledActionModel","SchedulerModelContextualSchema","RequestContextInitializer","TenantContext","IdentityContext"],"mappings":";;;;;;AASA,MAAMA;IACF,YACYC,SAAkC,EAClCC,WAAsC,CAChD;aAFUD,SAAS,GAATA;aACAC,WAAW,GAAXA;IACT;IAEH,MAAM,KAAKC,GAAwB,EAAiB;QAChD,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,SAAS,IACzB;QAGJ,MAAMC,YAAYD,IAAI,SAAS;QAG/B,MAAME,WAAWD,UAAU,OAAO,CAACE;QAEnC,MAAM,IAAI,CAAC,WAAW,CAAC,oBAAoB,CAAC;YACxC,MAAMC,SAAS,MAAMF,SAAS,OAAO,CAACG;YACtC,IAAID,OAAO,MAAM,IACb,MAAMA,OAAO,KAAK;YAEtBH,UAAU,gBAAgB,CAACK,sBAAsBF,OAAO,KAAK;QACjE;IACJ;AACJ;AAEO,MAAMG,iCAAiCC,0BAA0B,oBAAoB,CAAC;IACzF,gBAAgBX;IAChB,cAAc;QAACY;QAAeC;KAAgB;AAClD"} \ No newline at end of file diff --git a/packages/api-scheduler/dist._build/constants.d.ts b/packages/api-scheduler/dist._build/constants.d.ts deleted file mode 100644 index 82c59b02c33..00000000000 --- a/packages/api-scheduler/dist._build/constants.d.ts +++ /dev/null @@ -1,13 +0,0 @@ -export declare const SCHEDULE_MODEL_ID = "wbySchedule"; -export declare const SCHEDULE_ID_PREFIX = "wby-schedule-"; -/** - * Minimum number of seconds in the future that a schedule can be set. - * Everything else will result in immediately running the action. - */ -export declare const SCHEDULE_MIN_FUTURE_SECONDS = 65; -export declare const SCHEDULED_ACTION_EVENT_IDENTIFIER = "WebinyScheduledAction"; -/** Constant identifier for the publish scheduled action type. */ -export declare const SCHEDULED_ACTION_PUBLISH: "publish"; -/** Constant identifier for the unpublish scheduled action type. */ -export declare const SCHEDULED_ACTION_UNPUBLISH: "unpublish"; -export declare const SCHEDULED_ACTIONS: readonly ["publish", "unpublish"]; diff --git a/packages/api-scheduler/dist._build/constants.js b/packages/api-scheduler/dist._build/constants.js deleted file mode 100644 index 9e7261bb19e..00000000000 --- a/packages/api-scheduler/dist._build/constants.js +++ /dev/null @@ -1,13 +0,0 @@ -const SCHEDULE_MODEL_ID = "wbySchedule"; -const SCHEDULE_ID_PREFIX = "wby-schedule-"; -const SCHEDULE_MIN_FUTURE_SECONDS = 65; -const SCHEDULED_ACTION_EVENT_IDENTIFIER = "WebinyScheduledAction"; -const SCHEDULED_ACTION_PUBLISH = "publish"; -const SCHEDULED_ACTION_UNPUBLISH = "unpublish"; -const SCHEDULED_ACTIONS = [ - SCHEDULED_ACTION_PUBLISH, - SCHEDULED_ACTION_UNPUBLISH -]; -export { SCHEDULED_ACTIONS, SCHEDULED_ACTION_EVENT_IDENTIFIER, SCHEDULED_ACTION_PUBLISH, SCHEDULED_ACTION_UNPUBLISH, SCHEDULE_ID_PREFIX, SCHEDULE_MIN_FUTURE_SECONDS, SCHEDULE_MODEL_ID }; - -//# sourceMappingURL=constants.js.map \ No newline at end of file diff --git a/packages/api-scheduler/dist._build/constants.js.map b/packages/api-scheduler/dist._build/constants.js.map deleted file mode 100644 index c8cbe419077..00000000000 --- a/packages/api-scheduler/dist._build/constants.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"constants.js","sources":["../src/constants.ts"],"sourcesContent":["export const SCHEDULE_MODEL_ID = \"wbySchedule\";\nexport const SCHEDULE_ID_PREFIX = \"wby-schedule-\";\n/**\n * Minimum number of seconds in the future that a schedule can be set.\n * Everything else will result in immediately running the action.\n */\nexport const SCHEDULE_MIN_FUTURE_SECONDS = 65;\n\nexport const SCHEDULED_ACTION_EVENT_IDENTIFIER = \"WebinyScheduledAction\";\n\n/** Constant identifier for the publish scheduled action type. */\nexport const SCHEDULED_ACTION_PUBLISH = \"publish\" as const;\n/** Constant identifier for the unpublish scheduled action type. */\nexport const SCHEDULED_ACTION_UNPUBLISH = \"unpublish\" as const;\n\nexport const SCHEDULED_ACTIONS = [SCHEDULED_ACTION_PUBLISH, SCHEDULED_ACTION_UNPUBLISH] as const;\n"],"names":["SCHEDULE_MODEL_ID","SCHEDULE_ID_PREFIX","SCHEDULE_MIN_FUTURE_SECONDS","SCHEDULED_ACTION_EVENT_IDENTIFIER","SCHEDULED_ACTION_PUBLISH","SCHEDULED_ACTION_UNPUBLISH","SCHEDULED_ACTIONS"],"mappings":"AAAO,MAAMA,oBAAoB;AAC1B,MAAMC,qBAAqB;AAK3B,MAAMC,8BAA8B;AAEpC,MAAMC,oCAAoC;AAG1C,MAAMC,2BAA2B;AAEjC,MAAMC,6BAA6B;AAEnC,MAAMC,oBAAoB;IAACF;IAA0BC;CAA2B"} \ No newline at end of file diff --git a/packages/api-scheduler/dist._build/domain/SchedulePrivateModel.d.ts b/packages/api-scheduler/dist._build/domain/SchedulePrivateModel.d.ts deleted file mode 100644 index 386f29dd40b..00000000000 --- a/packages/api-scheduler/dist._build/domain/SchedulePrivateModel.d.ts +++ /dev/null @@ -1,8 +0,0 @@ -import { ModelFactory } from "@webiny/api-headless-cms/features/modelBuilder/index.js"; -declare class SchedulePrivateModelImpl implements ModelFactory.Interface { - execute(builder: ModelFactory.Builder): Promise; -} -export declare const SchedulePrivateModel: typeof SchedulePrivateModelImpl & { - __abstraction: import("@webiny/di").Abstraction; -}; -export {}; diff --git a/packages/api-scheduler/dist._build/domain/SchedulePrivateModel.js b/packages/api-scheduler/dist._build/domain/SchedulePrivateModel.js deleted file mode 100644 index fbcec5fef23..00000000000 --- a/packages/api-scheduler/dist._build/domain/SchedulePrivateModel.js +++ /dev/null @@ -1,32 +0,0 @@ -import { ModelFactory } from "@webiny/api-headless-cms/features/modelBuilder/index.js"; -import { SCHEDULE_MODEL_ID } from "../constants.js"; -class SchedulePrivateModelImpl { - async execute(builder) { - return [ - builder.private({ - modelId: SCHEDULE_MODEL_ID, - name: "Webiny CMS Schedule" - }).fields((fields)=>({ - namespace: fields.text().label("Namespace"), - actionType: fields.text().label("Action Type"), - targetId: fields.text().label("Target ID"), - scheduledBy: fields.object().label("Scheduled By").fields((fields)=>({ - id: fields.text().label("Identity ID"), - displayName: fields.text().label("Display Name"), - type: fields.text().label("Type") - })), - scheduledFor: fields.datetime().label("Scheduled For"), - title: fields.text().label("Title"), - error: fields.text().label("Error"), - payload: fields.json().label("Payload") - })) - ]; - } -} -const SchedulePrivateModel = ModelFactory.createImplementation({ - implementation: SchedulePrivateModelImpl, - dependencies: [] -}); -export { SchedulePrivateModel }; - -//# sourceMappingURL=SchedulePrivateModel.js.map \ No newline at end of file diff --git a/packages/api-scheduler/dist._build/domain/SchedulePrivateModel.js.map b/packages/api-scheduler/dist._build/domain/SchedulePrivateModel.js.map deleted file mode 100644 index 545d8534a9a..00000000000 --- a/packages/api-scheduler/dist._build/domain/SchedulePrivateModel.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"domain/SchedulePrivateModel.js","sources":["../../src/domain/SchedulePrivateModel.ts"],"sourcesContent":["import { ModelFactory } from \"@webiny/api-headless-cms/features/modelBuilder/index.js\";\nimport { SCHEDULE_MODEL_ID } from \"~/constants.js\";\n\nclass SchedulePrivateModelImpl implements ModelFactory.Interface {\n public async execute(builder: ModelFactory.Builder) {\n return [\n builder\n .private({\n modelId: SCHEDULE_MODEL_ID,\n name: \"Webiny CMS Schedule\"\n })\n .fields(fields => ({\n namespace: fields.text().label(\"Namespace\"),\n actionType: fields.text().label(\"Action Type\"),\n targetId: fields.text().label(\"Target ID\"),\n scheduledBy: fields\n .object()\n .label(\"Scheduled By\")\n .fields(fields => ({\n id: fields.text().label(\"Identity ID\"),\n displayName: fields.text().label(\"Display Name\"),\n type: fields.text().label(\"Type\")\n })),\n scheduledFor: fields.datetime().label(\"Scheduled For\"),\n title: fields.text().label(\"Title\"),\n error: fields.text().label(\"Error\"),\n payload: fields.json().label(\"Payload\")\n }))\n ];\n }\n}\n\nexport const SchedulePrivateModel = ModelFactory.createImplementation({\n implementation: SchedulePrivateModelImpl,\n dependencies: []\n});\n"],"names":["SchedulePrivateModelImpl","builder","SCHEDULE_MODEL_ID","fields","SchedulePrivateModel","ModelFactory"],"mappings":";;AAGA,MAAMA;IACF,MAAa,QAAQC,OAA6B,EAAE;QAChD,OAAO;YACHA,QACK,OAAO,CAAC;gBACL,SAASC;gBACT,MAAM;YACV,GACC,MAAM,CAACC,CAAAA,SAAW;oBACf,WAAWA,OAAO,IAAI,GAAG,KAAK,CAAC;oBAC/B,YAAYA,OAAO,IAAI,GAAG,KAAK,CAAC;oBAChC,UAAUA,OAAO,IAAI,GAAG,KAAK,CAAC;oBAC9B,aAAaA,OACR,MAAM,GACN,KAAK,CAAC,gBACN,MAAM,CAACA,CAAAA,SAAW;4BACf,IAAIA,OAAO,IAAI,GAAG,KAAK,CAAC;4BACxB,aAAaA,OAAO,IAAI,GAAG,KAAK,CAAC;4BACjC,MAAMA,OAAO,IAAI,GAAG,KAAK,CAAC;wBAC9B;oBACJ,cAAcA,OAAO,QAAQ,GAAG,KAAK,CAAC;oBACtC,OAAOA,OAAO,IAAI,GAAG,KAAK,CAAC;oBAC3B,OAAOA,OAAO,IAAI,GAAG,KAAK,CAAC;oBAC3B,SAASA,OAAO,IAAI,GAAG,KAAK,CAAC;gBACjC;SACP;IACL;AACJ;AAEO,MAAMC,uBAAuBC,aAAa,oBAAoB,CAAC;IAClE,gBAAgBL;IAChB,cAAc,EAAE;AACpB"} \ No newline at end of file diff --git a/packages/api-scheduler/dist._build/domain/ScheduledActionId.d.ts b/packages/api-scheduler/dist._build/domain/ScheduledActionId.d.ts deleted file mode 100644 index fe57ba57d26..00000000000 --- a/packages/api-scheduler/dist._build/domain/ScheduledActionId.d.ts +++ /dev/null @@ -1,8 +0,0 @@ -export interface IScheduledActionIdParams { - namespace: string; - actionType: string; - targetId: string; -} -export declare class ScheduledActionId { - static from(params: IScheduledActionIdParams): string; -} diff --git a/packages/api-scheduler/dist._build/domain/ScheduledActionId.js b/packages/api-scheduler/dist._build/domain/ScheduledActionId.js deleted file mode 100644 index 13330701a99..00000000000 --- a/packages/api-scheduler/dist._build/domain/ScheduledActionId.js +++ /dev/null @@ -1,17 +0,0 @@ -import { createCacheKey } from "@webiny/utils"; -import { SCHEDULE_ID_PREFIX } from "../constants.js"; -class ScheduledActionId { - static from(params) { - return [ - SCHEDULE_ID_PREFIX, - createCacheKey([ - params.namespace, - params.actionType, - params.targetId - ]).slice(-24) - ].join(""); - } -} -export { ScheduledActionId }; - -//# sourceMappingURL=ScheduledActionId.js.map \ No newline at end of file diff --git a/packages/api-scheduler/dist._build/domain/ScheduledActionId.js.map b/packages/api-scheduler/dist._build/domain/ScheduledActionId.js.map deleted file mode 100644 index a6f3682b64b..00000000000 --- a/packages/api-scheduler/dist._build/domain/ScheduledActionId.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"domain/ScheduledActionId.js","sources":["../../src/domain/ScheduledActionId.ts"],"sourcesContent":["import { createCacheKey } from \"@webiny/utils\";\nimport { SCHEDULE_ID_PREFIX } from \"~/constants.js\";\n\nexport interface IScheduledActionIdParams {\n namespace: string;\n actionType: string;\n targetId: string;\n}\n\nexport class ScheduledActionId {\n static from(params: IScheduledActionIdParams) {\n return [\n SCHEDULE_ID_PREFIX,\n createCacheKey([params.namespace, params.actionType, params.targetId]).slice(-24)\n ].join(\"\");\n }\n}\n"],"names":["ScheduledActionId","params","SCHEDULE_ID_PREFIX","createCacheKey"],"mappings":";;AASO,MAAMA;IACT,OAAO,KAAKC,MAAgC,EAAE;QAC1C,OAAO;YACHC;YACAC,eAAe;gBAACF,OAAO,SAAS;gBAAEA,OAAO,UAAU;gBAAEA,OAAO,QAAQ;aAAC,EAAE,KAAK,CAAC;SAChF,CAAC,IAAI,CAAC;IACX;AACJ"} \ No newline at end of file diff --git a/packages/api-scheduler/dist._build/domain/ScheduledActionIdWithVersion.d.ts b/packages/api-scheduler/dist._build/domain/ScheduledActionIdWithVersion.d.ts deleted file mode 100644 index 9c022b9369f..00000000000 --- a/packages/api-scheduler/dist._build/domain/ScheduledActionIdWithVersion.d.ts +++ /dev/null @@ -1,3 +0,0 @@ -export declare class ScheduledActionIdWithVersion { - static from(id: string): string; -} diff --git a/packages/api-scheduler/dist._build/domain/ScheduledActionIdWithVersion.js b/packages/api-scheduler/dist._build/domain/ScheduledActionIdWithVersion.js deleted file mode 100644 index 466512827d5..00000000000 --- a/packages/api-scheduler/dist._build/domain/ScheduledActionIdWithVersion.js +++ /dev/null @@ -1,9 +0,0 @@ -class ScheduledActionIdWithVersion { - static from(id) { - if (id.endsWith("#0001")) return id; - return `${id}#0001`; - } -} -export { ScheduledActionIdWithVersion }; - -//# sourceMappingURL=ScheduledActionIdWithVersion.js.map \ No newline at end of file diff --git a/packages/api-scheduler/dist._build/domain/ScheduledActionIdWithVersion.js.map b/packages/api-scheduler/dist._build/domain/ScheduledActionIdWithVersion.js.map deleted file mode 100644 index 1319e88c5e8..00000000000 --- a/packages/api-scheduler/dist._build/domain/ScheduledActionIdWithVersion.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"domain/ScheduledActionIdWithVersion.js","sources":["../../src/domain/ScheduledActionIdWithVersion.ts"],"sourcesContent":["export class ScheduledActionIdWithVersion {\n static from(id: string) {\n if (id.endsWith(\"#0001\")) {\n return id;\n }\n\n return `${id}#0001`;\n }\n}\n"],"names":["ScheduledActionIdWithVersion","id"],"mappings":"AAAO,MAAMA;IACT,OAAO,KAAKC,EAAU,EAAE;QACpB,IAAIA,GAAG,QAAQ,CAAC,UACZ,OAAOA;QAGX,OAAO,GAAGA,GAAG,KAAK,CAAC;IACvB;AACJ"} \ No newline at end of file diff --git a/packages/api-scheduler/dist._build/domain/ScheduledActionMapper.d.ts b/packages/api-scheduler/dist._build/domain/ScheduledActionMapper.d.ts deleted file mode 100644 index d6933d73640..00000000000 --- a/packages/api-scheduler/dist._build/domain/ScheduledActionMapper.d.ts +++ /dev/null @@ -1,16 +0,0 @@ -import type { IScheduledAction, IScheduledActionEntry } from "~/shared/abstractions.js"; -import type { GenericRecord } from "@webiny/api/types.js"; -export declare class ScheduledActionMapper { - static toAction(action: IScheduledActionEntry): IScheduledAction; - static toActions(actions: IScheduledActionEntry[]): IScheduledAction[]; - static toGraphQL(action: IScheduledAction): { - id: string; - targetId: string; - namespace: string; - scheduledBy: import("~/shared/abstractions.js").Identity; - publishOn: Date | null; - unpublishOn: Date | null; - actionType: import("~/shared/abstractions.js").ScheduledActionType; - title: string; - }; -} diff --git a/packages/api-scheduler/dist._build/domain/ScheduledActionMapper.js b/packages/api-scheduler/dist._build/domain/ScheduledActionMapper.js deleted file mode 100644 index f81d2079808..00000000000 --- a/packages/api-scheduler/dist._build/domain/ScheduledActionMapper.js +++ /dev/null @@ -1,37 +0,0 @@ -import { parseIdentifier } from "@webiny/utils"; -import { SCHEDULED_ACTION_PUBLISH, SCHEDULED_ACTION_UNPUBLISH } from "../constants.js"; -class ScheduledActionMapper { - static toAction(action) { - const { id: scheduleId } = parseIdentifier(action.id); - return { - id: scheduleId, - targetId: action.values.targetId, - namespace: action.values.namespace, - scheduledBy: action.values.scheduledBy, - scheduledFor: new Date(action.values.scheduledFor), - actionType: action.values.actionType, - title: action.values.title, - payload: action.values.payload, - error: action.values.error, - tenant: action.tenant - }; - } - static toActions(actions) { - return actions.map(ScheduledActionMapper.toAction); - } - static toGraphQL(action) { - return { - id: action.id, - targetId: action.targetId, - namespace: action.namespace, - scheduledBy: action.scheduledBy, - publishOn: action.actionType === SCHEDULED_ACTION_PUBLISH ? action.scheduledFor : null, - unpublishOn: action.actionType === SCHEDULED_ACTION_UNPUBLISH ? action.scheduledFor : null, - actionType: action.actionType, - title: action.title - }; - } -} -export { ScheduledActionMapper }; - -//# sourceMappingURL=ScheduledActionMapper.js.map \ No newline at end of file diff --git a/packages/api-scheduler/dist._build/domain/ScheduledActionMapper.js.map b/packages/api-scheduler/dist._build/domain/ScheduledActionMapper.js.map deleted file mode 100644 index a2da7d0cc06..00000000000 --- a/packages/api-scheduler/dist._build/domain/ScheduledActionMapper.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"domain/ScheduledActionMapper.js","sources":["../../src/domain/ScheduledActionMapper.ts"],"sourcesContent":["import type { IScheduledAction, IScheduledActionEntry } from \"~/shared/abstractions.js\";\nimport type { GenericRecord } from \"@webiny/api/types.js\";\nimport { parseIdentifier } from \"@webiny/utils\";\nimport { SCHEDULED_ACTION_PUBLISH, SCHEDULED_ACTION_UNPUBLISH } from \"~/constants.js\";\n\nexport class ScheduledActionMapper {\n static toAction(\n action: IScheduledActionEntry\n ): IScheduledAction {\n const { id: scheduleId } = parseIdentifier(action.id);\n return {\n id: scheduleId,\n targetId: action.values.targetId,\n namespace: action.values.namespace,\n scheduledBy: action.values.scheduledBy,\n scheduledFor: new Date(action.values.scheduledFor),\n actionType: action.values.actionType,\n title: action.values.title,\n payload: action.values.payload,\n error: action.values.error,\n tenant: action.tenant\n };\n }\n\n static toActions(\n actions: IScheduledActionEntry[]\n ): IScheduledAction[] {\n return actions.map(ScheduledActionMapper.toAction);\n }\n\n static toGraphQL(action: IScheduledAction) {\n return {\n id: action.id,\n targetId: action.targetId,\n namespace: action.namespace,\n scheduledBy: action.scheduledBy,\n publishOn: action.actionType === SCHEDULED_ACTION_PUBLISH ? action.scheduledFor : null,\n unpublishOn:\n action.actionType === SCHEDULED_ACTION_UNPUBLISH ? action.scheduledFor : null,\n actionType: action.actionType,\n title: action.title\n };\n }\n}\n"],"names":["ScheduledActionMapper","action","scheduleId","parseIdentifier","Date","actions","SCHEDULED_ACTION_PUBLISH","SCHEDULED_ACTION_UNPUBLISH"],"mappings":";;AAKO,MAAMA;IACT,OAAO,SACHC,MAAgC,EACb;QACnB,MAAM,EAAE,IAAIC,UAAU,EAAE,GAAGC,gBAAgBF,OAAO,EAAE;QACpD,OAAO;YACH,IAAIC;YACJ,UAAUD,OAAO,MAAM,CAAC,QAAQ;YAChC,WAAWA,OAAO,MAAM,CAAC,SAAS;YAClC,aAAaA,OAAO,MAAM,CAAC,WAAW;YACtC,cAAc,IAAIG,KAAKH,OAAO,MAAM,CAAC,YAAY;YACjD,YAAYA,OAAO,MAAM,CAAC,UAAU;YACpC,OAAOA,OAAO,MAAM,CAAC,KAAK;YAC1B,SAASA,OAAO,MAAM,CAAC,OAAO;YAC9B,OAAOA,OAAO,MAAM,CAAC,KAAK;YAC1B,QAAQA,OAAO,MAAM;QACzB;IACJ;IAEA,OAAO,UACHI,OAAmC,EACd;QACrB,OAAOA,QAAQ,GAAG,CAACL,sBAAsB,QAAQ;IACrD;IAEA,OAAO,UAAmDC,MAA2B,EAAE;QACnF,OAAO;YACH,IAAIA,OAAO,EAAE;YACb,UAAUA,OAAO,QAAQ;YACzB,WAAWA,OAAO,SAAS;YAC3B,aAAaA,OAAO,WAAW;YAC/B,WAAWA,OAAO,UAAU,KAAKK,2BAA2BL,OAAO,YAAY,GAAG;YAClF,aACIA,OAAO,UAAU,KAAKM,6BAA6BN,OAAO,YAAY,GAAG;YAC7E,YAAYA,OAAO,UAAU;YAC7B,OAAOA,OAAO,KAAK;QACvB;IACJ;AACJ"} \ No newline at end of file diff --git a/packages/api-scheduler/dist._build/domain/errors.d.ts b/packages/api-scheduler/dist._build/domain/errors.d.ts deleted file mode 100644 index a4c55cdacec..00000000000 --- a/packages/api-scheduler/dist._build/domain/errors.d.ts +++ /dev/null @@ -1,55 +0,0 @@ -import { BaseError } from "@webiny/feature/api"; -/** - * Not authorized error when user lacks permissions to manage scheduled actions. - */ -export declare class NotAuthorizedError extends BaseError { - readonly code: "Scheduler/NotAuthorized"; - constructor(); -} -/** - * Scheduled action not found error - */ -export declare class ScheduledActionNotFoundError extends BaseError<{ - scheduleId: string; -}> { - readonly code: "Scheduler/ScheduledAction/NotFound"; - constructor(scheduleId: string); -} -/** - * Storage/persistence error when working with scheduled actions - */ -export declare class ScheduledActionPersistenceError extends BaseError<{ - originalError: Error; -}> { - readonly code: "Scheduler/ScheduledAction/PersistenceError"; - constructor(error: Error); -} -/** - * Invalid schedule date error (e.g., scheduling in the past) - */ -export declare class InvalidScheduleDateError extends BaseError<{ - scheduleFor: string; -}> { - readonly code: "Scheduler/ScheduledAction/InvalidDate"; - constructor(scheduleFor: Date); -} -/** - * Scheduler service error (EventBridge/cloud provider errors) - */ -export declare class SchedulerServiceError extends BaseError<{ - originalError: Error; -}> { - readonly code: "Scheduler/Service/Error"; - constructor(error: Error); -} -interface INamespaceHandlerNotFoundErrorData { - namespace: string; -} -/** - * Namespace handler not found error. - */ -export declare class NamespaceHandlerNotFoundError extends BaseError { - readonly code: "Scheduler/NamespaceHandler/NotFound"; - constructor(namespace: string); -} -export {}; diff --git a/packages/api-scheduler/dist._build/domain/errors.js b/packages/api-scheduler/dist._build/domain/errors.js deleted file mode 100644 index 2ebb8bccfdb..00000000000 --- a/packages/api-scheduler/dist._build/domain/errors.js +++ /dev/null @@ -1,61 +0,0 @@ -import { BaseError } from "@webiny/feature/api"; -class NotAuthorizedError extends BaseError { - constructor(){ - super({ - message: "Not authorized!" - }), this.code = "Scheduler/NotAuthorized"; - } -} -class ScheduledActionNotFoundError extends BaseError { - constructor(scheduleId){ - super({ - message: `Scheduled action "${scheduleId}" was not found.`, - data: { - scheduleId - } - }), this.code = "Scheduler/ScheduledAction/NotFound"; - } -} -class ScheduledActionPersistenceError extends BaseError { - constructor(error){ - super({ - message: error.message, - data: { - originalError: error - } - }), this.code = "Scheduler/ScheduledAction/PersistenceError"; - } -} -class InvalidScheduleDateError extends BaseError { - constructor(scheduleFor){ - super({ - message: "Cannot schedule in the past", - data: { - scheduleFor: scheduleFor.toISOString() - } - }), this.code = "Scheduler/ScheduledAction/InvalidDate"; - } -} -class SchedulerServiceError extends BaseError { - constructor(error){ - super({ - message: `Scheduler service error: ${error.message}`, - data: { - originalError: error - } - }), this.code = "Scheduler/Service/Error"; - } -} -class NamespaceHandlerNotFoundError extends BaseError { - constructor(namespace){ - super({ - message: `Namespace handler for "${namespace}" was not found.`, - data: { - namespace - } - }), this.code = "Scheduler/NamespaceHandler/NotFound"; - } -} -export { InvalidScheduleDateError, NamespaceHandlerNotFoundError, NotAuthorizedError, ScheduledActionNotFoundError, ScheduledActionPersistenceError, SchedulerServiceError }; - -//# sourceMappingURL=errors.js.map \ No newline at end of file diff --git a/packages/api-scheduler/dist._build/domain/errors.js.map b/packages/api-scheduler/dist._build/domain/errors.js.map deleted file mode 100644 index b071356703f..00000000000 --- a/packages/api-scheduler/dist._build/domain/errors.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"domain/errors.js","sources":["../../src/domain/errors.ts"],"sourcesContent":["import { BaseError } from \"@webiny/feature/api\";\n\n/**\n * Not authorized error when user lacks permissions to manage scheduled actions.\n */\nexport class NotAuthorizedError extends BaseError {\n override readonly code = \"Scheduler/NotAuthorized\" as const;\n\n constructor() {\n super({ message: \"Not authorized!\" });\n }\n}\n\n/**\n * Scheduled action not found error\n */\nexport class ScheduledActionNotFoundError extends BaseError<{ scheduleId: string }> {\n override readonly code = \"Scheduler/ScheduledAction/NotFound\" as const;\n\n constructor(scheduleId: string) {\n super({\n message: `Scheduled action \"${scheduleId}\" was not found.`,\n data: {\n scheduleId\n }\n });\n }\n}\n\n/**\n * Storage/persistence error when working with scheduled actions\n */\nexport class ScheduledActionPersistenceError extends BaseError<{ originalError: Error }> {\n override readonly code = \"Scheduler/ScheduledAction/PersistenceError\" as const;\n\n constructor(error: Error) {\n super({\n message: error.message,\n data: { originalError: error }\n });\n }\n}\n\n/**\n * Invalid schedule date error (e.g., scheduling in the past)\n */\nexport class InvalidScheduleDateError extends BaseError<{ scheduleFor: string }> {\n override readonly code = \"Scheduler/ScheduledAction/InvalidDate\" as const;\n\n constructor(scheduleFor: Date) {\n super({\n message: \"Cannot schedule in the past\",\n data: {\n scheduleFor: scheduleFor.toISOString()\n }\n });\n }\n}\n\n/**\n * Scheduler service error (EventBridge/cloud provider errors)\n */\nexport class SchedulerServiceError extends BaseError<{ originalError: Error }> {\n override readonly code = \"Scheduler/Service/Error\" as const;\n\n constructor(error: Error) {\n super({\n message: `Scheduler service error: ${error.message}`,\n data: { originalError: error }\n });\n }\n}\n\ninterface INamespaceHandlerNotFoundErrorData {\n namespace: string;\n}\n/**\n * Namespace handler not found error.\n */\nexport class NamespaceHandlerNotFoundError extends BaseError {\n override readonly code = \"Scheduler/NamespaceHandler/NotFound\" as const;\n\n constructor(namespace: string) {\n super({\n message: `Namespace handler for \"${namespace}\" was not found.`,\n data: {\n namespace\n }\n });\n }\n}\n"],"names":["NotAuthorizedError","BaseError","ScheduledActionNotFoundError","scheduleId","ScheduledActionPersistenceError","error","InvalidScheduleDateError","scheduleFor","SchedulerServiceError","NamespaceHandlerNotFoundError","namespace"],"mappings":";AAKO,MAAMA,2BAA2BC;IAGpC,aAAc;QACV,KAAK,CAAC;YAAE,SAAS;QAAkB,SAHrB,IAAI,GAAG;IAIzB;AACJ;AAKO,MAAMC,qCAAqCD;IAG9C,YAAYE,UAAkB,CAAE;QAC5B,KAAK,CAAC;YACF,SAAS,CAAC,kBAAkB,EAAEA,WAAW,gBAAgB,CAAC;YAC1D,MAAM;gBACFA;YACJ;QACJ,SARc,IAAI,GAAG;IASzB;AACJ;AAKO,MAAMC,wCAAwCH;IAGjD,YAAYI,KAAY,CAAE;QACtB,KAAK,CAAC;YACF,SAASA,MAAM,OAAO;YACtB,MAAM;gBAAE,eAAeA;YAAM;QACjC,SANc,IAAI,GAAG;IAOzB;AACJ;AAKO,MAAMC,iCAAiCL;IAG1C,YAAYM,WAAiB,CAAE;QAC3B,KAAK,CAAC;YACF,SAAS;YACT,MAAM;gBACF,aAAaA,YAAY,WAAW;YACxC;QACJ,SARc,IAAI,GAAG;IASzB;AACJ;AAKO,MAAMC,8BAA8BP;IAGvC,YAAYI,KAAY,CAAE;QACtB,KAAK,CAAC;YACF,SAAS,CAAC,yBAAyB,EAAEA,MAAM,OAAO,EAAE;YACpD,MAAM;gBAAE,eAAeA;YAAM;QACjC,SANc,IAAI,GAAG;IAOzB;AACJ;AAQO,MAAMI,sCAAsCR;IAG/C,YAAYS,SAAiB,CAAE;QAC3B,KAAK,CAAC;YACF,SAAS,CAAC,uBAAuB,EAAEA,UAAU,gBAAgB,CAAC;YAC9D,MAAM;gBACFA;YACJ;QACJ,SARc,IAAI,GAAG;IASzB;AACJ"} \ No newline at end of file diff --git a/packages/api-scheduler/dist._build/domain/isValidDate.d.ts b/packages/api-scheduler/dist._build/domain/isValidDate.d.ts deleted file mode 100644 index cf2ed7a704f..00000000000 --- a/packages/api-scheduler/dist._build/domain/isValidDate.d.ts +++ /dev/null @@ -1,6 +0,0 @@ -/** - * Check if the provided date is in the future. - * We need to ensure that the date is at least a SCHEDULE_MIN_FUTURE_MINUTES minutes in the future. - * Otherwise, we consider it as "immediate" and run the action right away. - */ -export declare const isValidDate: (input: Date) => boolean; diff --git a/packages/api-scheduler/dist._build/domain/isValidDate.js b/packages/api-scheduler/dist._build/domain/isValidDate.js deleted file mode 100644 index 98d2ec90535..00000000000 --- a/packages/api-scheduler/dist._build/domain/isValidDate.js +++ /dev/null @@ -1,8 +0,0 @@ -import { SCHEDULE_MIN_FUTURE_SECONDS } from "../constants.js"; -const isValidDate = (input)=>{ - const minDate = new Date(Date.now() + 1000 * SCHEDULE_MIN_FUTURE_SECONDS); - return input.getTime() >= minDate.getTime(); -}; -export { isValidDate }; - -//# sourceMappingURL=isValidDate.js.map \ No newline at end of file diff --git a/packages/api-scheduler/dist._build/domain/isValidDate.js.map b/packages/api-scheduler/dist._build/domain/isValidDate.js.map deleted file mode 100644 index b63af55cef7..00000000000 --- a/packages/api-scheduler/dist._build/domain/isValidDate.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"domain/isValidDate.js","sources":["../../src/domain/isValidDate.ts"],"sourcesContent":["import { SCHEDULE_MIN_FUTURE_SECONDS } from \"~/constants.js\";\n\n/**\n * Check if the provided date is in the future.\n * We need to ensure that the date is at least a SCHEDULE_MIN_FUTURE_MINUTES minutes in the future.\n * Otherwise, we consider it as \"immediate\" and run the action right away.\n */\nexport const isValidDate = (input: Date): boolean => {\n const minDate = new Date(Date.now() + SCHEDULE_MIN_FUTURE_SECONDS * 1000);\n\n return input.getTime() >= minDate.getTime();\n};\n"],"names":["isValidDate","input","minDate","Date","SCHEDULE_MIN_FUTURE_SECONDS"],"mappings":";AAOO,MAAMA,cAAc,CAACC;IACxB,MAAMC,UAAU,IAAIC,KAAKA,KAAK,GAAG,KAAKC,AAA8B,OAA9BA;IAEtC,OAAOH,MAAM,OAAO,MAAMC,QAAQ,OAAO;AAC7C"} \ No newline at end of file diff --git a/packages/api-scheduler/dist._build/domain/permissionsSchema.d.ts b/packages/api-scheduler/dist._build/domain/permissionsSchema.d.ts deleted file mode 100644 index 9c38f6de381..00000000000 --- a/packages/api-scheduler/dist._build/domain/permissionsSchema.d.ts +++ /dev/null @@ -1,9 +0,0 @@ -export declare const SCHEDULER_PERMISSIONS_SCHEMA: { - readonly prefix: "scheduler"; - readonly fullAccess: true; - readonly entities: readonly [{ - readonly id: "action"; - readonly permission: "scheduler.action"; - readonly scopes: readonly ["full", "own"]; - }]; -}; diff --git a/packages/api-scheduler/dist._build/domain/permissionsSchema.js b/packages/api-scheduler/dist._build/domain/permissionsSchema.js deleted file mode 100644 index fed0e40bc19..00000000000 --- a/packages/api-scheduler/dist._build/domain/permissionsSchema.js +++ /dev/null @@ -1,18 +0,0 @@ -import { createPermissionSchema } from "@webiny/api-core/exports/api/security.js"; -const SCHEDULER_PERMISSIONS_SCHEMA = createPermissionSchema({ - prefix: "scheduler", - fullAccess: true, - entities: [ - { - id: "action", - permission: "scheduler.action", - scopes: [ - "full", - "own" - ] - } - ] -}); -export { SCHEDULER_PERMISSIONS_SCHEMA }; - -//# sourceMappingURL=permissionsSchema.js.map \ No newline at end of file diff --git a/packages/api-scheduler/dist._build/domain/permissionsSchema.js.map b/packages/api-scheduler/dist._build/domain/permissionsSchema.js.map deleted file mode 100644 index 1f30b7a2de6..00000000000 --- a/packages/api-scheduler/dist._build/domain/permissionsSchema.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"domain/permissionsSchema.js","sources":["../../src/domain/permissionsSchema.ts"],"sourcesContent":["import { createPermissionSchema } from \"@webiny/api-core/exports/api/security.js\";\n\nexport const SCHEDULER_PERMISSIONS_SCHEMA = createPermissionSchema({\n prefix: \"scheduler\",\n fullAccess: true,\n entities: [\n {\n id: \"action\",\n permission: \"scheduler.action\",\n scopes: [\"full\", \"own\"]\n }\n ]\n});\n"],"names":["SCHEDULER_PERMISSIONS_SCHEMA","createPermissionSchema"],"mappings":";AAEO,MAAMA,+BAA+BC,uBAAuB;IAC/D,QAAQ;IACR,YAAY;IACZ,UAAU;QACN;YACI,IAAI;YACJ,YAAY;YACZ,QAAQ;gBAAC;gBAAQ;aAAM;QAC3B;KACH;AACL"} \ No newline at end of file diff --git a/packages/api-scheduler/dist._build/exports/api/scheduler.d.ts b/packages/api-scheduler/dist._build/exports/api/scheduler.d.ts deleted file mode 100644 index e868621a5cb..00000000000 --- a/packages/api-scheduler/dist._build/exports/api/scheduler.d.ts +++ /dev/null @@ -1,10 +0,0 @@ -export { ScheduleActionUseCase } from "~/features/ScheduleAction/index.js"; -export type { ScheduleActionError } from "~/features/ScheduleAction/index.js"; -export { GetScheduledActionUseCase } from "~/features/GetScheduledAction/index.js"; -export { ListScheduledActionsUseCase } from "~/features/ListScheduledActions/index.js"; -export { CancelScheduledActionUseCase } from "~/features/CancelScheduledAction/index.js"; -export { ExecuteScheduledActionUseCase } from "~/features/ExecuteScheduledAction/index.js"; -export { NamespaceHandler } from "~/features/NamespaceHandler/index.js"; -export type { IScheduledAction, IScheduledActionEntry, ScheduledActionType } from "~/shared/abstractions.js"; -export { SchedulerService, ScheduledActionModel, ScheduledActionHandler } from "~/shared/abstractions.js"; -export { SCHEDULED_ACTION_PUBLISH as ScheduledActionTypePublish, SCHEDULED_ACTION_UNPUBLISH as ScheduledActionTypeUnpublish } from "~/constants.js"; diff --git a/packages/api-scheduler/dist._build/exports/api/scheduler.js b/packages/api-scheduler/dist._build/exports/api/scheduler.js deleted file mode 100644 index 53afaeb7bee..00000000000 --- a/packages/api-scheduler/dist._build/exports/api/scheduler.js +++ /dev/null @@ -1,8 +0,0 @@ -export { ScheduleActionUseCase } from "../../features/ScheduleAction/index.js"; -export { GetScheduledActionUseCase } from "../../features/GetScheduledAction/index.js"; -export { ListScheduledActionsUseCase } from "../../features/ListScheduledActions/index.js"; -export { CancelScheduledActionUseCase } from "../../features/CancelScheduledAction/index.js"; -export { ExecuteScheduledActionUseCase } from "../../features/ExecuteScheduledAction/index.js"; -export { NamespaceHandler } from "../../features/NamespaceHandler/index.js"; -export { ScheduledActionHandler, ScheduledActionModel, SchedulerService } from "../../shared/abstractions.js"; -export { SCHEDULED_ACTION_PUBLISH as ScheduledActionTypePublish, SCHEDULED_ACTION_UNPUBLISH as ScheduledActionTypeUnpublish } from "../../constants.js"; diff --git a/packages/api-scheduler/dist._build/features/CancelScheduledAction/CancelScheduledActionUseCase.d.ts b/packages/api-scheduler/dist._build/features/CancelScheduledAction/CancelScheduledActionUseCase.d.ts deleted file mode 100644 index 0ceab149fa1..00000000000 --- a/packages/api-scheduler/dist._build/features/CancelScheduledAction/CancelScheduledActionUseCase.d.ts +++ /dev/null @@ -1,28 +0,0 @@ -import { Result } from "@webiny/feature/api"; -import { CancelScheduledActionUseCase as UseCaseAbstraction } from "./abstractions.js"; -import { GetScheduledActionUseCase } from "~/features/GetScheduledAction/abstractions.js"; -import { ScheduledActionModel, SchedulerService } from "~/shared/abstractions.js"; -import { DeleteEntryUseCase } from "@webiny/api-headless-cms/features/contentEntry/DeleteEntry/index.js"; -import { SchedulerPermissions } from "~/features/permissions/abstractions.js"; -/** - * Cancels a scheduled action - * - * Flow: - * 1. Check if schedule exists - * 2. Delete EventBridge schedule - * 3. Delete CMS entry - * 4. If EventBridge delete fails, continue anyway (schedule might already be executed/deleted) - */ -declare class CancelScheduledActionUseCaseImpl implements UseCaseAbstraction.Interface { - private getScheduledActionUseCase; - private schedulerService; - private deleteEntryUseCase; - private model; - private permissions; - constructor(getScheduledActionUseCase: GetScheduledActionUseCase.Interface, schedulerService: SchedulerService.Interface, deleteEntryUseCase: DeleteEntryUseCase.Interface, model: ScheduledActionModel.Interface, permissions: SchedulerPermissions.Interface); - execute(params: UseCaseAbstraction.Params): Promise>; -} -export declare const CancelScheduledActionUseCase: typeof CancelScheduledActionUseCaseImpl & { - __abstraction: import("@webiny/di").Abstraction; -}; -export {}; diff --git a/packages/api-scheduler/dist._build/features/CancelScheduledAction/CancelScheduledActionUseCase.js b/packages/api-scheduler/dist._build/features/CancelScheduledAction/CancelScheduledActionUseCase.js deleted file mode 100644 index bc37539e4ff..00000000000 --- a/packages/api-scheduler/dist._build/features/CancelScheduledAction/CancelScheduledActionUseCase.js +++ /dev/null @@ -1,58 +0,0 @@ -import { Result } from "@webiny/feature/api"; -import { CancelScheduledActionUseCase } from "./abstractions.js"; -import { GetScheduledActionUseCase } from "../GetScheduledAction/abstractions.js"; -import { ScheduledActionModel, SchedulerService } from "../../shared/abstractions.js"; -import { NotAuthorizedError, ScheduledActionNotFoundError, ScheduledActionPersistenceError } from "../../domain/errors.js"; -import { DeleteEntryUseCase } from "@webiny/api-headless-cms/features/contentEntry/DeleteEntry/index.js"; -import { ScheduledActionIdWithVersion } from "../../domain/ScheduledActionIdWithVersion.js"; -import { EntryNotFoundError } from "@webiny/api-headless-cms/domain/contentEntry/errors.js"; -import { SchedulerPermissions } from "../permissions/abstractions.js"; -class CancelScheduledActionUseCaseImpl { - constructor(getScheduledActionUseCase, schedulerService, deleteEntryUseCase, model, permissions){ - this.getScheduledActionUseCase = getScheduledActionUseCase; - this.schedulerService = schedulerService; - this.deleteEntryUseCase = deleteEntryUseCase; - this.model = model; - this.permissions = permissions; - } - async execute(params) { - const hasPermission = await this.permissions.canRead("action"); - if (!hasPermission) return Result.fail(new NotAuthorizedError()); - const { id } = params; - const getResult = await this.getScheduledActionUseCase.execute(params); - if (getResult.isFail()) { - const error = getResult.error; - if ("Scheduler/ScheduledAction/NotFound" === error.code) return Result.fail(new ScheduledActionNotFoundError(id)); - return Result.fail(error); - } - const scheduleId = ScheduledActionIdWithVersion.from(id); - try { - const eventBridgeSchedule = await this.schedulerService.exists(params); - if (eventBridgeSchedule) await this.schedulerService.delete(params); - } catch (error) { - console.warn(`Failed to delete EventBridge schedule: ${scheduleId}, tenant "${params.tenant}". Continuing with CMS entry deletion.`, error); - } - const deleteResult = await this.deleteEntryUseCase.execute(this.model, getResult.value.id, { - force: true, - permanently: true - }); - if (deleteResult.isFail()) { - if (deleteResult.error instanceof EntryNotFoundError) return Result.ok(true); - return Result.fail(new ScheduledActionPersistenceError(new Error(deleteResult.error.message))); - } - return Result.ok(true); - } -} -const CancelScheduledActionUseCase_CancelScheduledActionUseCase = CancelScheduledActionUseCase.createImplementation({ - implementation: CancelScheduledActionUseCaseImpl, - dependencies: [ - GetScheduledActionUseCase, - SchedulerService, - DeleteEntryUseCase, - ScheduledActionModel, - SchedulerPermissions - ] -}); -export { CancelScheduledActionUseCase_CancelScheduledActionUseCase as CancelScheduledActionUseCase }; - -//# sourceMappingURL=CancelScheduledActionUseCase.js.map \ No newline at end of file diff --git a/packages/api-scheduler/dist._build/features/CancelScheduledAction/CancelScheduledActionUseCase.js.map b/packages/api-scheduler/dist._build/features/CancelScheduledAction/CancelScheduledActionUseCase.js.map deleted file mode 100644 index c4ba84d5228..00000000000 --- a/packages/api-scheduler/dist._build/features/CancelScheduledAction/CancelScheduledActionUseCase.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"features/CancelScheduledAction/CancelScheduledActionUseCase.js","sources":["../../../src/features/CancelScheduledAction/CancelScheduledActionUseCase.ts"],"sourcesContent":["import { Result } from \"@webiny/feature/api\";\nimport { CancelScheduledActionUseCase as UseCaseAbstraction } from \"./abstractions.js\";\nimport { GetScheduledActionUseCase } from \"~/features/GetScheduledAction/abstractions.js\";\nimport { ScheduledActionModel, SchedulerService } from \"~/shared/abstractions.js\";\nimport {\n NotAuthorizedError,\n ScheduledActionNotFoundError,\n ScheduledActionPersistenceError\n} from \"~/domain/errors.js\";\nimport { DeleteEntryUseCase } from \"@webiny/api-headless-cms/features/contentEntry/DeleteEntry/index.js\";\nimport { ScheduledActionIdWithVersion } from \"~/domain/ScheduledActionIdWithVersion.js\";\nimport { EntryNotFoundError } from \"@webiny/api-headless-cms/domain/contentEntry/errors.js\";\nimport { SchedulerPermissions } from \"~/features/permissions/abstractions.js\";\n\n/**\n * Cancels a scheduled action\n *\n * Flow:\n * 1. Check if schedule exists\n * 2. Delete EventBridge schedule\n * 3. Delete CMS entry\n * 4. If EventBridge delete fails, continue anyway (schedule might already be executed/deleted)\n */\nclass CancelScheduledActionUseCaseImpl implements UseCaseAbstraction.Interface {\n constructor(\n private getScheduledActionUseCase: GetScheduledActionUseCase.Interface,\n private schedulerService: SchedulerService.Interface,\n private deleteEntryUseCase: DeleteEntryUseCase.Interface,\n private model: ScheduledActionModel.Interface,\n private permissions: SchedulerPermissions.Interface\n ) {}\n\n async execute(\n params: UseCaseAbstraction.Params\n ): Promise> {\n const hasPermission = await this.permissions.canRead(\"action\");\n if (!hasPermission) {\n return Result.fail(new NotAuthorizedError());\n }\n const { id } = params;\n // Check if scheduled action exists\n const getResult = await this.getScheduledActionUseCase.execute(params);\n\n if (getResult.isFail()) {\n const error = getResult.error;\n\n if (error.code === \"Scheduler/ScheduledAction/NotFound\") {\n return Result.fail(new ScheduledActionNotFoundError(id));\n }\n\n return Result.fail(error);\n }\n\n const scheduleId = ScheduledActionIdWithVersion.from(id);\n\n // Delete EventBridge schedule\n // Note: We continue even if this fails, as the schedule might already be executed/deleted\n try {\n const eventBridgeSchedule = await this.schedulerService.exists(params);\n /**\n * No point to even try deleting if it doesn't exist.\n */\n if (eventBridgeSchedule) {\n await this.schedulerService.delete(params);\n }\n } catch (error) {\n console.warn(\n `Failed to delete EventBridge schedule: ${scheduleId}, tenant \"${params.tenant}\". Continuing with CMS entry deletion.`,\n error\n );\n }\n\n // Delete CMS entry\n const deleteResult = await this.deleteEntryUseCase.execute(this.model, getResult.value.id, {\n force: true,\n permanently: true\n });\n\n if (deleteResult.isFail()) {\n /**\n * Some process could have already deleted the entry, in which case we can safely ignore this error.\n */\n if (deleteResult.error instanceof EntryNotFoundError) {\n return Result.ok(true);\n }\n return Result.fail(\n new ScheduledActionPersistenceError(new Error(deleteResult.error.message))\n );\n }\n\n return Result.ok(true);\n }\n}\n\nexport const CancelScheduledActionUseCase = UseCaseAbstraction.createImplementation({\n implementation: CancelScheduledActionUseCaseImpl,\n dependencies: [\n GetScheduledActionUseCase,\n SchedulerService,\n DeleteEntryUseCase,\n ScheduledActionModel,\n SchedulerPermissions\n ]\n});\n"],"names":["CancelScheduledActionUseCaseImpl","getScheduledActionUseCase","schedulerService","deleteEntryUseCase","model","permissions","params","hasPermission","Result","NotAuthorizedError","id","getResult","error","ScheduledActionNotFoundError","scheduleId","ScheduledActionIdWithVersion","eventBridgeSchedule","console","deleteResult","EntryNotFoundError","ScheduledActionPersistenceError","Error","CancelScheduledActionUseCase","UseCaseAbstraction","GetScheduledActionUseCase","SchedulerService","DeleteEntryUseCase","ScheduledActionModel","SchedulerPermissions"],"mappings":";;;;;;;;;AAuBA,MAAMA;IACF,YACYC,yBAA8D,EAC9DC,gBAA4C,EAC5CC,kBAAgD,EAChDC,KAAqC,EACrCC,WAA2C,CACrD;aALUJ,yBAAyB,GAAzBA;aACAC,gBAAgB,GAAhBA;aACAC,kBAAkB,GAAlBA;aACAC,KAAK,GAALA;aACAC,WAAW,GAAXA;IACT;IAEH,MAAM,QACFC,MAAiC,EACiB;QAClD,MAAMC,gBAAgB,MAAM,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC;QACrD,IAAI,CAACA,eACD,OAAOC,OAAO,IAAI,CAAC,IAAIC;QAE3B,MAAM,EAAEC,EAAE,EAAE,GAAGJ;QAEf,MAAMK,YAAY,MAAM,IAAI,CAAC,yBAAyB,CAAC,OAAO,CAACL;QAE/D,IAAIK,UAAU,MAAM,IAAI;YACpB,MAAMC,QAAQD,UAAU,KAAK;YAE7B,IAAIC,AAAe,yCAAfA,MAAM,IAAI,EACV,OAAOJ,OAAO,IAAI,CAAC,IAAIK,6BAA6BH;YAGxD,OAAOF,OAAO,IAAI,CAACI;QACvB;QAEA,MAAME,aAAaC,6BAA6B,IAAI,CAACL;QAIrD,IAAI;YACA,MAAMM,sBAAsB,MAAM,IAAI,CAAC,gBAAgB,CAAC,MAAM,CAACV;YAI/D,IAAIU,qBACA,MAAM,IAAI,CAAC,gBAAgB,CAAC,MAAM,CAACV;QAE3C,EAAE,OAAOM,OAAO;YACZK,QAAQ,IAAI,CACR,CAAC,uCAAuC,EAAEH,WAAW,UAAU,EAAER,OAAO,MAAM,CAAC,sCAAsC,CAAC,EACtHM;QAER;QAGA,MAAMM,eAAe,MAAM,IAAI,CAAC,kBAAkB,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,EAAEP,UAAU,KAAK,CAAC,EAAE,EAAE;YACvF,OAAO;YACP,aAAa;QACjB;QAEA,IAAIO,aAAa,MAAM,IAAI;YAIvB,IAAIA,aAAa,KAAK,YAAYC,oBAC9B,OAAOX,OAAO,EAAE,CAAC;YAErB,OAAOA,OAAO,IAAI,CACd,IAAIY,gCAAgC,IAAIC,MAAMH,aAAa,KAAK,CAAC,OAAO;QAEhF;QAEA,OAAOV,OAAO,EAAE,CAAC;IACrB;AACJ;AAEO,MAAMc,4DAA+BC,6BAAAA,oBAAuC,CAAC;IAChF,gBAAgBvB;IAChB,cAAc;QACVwB;QACAC;QACAC;QACAC;QACAC;KACH;AACL"} \ No newline at end of file diff --git a/packages/api-scheduler/dist._build/features/CancelScheduledAction/abstractions.d.ts b/packages/api-scheduler/dist._build/features/CancelScheduledAction/abstractions.d.ts deleted file mode 100644 index ced36ba4f19..00000000000 --- a/packages/api-scheduler/dist._build/features/CancelScheduledAction/abstractions.d.ts +++ /dev/null @@ -1,32 +0,0 @@ -import { Result } from "@webiny/feature/api"; -import { NotAuthorizedError, ScheduledActionNotFoundError, ScheduledActionPersistenceError, SchedulerServiceError } from "~/domain/errors.js"; -/** - * CancelScheduledActionUseCase - Cancel a scheduled action - * - * Cancels both the CMS entry and the EventBridge schedule. - * Used when a user manually cancels a scheduled action or when business logic - * determines the action should no longer execute. - */ -export interface ICancelScheduledActionErrors { - notFound: ScheduledActionNotFoundError; - persistence: ScheduledActionPersistenceError; - schedulerService: SchedulerServiceError; - unauthorized: NotAuthorizedError; -} -type CancelScheduledActionError = ICancelScheduledActionErrors[keyof ICancelScheduledActionErrors]; -export interface ICancelScheduledActionUseCaseParams { - namespace: string; - id: string; - tenant: string; -} -export interface ICancelScheduledActionUseCase { - execute(params: ICancelScheduledActionUseCaseParams): Promise>; -} -/** Cancel a scheduled action. */ -export declare const CancelScheduledActionUseCase: import("@webiny/di").Abstraction; -export declare namespace CancelScheduledActionUseCase { - type Interface = ICancelScheduledActionUseCase; - type Error = CancelScheduledActionError; - type Params = ICancelScheduledActionUseCaseParams; -} -export {}; diff --git a/packages/api-scheduler/dist._build/features/CancelScheduledAction/abstractions.js b/packages/api-scheduler/dist._build/features/CancelScheduledAction/abstractions.js deleted file mode 100644 index a8e597838fe..00000000000 --- a/packages/api-scheduler/dist._build/features/CancelScheduledAction/abstractions.js +++ /dev/null @@ -1,5 +0,0 @@ -import { createAbstraction } from "@webiny/feature/api"; -const CancelScheduledActionUseCase = createAbstraction("Scheduler/CancelScheduledActionUseCase"); -export { CancelScheduledActionUseCase }; - -//# sourceMappingURL=abstractions.js.map \ No newline at end of file diff --git a/packages/api-scheduler/dist._build/features/CancelScheduledAction/abstractions.js.map b/packages/api-scheduler/dist._build/features/CancelScheduledAction/abstractions.js.map deleted file mode 100644 index c7778afa756..00000000000 --- a/packages/api-scheduler/dist._build/features/CancelScheduledAction/abstractions.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"features/CancelScheduledAction/abstractions.js","sources":["../../../src/features/CancelScheduledAction/abstractions.ts"],"sourcesContent":["import { createAbstraction, Result } from \"@webiny/feature/api\";\nimport {\n NotAuthorizedError,\n ScheduledActionNotFoundError,\n ScheduledActionPersistenceError,\n SchedulerServiceError\n} from \"~/domain/errors.js\";\n\n/**\n * CancelScheduledActionUseCase - Cancel a scheduled action\n *\n * Cancels both the CMS entry and the EventBridge schedule.\n * Used when a user manually cancels a scheduled action or when business logic\n * determines the action should no longer execute.\n */\n\nexport interface ICancelScheduledActionErrors {\n notFound: ScheduledActionNotFoundError;\n persistence: ScheduledActionPersistenceError;\n schedulerService: SchedulerServiceError;\n unauthorized: NotAuthorizedError;\n}\n\ntype CancelScheduledActionError = ICancelScheduledActionErrors[keyof ICancelScheduledActionErrors];\nexport interface ICancelScheduledActionUseCaseParams {\n namespace: string;\n id: string;\n tenant: string;\n}\nexport interface ICancelScheduledActionUseCase {\n execute(\n params: ICancelScheduledActionUseCaseParams\n ): Promise>;\n}\n\n/** Cancel a scheduled action. */\nexport const CancelScheduledActionUseCase = createAbstraction(\n \"Scheduler/CancelScheduledActionUseCase\"\n);\n\nexport namespace CancelScheduledActionUseCase {\n export type Interface = ICancelScheduledActionUseCase;\n export type Error = CancelScheduledActionError;\n export type Params = ICancelScheduledActionUseCaseParams;\n}\n"],"names":["CancelScheduledActionUseCase","createAbstraction"],"mappings":";AAoCO,MAAMA,+BAA+BC,kBACxC"} \ No newline at end of file diff --git a/packages/api-scheduler/dist._build/features/CancelScheduledAction/feature.d.ts b/packages/api-scheduler/dist._build/features/CancelScheduledAction/feature.d.ts deleted file mode 100644 index 696c9635e7f..00000000000 --- a/packages/api-scheduler/dist._build/features/CancelScheduledAction/feature.d.ts +++ /dev/null @@ -1,10 +0,0 @@ -/** - * CancelScheduledAction Feature - * - * Provides the ability to cancel a scheduled action. - * Removes both the EventBridge schedule and the CMS entry. - */ -export declare const CancelScheduledActionFeature: { - name: string; - register(container: import("@webiny/di").Container): void; -}; diff --git a/packages/api-scheduler/dist._build/features/CancelScheduledAction/feature.js b/packages/api-scheduler/dist._build/features/CancelScheduledAction/feature.js deleted file mode 100644 index bb562c79989..00000000000 --- a/packages/api-scheduler/dist._build/features/CancelScheduledAction/feature.js +++ /dev/null @@ -1,11 +0,0 @@ -import { createFeature } from "@webiny/feature/api"; -import { CancelScheduledActionUseCase } from "./CancelScheduledActionUseCase.js"; -const CancelScheduledActionFeature = createFeature({ - name: "CancelScheduledAction", - register (container) { - container.register(CancelScheduledActionUseCase); - } -}); -export { CancelScheduledActionFeature }; - -//# sourceMappingURL=feature.js.map \ No newline at end of file diff --git a/packages/api-scheduler/dist._build/features/CancelScheduledAction/feature.js.map b/packages/api-scheduler/dist._build/features/CancelScheduledAction/feature.js.map deleted file mode 100644 index 8ef9e676536..00000000000 --- a/packages/api-scheduler/dist._build/features/CancelScheduledAction/feature.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"features/CancelScheduledAction/feature.js","sources":["../../../src/features/CancelScheduledAction/feature.ts"],"sourcesContent":["import { createFeature } from \"@webiny/feature/api\";\nimport { CancelScheduledActionUseCase } from \"./CancelScheduledActionUseCase.js\";\n\n/**\n * CancelScheduledAction Feature\n *\n * Provides the ability to cancel a scheduled action.\n * Removes both the EventBridge schedule and the CMS entry.\n */\nexport const CancelScheduledActionFeature = createFeature({\n name: \"CancelScheduledAction\",\n register(container) {\n container.register(CancelScheduledActionUseCase);\n }\n});\n"],"names":["CancelScheduledActionFeature","createFeature","container","CancelScheduledActionUseCase"],"mappings":";;AASO,MAAMA,+BAA+BC,cAAc;IACtD,MAAM;IACN,UAASC,SAAS;QACdA,UAAU,QAAQ,CAACC;IACvB;AACJ"} \ No newline at end of file diff --git a/packages/api-scheduler/dist._build/features/CancelScheduledAction/index.d.ts b/packages/api-scheduler/dist._build/features/CancelScheduledAction/index.d.ts deleted file mode 100644 index ea9ebfb8417..00000000000 --- a/packages/api-scheduler/dist._build/features/CancelScheduledAction/index.d.ts +++ /dev/null @@ -1 +0,0 @@ -export * from "./abstractions.js"; diff --git a/packages/api-scheduler/dist._build/features/CancelScheduledAction/index.js b/packages/api-scheduler/dist._build/features/CancelScheduledAction/index.js deleted file mode 100644 index ea9ebfb8417..00000000000 --- a/packages/api-scheduler/dist._build/features/CancelScheduledAction/index.js +++ /dev/null @@ -1 +0,0 @@ -export * from "./abstractions.js"; diff --git a/packages/api-scheduler/dist._build/features/ExecuteScheduledAction/ExecuteScheduledActionUseCase.d.ts b/packages/api-scheduler/dist._build/features/ExecuteScheduledAction/ExecuteScheduledActionUseCase.d.ts deleted file mode 100644 index 6e5cc3d2c40..00000000000 --- a/packages/api-scheduler/dist._build/features/ExecuteScheduledAction/ExecuteScheduledActionUseCase.d.ts +++ /dev/null @@ -1,33 +0,0 @@ -import { Result } from "@webiny/feature/api"; -import { ExecuteScheduledActionUseCase as UseCaseAbstraction } from "./abstractions.js"; -import { GetScheduledActionUseCase } from "~/features/GetScheduledAction/abstractions.js"; -import { ScheduledActionHandler, ScheduledActionModel } from "~/shared/abstractions.js"; -import { DeleteEntryUseCase } from "@webiny/api-headless-cms/features/contentEntry/DeleteEntry/index.js"; -import { UpdateEntryUseCase } from "@webiny/api-headless-cms/features/contentEntry/UpdateEntry/index.js"; -import type { GenericRecord } from "@webiny/api/types.js"; -import { IdentityContext } from "@webiny/api-core/features/security/IdentityContext/index.js"; -/** - * Executes a scheduled action - * - * Flow: - * 1. Load scheduled action from CMS - * 2. Find registered handler for namespace + actionType - * 3. Execute handler - * 4. Delete schedule entry on success - * 5. Update entry with error on failure (for debugging/audit) - */ -declare class ExecuteScheduledActionUseCaseImpl implements UseCaseAbstraction.Interface { - private getScheduledActionUseCase; - private actionHandler; - private deleteEntryUseCase; - private updateEntryUseCase; - private model; - private identityContext; - constructor(getScheduledActionUseCase: GetScheduledActionUseCase.Interface, actionHandler: ScheduledActionHandler.Interface, deleteEntryUseCase: DeleteEntryUseCase.Interface, updateEntryUseCase: UpdateEntryUseCase.Interface, model: ScheduledActionModel.Interface, identityContext: IdentityContext.Interface); - execute(params: UseCaseAbstraction.Params): Promise>; - private executeAction; -} -export declare const ExecuteScheduledActionUseCase: typeof ExecuteScheduledActionUseCaseImpl & { - __abstraction: import("@webiny/di").Abstraction; -}; -export {}; diff --git a/packages/api-scheduler/dist._build/features/ExecuteScheduledAction/ExecuteScheduledActionUseCase.js b/packages/api-scheduler/dist._build/features/ExecuteScheduledAction/ExecuteScheduledActionUseCase.js deleted file mode 100644 index 12468bb3597..00000000000 --- a/packages/api-scheduler/dist._build/features/ExecuteScheduledAction/ExecuteScheduledActionUseCase.js +++ /dev/null @@ -1,82 +0,0 @@ -import { Result } from "@webiny/feature/api"; -import { ExecuteScheduledActionUseCase, ExecutionFailedError, HandlerNotFoundError } from "./abstractions.js"; -import { GetScheduledActionUseCase } from "../GetScheduledAction/abstractions.js"; -import { ScheduledActionHandler, ScheduledActionModel } from "../../shared/abstractions.js"; -import { ScheduledActionNotFoundError, ScheduledActionPersistenceError } from "../../domain/errors.js"; -import { DeleteEntryUseCase } from "@webiny/api-headless-cms/features/contentEntry/DeleteEntry/index.js"; -import { UpdateEntryUseCase } from "@webiny/api-headless-cms/features/contentEntry/UpdateEntry/index.js"; -import { ScheduledActionIdWithVersion } from "../../domain/ScheduledActionIdWithVersion.js"; -import { AuthenticatedIdentity, IdentityContext } from "@webiny/api-core/features/security/IdentityContext/index.js"; -class ExecuteScheduledActionUseCaseImpl { - constructor(getScheduledActionUseCase, actionHandler, deleteEntryUseCase, updateEntryUseCase, model, identityContext){ - this.getScheduledActionUseCase = getScheduledActionUseCase; - this.actionHandler = actionHandler; - this.deleteEntryUseCase = deleteEntryUseCase; - this.updateEntryUseCase = updateEntryUseCase; - this.model = model; - this.identityContext = identityContext; - } - async execute(params) { - return this.identityContext.withoutAuthorization(async ()=>this.executeAction(params)); - } - async executeAction(params) { - const { id } = params; - const getResult = await this.getScheduledActionUseCase.execute(params); - if (getResult.isFail()) { - const error = getResult.error; - if ("Scheduler/ScheduledAction/NotFound" === error.code) return Result.fail(new ScheduledActionNotFoundError(id)); - return Result.fail(error); - } - const scheduledAction = getResult.value; - const scheduledBy = scheduledAction.scheduledBy; - this.identityContext.setIdentity(new AuthenticatedIdentity({ - id: scheduledBy.id, - type: scheduledBy.type, - displayName: scheduledBy.displayName ?? "", - context: { - canAccessTenant: true - } - })); - const scheduleId = ScheduledActionIdWithVersion.from(id); - if (!this.actionHandler.canHandle(scheduledAction.namespace, scheduledAction.actionType)) { - const error = new HandlerNotFoundError(scheduledAction.namespace, scheduledAction.actionType); - await this.updateEntryUseCase.execute(this.model, scheduleId, { - values: { - error: error.message - } - }); - return Result.fail(error); - } - try { - await this.actionHandler.handle(scheduledAction); - const deleteResult = await this.deleteEntryUseCase.execute(this.model, scheduleId, { - force: true, - permanently: true - }); - if (deleteResult.isFail()) return Result.fail(new ScheduledActionPersistenceError(new Error(deleteResult.error.message))); - return Result.ok(); - } catch (error) { - const executionError = new ExecutionFailedError(`Failed to execute scheduled action: ${error.message}`, error); - await this.updateEntryUseCase.execute(this.model, scheduleId, { - values: { - error: executionError.message - } - }); - return Result.fail(executionError); - } - } -} -const ExecuteScheduledActionUseCase_ExecuteScheduledActionUseCase = ExecuteScheduledActionUseCase.createImplementation({ - implementation: ExecuteScheduledActionUseCaseImpl, - dependencies: [ - GetScheduledActionUseCase, - ScheduledActionHandler, - DeleteEntryUseCase, - UpdateEntryUseCase, - ScheduledActionModel, - IdentityContext - ] -}); -export { ExecuteScheduledActionUseCase_ExecuteScheduledActionUseCase as ExecuteScheduledActionUseCase }; - -//# sourceMappingURL=ExecuteScheduledActionUseCase.js.map \ No newline at end of file diff --git a/packages/api-scheduler/dist._build/features/ExecuteScheduledAction/ExecuteScheduledActionUseCase.js.map b/packages/api-scheduler/dist._build/features/ExecuteScheduledAction/ExecuteScheduledActionUseCase.js.map deleted file mode 100644 index d844c6c4dd8..00000000000 --- a/packages/api-scheduler/dist._build/features/ExecuteScheduledAction/ExecuteScheduledActionUseCase.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"features/ExecuteScheduledAction/ExecuteScheduledActionUseCase.js","sources":["../../../src/features/ExecuteScheduledAction/ExecuteScheduledActionUseCase.ts"],"sourcesContent":["import { Result } from \"@webiny/feature/api\";\nimport {\n ExecuteScheduledActionUseCase as UseCaseAbstraction,\n ExecutionFailedError,\n HandlerNotFoundError\n} from \"./abstractions.js\";\nimport { GetScheduledActionUseCase } from \"~/features/GetScheduledAction/abstractions.js\";\nimport {\n type IScheduledAction,\n ScheduledActionHandler,\n ScheduledActionModel\n} from \"~/shared/abstractions.js\";\nimport { ScheduledActionNotFoundError, ScheduledActionPersistenceError } from \"~/domain/errors.js\";\nimport { DeleteEntryUseCase } from \"@webiny/api-headless-cms/features/contentEntry/DeleteEntry/index.js\";\nimport { UpdateEntryUseCase } from \"@webiny/api-headless-cms/features/contentEntry/UpdateEntry/index.js\";\nimport { ScheduledActionIdWithVersion } from \"~/domain/ScheduledActionIdWithVersion.js\";\nimport type { GenericRecord } from \"@webiny/api/types.js\";\nimport {\n AuthenticatedIdentity,\n IdentityContext\n} from \"@webiny/api-core/features/security/IdentityContext/index.js\";\n\n/**\n * Executes a scheduled action\n *\n * Flow:\n * 1. Load scheduled action from CMS\n * 2. Find registered handler for namespace + actionType\n * 3. Execute handler\n * 4. Delete schedule entry on success\n * 5. Update entry with error on failure (for debugging/audit)\n */\nclass ExecuteScheduledActionUseCaseImpl implements UseCaseAbstraction.Interface {\n public constructor(\n private getScheduledActionUseCase: GetScheduledActionUseCase.Interface,\n private actionHandler: ScheduledActionHandler.Interface,\n private deleteEntryUseCase: DeleteEntryUseCase.Interface,\n private updateEntryUseCase: UpdateEntryUseCase.Interface,\n private model: ScheduledActionModel.Interface,\n private identityContext: IdentityContext.Interface\n ) {}\n\n public async execute(\n params: UseCaseAbstraction.Params\n ): Promise> {\n return this.identityContext.withoutAuthorization(async () => {\n return this.executeAction(params);\n });\n }\n\n private async executeAction(\n params: UseCaseAbstraction.Params\n ): Promise> {\n const { id } = params;\n // Load scheduled action\n const getResult = await this.getScheduledActionUseCase.execute(params);\n\n if (getResult.isFail()) {\n const error = getResult.error;\n\n if (error.code === \"Scheduler/ScheduledAction/NotFound\") {\n return Result.fail(new ScheduledActionNotFoundError(id));\n }\n\n return Result.fail(error);\n }\n const scheduledAction = getResult.value;\n\n /**\n * When executing the scheduled action, we need a user which has access to perform the action.\n * We will set a user which created the scheduled action as the execution user.\n */\n const scheduledBy = scheduledAction.scheduledBy;\n this.identityContext.setIdentity(\n new AuthenticatedIdentity({\n id: scheduledBy.id,\n type: scheduledBy.type,\n displayName: scheduledBy.displayName ?? \"\",\n context: {\n canAccessTenant: true\n }\n })\n );\n\n const scheduleId = ScheduledActionIdWithVersion.from(id);\n\n // Check if the handler can handle this action\n if (!this.actionHandler.canHandle(scheduledAction.namespace, scheduledAction.actionType)) {\n const error = new HandlerNotFoundError(\n scheduledAction.namespace,\n scheduledAction.actionType\n );\n\n // Update entry with error for debugging\n await this.updateEntryUseCase.execute>(this.model, scheduleId, {\n values: {\n error: error.message\n }\n });\n\n return Result.fail(error);\n }\n\n // Execute handler\n try {\n await this.actionHandler.handle(scheduledAction);\n\n // Delete schedule entry on success\n const deleteResult = await this.deleteEntryUseCase.execute(this.model, scheduleId, {\n force: true,\n permanently: true\n });\n\n if (deleteResult.isFail()) {\n return Result.fail(\n new ScheduledActionPersistenceError(new Error(deleteResult.error.message))\n );\n }\n\n return Result.ok();\n } catch (error) {\n const executionError = new ExecutionFailedError(\n `Failed to execute scheduled action: ${(error as Error).message}`,\n error as Error\n );\n\n // Update entry with error for debugging\n await this.updateEntryUseCase.execute>(this.model, scheduleId, {\n values: {\n error: executionError.message\n }\n });\n\n return Result.fail(executionError);\n }\n }\n}\n\nexport const ExecuteScheduledActionUseCase = UseCaseAbstraction.createImplementation({\n implementation: ExecuteScheduledActionUseCaseImpl,\n dependencies: [\n GetScheduledActionUseCase,\n ScheduledActionHandler,\n DeleteEntryUseCase,\n UpdateEntryUseCase,\n ScheduledActionModel,\n IdentityContext\n ]\n});\n"],"names":["ExecuteScheduledActionUseCaseImpl","getScheduledActionUseCase","actionHandler","deleteEntryUseCase","updateEntryUseCase","model","identityContext","params","id","getResult","error","Result","ScheduledActionNotFoundError","scheduledAction","scheduledBy","AuthenticatedIdentity","scheduleId","ScheduledActionIdWithVersion","HandlerNotFoundError","deleteResult","ScheduledActionPersistenceError","Error","executionError","ExecutionFailedError","ExecuteScheduledActionUseCase","UseCaseAbstraction","GetScheduledActionUseCase","ScheduledActionHandler","DeleteEntryUseCase","UpdateEntryUseCase","ScheduledActionModel","IdentityContext"],"mappings":";;;;;;;;;AAgCA,MAAMA;IACF,YACYC,yBAA8D,EAC9DC,aAA+C,EAC/CC,kBAAgD,EAChDC,kBAAgD,EAChDC,KAAqC,EACrCC,eAA0C,CACpD;aANUL,yBAAyB,GAAzBA;aACAC,aAAa,GAAbA;aACAC,kBAAkB,GAAlBA;aACAC,kBAAkB,GAAlBA;aACAC,KAAK,GAALA;aACAC,eAAe,GAAfA;IACT;IAEH,MAAa,QACTC,MAAiC,EACc;QAC/C,OAAO,IAAI,CAAC,eAAe,CAAC,oBAAoB,CAAC,UACtC,IAAI,CAAC,aAAa,CAAIA;IAErC;IAEA,MAAc,cACVA,MAAiC,EACc;QAC/C,MAAM,EAAEC,EAAE,EAAE,GAAGD;QAEf,MAAME,YAAY,MAAM,IAAI,CAAC,yBAAyB,CAAC,OAAO,CAAIF;QAElE,IAAIE,UAAU,MAAM,IAAI;YACpB,MAAMC,QAAQD,UAAU,KAAK;YAE7B,IAAIC,AAAe,yCAAfA,MAAM,IAAI,EACV,OAAOC,OAAO,IAAI,CAAC,IAAIC,6BAA6BJ;YAGxD,OAAOG,OAAO,IAAI,CAACD;QACvB;QACA,MAAMG,kBAAkBJ,UAAU,KAAK;QAMvC,MAAMK,cAAcD,gBAAgB,WAAW;QAC/C,IAAI,CAAC,eAAe,CAAC,WAAW,CAC5B,IAAIE,sBAAsB;YACtB,IAAID,YAAY,EAAE;YAClB,MAAMA,YAAY,IAAI;YACtB,aAAaA,YAAY,WAAW,IAAI;YACxC,SAAS;gBACL,iBAAiB;YACrB;QACJ;QAGJ,MAAME,aAAaC,6BAA6B,IAAI,CAACT;QAGrD,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,SAAS,CAACK,gBAAgB,SAAS,EAAEA,gBAAgB,UAAU,GAAG;YACtF,MAAMH,QAAQ,IAAIQ,qBACdL,gBAAgB,SAAS,EACzBA,gBAAgB,UAAU;YAI9B,MAAM,IAAI,CAAC,kBAAkB,CAAC,OAAO,CAAsB,IAAI,CAAC,KAAK,EAAEG,YAAY;gBAC/E,QAAQ;oBACJ,OAAON,MAAM,OAAO;gBACxB;YACJ;YAEA,OAAOC,OAAO,IAAI,CAACD;QACvB;QAGA,IAAI;YACA,MAAM,IAAI,CAAC,aAAa,CAAC,MAAM,CAACG;YAGhC,MAAMM,eAAe,MAAM,IAAI,CAAC,kBAAkB,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,EAAEH,YAAY;gBAC/E,OAAO;gBACP,aAAa;YACjB;YAEA,IAAIG,aAAa,MAAM,IACnB,OAAOR,OAAO,IAAI,CACd,IAAIS,gCAAgC,IAAIC,MAAMF,aAAa,KAAK,CAAC,OAAO;YAIhF,OAAOR,OAAO,EAAE;QACpB,EAAE,OAAOD,OAAO;YACZ,MAAMY,iBAAiB,IAAIC,qBACvB,CAAC,oCAAoC,EAAGb,MAAgB,OAAO,EAAE,EACjEA;YAIJ,MAAM,IAAI,CAAC,kBAAkB,CAAC,OAAO,CAAsB,IAAI,CAAC,KAAK,EAAEM,YAAY;gBAC/E,QAAQ;oBACJ,OAAOM,eAAe,OAAO;gBACjC;YACJ;YAEA,OAAOX,OAAO,IAAI,CAACW;QACvB;IACJ;AACJ;AAEO,MAAME,8DAAgCC,8BAAAA,oBAAuC,CAAC;IACjF,gBAAgBzB;IAChB,cAAc;QACV0B;QACAC;QACAC;QACAC;QACAC;QACAC;KACH;AACL"} \ No newline at end of file diff --git a/packages/api-scheduler/dist._build/features/ExecuteScheduledAction/ScheduledActionHandlerComposite.d.ts b/packages/api-scheduler/dist._build/features/ExecuteScheduledAction/ScheduledActionHandlerComposite.d.ts deleted file mode 100644 index 2df1bf39357..00000000000 --- a/packages/api-scheduler/dist._build/features/ExecuteScheduledAction/ScheduledActionHandlerComposite.d.ts +++ /dev/null @@ -1,19 +0,0 @@ -import { IScheduledAction, ScheduledActionHandler, type ScheduledActionType } from "~/shared/abstractions.js"; -import type { GenericRecord } from "@webiny/api/types.js"; -/** - * Composite handler that iterates through all registered handlers - * to find one that can handle the given namespace + actionType combination. - * - * This is registered as a composite via container.registerComposite(), - * and the DI container will automatically inject all registered handlers. - */ -declare class ScheduledActionHandlerCompositeImpl implements ScheduledActionHandler.Interface { - private handlers; - constructor(handlers: ScheduledActionHandler.Interface[]); - canHandle(namespace: string, actionType: ScheduledActionType): boolean; - handle(action: IScheduledAction): Promise; -} -export declare const ScheduledActionHandlerComposite: typeof ScheduledActionHandlerCompositeImpl & { - __abstraction: import("@webiny/di").Abstraction; -}; -export {}; diff --git a/packages/api-scheduler/dist._build/features/ExecuteScheduledAction/ScheduledActionHandlerComposite.js b/packages/api-scheduler/dist._build/features/ExecuteScheduledAction/ScheduledActionHandlerComposite.js deleted file mode 100644 index 4a661a23fc1..00000000000 --- a/packages/api-scheduler/dist._build/features/ExecuteScheduledAction/ScheduledActionHandlerComposite.js +++ /dev/null @@ -1,28 +0,0 @@ -import { ScheduledActionHandler } from "../../shared/abstractions.js"; -class ScheduledActionHandlerCompositeImpl { - constructor(handlers){ - this.handlers = handlers; - } - canHandle(namespace, actionType) { - return this.handlers.some((handler)=>handler.canHandle(namespace, actionType)); - } - async handle(action) { - const handler = this.handlers.find((h)=>h.canHandle(action.namespace, action.actionType)); - if (!handler) return void console.log(`No handler found for namespace "${action.namespace}" and actionType "${action.actionType}"`); - await handler.handle(action); - } -} -const ScheduledActionHandlerComposite = ScheduledActionHandler.createComposite({ - implementation: ScheduledActionHandlerCompositeImpl, - dependencies: [ - [ - ScheduledActionHandler, - { - multiple: true - } - ] - ] -}); -export { ScheduledActionHandlerComposite }; - -//# sourceMappingURL=ScheduledActionHandlerComposite.js.map \ No newline at end of file diff --git a/packages/api-scheduler/dist._build/features/ExecuteScheduledAction/ScheduledActionHandlerComposite.js.map b/packages/api-scheduler/dist._build/features/ExecuteScheduledAction/ScheduledActionHandlerComposite.js.map deleted file mode 100644 index cc845e5faae..00000000000 --- a/packages/api-scheduler/dist._build/features/ExecuteScheduledAction/ScheduledActionHandlerComposite.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"features/ExecuteScheduledAction/ScheduledActionHandlerComposite.js","sources":["../../../src/features/ExecuteScheduledAction/ScheduledActionHandlerComposite.ts"],"sourcesContent":["import {\n IScheduledAction,\n ScheduledActionHandler,\n type ScheduledActionType\n} from \"~/shared/abstractions.js\";\nimport type { GenericRecord } from \"@webiny/api/types.js\";\n\n/**\n * Composite handler that iterates through all registered handlers\n * to find one that can handle the given namespace + actionType combination.\n *\n * This is registered as a composite via container.registerComposite(),\n * and the DI container will automatically inject all registered handlers.\n */\nclass ScheduledActionHandlerCompositeImpl implements ScheduledActionHandler.Interface {\n public constructor(private handlers: ScheduledActionHandler.Interface[]) {}\n\n public canHandle(namespace: string, actionType: ScheduledActionType): boolean {\n return this.handlers.some(handler => handler.canHandle(namespace, actionType));\n }\n\n public async handle(action: IScheduledAction): Promise {\n const handler = this.handlers.find(h => h.canHandle(action.namespace, action.actionType));\n\n if (!handler) {\n console.log(\n `No handler found for namespace \"${action.namespace}\" and actionType \"${action.actionType}\"`\n );\n return;\n }\n\n await handler.handle(action);\n }\n}\n\nexport const ScheduledActionHandlerComposite = ScheduledActionHandler.createComposite({\n implementation: ScheduledActionHandlerCompositeImpl,\n dependencies: [[ScheduledActionHandler, { multiple: true }]]\n});\n"],"names":["ScheduledActionHandlerCompositeImpl","handlers","namespace","actionType","handler","action","h","console","ScheduledActionHandlerComposite","ScheduledActionHandler"],"mappings":";AAcA,MAAMA;IACF,YAA2BC,QAA4C,CAAE;aAA9CA,QAAQ,GAARA;IAA+C;IAEnE,UAAUC,SAAiB,EAAEC,UAA+B,EAAW;QAC1E,OAAO,IAAI,CAAC,QAAQ,CAAC,IAAI,CAACC,CAAAA,UAAWA,QAAQ,SAAS,CAACF,WAAWC;IACtE;IAEA,MAAa,OAAgCE,MAA2B,EAAiB;QACrF,MAAMD,UAAU,IAAI,CAAC,QAAQ,CAAC,IAAI,CAACE,CAAAA,IAAKA,EAAE,SAAS,CAACD,OAAO,SAAS,EAAEA,OAAO,UAAU;QAEvF,IAAI,CAACD,SAAS,YACVG,QAAQ,GAAG,CACP,CAAC,gCAAgC,EAAEF,OAAO,SAAS,CAAC,kBAAkB,EAAEA,OAAO,UAAU,CAAC,CAAC,CAAC;QAKpG,MAAMD,QAAQ,MAAM,CAACC;IACzB;AACJ;AAEO,MAAMG,kCAAkCC,uBAAuB,eAAe,CAAC;IAClF,gBAAgBT;IAChB,cAAc;QAAC;YAACS;YAAwB;gBAAE,UAAU;YAAK;SAAE;KAAC;AAChE"} \ No newline at end of file diff --git a/packages/api-scheduler/dist._build/features/ExecuteScheduledAction/abstractions.d.ts b/packages/api-scheduler/dist._build/features/ExecuteScheduledAction/abstractions.d.ts deleted file mode 100644 index d48c13ad879..00000000000 --- a/packages/api-scheduler/dist._build/features/ExecuteScheduledAction/abstractions.d.ts +++ /dev/null @@ -1,54 +0,0 @@ -import { Result } from "@webiny/feature/api"; -import { NotAuthorizedError, ScheduledActionNotFoundError, ScheduledActionPersistenceError } from "~/domain/errors.js"; -/** - * ExecuteScheduledActionUseCase - Execute a scheduled action - * - * This is triggered by EventBridge when a schedule fires. - * Finds the appropriate handler based on namespace + actionType and executes it. - * - * Flow: - * 1. Load scheduled action from CMS - * 2. Find registered handler for namespace + actionType - * 3. Execute handler - * 4. Delete schedule entry on success - * 5. Update entry with error on failure - */ -export interface IExecuteScheduledActionErrors { - notFound: ScheduledActionNotFoundError; - persistence: ScheduledActionPersistenceError; - handlerNotFound: HandlerNotFoundError; - executionFailed: ExecutionFailedError; - unauthorized: NotAuthorizedError; -} -type ExecuteScheduledActionError = IExecuteScheduledActionErrors[keyof IExecuteScheduledActionErrors]; -export interface IExecuteScheduledActionUseCaseParams { - namespace: string; - tenant: string; - id: string; -} -export interface IExecuteScheduledActionUseCase { - execute(params: IExecuteScheduledActionUseCaseParams): Promise>; -} -/** Execute a scheduled action immediately. */ -export declare const ExecuteScheduledActionUseCase: import("@webiny/di").Abstraction; -export declare namespace ExecuteScheduledActionUseCase { - type Interface = IExecuteScheduledActionUseCase; - type Error = ExecuteScheduledActionError; - type Params = IExecuteScheduledActionUseCaseParams; -} -/** - * Handler not found error - */ -export declare class HandlerNotFoundError extends Error { - readonly code: "Scheduler/Handler/NotFound"; - constructor(namespace: string, actionType: string); -} -/** - * Execution failed error - */ -export declare class ExecutionFailedError extends Error { - readonly originalError?: Error | undefined; - readonly code: "Scheduler/Execution/Failed"; - constructor(message: string, originalError?: Error | undefined); -} -export {}; diff --git a/packages/api-scheduler/dist._build/features/ExecuteScheduledAction/abstractions.js b/packages/api-scheduler/dist._build/features/ExecuteScheduledAction/abstractions.js deleted file mode 100644 index 8eaa069727d..00000000000 --- a/packages/api-scheduler/dist._build/features/ExecuteScheduledAction/abstractions.js +++ /dev/null @@ -1,17 +0,0 @@ -import { createAbstraction } from "@webiny/feature/api"; -const ExecuteScheduledActionUseCase = createAbstraction("Scheduler/ExecuteScheduledActionUseCase"); -class HandlerNotFoundError extends Error { - constructor(namespace, actionType){ - super(`No handler registered for namespace "${namespace}" and actionType "${actionType}"`), this.code = "Scheduler/Handler/NotFound"; - this.name = "HandlerNotFoundError"; - } -} -class ExecutionFailedError extends Error { - constructor(message, originalError){ - super(message), this.originalError = originalError, this.code = "Scheduler/Execution/Failed"; - this.name = "ExecutionFailedError"; - } -} -export { ExecuteScheduledActionUseCase, ExecutionFailedError, HandlerNotFoundError }; - -//# sourceMappingURL=abstractions.js.map \ No newline at end of file diff --git a/packages/api-scheduler/dist._build/features/ExecuteScheduledAction/abstractions.js.map b/packages/api-scheduler/dist._build/features/ExecuteScheduledAction/abstractions.js.map deleted file mode 100644 index e1bbe06751c..00000000000 --- a/packages/api-scheduler/dist._build/features/ExecuteScheduledAction/abstractions.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"features/ExecuteScheduledAction/abstractions.js","sources":["../../../src/features/ExecuteScheduledAction/abstractions.ts"],"sourcesContent":["import { createAbstraction } from \"@webiny/feature/api\";\nimport { Result } from \"@webiny/feature/api\";\nimport {\n NotAuthorizedError,\n ScheduledActionNotFoundError,\n ScheduledActionPersistenceError\n} from \"~/domain/errors.js\";\n\n/**\n * ExecuteScheduledActionUseCase - Execute a scheduled action\n *\n * This is triggered by EventBridge when a schedule fires.\n * Finds the appropriate handler based on namespace + actionType and executes it.\n *\n * Flow:\n * 1. Load scheduled action from CMS\n * 2. Find registered handler for namespace + actionType\n * 3. Execute handler\n * 4. Delete schedule entry on success\n * 5. Update entry with error on failure\n */\n\nexport interface IExecuteScheduledActionErrors {\n notFound: ScheduledActionNotFoundError;\n persistence: ScheduledActionPersistenceError;\n handlerNotFound: HandlerNotFoundError;\n executionFailed: ExecutionFailedError;\n unauthorized: NotAuthorizedError;\n}\n\ntype ExecuteScheduledActionError =\n IExecuteScheduledActionErrors[keyof IExecuteScheduledActionErrors];\n\nexport interface IExecuteScheduledActionUseCaseParams {\n namespace: string;\n tenant: string;\n id: string;\n}\n\nexport interface IExecuteScheduledActionUseCase {\n execute(\n params: IExecuteScheduledActionUseCaseParams\n ): Promise>;\n}\n\n/** Execute a scheduled action immediately. */\nexport const ExecuteScheduledActionUseCase = createAbstraction(\n \"Scheduler/ExecuteScheduledActionUseCase\"\n);\n\nexport namespace ExecuteScheduledActionUseCase {\n export type Interface = IExecuteScheduledActionUseCase;\n export type Error = ExecuteScheduledActionError;\n export type Params = IExecuteScheduledActionUseCaseParams;\n}\n\n/**\n * Handler not found error\n */\nexport class HandlerNotFoundError extends Error {\n readonly code = \"Scheduler/Handler/NotFound\" as const;\n\n constructor(namespace: string, actionType: string) {\n super(`No handler registered for namespace \"${namespace}\" and actionType \"${actionType}\"`);\n this.name = \"HandlerNotFoundError\";\n }\n}\n\n/**\n * Execution failed error\n */\nexport class ExecutionFailedError extends Error {\n readonly code = \"Scheduler/Execution/Failed\" as const;\n\n constructor(\n message: string,\n public readonly originalError?: Error\n ) {\n super(message);\n this.name = \"ExecutionFailedError\";\n }\n}\n"],"names":["ExecuteScheduledActionUseCase","createAbstraction","HandlerNotFoundError","Error","namespace","actionType","ExecutionFailedError","message","originalError"],"mappings":";AA8CO,MAAMA,gCAAgCC,kBACzC;AAYG,MAAMC,6BAA6BC;IAGtC,YAAYC,SAAiB,EAAEC,UAAkB,CAAE;QAC/C,KAAK,CAAC,CAAC,qCAAqC,EAAED,UAAU,kBAAkB,EAAEC,WAAW,CAAC,CAAC,QAHpF,IAAI,GAAG;QAIZ,IAAI,CAAC,IAAI,GAAG;IAChB;AACJ;AAKO,MAAMC,6BAA6BH;IAGtC,YACII,OAAe,EACCC,aAAqB,CACvC;QACE,KAAK,CAACD,UAAAA,IAAAA,CAFUC,aAAa,GAAbA,eAAAA,IAAAA,CAJX,IAAI,GAAG;QAOZ,IAAI,CAAC,IAAI,GAAG;IAChB;AACJ"} \ No newline at end of file diff --git a/packages/api-scheduler/dist._build/features/ExecuteScheduledAction/feature.d.ts b/packages/api-scheduler/dist._build/features/ExecuteScheduledAction/feature.d.ts deleted file mode 100644 index a2031511b83..00000000000 --- a/packages/api-scheduler/dist._build/features/ExecuteScheduledAction/feature.d.ts +++ /dev/null @@ -1,10 +0,0 @@ -/** - * ExecuteScheduledAction Feature - * - * Provides the ability to execute a scheduled action when triggered by EventBridge. - * Finds the appropriate handler and executes it, then cleans up the schedule entry. - */ -export declare const ExecuteScheduledActionFeature: { - name: string; - register(container: import("@webiny/di").Container): void; -}; diff --git a/packages/api-scheduler/dist._build/features/ExecuteScheduledAction/feature.js b/packages/api-scheduler/dist._build/features/ExecuteScheduledAction/feature.js deleted file mode 100644 index 79afb4903bb..00000000000 --- a/packages/api-scheduler/dist._build/features/ExecuteScheduledAction/feature.js +++ /dev/null @@ -1,13 +0,0 @@ -import { createFeature } from "@webiny/feature/api"; -import { ExecuteScheduledActionUseCase } from "./ExecuteScheduledActionUseCase.js"; -import { ScheduledActionHandlerComposite } from "./ScheduledActionHandlerComposite.js"; -const ExecuteScheduledActionFeature = createFeature({ - name: "ExecuteScheduledAction", - register (container) { - container.register(ExecuteScheduledActionUseCase); - container.registerComposite(ScheduledActionHandlerComposite); - } -}); -export { ExecuteScheduledActionFeature }; - -//# sourceMappingURL=feature.js.map \ No newline at end of file diff --git a/packages/api-scheduler/dist._build/features/ExecuteScheduledAction/feature.js.map b/packages/api-scheduler/dist._build/features/ExecuteScheduledAction/feature.js.map deleted file mode 100644 index 1ed038dca79..00000000000 --- a/packages/api-scheduler/dist._build/features/ExecuteScheduledAction/feature.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"features/ExecuteScheduledAction/feature.js","sources":["../../../src/features/ExecuteScheduledAction/feature.ts"],"sourcesContent":["import { createFeature } from \"@webiny/feature/api\";\nimport { ExecuteScheduledActionUseCase } from \"./ExecuteScheduledActionUseCase.js\";\nimport { ScheduledActionHandlerComposite } from \"~/features/ExecuteScheduledAction/ScheduledActionHandlerComposite.js\";\n\n/**\n * ExecuteScheduledAction Feature\n *\n * Provides the ability to execute a scheduled action when triggered by EventBridge.\n * Finds the appropriate handler and executes it, then cleans up the schedule entry.\n */\nexport const ExecuteScheduledActionFeature = createFeature({\n name: \"ExecuteScheduledAction\",\n register(container) {\n container.register(ExecuteScheduledActionUseCase);\n container.registerComposite(ScheduledActionHandlerComposite);\n }\n});\n"],"names":["ExecuteScheduledActionFeature","createFeature","container","ExecuteScheduledActionUseCase","ScheduledActionHandlerComposite"],"mappings":";;;AAUO,MAAMA,gCAAgCC,cAAc;IACvD,MAAM;IACN,UAASC,SAAS;QACdA,UAAU,QAAQ,CAACC;QACnBD,UAAU,iBAAiB,CAACE;IAChC;AACJ"} \ No newline at end of file diff --git a/packages/api-scheduler/dist._build/features/ExecuteScheduledAction/index.d.ts b/packages/api-scheduler/dist._build/features/ExecuteScheduledAction/index.d.ts deleted file mode 100644 index ea9ebfb8417..00000000000 --- a/packages/api-scheduler/dist._build/features/ExecuteScheduledAction/index.d.ts +++ /dev/null @@ -1 +0,0 @@ -export * from "./abstractions.js"; diff --git a/packages/api-scheduler/dist._build/features/ExecuteScheduledAction/index.js b/packages/api-scheduler/dist._build/features/ExecuteScheduledAction/index.js deleted file mode 100644 index ea9ebfb8417..00000000000 --- a/packages/api-scheduler/dist._build/features/ExecuteScheduledAction/index.js +++ /dev/null @@ -1 +0,0 @@ -export * from "./abstractions.js"; diff --git a/packages/api-scheduler/dist._build/features/GetScheduledAction/GetScheduledActionUseCase.d.ts b/packages/api-scheduler/dist._build/features/GetScheduledAction/GetScheduledActionUseCase.d.ts deleted file mode 100644 index d61eb527090..00000000000 --- a/packages/api-scheduler/dist._build/features/GetScheduledAction/GetScheduledActionUseCase.d.ts +++ /dev/null @@ -1,28 +0,0 @@ -import { Result } from "@webiny/feature/api"; -import { GetScheduledActionUseCase as UseCaseAbstraction } from "./abstractions.js"; -import type { IScheduledAction } from "~/shared/abstractions.js"; -import { ScheduledActionModel } from "~/shared/abstractions.js"; -import { GetEntryByIdUseCase } from "@webiny/api-headless-cms/features/contentEntry/GetEntryById/index.js"; -import type { GenericRecord } from "@webiny/api/types.js"; -import { SchedulerPermissions } from "~/features/permissions/abstractions.js"; -import { IdentityContext } from "@webiny/api-core/exports/api/security.js"; -/** - * Retrieves a scheduled action by its ID - * - * Flow: - * 1. Fetch schedule entry from CMS storage by ID - * 2. Return null if not found - * 3. Transform CMS entry to IScheduledAction format - */ -declare class GetScheduledActionUseCaseImpl implements UseCaseAbstraction.Interface { - private getEntryByIdUseCase; - private model; - private permissions; - private identityContext; - constructor(getEntryByIdUseCase: GetEntryByIdUseCase.Interface, model: ScheduledActionModel.Interface, permissions: SchedulerPermissions.Interface, identityContext: IdentityContext.Interface); - execute(params: UseCaseAbstraction.Params): Promise, UseCaseAbstraction.Error>>; -} -export declare const GetScheduledActionUseCase: typeof GetScheduledActionUseCaseImpl & { - __abstraction: import("@webiny/di").Abstraction; -}; -export {}; diff --git a/packages/api-scheduler/dist._build/features/GetScheduledAction/GetScheduledActionUseCase.js b/packages/api-scheduler/dist._build/features/GetScheduledAction/GetScheduledActionUseCase.js deleted file mode 100644 index 231f3b820ad..00000000000 --- a/packages/api-scheduler/dist._build/features/GetScheduledAction/GetScheduledActionUseCase.js +++ /dev/null @@ -1,48 +0,0 @@ -import { Result } from "@webiny/feature/api"; -import { GetScheduledActionUseCase } from "./abstractions.js"; -import { ScheduledActionModel } from "../../shared/abstractions.js"; -import { NotAuthorizedError, ScheduledActionNotFoundError, ScheduledActionPersistenceError } from "../../domain/errors.js"; -import { GetEntryByIdUseCase } from "@webiny/api-headless-cms/features/contentEntry/GetEntryById/index.js"; -import { ScheduledActionIdWithVersion } from "../../domain/ScheduledActionIdWithVersion.js"; -import { SchedulerPermissions } from "../permissions/abstractions.js"; -import { IdentityContext } from "@webiny/api-core/exports/api/security.js"; -import { ScheduledActionMapper } from "../../domain/ScheduledActionMapper.js"; -class GetScheduledActionUseCaseImpl { - constructor(getEntryByIdUseCase, model, permissions, identityContext){ - this.getEntryByIdUseCase = getEntryByIdUseCase; - this.model = model; - this.permissions = permissions; - this.identityContext = identityContext; - } - async execute(params) { - const hasPermission = await this.permissions.canRead("action"); - if (!hasPermission) return Result.fail(new NotAuthorizedError()); - const { id, namespace } = params; - const scheduleId = ScheduledActionIdWithVersion.from(id); - const entryResult = await this.getEntryByIdUseCase.execute(this.model, scheduleId); - if (entryResult.isFail()) { - if ("Cms/Entry/NotFound" === entryResult.error.code) return Result.fail(new ScheduledActionNotFoundError(scheduleId)); - return Result.fail(new ScheduledActionPersistenceError(entryResult.error)); - } - const ownRecordsOnly = await this.permissions.onlyOwnRecords("action"); - if (ownRecordsOnly) { - if (entryResult.value.createdBy.id !== this.identityContext.getIdentity().id) return Result.fail(new NotAuthorizedError()); - } - const entry = entryResult.value; - if (entry.values.namespace !== namespace) return Result.fail(new ScheduledActionNotFoundError(scheduleId)); - const action = ScheduledActionMapper.toAction(entry); - return Result.ok(action); - } -} -const GetScheduledActionUseCase_GetScheduledActionUseCase = GetScheduledActionUseCase.createImplementation({ - implementation: GetScheduledActionUseCaseImpl, - dependencies: [ - GetEntryByIdUseCase, - ScheduledActionModel, - SchedulerPermissions, - IdentityContext - ] -}); -export { GetScheduledActionUseCase_GetScheduledActionUseCase as GetScheduledActionUseCase }; - -//# sourceMappingURL=GetScheduledActionUseCase.js.map \ No newline at end of file diff --git a/packages/api-scheduler/dist._build/features/GetScheduledAction/GetScheduledActionUseCase.js.map b/packages/api-scheduler/dist._build/features/GetScheduledAction/GetScheduledActionUseCase.js.map deleted file mode 100644 index b9f6fc44734..00000000000 --- a/packages/api-scheduler/dist._build/features/GetScheduledAction/GetScheduledActionUseCase.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"features/GetScheduledAction/GetScheduledActionUseCase.js","sources":["../../../src/features/GetScheduledAction/GetScheduledActionUseCase.ts"],"sourcesContent":["import { Result } from \"@webiny/feature/api\";\nimport { GetScheduledActionUseCase as UseCaseAbstraction } from \"./abstractions.js\";\nimport type { IScheduledAction, IScheduledActionEntryValues } from \"~/shared/abstractions.js\";\nimport { ScheduledActionModel } from \"~/shared/abstractions.js\";\nimport {\n NotAuthorizedError,\n ScheduledActionNotFoundError,\n ScheduledActionPersistenceError\n} from \"~/domain/errors.js\";\nimport { GetEntryByIdUseCase } from \"@webiny/api-headless-cms/features/contentEntry/GetEntryById/index.js\";\nimport { ScheduledActionIdWithVersion } from \"~/domain/ScheduledActionIdWithVersion.js\";\nimport type { GenericRecord } from \"@webiny/api/types.js\";\nimport { SchedulerPermissions } from \"~/features/permissions/abstractions.js\";\nimport { IdentityContext } from \"@webiny/api-core/exports/api/security.js\";\nimport { ScheduledActionMapper } from \"~/domain/ScheduledActionMapper.js\";\n\n/**\n * Retrieves a scheduled action by its ID\n *\n * Flow:\n * 1. Fetch schedule entry from CMS storage by ID\n * 2. Return null if not found\n * 3. Transform CMS entry to IScheduledAction format\n */\nclass GetScheduledActionUseCaseImpl implements UseCaseAbstraction.Interface {\n constructor(\n private getEntryByIdUseCase: GetEntryByIdUseCase.Interface,\n private model: ScheduledActionModel.Interface,\n private permissions: SchedulerPermissions.Interface,\n private identityContext: IdentityContext.Interface\n ) {}\n\n async execute(\n params: UseCaseAbstraction.Params\n ): Promise, UseCaseAbstraction.Error>> {\n const hasPermission = await this.permissions.canRead(\"action\");\n if (!hasPermission) {\n return Result.fail(new NotAuthorizedError());\n }\n const { id, namespace } = params;\n // Get entry from CMS\n const scheduleId = ScheduledActionIdWithVersion.from(id);\n const entryResult = await this.getEntryByIdUseCase.execute>(\n this.model,\n scheduleId\n );\n\n if (entryResult.isFail()) {\n if (entryResult.error.code === \"Cms/Entry/NotFound\") {\n return Result.fail(new ScheduledActionNotFoundError(scheduleId));\n }\n\n return Result.fail(new ScheduledActionPersistenceError(entryResult.error));\n }\n\n const ownRecordsOnly = await this.permissions.onlyOwnRecords(\"action\");\n if (ownRecordsOnly) {\n if (entryResult.value.createdBy.id !== this.identityContext.getIdentity().id) {\n return Result.fail(new NotAuthorizedError());\n }\n }\n\n const entry = entryResult.value;\n /**\n * Always check if the namespace is correct because entry is loaded directly, not via filtering.\n */\n if (entry.values.namespace !== namespace) {\n return Result.fail(new ScheduledActionNotFoundError(scheduleId));\n }\n const action = ScheduledActionMapper.toAction(entry);\n\n return Result.ok(action);\n }\n}\n\nexport const GetScheduledActionUseCase = UseCaseAbstraction.createImplementation({\n implementation: GetScheduledActionUseCaseImpl,\n dependencies: [GetEntryByIdUseCase, ScheduledActionModel, SchedulerPermissions, IdentityContext]\n});\n"],"names":["GetScheduledActionUseCaseImpl","getEntryByIdUseCase","model","permissions","identityContext","params","hasPermission","Result","NotAuthorizedError","id","namespace","scheduleId","ScheduledActionIdWithVersion","entryResult","ScheduledActionNotFoundError","ScheduledActionPersistenceError","ownRecordsOnly","entry","action","ScheduledActionMapper","GetScheduledActionUseCase","UseCaseAbstraction","GetEntryByIdUseCase","ScheduledActionModel","SchedulerPermissions","IdentityContext"],"mappings":";;;;;;;;;AAwBA,MAAMA;IACF,YACYC,mBAAkD,EAClDC,KAAqC,EACrCC,WAA2C,EAC3CC,eAA0C,CACpD;aAJUH,mBAAmB,GAAnBA;aACAC,KAAK,GAALA;aACAC,WAAW,GAAXA;aACAC,eAAe,GAAfA;IACT;IAEH,MAAM,QACFC,MAAiC,EAC6B;QAC9D,MAAMC,gBAAgB,MAAM,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC;QACrD,IAAI,CAACA,eACD,OAAOC,OAAO,IAAI,CAAC,IAAIC;QAE3B,MAAM,EAAEC,EAAE,EAAEC,SAAS,EAAE,GAAGL;QAE1B,MAAMM,aAAaC,6BAA6B,IAAI,CAACH;QACrD,MAAMI,cAAc,MAAM,IAAI,CAAC,mBAAmB,CAAC,OAAO,CACtD,IAAI,CAAC,KAAK,EACVF;QAGJ,IAAIE,YAAY,MAAM,IAAI;YACtB,IAAIA,AAA2B,yBAA3BA,YAAY,KAAK,CAAC,IAAI,EACtB,OAAON,OAAO,IAAI,CAAC,IAAIO,6BAA6BH;YAGxD,OAAOJ,OAAO,IAAI,CAAC,IAAIQ,gCAAgCF,YAAY,KAAK;QAC5E;QAEA,MAAMG,iBAAiB,MAAM,IAAI,CAAC,WAAW,CAAC,cAAc,CAAC;QAC7D,IAAIA,gBACA;YAAA,IAAIH,YAAY,KAAK,CAAC,SAAS,CAAC,EAAE,KAAK,IAAI,CAAC,eAAe,CAAC,WAAW,GAAG,EAAE,EACxE,OAAON,OAAO,IAAI,CAAC,IAAIC;QAC3B;QAGJ,MAAMS,QAAQJ,YAAY,KAAK;QAI/B,IAAII,MAAM,MAAM,CAAC,SAAS,KAAKP,WAC3B,OAAOH,OAAO,IAAI,CAAC,IAAIO,6BAA6BH;QAExD,MAAMO,SAASC,sBAAsB,QAAQ,CAAIF;QAEjD,OAAOV,OAAO,EAAE,CAACW;IACrB;AACJ;AAEO,MAAME,sDAA4BC,0BAAAA,oBAAuC,CAAC;IAC7E,gBAAgBrB;IAChB,cAAc;QAACsB;QAAqBC;QAAsBC;QAAsBC;KAAgB;AACpG"} \ No newline at end of file diff --git a/packages/api-scheduler/dist._build/features/GetScheduledAction/abstractions.d.ts b/packages/api-scheduler/dist._build/features/GetScheduledAction/abstractions.d.ts deleted file mode 100644 index 619b5cee94b..00000000000 --- a/packages/api-scheduler/dist._build/features/GetScheduledAction/abstractions.d.ts +++ /dev/null @@ -1,33 +0,0 @@ -import { Result } from "@webiny/feature/api"; -import type { IScheduledAction } from "~/shared/abstractions.js"; -import { ScheduledActionNotFoundError, ScheduledActionPersistenceError, NotAuthorizedError } from "~/domain/errors.js"; -import type { GenericRecord } from "@webiny/api/types.js"; -/** - * GetScheduledActionUseCase - Retrieve a scheduled action by ID - * - * Used to check if a schedule exists (for reschedule logic) and to retrieve - * schedule details for display/management purposes. - * - * Returns null value (Result.ok(null)) if schedule not found. - */ -export interface IGetScheduledActionErrors { - persistence: ScheduledActionPersistenceError; - notFound: ScheduledActionNotFoundError; - unauthorized: NotAuthorizedError; -} -type GetScheduledActionError = IGetScheduledActionErrors[keyof IGetScheduledActionErrors]; -export interface IGetScheduledActionUseCaseParams { - namespace: string; - id: string; -} -export interface IGetScheduledActionUseCase { - execute(params: IGetScheduledActionUseCaseParams): Promise, GetScheduledActionError>>; -} -/** Retrieve a scheduled action. */ -export declare const GetScheduledActionUseCase: import("@webiny/di").Abstraction; -export declare namespace GetScheduledActionUseCase { - type Interface = IGetScheduledActionUseCase; - type Error = GetScheduledActionError; - type Params = IGetScheduledActionUseCaseParams; -} -export {}; diff --git a/packages/api-scheduler/dist._build/features/GetScheduledAction/abstractions.js b/packages/api-scheduler/dist._build/features/GetScheduledAction/abstractions.js deleted file mode 100644 index fd92260594d..00000000000 --- a/packages/api-scheduler/dist._build/features/GetScheduledAction/abstractions.js +++ /dev/null @@ -1,5 +0,0 @@ -import { createAbstraction } from "@webiny/feature/api"; -const GetScheduledActionUseCase = createAbstraction("Scheduler/GetScheduledActionUseCase"); -export { GetScheduledActionUseCase }; - -//# sourceMappingURL=abstractions.js.map \ No newline at end of file diff --git a/packages/api-scheduler/dist._build/features/GetScheduledAction/abstractions.js.map b/packages/api-scheduler/dist._build/features/GetScheduledAction/abstractions.js.map deleted file mode 100644 index 4a1f1965f5b..00000000000 --- a/packages/api-scheduler/dist._build/features/GetScheduledAction/abstractions.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"features/GetScheduledAction/abstractions.js","sources":["../../../src/features/GetScheduledAction/abstractions.ts"],"sourcesContent":["import { createAbstraction, Result } from \"@webiny/feature/api\";\nimport type { IScheduledAction } from \"~/shared/abstractions.js\";\nimport {\n ScheduledActionNotFoundError,\n ScheduledActionPersistenceError,\n NotAuthorizedError\n} from \"~/domain/errors.js\";\nimport type { GenericRecord } from \"@webiny/api/types.js\";\n\n/**\n * GetScheduledActionUseCase - Retrieve a scheduled action by ID\n *\n * Used to check if a schedule exists (for reschedule logic) and to retrieve\n * schedule details for display/management purposes.\n *\n * Returns null value (Result.ok(null)) if schedule not found.\n */\n\nexport interface IGetScheduledActionErrors {\n persistence: ScheduledActionPersistenceError;\n notFound: ScheduledActionNotFoundError;\n unauthorized: NotAuthorizedError;\n}\n\ntype GetScheduledActionError = IGetScheduledActionErrors[keyof IGetScheduledActionErrors];\n\nexport interface IGetScheduledActionUseCaseParams {\n namespace: string;\n id: string;\n}\n\nexport interface IGetScheduledActionUseCase {\n execute(\n params: IGetScheduledActionUseCaseParams\n ): Promise, GetScheduledActionError>>;\n}\n\n/** Retrieve a scheduled action. */\nexport const GetScheduledActionUseCase = createAbstraction(\n \"Scheduler/GetScheduledActionUseCase\"\n);\n\nexport namespace GetScheduledActionUseCase {\n export type Interface = IGetScheduledActionUseCase;\n export type Error = GetScheduledActionError;\n export type Params = IGetScheduledActionUseCaseParams;\n}\n"],"names":["GetScheduledActionUseCase","createAbstraction"],"mappings":";AAsCO,MAAMA,4BAA4BC,kBACrC"} \ No newline at end of file diff --git a/packages/api-scheduler/dist._build/features/GetScheduledAction/feature.d.ts b/packages/api-scheduler/dist._build/features/GetScheduledAction/feature.d.ts deleted file mode 100644 index 53d406cab42..00000000000 --- a/packages/api-scheduler/dist._build/features/GetScheduledAction/feature.d.ts +++ /dev/null @@ -1,10 +0,0 @@ -/** - * GetScheduledAction Feature - * - * Provides the ability to retrieve a scheduled action by ID. - * Used for checking if schedules exist and displaying schedule details. - */ -export declare const GetScheduledActionFeature: { - name: string; - register(container: import("@webiny/di").Container): void; -}; diff --git a/packages/api-scheduler/dist._build/features/GetScheduledAction/feature.js b/packages/api-scheduler/dist._build/features/GetScheduledAction/feature.js deleted file mode 100644 index 780531fdd17..00000000000 --- a/packages/api-scheduler/dist._build/features/GetScheduledAction/feature.js +++ /dev/null @@ -1,11 +0,0 @@ -import { createFeature } from "@webiny/feature/api"; -import { GetScheduledActionUseCase } from "./GetScheduledActionUseCase.js"; -const GetScheduledActionFeature = createFeature({ - name: "GetScheduledAction", - register (container) { - container.register(GetScheduledActionUseCase); - } -}); -export { GetScheduledActionFeature }; - -//# sourceMappingURL=feature.js.map \ No newline at end of file diff --git a/packages/api-scheduler/dist._build/features/GetScheduledAction/feature.js.map b/packages/api-scheduler/dist._build/features/GetScheduledAction/feature.js.map deleted file mode 100644 index a3aaa04df5b..00000000000 --- a/packages/api-scheduler/dist._build/features/GetScheduledAction/feature.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"features/GetScheduledAction/feature.js","sources":["../../../src/features/GetScheduledAction/feature.ts"],"sourcesContent":["import { createFeature } from \"@webiny/feature/api\";\nimport { GetScheduledActionUseCase } from \"./GetScheduledActionUseCase.js\";\n\n/**\n * GetScheduledAction Feature\n *\n * Provides the ability to retrieve a scheduled action by ID.\n * Used for checking if schedules exist and displaying schedule details.\n */\nexport const GetScheduledActionFeature = createFeature({\n name: \"GetScheduledAction\",\n register(container) {\n container.register(GetScheduledActionUseCase);\n }\n});\n"],"names":["GetScheduledActionFeature","createFeature","container","GetScheduledActionUseCase"],"mappings":";;AASO,MAAMA,4BAA4BC,cAAc;IACnD,MAAM;IACN,UAASC,SAAS;QACdA,UAAU,QAAQ,CAACC;IACvB;AACJ"} \ No newline at end of file diff --git a/packages/api-scheduler/dist._build/features/GetScheduledAction/index.d.ts b/packages/api-scheduler/dist._build/features/GetScheduledAction/index.d.ts deleted file mode 100644 index ea9ebfb8417..00000000000 --- a/packages/api-scheduler/dist._build/features/GetScheduledAction/index.d.ts +++ /dev/null @@ -1 +0,0 @@ -export * from "./abstractions.js"; diff --git a/packages/api-scheduler/dist._build/features/GetScheduledAction/index.js b/packages/api-scheduler/dist._build/features/GetScheduledAction/index.js deleted file mode 100644 index ea9ebfb8417..00000000000 --- a/packages/api-scheduler/dist._build/features/GetScheduledAction/index.js +++ /dev/null @@ -1 +0,0 @@ -export * from "./abstractions.js"; diff --git a/packages/api-scheduler/dist._build/features/GetTargetScheduledAction/GetTargetScheduledActionUseCase.d.ts b/packages/api-scheduler/dist._build/features/GetTargetScheduledAction/GetTargetScheduledActionUseCase.d.ts deleted file mode 100644 index 8b00ac089f7..00000000000 --- a/packages/api-scheduler/dist._build/features/GetTargetScheduledAction/GetTargetScheduledActionUseCase.d.ts +++ /dev/null @@ -1,32 +0,0 @@ -import { Result } from "@webiny/feature/api"; -import { GetTargetScheduledActionUseCase as UseCaseAbstraction } from "./abstractions.js"; -import type { IScheduledAction } from "~/shared/abstractions.js"; -import { ScheduledActionModel } from "~/shared/abstractions.js"; -import { GetEntryByIdUseCase } from "@webiny/api-headless-cms/features/contentEntry/GetEntryById/index.js"; -import type { GenericRecord } from "@webiny/api/types.js"; -import { SchedulerPermissions } from "~/features/permissions/abstractions.js"; -import { IdentityContext } from "@webiny/api-core/exports/api/security.js"; -/** - * Retrieves a scheduled action by its ID - * - * Flow: - * 1. Fetch schedule entry from CMS storage by ID - * 2. Return null if not found - * 3. Transform CMS entry to IScheduledAction format - */ -declare class GetTargetScheduledActionUseCaseImpl implements UseCaseAbstraction.Interface { - private getEntryByIdUseCase; - private model; - private permissions; - private identityContext; - constructor(getEntryByIdUseCase: GetEntryByIdUseCase.Interface, model: ScheduledActionModel.Interface, permissions: SchedulerPermissions.Interface, identityContext: IdentityContext.Interface); - execute(params: UseCaseAbstraction.Params): Promise, UseCaseAbstraction.Error>>; - /** - * We always need to fetch both publish and unpublish actions because we don't know the type of the action that is being searched for. - */ - private getRecord; -} -export declare const GetTargetScheduledActionUseCase: typeof GetTargetScheduledActionUseCaseImpl & { - __abstraction: import("@webiny/di").Abstraction; -}; -export {}; diff --git a/packages/api-scheduler/dist._build/features/GetTargetScheduledAction/GetTargetScheduledActionUseCase.js b/packages/api-scheduler/dist._build/features/GetTargetScheduledAction/GetTargetScheduledActionUseCase.js deleted file mode 100644 index c289ab09224..00000000000 --- a/packages/api-scheduler/dist._build/features/GetTargetScheduledAction/GetTargetScheduledActionUseCase.js +++ /dev/null @@ -1,64 +0,0 @@ -import { Result } from "@webiny/feature/api"; -import { GetTargetScheduledActionUseCase } from "./abstractions.js"; -import { ScheduledActionModel } from "../../shared/abstractions.js"; -import { NotAuthorizedError, ScheduledActionNotFoundError, ScheduledActionPersistenceError } from "../../domain/errors.js"; -import { GetEntryByIdUseCase } from "@webiny/api-headless-cms/features/contentEntry/GetEntryById/index.js"; -import { SchedulerPermissions } from "../permissions/abstractions.js"; -import { IdentityContext } from "@webiny/api-core/exports/api/security.js"; -import { ScheduledActionMapper } from "../../domain/ScheduledActionMapper.js"; -import { ScheduledActionId } from "../../domain/ScheduledActionId.js"; -import { ScheduledActionIdWithVersion } from "../../domain/ScheduledActionIdWithVersion.js"; -import { SCHEDULED_ACTION_PUBLISH, SCHEDULED_ACTION_UNPUBLISH } from "../../constants.js"; -class GetTargetScheduledActionUseCaseImpl { - constructor(getEntryByIdUseCase, model, permissions, identityContext){ - this.getEntryByIdUseCase = getEntryByIdUseCase; - this.model = model; - this.permissions = permissions; - this.identityContext = identityContext; - } - async execute(params) { - const hasPermission = await this.permissions.canRead("action"); - if (!hasPermission) return Result.fail(new NotAuthorizedError()); - const { id, namespace } = params; - const entryResult = await this.getRecord(params); - if (entryResult.isFail()) { - if ("Cms/Entry/NotFound" === entryResult.error.code) return Result.fail(new ScheduledActionNotFoundError(id)); - return Result.fail(new ScheduledActionPersistenceError(entryResult.error)); - } - const ownRecordsOnly = await this.permissions.onlyOwnRecords("action"); - if (ownRecordsOnly) { - if (entryResult.value.createdBy.id !== this.identityContext.getIdentity().id) return Result.fail(new NotAuthorizedError()); - } - const entry = entryResult.value; - if (entry.values.namespace !== namespace) return Result.fail(new ScheduledActionNotFoundError(id)); - const action = ScheduledActionMapper.toAction(entry); - return Result.ok(action); - } - async getRecord(params) { - const schedulePublishId = ScheduledActionId.from({ - namespace: params.namespace, - targetId: params.id, - actionType: SCHEDULED_ACTION_PUBLISH - }); - const publishResult = await this.getEntryByIdUseCase.execute(this.model, ScheduledActionIdWithVersion.from(schedulePublishId)); - if (publishResult.isOk()) return publishResult; - const scheduleUnpublishId = ScheduledActionId.from({ - namespace: params.namespace, - targetId: params.id, - actionType: SCHEDULED_ACTION_UNPUBLISH - }); - return this.getEntryByIdUseCase.execute(this.model, ScheduledActionIdWithVersion.from(scheduleUnpublishId)); - } -} -const GetTargetScheduledActionUseCase_GetTargetScheduledActionUseCase = GetTargetScheduledActionUseCase.createImplementation({ - implementation: GetTargetScheduledActionUseCaseImpl, - dependencies: [ - GetEntryByIdUseCase, - ScheduledActionModel, - SchedulerPermissions, - IdentityContext - ] -}); -export { GetTargetScheduledActionUseCase_GetTargetScheduledActionUseCase as GetTargetScheduledActionUseCase }; - -//# sourceMappingURL=GetTargetScheduledActionUseCase.js.map \ No newline at end of file diff --git a/packages/api-scheduler/dist._build/features/GetTargetScheduledAction/GetTargetScheduledActionUseCase.js.map b/packages/api-scheduler/dist._build/features/GetTargetScheduledAction/GetTargetScheduledActionUseCase.js.map deleted file mode 100644 index dd3b2ccb121..00000000000 --- a/packages/api-scheduler/dist._build/features/GetTargetScheduledAction/GetTargetScheduledActionUseCase.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"features/GetTargetScheduledAction/GetTargetScheduledActionUseCase.js","sources":["../../../src/features/GetTargetScheduledAction/GetTargetScheduledActionUseCase.ts"],"sourcesContent":["import { Result } from \"@webiny/feature/api\";\nimport { GetTargetScheduledActionUseCase as UseCaseAbstraction } from \"./abstractions.js\";\nimport type { IScheduledAction, IScheduledActionEntryValues } from \"~/shared/abstractions.js\";\nimport { ScheduledActionModel } from \"~/shared/abstractions.js\";\nimport {\n NotAuthorizedError,\n ScheduledActionNotFoundError,\n ScheduledActionPersistenceError\n} from \"~/domain/errors.js\";\nimport { GetEntryByIdUseCase } from \"@webiny/api-headless-cms/features/contentEntry/GetEntryById/index.js\";\nimport type { GenericRecord } from \"@webiny/api/types.js\";\nimport { SchedulerPermissions } from \"~/features/permissions/abstractions.js\";\nimport { IdentityContext } from \"@webiny/api-core/exports/api/security.js\";\nimport { ScheduledActionMapper } from \"~/domain/ScheduledActionMapper.js\";\nimport { ScheduledActionId } from \"~/domain/ScheduledActionId.js\";\nimport { ScheduledActionIdWithVersion } from \"~/domain/ScheduledActionIdWithVersion.js\";\nimport { SCHEDULED_ACTION_PUBLISH, SCHEDULED_ACTION_UNPUBLISH } from \"~/constants.js\";\n\n/**\n * Retrieves a scheduled action by its ID\n *\n * Flow:\n * 1. Fetch schedule entry from CMS storage by ID\n * 2. Return null if not found\n * 3. Transform CMS entry to IScheduledAction format\n */\nclass GetTargetScheduledActionUseCaseImpl implements UseCaseAbstraction.Interface {\n constructor(\n private getEntryByIdUseCase: GetEntryByIdUseCase.Interface,\n private model: ScheduledActionModel.Interface,\n private permissions: SchedulerPermissions.Interface,\n private identityContext: IdentityContext.Interface\n ) {}\n\n async execute(\n params: UseCaseAbstraction.Params\n ): Promise, UseCaseAbstraction.Error>> {\n const hasPermission = await this.permissions.canRead(\"action\");\n if (!hasPermission) {\n return Result.fail(new NotAuthorizedError());\n }\n const { id, namespace } = params;\n\n const entryResult = await this.getRecord(params);\n\n if (entryResult.isFail()) {\n if (entryResult.error.code === \"Cms/Entry/NotFound\") {\n return Result.fail(new ScheduledActionNotFoundError(id));\n }\n\n return Result.fail(new ScheduledActionPersistenceError(entryResult.error));\n }\n\n const ownRecordsOnly = await this.permissions.onlyOwnRecords(\"action\");\n if (ownRecordsOnly) {\n if (entryResult.value.createdBy.id !== this.identityContext.getIdentity().id) {\n return Result.fail(new NotAuthorizedError());\n }\n }\n\n const entry = entryResult.value;\n /**\n * Always check if the namespace is correct because entry is loaded directly, not via filtering.\n */\n if (entry.values.namespace !== namespace) {\n return Result.fail(new ScheduledActionNotFoundError(id));\n }\n const action = ScheduledActionMapper.toAction(entry);\n return Result.ok(action);\n }\n /**\n * We always need to fetch both publish and unpublish actions because we don't know the type of the action that is being searched for.\n */\n private async getRecord(params: UseCaseAbstraction.Params) {\n const schedulePublishId = ScheduledActionId.from({\n namespace: params.namespace,\n targetId: params.id,\n actionType: SCHEDULED_ACTION_PUBLISH\n });\n const publishResult = await this.getEntryByIdUseCase.execute<\n IScheduledActionEntryValues\n >(this.model, ScheduledActionIdWithVersion.from(schedulePublishId));\n if (publishResult.isOk()) {\n return publishResult;\n }\n const scheduleUnpublishId = ScheduledActionId.from({\n namespace: params.namespace,\n targetId: params.id,\n actionType: SCHEDULED_ACTION_UNPUBLISH\n });\n return this.getEntryByIdUseCase.execute>(\n this.model,\n ScheduledActionIdWithVersion.from(scheduleUnpublishId)\n );\n }\n}\n\nexport const GetTargetScheduledActionUseCase = UseCaseAbstraction.createImplementation({\n implementation: GetTargetScheduledActionUseCaseImpl,\n dependencies: [GetEntryByIdUseCase, ScheduledActionModel, SchedulerPermissions, IdentityContext]\n});\n"],"names":["GetTargetScheduledActionUseCaseImpl","getEntryByIdUseCase","model","permissions","identityContext","params","hasPermission","Result","NotAuthorizedError","id","namespace","entryResult","ScheduledActionNotFoundError","ScheduledActionPersistenceError","ownRecordsOnly","entry","action","ScheduledActionMapper","schedulePublishId","ScheduledActionId","SCHEDULED_ACTION_PUBLISH","publishResult","ScheduledActionIdWithVersion","scheduleUnpublishId","SCHEDULED_ACTION_UNPUBLISH","GetTargetScheduledActionUseCase","UseCaseAbstraction","GetEntryByIdUseCase","ScheduledActionModel","SchedulerPermissions","IdentityContext"],"mappings":";;;;;;;;;;;AA0BA,MAAMA;IACF,YACYC,mBAAkD,EAClDC,KAAqC,EACrCC,WAA2C,EAC3CC,eAA0C,CACpD;aAJUH,mBAAmB,GAAnBA;aACAC,KAAK,GAALA;aACAC,WAAW,GAAXA;aACAC,eAAe,GAAfA;IACT;IAEH,MAAM,QACFC,MAAiC,EAC6B;QAC9D,MAAMC,gBAAgB,MAAM,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC;QACrD,IAAI,CAACA,eACD,OAAOC,OAAO,IAAI,CAAC,IAAIC;QAE3B,MAAM,EAAEC,EAAE,EAAEC,SAAS,EAAE,GAAGL;QAE1B,MAAMM,cAAc,MAAM,IAAI,CAAC,SAAS,CAAIN;QAE5C,IAAIM,YAAY,MAAM,IAAI;YACtB,IAAIA,AAA2B,yBAA3BA,YAAY,KAAK,CAAC,IAAI,EACtB,OAAOJ,OAAO,IAAI,CAAC,IAAIK,6BAA6BH;YAGxD,OAAOF,OAAO,IAAI,CAAC,IAAIM,gCAAgCF,YAAY,KAAK;QAC5E;QAEA,MAAMG,iBAAiB,MAAM,IAAI,CAAC,WAAW,CAAC,cAAc,CAAC;QAC7D,IAAIA,gBACA;YAAA,IAAIH,YAAY,KAAK,CAAC,SAAS,CAAC,EAAE,KAAK,IAAI,CAAC,eAAe,CAAC,WAAW,GAAG,EAAE,EACxE,OAAOJ,OAAO,IAAI,CAAC,IAAIC;QAC3B;QAGJ,MAAMO,QAAQJ,YAAY,KAAK;QAI/B,IAAII,MAAM,MAAM,CAAC,SAAS,KAAKL,WAC3B,OAAOH,OAAO,IAAI,CAAC,IAAIK,6BAA6BH;QAExD,MAAMO,SAASC,sBAAsB,QAAQ,CAAIF;QACjD,OAAOR,OAAO,EAAE,CAACS;IACrB;IAIA,MAAc,UAAmCX,MAAiC,EAAE;QAChF,MAAMa,oBAAoBC,kBAAkB,IAAI,CAAC;YAC7C,WAAWd,OAAO,SAAS;YAC3B,UAAUA,OAAO,EAAE;YACnB,YAAYe;QAChB;QACA,MAAMC,gBAAgB,MAAM,IAAI,CAAC,mBAAmB,CAAC,OAAO,CAE1D,IAAI,CAAC,KAAK,EAAEC,6BAA6B,IAAI,CAACJ;QAChD,IAAIG,cAAc,IAAI,IAClB,OAAOA;QAEX,MAAME,sBAAsBJ,kBAAkB,IAAI,CAAC;YAC/C,WAAWd,OAAO,SAAS;YAC3B,UAAUA,OAAO,EAAE;YACnB,YAAYmB;QAChB;QACA,OAAO,IAAI,CAAC,mBAAmB,CAAC,OAAO,CACnC,IAAI,CAAC,KAAK,EACVF,6BAA6B,IAAI,CAACC;IAE1C;AACJ;AAEO,MAAME,kEAAkCC,gCAAAA,oBAAuC,CAAC;IACnF,gBAAgB1B;IAChB,cAAc;QAAC2B;QAAqBC;QAAsBC;QAAsBC;KAAgB;AACpG"} \ No newline at end of file diff --git a/packages/api-scheduler/dist._build/features/GetTargetScheduledAction/abstractions.d.ts b/packages/api-scheduler/dist._build/features/GetTargetScheduledAction/abstractions.d.ts deleted file mode 100644 index 7dfdba5b540..00000000000 --- a/packages/api-scheduler/dist._build/features/GetTargetScheduledAction/abstractions.d.ts +++ /dev/null @@ -1,24 +0,0 @@ -import { Result } from "@webiny/feature/api"; -import type { IScheduledAction } from "~/shared/abstractions.js"; -import { ScheduledActionNotFoundError, ScheduledActionPersistenceError, NotAuthorizedError } from "~/domain/errors.js"; -import type { GenericRecord } from "@webiny/api/types.js"; -export interface IGetTargetScheduledActionErrors { - persistence: ScheduledActionPersistenceError; - notFound: ScheduledActionNotFoundError; - unauthorized: NotAuthorizedError; -} -type GetTargetScheduledActionError = IGetTargetScheduledActionErrors[keyof IGetTargetScheduledActionErrors]; -export interface IGetTargetScheduledActionUseCaseParams { - namespace: string; - id: string; -} -export interface IGetTargetScheduledActionUseCase { - execute(params: IGetTargetScheduledActionUseCaseParams): Promise, GetTargetScheduledActionError>>; -} -export declare const GetTargetScheduledActionUseCase: import("@webiny/di").Abstraction; -export declare namespace GetTargetScheduledActionUseCase { - type Interface = IGetTargetScheduledActionUseCase; - type Error = GetTargetScheduledActionError; - type Params = IGetTargetScheduledActionUseCaseParams; -} -export {}; diff --git a/packages/api-scheduler/dist._build/features/GetTargetScheduledAction/abstractions.js b/packages/api-scheduler/dist._build/features/GetTargetScheduledAction/abstractions.js deleted file mode 100644 index e8467549af7..00000000000 --- a/packages/api-scheduler/dist._build/features/GetTargetScheduledAction/abstractions.js +++ /dev/null @@ -1,5 +0,0 @@ -import { createAbstraction } from "@webiny/feature/api"; -const GetTargetScheduledActionUseCase = createAbstraction("Scheduler/GetTargetScheduledActionUseCase"); -export { GetTargetScheduledActionUseCase }; - -//# sourceMappingURL=abstractions.js.map \ No newline at end of file diff --git a/packages/api-scheduler/dist._build/features/GetTargetScheduledAction/abstractions.js.map b/packages/api-scheduler/dist._build/features/GetTargetScheduledAction/abstractions.js.map deleted file mode 100644 index f1bd74f8a5b..00000000000 --- a/packages/api-scheduler/dist._build/features/GetTargetScheduledAction/abstractions.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"features/GetTargetScheduledAction/abstractions.js","sources":["../../../src/features/GetTargetScheduledAction/abstractions.ts"],"sourcesContent":["import { createAbstraction, Result } from \"@webiny/feature/api\";\nimport type { IScheduledAction } from \"~/shared/abstractions.js\";\nimport {\n ScheduledActionNotFoundError,\n ScheduledActionPersistenceError,\n NotAuthorizedError\n} from \"~/domain/errors.js\";\nimport type { GenericRecord } from \"@webiny/api/types.js\";\n\nexport interface IGetTargetScheduledActionErrors {\n persistence: ScheduledActionPersistenceError;\n notFound: ScheduledActionNotFoundError;\n unauthorized: NotAuthorizedError;\n}\n\ntype GetTargetScheduledActionError =\n IGetTargetScheduledActionErrors[keyof IGetTargetScheduledActionErrors];\n\nexport interface IGetTargetScheduledActionUseCaseParams {\n namespace: string;\n id: string;\n}\n\nexport interface IGetTargetScheduledActionUseCase {\n execute(\n params: IGetTargetScheduledActionUseCaseParams\n ): Promise, GetTargetScheduledActionError>>;\n}\n\nexport const GetTargetScheduledActionUseCase = createAbstraction(\n \"Scheduler/GetTargetScheduledActionUseCase\"\n);\n\nexport namespace GetTargetScheduledActionUseCase {\n export type Interface = IGetTargetScheduledActionUseCase;\n export type Error = GetTargetScheduledActionError;\n export type Params = IGetTargetScheduledActionUseCaseParams;\n}\n"],"names":["GetTargetScheduledActionUseCase","createAbstraction"],"mappings":";AA6BO,MAAMA,kCAAkCC,kBAC3C"} \ No newline at end of file diff --git a/packages/api-scheduler/dist._build/features/GetTargetScheduledAction/feature.d.ts b/packages/api-scheduler/dist._build/features/GetTargetScheduledAction/feature.d.ts deleted file mode 100644 index f4557f3a666..00000000000 --- a/packages/api-scheduler/dist._build/features/GetTargetScheduledAction/feature.d.ts +++ /dev/null @@ -1,10 +0,0 @@ -/** - * GetTargetScheduledAction Feature - * - * Provides the ability to retrieve a target scheduled action by ID. - * Used for checking if schedules exist and displaying schedule details. - */ -export declare const GetTargetScheduledActionFeature: { - name: string; - register(container: import("@webiny/di").Container): void; -}; diff --git a/packages/api-scheduler/dist._build/features/GetTargetScheduledAction/feature.js b/packages/api-scheduler/dist._build/features/GetTargetScheduledAction/feature.js deleted file mode 100644 index 59531c0e980..00000000000 --- a/packages/api-scheduler/dist._build/features/GetTargetScheduledAction/feature.js +++ /dev/null @@ -1,11 +0,0 @@ -import { createFeature } from "@webiny/feature/api"; -import { GetTargetScheduledActionUseCase } from "./GetTargetScheduledActionUseCase.js"; -const GetTargetScheduledActionFeature = createFeature({ - name: "GetTargetScheduledAction", - register (container) { - container.register(GetTargetScheduledActionUseCase); - } -}); -export { GetTargetScheduledActionFeature }; - -//# sourceMappingURL=feature.js.map \ No newline at end of file diff --git a/packages/api-scheduler/dist._build/features/GetTargetScheduledAction/feature.js.map b/packages/api-scheduler/dist._build/features/GetTargetScheduledAction/feature.js.map deleted file mode 100644 index f6f0dc3ede2..00000000000 --- a/packages/api-scheduler/dist._build/features/GetTargetScheduledAction/feature.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"features/GetTargetScheduledAction/feature.js","sources":["../../../src/features/GetTargetScheduledAction/feature.ts"],"sourcesContent":["import { createFeature } from \"@webiny/feature/api\";\nimport { GetTargetScheduledActionUseCase } from \"./GetTargetScheduledActionUseCase.js\";\n\n/**\n * GetTargetScheduledAction Feature\n *\n * Provides the ability to retrieve a target scheduled action by ID.\n * Used for checking if schedules exist and displaying schedule details.\n */\nexport const GetTargetScheduledActionFeature = createFeature({\n name: \"GetTargetScheduledAction\",\n register(container) {\n container.register(GetTargetScheduledActionUseCase);\n }\n});\n"],"names":["GetTargetScheduledActionFeature","createFeature","container","GetTargetScheduledActionUseCase"],"mappings":";;AASO,MAAMA,kCAAkCC,cAAc;IACzD,MAAM;IACN,UAASC,SAAS;QACdA,UAAU,QAAQ,CAACC;IACvB;AACJ"} \ No newline at end of file diff --git a/packages/api-scheduler/dist._build/features/GetTargetScheduledAction/index.d.ts b/packages/api-scheduler/dist._build/features/GetTargetScheduledAction/index.d.ts deleted file mode 100644 index ea9ebfb8417..00000000000 --- a/packages/api-scheduler/dist._build/features/GetTargetScheduledAction/index.d.ts +++ /dev/null @@ -1 +0,0 @@ -export * from "./abstractions.js"; diff --git a/packages/api-scheduler/dist._build/features/GetTargetScheduledAction/index.js b/packages/api-scheduler/dist._build/features/GetTargetScheduledAction/index.js deleted file mode 100644 index ea9ebfb8417..00000000000 --- a/packages/api-scheduler/dist._build/features/GetTargetScheduledAction/index.js +++ /dev/null @@ -1 +0,0 @@ -export * from "./abstractions.js"; diff --git a/packages/api-scheduler/dist._build/features/ListScheduledActions/ListScheduledActionsUseCase.d.ts b/packages/api-scheduler/dist._build/features/ListScheduledActions/ListScheduledActionsUseCase.d.ts deleted file mode 100644 index 6dbae90cc48..00000000000 --- a/packages/api-scheduler/dist._build/features/ListScheduledActions/ListScheduledActionsUseCase.d.ts +++ /dev/null @@ -1,31 +0,0 @@ -import { Result } from "@webiny/feature/api"; -import { ListLatestEntriesUseCase } from "@webiny/api-headless-cms/features/contentEntry/ListEntries/abstractions.js"; -import { IListScheduledActionsParams, IListScheduledActionsResponse, ListScheduledActionsUseCase as UseCaseAbstraction } from "./abstractions.js"; -import { ScheduledActionModel } from "~/shared/abstractions.js"; -import { CmsSortMapper, CmsWhereMapper } from "@webiny/api-headless-cms"; -import type { GenericRecord } from "@webiny/api/types.js"; -import { SchedulerPermissions } from "~/features/permissions/abstractions.js"; -import { IdentityContext } from "@webiny/api-core/exports/api/security.js"; -/** - * Lists scheduled actions with optional filtering - * - * Flow: - * 1. Build query filters based on where params (namespace, actionType, targetId, etc.) - * 2. Fetch entries from CMS storage with pagination and sorting - * 3. Transform CMS entries to IScheduledAction format - * 4. Return paginated results with metadata - */ -declare class ListScheduledActionsUseCaseImpl implements UseCaseAbstraction.Interface { - private listEntriesUseCase; - private model; - private cmsWhereMapper; - private cmsSortMapper; - private permissions; - private identityContext; - constructor(listEntriesUseCase: ListLatestEntriesUseCase.Interface, model: ScheduledActionModel.Interface, cmsWhereMapper: CmsWhereMapper.Interface, cmsSortMapper: CmsSortMapper.Interface, permissions: SchedulerPermissions.Interface, identityContext: IdentityContext.Interface); - execute(params: IListScheduledActionsParams): Promise, UseCaseAbstraction.Error>>; -} -export declare const ListScheduledActionsUseCase: typeof ListScheduledActionsUseCaseImpl & { - __abstraction: import("@webiny/di").Abstraction; -}; -export {}; diff --git a/packages/api-scheduler/dist._build/features/ListScheduledActions/ListScheduledActionsUseCase.js b/packages/api-scheduler/dist._build/features/ListScheduledActions/ListScheduledActionsUseCase.js deleted file mode 100644 index e0c3460de54..00000000000 --- a/packages/api-scheduler/dist._build/features/ListScheduledActions/ListScheduledActionsUseCase.js +++ /dev/null @@ -1,63 +0,0 @@ -import { Result } from "@webiny/feature/api"; -import { ListLatestEntriesUseCase } from "@webiny/api-headless-cms/features/contentEntry/ListEntries/abstractions.js"; -import { ListScheduledActionsUseCase } from "./abstractions.js"; -import { ScheduledActionModel } from "../../shared/abstractions.js"; -import { NotAuthorizedError, ScheduledActionPersistenceError } from "../../domain/errors.js"; -import { CmsSortMapper, CmsWhereMapper } from "@webiny/api-headless-cms"; -import { SchedulerPermissions } from "../permissions/abstractions.js"; -import { IdentityContext } from "@webiny/api-core/exports/api/security.js"; -import { ScheduledActionMapper } from "../../domain/ScheduledActionMapper.js"; -class ListScheduledActionsUseCaseImpl { - constructor(listEntriesUseCase, model, cmsWhereMapper, cmsSortMapper, permissions, identityContext){ - this.listEntriesUseCase = listEntriesUseCase; - this.model = model; - this.cmsWhereMapper = cmsWhereMapper; - this.cmsSortMapper = cmsSortMapper; - this.permissions = permissions; - this.identityContext = identityContext; - } - async execute(params) { - const hasPermission = await this.permissions.canRead("action"); - if (!hasPermission) return Result.fail(new NotAuthorizedError()); - const ownRecordsOnly = await this.permissions.onlyOwnRecords("action"); - const { where: initialWhere, sort: sortInput, limit, after } = params; - const where = this.cmsWhereMapper.map({ - input: initialWhere || {}, - fields: this.model.fields - }); - if (ownRecordsOnly) { - const identity = this.identityContext.getIdentity(); - where.createdBy = identity.id; - } - const sort = this.cmsSortMapper.map({ - input: sortInput, - fields: this.model.fields - }); - const listResult = await this.listEntriesUseCase.execute(this.model, { - where, - sort, - limit, - after - }); - if (listResult.isFail()) return Result.fail(new ScheduledActionPersistenceError(listResult.error)); - const { entries, meta } = listResult.value; - return Result.ok({ - items: ScheduledActionMapper.toActions(entries), - meta - }); - } -} -const ListScheduledActionsUseCase_ListScheduledActionsUseCase = ListScheduledActionsUseCase.createImplementation({ - implementation: ListScheduledActionsUseCaseImpl, - dependencies: [ - ListLatestEntriesUseCase, - ScheduledActionModel, - CmsWhereMapper, - CmsSortMapper, - SchedulerPermissions, - IdentityContext - ] -}); -export { ListScheduledActionsUseCase_ListScheduledActionsUseCase as ListScheduledActionsUseCase }; - -//# sourceMappingURL=ListScheduledActionsUseCase.js.map \ No newline at end of file diff --git a/packages/api-scheduler/dist._build/features/ListScheduledActions/ListScheduledActionsUseCase.js.map b/packages/api-scheduler/dist._build/features/ListScheduledActions/ListScheduledActionsUseCase.js.map deleted file mode 100644 index 8ba5078a909..00000000000 --- a/packages/api-scheduler/dist._build/features/ListScheduledActions/ListScheduledActionsUseCase.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"features/ListScheduledActions/ListScheduledActionsUseCase.js","sources":["../../../src/features/ListScheduledActions/ListScheduledActionsUseCase.ts"],"sourcesContent":["import { Result } from \"@webiny/feature/api\";\nimport { ListLatestEntriesUseCase } from \"@webiny/api-headless-cms/features/contentEntry/ListEntries/abstractions.js\";\nimport {\n IListScheduledActionsParams,\n IListScheduledActionsResponse,\n ListScheduledActionsUseCase as UseCaseAbstraction\n} from \"./abstractions.js\";\nimport type { IScheduledActionEntryValues } from \"~/shared/abstractions.js\";\nimport { ScheduledActionModel } from \"~/shared/abstractions.js\";\nimport { NotAuthorizedError, ScheduledActionPersistenceError } from \"~/domain/errors.js\";\nimport { CmsSortMapper, CmsWhereMapper } from \"@webiny/api-headless-cms\";\nimport type { GenericRecord } from \"@webiny/api/types.js\";\nimport { SchedulerPermissions } from \"~/features/permissions/abstractions.js\";\nimport { IdentityContext } from \"@webiny/api-core/exports/api/security.js\";\nimport { ScheduledActionMapper } from \"~/domain/ScheduledActionMapper.js\";\n\n/**\n * Lists scheduled actions with optional filtering\n *\n * Flow:\n * 1. Build query filters based on where params (namespace, actionType, targetId, etc.)\n * 2. Fetch entries from CMS storage with pagination and sorting\n * 3. Transform CMS entries to IScheduledAction format\n * 4. Return paginated results with metadata\n */\nclass ListScheduledActionsUseCaseImpl implements UseCaseAbstraction.Interface {\n constructor(\n private listEntriesUseCase: ListLatestEntriesUseCase.Interface,\n private model: ScheduledActionModel.Interface,\n private cmsWhereMapper: CmsWhereMapper.Interface,\n private cmsSortMapper: CmsSortMapper.Interface,\n private permissions: SchedulerPermissions.Interface,\n private identityContext: IdentityContext.Interface\n ) {}\n\n async execute(\n params: IListScheduledActionsParams\n ): Promise, UseCaseAbstraction.Error>> {\n const hasPermission = await this.permissions.canRead(\"action\");\n if (!hasPermission) {\n return Result.fail(new NotAuthorizedError());\n }\n\n const ownRecordsOnly = await this.permissions.onlyOwnRecords(\"action\");\n\n const { where: initialWhere, sort: sortInput, limit, after } = params;\n\n const where = this.cmsWhereMapper.map({\n input: initialWhere || {},\n fields: this.model.fields\n });\n\n if (ownRecordsOnly) {\n const identity = this.identityContext.getIdentity();\n where!.createdBy = identity.id;\n }\n\n const sort = this.cmsSortMapper.map({\n input: sortInput,\n fields: this.model.fields\n });\n // List entries from CMS\n const listResult = await this.listEntriesUseCase.execute>(\n this.model,\n {\n where,\n sort,\n limit,\n after\n }\n );\n\n if (listResult.isFail()) {\n return Result.fail(new ScheduledActionPersistenceError(listResult.error));\n }\n\n const { entries, meta } = listResult.value;\n\n return Result.ok({\n items: ScheduledActionMapper.toActions(entries),\n meta\n });\n }\n}\n\nexport const ListScheduledActionsUseCase = UseCaseAbstraction.createImplementation({\n implementation: ListScheduledActionsUseCaseImpl,\n dependencies: [\n ListLatestEntriesUseCase,\n ScheduledActionModel,\n CmsWhereMapper,\n CmsSortMapper,\n SchedulerPermissions,\n IdentityContext\n ]\n});\n"],"names":["ListScheduledActionsUseCaseImpl","listEntriesUseCase","model","cmsWhereMapper","cmsSortMapper","permissions","identityContext","params","hasPermission","Result","NotAuthorizedError","ownRecordsOnly","initialWhere","sortInput","limit","after","where","identity","sort","listResult","ScheduledActionPersistenceError","entries","meta","ScheduledActionMapper","ListScheduledActionsUseCase","UseCaseAbstraction","ListLatestEntriesUseCase","ScheduledActionModel","CmsWhereMapper","CmsSortMapper","SchedulerPermissions","IdentityContext"],"mappings":";;;;;;;;;AAyBA,MAAMA;IACF,YACYC,kBAAsD,EACtDC,KAAqC,EACrCC,cAAwC,EACxCC,aAAsC,EACtCC,WAA2C,EAC3CC,eAA0C,CACpD;aANUL,kBAAkB,GAAlBA;aACAC,KAAK,GAALA;aACAC,cAAc,GAAdA;aACAC,aAAa,GAAbA;aACAC,WAAW,GAAXA;aACAC,eAAe,GAAfA;IACT;IAEH,MAAM,QACFC,MAAmC,EACwC;QAC3E,MAAMC,gBAAgB,MAAM,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC;QACrD,IAAI,CAACA,eACD,OAAOC,OAAO,IAAI,CAAC,IAAIC;QAG3B,MAAMC,iBAAiB,MAAM,IAAI,CAAC,WAAW,CAAC,cAAc,CAAC;QAE7D,MAAM,EAAE,OAAOC,YAAY,EAAE,MAAMC,SAAS,EAAEC,KAAK,EAAEC,KAAK,EAAE,GAAGR;QAE/D,MAAMS,QAAQ,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC;YAClC,OAAOJ,gBAAgB,CAAC;YACxB,QAAQ,IAAI,CAAC,KAAK,CAAC,MAAM;QAC7B;QAEA,IAAID,gBAAgB;YAChB,MAAMM,WAAW,IAAI,CAAC,eAAe,CAAC,WAAW;YACjDD,MAAO,SAAS,GAAGC,SAAS,EAAE;QAClC;QAEA,MAAMC,OAAO,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC;YAChC,OAAOL;YACP,QAAQ,IAAI,CAAC,KAAK,CAAC,MAAM;QAC7B;QAEA,MAAMM,aAAa,MAAM,IAAI,CAAC,kBAAkB,CAAC,OAAO,CACpD,IAAI,CAAC,KAAK,EACV;YACIH;YACAE;YACAJ;YACAC;QACJ;QAGJ,IAAII,WAAW,MAAM,IACjB,OAAOV,OAAO,IAAI,CAAC,IAAIW,gCAAgCD,WAAW,KAAK;QAG3E,MAAM,EAAEE,OAAO,EAAEC,IAAI,EAAE,GAAGH,WAAW,KAAK;QAE1C,OAAOV,OAAO,EAAE,CAAC;YACb,OAAOc,sBAAsB,SAAS,CAAIF;YAC1CC;QACJ;IACJ;AACJ;AAEO,MAAME,0DAA8BC,4BAAAA,oBAAuC,CAAC;IAC/E,gBAAgBzB;IAChB,cAAc;QACV0B;QACAC;QACAC;QACAC;QACAC;QACAC;KACH;AACL"} \ No newline at end of file diff --git a/packages/api-scheduler/dist._build/features/ListScheduledActions/abstractions.d.ts b/packages/api-scheduler/dist._build/features/ListScheduledActions/abstractions.d.ts deleted file mode 100644 index e66a564ce5d..00000000000 --- a/packages/api-scheduler/dist._build/features/ListScheduledActions/abstractions.d.ts +++ /dev/null @@ -1,57 +0,0 @@ -import { Result } from "@webiny/feature/api"; -import type { IScheduledAction, ScheduledActionType } from "~/shared/abstractions.js"; -import { ScheduledActionPersistenceError, NotAuthorizedError } from "~/domain/errors.js"; -import type { CmsEntryListSort, CmsEntryMeta } from "@webiny/api-headless-cms/types/index.js"; -import type { GenericRecord } from "@webiny/api/types.js"; -/** - * ListScheduledActionsUseCase - List scheduled actions with optional filtering - * - * Used to retrieve all scheduled actions for a namespace (e.g., all actions for Article model) - * or all actions of a specific type across namespaces. - * - * This is critical for CMS CRUD views where we need to show ALL scheduled actions - * (publish, unpublish, delete) for a specific content model. - */ -export type DateISOString = `${number}-${number}-${number}T${number}:${number}:${number}.${number}Z`; -export interface IListScheduledActionsWhere { - namespace?: string; - namespace_startsWith?: string; - actionType?: ScheduledActionType; - targetId?: string; - targetId_startsWith?: string; - scheduledBy?: string; - scheduledFor?: DateISOString; - scheduledFor_gte?: DateISOString; - scheduledFor_lte?: DateISOString; -} -export type IListScheduledActionsMeta = CmsEntryMeta; -export interface IListScheduledActionsParams { - where: IListScheduledActionsWhere; - sort?: CmsEntryListSort; - limit?: number; - after?: string; -} -export interface IListScheduledActionsResponse { - items: IScheduledAction[]; - meta: CmsEntryMeta; -} -export interface IListScheduledActionsErrors { - persistence: ScheduledActionPersistenceError; - unauthorized: NotAuthorizedError; -} -type ListScheduledActionsError = IListScheduledActionsErrors[keyof IListScheduledActionsErrors]; -export interface IListScheduledActionsUseCase { - execute(params: IListScheduledActionsParams): Promise, ListScheduledActionsError>>; -} -/** List scheduled actions. */ -export declare const ListScheduledActionsUseCase: import("@webiny/di").Abstraction; -export declare namespace ListScheduledActionsUseCase { - type Interface = IListScheduledActionsUseCase; - type Error = ListScheduledActionsError; - type Params = IListScheduledActionsParams; - type Where = IListScheduledActionsWhere; - type Sort = CmsEntryListSort; - type Meta = IListScheduledActionsMeta; - type Response = IListScheduledActionsResponse; -} -export {}; diff --git a/packages/api-scheduler/dist._build/features/ListScheduledActions/abstractions.js b/packages/api-scheduler/dist._build/features/ListScheduledActions/abstractions.js deleted file mode 100644 index a03a2d734d0..00000000000 --- a/packages/api-scheduler/dist._build/features/ListScheduledActions/abstractions.js +++ /dev/null @@ -1,5 +0,0 @@ -import { createAbstraction } from "@webiny/feature/api"; -const ListScheduledActionsUseCase = createAbstraction("Scheduler/ListScheduledActionsUseCase"); -export { ListScheduledActionsUseCase }; - -//# sourceMappingURL=abstractions.js.map \ No newline at end of file diff --git a/packages/api-scheduler/dist._build/features/ListScheduledActions/abstractions.js.map b/packages/api-scheduler/dist._build/features/ListScheduledActions/abstractions.js.map deleted file mode 100644 index 33a8cd756dc..00000000000 --- a/packages/api-scheduler/dist._build/features/ListScheduledActions/abstractions.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"features/ListScheduledActions/abstractions.js","sources":["../../../src/features/ListScheduledActions/abstractions.ts"],"sourcesContent":["import { createAbstraction } from \"@webiny/feature/api\";\nimport { Result } from \"@webiny/feature/api\";\nimport type { IScheduledAction, ScheduledActionType } from \"~/shared/abstractions.js\";\nimport { ScheduledActionPersistenceError, NotAuthorizedError } from \"~/domain/errors.js\";\nimport type { CmsEntryListSort, CmsEntryMeta } from \"@webiny/api-headless-cms/types/index.js\";\nimport type { GenericRecord } from \"@webiny/api/types.js\";\n\n/**\n * ListScheduledActionsUseCase - List scheduled actions with optional filtering\n *\n * Used to retrieve all scheduled actions for a namespace (e.g., all actions for Article model)\n * or all actions of a specific type across namespaces.\n *\n * This is critical for CMS CRUD views where we need to show ALL scheduled actions\n * (publish, unpublish, delete) for a specific content model.\n */\n\nexport type DateISOString =\n `${number}-${number}-${number}T${number}:${number}:${number}.${number}Z`;\n\nexport interface IListScheduledActionsWhere {\n namespace?: string;\n namespace_startsWith?: string;\n actionType?: ScheduledActionType;\n targetId?: string;\n targetId_startsWith?: string;\n scheduledBy?: string;\n scheduledFor?: DateISOString;\n scheduledFor_gte?: DateISOString;\n scheduledFor_lte?: DateISOString;\n}\n\nexport type IListScheduledActionsMeta = CmsEntryMeta;\n\nexport interface IListScheduledActionsParams {\n where: IListScheduledActionsWhere;\n sort?: CmsEntryListSort;\n limit?: number;\n after?: string;\n}\n\nexport interface IListScheduledActionsResponse {\n items: IScheduledAction[];\n meta: CmsEntryMeta;\n}\n\nexport interface IListScheduledActionsErrors {\n persistence: ScheduledActionPersistenceError;\n unauthorized: NotAuthorizedError;\n}\n\ntype ListScheduledActionsError = IListScheduledActionsErrors[keyof IListScheduledActionsErrors];\n\nexport interface IListScheduledActionsUseCase {\n execute(\n params: IListScheduledActionsParams\n ): Promise, ListScheduledActionsError>>;\n}\n\n/** List scheduled actions. */\nexport const ListScheduledActionsUseCase = createAbstraction(\n \"Scheduler/ListScheduledActionsUseCase\"\n);\n\nexport namespace ListScheduledActionsUseCase {\n export type Interface = IListScheduledActionsUseCase;\n export type Error = ListScheduledActionsError;\n export type Params = IListScheduledActionsParams;\n export type Where = IListScheduledActionsWhere;\n export type Sort = CmsEntryListSort;\n export type Meta = IListScheduledActionsMeta;\n export type Response = IListScheduledActionsResponse;\n}\n"],"names":["ListScheduledActionsUseCase","createAbstraction"],"mappings":";AA4DO,MAAMA,8BAA8BC,kBACvC"} \ No newline at end of file diff --git a/packages/api-scheduler/dist._build/features/ListScheduledActions/feature.d.ts b/packages/api-scheduler/dist._build/features/ListScheduledActions/feature.d.ts deleted file mode 100644 index 47ab1b1e8c7..00000000000 --- a/packages/api-scheduler/dist._build/features/ListScheduledActions/feature.d.ts +++ /dev/null @@ -1,10 +0,0 @@ -/** - * ListScheduledActions Feature - * - * Provides the ability to list scheduled actions with optional filtering by namespace or actionType. - * Critical for CMS CRUD views showing all scheduled actions for a content model. - */ -export declare const ListScheduledActionsFeature: { - name: string; - register(container: import("@webiny/di").Container): void; -}; diff --git a/packages/api-scheduler/dist._build/features/ListScheduledActions/feature.js b/packages/api-scheduler/dist._build/features/ListScheduledActions/feature.js deleted file mode 100644 index c355e69a894..00000000000 --- a/packages/api-scheduler/dist._build/features/ListScheduledActions/feature.js +++ /dev/null @@ -1,11 +0,0 @@ -import { createFeature } from "@webiny/feature/api"; -import { ListScheduledActionsUseCase } from "./ListScheduledActionsUseCase.js"; -const ListScheduledActionsFeature = createFeature({ - name: "ListScheduledActions", - register (container) { - container.register(ListScheduledActionsUseCase); - } -}); -export { ListScheduledActionsFeature }; - -//# sourceMappingURL=feature.js.map \ No newline at end of file diff --git a/packages/api-scheduler/dist._build/features/ListScheduledActions/feature.js.map b/packages/api-scheduler/dist._build/features/ListScheduledActions/feature.js.map deleted file mode 100644 index 1e6b8a322c8..00000000000 --- a/packages/api-scheduler/dist._build/features/ListScheduledActions/feature.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"features/ListScheduledActions/feature.js","sources":["../../../src/features/ListScheduledActions/feature.ts"],"sourcesContent":["import { createFeature } from \"@webiny/feature/api\";\nimport { ListScheduledActionsUseCase } from \"./ListScheduledActionsUseCase.js\";\n\n/**\n * ListScheduledActions Feature\n *\n * Provides the ability to list scheduled actions with optional filtering by namespace or actionType.\n * Critical for CMS CRUD views showing all scheduled actions for a content model.\n */\nexport const ListScheduledActionsFeature = createFeature({\n name: \"ListScheduledActions\",\n register(container) {\n container.register(ListScheduledActionsUseCase);\n }\n});\n"],"names":["ListScheduledActionsFeature","createFeature","container","ListScheduledActionsUseCase"],"mappings":";;AASO,MAAMA,8BAA8BC,cAAc;IACrD,MAAM;IACN,UAASC,SAAS;QACdA,UAAU,QAAQ,CAACC;IACvB;AACJ"} \ No newline at end of file diff --git a/packages/api-scheduler/dist._build/features/ListScheduledActions/index.d.ts b/packages/api-scheduler/dist._build/features/ListScheduledActions/index.d.ts deleted file mode 100644 index ea9ebfb8417..00000000000 --- a/packages/api-scheduler/dist._build/features/ListScheduledActions/index.d.ts +++ /dev/null @@ -1 +0,0 @@ -export * from "./abstractions.js"; diff --git a/packages/api-scheduler/dist._build/features/ListScheduledActions/index.js b/packages/api-scheduler/dist._build/features/ListScheduledActions/index.js deleted file mode 100644 index ea9ebfb8417..00000000000 --- a/packages/api-scheduler/dist._build/features/ListScheduledActions/index.js +++ /dev/null @@ -1 +0,0 @@ -export * from "./abstractions.js"; diff --git a/packages/api-scheduler/dist._build/features/NamespaceHandler/NamespaceHandlerExecutioner.d.ts b/packages/api-scheduler/dist._build/features/NamespaceHandler/NamespaceHandlerExecutioner.d.ts deleted file mode 100644 index 7175e3714b0..00000000000 --- a/packages/api-scheduler/dist._build/features/NamespaceHandler/NamespaceHandlerExecutioner.d.ts +++ /dev/null @@ -1,11 +0,0 @@ -import { NamespaceHandler, NamespaceHandlerExecutioner as NamespaceHandlerExecutionerAbstraction } from "./abstractions.js"; -import type { GenericRecord } from "@webiny/api/types.js"; -declare class NamespaceHandlerExecutionerImpl implements NamespaceHandlerExecutionerAbstraction.Interface { - private readonly namespaceHandlers; - constructor(namespaceHandlers: NamespaceHandler.Interface[]); - execute(params: NamespaceHandlerExecutionerAbstraction.Params): NamespaceHandlerExecutionerAbstraction.Response; -} -export declare const NamespaceHandlerExecutioner: typeof NamespaceHandlerExecutionerImpl & { - __abstraction: import("@webiny/di").Abstraction; -}; -export {}; diff --git a/packages/api-scheduler/dist._build/features/NamespaceHandler/NamespaceHandlerExecutioner.js b/packages/api-scheduler/dist._build/features/NamespaceHandler/NamespaceHandlerExecutioner.js deleted file mode 100644 index 984fd32f328..00000000000 --- a/packages/api-scheduler/dist._build/features/NamespaceHandler/NamespaceHandlerExecutioner.js +++ /dev/null @@ -1,26 +0,0 @@ -import { NamespaceHandler, NamespaceHandlerExecutioner } from "./abstractions.js"; -import { Result } from "@webiny/feature/exports/api.js"; -import { NamespaceHandlerNotFoundError } from "../../domain/errors.js"; -class NamespaceHandlerExecutionerImpl { - constructor(namespaceHandlers){ - this.namespaceHandlers = namespaceHandlers; - } - async execute(params) { - for (const handler of this.namespaceHandlers)if (false !== handler.canHandle(params.namespace)) return handler.execute(params); - return Result.fail(new NamespaceHandlerNotFoundError(params.namespace)); - } -} -const NamespaceHandlerExecutioner_NamespaceHandlerExecutioner = NamespaceHandlerExecutioner.createImplementation({ - implementation: NamespaceHandlerExecutionerImpl, - dependencies: [ - [ - NamespaceHandler, - { - multiple: true - } - ] - ] -}); -export { NamespaceHandlerExecutioner_NamespaceHandlerExecutioner as NamespaceHandlerExecutioner }; - -//# sourceMappingURL=NamespaceHandlerExecutioner.js.map \ No newline at end of file diff --git a/packages/api-scheduler/dist._build/features/NamespaceHandler/NamespaceHandlerExecutioner.js.map b/packages/api-scheduler/dist._build/features/NamespaceHandler/NamespaceHandlerExecutioner.js.map deleted file mode 100644 index 4d36a80ea98..00000000000 --- a/packages/api-scheduler/dist._build/features/NamespaceHandler/NamespaceHandlerExecutioner.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"features/NamespaceHandler/NamespaceHandlerExecutioner.js","sources":["../../../src/features/NamespaceHandler/NamespaceHandlerExecutioner.ts"],"sourcesContent":["import {\n NamespaceHandler,\n NamespaceHandlerExecutioner as NamespaceHandlerExecutionerAbstraction\n} from \"./abstractions.js\";\nimport { Result } from \"@webiny/feature/exports/api.js\";\nimport { NamespaceHandlerNotFoundError } from \"~/domain/errors.js\";\nimport type { GenericRecord } from \"@webiny/api/types.js\";\n\nclass NamespaceHandlerExecutionerImpl implements NamespaceHandlerExecutionerAbstraction.Interface {\n public constructor(\n private readonly namespaceHandlers: NamespaceHandler.Interface[]\n ) {}\n\n public async execute(\n params: NamespaceHandlerExecutionerAbstraction.Params\n ): NamespaceHandlerExecutionerAbstraction.Response {\n for (const handler of this.namespaceHandlers) {\n if (handler.canHandle(params.namespace) === false) {\n continue;\n }\n return handler.execute(params);\n }\n\n return Result.fail(new NamespaceHandlerNotFoundError(params.namespace));\n }\n}\n\nexport const NamespaceHandlerExecutioner =\n NamespaceHandlerExecutionerAbstraction.createImplementation({\n implementation: NamespaceHandlerExecutionerImpl,\n dependencies: [\n [\n NamespaceHandler,\n {\n multiple: true\n }\n ]\n ]\n });\n"],"names":["NamespaceHandlerExecutionerImpl","namespaceHandlers","params","handler","Result","NamespaceHandlerNotFoundError","NamespaceHandlerExecutioner","NamespaceHandlerExecutionerAbstraction","NamespaceHandler"],"mappings":";;;AAQA,MAAMA;IACF,YACqBC,iBAA8D,CACjF;aADmBA,iBAAiB,GAAjBA;IAClB;IAEH,MAAa,QACTC,MAAqD,EACN;QAC/C,KAAK,MAAMC,WAAW,IAAI,CAAC,iBAAiB,CACxC,IAAIA,AAAwC,UAAxCA,QAAQ,SAAS,CAACD,OAAO,SAAS,GAGtC,OAAOC,QAAQ,OAAO,CAACD;QAG3B,OAAOE,OAAO,IAAI,CAAC,IAAIC,8BAA8BH,OAAO,SAAS;IACzE;AACJ;AAEO,MAAMI,0DACTC,4BAAAA,oBAA2D,CAAC;IACxD,gBAAgBP;IAChB,cAAc;QACV;YACIQ;YACA;gBACI,UAAU;YACd;SACH;KACJ;AACL"} \ No newline at end of file diff --git a/packages/api-scheduler/dist._build/features/NamespaceHandler/abstractions.d.ts b/packages/api-scheduler/dist._build/features/NamespaceHandler/abstractions.d.ts deleted file mode 100644 index 9638ba9dee8..00000000000 --- a/packages/api-scheduler/dist._build/features/NamespaceHandler/abstractions.d.ts +++ /dev/null @@ -1,50 +0,0 @@ -import { Result } from "@webiny/feature/api"; -import type { GenericRecord } from "@webiny/api/types.js"; -import type { ScheduledActionType } from "~/shared/abstractions.js"; -import { NamespaceHandlerNotFoundError } from "~/domain/errors.js"; -export interface INamespaceHandlerErrors { - notFound: NamespaceHandlerNotFoundError; -} -type NamespaceHandlerError = INamespaceHandlerErrors[keyof INamespaceHandlerErrors]; -/** - * Handling of specific app. - */ -export interface INamespaceHandlerParams { - scheduleId: string; - targetId: string; - actionType: ScheduledActionType; - namespace: string; - immediately: boolean | undefined; - scheduleFor: Date; -} -export type INamespaceHandlerResult = T & { - title: string; - targetId: string; - actionType: ScheduledActionType; - namespace: string; - scheduleId: string; -}; -export interface INamespaceHandler { - canHandle(namespace: string): boolean; - execute(params: INamespaceHandlerParams): Promise, NamespaceHandlerError>>; -} -/** Handle namespace-specific scheduled action logic. */ -export declare const NamespaceHandler: import("@webiny/di").Abstraction>; -export declare namespace NamespaceHandler { - type Interface = INamespaceHandler; - type Response = Promise, NamespaceHandlerError>>; - type Params = INamespaceHandlerParams; -} -/** - * Executioner of the app handlers. - */ -export interface INamespaceHandlerExecutioner { - execute(params: INamespaceHandlerParams): Promise, NamespaceHandlerError>>; -} -export declare const NamespaceHandlerExecutioner: import("@webiny/di").Abstraction; -export declare namespace NamespaceHandlerExecutioner { - type Interface = INamespaceHandlerExecutioner; - type Response = Promise>; - type Params = INamespaceHandlerParams; -} -export {}; diff --git a/packages/api-scheduler/dist._build/features/NamespaceHandler/abstractions.js b/packages/api-scheduler/dist._build/features/NamespaceHandler/abstractions.js deleted file mode 100644 index 036351d0dcb..00000000000 --- a/packages/api-scheduler/dist._build/features/NamespaceHandler/abstractions.js +++ /dev/null @@ -1,6 +0,0 @@ -import { createAbstraction } from "@webiny/feature/api"; -const NamespaceHandler = createAbstraction("Scheduler/NamespaceHandler"); -const NamespaceHandlerExecutioner = createAbstraction("Scheduler/NamespaceHandlerExecutioner"); -export { NamespaceHandler, NamespaceHandlerExecutioner }; - -//# sourceMappingURL=abstractions.js.map \ No newline at end of file diff --git a/packages/api-scheduler/dist._build/features/NamespaceHandler/abstractions.js.map b/packages/api-scheduler/dist._build/features/NamespaceHandler/abstractions.js.map deleted file mode 100644 index d1d15bc6bba..00000000000 --- a/packages/api-scheduler/dist._build/features/NamespaceHandler/abstractions.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"features/NamespaceHandler/abstractions.js","sources":["../../../src/features/NamespaceHandler/abstractions.ts"],"sourcesContent":["import { createAbstraction, Result } from \"@webiny/feature/api\";\nimport type { GenericRecord } from \"@webiny/api/types.js\";\nimport type { ScheduledActionType } from \"~/shared/abstractions.js\";\nimport { NamespaceHandlerNotFoundError } from \"~/domain/errors.js\";\n\nexport interface INamespaceHandlerErrors {\n notFound: NamespaceHandlerNotFoundError;\n}\n\ntype NamespaceHandlerError = INamespaceHandlerErrors[keyof INamespaceHandlerErrors];\n/**\n * Handling of specific app.\n */\nexport interface INamespaceHandlerParams {\n scheduleId: string;\n targetId: string;\n actionType: ScheduledActionType;\n namespace: string;\n immediately: boolean | undefined;\n scheduleFor: Date;\n}\n\nexport type INamespaceHandlerResult = T & {\n title: string;\n targetId: string;\n actionType: ScheduledActionType;\n namespace: string;\n scheduleId: string;\n};\n\nexport interface INamespaceHandler {\n canHandle(namespace: string): boolean;\n execute(\n params: INamespaceHandlerParams\n ): Promise, NamespaceHandlerError>>;\n}\n\n/** Handle namespace-specific scheduled action logic. */\nexport const NamespaceHandler = createAbstraction(\"Scheduler/NamespaceHandler\");\n\nexport namespace NamespaceHandler {\n export type Interface = INamespaceHandler;\n export type Response = Promise<\n Result, NamespaceHandlerError>\n >;\n export type Params = INamespaceHandlerParams;\n}\n\n/**\n * Executioner of the app handlers.\n */\n\nexport interface INamespaceHandlerExecutioner {\n execute(\n params: INamespaceHandlerParams\n ): Promise, NamespaceHandlerError>>;\n}\n\nexport const NamespaceHandlerExecutioner = createAbstraction(\n \"Scheduler/NamespaceHandlerExecutioner\"\n);\n\nexport namespace NamespaceHandlerExecutioner {\n export type Interface = INamespaceHandlerExecutioner;\n export type Response = Promise>;\n export type Params = INamespaceHandlerParams;\n}\n"],"names":["NamespaceHandler","createAbstraction","NamespaceHandlerExecutioner"],"mappings":";AAsCO,MAAMA,mBAAmBC,kBAAqC;AAoB9D,MAAMC,8BAA8BD,kBACvC"} \ No newline at end of file diff --git a/packages/api-scheduler/dist._build/features/NamespaceHandler/feature.d.ts b/packages/api-scheduler/dist._build/features/NamespaceHandler/feature.d.ts deleted file mode 100644 index 1c4d953105a..00000000000 --- a/packages/api-scheduler/dist._build/features/NamespaceHandler/feature.d.ts +++ /dev/null @@ -1,4 +0,0 @@ -export declare const NamespaceHandlerExecutionerFeature: { - name: string; - register(container: import("@webiny/di").Container): void; -}; diff --git a/packages/api-scheduler/dist._build/features/NamespaceHandler/feature.js b/packages/api-scheduler/dist._build/features/NamespaceHandler/feature.js deleted file mode 100644 index 18bc1d485fb..00000000000 --- a/packages/api-scheduler/dist._build/features/NamespaceHandler/feature.js +++ /dev/null @@ -1,11 +0,0 @@ -import { createFeature } from "@webiny/feature/api"; -import { NamespaceHandlerExecutioner } from "./NamespaceHandlerExecutioner.js"; -const NamespaceHandlerExecutionerFeature = createFeature({ - name: "NamespaceHandlerExecutioner", - register (container) { - container.register(NamespaceHandlerExecutioner); - } -}); -export { NamespaceHandlerExecutionerFeature }; - -//# sourceMappingURL=feature.js.map \ No newline at end of file diff --git a/packages/api-scheduler/dist._build/features/NamespaceHandler/feature.js.map b/packages/api-scheduler/dist._build/features/NamespaceHandler/feature.js.map deleted file mode 100644 index 5414684f498..00000000000 --- a/packages/api-scheduler/dist._build/features/NamespaceHandler/feature.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"features/NamespaceHandler/feature.js","sources":["../../../src/features/NamespaceHandler/feature.ts"],"sourcesContent":["import { createFeature } from \"@webiny/feature/api\";\nimport { NamespaceHandlerExecutioner } from \"./NamespaceHandlerExecutioner.js\";\n\nexport const NamespaceHandlerExecutionerFeature = createFeature({\n name: \"NamespaceHandlerExecutioner\",\n register(container) {\n container.register(NamespaceHandlerExecutioner);\n }\n});\n"],"names":["NamespaceHandlerExecutionerFeature","createFeature","container","NamespaceHandlerExecutioner"],"mappings":";;AAGO,MAAMA,qCAAqCC,cAAc;IAC5D,MAAM;IACN,UAASC,SAAS;QACdA,UAAU,QAAQ,CAACC;IACvB;AACJ"} \ No newline at end of file diff --git a/packages/api-scheduler/dist._build/features/NamespaceHandler/index.d.ts b/packages/api-scheduler/dist._build/features/NamespaceHandler/index.d.ts deleted file mode 100644 index 0f250e43dea..00000000000 --- a/packages/api-scheduler/dist._build/features/NamespaceHandler/index.d.ts +++ /dev/null @@ -1 +0,0 @@ -export { NamespaceHandler } from "./abstractions.js"; diff --git a/packages/api-scheduler/dist._build/features/NamespaceHandler/index.js b/packages/api-scheduler/dist._build/features/NamespaceHandler/index.js deleted file mode 100644 index 0f250e43dea..00000000000 --- a/packages/api-scheduler/dist._build/features/NamespaceHandler/index.js +++ /dev/null @@ -1 +0,0 @@ -export { NamespaceHandler } from "./abstractions.js"; diff --git a/packages/api-scheduler/dist._build/features/ScheduleAction/ScheduleActionUseCase.d.ts b/packages/api-scheduler/dist._build/features/ScheduleAction/ScheduleActionUseCase.d.ts deleted file mode 100644 index 7a64500745f..00000000000 --- a/packages/api-scheduler/dist._build/features/ScheduleAction/ScheduleActionUseCase.d.ts +++ /dev/null @@ -1,45 +0,0 @@ -import { Result } from "@webiny/feature/api"; -import { IdentityContext } from "@webiny/api-core/features/security/IdentityContext/index.js"; -import { CreateEntryUseCase } from "@webiny/api-headless-cms/features/contentEntry/CreateEntry/index.js"; -import { UpdateEntryUseCase } from "@webiny/api-headless-cms/features/contentEntry/UpdateEntry/index.js"; -import { DeleteEntryUseCase } from "@webiny/api-headless-cms/features/contentEntry/DeleteEntry/index.js"; -import { ScheduleActionUseCase as UseCaseAbstraction } from "./abstractions.js"; -import { GetScheduledActionUseCase } from "~/features/GetScheduledAction/abstractions.js"; -import type { IScheduledAction } from "~/shared/abstractions.js"; -import { ScheduledActionModel, SchedulerService } from "~/shared/abstractions.js"; -import type { GenericRecord } from "@webiny/api/types.js"; -import { NamespaceHandlerExecutioner } from "~/features/NamespaceHandler/abstractions.js"; -/** - * Schedules an action for future execution - * - * Flow: - * 1. Generate unique schedule ID from namespace+actionType+targetId - * 2. Check if schedule already exists (for rescheduling logic) - * 3. If exists: UPDATE schedule entry + EventBridge schedule - * 4. If new: CREATE schedule entry + EventBridge schedule - * 5. Rollback schedule entry if EventBridge fails - */ -declare class ScheduleActionUseCaseImpl implements UseCaseAbstraction.Interface { - private identityContext; - private model; - private schedulerService; - private getScheduledAction; - private createEntryUseCase; - private updateEntryUseCase; - private deleteEntryUseCase; - private namespaceHandlerExecutioner; - constructor(identityContext: IdentityContext.Interface, model: ScheduledActionModel.Interface, schedulerService: SchedulerService.Interface, getScheduledAction: GetScheduledActionUseCase.Interface, createEntryUseCase: CreateEntryUseCase.Interface, updateEntryUseCase: UpdateEntryUseCase.Interface, deleteEntryUseCase: DeleteEntryUseCase.Interface, namespaceHandlerExecutioner: NamespaceHandlerExecutioner.Interface); - execute(params: UseCaseAbstraction.Params): Promise, UseCaseAbstraction.Error>>; - /** - * Creates a new schedule - */ - private createSchedule; - /** - * Updates an existing schedule (reschedule) - */ - private reschedule; -} -export declare const ScheduleActionUseCase: typeof ScheduleActionUseCaseImpl & { - __abstraction: import("@webiny/di").Abstraction; -}; -export {}; diff --git a/packages/api-scheduler/dist._build/features/ScheduleAction/ScheduleActionUseCase.js b/packages/api-scheduler/dist._build/features/ScheduleAction/ScheduleActionUseCase.js deleted file mode 100644 index 7692dfaf398..00000000000 --- a/packages/api-scheduler/dist._build/features/ScheduleAction/ScheduleActionUseCase.js +++ /dev/null @@ -1,171 +0,0 @@ -import { Result } from "@webiny/feature/api"; -import { IdentityContext } from "@webiny/api-core/features/security/IdentityContext/index.js"; -import { CreateEntryUseCase } from "@webiny/api-headless-cms/features/contentEntry/CreateEntry/index.js"; -import { UpdateEntryUseCase } from "@webiny/api-headless-cms/features/contentEntry/UpdateEntry/index.js"; -import { DeleteEntryUseCase } from "@webiny/api-headless-cms/features/contentEntry/DeleteEntry/index.js"; -import { parseIdentifier } from "@webiny/utils"; -import { ScheduleActionUseCase } from "./abstractions.js"; -import { GetScheduledActionUseCase } from "../GetScheduledAction/abstractions.js"; -import { ScheduledActionModel, SchedulerService } from "../../shared/abstractions.js"; -import { InvalidScheduleDateError, ScheduledActionPersistenceError, SchedulerServiceError } from "../../domain/errors.js"; -import { ScheduledActionId } from "../../domain/ScheduledActionId.js"; -import { ScheduledActionIdWithVersion } from "../../domain/ScheduledActionIdWithVersion.js"; -import { isValidDate } from "../../domain/isValidDate.js"; -import { NamespaceHandlerExecutioner } from "../NamespaceHandler/abstractions.js"; -class ScheduleActionUseCaseImpl { - constructor(identityContext, model, schedulerService, getScheduledAction, createEntryUseCase, updateEntryUseCase, deleteEntryUseCase, namespaceHandlerExecutioner){ - this.identityContext = identityContext; - this.model = model; - this.schedulerService = schedulerService; - this.getScheduledAction = getScheduledAction; - this.createEntryUseCase = createEntryUseCase; - this.updateEntryUseCase = updateEntryUseCase; - this.deleteEntryUseCase = deleteEntryUseCase; - this.namespaceHandlerExecutioner = namespaceHandlerExecutioner; - } - async execute(params) { - const identity = this.identityContext.getIdentity(); - let scheduleFor = params.scheduleFor; - if (!params.immediately && !isValidDate(scheduleFor)) return Result.fail(new InvalidScheduleDateError(scheduleFor)); - if (params.immediately) scheduleFor = new Date(Date.now() + 90000); - const actionId = ScheduledActionId.from({ - namespace: params.namespace, - targetId: params.targetId, - actionType: params.actionType - }); - const scheduleId = ScheduledActionIdWithVersion.from(actionId); - const existingResult = await this.getScheduledAction.execute({ - namespace: params.namespace, - id: scheduleId - }); - const namespaceHandlerResult = await this.namespaceHandlerExecutioner.execute({ - scheduleId: actionId, - immediately: params.immediately, - scheduleFor, - targetId: params.targetId, - actionType: params.actionType, - namespace: params.namespace - }); - if (namespaceHandlerResult.isFail()) return Result.fail(namespaceHandlerResult.error); - const payload = namespaceHandlerResult.value; - if (existingResult.isFail()) { - const error = existingResult.error; - if ("Scheduler/ScheduledAction/NotFound" === error.code) return this.createSchedule({ - scheduleId, - title: payload.title, - namespace: params.namespace, - actionType: params.actionType, - targetId: params.targetId, - scheduleFor, - identity, - payload - }); - if ("Scheduler/ScheduledAction/PersistenceError" === error.code) return Result.fail(error); - } - const scheduledAction = existingResult.value; - return this.reschedule(scheduledAction, params.scheduleFor, identity, payload); - } - async createSchedule(params) { - const { scheduleId: initialId, identity, payload, scheduleFor, actionType, targetId, title, namespace } = params; - const { id: scheduleId } = parseIdentifier(initialId); - const scheduledBy = { - id: identity.id, - type: identity.type, - displayName: identity.displayName - }; - const createResult = await this.createEntryUseCase.execute(this.model, { - id: scheduleId, - values: { - scheduledFor: scheduleFor.toISOString(), - scheduledBy, - namespace, - title, - actionType, - targetId, - payload, - error: void 0 - } - }); - if (createResult.isFail()) return Result.fail(new ScheduledActionPersistenceError(new Error(createResult.error.message))); - const scheduledAction = { - id: scheduleId, - tenant: createResult.value.tenant, - title, - namespace, - actionType, - targetId, - scheduledBy, - scheduledFor: scheduleFor, - payload, - error: void 0 - }; - try { - await this.schedulerService.create({ - id: scheduleId, - tenant: createResult.value.tenant, - namespace, - scheduleFor: new Date(scheduleFor) - }); - } catch (error) { - console.error(`Failed to create EventBridge schedule: ${scheduleId}. Rolling back...`); - await this.deleteEntryUseCase.execute(this.model, scheduleId, { - force: true, - permanently: true - }); - return Result.fail(new SchedulerServiceError(error)); - } - return Result.ok(scheduledAction); - } - async reschedule(existing, scheduleFor, identity, payload) { - if (!payload) payload = existing.payload; - const existingEntryId = ScheduledActionIdWithVersion.from(existing.id); - const updateResult = await this.updateEntryUseCase.execute(this.model, existingEntryId, { - values: { - scheduledBy: { - id: identity.id, - type: identity.type, - displayName: identity.displayName - }, - scheduledFor: scheduleFor.toISOString(), - payload - } - }); - if (updateResult.isFail()) return Result.fail(new ScheduledActionPersistenceError(new Error(updateResult.error.message))); - try { - await this.schedulerService.update({ - id: existing.id, - tenant: existing.tenant, - namespace: existing.namespace, - scheduleFor: new Date(scheduleFor) - }); - } catch (error) { - return Result.fail(new SchedulerServiceError(error)); - } - return Result.ok({ - ...existing, - scheduledBy: { - id: identity.id, - type: identity.type, - displayName: identity.displayName - }, - scheduledFor: scheduleFor, - payload - }); - } -} -const ScheduleActionUseCase_ScheduleActionUseCase = ScheduleActionUseCase.createImplementation({ - implementation: ScheduleActionUseCaseImpl, - dependencies: [ - IdentityContext, - ScheduledActionModel, - SchedulerService, - GetScheduledActionUseCase, - CreateEntryUseCase, - UpdateEntryUseCase, - DeleteEntryUseCase, - NamespaceHandlerExecutioner - ] -}); -export { ScheduleActionUseCase_ScheduleActionUseCase as ScheduleActionUseCase }; - -//# sourceMappingURL=ScheduleActionUseCase.js.map \ No newline at end of file diff --git a/packages/api-scheduler/dist._build/features/ScheduleAction/ScheduleActionUseCase.js.map b/packages/api-scheduler/dist._build/features/ScheduleAction/ScheduleActionUseCase.js.map deleted file mode 100644 index 6fa8b312924..00000000000 --- a/packages/api-scheduler/dist._build/features/ScheduleAction/ScheduleActionUseCase.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"features/ScheduleAction/ScheduleActionUseCase.js","sources":["../../../src/features/ScheduleAction/ScheduleActionUseCase.ts"],"sourcesContent":["import { Result } from \"@webiny/feature/api\";\nimport { IdentityContext } from \"@webiny/api-core/features/security/IdentityContext/index.js\";\nimport { CreateEntryUseCase } from \"@webiny/api-headless-cms/features/contentEntry/CreateEntry/index.js\";\nimport { UpdateEntryUseCase } from \"@webiny/api-headless-cms/features/contentEntry/UpdateEntry/index.js\";\nimport { DeleteEntryUseCase } from \"@webiny/api-headless-cms/features/contentEntry/DeleteEntry/index.js\";\nimport { parseIdentifier } from \"@webiny/utils\";\nimport { ScheduleActionUseCase as UseCaseAbstraction } from \"./abstractions.js\";\nimport { GetScheduledActionUseCase } from \"~/features/GetScheduledAction/abstractions.js\";\nimport type {\n Identity,\n IScheduledAction,\n IScheduledActionEntryValues,\n ScheduledActionType\n} from \"~/shared/abstractions.js\";\nimport { ScheduledActionModel, SchedulerService } from \"~/shared/abstractions.js\";\nimport {\n InvalidScheduleDateError,\n ScheduledActionPersistenceError,\n SchedulerServiceError\n} from \"~/domain/errors.js\";\nimport { ScheduledActionId } from \"~/domain/ScheduledActionId.js\";\nimport { ScheduledActionIdWithVersion } from \"~/domain/ScheduledActionIdWithVersion.js\";\nimport { isValidDate } from \"~/domain/isValidDate.js\";\nimport type { GenericRecord } from \"@webiny/api/types.js\";\nimport { NamespaceHandlerExecutioner } from \"~/features/NamespaceHandler/abstractions.js\";\n\ninterface ICreateScheduleParams {\n scheduleId: string;\n title: string;\n namespace: string;\n actionType: ScheduledActionType;\n targetId: string;\n scheduleFor: Date;\n identity: Identity;\n payload: T;\n}\n/**\n * Schedules an action for future execution\n *\n * Flow:\n * 1. Generate unique schedule ID from namespace+actionType+targetId\n * 2. Check if schedule already exists (for rescheduling logic)\n * 3. If exists: UPDATE schedule entry + EventBridge schedule\n * 4. If new: CREATE schedule entry + EventBridge schedule\n * 5. Rollback schedule entry if EventBridge fails\n */\nclass ScheduleActionUseCaseImpl implements UseCaseAbstraction.Interface {\n constructor(\n private identityContext: IdentityContext.Interface,\n private model: ScheduledActionModel.Interface,\n private schedulerService: SchedulerService.Interface,\n private getScheduledAction: GetScheduledActionUseCase.Interface,\n private createEntryUseCase: CreateEntryUseCase.Interface,\n private updateEntryUseCase: UpdateEntryUseCase.Interface,\n private deleteEntryUseCase: DeleteEntryUseCase.Interface,\n private namespaceHandlerExecutioner: NamespaceHandlerExecutioner.Interface\n ) {}\n\n async execute(\n params: UseCaseAbstraction.Params\n ): Promise, UseCaseAbstraction.Error>> {\n const identity = this.identityContext.getIdentity();\n\n let scheduleFor = params.scheduleFor;\n /**\n * Immediately - publish in past\n */\n if (!params.immediately && !isValidDate(scheduleFor)) {\n return Result.fail(new InvalidScheduleDateError(scheduleFor));\n } else if (params.immediately) {\n // If the action should be executed immediately, we set the scheduleFor to the current date.\n // Calculate the soonest possible execution time.\n // Add at least 90 seconds of buffer to ensure EventBridge can process the schedule.\n scheduleFor = new Date(Date.now() + 90000);\n }\n\n // Generate unique schedule ID\n const actionId = ScheduledActionId.from({\n namespace: params.namespace,\n targetId: params.targetId,\n actionType: params.actionType\n });\n const scheduleId = ScheduledActionIdWithVersion.from(actionId);\n\n const existingResult = await this.getScheduledAction.execute({\n namespace: params.namespace,\n id: scheduleId\n });\n\n const namespaceHandlerResult = await this.namespaceHandlerExecutioner.execute({\n scheduleId: actionId,\n immediately: params.immediately,\n scheduleFor,\n targetId: params.targetId,\n actionType: params.actionType,\n namespace: params.namespace\n });\n\n if (namespaceHandlerResult.isFail()) {\n return Result.fail(namespaceHandlerResult.error);\n }\n const payload = namespaceHandlerResult.value;\n\n if (existingResult.isFail()) {\n const error = existingResult.error;\n\n // NotFound means the action was not yet scheduled\n if (error.code === \"Scheduler/ScheduledAction/NotFound\") {\n return this.createSchedule({\n scheduleId,\n title: payload.title,\n namespace: params.namespace,\n actionType: params.actionType,\n targetId: params.targetId,\n scheduleFor,\n identity,\n payload\n });\n }\n\n if (error.code === \"Scheduler/ScheduledAction/PersistenceError\") {\n return Result.fail(error);\n }\n }\n\n // Reschedule existing action\n const scheduledAction = existingResult.value;\n\n return this.reschedule(scheduledAction, params.scheduleFor, identity, payload);\n }\n\n /**\n * Creates a new schedule\n */\n private async createSchedule(\n params: ICreateScheduleParams\n ): Promise, UseCaseAbstraction.Error>> {\n const {\n scheduleId: initialId,\n identity,\n payload,\n scheduleFor,\n actionType,\n targetId,\n title,\n namespace\n } = params;\n const { id: scheduleId } = parseIdentifier(initialId);\n\n const scheduledBy: Identity = {\n id: identity.id,\n type: identity.type,\n displayName: identity.displayName\n };\n\n // Create CMS entry\n const createResult = await this.createEntryUseCase.execute>(\n this.model,\n {\n id: scheduleId,\n values: {\n scheduledFor: scheduleFor.toISOString(),\n scheduledBy,\n namespace,\n title,\n actionType,\n targetId,\n payload,\n error: undefined\n }\n }\n );\n\n if (createResult.isFail()) {\n return Result.fail(\n new ScheduledActionPersistenceError(new Error(createResult.error.message))\n );\n }\n\n const scheduledAction: IScheduledAction = {\n id: scheduleId,\n tenant: createResult.value.tenant,\n title,\n namespace,\n actionType,\n targetId,\n scheduledBy,\n scheduledFor: scheduleFor,\n payload,\n error: undefined\n };\n\n // Create EventBridge schedule\n try {\n await this.schedulerService.create({\n id: scheduleId,\n tenant: createResult.value.tenant,\n namespace,\n scheduleFor: new Date(scheduleFor)\n });\n } catch (error) {\n // Rollback - delete CMS entry if EventBridge fails\n console.error(`Failed to create EventBridge schedule: ${scheduleId}. Rolling back...`);\n\n await this.deleteEntryUseCase.execute(this.model, scheduleId, {\n force: true,\n permanently: true\n });\n\n return Result.fail(new SchedulerServiceError(error as Error));\n }\n\n return Result.ok(scheduledAction);\n }\n\n /**\n * Updates an existing schedule (reschedule)\n */\n private async reschedule(\n existing: IScheduledAction,\n scheduleFor: Date,\n identity: Identity,\n payload?: T\n ): Promise, UseCaseAbstraction.Error>> {\n // Make sure we don't unset the existing payload.\n if (!payload) {\n payload = existing.payload as T;\n }\n\n // Update CMS entry\n const existingEntryId = ScheduledActionIdWithVersion.from(existing.id);\n const updateResult = await this.updateEntryUseCase.execute>(\n this.model,\n existingEntryId,\n {\n values: {\n scheduledBy: {\n id: identity.id,\n type: identity.type,\n displayName: identity.displayName\n },\n scheduledFor: scheduleFor.toISOString(),\n payload\n }\n }\n );\n\n if (updateResult.isFail()) {\n return Result.fail(\n new ScheduledActionPersistenceError(new Error(updateResult.error.message))\n );\n }\n\n // Update EventBridge schedule\n try {\n await this.schedulerService.update({\n id: existing.id,\n tenant: existing.tenant,\n namespace: existing.namespace,\n scheduleFor: new Date(scheduleFor)\n });\n } catch (error) {\n return Result.fail(new SchedulerServiceError(error as Error));\n }\n\n return Result.ok({\n ...existing,\n scheduledBy: {\n id: identity.id,\n type: identity.type,\n displayName: identity.displayName\n },\n scheduledFor: scheduleFor,\n payload\n });\n }\n}\n\nexport const ScheduleActionUseCase = UseCaseAbstraction.createImplementation({\n implementation: ScheduleActionUseCaseImpl,\n dependencies: [\n IdentityContext,\n ScheduledActionModel,\n SchedulerService,\n GetScheduledActionUseCase,\n CreateEntryUseCase,\n UpdateEntryUseCase,\n DeleteEntryUseCase,\n NamespaceHandlerExecutioner\n ]\n});\n"],"names":["ScheduleActionUseCaseImpl","identityContext","model","schedulerService","getScheduledAction","createEntryUseCase","updateEntryUseCase","deleteEntryUseCase","namespaceHandlerExecutioner","params","identity","scheduleFor","isValidDate","Result","InvalidScheduleDateError","Date","actionId","ScheduledActionId","scheduleId","ScheduledActionIdWithVersion","existingResult","namespaceHandlerResult","payload","error","scheduledAction","initialId","actionType","targetId","title","namespace","parseIdentifier","scheduledBy","createResult","undefined","ScheduledActionPersistenceError","Error","console","SchedulerServiceError","existing","existingEntryId","updateResult","ScheduleActionUseCase","UseCaseAbstraction","IdentityContext","ScheduledActionModel","SchedulerService","GetScheduledActionUseCase","CreateEntryUseCase","UpdateEntryUseCase","DeleteEntryUseCase","NamespaceHandlerExecutioner"],"mappings":";;;;;;;;;;;;;;AA8CA,MAAMA;IACF,YACYC,eAA0C,EAC1CC,KAAqC,EACrCC,gBAA4C,EAC5CC,kBAAuD,EACvDC,kBAAgD,EAChDC,kBAAgD,EAChDC,kBAAgD,EAChDC,2BAAkE,CAC5E;aARUP,eAAe,GAAfA;aACAC,KAAK,GAALA;aACAC,gBAAgB,GAAhBA;aACAC,kBAAkB,GAAlBA;aACAC,kBAAkB,GAAlBA;aACAC,kBAAkB,GAAlBA;aACAC,kBAAkB,GAAlBA;aACAC,2BAA2B,GAA3BA;IACT;IAEH,MAAM,QACFC,MAAiC,EAC6B;QAC9D,MAAMC,WAAW,IAAI,CAAC,eAAe,CAAC,WAAW;QAEjD,IAAIC,cAAcF,OAAO,WAAW;QAIpC,IAAI,CAACA,OAAO,WAAW,IAAI,CAACG,YAAYD,cACpC,OAAOE,OAAO,IAAI,CAAC,IAAIC,yBAAyBH;QAC7C,IAAIF,OAAO,WAAW,EAIzBE,cAAc,IAAII,KAAKA,KAAK,GAAG,KAAK;QAIxC,MAAMC,WAAWC,kBAAkB,IAAI,CAAC;YACpC,WAAWR,OAAO,SAAS;YAC3B,UAAUA,OAAO,QAAQ;YACzB,YAAYA,OAAO,UAAU;QACjC;QACA,MAAMS,aAAaC,6BAA6B,IAAI,CAACH;QAErD,MAAMI,iBAAiB,MAAM,IAAI,CAAC,kBAAkB,CAAC,OAAO,CAAC;YACzD,WAAWX,OAAO,SAAS;YAC3B,IAAIS;QACR;QAEA,MAAMG,yBAAyB,MAAM,IAAI,CAAC,2BAA2B,CAAC,OAAO,CAAI;YAC7E,YAAYL;YACZ,aAAaP,OAAO,WAAW;YAC/BE;YACA,UAAUF,OAAO,QAAQ;YACzB,YAAYA,OAAO,UAAU;YAC7B,WAAWA,OAAO,SAAS;QAC/B;QAEA,IAAIY,uBAAuB,MAAM,IAC7B,OAAOR,OAAO,IAAI,CAACQ,uBAAuB,KAAK;QAEnD,MAAMC,UAAUD,uBAAuB,KAAK;QAE5C,IAAID,eAAe,MAAM,IAAI;YACzB,MAAMG,QAAQH,eAAe,KAAK;YAGlC,IAAIG,AAAe,yCAAfA,MAAM,IAAI,EACV,OAAO,IAAI,CAAC,cAAc,CAAI;gBAC1BL;gBACA,OAAOI,QAAQ,KAAK;gBACpB,WAAWb,OAAO,SAAS;gBAC3B,YAAYA,OAAO,UAAU;gBAC7B,UAAUA,OAAO,QAAQ;gBACzBE;gBACAD;gBACAY;YACJ;YAGJ,IAAIC,AAAe,iDAAfA,MAAM,IAAI,EACV,OAAOV,OAAO,IAAI,CAACU;QAE3B;QAGA,MAAMC,kBAAkBJ,eAAe,KAAK;QAE5C,OAAO,IAAI,CAAC,UAAU,CAAII,iBAAiBf,OAAO,WAAW,EAAEC,UAAUY;IAC7E;IAKA,MAAc,eACVb,MAAgC,EAC8B;QAC9D,MAAM,EACF,YAAYgB,SAAS,EACrBf,QAAQ,EACRY,OAAO,EACPX,WAAW,EACXe,UAAU,EACVC,QAAQ,EACRC,KAAK,EACLC,SAAS,EACZ,GAAGpB;QACJ,MAAM,EAAE,IAAIS,UAAU,EAAE,GAAGY,gBAAgBL;QAE3C,MAAMM,cAAwB;YAC1B,IAAIrB,SAAS,EAAE;YACf,MAAMA,SAAS,IAAI;YACnB,aAAaA,SAAS,WAAW;QACrC;QAGA,MAAMsB,eAAe,MAAM,IAAI,CAAC,kBAAkB,CAAC,OAAO,CACtD,IAAI,CAAC,KAAK,EACV;YACI,IAAId;YACJ,QAAQ;gBACJ,cAAcP,YAAY,WAAW;gBACrCoB;gBACAF;gBACAD;gBACAF;gBACAC;gBACAL;gBACA,OAAOW;YACX;QACJ;QAGJ,IAAID,aAAa,MAAM,IACnB,OAAOnB,OAAO,IAAI,CACd,IAAIqB,gCAAgC,IAAIC,MAAMH,aAAa,KAAK,CAAC,OAAO;QAIhF,MAAMR,kBAAuC;YACzC,IAAIN;YACJ,QAAQc,aAAa,KAAK,CAAC,MAAM;YACjCJ;YACAC;YACAH;YACAC;YACAI;YACA,cAAcpB;YACdW;YACA,OAAOW;QACX;QAGA,IAAI;YACA,MAAM,IAAI,CAAC,gBAAgB,CAAC,MAAM,CAAC;gBAC/B,IAAIf;gBACJ,QAAQc,aAAa,KAAK,CAAC,MAAM;gBACjCH;gBACA,aAAa,IAAId,KAAKJ;YAC1B;QACJ,EAAE,OAAOY,OAAO;YAEZa,QAAQ,KAAK,CAAC,CAAC,uCAAuC,EAAElB,WAAW,iBAAiB,CAAC;YAErF,MAAM,IAAI,CAAC,kBAAkB,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,EAAEA,YAAY;gBAC1D,OAAO;gBACP,aAAa;YACjB;YAEA,OAAOL,OAAO,IAAI,CAAC,IAAIwB,sBAAsBd;QACjD;QAEA,OAAOV,OAAO,EAAE,CAACW;IACrB;IAKA,MAAc,WACVc,QAA6B,EAC7B3B,WAAiB,EACjBD,QAAkB,EAClBY,OAAW,EACmD;QAE9D,IAAI,CAACA,SACDA,UAAUgB,SAAS,OAAO;QAI9B,MAAMC,kBAAkBpB,6BAA6B,IAAI,CAACmB,SAAS,EAAE;QACrE,MAAME,eAAe,MAAM,IAAI,CAAC,kBAAkB,CAAC,OAAO,CACtD,IAAI,CAAC,KAAK,EACVD,iBACA;YACI,QAAQ;gBACJ,aAAa;oBACT,IAAI7B,SAAS,EAAE;oBACf,MAAMA,SAAS,IAAI;oBACnB,aAAaA,SAAS,WAAW;gBACrC;gBACA,cAAcC,YAAY,WAAW;gBACrCW;YACJ;QACJ;QAGJ,IAAIkB,aAAa,MAAM,IACnB,OAAO3B,OAAO,IAAI,CACd,IAAIqB,gCAAgC,IAAIC,MAAMK,aAAa,KAAK,CAAC,OAAO;QAKhF,IAAI;YACA,MAAM,IAAI,CAAC,gBAAgB,CAAC,MAAM,CAAC;gBAC/B,IAAIF,SAAS,EAAE;gBACf,QAAQA,SAAS,MAAM;gBACvB,WAAWA,SAAS,SAAS;gBAC7B,aAAa,IAAIvB,KAAKJ;YAC1B;QACJ,EAAE,OAAOY,OAAO;YACZ,OAAOV,OAAO,IAAI,CAAC,IAAIwB,sBAAsBd;QACjD;QAEA,OAAOV,OAAO,EAAE,CAAC;YACb,GAAGyB,QAAQ;YACX,aAAa;gBACT,IAAI5B,SAAS,EAAE;gBACf,MAAMA,SAAS,IAAI;gBACnB,aAAaA,SAAS,WAAW;YACrC;YACA,cAAcC;YACdW;QACJ;IACJ;AACJ;AAEO,MAAMmB,8CAAwBC,sBAAAA,oBAAuC,CAAC;IACzE,gBAAgB1C;IAChB,cAAc;QACV2C;QACAC;QACAC;QACAC;QACAC;QACAC;QACAC;QACAC;KACH;AACL"} \ No newline at end of file diff --git a/packages/api-scheduler/dist._build/features/ScheduleAction/abstractions.d.ts b/packages/api-scheduler/dist._build/features/ScheduleAction/abstractions.d.ts deleted file mode 100644 index 7d6024971e3..00000000000 --- a/packages/api-scheduler/dist._build/features/ScheduleAction/abstractions.d.ts +++ /dev/null @@ -1,36 +0,0 @@ -import { Result } from "@webiny/feature/api"; -import type { IScheduledAction, ScheduledActionType } from "~/shared/abstractions.js"; -import { InvalidScheduleDateError, ScheduledActionPersistenceError, SchedulerServiceError, NamespaceHandlerNotFoundError } from "~/domain/errors.js"; -import type { GenericRecord } from "@webiny/api/types.js"; -/** - * ScheduleActionUseCase - Schedule an action for future execution - * - * Handles both new schedules and rescheduling (update) automatically: - * - If no schedule exists for the namespace+actionType+targetId combination: creates new schedule - * - If schedule already exists: updates the existing schedule (reschedule) - */ -export interface IScheduleActionErrors { - namespaceHandlerNotFound: NamespaceHandlerNotFoundError; - persistence: ScheduledActionPersistenceError; - invalidDate: InvalidScheduleDateError; - schedulerService: SchedulerServiceError; -} -export type ScheduleActionError = IScheduleActionErrors[keyof IScheduleActionErrors]; -export interface IScheduleActionParams { - tenant: string; - namespace: string; - targetId: string; - actionType: ScheduledActionType; - scheduleFor: Date; - immediately?: boolean; -} -export interface IScheduleActionUseCase { - execute(params: IScheduleActionParams): Promise, ScheduleActionError>>; -} -/** Schedule an action for future execution. */ -export declare const ScheduleActionUseCase: import("@webiny/di").Abstraction; -export declare namespace ScheduleActionUseCase { - type Interface = IScheduleActionUseCase; - type Params = IScheduleActionParams; - type Error = ScheduleActionError; -} diff --git a/packages/api-scheduler/dist._build/features/ScheduleAction/abstractions.js b/packages/api-scheduler/dist._build/features/ScheduleAction/abstractions.js deleted file mode 100644 index a43ce4d8a7a..00000000000 --- a/packages/api-scheduler/dist._build/features/ScheduleAction/abstractions.js +++ /dev/null @@ -1,5 +0,0 @@ -import { createAbstraction } from "@webiny/feature/api"; -const ScheduleActionUseCase = createAbstraction("Scheduler/ScheduleActionUseCase"); -export { ScheduleActionUseCase }; - -//# sourceMappingURL=abstractions.js.map \ No newline at end of file diff --git a/packages/api-scheduler/dist._build/features/ScheduleAction/abstractions.js.map b/packages/api-scheduler/dist._build/features/ScheduleAction/abstractions.js.map deleted file mode 100644 index b446b500927..00000000000 --- a/packages/api-scheduler/dist._build/features/ScheduleAction/abstractions.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"features/ScheduleAction/abstractions.js","sources":["../../../src/features/ScheduleAction/abstractions.ts"],"sourcesContent":["import { createAbstraction, Result } from \"@webiny/feature/api\";\nimport type { IScheduledAction, ScheduledActionType } from \"~/shared/abstractions.js\";\nimport {\n InvalidScheduleDateError,\n ScheduledActionPersistenceError,\n SchedulerServiceError,\n NamespaceHandlerNotFoundError\n} from \"~/domain/errors.js\";\nimport type { GenericRecord } from \"@webiny/api/types.js\";\n\n/**\n * ScheduleActionUseCase - Schedule an action for future execution\n *\n * Handles both new schedules and rescheduling (update) automatically:\n * - If no schedule exists for the namespace+actionType+targetId combination: creates new schedule\n * - If schedule already exists: updates the existing schedule (reschedule)\n */\n\nexport interface IScheduleActionErrors {\n namespaceHandlerNotFound: NamespaceHandlerNotFoundError;\n persistence: ScheduledActionPersistenceError;\n invalidDate: InvalidScheduleDateError;\n schedulerService: SchedulerServiceError;\n}\n\nexport type ScheduleActionError = IScheduleActionErrors[keyof IScheduleActionErrors];\n\nexport interface IScheduleActionParams {\n tenant: string;\n namespace: string;\n targetId: string;\n actionType: ScheduledActionType;\n scheduleFor: Date;\n immediately?: boolean;\n}\n\nexport interface IScheduleActionUseCase {\n execute(\n params: IScheduleActionParams\n ): Promise, ScheduleActionError>>;\n}\n\n/** Schedule an action for future execution. */\nexport const ScheduleActionUseCase = createAbstraction(\n \"Scheduler/ScheduleActionUseCase\"\n);\n\nexport namespace ScheduleActionUseCase {\n export type Interface = IScheduleActionUseCase;\n export type Params = IScheduleActionParams;\n export type Error = ScheduleActionError;\n}\n"],"names":["ScheduleActionUseCase","createAbstraction"],"mappings":";AA2CO,MAAMA,wBAAwBC,kBACjC"} \ No newline at end of file diff --git a/packages/api-scheduler/dist._build/features/ScheduleAction/feature.d.ts b/packages/api-scheduler/dist._build/features/ScheduleAction/feature.d.ts deleted file mode 100644 index 9ddd16a51d3..00000000000 --- a/packages/api-scheduler/dist._build/features/ScheduleAction/feature.d.ts +++ /dev/null @@ -1,10 +0,0 @@ -/** - * ScheduleAction Feature - * - * Provides the ability to schedule actions for future execution. - * Handles both creating new schedules and updating existing ones (reschedule). - */ -export declare const ScheduleActionFeature: { - name: string; - register(container: import("@webiny/di").Container): void; -}; diff --git a/packages/api-scheduler/dist._build/features/ScheduleAction/feature.js b/packages/api-scheduler/dist._build/features/ScheduleAction/feature.js deleted file mode 100644 index 2d7e6ede04e..00000000000 --- a/packages/api-scheduler/dist._build/features/ScheduleAction/feature.js +++ /dev/null @@ -1,11 +0,0 @@ -import { createFeature } from "@webiny/feature/api"; -import { ScheduleActionUseCase } from "./ScheduleActionUseCase.js"; -const ScheduleActionFeature = createFeature({ - name: "ScheduleAction", - register (container) { - container.register(ScheduleActionUseCase); - } -}); -export { ScheduleActionFeature }; - -//# sourceMappingURL=feature.js.map \ No newline at end of file diff --git a/packages/api-scheduler/dist._build/features/ScheduleAction/feature.js.map b/packages/api-scheduler/dist._build/features/ScheduleAction/feature.js.map deleted file mode 100644 index fa0a1fbef7c..00000000000 --- a/packages/api-scheduler/dist._build/features/ScheduleAction/feature.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"features/ScheduleAction/feature.js","sources":["../../../src/features/ScheduleAction/feature.ts"],"sourcesContent":["import { createFeature } from \"@webiny/feature/api\";\nimport { ScheduleActionUseCase } from \"./ScheduleActionUseCase.js\";\n\n/**\n * ScheduleAction Feature\n *\n * Provides the ability to schedule actions for future execution.\n * Handles both creating new schedules and updating existing ones (reschedule).\n */\nexport const ScheduleActionFeature = createFeature({\n name: \"ScheduleAction\",\n register(container) {\n container.register(ScheduleActionUseCase);\n }\n});\n"],"names":["ScheduleActionFeature","createFeature","container","ScheduleActionUseCase"],"mappings":";;AASO,MAAMA,wBAAwBC,cAAc;IAC/C,MAAM;IACN,UAASC,SAAS;QACdA,UAAU,QAAQ,CAACC;IACvB;AACJ"} \ No newline at end of file diff --git a/packages/api-scheduler/dist._build/features/ScheduleAction/index.d.ts b/packages/api-scheduler/dist._build/features/ScheduleAction/index.d.ts deleted file mode 100644 index ea9ebfb8417..00000000000 --- a/packages/api-scheduler/dist._build/features/ScheduleAction/index.d.ts +++ /dev/null @@ -1 +0,0 @@ -export * from "./abstractions.js"; diff --git a/packages/api-scheduler/dist._build/features/ScheduleAction/index.js b/packages/api-scheduler/dist._build/features/ScheduleAction/index.js deleted file mode 100644 index ea9ebfb8417..00000000000 --- a/packages/api-scheduler/dist._build/features/ScheduleAction/index.js +++ /dev/null @@ -1 +0,0 @@ -export * from "./abstractions.js"; diff --git a/packages/api-scheduler/dist._build/features/SchedulerFeature.d.ts b/packages/api-scheduler/dist._build/features/SchedulerFeature.d.ts deleted file mode 100644 index 2cf01c2e22f..00000000000 --- a/packages/api-scheduler/dist._build/features/SchedulerFeature.d.ts +++ /dev/null @@ -1,11 +0,0 @@ -/** - * Main Scheduler Feature - * - * Registers all scheduler use cases and the composite handler. - * Individual handler implementations are registered by consumer packages - * (e.g., api-headless-cms-scheduler registers CMS-specific handlers). - */ -export declare const SchedulerFeature: { - name: string; - register(container: import("@webiny/di").Container): void; -}; diff --git a/packages/api-scheduler/dist._build/features/SchedulerFeature.js b/packages/api-scheduler/dist._build/features/SchedulerFeature.js deleted file mode 100644 index 8a15949a8c8..00000000000 --- a/packages/api-scheduler/dist._build/features/SchedulerFeature.js +++ /dev/null @@ -1,21 +0,0 @@ -import { createFeature } from "@webiny/feature/api"; -import { ScheduleActionFeature } from "./ScheduleAction/feature.js"; -import { GetScheduledActionFeature } from "./GetScheduledAction/feature.js"; -import { GetTargetScheduledActionFeature } from "./GetTargetScheduledAction/feature.js"; -import { ListScheduledActionsFeature } from "./ListScheduledActions/feature.js"; -import { CancelScheduledActionFeature } from "./CancelScheduledAction/feature.js"; -import { ExecuteScheduledActionFeature } from "./ExecuteScheduledAction/feature.js"; -const SchedulerFeature = createFeature({ - name: "Scheduler", - register (container) { - ScheduleActionFeature.register(container); - GetScheduledActionFeature.register(container); - GetTargetScheduledActionFeature.register(container); - ListScheduledActionsFeature.register(container); - CancelScheduledActionFeature.register(container); - ExecuteScheduledActionFeature.register(container); - } -}); -export { SchedulerFeature }; - -//# sourceMappingURL=SchedulerFeature.js.map \ No newline at end of file diff --git a/packages/api-scheduler/dist._build/features/SchedulerFeature.js.map b/packages/api-scheduler/dist._build/features/SchedulerFeature.js.map deleted file mode 100644 index 2d2ac6d068f..00000000000 --- a/packages/api-scheduler/dist._build/features/SchedulerFeature.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"features/SchedulerFeature.js","sources":["../../src/features/SchedulerFeature.ts"],"sourcesContent":["import { createFeature } from \"@webiny/feature/api\";\nimport { ScheduleActionFeature } from \"./ScheduleAction/feature.js\";\nimport { GetScheduledActionFeature } from \"./GetScheduledAction/feature.js\";\nimport { GetTargetScheduledActionFeature } from \"./GetTargetScheduledAction/feature.js\";\nimport { ListScheduledActionsFeature } from \"./ListScheduledActions/feature.js\";\nimport { CancelScheduledActionFeature } from \"./CancelScheduledAction/feature.js\";\nimport { ExecuteScheduledActionFeature } from \"./ExecuteScheduledAction/feature.js\";\n\n/**\n * Main Scheduler Feature\n *\n * Registers all scheduler use cases and the composite handler.\n * Individual handler implementations are registered by consumer packages\n * (e.g., api-headless-cms-scheduler registers CMS-specific handlers).\n */\nexport const SchedulerFeature = createFeature({\n name: \"Scheduler\",\n register(container) {\n // Register all features\n ScheduleActionFeature.register(container);\n GetScheduledActionFeature.register(container);\n GetTargetScheduledActionFeature.register(container);\n ListScheduledActionsFeature.register(container);\n CancelScheduledActionFeature.register(container);\n ExecuteScheduledActionFeature.register(container);\n }\n});\n"],"names":["SchedulerFeature","createFeature","container","ScheduleActionFeature","GetScheduledActionFeature","GetTargetScheduledActionFeature","ListScheduledActionsFeature","CancelScheduledActionFeature","ExecuteScheduledActionFeature"],"mappings":";;;;;;;AAeO,MAAMA,mBAAmBC,cAAc;IAC1C,MAAM;IACN,UAASC,SAAS;QAEdC,sBAAsB,QAAQ,CAACD;QAC/BE,0BAA0B,QAAQ,CAACF;QACnCG,gCAAgC,QAAQ,CAACH;QACzCI,4BAA4B,QAAQ,CAACJ;QACrCK,6BAA6B,QAAQ,CAACL;QACtCM,8BAA8B,QAAQ,CAACN;IAC3C;AACJ"} \ No newline at end of file diff --git a/packages/api-scheduler/dist._build/features/SchedulerService/VoidSchedulerService.d.ts b/packages/api-scheduler/dist._build/features/SchedulerService/VoidSchedulerService.d.ts deleted file mode 100644 index 2bcf428587c..00000000000 --- a/packages/api-scheduler/dist._build/features/SchedulerService/VoidSchedulerService.d.ts +++ /dev/null @@ -1,15 +0,0 @@ -import type { SchedulerService } from "~/shared/abstractions.js"; -export interface IVoidSchedulerServiceParams { - create?: (params: SchedulerService.CreateParams) => Promise; - update?: (params: SchedulerService.UpdateParams) => Promise; - delete?: (params: SchedulerService.DeleteParams) => Promise; - exists?: (params: SchedulerService.ExistsParams) => Promise; -} -export declare class VoidSchedulerService implements SchedulerService.Interface { - private readonly callbacks; - constructor(callbacks?: IVoidSchedulerServiceParams); - create(params: SchedulerService.CreateParams): Promise; - update(params: SchedulerService.UpdateParams): Promise; - delete(params: SchedulerService.DeleteParams): Promise; - exists(params: SchedulerService.ExistsParams): Promise; -} diff --git a/packages/api-scheduler/dist._build/features/SchedulerService/VoidSchedulerService.js b/packages/api-scheduler/dist._build/features/SchedulerService/VoidSchedulerService.js deleted file mode 100644 index 2acd1e98624..00000000000 --- a/packages/api-scheduler/dist._build/features/SchedulerService/VoidSchedulerService.js +++ /dev/null @@ -1,24 +0,0 @@ -class VoidSchedulerService { - constructor(callbacks){ - this.callbacks = callbacks; - } - async create(params) { - if (!this.callbacks?.create) return; - return this.callbacks?.create(params); - } - async update(params) { - if (!this.callbacks?.update) return; - return this.callbacks?.update(params); - } - async delete(params) { - if (!this.callbacks?.delete) return; - return this.callbacks.delete(params); - } - async exists(params) { - if (!this.callbacks?.exists) return false; - return this.callbacks.exists(params); - } -} -export { VoidSchedulerService }; - -//# sourceMappingURL=VoidSchedulerService.js.map \ No newline at end of file diff --git a/packages/api-scheduler/dist._build/features/SchedulerService/VoidSchedulerService.js.map b/packages/api-scheduler/dist._build/features/SchedulerService/VoidSchedulerService.js.map deleted file mode 100644 index b92501b2c3c..00000000000 --- a/packages/api-scheduler/dist._build/features/SchedulerService/VoidSchedulerService.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"features/SchedulerService/VoidSchedulerService.js","sources":["../../../src/features/SchedulerService/VoidSchedulerService.ts"],"sourcesContent":["import type { SchedulerService } from \"~/shared/abstractions.js\";\n\nexport interface IVoidSchedulerServiceParams {\n create?: (params: SchedulerService.CreateParams) => Promise;\n update?: (params: SchedulerService.UpdateParams) => Promise;\n delete?: (params: SchedulerService.DeleteParams) => Promise;\n exists?: (params: SchedulerService.ExistsParams) => Promise;\n}\n\nexport class VoidSchedulerService implements SchedulerService.Interface {\n private readonly callbacks: IVoidSchedulerServiceParams | undefined;\n\n public constructor(callbacks?: IVoidSchedulerServiceParams) {\n this.callbacks = callbacks;\n }\n\n public async create(params: SchedulerService.CreateParams): Promise {\n if (!this.callbacks?.create) {\n return;\n }\n return this.callbacks?.create(params);\n }\n\n public async update(params: SchedulerService.UpdateParams): Promise {\n if (!this.callbacks?.update) {\n return;\n }\n return this.callbacks?.update(params);\n }\n\n public async delete(params: SchedulerService.DeleteParams): Promise {\n if (!this.callbacks?.delete) {\n return;\n }\n return this.callbacks.delete(params);\n }\n\n public async exists(params: SchedulerService.ExistsParams): Promise {\n if (!this.callbacks?.exists) {\n return false;\n }\n return this.callbacks.exists(params);\n }\n}\n"],"names":["VoidSchedulerService","callbacks","params"],"mappings":"AASO,MAAMA;IAGT,YAAmBC,SAAuC,CAAE;QACxD,IAAI,CAAC,SAAS,GAAGA;IACrB;IAEA,MAAa,OAAOC,MAAqC,EAAiB;QACtE,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,QACjB;QAEJ,OAAO,IAAI,CAAC,SAAS,EAAE,OAAOA;IAClC;IAEA,MAAa,OAAOA,MAAqC,EAAiB;QACtE,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,QACjB;QAEJ,OAAO,IAAI,CAAC,SAAS,EAAE,OAAOA;IAClC;IAEA,MAAa,OAAOA,MAAqC,EAAiB;QACtE,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,QACjB;QAEJ,OAAO,IAAI,CAAC,SAAS,CAAC,MAAM,CAACA;IACjC;IAEA,MAAa,OAAOA,MAAqC,EAAoB;QACzE,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,QACjB,OAAO;QAEX,OAAO,IAAI,CAAC,SAAS,CAAC,MAAM,CAACA;IACjC;AACJ"} \ No newline at end of file diff --git a/packages/api-scheduler/dist._build/features/permissions/abstractions.d.ts b/packages/api-scheduler/dist._build/features/permissions/abstractions.d.ts deleted file mode 100644 index 01a7ffa3ae0..00000000000 --- a/packages/api-scheduler/dist._build/features/permissions/abstractions.d.ts +++ /dev/null @@ -1,14 +0,0 @@ -import type { Permissions } from "@webiny/api-core/exports/api/security.js"; -import { SCHEDULER_PERMISSIONS_SCHEMA } from "~/domain/permissionsSchema.js"; -export declare const SchedulerPermissions: import("@webiny/di").Abstraction>; -export declare namespace SchedulerPermissions { - type Interface = Permissions; -} diff --git a/packages/api-scheduler/dist._build/features/permissions/abstractions.js b/packages/api-scheduler/dist._build/features/permissions/abstractions.js deleted file mode 100644 index 7b9e87535fd..00000000000 --- a/packages/api-scheduler/dist._build/features/permissions/abstractions.js +++ /dev/null @@ -1,6 +0,0 @@ -import { createPermissionsAbstraction } from "@webiny/api-core/exports/api/security.js"; -import { SCHEDULER_PERMISSIONS_SCHEMA } from "../../domain/permissionsSchema.js"; -const SchedulerPermissions = createPermissionsAbstraction(SCHEDULER_PERMISSIONS_SCHEMA); -export { SchedulerPermissions }; - -//# sourceMappingURL=abstractions.js.map \ No newline at end of file diff --git a/packages/api-scheduler/dist._build/features/permissions/abstractions.js.map b/packages/api-scheduler/dist._build/features/permissions/abstractions.js.map deleted file mode 100644 index b61c3a7360b..00000000000 --- a/packages/api-scheduler/dist._build/features/permissions/abstractions.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"features/permissions/abstractions.js","sources":["../../../src/features/permissions/abstractions.ts"],"sourcesContent":["import { createPermissionsAbstraction } from \"@webiny/api-core/exports/api/security.js\";\nimport type { Permissions } from \"@webiny/api-core/exports/api/security.js\";\nimport { SCHEDULER_PERMISSIONS_SCHEMA } from \"~/domain/permissionsSchema.js\";\n\nexport const SchedulerPermissions = createPermissionsAbstraction(SCHEDULER_PERMISSIONS_SCHEMA);\n\nexport namespace SchedulerPermissions {\n export type Interface = Permissions;\n}\n"],"names":["SchedulerPermissions","createPermissionsAbstraction","SCHEDULER_PERMISSIONS_SCHEMA"],"mappings":";;AAIO,MAAMA,uBAAuBC,6BAA6BC"} \ No newline at end of file diff --git a/packages/api-scheduler/dist._build/features/permissions/feature.d.ts b/packages/api-scheduler/dist._build/features/permissions/feature.d.ts deleted file mode 100644 index 90ebcbec2ae..00000000000 --- a/packages/api-scheduler/dist._build/features/permissions/feature.d.ts +++ /dev/null @@ -1,4 +0,0 @@ -export declare const SchedulerPermissionsFeature: { - name: string; - register(container: import("@webiny/di").Container): void; -}; diff --git a/packages/api-scheduler/dist._build/features/permissions/feature.js b/packages/api-scheduler/dist._build/features/permissions/feature.js deleted file mode 100644 index 453af748604..00000000000 --- a/packages/api-scheduler/dist._build/features/permissions/feature.js +++ /dev/null @@ -1,7 +0,0 @@ -import { createPermissionsFeature } from "@webiny/api-core/exports/api/security.js"; -import { SCHEDULER_PERMISSIONS_SCHEMA } from "../../domain/permissionsSchema.js"; -import { SchedulerPermissions } from "./abstractions.js"; -const SchedulerPermissionsFeature = createPermissionsFeature(SCHEDULER_PERMISSIONS_SCHEMA, SchedulerPermissions); -export { SchedulerPermissionsFeature }; - -//# sourceMappingURL=feature.js.map \ No newline at end of file diff --git a/packages/api-scheduler/dist._build/features/permissions/feature.js.map b/packages/api-scheduler/dist._build/features/permissions/feature.js.map deleted file mode 100644 index 2aa1e655952..00000000000 --- a/packages/api-scheduler/dist._build/features/permissions/feature.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"features/permissions/feature.js","sources":["../../../src/features/permissions/feature.ts"],"sourcesContent":["import { createPermissionsFeature } from \"@webiny/api-core/exports/api/security.js\";\nimport { SCHEDULER_PERMISSIONS_SCHEMA } from \"~/domain/permissionsSchema.js\";\nimport { SchedulerPermissions } from \"./abstractions.js\";\n\nexport const SchedulerPermissionsFeature = createPermissionsFeature(\n SCHEDULER_PERMISSIONS_SCHEMA,\n SchedulerPermissions\n);\n"],"names":["SchedulerPermissionsFeature","createPermissionsFeature","SCHEDULER_PERMISSIONS_SCHEMA","SchedulerPermissions"],"mappings":";;;AAIO,MAAMA,8BAA8BC,yBACvCC,8BACAC"} \ No newline at end of file diff --git a/packages/api-scheduler/dist._build/graphql/SchedulerGraphQLFactory.d.ts b/packages/api-scheduler/dist._build/graphql/SchedulerGraphQLFactory.d.ts deleted file mode 100644 index 4697618dda2..00000000000 --- a/packages/api-scheduler/dist._build/graphql/SchedulerGraphQLFactory.d.ts +++ /dev/null @@ -1,8 +0,0 @@ -import { GraphQLSchemaBuilder } from "@webiny/handler-graphql/features/GraphQLSchemaBuilder/abstractions"; -import { CoreGraphQLSchemaFactory } from "@webiny/handler-graphql/graphql/abstractions.core.js"; -export declare class SchedulerGraphQL implements CoreGraphQLSchemaFactory.Interface { - execute(builder: GraphQLSchemaBuilder.Interface): Promise; -} -export declare const SchedulerGraphQLFactory: typeof SchedulerGraphQL & { - __abstraction: import("@webiny/di").Abstraction; -}; diff --git a/packages/api-scheduler/dist._build/graphql/SchedulerGraphQLFactory.js b/packages/api-scheduler/dist._build/graphql/SchedulerGraphQLFactory.js deleted file mode 100644 index 6936d888b10..00000000000 --- a/packages/api-scheduler/dist._build/graphql/SchedulerGraphQLFactory.js +++ /dev/null @@ -1,219 +0,0 @@ -import { CoreGraphQLSchemaFactory } from "@webiny/handler-graphql/graphql/abstractions.core.js"; -import { GetScheduledActionUseCase } from "../features/GetScheduledAction/index.js"; -import { ErrorResponse, ListResponse, Response } from "@webiny/handler-graphql/responses.js"; -import { ListScheduledActionsUseCase } from "../features/ListScheduledActions/index.js"; -import { ScheduleActionUseCase } from "../features/ScheduleAction/index.js"; -import { CancelScheduledActionUseCase } from "../features/CancelScheduledAction/index.js"; -import { ScheduledActionNotFoundError } from "../domain/errors.js"; -import { ScheduledActionMapper } from "../domain/ScheduledActionMapper.js"; -import { GetTargetScheduledActionUseCase } from "../features/GetTargetScheduledAction/index.js"; -class SchedulerGraphQL { - async execute(builder) { - builder.addTypeDefs(` - enum ScheduleRecordType { - publish - unpublish - } - - type ScheduleError { - message: String! - code: String - data: JSON - stack: String - } - - type ScheduleListMeta { - hasMoreItems: Boolean! - totalCount: Int! - cursor: String - } - - type ScheduleIdentity { - id: String! - displayName: String - type: String - } - - type ScheduleRecord { - id: ID! - targetId: String! - namespace: String! - scheduledBy: ScheduleIdentity! - publishOn: DateTime - unpublishOn: DateTime - actionType: ScheduleRecordType! - title: String! - } - - type GetScheduledActionResponse { - data: ScheduleRecord - error: ScheduleError - } - - type ListScheduledActionsResponse { - data: [ScheduleRecord!] - error: ScheduleError - meta: ScheduleListMeta - } - - type ScheduleActionResponse { - data: ScheduleRecord - error: ScheduleError - } - - type CancelScheduledActionResponse { - data: Boolean - error: ScheduleError - } - - input ListScheduledActionsWhereInput { - targetId: String - targetId_in: [String!] - title: String - title_contains: String - title_not_contains: String - actionType: ScheduleRecordType - actionType_in: [ScheduleRecordType!] - scheduledBy: String - scheduledBy_in: [String!] - scheduledFor: DateTime - scheduledFor_gte: DateTime - scheduledFor_lte: DateTime - } - - enum ListScheduledActionsSorter { - title_ASC - title_DESC - scheduledFor_ASC - scheduledFor_DESC - } - - type SchedulerQuery { - _empty: String - } - - type SchedulerMutation { - _empty: String - } - - extend type SchedulerQuery { - # Fetch scheduled action by its own ID - getScheduledAction(namespace: String!, id: ID!): GetScheduledActionResponse! - - # Fetch scheduled action by target ID - getTargetScheduledAction(namespace: String!, id: ID!): GetScheduledActionResponse! - - listScheduledActions( - namespace: String! - where: ListScheduledActionsWhereInput - sort: [ListScheduledActionsSorter!] - limit: Int - after: String - ): ListScheduledActionsResponse! - } - - extend type SchedulerMutation { - scheduleAction( - namespace: String! - targetId: ID! - immediately: Boolean - scheduleFor: DateTime - actionType: ScheduleRecordType! - ): ScheduleActionResponse! - - cancelScheduledAction(namespace: String!, id: ID!): CancelScheduledActionResponse! - } - - extend type Query { - scheduler: SchedulerQuery - } - - extend type Mutation { - scheduler: SchedulerMutation - } - `); - builder.addResolver({ - path: "Query.scheduler", - resolver: ()=>async ()=>({}) - }); - builder.addResolver({ - path: "Mutation.scheduler", - resolver: ()=>async ()=>({}) - }); - builder.addResolver({ - path: "SchedulerQuery.getScheduledAction", - dependencies: [ - GetScheduledActionUseCase - ], - resolver: (useCase)=>async ({ args })=>{ - const result = await useCase.execute(args); - if (result.isFail()) { - if (result.error instanceof ScheduledActionNotFoundError) return new Response(null); - return new ErrorResponse(result.error); - } - return new Response(ScheduledActionMapper.toGraphQL(result.value)); - } - }); - builder.addResolver({ - path: "SchedulerQuery.getTargetScheduledAction", - dependencies: [ - GetTargetScheduledActionUseCase - ], - resolver: (useCase)=>async ({ args })=>{ - const result = await useCase.execute(args); - if (result.isFail()) { - if (result.error instanceof ScheduledActionNotFoundError) return new Response(null); - return new ErrorResponse(result.error); - } - return new Response(ScheduledActionMapper.toGraphQL(result.value)); - } - }); - builder.addResolver({ - path: "SchedulerQuery.listScheduledActions", - dependencies: [ - ListScheduledActionsUseCase - ], - resolver: (useCase)=>async ({ args })=>{ - const result = await useCase.execute({ - ...args, - where: { - ...args.where, - namespace: args.namespace - } - }); - if (result.isFail()) return new ErrorResponse(result.error); - return new ListResponse(result.value.items.map((item)=>ScheduledActionMapper.toGraphQL(item)), result.value.meta); - } - }); - builder.addResolver({ - path: "SchedulerMutation.scheduleAction", - dependencies: [ - ScheduleActionUseCase - ], - resolver: (useCase)=>async ({ args })=>{ - const result = await useCase.execute(args); - if (result.isFail()) return new ErrorResponse(result.error); - return new Response(ScheduledActionMapper.toGraphQL(result.value)); - } - }); - builder.addResolver({ - path: "SchedulerMutation.cancelScheduledAction", - dependencies: [ - CancelScheduledActionUseCase - ], - resolver: (useCase)=>async ({ args })=>{ - const result = await useCase.execute(args); - if (result.isFail()) return new ErrorResponse(result.error); - return new Response(result.value); - } - }); - return builder; - } -} -const SchedulerGraphQLFactory = CoreGraphQLSchemaFactory.createImplementation({ - dependencies: [], - implementation: SchedulerGraphQL -}); -export { SchedulerGraphQL, SchedulerGraphQLFactory }; - -//# sourceMappingURL=SchedulerGraphQLFactory.js.map \ No newline at end of file diff --git a/packages/api-scheduler/dist._build/graphql/SchedulerGraphQLFactory.js.map b/packages/api-scheduler/dist._build/graphql/SchedulerGraphQLFactory.js.map deleted file mode 100644 index 13d3a84a1c6..00000000000 --- a/packages/api-scheduler/dist._build/graphql/SchedulerGraphQLFactory.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"graphql/SchedulerGraphQLFactory.js","sources":["../../src/graphql/SchedulerGraphQLFactory.ts"],"sourcesContent":["import { GraphQLSchemaBuilder } from \"@webiny/handler-graphql/features/GraphQLSchemaBuilder/abstractions\";\nimport { CoreGraphQLSchemaFactory } from \"@webiny/handler-graphql/graphql/abstractions.core.js\";\nimport { GetScheduledActionUseCase } from \"~/features/GetScheduledAction/index.js\";\nimport { ErrorResponse, ListResponse, Response } from \"@webiny/handler-graphql/responses.js\";\nimport { ListScheduledActionsUseCase } from \"~/features/ListScheduledActions/index.js\";\nimport { ScheduleActionUseCase } from \"~/features/ScheduleAction/index.js\";\nimport { CancelScheduledActionUseCase } from \"~/features/CancelScheduledAction/index.js\";\nimport { ScheduledActionNotFoundError } from \"~/domain/errors.js\";\nimport type { Identity, ScheduledActionType } from \"~/shared/abstractions.js\";\nimport { ScheduledActionMapper } from \"~/domain/ScheduledActionMapper.js\";\nimport { GetTargetScheduledActionUseCase } from \"~/features/GetTargetScheduledAction/index.js\";\n\ninterface IListScheduledActionsArgs extends ListScheduledActionsUseCase.Params {\n namespace: string;\n}\n\ninterface IScheduleRecordOutput {\n id: string;\n targetId: string;\n namespace: string;\n scheduledBy: Identity;\n publishOn: Date | null;\n unpublishOn: Date | null;\n actionType: ScheduledActionType;\n title: string;\n}\n\nexport class SchedulerGraphQL implements CoreGraphQLSchemaFactory.Interface {\n public async execute(\n builder: GraphQLSchemaBuilder.Interface\n ): Promise {\n builder.addTypeDefs(`\n enum ScheduleRecordType {\n publish\n unpublish\n }\n \n type ScheduleError {\n message: String!\n code: String\n data: JSON\n stack: String\n }\n \n type ScheduleListMeta {\n hasMoreItems: Boolean!\n totalCount: Int!\n cursor: String\n }\n \n type ScheduleIdentity {\n id: String!\n displayName: String\n type: String\n }\n \n type ScheduleRecord {\n id: ID!\n targetId: String!\n namespace: String!\n scheduledBy: ScheduleIdentity!\n publishOn: DateTime\n unpublishOn: DateTime\n actionType: ScheduleRecordType!\n title: String!\n }\n\n type GetScheduledActionResponse {\n data: ScheduleRecord\n error: ScheduleError\n }\n\n type ListScheduledActionsResponse {\n data: [ScheduleRecord!]\n error: ScheduleError\n meta: ScheduleListMeta\n }\n\n type ScheduleActionResponse {\n data: ScheduleRecord\n error: ScheduleError\n }\n\n type CancelScheduledActionResponse {\n data: Boolean\n error: ScheduleError\n }\n\n input ListScheduledActionsWhereInput {\n targetId: String\n targetId_in: [String!]\n title: String\n title_contains: String\n title_not_contains: String\n actionType: ScheduleRecordType\n actionType_in: [ScheduleRecordType!]\n scheduledBy: String\n scheduledBy_in: [String!]\n scheduledFor: DateTime\n scheduledFor_gte: DateTime\n scheduledFor_lte: DateTime\n }\n\n enum ListScheduledActionsSorter {\n title_ASC\n title_DESC\n scheduledFor_ASC\n scheduledFor_DESC\n }\n \n type SchedulerQuery {\n _empty: String\n }\n \n type SchedulerMutation {\n _empty: String\n }\n\n extend type SchedulerQuery {\n # Fetch scheduled action by its own ID\n getScheduledAction(namespace: String!, id: ID!): GetScheduledActionResponse!\n \n # Fetch scheduled action by target ID\n getTargetScheduledAction(namespace: String!, id: ID!): GetScheduledActionResponse!\n \n listScheduledActions(\n namespace: String!\n where: ListScheduledActionsWhereInput\n sort: [ListScheduledActionsSorter!]\n limit: Int\n after: String\n ): ListScheduledActionsResponse!\n }\n\n extend type SchedulerMutation {\n scheduleAction(\n namespace: String!\n targetId: ID!\n immediately: Boolean\n scheduleFor: DateTime\n actionType: ScheduleRecordType!\n ): ScheduleActionResponse!\n \n cancelScheduledAction(namespace: String!, id: ID!): CancelScheduledActionResponse!\n }\n \n extend type Query {\n scheduler: SchedulerQuery\n }\n \n extend type Mutation {\n scheduler: SchedulerMutation\n }\n `);\n\n builder.addResolver({\n path: \"Query.scheduler\",\n resolver: () => {\n return async () => {\n return {};\n };\n }\n });\n builder.addResolver({\n path: \"Mutation.scheduler\",\n resolver: () => {\n return async () => {\n return {};\n };\n }\n });\n\n builder.addResolver({\n path: \"SchedulerQuery.getScheduledAction\",\n dependencies: [GetScheduledActionUseCase],\n resolver: (useCase: GetScheduledActionUseCase.Interface) => {\n return async ({ args }) => {\n const result = await useCase.execute(args);\n\n if (result.isFail()) {\n if (result.error instanceof ScheduledActionNotFoundError) {\n return new Response(null);\n }\n return new ErrorResponse(result.error);\n }\n\n return new Response(\n ScheduledActionMapper.toGraphQL(result.value)\n );\n };\n }\n });\n\n builder.addResolver({\n path: \"SchedulerQuery.getTargetScheduledAction\",\n dependencies: [GetTargetScheduledActionUseCase],\n resolver: (useCase: GetTargetScheduledActionUseCase.Interface) => {\n return async ({ args }) => {\n const result = await useCase.execute(args);\n\n if (result.isFail()) {\n if (result.error instanceof ScheduledActionNotFoundError) {\n return new Response(null);\n }\n return new ErrorResponse(result.error);\n }\n\n return new Response(\n ScheduledActionMapper.toGraphQL(result.value)\n );\n };\n }\n });\n\n builder.addResolver({\n path: \"SchedulerQuery.listScheduledActions\",\n dependencies: [ListScheduledActionsUseCase],\n resolver: (useCase: ListScheduledActionsUseCase.Interface) => {\n return async ({ args }) => {\n const result = await useCase.execute({\n ...args,\n where: {\n ...args.where,\n namespace: args.namespace\n }\n });\n\n if (result.isFail()) {\n return new ErrorResponse(result.error);\n }\n\n return new ListResponse(\n result.value.items.map(item => {\n return ScheduledActionMapper.toGraphQL(item);\n }),\n result.value.meta\n );\n };\n }\n });\n\n builder.addResolver({\n path: \"SchedulerMutation.scheduleAction\",\n dependencies: [ScheduleActionUseCase],\n resolver: (useCase: ScheduleActionUseCase.Interface) => {\n return async ({ args }) => {\n const result = await useCase.execute(args);\n\n if (result.isFail()) {\n return new ErrorResponse(result.error);\n }\n\n return new Response(\n ScheduledActionMapper.toGraphQL(result.value)\n );\n };\n }\n });\n\n builder.addResolver({\n path: \"SchedulerMutation.cancelScheduledAction\",\n dependencies: [CancelScheduledActionUseCase],\n resolver: (useCase: CancelScheduledActionUseCase.Interface) => {\n return async ({ args }) => {\n const result = await useCase.execute(args);\n\n if (result.isFail()) {\n return new ErrorResponse(result.error);\n }\n\n return new Response(result.value);\n };\n }\n });\n\n return builder;\n }\n}\n\nexport const SchedulerGraphQLFactory = CoreGraphQLSchemaFactory.createImplementation({\n dependencies: [],\n implementation: SchedulerGraphQL\n});\n"],"names":["SchedulerGraphQL","builder","GetScheduledActionUseCase","useCase","args","result","ScheduledActionNotFoundError","Response","ErrorResponse","ScheduledActionMapper","GetTargetScheduledActionUseCase","ListScheduledActionsUseCase","ListResponse","item","ScheduleActionUseCase","CancelScheduledActionUseCase","SchedulerGraphQLFactory","CoreGraphQLSchemaFactory"],"mappings":";;;;;;;;;AA2BO,MAAMA;IACT,MAAa,QACTC,OAAuC,EACA;QACvCA,QAAQ,WAAW,CAAC,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;QA0HrB,CAAC;QAEDA,QAAQ,WAAW,CAAC;YAChB,MAAM;YACN,UAAU,IACC,UACI,EAAC;QAGpB;QACAA,QAAQ,WAAW,CAAC;YAChB,MAAM;YACN,UAAU,IACC,UACI,EAAC;QAGpB;QAEAA,QAAQ,WAAW,CAAmC;YAClD,MAAM;YACN,cAAc;gBAACC;aAA0B;YACzC,UAAU,CAACC,UACA,OAAO,EAAEC,IAAI,EAAE;oBAClB,MAAMC,SAAS,MAAMF,QAAQ,OAAO,CAACC;oBAErC,IAAIC,OAAO,MAAM,IAAI;wBACjB,IAAIA,OAAO,KAAK,YAAYC,8BACxB,OAAO,IAAIC,SAAS;wBAExB,OAAO,IAAIC,cAAcH,OAAO,KAAK;oBACzC;oBAEA,OAAO,IAAIE,SACPE,sBAAsB,SAAS,CAACJ,OAAO,KAAK;gBAEpD;QAER;QAEAJ,QAAQ,WAAW,CAAyC;YACxD,MAAM;YACN,cAAc;gBAACS;aAAgC;YAC/C,UAAU,CAACP,UACA,OAAO,EAAEC,IAAI,EAAE;oBAClB,MAAMC,SAAS,MAAMF,QAAQ,OAAO,CAACC;oBAErC,IAAIC,OAAO,MAAM,IAAI;wBACjB,IAAIA,OAAO,KAAK,YAAYC,8BACxB,OAAO,IAAIC,SAAS;wBAExB,OAAO,IAAIC,cAAcH,OAAO,KAAK;oBACzC;oBAEA,OAAO,IAAIE,SACPE,sBAAsB,SAAS,CAACJ,OAAO,KAAK;gBAEpD;QAER;QAEAJ,QAAQ,WAAW,CAA4B;YAC3C,MAAM;YACN,cAAc;gBAACU;aAA4B;YAC3C,UAAU,CAACR,UACA,OAAO,EAAEC,IAAI,EAAE;oBAClB,MAAMC,SAAS,MAAMF,QAAQ,OAAO,CAAC;wBACjC,GAAGC,IAAI;wBACP,OAAO;4BACH,GAAGA,KAAK,KAAK;4BACb,WAAWA,KAAK,SAAS;wBAC7B;oBACJ;oBAEA,IAAIC,OAAO,MAAM,IACb,OAAO,IAAIG,cAAcH,OAAO,KAAK;oBAGzC,OAAO,IAAIO,aACPP,OAAO,KAAK,CAAC,KAAK,CAAC,GAAG,CAACQ,CAAAA,OACZJ,sBAAsB,SAAS,CAACI,QAE3CR,OAAO,KAAK,CAAC,IAAI;gBAEzB;QAER;QAEAJ,QAAQ,WAAW,CAA+B;YAC9C,MAAM;YACN,cAAc;gBAACa;aAAsB;YACrC,UAAU,CAACX,UACA,OAAO,EAAEC,IAAI,EAAE;oBAClB,MAAMC,SAAS,MAAMF,QAAQ,OAAO,CAACC;oBAErC,IAAIC,OAAO,MAAM,IACb,OAAO,IAAIG,cAAcH,OAAO,KAAK;oBAGzC,OAAO,IAAIE,SACPE,sBAAsB,SAAS,CAACJ,OAAO,KAAK;gBAEpD;QAER;QAEAJ,QAAQ,WAAW,CAAsC;YACrD,MAAM;YACN,cAAc;gBAACc;aAA6B;YAC5C,UAAU,CAACZ,UACA,OAAO,EAAEC,IAAI,EAAE;oBAClB,MAAMC,SAAS,MAAMF,QAAQ,OAAO,CAACC;oBAErC,IAAIC,OAAO,MAAM,IACb,OAAO,IAAIG,cAAcH,OAAO,KAAK;oBAGzC,OAAO,IAAIE,SAAkBF,OAAO,KAAK;gBAC7C;QAER;QAEA,OAAOJ;IACX;AACJ;AAEO,MAAMe,0BAA0BC,yBAAyB,oBAAoB,CAAC;IACjF,cAAc,EAAE;IAChB,gBAAgBjB;AACpB"} \ No newline at end of file diff --git a/packages/api-scheduler/dist._build/graphql/feature.d.ts b/packages/api-scheduler/dist._build/graphql/feature.d.ts deleted file mode 100644 index 16b550ab9ec..00000000000 --- a/packages/api-scheduler/dist._build/graphql/feature.d.ts +++ /dev/null @@ -1,4 +0,0 @@ -export declare const SchedulerGraphQLFactoryFeature: { - name: string; - register(container: import("@webiny/di").Container): void; -}; diff --git a/packages/api-scheduler/dist._build/graphql/feature.js b/packages/api-scheduler/dist._build/graphql/feature.js deleted file mode 100644 index bc8443fc3de..00000000000 --- a/packages/api-scheduler/dist._build/graphql/feature.js +++ /dev/null @@ -1,11 +0,0 @@ -import { createFeature } from "@webiny/feature/api"; -import { SchedulerGraphQLFactory } from "./SchedulerGraphQLFactory.js"; -const SchedulerGraphQLFactoryFeature = createFeature({ - name: "SchedulerGraphQLFactory", - register (container) { - container.register(SchedulerGraphQLFactory); - } -}); -export { SchedulerGraphQLFactoryFeature }; - -//# sourceMappingURL=feature.js.map \ No newline at end of file diff --git a/packages/api-scheduler/dist._build/graphql/feature.js.map b/packages/api-scheduler/dist._build/graphql/feature.js.map deleted file mode 100644 index 1c983e81ada..00000000000 --- a/packages/api-scheduler/dist._build/graphql/feature.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"graphql/feature.js","sources":["../../src/graphql/feature.ts"],"sourcesContent":["import { createFeature } from \"@webiny/feature/api\";\nimport { SchedulerGraphQLFactory } from \"./SchedulerGraphQLFactory.js\";\n\nexport const SchedulerGraphQLFactoryFeature = createFeature({\n name: \"SchedulerGraphQLFactory\",\n register(container) {\n container.register(SchedulerGraphQLFactory);\n }\n});\n"],"names":["SchedulerGraphQLFactoryFeature","createFeature","container","SchedulerGraphQLFactory"],"mappings":";;AAGO,MAAMA,iCAAiCC,cAAc;IACxD,MAAM;IACN,UAASC,SAAS;QACdA,UAAU,QAAQ,CAACC;IACvB;AACJ"} \ No newline at end of file diff --git a/packages/api-scheduler/dist._build/graphql/index.d.ts b/packages/api-scheduler/dist._build/graphql/index.d.ts deleted file mode 100644 index aacb0f1610d..00000000000 --- a/packages/api-scheduler/dist._build/graphql/index.d.ts +++ /dev/null @@ -1 +0,0 @@ -export { SchedulerGraphQLFactory } from "./SchedulerGraphQLFactory.js"; diff --git a/packages/api-scheduler/dist._build/graphql/index.js b/packages/api-scheduler/dist._build/graphql/index.js deleted file mode 100644 index aacb0f1610d..00000000000 --- a/packages/api-scheduler/dist._build/graphql/index.js +++ /dev/null @@ -1 +0,0 @@ -export { SchedulerGraphQLFactory } from "./SchedulerGraphQLFactory.js"; diff --git a/packages/api-scheduler/dist._build/index.d.ts b/packages/api-scheduler/dist._build/index.d.ts deleted file mode 100644 index b1cf5ca35a6..00000000000 --- a/packages/api-scheduler/dist._build/index.d.ts +++ /dev/null @@ -1,6 +0,0 @@ -export { SchedulerService, ScheduledActionModel, ScheduledActionHandler } from "./shared/abstractions.js"; -export type { IScheduledAction } from "./shared/abstractions.js"; -export { ScheduledActionId } from "./domain/ScheduledActionId.js"; -export { SchedulerFeature } from "./SchedulerFeature.js"; -export type { ISchedulerFeatureConfig } from "./SchedulerFeature.js"; -export { ScheduledActionLambdaHandler } from "./ScheduledActionLambdaHandler.js"; diff --git a/packages/api-scheduler/dist._build/index.js b/packages/api-scheduler/dist._build/index.js deleted file mode 100644 index 8aa9c84fae2..00000000000 --- a/packages/api-scheduler/dist._build/index.js +++ /dev/null @@ -1,4 +0,0 @@ -export { ScheduledActionHandler, ScheduledActionModel, SchedulerService } from "./shared/abstractions.js"; -export { ScheduledActionId } from "./domain/ScheduledActionId.js"; -export { SchedulerFeature } from "./SchedulerFeature.js"; -export { ScheduledActionLambdaHandler } from "./ScheduledActionLambdaHandler.js"; diff --git a/packages/api-scheduler/dist._build/shared/abstractions.d.ts b/packages/api-scheduler/dist._build/shared/abstractions.d.ts deleted file mode 100644 index 89233bb4489..00000000000 --- a/packages/api-scheduler/dist._build/shared/abstractions.d.ts +++ /dev/null @@ -1,107 +0,0 @@ -import type { CmsModel } from "@webiny/api-headless-cms/types/model.js"; -import type { GenericRecord } from "@webiny/api/types.js"; -import type { CmsEntry } from "@webiny/api-headless-cms/types/index.js"; -import type { SCHEDULED_ACTION_PUBLISH, SCHEDULED_ACTION_UNPUBLISH } from "~/constants.js"; -/** - * Identity type - represents who scheduled an action - */ -export interface Identity { - id: string; - type: string; - displayName: string; -} -export type ScheduledActionType = typeof SCHEDULED_ACTION_PUBLISH | typeof SCHEDULED_ACTION_UNPUBLISH; -/** - * Scheduled Action Record - The data stored for a scheduled action - */ -export interface IScheduledActionEntryValues { - namespace: string; - actionType: ScheduledActionType; - targetId: string; - scheduledBy: Identity; - scheduledFor: string; - title: string; - payload: T; - error: string | undefined; -} -export interface IScheduledActionEntry extends CmsEntry> { -} -export interface IScheduledAction extends Omit, "scheduledFor"> { - id: string; - tenant: string; - scheduledFor: Date; -} -/** - * ScheduledActionHandler - Similar to EventHandler pattern - * - * Each application (CMS, Mailer, etc.) implements handlers for their actions. - * This is the ONLY action abstraction needed. - */ -export interface IScheduledActionHandler { - /** - * Determines if this handler can handle the given action - * - * @param namespace - Resource scope (e.g., "Cms/Entry/Article") - * @param actionType - Operation type (e.g., "Publish") - */ - canHandle(namespace: string, actionType: ScheduledActionType): boolean; - /** - * Executes the scheduled action - */ - handle(action: IScheduledAction): Promise; -} -/** Handle execution of a scheduled action. */ -export declare const ScheduledActionHandler: import("@webiny/di").Abstraction; -export declare namespace ScheduledActionHandler { - type Interface = IScheduledActionHandler; -} -/** - * SchedulerService - Cloud-agnostic scheduler service - * - * Abstracts the underlying scheduling infrastructure (AWS EventBridge, Azure Logic Apps, etc.) - */ -export interface ISchedulerServiceCreateParams { - id: string; - tenant: string; - namespace: string; - scheduleFor: Date; -} -export interface ISchedulerServiceUpdateParams { - id: string; - tenant: string; - namespace: string; - scheduleFor: Date; -} -export interface ISchedulerServiceDeleteParams { - id: string; - namespace: string; - tenant: string; -} -export interface ISchedulerServiceExistsParams { - id: string; - namespace: string; - tenant: string; -} -export interface ISchedulerService { - create(params: ISchedulerServiceCreateParams): Promise; - update(params: ISchedulerServiceUpdateParams): Promise; - delete(params: ISchedulerServiceDeleteParams): Promise; - exists(params: ISchedulerServiceExistsParams): Promise; -} -/** Core service for managing scheduled actions. */ -export declare const SchedulerService: import("@webiny/di").Abstraction; -export declare namespace SchedulerService { - type Interface = ISchedulerService; - type CreateParams = ISchedulerServiceCreateParams; - type UpdateParams = ISchedulerServiceUpdateParams; - type DeleteParams = ISchedulerServiceDeleteParams; - type ExistsParams = ISchedulerServiceExistsParams; -} -/** - * ScheduledActionModel - A CMS model used by the scheduler for persistence. - */ -/** Content model definition for scheduled actions. */ -export declare const ScheduledActionModel: import("@webiny/di").Abstraction; -export declare namespace ScheduledActionModel { - type Interface = CmsModel; -} diff --git a/packages/api-scheduler/dist._build/shared/abstractions.js b/packages/api-scheduler/dist._build/shared/abstractions.js deleted file mode 100644 index 7cdac02df13..00000000000 --- a/packages/api-scheduler/dist._build/shared/abstractions.js +++ /dev/null @@ -1,7 +0,0 @@ -import { createAbstraction } from "@webiny/feature/api"; -const ScheduledActionHandler = createAbstraction("ScheduledActionHandler"); -const SchedulerService = createAbstraction("SchedulerService"); -const ScheduledActionModel = createAbstraction("ScheduledActionModel"); -export { ScheduledActionHandler, ScheduledActionModel, SchedulerService }; - -//# sourceMappingURL=abstractions.js.map \ No newline at end of file diff --git a/packages/api-scheduler/dist._build/shared/abstractions.js.map b/packages/api-scheduler/dist._build/shared/abstractions.js.map deleted file mode 100644 index e5410134edc..00000000000 --- a/packages/api-scheduler/dist._build/shared/abstractions.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"shared/abstractions.js","sources":["../../src/shared/abstractions.ts"],"sourcesContent":["import type { CmsModel } from \"@webiny/api-headless-cms/types/model.js\";\nimport { createAbstraction } from \"@webiny/feature/api\";\nimport type { GenericRecord } from \"@webiny/api/types.js\";\nimport type { CmsEntry } from \"@webiny/api-headless-cms/types/index.js\";\nimport type { SCHEDULED_ACTION_PUBLISH, SCHEDULED_ACTION_UNPUBLISH } from \"~/constants.js\";\n\n/**\n * Identity type - represents who scheduled an action\n */\nexport interface Identity {\n id: string;\n type: string;\n displayName: string;\n}\n\nexport type ScheduledActionType =\n | typeof SCHEDULED_ACTION_PUBLISH\n | typeof SCHEDULED_ACTION_UNPUBLISH;\n/**\n * Scheduled Action Record - The data stored for a scheduled action\n */\n\nexport interface IScheduledActionEntryValues {\n namespace: string; // Resource scope: \"Cms/Entry/Article\", \"Mailer/Email\"\n actionType: ScheduledActionType;\n targetId: string; // Resource identifier (entry ID, email ID, etc.)\n scheduledBy: Identity;\n scheduledFor: string;\n title: string;\n payload: T; // Action-specific data\n error: string | undefined; // Error if execution failed\n}\n\nexport interface IScheduledActionEntry extends CmsEntry<\n IScheduledActionEntryValues\n> {}\n\nexport interface IScheduledAction extends Omit<\n IScheduledActionEntryValues,\n \"scheduledFor\"\n> {\n id: string;\n tenant: string;\n scheduledFor: Date;\n}\n\n/**\n * ScheduledActionHandler - Similar to EventHandler pattern\n *\n * Each application (CMS, Mailer, etc.) implements handlers for their actions.\n * This is the ONLY action abstraction needed.\n */\nexport interface IScheduledActionHandler {\n /**\n * Determines if this handler can handle the given action\n *\n * @param namespace - Resource scope (e.g., \"Cms/Entry/Article\")\n * @param actionType - Operation type (e.g., \"Publish\")\n */\n canHandle(namespace: string, actionType: ScheduledActionType): boolean;\n\n /**\n * Executes the scheduled action\n */\n handle(action: IScheduledAction): Promise;\n}\n\n/** Handle execution of a scheduled action. */\nexport const ScheduledActionHandler =\n createAbstraction(\"ScheduledActionHandler\");\n\nexport namespace ScheduledActionHandler {\n export type Interface = IScheduledActionHandler;\n}\n\n/**\n * SchedulerService - Cloud-agnostic scheduler service\n *\n * Abstracts the underlying scheduling infrastructure (AWS EventBridge, Azure Logic Apps, etc.)\n */\n\nexport interface ISchedulerServiceCreateParams {\n id: string;\n tenant: string;\n namespace: string;\n scheduleFor: Date;\n}\nexport interface ISchedulerServiceUpdateParams {\n id: string;\n tenant: string;\n namespace: string;\n scheduleFor: Date;\n}\n\nexport interface ISchedulerServiceDeleteParams {\n id: string;\n namespace: string;\n tenant: string;\n}\n\nexport interface ISchedulerServiceExistsParams {\n id: string;\n namespace: string;\n tenant: string;\n}\n\nexport interface ISchedulerService {\n create(params: ISchedulerServiceCreateParams): Promise;\n update(params: ISchedulerServiceUpdateParams): Promise;\n delete(params: ISchedulerServiceDeleteParams): Promise;\n exists(params: ISchedulerServiceExistsParams): Promise;\n}\n\n/** Core service for managing scheduled actions. */\nexport const SchedulerService = createAbstraction(\"SchedulerService\");\n\nexport namespace SchedulerService {\n export type Interface = ISchedulerService;\n export type CreateParams = ISchedulerServiceCreateParams;\n export type UpdateParams = ISchedulerServiceUpdateParams;\n export type DeleteParams = ISchedulerServiceDeleteParams;\n export type ExistsParams = ISchedulerServiceExistsParams;\n}\n\n/**\n * ScheduledActionModel - A CMS model used by the scheduler for persistence.\n */\n/** Content model definition for scheduled actions. */\nexport const ScheduledActionModel = createAbstraction(\"ScheduledActionModel\");\n\nexport namespace ScheduledActionModel {\n export type Interface = CmsModel;\n}\n"],"names":["ScheduledActionHandler","createAbstraction","SchedulerService","ScheduledActionModel"],"mappings":";AAoEO,MAAMA,yBACTC,kBAA2C;AA6CxC,MAAMC,mBAAmBD,kBAAqC;AAc9D,MAAME,uBAAuBF,kBAA4B"} \ No newline at end of file From 242c6d3b8f9947ce8e084a70eefcbcb376d05a60 Mon Sep 17 00:00:00 2001 From: adrians5j Date: Wed, 15 Jul 2026 15:11:07 +0200 Subject: [PATCH 6/6] wip:7 (xqyzg) --- packages/cli-core/files/references.json | 3 +++ 1 file changed, 3 insertions(+) diff --git a/packages/cli-core/files/references.json b/packages/cli-core/files/references.json index 594b61ec963..7d3eae85441 100644 --- a/packages/cli-core/files/references.json +++ b/packages/cli-core/files/references.json @@ -1718,9 +1718,11 @@ "version": "7.0.5", "files": [ "/packages/api-file-manager-s3/package.json", + "/packages/api-file-manager-server/package.json", "/packages/api-headless-cms/package.json", "/packages/sdk/package.json", "/packages/api-file-manager-s3/package.json", + "/packages/api-file-manager-server/package.json", "/packages/api-headless-cms/package.json", "/packages/sdk/package.json" ] @@ -6345,6 +6347,7 @@ "version": "7.0.5", "files": [ { "file": "/packages/api-file-manager-s3/package.json", "types": ["dependencies"] }, + { "file": "/packages/api-file-manager-server/package.json", "types": ["dependencies"] }, { "file": "/packages/api-headless-cms/package.json", "types": ["dependencies"] }, { "file": "/packages/sdk/package.json", "types": ["dependencies"] } ]