@webiny/background-tasks 0.0.0-unstable.7c2def32a7 → 0.0.0-unstable.9609e4e0c9
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/api/BackgroundTasksFeature.js +4 -0
- package/api/BackgroundTasksFeature.js.map +1 -1
- package/api/decorators/SelfCleaningTaskHandlerDecorator.d.ts +1 -1
- package/api/features/CleanupTaskSubtree/CleanupTaskSubtreeUseCase.d.ts +6 -6
- package/api/features/CleanupTaskSubtree/CleanupTaskSubtreeUseCase.js +1 -6
- package/api/features/CleanupTaskSubtree/CleanupTaskSubtreeUseCase.js.map +1 -1
- package/api/features/CreateTask/CreateTaskUseCase.js +2 -2
- package/api/features/CreateTask/CreateTaskUseCase.js.map +1 -1
- package/api/features/ListVisibleTaskDefinitions/ListVisibleTaskDefinitionsUseCase.d.ts +11 -0
- package/api/features/ListVisibleTaskDefinitions/ListVisibleTaskDefinitionsUseCase.js +19 -0
- package/api/features/ListVisibleTaskDefinitions/ListVisibleTaskDefinitionsUseCase.js.map +1 -0
- package/api/features/ListVisibleTaskDefinitions/abstractions.d.ts +9 -0
- package/api/features/ListVisibleTaskDefinitions/abstractions.js +5 -0
- package/api/features/ListVisibleTaskDefinitions/abstractions.js.map +1 -0
- package/api/features/ListVisibleTaskDefinitions/feature.d.ts +4 -0
- package/api/features/ListVisibleTaskDefinitions/feature.js +11 -0
- package/api/features/ListVisibleTaskDefinitions/feature.js.map +1 -0
- package/api/features/ListVisibleTaskDefinitions/index.d.ts +2 -0
- package/api/features/ListVisibleTaskDefinitions/index.js +2 -0
- package/api/features/TaskService/BackgroundTaskService.js +2 -2
- package/api/features/TaskService/BackgroundTaskService.js.map +1 -1
- package/api/features/TriggerVisibleTask/TriggerVisibleTaskUseCase.d.ts +15 -0
- package/api/features/TriggerVisibleTask/TriggerVisibleTaskUseCase.js +26 -0
- package/api/features/TriggerVisibleTask/TriggerVisibleTaskUseCase.js.map +1 -0
- package/api/features/TriggerVisibleTask/abstractions.d.ts +17 -0
- package/api/features/TriggerVisibleTask/abstractions.js +5 -0
- package/api/features/TriggerVisibleTask/abstractions.js.map +1 -0
- package/api/features/TriggerVisibleTask/feature.d.ts +4 -0
- package/api/features/TriggerVisibleTask/feature.js +11 -0
- package/api/features/TriggerVisibleTask/feature.js.map +1 -0
- package/api/features/TriggerVisibleTask/index.d.ts +2 -0
- package/api/features/TriggerVisibleTask/index.js +2 -0
- package/api/graphql/BackgroundTasksGraphQLSchema.js +6 -6
- package/api/graphql/BackgroundTasksGraphQLSchema.js.map +1 -1
- package/api/runner/TaskControl.js +3 -3
- package/api/runner/TaskControl.js.map +1 -1
- package/api/runner/TaskManager.js +3 -3
- package/api/runner/TaskManager.js.map +1 -1
- package/package.json +25 -25
|
@@ -26,6 +26,8 @@ import { ListTaskLogsFeature } from "./features/ListTaskLogs/index.js";
|
|
|
26
26
|
import { TriggerTaskFeature } from "./features/TriggerTask/feature.js";
|
|
27
27
|
import { AbortTaskFeature } from "./features/AbortTask/feature.js";
|
|
28
28
|
import { GetTaskFeature } from "./features/GetTask/feature.js";
|
|
29
|
+
import { TriggerVisibleTaskFeature } from "./features/TriggerVisibleTask/feature.js";
|
|
30
|
+
import { ListVisibleTaskDefinitionsFeature } from "./features/ListVisibleTaskDefinitions/feature.js";
|
|
29
31
|
import { ListTasksFeature } from "./features/ListTasks/feature.js";
|
|
30
32
|
import { TestingRunTaskDefinition } from "./tasks/testingRunTask.js";
|
|
31
33
|
import { BackgroundTaskPermissionsFeature } from "./features/BackgroundTaskPermissions/feature.js";
|
|
@@ -61,6 +63,8 @@ const BackgroundTasksFeature = createFeature({
|
|
|
61
63
|
BackgroundTaskServiceFeature.register(container);
|
|
62
64
|
TriggerTaskFeature.register(container);
|
|
63
65
|
AbortTaskFeature.register(container);
|
|
66
|
+
TriggerVisibleTaskFeature.register(container);
|
|
67
|
+
ListVisibleTaskDefinitionsFeature.register(container);
|
|
64
68
|
TaskExecutionContextFeature.register(container);
|
|
65
69
|
container.register(TaskController);
|
|
66
70
|
container.register(TestingRunTaskDefinition);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"api/BackgroundTasksFeature.js","sources":["../../src/api/BackgroundTasksFeature.ts"],"sourcesContent":["import { createFeature } from \"@webiny/feature/api\";\nimport { TaskDefinitionDefaultsDecorator } from \"./decorators/TaskDefinitionDefaultsDecorator.js\";\nimport { SelfCleaningTaskHandlerDecorator } from \"./decorators/SelfCleaningTaskHandlerDecorator.js\";\nimport { TaskController } from \"./features/TaskController/index.js\";\nimport { TaskPrivateModel } from \"./crud/TaskPrivateModel.js\";\nimport { TaskLogPrivateModel } from \"./crud/TaskLogPrivateModel.js\";\nimport { BackgroundTaskSettingsModel } from \"./models/BackgroundTaskSettingsModel.js\";\nimport { TaskModelProvider } from \"./domain/task/TaskModelProvider.js\";\nimport { TaskLogModelProvider } from \"./domain/task/TaskLogModelProvider.js\";\nimport { TasksRepository } from \"./domain/task/TasksRepository.js\";\nimport { TaskLogsRepository } from \"./domain/task/TaskLogsRepository.js\";\nimport { TaskExecutionContextFeature } from \"./features/TaskExecutionContext/feature.js\";\nimport { TaskHandlerResolverFeature } from \"./features/TaskHandlerResolver/feature.js\";\nimport { GetRunnableTaskDefinitionFeature } from \"./features/GetRunnableTaskDefinition/feature.js\";\nimport { ListTaskDefinitionsFeature } from \"./features/ListTaskDefinitions/feature.js\";\nimport { CleanupTaskSubtreeFeature } from \"./features/CleanupTaskSubtree/index.js\";\nimport { CreateTaskFeature } from \"./features/CreateTask/index.js\";\nimport { UpdateTaskFeature } from \"./features/UpdateTask/index.js\";\nimport { DeleteTaskFeature } from \"./features/DeleteTask/index.js\";\nimport { BackgroundTaskServiceFeature } from \"./features/TaskService/index.js\";\nimport { CreateTaskLogFeature } from \"./features/CreateTaskLog/index.js\";\nimport { UpdateTaskLogFeature } from \"./features/UpdateTaskLog/index.js\";\nimport { DeleteTaskLogFeature } from \"./features/DeleteTaskLog/index.js\";\nimport { GetLatestTaskLogFeature } from \"./features/GetLatestTaskLog/index.js\";\nimport { ListTaskLogsFeature } from \"./features/ListTaskLogs/index.js\";\nimport { TriggerTaskFeature } from \"./features/TriggerTask/feature.js\";\nimport { AbortTaskFeature } from \"./features/AbortTask/feature.js\";\nimport { GetTaskFeature } from \"./features/GetTask/feature.js\";\nimport { ListTasksFeature } from \"./features/ListTasks/feature.js\";\nimport { TestingRunTaskDefinition } from \"./tasks/testingRunTask.js\";\nimport { BackgroundTaskPermissionsFeature } from \"./features/BackgroundTaskPermissions/feature.js\";\nimport { GetBackgroundTaskSettingsFeature } from \"./features/GetBackgroundTaskSettings/feature.js\";\nimport { UpdateBackgroundTaskSettingsFeature } from \"./features/UpdateBackgroundTaskSettings/feature.js\";\nimport { BackgroundTasksGraphQLSchema } from \"./graphql/BackgroundTasksGraphQLSchema.js\";\n\nexport const BackgroundTasksFeature = createFeature({\n name: \"BackgroundTasks\",\n register(container) {\n // Register models at register() time so they are available to GetModelUseCase when the\n // ModelsFetcher cache is first filled (which may happen during an earlier feature's enhance).\n container.register(TaskPrivateModel);\n container.register(TaskLogPrivateModel);\n container.register(BackgroundTaskSettingsModel);\n\n // Metadata rules, applied to every registered TaskDefinition.\n container.registerDecorator(TaskDefinitionDefaultsDecorator);\n\n // Self-cleanup runs in the lifecycle hooks, which belong to the handler. Applied when the\n // runner resolves the handler a definition names.\n container.registerDecorator(SelfCleaningTaskHandlerDecorator);\n\n // Task definition use cases.\n TaskHandlerResolverFeature.register(container);\n GetRunnableTaskDefinitionFeature.register(container);\n ListTaskDefinitionsFeature.register(container);\n\n // Task and log storage.\n container.register(TaskModelProvider);\n container.register(TaskLogModelProvider);\n container.register(TasksRepository);\n container.register(TaskLogsRepository);\n\n // Task use cases, and the public TaskService (trigger, abort, service info) on top of them.\n GetTaskFeature.register(container);\n ListTasksFeature.register(container);\n CreateTaskFeature.register(container);\n UpdateTaskFeature.register(container);\n DeleteTaskFeature.register(container);\n CleanupTaskSubtreeFeature.register(container);\n CreateTaskLogFeature.register(container);\n UpdateTaskLogFeature.register(container);\n DeleteTaskLogFeature.register(container);\n GetLatestTaskLogFeature.register(container);\n ListTaskLogsFeature.register(container);\n BackgroundTaskServiceFeature.register(container);\n TriggerTaskFeature.register(container);\n AbortTaskFeature.register(container);\n\n // Execution context (singleton), controller, and the built-in test task.\n TaskExecutionContextFeature.register(container);\n container.register(TaskController);\n container.register(TestingRunTaskDefinition);\n\n // Permissions + settings features.\n BackgroundTaskPermissionsFeature.register(container);\n GetBackgroundTaskSettingsFeature.register(container);\n UpdateBackgroundTaskSettingsFeature.register(container);\n\n // GraphQL schema, rendered from the CMS task/log content models.\n container.register(BackgroundTasksGraphQLSchema);\n }\n});\n"],"names":["BackgroundTasksFeature","createFeature","container","TaskPrivateModel","TaskLogPrivateModel","BackgroundTaskSettingsModel","TaskDefinitionDefaultsDecorator","SelfCleaningTaskHandlerDecorator","TaskHandlerResolverFeature","GetRunnableTaskDefinitionFeature","ListTaskDefinitionsFeature","TaskModelProvider","TaskLogModelProvider","TasksRepository","TaskLogsRepository","GetTaskFeature","ListTasksFeature","CreateTaskFeature","UpdateTaskFeature","DeleteTaskFeature","CleanupTaskSubtreeFeature","CreateTaskLogFeature","UpdateTaskLogFeature","DeleteTaskLogFeature","GetLatestTaskLogFeature","ListTaskLogsFeature","BackgroundTaskServiceFeature","TriggerTaskFeature","AbortTaskFeature","TaskExecutionContextFeature","TaskController","TestingRunTaskDefinition","BackgroundTaskPermissionsFeature","GetBackgroundTaskSettingsFeature","UpdateBackgroundTaskSettingsFeature","BackgroundTasksGraphQLSchema"],"mappings":"
|
|
1
|
+
{"version":3,"file":"api/BackgroundTasksFeature.js","sources":["../../src/api/BackgroundTasksFeature.ts"],"sourcesContent":["import { createFeature } from \"@webiny/feature/api\";\nimport { TaskDefinitionDefaultsDecorator } from \"./decorators/TaskDefinitionDefaultsDecorator.js\";\nimport { SelfCleaningTaskHandlerDecorator } from \"./decorators/SelfCleaningTaskHandlerDecorator.js\";\nimport { TaskController } from \"./features/TaskController/index.js\";\nimport { TaskPrivateModel } from \"./crud/TaskPrivateModel.js\";\nimport { TaskLogPrivateModel } from \"./crud/TaskLogPrivateModel.js\";\nimport { BackgroundTaskSettingsModel } from \"./models/BackgroundTaskSettingsModel.js\";\nimport { TaskModelProvider } from \"./domain/task/TaskModelProvider.js\";\nimport { TaskLogModelProvider } from \"./domain/task/TaskLogModelProvider.js\";\nimport { TasksRepository } from \"./domain/task/TasksRepository.js\";\nimport { TaskLogsRepository } from \"./domain/task/TaskLogsRepository.js\";\nimport { TaskExecutionContextFeature } from \"./features/TaskExecutionContext/feature.js\";\nimport { TaskHandlerResolverFeature } from \"./features/TaskHandlerResolver/feature.js\";\nimport { GetRunnableTaskDefinitionFeature } from \"./features/GetRunnableTaskDefinition/feature.js\";\nimport { ListTaskDefinitionsFeature } from \"./features/ListTaskDefinitions/feature.js\";\nimport { CleanupTaskSubtreeFeature } from \"./features/CleanupTaskSubtree/index.js\";\nimport { CreateTaskFeature } from \"./features/CreateTask/index.js\";\nimport { UpdateTaskFeature } from \"./features/UpdateTask/index.js\";\nimport { DeleteTaskFeature } from \"./features/DeleteTask/index.js\";\nimport { BackgroundTaskServiceFeature } from \"./features/TaskService/index.js\";\nimport { CreateTaskLogFeature } from \"./features/CreateTaskLog/index.js\";\nimport { UpdateTaskLogFeature } from \"./features/UpdateTaskLog/index.js\";\nimport { DeleteTaskLogFeature } from \"./features/DeleteTaskLog/index.js\";\nimport { GetLatestTaskLogFeature } from \"./features/GetLatestTaskLog/index.js\";\nimport { ListTaskLogsFeature } from \"./features/ListTaskLogs/index.js\";\nimport { TriggerTaskFeature } from \"./features/TriggerTask/feature.js\";\nimport { AbortTaskFeature } from \"./features/AbortTask/feature.js\";\nimport { GetTaskFeature } from \"./features/GetTask/feature.js\";\nimport { TriggerVisibleTaskFeature } from \"./features/TriggerVisibleTask/feature.js\";\nimport { ListVisibleTaskDefinitionsFeature } from \"./features/ListVisibleTaskDefinitions/feature.js\";\nimport { ListTasksFeature } from \"./features/ListTasks/feature.js\";\nimport { TestingRunTaskDefinition } from \"./tasks/testingRunTask.js\";\nimport { BackgroundTaskPermissionsFeature } from \"./features/BackgroundTaskPermissions/feature.js\";\nimport { GetBackgroundTaskSettingsFeature } from \"./features/GetBackgroundTaskSettings/feature.js\";\nimport { UpdateBackgroundTaskSettingsFeature } from \"./features/UpdateBackgroundTaskSettings/feature.js\";\nimport { BackgroundTasksGraphQLSchema } from \"./graphql/BackgroundTasksGraphQLSchema.js\";\n\nexport const BackgroundTasksFeature = createFeature({\n name: \"BackgroundTasks\",\n register(container) {\n // Register models at register() time so they are available to GetModelUseCase when the\n // ModelsFetcher cache is first filled (which may happen during an earlier feature's enhance).\n container.register(TaskPrivateModel);\n container.register(TaskLogPrivateModel);\n container.register(BackgroundTaskSettingsModel);\n\n // Metadata rules, applied to every registered TaskDefinition.\n container.registerDecorator(TaskDefinitionDefaultsDecorator);\n\n // Self-cleanup runs in the lifecycle hooks, which belong to the handler. Applied when the\n // runner resolves the handler a definition names.\n container.registerDecorator(SelfCleaningTaskHandlerDecorator);\n\n // Task definition use cases.\n TaskHandlerResolverFeature.register(container);\n GetRunnableTaskDefinitionFeature.register(container);\n ListTaskDefinitionsFeature.register(container);\n\n // Task and log storage.\n container.register(TaskModelProvider);\n container.register(TaskLogModelProvider);\n container.register(TasksRepository);\n container.register(TaskLogsRepository);\n\n // Task use cases, and the public TaskService (trigger, abort, service info) on top of them.\n GetTaskFeature.register(container);\n ListTasksFeature.register(container);\n CreateTaskFeature.register(container);\n UpdateTaskFeature.register(container);\n DeleteTaskFeature.register(container);\n CleanupTaskSubtreeFeature.register(container);\n CreateTaskLogFeature.register(container);\n UpdateTaskLogFeature.register(container);\n DeleteTaskLogFeature.register(container);\n GetLatestTaskLogFeature.register(container);\n ListTaskLogsFeature.register(container);\n BackgroundTaskServiceFeature.register(container);\n TriggerTaskFeature.register(container);\n AbortTaskFeature.register(container);\n\n // The GraphQL API's use cases: private definitions cannot be started or listed; their\n // runs are visible like any other.\n TriggerVisibleTaskFeature.register(container);\n ListVisibleTaskDefinitionsFeature.register(container);\n\n // Execution context (singleton), controller, and the built-in test task.\n TaskExecutionContextFeature.register(container);\n container.register(TaskController);\n container.register(TestingRunTaskDefinition);\n\n // Permissions + settings features.\n BackgroundTaskPermissionsFeature.register(container);\n GetBackgroundTaskSettingsFeature.register(container);\n UpdateBackgroundTaskSettingsFeature.register(container);\n\n // GraphQL schema, rendered from the CMS task/log content models.\n container.register(BackgroundTasksGraphQLSchema);\n }\n});\n"],"names":["BackgroundTasksFeature","createFeature","container","TaskPrivateModel","TaskLogPrivateModel","BackgroundTaskSettingsModel","TaskDefinitionDefaultsDecorator","SelfCleaningTaskHandlerDecorator","TaskHandlerResolverFeature","GetRunnableTaskDefinitionFeature","ListTaskDefinitionsFeature","TaskModelProvider","TaskLogModelProvider","TasksRepository","TaskLogsRepository","GetTaskFeature","ListTasksFeature","CreateTaskFeature","UpdateTaskFeature","DeleteTaskFeature","CleanupTaskSubtreeFeature","CreateTaskLogFeature","UpdateTaskLogFeature","DeleteTaskLogFeature","GetLatestTaskLogFeature","ListTaskLogsFeature","BackgroundTaskServiceFeature","TriggerTaskFeature","AbortTaskFeature","TriggerVisibleTaskFeature","ListVisibleTaskDefinitionsFeature","TaskExecutionContextFeature","TaskController","TestingRunTaskDefinition","BackgroundTaskPermissionsFeature","GetBackgroundTaskSettingsFeature","UpdateBackgroundTaskSettingsFeature","BackgroundTasksGraphQLSchema"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAqCO,MAAMA,yBAAyBC,cAAc;IAChD,MAAM;IACN,UAASC,SAAS;QAGdA,UAAU,QAAQ,CAACC;QACnBD,UAAU,QAAQ,CAACE;QACnBF,UAAU,QAAQ,CAACG;QAGnBH,UAAU,iBAAiB,CAACI;QAI5BJ,UAAU,iBAAiB,CAACK;QAG5BC,2BAA2B,QAAQ,CAACN;QACpCO,iCAAiC,QAAQ,CAACP;QAC1CQ,2BAA2B,QAAQ,CAACR;QAGpCA,UAAU,QAAQ,CAACS;QACnBT,UAAU,QAAQ,CAACU;QACnBV,UAAU,QAAQ,CAACW;QACnBX,UAAU,QAAQ,CAACY;QAGnBC,eAAe,QAAQ,CAACb;QACxBc,iBAAiB,QAAQ,CAACd;QAC1Be,kBAAkB,QAAQ,CAACf;QAC3BgB,kBAAkB,QAAQ,CAAChB;QAC3BiB,kBAAkB,QAAQ,CAACjB;QAC3BkB,0BAA0B,QAAQ,CAAClB;QACnCmB,qBAAqB,QAAQ,CAACnB;QAC9BoB,qBAAqB,QAAQ,CAACpB;QAC9BqB,qBAAqB,QAAQ,CAACrB;QAC9BsB,wBAAwB,QAAQ,CAACtB;QACjCuB,oBAAoB,QAAQ,CAACvB;QAC7BwB,6BAA6B,QAAQ,CAACxB;QACtCyB,mBAAmB,QAAQ,CAACzB;QAC5B0B,iBAAiB,QAAQ,CAAC1B;QAI1B2B,0BAA0B,QAAQ,CAAC3B;QACnC4B,kCAAkC,QAAQ,CAAC5B;QAG3C6B,4BAA4B,QAAQ,CAAC7B;QACrCA,UAAU,QAAQ,CAAC8B;QACnB9B,UAAU,QAAQ,CAAC+B;QAGnBC,iCAAiC,QAAQ,CAAChC;QAC1CiC,iCAAiC,QAAQ,CAACjC;QAC1CkC,oCAAoC,QAAQ,CAAClC;QAG7CA,UAAU,QAAQ,CAACmC;IACvB;AACJ"}
|
|
@@ -20,7 +20,7 @@ export declare class SelfCleaningTaskHandlerDecoratorImpl implements TaskHandler
|
|
|
20
20
|
get run(): (params: import("@webiny/api-core/features/task/TaskDefinition/abstractions").ITaskRunParams<import("@webiny/api-core/features/task/TaskDefinition/abstractions").ITaskInput, import("@webiny/api-core/features/task/TaskDefinition/abstractions").ITaskOutput>) => Promise<import("@webiny/api-core/features/task/TaskDefinition/abstractions").ITaskResult<import("@webiny/api-core/features/task/TaskDefinition/abstractions").ITaskInput, import("@webiny/api-core/features/task/TaskDefinition/abstractions").ITaskOutput>>;
|
|
21
21
|
get onBeforeTrigger(): ((params: import("@webiny/api-core/features/task/TaskDefinition/abstractions").ITaskBeforeTriggerParams<import("@webiny/api-core/features/task/TaskDefinition/abstractions").ITaskInput>) => Promise<void>) | undefined;
|
|
22
22
|
get onMaxIterations(): ((params: import("@webiny/api-core/features/task/TaskDefinition/abstractions").ITaskLifecycleHook<import("@webiny/api-core/features/task/TaskDefinition/abstractions").ITaskInput, import("@webiny/api-core/features/task/TaskDefinition/abstractions").ITaskOutput>) => Promise<void>) | undefined;
|
|
23
|
-
get createInputValidation(): ((params: import("@webiny/api-core/features/task/TaskDefinition/abstractions").ITaskCreateInputValidationParams) => import("@webiny/api/types").GenericRecord<PropertyKey, import("zod").
|
|
23
|
+
get createInputValidation(): ((params: import("@webiny/api-core/features/task/TaskDefinition/abstractions").ITaskCreateInputValidationParams) => import("@webiny/api/types").GenericRecord<PropertyKey, import("zod").Schema<unknown, unknown, import("zod/v4/core").$ZodTypeInternals<unknown, unknown>>> | import("zod").Schema<unknown, unknown, import("zod/v4/core").$ZodTypeInternals<unknown, unknown>>) | undefined;
|
|
24
24
|
get onDone(): (params: HookParams) => Promise<void>;
|
|
25
25
|
get onError(): (params: HookParams) => Promise<void>;
|
|
26
26
|
get onAbort(): (params: HookParams) => Promise<void>;
|
|
@@ -2,19 +2,19 @@ import { Logger } from "@webiny/api-core/features/logger/index.js";
|
|
|
2
2
|
import { CleanupTaskSubtreeUseCase as UseCaseAbstraction } from "./abstractions.js";
|
|
3
3
|
import { TaskLogsRepository, TasksRepository } from "../../../api/domain/task/abstractions.js";
|
|
4
4
|
import { DeleteTaskUseCase } from "../../../api/features/DeleteTask/index.js";
|
|
5
|
-
import { GetRunnableTaskDefinitionUseCase } from "../../../api/features/GetRunnableTaskDefinition/index.js";
|
|
6
5
|
/**
|
|
7
|
-
* Deletes the task identified by `rootId`, all its descendants, and their logs
|
|
8
|
-
*
|
|
9
|
-
*
|
|
6
|
+
* Deletes the task identified by `rootId`, all its descendants, and their logs. The logs are listed
|
|
7
|
+
* by task id whatever the owning definition says (`databaseLogs`, or no registered definition): a
|
|
8
|
+
* self-cleaning task writes none of its own, but an abort still writes one log row, and cleanup
|
|
9
|
+
* removes whatever exists. Bottom-up and best-effort: a record that fails to delete is logged and
|
|
10
|
+
* skipped, and the use case never throws.
|
|
10
11
|
*/
|
|
11
12
|
declare class CleanupTaskSubtreeUseCaseImpl implements UseCaseAbstraction.Interface {
|
|
12
13
|
private readonly tasks;
|
|
13
14
|
private readonly logs;
|
|
14
15
|
private readonly deleteTask;
|
|
15
|
-
private readonly getDefinition;
|
|
16
16
|
private readonly logger;
|
|
17
|
-
constructor(tasks: TasksRepository.Interface, logs: TaskLogsRepository.Interface, deleteTask: DeleteTaskUseCase.Interface,
|
|
17
|
+
constructor(tasks: TasksRepository.Interface, logs: TaskLogsRepository.Interface, deleteTask: DeleteTaskUseCase.Interface, logger: Logger.Interface);
|
|
18
18
|
execute(rootId: string): Promise<void>;
|
|
19
19
|
private collectSubtree;
|
|
20
20
|
private listChildren;
|
|
@@ -2,14 +2,12 @@ import { Logger } from "@webiny/api-core/features/logger/index.js";
|
|
|
2
2
|
import { CleanupTaskSubtreeUseCase } from "./abstractions.js";
|
|
3
3
|
import { TaskLogsRepository, TasksRepository } from "../../domain/task/abstractions.js";
|
|
4
4
|
import { DeleteTaskUseCase } from "../DeleteTask/index.js";
|
|
5
|
-
import { GetRunnableTaskDefinitionUseCase } from "../GetRunnableTaskDefinition/index.js";
|
|
6
5
|
const PAGE_SIZE = 100;
|
|
7
6
|
class CleanupTaskSubtreeUseCaseImpl {
|
|
8
|
-
constructor(tasks, logs, deleteTask,
|
|
7
|
+
constructor(tasks, logs, deleteTask, logger){
|
|
9
8
|
this.tasks = tasks;
|
|
10
9
|
this.logs = logs;
|
|
11
10
|
this.deleteTask = deleteTask;
|
|
12
|
-
this.getDefinition = getDefinition;
|
|
13
11
|
this.logger = logger;
|
|
14
12
|
}
|
|
15
13
|
async execute(rootId) {
|
|
@@ -88,8 +86,6 @@ class CleanupTaskSubtreeUseCaseImpl {
|
|
|
88
86
|
return logs;
|
|
89
87
|
}
|
|
90
88
|
async deleteTaskLogs(task) {
|
|
91
|
-
const definition = this.getDefinition.execute(task.definitionId);
|
|
92
|
-
if (definition.isFail() || true !== definition.value.databaseLogs) return;
|
|
93
89
|
let logs;
|
|
94
90
|
try {
|
|
95
91
|
logs = await this.listLogs(task.id);
|
|
@@ -113,7 +109,6 @@ const CleanupTaskSubtreeUseCase_CleanupTaskSubtreeUseCase = CleanupTaskSubtreeUs
|
|
|
113
109
|
TasksRepository,
|
|
114
110
|
TaskLogsRepository,
|
|
115
111
|
DeleteTaskUseCase,
|
|
116
|
-
GetRunnableTaskDefinitionUseCase,
|
|
117
112
|
Logger
|
|
118
113
|
]
|
|
119
114
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"api/features/CleanupTaskSubtree/CleanupTaskSubtreeUseCase.js","sources":["../../../../src/api/features/CleanupTaskSubtree/CleanupTaskSubtreeUseCase.ts"],"sourcesContent":["import { Logger } from \"@webiny/api-core/features/logger/index.js\";\nimport { CleanupTaskSubtreeUseCase as UseCaseAbstraction } from \"./abstractions.js\";\nimport { TaskLogsRepository, TasksRepository } from \"~/api/domain/task/abstractions.js\";\nimport { DeleteTaskUseCase } from \"~/api/features/DeleteTask/index.js\";\nimport
|
|
1
|
+
{"version":3,"file":"api/features/CleanupTaskSubtree/CleanupTaskSubtreeUseCase.js","sources":["../../../../src/api/features/CleanupTaskSubtree/CleanupTaskSubtreeUseCase.ts"],"sourcesContent":["import { Logger } from \"@webiny/api-core/features/logger/index.js\";\nimport { CleanupTaskSubtreeUseCase as UseCaseAbstraction } from \"./abstractions.js\";\nimport { TaskLogsRepository, TasksRepository } from \"~/api/domain/task/abstractions.js\";\nimport { DeleteTaskUseCase } from \"~/api/features/DeleteTask/index.js\";\nimport type { ITask } from \"~/api/types.js\";\nimport type { ITaskLog } from \"~/api/types.js\";\nimport type { IListTaskParams } from \"~/api/types.js\";\nimport type { IListTaskLogParams } from \"~/api/types.js\";\n\nconst PAGE_SIZE = 100;\n\n/**\n * Deletes the task identified by `rootId`, all its descendants, and their logs. The logs are listed\n * by task id whatever the owning definition says (`databaseLogs`, or no registered definition): a\n * self-cleaning task writes none of its own, but an abort still writes one log row, and cleanup\n * removes whatever exists. Bottom-up and best-effort: a record that fails to delete is logged and\n * skipped, and the use case never throws.\n */\nclass CleanupTaskSubtreeUseCaseImpl implements UseCaseAbstraction.Interface {\n public constructor(\n private readonly tasks: TasksRepository.Interface,\n private readonly logs: TaskLogsRepository.Interface,\n private readonly deleteTask: DeleteTaskUseCase.Interface,\n private readonly logger: Logger.Interface\n ) {}\n\n public async execute(rootId: string): Promise<void> {\n let ordered: ITask[];\n try {\n ordered = await this.collectSubtree(rootId);\n } catch (error) {\n // Without the full subtree, deleting anything could orphan the tasks we didn't find.\n this.logger.warn(\n { error },\n `cleanupTaskSubtree: failed to collect the subtree of task \"${rootId}\", skipping.`\n );\n return;\n }\n for (const task of ordered) {\n await this.deleteTaskLogs(task);\n const result = await this.deleteTask.execute(task.id);\n if (result.isFail()) {\n this.logger.warn(\n { error: result.error },\n `cleanupTaskSubtree: failed to delete task \"${task.id}\".`\n );\n }\n }\n }\n\n // Breadth-first from the root, then reversed, so children are deleted before their parents.\n private async collectSubtree(rootId: string): Promise<ITask[]> {\n const root = await this.tasks.get(rootId);\n if (root.isFail()) {\n return [];\n }\n const order: ITask[] = [root.value];\n const seen = new Set<string>([root.value.id]);\n let i = 0;\n while (i < order.length) {\n const current = order[i++];\n for (const child of await this.listChildren(current.id)) {\n if (seen.has(child.id)) {\n continue;\n }\n seen.add(child.id);\n order.push(child);\n }\n }\n return order.reverse();\n }\n\n // Every page, not just the first: a parent can have more children than one page holds.\n private async listChildren(parentId: string): Promise<ITask[]> {\n const children: ITask[] = [];\n let after: string | null = null;\n do {\n const params: IListTaskParams = { where: { parentId }, limit: PAGE_SIZE, after };\n const result = await this.tasks.list(params);\n if (result.isFail()) {\n throw result.error;\n }\n const { items, meta } = result.value;\n children.push(...items);\n after = meta.hasMoreItems ? meta.cursor : null;\n } while (after);\n return children;\n }\n\n // All pages are read before anything is deleted, so deleting doesn't shift what a cursor sees.\n private async listLogs(taskId: string): Promise<ITaskLog[]> {\n const logs: ITaskLog[] = [];\n let after: string | null = null;\n do {\n const params: IListTaskLogParams = { where: { task: taskId }, limit: PAGE_SIZE, after };\n const result = await this.logs.list(params);\n if (result.isFail()) {\n throw result.error;\n }\n const { items, meta } = result.value;\n logs.push(...items);\n after = meta.hasMoreItems ? meta.cursor : null;\n } while (after);\n return logs;\n }\n\n private async deleteTaskLogs(task: ITask): Promise<void> {\n let logs: ITaskLog[];\n try {\n logs = await this.listLogs(task.id);\n } catch (error) {\n this.logger.warn(\n { error },\n `cleanupTaskSubtree: failed to list logs for task \"${task.id}\".`\n );\n return;\n }\n for (const log of logs) {\n const result = await this.logs.delete(log.id);\n if (result.isFail()) {\n this.logger.warn(\n { error: result.error },\n `cleanupTaskSubtree: failed to delete log \"${log.id}\" for task \"${task.id}\".`\n );\n }\n }\n }\n}\n\nexport const CleanupTaskSubtreeUseCase = UseCaseAbstraction.createImplementation({\n implementation: CleanupTaskSubtreeUseCaseImpl,\n dependencies: [TasksRepository, TaskLogsRepository, DeleteTaskUseCase, Logger]\n});\n"],"names":["PAGE_SIZE","CleanupTaskSubtreeUseCaseImpl","tasks","logs","deleteTask","logger","rootId","ordered","error","task","result","root","order","seen","Set","i","current","child","parentId","children","after","params","items","meta","taskId","log","CleanupTaskSubtreeUseCase","UseCaseAbstraction","TasksRepository","TaskLogsRepository","DeleteTaskUseCase","Logger"],"mappings":"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"}
|
|
@@ -8,8 +8,8 @@ import { TaskInputValidationError } from "../../domain/errors.js";
|
|
|
8
8
|
import { TaskAfterCreateEvent, TaskBeforeCreateEvent } from "../../events/index.js";
|
|
9
9
|
const toZodSchema = (schema)=>{
|
|
10
10
|
if (!schema) return zod.looseObject({});
|
|
11
|
-
if (schema instanceof zod.ZodObject) return schema.loose();
|
|
12
|
-
if (schema instanceof zod.ZodType) return schema;
|
|
11
|
+
else if (schema instanceof zod.ZodObject) return schema.loose();
|
|
12
|
+
else if (schema instanceof zod.ZodType) return schema;
|
|
13
13
|
return zod.looseObject(schema);
|
|
14
14
|
};
|
|
15
15
|
const validateInput = async (definition, input)=>{
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"api/features/CreateTask/CreateTaskUseCase.js","sources":["../../../../src/api/features/CreateTask/CreateTaskUseCase.ts"],"sourcesContent":["import zod from \"zod\";\nimport { Result } from \"@webiny/feature/api\";\nimport type { GenericRecord } from \"@webiny/api/types.js\";\nimport { EventPublisher } from \"@webiny/api-core/features/eventPublisher/index.js\";\nimport type { TaskDefinition } from \"@webiny/api-core/features/task/TaskDefinition/index.js\";\nimport type { TaskService } from \"@webiny/api-core/features/task/TaskService/index.js\";\nimport { CreateTaskUseCase as UseCaseAbstraction } from \"./abstractions.js\";\nimport { GetRunnableTaskDefinitionUseCase } from \"~/api/features/GetRunnableTaskDefinition/index.js\";\nimport { TasksRepository } from \"~/api/domain/task/abstractions.js\";\nimport { TaskInputValidationError } from \"~/api/domain/errors.js\";\nimport { TaskAfterCreateEvent, TaskBeforeCreateEvent } from \"~/api/events/index.js\";\n\ntype InputSchema = GenericRecord<string, zod.ZodTypeAny> | zod.ZodTypeAny;\n\nconst toZodSchema = (schema: InputSchema) => {\n if (!schema) {\n return zod.looseObject({});\n } else if (schema instanceof zod.ZodObject) {\n return schema.loose();\n } else if (schema instanceof zod.ZodType) {\n return schema;\n }\n return zod.looseObject(schema);\n};\n\nconst validateInput = async (\n definition: Pick<TaskDefinition.Runnable, \"createInputValidation\">,\n input: unknown\n): Promise<zod.ZodError | null> => {\n if (!definition.createInputValidation) {\n return null;\n }\n const schema = toZodSchema(definition.createInputValidation({ validator: zod }));\n const result = await schema.safeParseAsync(input);\n return result.success ? null : result.error;\n};\n\nclass CreateTaskUseCaseImpl implements UseCaseAbstraction.Interface {\n constructor(\n private readonly getDefinition: GetRunnableTaskDefinitionUseCase.Interface,\n private readonly eventPublisher: EventPublisher.Interface,\n private readonly repository: TasksRepository.Interface\n ) {}\n\n async execute<I extends TaskService.TaskInput = TaskService.TaskInput>(\n data: UseCaseAbstraction.Params<I>\n ): Promise<Result<TaskService.Task<I>, UseCaseAbstraction.Error>> {\n const definition = this.getDefinition.execute(data.definitionId);\n if (definition.isFail()) {\n return Result.fail(definition.error);\n }\n\n const invalid = await validateInput(definition.value, data.input);\n if (invalid) {\n return Result.fail(new TaskInputValidationError(invalid));\n }\n\n await this.eventPublisher.publish(new TaskBeforeCreateEvent({ input: data }));\n\n const result = await this.repository.create<I>(data);\n if (result.isFail()) {\n return Result.fail(result.error);\n }\n\n await this.eventPublisher.publish(\n new TaskAfterCreateEvent({ input: data, task: result.value })\n );\n\n return Result.ok(result.value);\n }\n}\n\nexport const CreateTaskUseCase = UseCaseAbstraction.createImplementation({\n implementation: CreateTaskUseCaseImpl,\n dependencies: [GetRunnableTaskDefinitionUseCase, EventPublisher, TasksRepository]\n});\n"],"names":["toZodSchema","schema","zod","validateInput","definition","input","result","CreateTaskUseCaseImpl","getDefinition","eventPublisher","repository","data","Result","invalid","TaskInputValidationError","TaskBeforeCreateEvent","TaskAfterCreateEvent","CreateTaskUseCase","UseCaseAbstraction","GetRunnableTaskDefinitionUseCase","EventPublisher","TasksRepository"],"mappings":";;;;;;;;AAcA,MAAMA,cAAc,CAACC;IACjB,IAAI,CAACA,QACD,OAAOC,IAAI,WAAW,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"api/features/CreateTask/CreateTaskUseCase.js","sources":["../../../../src/api/features/CreateTask/CreateTaskUseCase.ts"],"sourcesContent":["import zod from \"zod\";\nimport { Result } from \"@webiny/feature/api\";\nimport type { GenericRecord } from \"@webiny/api/types.js\";\nimport { EventPublisher } from \"@webiny/api-core/features/eventPublisher/index.js\";\nimport type { TaskDefinition } from \"@webiny/api-core/features/task/TaskDefinition/index.js\";\nimport type { TaskService } from \"@webiny/api-core/features/task/TaskService/index.js\";\nimport { CreateTaskUseCase as UseCaseAbstraction } from \"./abstractions.js\";\nimport { GetRunnableTaskDefinitionUseCase } from \"~/api/features/GetRunnableTaskDefinition/index.js\";\nimport { TasksRepository } from \"~/api/domain/task/abstractions.js\";\nimport { TaskInputValidationError } from \"~/api/domain/errors.js\";\nimport { TaskAfterCreateEvent, TaskBeforeCreateEvent } from \"~/api/events/index.js\";\n\ntype InputSchema = GenericRecord<string, zod.ZodTypeAny> | zod.ZodTypeAny;\n\nconst toZodSchema = (schema: InputSchema) => {\n if (!schema) {\n return zod.looseObject({});\n } else if (schema instanceof zod.ZodObject) {\n return schema.loose();\n } else if (schema instanceof zod.ZodType) {\n return schema;\n }\n return zod.looseObject(schema);\n};\n\nconst validateInput = async (\n definition: Pick<TaskDefinition.Runnable, \"createInputValidation\">,\n input: unknown\n): Promise<zod.ZodError | null> => {\n if (!definition.createInputValidation) {\n return null;\n }\n const schema = toZodSchema(definition.createInputValidation({ validator: zod }));\n const result = await schema.safeParseAsync(input);\n return result.success ? null : result.error;\n};\n\nclass CreateTaskUseCaseImpl implements UseCaseAbstraction.Interface {\n constructor(\n private readonly getDefinition: GetRunnableTaskDefinitionUseCase.Interface,\n private readonly eventPublisher: EventPublisher.Interface,\n private readonly repository: TasksRepository.Interface\n ) {}\n\n async execute<I extends TaskService.TaskInput = TaskService.TaskInput>(\n data: UseCaseAbstraction.Params<I>\n ): Promise<Result<TaskService.Task<I>, UseCaseAbstraction.Error>> {\n const definition = this.getDefinition.execute(data.definitionId);\n if (definition.isFail()) {\n return Result.fail(definition.error);\n }\n\n const invalid = await validateInput(definition.value, data.input);\n if (invalid) {\n return Result.fail(new TaskInputValidationError(invalid));\n }\n\n await this.eventPublisher.publish(new TaskBeforeCreateEvent({ input: data }));\n\n const result = await this.repository.create<I>(data);\n if (result.isFail()) {\n return Result.fail(result.error);\n }\n\n await this.eventPublisher.publish(\n new TaskAfterCreateEvent({ input: data, task: result.value })\n );\n\n return Result.ok(result.value);\n }\n}\n\nexport const CreateTaskUseCase = UseCaseAbstraction.createImplementation({\n implementation: CreateTaskUseCaseImpl,\n dependencies: [GetRunnableTaskDefinitionUseCase, EventPublisher, TasksRepository]\n});\n"],"names":["toZodSchema","schema","zod","validateInput","definition","input","result","CreateTaskUseCaseImpl","getDefinition","eventPublisher","repository","data","Result","invalid","TaskInputValidationError","TaskBeforeCreateEvent","TaskAfterCreateEvent","CreateTaskUseCase","UseCaseAbstraction","GetRunnableTaskDefinitionUseCase","EventPublisher","TasksRepository"],"mappings":";;;;;;;;AAcA,MAAMA,cAAc,CAACC;IACjB,IAAI,CAACA,QACD,OAAOC,IAAI,WAAW,CAAC,CAAC;SACrB,IAAID,kBAAkBC,IAAI,SAAS,EACtC,OAAOD,OAAO,KAAK;SAChB,IAAIA,kBAAkBC,IAAI,OAAO,EACpC,OAAOD;IAEX,OAAOC,IAAI,WAAW,CAACD;AAC3B;AAEA,MAAME,gBAAgB,OAClBC,YACAC;IAEA,IAAI,CAACD,WAAW,qBAAqB,EACjC,OAAO;IAEX,MAAMH,SAASD,YAAYI,WAAW,qBAAqB,CAAC;QAAE,WAAWF;IAAI;IAC7E,MAAMI,SAAS,MAAML,OAAO,cAAc,CAACI;IAC3C,OAAOC,OAAO,OAAO,GAAG,OAAOA,OAAO,KAAK;AAC/C;AAEA,MAAMC;IACF,YACqBC,aAAyD,EACzDC,cAAwC,EACxCC,UAAqC,CACxD;aAHmBF,aAAa,GAAbA;aACAC,cAAc,GAAdA;aACAC,UAAU,GAAVA;IAClB;IAEH,MAAM,QACFC,IAAkC,EAC4B;QAC9D,MAAMP,aAAa,IAAI,CAAC,aAAa,CAAC,OAAO,CAACO,KAAK,YAAY;QAC/D,IAAIP,WAAW,MAAM,IACjB,OAAOQ,OAAO,IAAI,CAACR,WAAW,KAAK;QAGvC,MAAMS,UAAU,MAAMV,cAAcC,WAAW,KAAK,EAAEO,KAAK,KAAK;QAChE,IAAIE,SACA,OAAOD,OAAO,IAAI,CAAC,IAAIE,yBAAyBD;QAGpD,MAAM,IAAI,CAAC,cAAc,CAAC,OAAO,CAAC,IAAIE,sBAAsB;YAAE,OAAOJ;QAAK;QAE1E,MAAML,SAAS,MAAM,IAAI,CAAC,UAAU,CAAC,MAAM,CAAIK;QAC/C,IAAIL,OAAO,MAAM,IACb,OAAOM,OAAO,IAAI,CAACN,OAAO,KAAK;QAGnC,MAAM,IAAI,CAAC,cAAc,CAAC,OAAO,CAC7B,IAAIU,qBAAqB;YAAE,OAAOL;YAAM,MAAML,OAAO,KAAK;QAAC;QAG/D,OAAOM,OAAO,EAAE,CAACN,OAAO,KAAK;IACjC;AACJ;AAEO,MAAMW,sCAAoBC,kBAAAA,oBAAuC,CAAC;IACrE,gBAAgBX;IAChB,cAAc;QAACY;QAAkCC;QAAgBC;KAAgB;AACrF"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { ListVisibleTaskDefinitionsUseCase as UseCaseAbstraction } from "./abstractions.js";
|
|
2
|
+
import { ListTaskDefinitionsUseCase } from "../../../api/features/ListTaskDefinitions/abstractions.js";
|
|
3
|
+
declare class ListVisibleTaskDefinitionsUseCaseImpl implements UseCaseAbstraction.Interface {
|
|
4
|
+
private readonly listTaskDefinitions;
|
|
5
|
+
constructor(listTaskDefinitions: ListTaskDefinitionsUseCase.Interface);
|
|
6
|
+
execute(): import("@webiny/api-core/features/task/TaskDefinition/abstractions.js").TaskDefinition.Interface<import("@webiny/api-core/features/task/TaskDefinition/abstractions.js").ITaskInput, import("@webiny/api-core/features/task/TaskDefinition/abstractions.js").ITaskOutput>[];
|
|
7
|
+
}
|
|
8
|
+
export declare const ListVisibleTaskDefinitionsUseCase: typeof ListVisibleTaskDefinitionsUseCaseImpl & {
|
|
9
|
+
__abstraction: import("@webiny/di").Abstraction<import("./abstractions.js").IListVisibleTaskDefinitionsUseCase>;
|
|
10
|
+
};
|
|
11
|
+
export {};
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { ListVisibleTaskDefinitionsUseCase } from "./abstractions.js";
|
|
2
|
+
import { ListTaskDefinitionsUseCase } from "../ListTaskDefinitions/abstractions.js";
|
|
3
|
+
class ListVisibleTaskDefinitionsUseCaseImpl {
|
|
4
|
+
constructor(listTaskDefinitions){
|
|
5
|
+
this.listTaskDefinitions = listTaskDefinitions;
|
|
6
|
+
}
|
|
7
|
+
execute() {
|
|
8
|
+
return this.listTaskDefinitions.execute().filter((definition)=>!definition.isPrivate);
|
|
9
|
+
}
|
|
10
|
+
}
|
|
11
|
+
const ListVisibleTaskDefinitionsUseCase_ListVisibleTaskDefinitionsUseCase = ListVisibleTaskDefinitionsUseCase.createImplementation({
|
|
12
|
+
implementation: ListVisibleTaskDefinitionsUseCaseImpl,
|
|
13
|
+
dependencies: [
|
|
14
|
+
ListTaskDefinitionsUseCase
|
|
15
|
+
]
|
|
16
|
+
});
|
|
17
|
+
export { ListVisibleTaskDefinitionsUseCase_ListVisibleTaskDefinitionsUseCase as ListVisibleTaskDefinitionsUseCase };
|
|
18
|
+
|
|
19
|
+
//# sourceMappingURL=ListVisibleTaskDefinitionsUseCase.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"api/features/ListVisibleTaskDefinitions/ListVisibleTaskDefinitionsUseCase.js","sources":["../../../../src/api/features/ListVisibleTaskDefinitions/ListVisibleTaskDefinitionsUseCase.ts"],"sourcesContent":["import { ListVisibleTaskDefinitionsUseCase as UseCaseAbstraction } from \"./abstractions.js\";\nimport { ListTaskDefinitionsUseCase } from \"~/api/features/ListTaskDefinitions/abstractions.js\";\n\nclass ListVisibleTaskDefinitionsUseCaseImpl implements UseCaseAbstraction.Interface {\n public constructor(\n private readonly listTaskDefinitions: ListTaskDefinitionsUseCase.Interface\n ) {}\n\n public execute() {\n return this.listTaskDefinitions.execute().filter(definition => !definition.isPrivate);\n }\n}\n\nexport const ListVisibleTaskDefinitionsUseCase = UseCaseAbstraction.createImplementation({\n implementation: ListVisibleTaskDefinitionsUseCaseImpl,\n dependencies: [ListTaskDefinitionsUseCase]\n});\n"],"names":["ListVisibleTaskDefinitionsUseCaseImpl","listTaskDefinitions","definition","ListVisibleTaskDefinitionsUseCase","UseCaseAbstraction","ListTaskDefinitionsUseCase"],"mappings":";;AAGA,MAAMA;IACF,YACqBC,mBAAyD,CAC5E;aADmBA,mBAAmB,GAAnBA;IAClB;IAEI,UAAU;QACb,OAAO,IAAI,CAAC,mBAAmB,CAAC,OAAO,GAAG,MAAM,CAACC,CAAAA,aAAc,CAACA,WAAW,SAAS;IACxF;AACJ;AAEO,MAAMC,sEAAoCC,kCAAAA,oBAAuC,CAAC;IACrF,gBAAgBJ;IAChB,cAAc;QAACK;KAA2B;AAC9C"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { TaskDefinition } from "@webiny/api-core/features/task/TaskDefinition/index.js";
|
|
2
|
+
export interface IListVisibleTaskDefinitionsUseCase {
|
|
3
|
+
execute(): TaskDefinition.Interface[];
|
|
4
|
+
}
|
|
5
|
+
/** List task definitions for the GraphQL API, without the private ones. */
|
|
6
|
+
export declare const ListVisibleTaskDefinitionsUseCase: import("@webiny/di").Abstraction<IListVisibleTaskDefinitionsUseCase>;
|
|
7
|
+
export declare namespace ListVisibleTaskDefinitionsUseCase {
|
|
8
|
+
type Interface = IListVisibleTaskDefinitionsUseCase;
|
|
9
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"api/features/ListVisibleTaskDefinitions/abstractions.js","sources":["../../../../src/api/features/ListVisibleTaskDefinitions/abstractions.ts"],"sourcesContent":["import { createAbstraction } from \"@webiny/feature/api\";\nimport { TaskDefinition } from \"@webiny/api-core/features/task/TaskDefinition/index.js\";\n\nexport interface IListVisibleTaskDefinitionsUseCase {\n execute(): TaskDefinition.Interface[];\n}\n\n/** List task definitions for the GraphQL API, without the private ones. */\nexport const ListVisibleTaskDefinitionsUseCase =\n createAbstraction<IListVisibleTaskDefinitionsUseCase>(\n \"Tasks/ListVisibleTaskDefinitionsUseCase\"\n );\n\nexport namespace ListVisibleTaskDefinitionsUseCase {\n export type Interface = IListVisibleTaskDefinitionsUseCase;\n}\n"],"names":["ListVisibleTaskDefinitionsUseCase","createAbstraction"],"mappings":";AAQO,MAAMA,oCACTC,kBACI"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { createFeature } from "@webiny/feature/api";
|
|
2
|
+
import { ListVisibleTaskDefinitionsUseCase } from "./ListVisibleTaskDefinitionsUseCase.js";
|
|
3
|
+
const ListVisibleTaskDefinitionsFeature = createFeature({
|
|
4
|
+
name: "ListVisibleTaskDefinitions",
|
|
5
|
+
register (container) {
|
|
6
|
+
container.register(ListVisibleTaskDefinitionsUseCase);
|
|
7
|
+
}
|
|
8
|
+
});
|
|
9
|
+
export { ListVisibleTaskDefinitionsFeature };
|
|
10
|
+
|
|
11
|
+
//# sourceMappingURL=feature.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"api/features/ListVisibleTaskDefinitions/feature.js","sources":["../../../../src/api/features/ListVisibleTaskDefinitions/feature.ts"],"sourcesContent":["import { createFeature } from \"@webiny/feature/api\";\nimport { ListVisibleTaskDefinitionsUseCase } from \"./ListVisibleTaskDefinitionsUseCase.js\";\n\nexport const ListVisibleTaskDefinitionsFeature = createFeature({\n name: \"ListVisibleTaskDefinitions\",\n register(container) {\n container.register(ListVisibleTaskDefinitionsUseCase);\n }\n});\n"],"names":["ListVisibleTaskDefinitionsFeature","createFeature","container","ListVisibleTaskDefinitionsUseCase"],"mappings":";;AAGO,MAAMA,oCAAoCC,cAAc;IAC3D,MAAM;IACN,UAASC,SAAS;QACdA,UAAU,QAAQ,CAACC;IACvB;AACJ"}
|
|
@@ -18,7 +18,7 @@ const MAX_DELAY_DAYS = 355;
|
|
|
18
18
|
const MAX_DELAY_SECONDS = 24 * MAX_DELAY_DAYS * 3600;
|
|
19
19
|
const validateDelay = (input, delay)=>{
|
|
20
20
|
if (!delay || delay < 0 || false === Number.isInteger(delay)) return;
|
|
21
|
-
if (delay < MAX_DELAY_SECONDS) return;
|
|
21
|
+
else if (delay < MAX_DELAY_SECONDS) return;
|
|
22
22
|
throw new error(`The maximum delay for a task is ${MAX_DELAY_DAYS} days.`, "MAX_DELAY_ERROR", {
|
|
23
23
|
...input,
|
|
24
24
|
delay
|
|
@@ -147,7 +147,7 @@ class BackgroundTaskServiceImpl {
|
|
|
147
147
|
async findTask(id) {
|
|
148
148
|
const result = await this.getTask.execute(id);
|
|
149
149
|
if (result.isOk()) return result.value;
|
|
150
|
-
if (result.error instanceof TaskNotFoundError) return null;
|
|
150
|
+
else if (result.error instanceof TaskNotFoundError) return null;
|
|
151
151
|
throw result.error;
|
|
152
152
|
}
|
|
153
153
|
getTransport() {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"api/features/TaskService/BackgroundTaskService.js","sources":["../../../../src/api/features/TaskService/BackgroundTaskService.ts"],"sourcesContent":["import WebinyError from \"@webiny/error\";\nimport { BaseError, Result } from \"@webiny/feature/api\";\nimport { Logger } from \"@webiny/api-core/features/logger/index.js\";\nimport { TaskService } from \"@webiny/api-core/features/task/TaskService/index.js\";\nimport type {\n IServiceInfo,\n ITaskAbortParams,\n ITaskTriggerParams\n} from \"@webiny/api-core/features/task/TaskService/abstractions.js\";\nimport type { TaskDefinition } from \"@webiny/api-core/features/task/TaskDefinition/index.js\";\nimport { NotFoundError } from \"@webiny/api-graphql\";\nimport { TaskService as TaskTransport } from \"~/api/domain/TaskService.js\";\nimport { GetTaskUseCase } from \"~/api/features/GetTask/index.js\";\nimport { CreateTaskLogUseCase } from \"~/api/features/CreateTaskLog/index.js\";\nimport { GetLatestTaskLogUseCase } from \"~/api/features/GetLatestTaskLog/index.js\";\nimport { UpdateTaskLogUseCase } from \"~/api/features/UpdateTaskLog/index.js\";\nimport { CreateTaskUseCase } from \"~/api/features/CreateTask/index.js\";\nimport { UpdateTaskUseCase } from \"~/api/features/UpdateTask/index.js\";\nimport { DeleteTaskUseCase } from \"~/api/features/DeleteTask/index.js\";\nimport { GetRunnableTaskDefinitionUseCase } from \"~/api/features/GetRunnableTaskDefinition/index.js\";\nimport {\n TaskAbortError,\n TaskDefinitionNotFoundError,\n TaskNotFoundError,\n TaskServiceInfoError\n} from \"~/api/domain/errors.js\";\nimport { TaskDataStatus, TaskLogItemType } from \"~/api/types.js\";\nimport type { ITaskLog } from \"~/api/types.js\";\n\ntype TaskInput = TaskService.TaskInput;\ntype TaskOutput = TaskService.GenericOutput;\n\nconst MAX_DELAY_DAYS = 355;\nconst MAX_DELAY_SECONDS = MAX_DELAY_DAYS * 24 * 60 * 60;\n\nconst validateDelay = (input: TaskDefinition.TaskCreateData<any>, delay: number): void => {\n if (!delay || delay < 0 || Number.isInteger(delay) === false) {\n return;\n } else if (delay < MAX_DELAY_SECONDS) {\n return;\n }\n throw new WebinyError(\n `The maximum delay for a task is ${MAX_DELAY_DAYS} days.`,\n \"MAX_DELAY_ERROR\",\n { ...input, delay }\n );\n};\n\n/**\n * The public TaskService: stores a task and hands it to the transport (Step Functions, the worker),\n * aborts a running task, and reads what the transport knows about one.\n */\nclass BackgroundTaskServiceImpl implements TaskService.Interface {\n constructor(\n private readonly getDefinition: GetRunnableTaskDefinitionUseCase.Interface,\n private readonly createTask: CreateTaskUseCase.Interface,\n private readonly updateTask: UpdateTaskUseCase.Interface,\n private readonly deleteTask: DeleteTaskUseCase.Interface,\n private readonly getTask: GetTaskUseCase.Interface,\n private readonly getLatestTaskLog: GetLatestTaskLogUseCase.Interface,\n private readonly createTaskLog: CreateTaskLogUseCase.Interface,\n private readonly updateTaskLog: UpdateTaskLogUseCase.Interface,\n private readonly transports: TaskTransport.Interface[],\n private readonly logger: Logger.Interface\n ) {}\n\n async trigger<I extends TaskInput = TaskInput, O extends TaskOutput = TaskOutput>(\n params: ITaskTriggerParams<I>\n ): Promise<Result<TaskService.Task<I, O>, BaseError>> {\n const transport = this.getTransport();\n const { definition: id, input: inputValues, name, parent, delay = 0 } = params;\n const definitionResult = this.getDefinition.execute(id);\n if (definitionResult.isFail()) {\n throw new WebinyError(`Task definition was not found!`, \"TASK_DEFINITION_ERROR\", {\n id\n });\n }\n const definition = definitionResult.value;\n const input: TaskDefinition.TaskCreateData<I> = {\n name: name || definition.title,\n definitionId: id,\n input: inputValues || ({} as I),\n parentId: parent?.id\n };\n\n if (definition.onBeforeTrigger) {\n await definition.onBeforeTrigger({ data: input, definition });\n }\n validateDelay(input, delay);\n\n const created = await this.createTask.execute<I>(input);\n if (created.isFail()) {\n this.logger.error({ error: created.error }, \"Could not create the task.\");\n throw created.error;\n }\n const task = created.value;\n\n let response: unknown = null;\n try {\n response = await transport.send(task, delay);\n if (!response) {\n throw new WebinyError(\n `Could not trigger the step function!`,\n \"TRIGGER_STEP_FUNCTION_ERROR\",\n { task }\n );\n }\n } catch (ex) {\n this.logger.error({ error: ex }, \"Could not trigger the step function.\");\n // The task can't run, so don't leave it behind as pending.\n await this.deleteTask.execute(task.id);\n throw ex;\n }\n\n const updated = await this.updateTask.execute<I, O>(task.id, {\n eventResponse: response as Record<string, any>\n });\n if (updated.isFail()) {\n throw updated.error;\n }\n\n return Result.ok(updated.value);\n }\n\n async fetchServiceInfo(\n input: TaskService.Task | string\n ): Promise<Result<IServiceInfo, BaseError>> {\n const transport = this.getTransport();\n const task = typeof input === \"object\" ? input : await this.findTask(input);\n if (!task && typeof input === \"string\") {\n throw new NotFoundError(`Task \"${input}\" was not found!`);\n } else if (!task) {\n throw new WebinyError(`Task was not found!`, \"TASK_FETCH_ERROR\", { input });\n }\n\n try {\n const info = (await transport.fetch(task)) as IServiceInfo | null;\n if (info) {\n return Result.ok(info);\n }\n return Result.fail(new TaskServiceInfoError());\n } catch (ex) {\n this.logger.error({ error: ex }, \"Service fetch error.\");\n return Result.fail(new TaskServiceInfoError());\n }\n }\n\n async abort<I extends TaskInput = TaskInput, O extends TaskOutput = TaskOutput>(\n params: ITaskAbortParams\n ): Promise<Result<TaskService.Task<I, O>, BaseError<any>>> {\n const taskResult = await this.getTask.execute<I, O>(params.id);\n if (taskResult.isFail()) {\n return Result.fail(taskResult.error);\n }\n const task = taskResult.value;\n\n const definitionResult = this.getDefinition.execute<I, O>(task.definitionId);\n if (definitionResult.isFail()) {\n return Result.fail(new TaskDefinitionNotFoundError(task.definitionId));\n }\n const definition = definitionResult.value;\n\n // Only a pending or running task can be aborted.\n if ([TaskDataStatus.PENDING, TaskDataStatus.RUNNING].includes(task.taskStatus) === false) {\n return Result.fail(new TaskAbortError({ id: params.id, status: task.taskStatus }));\n }\n\n const taskLog = await this.getOrCreateLog(task);\n try {\n const updated = await this.updateTask.execute<I, O>(task.id, {\n taskStatus: TaskDataStatus.ABORTED\n });\n if (updated.isFail()) {\n throw updated.error;\n }\n const logUpdate = await this.updateTaskLog.execute(taskLog.id, {\n items: taskLog.items.concat([\n {\n message: params.message || \"Task aborted.\",\n type: TaskLogItemType.INFO,\n createdOn: new Date().toISOString()\n }\n ])\n });\n if (logUpdate.isFail()) {\n throw logUpdate.error;\n }\n // TODO: determine when to kick off the onAbort hook\n if (definition.onAbort) {\n await definition.onAbort({ task: updated.value, definition });\n }\n\n return Result.ok(updated.value);\n } catch (ex) {\n throw new WebinyError(`Could not abort the task!`, \"TASK_ABORT_ERROR\", {\n id: params.id,\n message: ex.message\n });\n }\n }\n\n // A missing task is null; any other failure is thrown, so it isn't mistaken for a missing one.\n private async findTask(id: string): Promise<TaskService.Task | null> {\n const result = await this.getTask.execute(id);\n if (result.isOk()) {\n return result.value;\n } else if (result.error instanceof TaskNotFoundError) {\n return null;\n }\n throw result.error;\n }\n\n private getTransport(): TaskTransport.Interface {\n // The last registration wins, so a test or a deployment can swap the transport.\n const transport = this.transports[this.transports.length - 1];\n if (!transport) {\n throw new WebinyError(\"Missing TaskService.\", \"TASK_SERVICE_ERROR\");\n }\n return transport;\n }\n\n private async getOrCreateLog(task: TaskService.Task<any, any>): Promise<ITaskLog> {\n const latest = await this.getLatestTaskLog.execute(task.id);\n if (latest.isOk()) {\n return latest.value;\n }\n const created = await this.createTaskLog.execute(task, {\n iteration: 1,\n executionName: task.executionName\n });\n if (created.isFail()) {\n throw created.error;\n }\n return created.value;\n }\n}\n\nexport const BackgroundTaskService = TaskService.createImplementation({\n implementation: BackgroundTaskServiceImpl,\n dependencies: [\n GetRunnableTaskDefinitionUseCase,\n CreateTaskUseCase,\n UpdateTaskUseCase,\n DeleteTaskUseCase,\n GetTaskUseCase,\n GetLatestTaskLogUseCase,\n CreateTaskLogUseCase,\n UpdateTaskLogUseCase,\n [TaskTransport, { multiple: true }],\n Logger\n ]\n});\n"],"names":["MAX_DELAY_DAYS","MAX_DELAY_SECONDS","validateDelay","input","delay","Number","WebinyError","BackgroundTaskServiceImpl","getDefinition","createTask","updateTask","deleteTask","getTask","getLatestTaskLog","createTaskLog","updateTaskLog","transports","logger","params","transport","id","inputValues","name","parent","definitionResult","definition","created","task","response","ex","updated","Result","NotFoundError","info","TaskServiceInfoError","taskResult","TaskDefinitionNotFoundError","TaskDataStatus","TaskAbortError","taskLog","logUpdate","TaskLogItemType","Date","result","TaskNotFoundError","latest","BackgroundTaskService","TaskService","GetRunnableTaskDefinitionUseCase","CreateTaskUseCase","UpdateTaskUseCase","DeleteTaskUseCase","GetTaskUseCase","GetLatestTaskLogUseCase","CreateTaskLogUseCase","UpdateTaskLogUseCase","TaskTransport","Logger"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"api/features/TaskService/BackgroundTaskService.js","sources":["../../../../src/api/features/TaskService/BackgroundTaskService.ts"],"sourcesContent":["import WebinyError from \"@webiny/error\";\nimport { BaseError, Result } from \"@webiny/feature/api\";\nimport { Logger } from \"@webiny/api-core/features/logger/index.js\";\nimport { TaskService } from \"@webiny/api-core/features/task/TaskService/index.js\";\nimport type {\n IServiceInfo,\n ITaskAbortParams,\n ITaskTriggerParams\n} from \"@webiny/api-core/features/task/TaskService/abstractions.js\";\nimport type { TaskDefinition } from \"@webiny/api-core/features/task/TaskDefinition/index.js\";\nimport { NotFoundError } from \"@webiny/api-graphql\";\nimport { TaskService as TaskTransport } from \"~/api/domain/TaskService.js\";\nimport { GetTaskUseCase } from \"~/api/features/GetTask/index.js\";\nimport { CreateTaskLogUseCase } from \"~/api/features/CreateTaskLog/index.js\";\nimport { GetLatestTaskLogUseCase } from \"~/api/features/GetLatestTaskLog/index.js\";\nimport { UpdateTaskLogUseCase } from \"~/api/features/UpdateTaskLog/index.js\";\nimport { CreateTaskUseCase } from \"~/api/features/CreateTask/index.js\";\nimport { UpdateTaskUseCase } from \"~/api/features/UpdateTask/index.js\";\nimport { DeleteTaskUseCase } from \"~/api/features/DeleteTask/index.js\";\nimport { GetRunnableTaskDefinitionUseCase } from \"~/api/features/GetRunnableTaskDefinition/index.js\";\nimport {\n TaskAbortError,\n TaskDefinitionNotFoundError,\n TaskNotFoundError,\n TaskServiceInfoError\n} from \"~/api/domain/errors.js\";\nimport { TaskDataStatus, TaskLogItemType } from \"~/api/types.js\";\nimport type { ITaskLog } from \"~/api/types.js\";\n\ntype TaskInput = TaskService.TaskInput;\ntype TaskOutput = TaskService.GenericOutput;\n\nconst MAX_DELAY_DAYS = 355;\nconst MAX_DELAY_SECONDS = MAX_DELAY_DAYS * 24 * 60 * 60;\n\nconst validateDelay = (input: TaskDefinition.TaskCreateData<any>, delay: number): void => {\n if (!delay || delay < 0 || Number.isInteger(delay) === false) {\n return;\n } else if (delay < MAX_DELAY_SECONDS) {\n return;\n }\n throw new WebinyError(\n `The maximum delay for a task is ${MAX_DELAY_DAYS} days.`,\n \"MAX_DELAY_ERROR\",\n { ...input, delay }\n );\n};\n\n/**\n * The public TaskService: stores a task and hands it to the transport (Step Functions, the worker),\n * aborts a running task, and reads what the transport knows about one.\n */\nclass BackgroundTaskServiceImpl implements TaskService.Interface {\n constructor(\n private readonly getDefinition: GetRunnableTaskDefinitionUseCase.Interface,\n private readonly createTask: CreateTaskUseCase.Interface,\n private readonly updateTask: UpdateTaskUseCase.Interface,\n private readonly deleteTask: DeleteTaskUseCase.Interface,\n private readonly getTask: GetTaskUseCase.Interface,\n private readonly getLatestTaskLog: GetLatestTaskLogUseCase.Interface,\n private readonly createTaskLog: CreateTaskLogUseCase.Interface,\n private readonly updateTaskLog: UpdateTaskLogUseCase.Interface,\n private readonly transports: TaskTransport.Interface[],\n private readonly logger: Logger.Interface\n ) {}\n\n async trigger<I extends TaskInput = TaskInput, O extends TaskOutput = TaskOutput>(\n params: ITaskTriggerParams<I>\n ): Promise<Result<TaskService.Task<I, O>, BaseError>> {\n const transport = this.getTransport();\n const { definition: id, input: inputValues, name, parent, delay = 0 } = params;\n const definitionResult = this.getDefinition.execute(id);\n if (definitionResult.isFail()) {\n throw new WebinyError(`Task definition was not found!`, \"TASK_DEFINITION_ERROR\", {\n id\n });\n }\n const definition = definitionResult.value;\n const input: TaskDefinition.TaskCreateData<I> = {\n name: name || definition.title,\n definitionId: id,\n input: inputValues || ({} as I),\n parentId: parent?.id\n };\n\n if (definition.onBeforeTrigger) {\n await definition.onBeforeTrigger({ data: input, definition });\n }\n validateDelay(input, delay);\n\n const created = await this.createTask.execute<I>(input);\n if (created.isFail()) {\n this.logger.error({ error: created.error }, \"Could not create the task.\");\n throw created.error;\n }\n const task = created.value;\n\n let response: unknown = null;\n try {\n response = await transport.send(task, delay);\n if (!response) {\n throw new WebinyError(\n `Could not trigger the step function!`,\n \"TRIGGER_STEP_FUNCTION_ERROR\",\n { task }\n );\n }\n } catch (ex) {\n this.logger.error({ error: ex }, \"Could not trigger the step function.\");\n // The task can't run, so don't leave it behind as pending.\n await this.deleteTask.execute(task.id);\n throw ex;\n }\n\n const updated = await this.updateTask.execute<I, O>(task.id, {\n eventResponse: response as Record<string, any>\n });\n if (updated.isFail()) {\n throw updated.error;\n }\n\n return Result.ok(updated.value);\n }\n\n async fetchServiceInfo(\n input: TaskService.Task | string\n ): Promise<Result<IServiceInfo, BaseError>> {\n const transport = this.getTransport();\n const task = typeof input === \"object\" ? input : await this.findTask(input);\n if (!task && typeof input === \"string\") {\n throw new NotFoundError(`Task \"${input}\" was not found!`);\n } else if (!task) {\n throw new WebinyError(`Task was not found!`, \"TASK_FETCH_ERROR\", { input });\n }\n\n try {\n const info = (await transport.fetch(task)) as IServiceInfo | null;\n if (info) {\n return Result.ok(info);\n }\n return Result.fail(new TaskServiceInfoError());\n } catch (ex) {\n this.logger.error({ error: ex }, \"Service fetch error.\");\n return Result.fail(new TaskServiceInfoError());\n }\n }\n\n async abort<I extends TaskInput = TaskInput, O extends TaskOutput = TaskOutput>(\n params: ITaskAbortParams\n ): Promise<Result<TaskService.Task<I, O>, BaseError<any>>> {\n const taskResult = await this.getTask.execute<I, O>(params.id);\n if (taskResult.isFail()) {\n return Result.fail(taskResult.error);\n }\n const task = taskResult.value;\n\n const definitionResult = this.getDefinition.execute<I, O>(task.definitionId);\n if (definitionResult.isFail()) {\n return Result.fail(new TaskDefinitionNotFoundError(task.definitionId));\n }\n const definition = definitionResult.value;\n\n // Only a pending or running task can be aborted.\n if ([TaskDataStatus.PENDING, TaskDataStatus.RUNNING].includes(task.taskStatus) === false) {\n return Result.fail(new TaskAbortError({ id: params.id, status: task.taskStatus }));\n }\n\n const taskLog = await this.getOrCreateLog(task);\n try {\n const updated = await this.updateTask.execute<I, O>(task.id, {\n taskStatus: TaskDataStatus.ABORTED\n });\n if (updated.isFail()) {\n throw updated.error;\n }\n const logUpdate = await this.updateTaskLog.execute(taskLog.id, {\n items: taskLog.items.concat([\n {\n message: params.message || \"Task aborted.\",\n type: TaskLogItemType.INFO,\n createdOn: new Date().toISOString()\n }\n ])\n });\n if (logUpdate.isFail()) {\n throw logUpdate.error;\n }\n // TODO: determine when to kick off the onAbort hook\n if (definition.onAbort) {\n await definition.onAbort({ task: updated.value, definition });\n }\n\n return Result.ok(updated.value);\n } catch (ex) {\n throw new WebinyError(`Could not abort the task!`, \"TASK_ABORT_ERROR\", {\n id: params.id,\n message: ex.message\n });\n }\n }\n\n // A missing task is null; any other failure is thrown, so it isn't mistaken for a missing one.\n private async findTask(id: string): Promise<TaskService.Task | null> {\n const result = await this.getTask.execute(id);\n if (result.isOk()) {\n return result.value;\n } else if (result.error instanceof TaskNotFoundError) {\n return null;\n }\n throw result.error;\n }\n\n private getTransport(): TaskTransport.Interface {\n // The last registration wins, so a test or a deployment can swap the transport.\n const transport = this.transports[this.transports.length - 1];\n if (!transport) {\n throw new WebinyError(\"Missing TaskService.\", \"TASK_SERVICE_ERROR\");\n }\n return transport;\n }\n\n private async getOrCreateLog(task: TaskService.Task<any, any>): Promise<ITaskLog> {\n const latest = await this.getLatestTaskLog.execute(task.id);\n if (latest.isOk()) {\n return latest.value;\n }\n const created = await this.createTaskLog.execute(task, {\n iteration: 1,\n executionName: task.executionName\n });\n if (created.isFail()) {\n throw created.error;\n }\n return created.value;\n }\n}\n\nexport const BackgroundTaskService = TaskService.createImplementation({\n implementation: BackgroundTaskServiceImpl,\n dependencies: [\n GetRunnableTaskDefinitionUseCase,\n CreateTaskUseCase,\n UpdateTaskUseCase,\n DeleteTaskUseCase,\n GetTaskUseCase,\n GetLatestTaskLogUseCase,\n CreateTaskLogUseCase,\n UpdateTaskLogUseCase,\n [TaskTransport, { multiple: true }],\n Logger\n ]\n});\n"],"names":["MAX_DELAY_DAYS","MAX_DELAY_SECONDS","validateDelay","input","delay","Number","WebinyError","BackgroundTaskServiceImpl","getDefinition","createTask","updateTask","deleteTask","getTask","getLatestTaskLog","createTaskLog","updateTaskLog","transports","logger","params","transport","id","inputValues","name","parent","definitionResult","definition","created","task","response","ex","updated","Result","NotFoundError","info","TaskServiceInfoError","taskResult","TaskDefinitionNotFoundError","TaskDataStatus","TaskAbortError","taskLog","logUpdate","TaskLogItemType","Date","result","TaskNotFoundError","latest","BackgroundTaskService","TaskService","GetRunnableTaskDefinitionUseCase","CreateTaskUseCase","UpdateTaskUseCase","DeleteTaskUseCase","GetTaskUseCase","GetLatestTaskLogUseCase","CreateTaskLogUseCase","UpdateTaskLogUseCase","TaskTransport","Logger"],"mappings":"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"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { Result } from "@webiny/feature/api";
|
|
2
|
+
import { TriggerVisibleTaskUseCase as UseCaseAbstraction } from "./abstractions.js";
|
|
3
|
+
import { TriggerTaskUseCase } from "../../../api/features/TriggerTask/abstractions.js";
|
|
4
|
+
import { GetRunnableTaskDefinitionUseCase } from "../../../api/features/GetRunnableTaskDefinition/abstractions.js";
|
|
5
|
+
import { TaskDefinitionNotFoundError } from "../../../api/domain/errors.js";
|
|
6
|
+
declare class TriggerVisibleTaskUseCaseImpl implements UseCaseAbstraction.Interface {
|
|
7
|
+
private readonly triggerTask;
|
|
8
|
+
private readonly getRunnableTaskDefinition;
|
|
9
|
+
constructor(triggerTask: TriggerTaskUseCase.Interface, getRunnableTaskDefinition: GetRunnableTaskDefinitionUseCase.Interface);
|
|
10
|
+
execute(params: TriggerTaskUseCase.Params): Promise<Result<import("@webiny/api-core/features/task/TaskService/abstractions.js").TaskService.Task<import("@webiny/api-core/features/task/TaskDefinition/abstractions.js").ITaskInput, import("@webiny/api-core/features/task/TaskService/abstractions.js").IGenericOutput>, TaskDefinitionNotFoundError | import("~/api/domain/errors.js").TaskNotFoundError | import("~/api/domain/errors.js").TaskServiceInfoError>>;
|
|
11
|
+
}
|
|
12
|
+
export declare const TriggerVisibleTaskUseCase: typeof TriggerVisibleTaskUseCaseImpl & {
|
|
13
|
+
__abstraction: import("@webiny/di").Abstraction<import("./abstractions.js").ITriggerVisibleTaskUseCase>;
|
|
14
|
+
};
|
|
15
|
+
export {};
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import { Result } from "@webiny/feature/api";
|
|
2
|
+
import { TriggerVisibleTaskUseCase } from "./abstractions.js";
|
|
3
|
+
import { TriggerTaskUseCase } from "../TriggerTask/abstractions.js";
|
|
4
|
+
import { GetRunnableTaskDefinitionUseCase } from "../GetRunnableTaskDefinition/abstractions.js";
|
|
5
|
+
import { TaskDefinitionNotFoundError } from "../../domain/errors.js";
|
|
6
|
+
class TriggerVisibleTaskUseCaseImpl {
|
|
7
|
+
constructor(triggerTask, getRunnableTaskDefinition){
|
|
8
|
+
this.triggerTask = triggerTask;
|
|
9
|
+
this.getRunnableTaskDefinition = getRunnableTaskDefinition;
|
|
10
|
+
}
|
|
11
|
+
async execute(params) {
|
|
12
|
+
const definition = this.getRunnableTaskDefinition.execute(params.definition);
|
|
13
|
+
if (definition.isFail() || definition.value.isPrivate) return Result.fail(new TaskDefinitionNotFoundError(params.definition));
|
|
14
|
+
return this.triggerTask.execute(params);
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
const TriggerVisibleTaskUseCase_TriggerVisibleTaskUseCase = TriggerVisibleTaskUseCase.createImplementation({
|
|
18
|
+
implementation: TriggerVisibleTaskUseCaseImpl,
|
|
19
|
+
dependencies: [
|
|
20
|
+
TriggerTaskUseCase,
|
|
21
|
+
GetRunnableTaskDefinitionUseCase
|
|
22
|
+
]
|
|
23
|
+
});
|
|
24
|
+
export { TriggerVisibleTaskUseCase_TriggerVisibleTaskUseCase as TriggerVisibleTaskUseCase };
|
|
25
|
+
|
|
26
|
+
//# sourceMappingURL=TriggerVisibleTaskUseCase.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"api/features/TriggerVisibleTask/TriggerVisibleTaskUseCase.js","sources":["../../../../src/api/features/TriggerVisibleTask/TriggerVisibleTaskUseCase.ts"],"sourcesContent":["import { Result } from \"@webiny/feature/api\";\nimport { TriggerVisibleTaskUseCase as UseCaseAbstraction } from \"./abstractions.js\";\nimport { TriggerTaskUseCase } from \"~/api/features/TriggerTask/abstractions.js\";\nimport { GetRunnableTaskDefinitionUseCase } from \"~/api/features/GetRunnableTaskDefinition/abstractions.js\";\nimport { TaskDefinitionNotFoundError } from \"~/api/domain/errors.js\";\n\nclass TriggerVisibleTaskUseCaseImpl implements UseCaseAbstraction.Interface {\n public constructor(\n private readonly triggerTask: TriggerTaskUseCase.Interface,\n private readonly getRunnableTaskDefinition: GetRunnableTaskDefinitionUseCase.Interface\n ) {}\n\n public async execute(params: TriggerTaskUseCase.Params) {\n const definition = this.getRunnableTaskDefinition.execute(params.definition);\n if (definition.isFail() || definition.value.isPrivate) {\n return Result.fail(new TaskDefinitionNotFoundError(params.definition));\n }\n return this.triggerTask.execute(params);\n }\n}\n\nexport const TriggerVisibleTaskUseCase = UseCaseAbstraction.createImplementation({\n implementation: TriggerVisibleTaskUseCaseImpl,\n dependencies: [TriggerTaskUseCase, GetRunnableTaskDefinitionUseCase]\n});\n"],"names":["TriggerVisibleTaskUseCaseImpl","triggerTask","getRunnableTaskDefinition","params","definition","Result","TaskDefinitionNotFoundError","TriggerVisibleTaskUseCase","UseCaseAbstraction","TriggerTaskUseCase","GetRunnableTaskDefinitionUseCase"],"mappings":";;;;;AAMA,MAAMA;IACF,YACqBC,WAAyC,EACzCC,yBAAqE,CACxF;aAFmBD,WAAW,GAAXA;aACAC,yBAAyB,GAAzBA;IAClB;IAEH,MAAa,QAAQC,MAAiC,EAAE;QACpD,MAAMC,aAAa,IAAI,CAAC,yBAAyB,CAAC,OAAO,CAACD,OAAO,UAAU;QAC3E,IAAIC,WAAW,MAAM,MAAMA,WAAW,KAAK,CAAC,SAAS,EACjD,OAAOC,OAAO,IAAI,CAAC,IAAIC,4BAA4BH,OAAO,UAAU;QAExE,OAAO,IAAI,CAAC,WAAW,CAAC,OAAO,CAACA;IACpC;AACJ;AAEO,MAAMI,sDAA4BC,0BAAAA,oBAAuC,CAAC;IAC7E,gBAAgBR;IAChB,cAAc;QAACS;QAAoBC;KAAiC;AACxE"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import type { Result } from "@webiny/feature/api";
|
|
2
|
+
import type { ITask } from "../../../api/types.js";
|
|
3
|
+
import type { TriggerTaskUseCase } from "../../../api/features/TriggerTask/abstractions.js";
|
|
4
|
+
type UseCaseError = TriggerTaskUseCase.Error;
|
|
5
|
+
export interface ITriggerVisibleTaskUseCase {
|
|
6
|
+
execute(params: TriggerTaskUseCase.Params): Promise<Result<ITask, UseCaseError>>;
|
|
7
|
+
}
|
|
8
|
+
/**
|
|
9
|
+
* Trigger a task from the GraphQL API. A private definition is refused exactly like an unknown
|
|
10
|
+
* one, so a caller cannot tell the two apart and cannot start it with input of their choice.
|
|
11
|
+
*/
|
|
12
|
+
export declare const TriggerVisibleTaskUseCase: import("@webiny/di").Abstraction<ITriggerVisibleTaskUseCase>;
|
|
13
|
+
export declare namespace TriggerVisibleTaskUseCase {
|
|
14
|
+
type Interface = ITriggerVisibleTaskUseCase;
|
|
15
|
+
type Error = UseCaseError;
|
|
16
|
+
}
|
|
17
|
+
export {};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"api/features/TriggerVisibleTask/abstractions.js","sources":["../../../../src/api/features/TriggerVisibleTask/abstractions.ts"],"sourcesContent":["import { createAbstraction } from \"@webiny/feature/api\";\nimport type { Result } from \"@webiny/feature/api\";\nimport type { ITask } from \"~/api/types.js\";\nimport type { TriggerTaskUseCase } from \"~/api/features/TriggerTask/abstractions.js\";\n\ntype UseCaseError = TriggerTaskUseCase.Error;\n\nexport interface ITriggerVisibleTaskUseCase {\n execute(params: TriggerTaskUseCase.Params): Promise<Result<ITask, UseCaseError>>;\n}\n\n/**\n * Trigger a task from the GraphQL API. A private definition is refused exactly like an unknown\n * one, so a caller cannot tell the two apart and cannot start it with input of their choice.\n */\nexport const TriggerVisibleTaskUseCase = createAbstraction<ITriggerVisibleTaskUseCase>(\n \"Tasks/TriggerVisibleTaskUseCase\"\n);\n\nexport namespace TriggerVisibleTaskUseCase {\n export type Interface = ITriggerVisibleTaskUseCase;\n export type Error = UseCaseError;\n}\n"],"names":["TriggerVisibleTaskUseCase","createAbstraction"],"mappings":";AAeO,MAAMA,4BAA4BC,kBACrC"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { createFeature } from "@webiny/feature/api";
|
|
2
|
+
import { TriggerVisibleTaskUseCase } from "./TriggerVisibleTaskUseCase.js";
|
|
3
|
+
const TriggerVisibleTaskFeature = createFeature({
|
|
4
|
+
name: "TriggerVisibleTask",
|
|
5
|
+
register (container) {
|
|
6
|
+
container.register(TriggerVisibleTaskUseCase);
|
|
7
|
+
}
|
|
8
|
+
});
|
|
9
|
+
export { TriggerVisibleTaskFeature };
|
|
10
|
+
|
|
11
|
+
//# sourceMappingURL=feature.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"api/features/TriggerVisibleTask/feature.js","sources":["../../../../src/api/features/TriggerVisibleTask/feature.ts"],"sourcesContent":["import { createFeature } from \"@webiny/feature/api\";\nimport { TriggerVisibleTaskUseCase } from \"./TriggerVisibleTaskUseCase.js\";\n\nexport const TriggerVisibleTaskFeature = createFeature({\n name: \"TriggerVisibleTask\",\n register(container) {\n container.register(TriggerVisibleTaskUseCase);\n }\n});\n"],"names":["TriggerVisibleTaskFeature","createFeature","container","TriggerVisibleTaskUseCase"],"mappings":";;AAGO,MAAMA,4BAA4BC,cAAc;IACnD,MAAM;IACN,UAASC,SAAS;QACdA,UAAU,QAAQ,CAACC;IACvB;AACJ"}
|
|
@@ -13,8 +13,8 @@ import { GetTaskUseCase } from "../features/GetTask/index.js";
|
|
|
13
13
|
import { ListTasksUseCase } from "../features/ListTasks/index.js";
|
|
14
14
|
import { DeleteTaskUseCase } from "../features/DeleteTask/index.js";
|
|
15
15
|
import { TaskNotFoundError } from "../domain/errors.js";
|
|
16
|
-
import {
|
|
17
|
-
import {
|
|
16
|
+
import { ListVisibleTaskDefinitionsUseCase } from "../features/ListVisibleTaskDefinitions/index.js";
|
|
17
|
+
import { TriggerVisibleTaskUseCase } from "../features/TriggerVisibleTask/index.js";
|
|
18
18
|
import { AbortTaskUseCase } from "../features/AbortTask/abstractions.js";
|
|
19
19
|
import { GetBackgroundTaskSettingsRepository } from "../features/GetBackgroundTaskSettings/abstractions.js";
|
|
20
20
|
import { UpdateBackgroundTaskSettingsUseCase } from "../features/UpdateBackgroundTaskSettings/abstractions.js";
|
|
@@ -23,7 +23,7 @@ import { checkPermissions } from "./checkPermissions.js";
|
|
|
23
23
|
const findTask = async (getTask, id)=>{
|
|
24
24
|
const result = await getTask.execute(id);
|
|
25
25
|
if (result.isOk()) return result.value;
|
|
26
|
-
if (result.error instanceof TaskNotFoundError) return null;
|
|
26
|
+
else if (result.error instanceof TaskNotFoundError) return null;
|
|
27
27
|
throw result.error;
|
|
28
28
|
};
|
|
29
29
|
function addQueryResolvers(builder) {
|
|
@@ -60,13 +60,13 @@ function addQueryResolvers(builder) {
|
|
|
60
60
|
builder.addResolver({
|
|
61
61
|
path: "WebinyBackgroundTaskQuery.listDefinitions",
|
|
62
62
|
dependencies: [
|
|
63
|
-
|
|
63
|
+
ListVisibleTaskDefinitionsUseCase
|
|
64
64
|
],
|
|
65
65
|
resolver: (listTaskDefinitions)=>({ context })=>resolve(async ()=>{
|
|
66
66
|
await checkPermissions(context, {
|
|
67
67
|
rwd: "r"
|
|
68
68
|
});
|
|
69
|
-
return listTaskDefinitions.execute()
|
|
69
|
+
return listTaskDefinitions.execute();
|
|
70
70
|
})
|
|
71
71
|
});
|
|
72
72
|
builder.addResolver({
|
|
@@ -122,7 +122,7 @@ function addMutationResolvers(builder) {
|
|
|
122
122
|
builder.addResolver({
|
|
123
123
|
path: "WebinyBackgroundTaskMutation.triggerTask",
|
|
124
124
|
dependencies: [
|
|
125
|
-
|
|
125
|
+
TriggerVisibleTaskUseCase
|
|
126
126
|
],
|
|
127
127
|
resolver: (triggerTask)=>async ({ args, context })=>{
|
|
128
128
|
await checkPermissions(context, {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"api/graphql/BackgroundTasksGraphQLSchema.js","sources":["../../../src/api/graphql/BackgroundTasksGraphQLSchema.ts"],"sourcesContent":["import { GraphQLSchemaFactory } from \"@webiny/api-graphql/graphql/abstractions.js\";\nimport { createModelSchemaKey } from \"@webiny/api-headless-cms/utils/createModelSchemaKey.js\";\nimport { renderSortEnum } from \"@webiny/api-headless-cms/utils/renderSortEnum.js\";\nimport { renderListFilterFields } from \"@webiny/api-headless-cms/utils/renderListFilterFields.js\";\nimport { renderFields } from \"@webiny/api-headless-cms/utils/renderFields.js\";\nimport { TenantContext } from \"@webiny/api-core/features/tenancy/TenantContext/abstractions.js\";\nimport { IdentityContext } from \"@webiny/api-core/features/security/IdentityContext/abstractions.js\";\nimport { ListModelsUseCase } from \"@webiny/api-headless-cms/features/contentModel/ListModels/index.js\";\nimport { CmsModelFieldToGraphQLRegistry } from \"@webiny/api-headless-cms/exports/api/cms/graphql.js\";\nimport type { Context, IListTaskLogParams, IListTaskParams, ITask, ITaskLog } from \"~/api/types.js\";\nimport { TaskLogModelProvider } from \"~/api/domain/task/abstractions.js\";\nimport { TaskModelProvider } from \"~/api/domain/task/abstractions.js\";\nimport { ListTaskLogsUseCase } from \"~/api/features/ListTaskLogs/index.js\";\nimport { GetTaskUseCase } from \"~/api/features/GetTask/index.js\";\nimport { ListTasksUseCase } from \"~/api/features/ListTasks/index.js\";\nimport { DeleteTaskUseCase } from \"~/api/features/DeleteTask/index.js\";\nimport { TaskNotFoundError } from \"~/api/domain/errors.js\";\nimport { ListTaskDefinitionsUseCase } from \"~/api/features/ListTaskDefinitions/abstractions.js\";\nimport { TriggerTaskUseCase } from \"~/api/features/TriggerTask/abstractions.js\";\nimport { AbortTaskUseCase } from \"~/api/features/AbortTask/abstractions.js\";\nimport { GetBackgroundTaskSettingsRepository } from \"~/api/features/GetBackgroundTaskSettings/abstractions.js\";\nimport { UpdateBackgroundTaskSettingsUseCase } from \"~/api/features/UpdateBackgroundTaskSettings/abstractions.js\";\nimport type { IUpdateBackgroundTaskSettingsInput } from \"~/api/features/UpdateBackgroundTaskSettings/abstractions.js\";\nimport { emptyResolver, resolve, resolveList } from \"./utils.js\";\nimport { checkPermissions } from \"./checkPermissions.js\";\n\n// The API answers `null` for a task that doesn't exist; any other failure is an error.\nconst findTask = async (getTask: GetTaskUseCase.Interface, id: string) => {\n const result = await getTask.execute(id);\n if (result.isOk()) {\n return result.value;\n } else if (result.error instanceof TaskNotFoundError) {\n return null;\n }\n throw result.error;\n};\n\ninterface IGetTaskQueryParams {\n id: string;\n}\n\ninterface IAbortTaskMutationParams {\n id: string;\n message?: string;\n}\n\ninterface ITriggerTaskMutationParams {\n name?: string;\n definition: string;\n input?: Record<string, any>;\n delay?: number;\n}\n\ninterface IDeleteTaskMutationParams {\n id: string;\n}\n\ninterface IUpdateSettingsArgs {\n input: IUpdateBackgroundTaskSettingsInput;\n}\n\ninterface IResolverParams<TArgs = unknown, TParent = unknown> {\n parent: TParent;\n args: TArgs;\n context: Context;\n}\n\nfunction addQueryResolvers(builder: GraphQLSchemaFactory.SchemaBuilder): void {\n builder.addResolver({\n path: \"Query.backgroundTasks\",\n resolver: () => emptyResolver\n });\n\n builder.addResolver({\n path: \"WebinyBackgroundTaskQuery.getTask\",\n dependencies: [GetTaskUseCase],\n resolver: (getTask: GetTaskUseCase.Interface) => {\n return ({ args, context }: IResolverParams<IGetTaskQueryParams>) => {\n return resolve(async () => {\n await checkPermissions(context, { rwd: \"r\" });\n return await findTask(getTask, args.id);\n });\n };\n }\n });\n\n builder.addResolver({\n path: \"WebinyBackgroundTaskQuery.listTasks\",\n dependencies: [ListTasksUseCase],\n resolver: (listTasks: ListTasksUseCase.Interface) => {\n return ({ args, context }: IResolverParams<IListTaskParams>) => {\n return resolveList(async () => {\n await checkPermissions(context, { rwd: \"r\" });\n const result = await listTasks.execute(args);\n if (result.isFail()) {\n throw result.error;\n }\n return result.value;\n });\n };\n }\n });\n\n builder.addResolver({\n path: \"WebinyBackgroundTaskQuery.listDefinitions\",\n dependencies: [ListTaskDefinitionsUseCase],\n resolver: (listTaskDefinitions: ListTaskDefinitionsUseCase.Interface) => {\n return ({ context }: IResolverParams) => {\n return resolve(async () => {\n await checkPermissions(context, { rwd: \"r\" });\n // Do not output private tasks.\n return listTaskDefinitions.execute().filter(item => {\n return !item.isPrivate;\n });\n });\n };\n }\n });\n\n builder.addResolver({\n path: \"WebinyBackgroundTaskQuery.listLogs\",\n dependencies: [ListTaskLogsUseCase],\n resolver: (listTaskLogs: ListTaskLogsUseCase.Interface) => {\n return ({ args, context }: IResolverParams<IListTaskLogParams>) => {\n return resolveList(async () => {\n await checkPermissions(context, { rwd: \"r\" });\n const result = await listTaskLogs.execute(args);\n if (result.isFail()) {\n throw result.error;\n }\n return result.value;\n });\n };\n }\n });\n\n builder.addResolver({\n path: \"WebinyBackgroundTaskQuery.getSettings\",\n dependencies: [GetBackgroundTaskSettingsRepository],\n resolver: (repository: GetBackgroundTaskSettingsRepository.Interface) => {\n return ({ context }: IResolverParams) => {\n return resolve(async () => {\n await checkPermissions(context, { rwd: \"r\" });\n const result = await repository.execute();\n if (result.isFail()) {\n throw result.error;\n }\n return result.value;\n });\n };\n }\n });\n}\n\nfunction addMutationResolvers(builder: GraphQLSchemaFactory.SchemaBuilder): void {\n builder.addResolver({\n path: \"Mutation.backgroundTasks\",\n resolver: () => emptyResolver\n });\n\n builder.addResolver({\n path: \"WebinyBackgroundTaskMutation.abortTask\",\n dependencies: [AbortTaskUseCase],\n resolver: (abortTask: AbortTaskUseCase.Interface) => {\n return async ({ args, context }: IResolverParams<IAbortTaskMutationParams>) => {\n await checkPermissions(context, { rwd: \"w\" });\n return resolve<ITask>(async () => {\n const result = await abortTask.execute(args);\n if (result.isOk()) {\n return result.value;\n }\n\n throw result.error;\n });\n };\n }\n });\n\n builder.addResolver({\n path: \"WebinyBackgroundTaskMutation.triggerTask\",\n dependencies: [TriggerTaskUseCase],\n resolver: (triggerTask: TriggerTaskUseCase.Interface) => {\n return async ({ args, context }: IResolverParams<ITriggerTaskMutationParams>) => {\n await checkPermissions(context, { rwd: \"w\" });\n return resolve<ITask>(async () => {\n const result = await triggerTask.execute(args);\n if (result.isOk()) {\n return result.value;\n }\n\n throw result.error;\n });\n };\n }\n });\n\n builder.addResolver({\n path: \"WebinyBackgroundTaskMutation.deleteTask\",\n dependencies: [DeleteTaskUseCase],\n resolver: (deleteTask: DeleteTaskUseCase.Interface) => {\n return async ({ args, context }: IResolverParams<IDeleteTaskMutationParams>) => {\n await checkPermissions(context, { rwd: \"d\" });\n return resolve(async () => {\n const result = await deleteTask.execute(args.id);\n if (result.isFail()) {\n throw result.error;\n }\n return true;\n });\n };\n }\n });\n\n builder.addResolver({\n path: \"WebinyBackgroundTaskMutation.updateSettings\",\n dependencies: [UpdateBackgroundTaskSettingsUseCase],\n resolver: (updateSettings: UpdateBackgroundTaskSettingsUseCase.Interface) => {\n return ({ args }: IResolverParams<IUpdateSettingsArgs>) => {\n return resolve(async () => {\n const result = await updateSettings.execute(args.input);\n if (result.isFail()) {\n throw result.error;\n }\n return result.value;\n });\n };\n }\n });\n}\n\nfunction addFieldResolvers(builder: GraphQLSchemaFactory.SchemaBuilder): void {\n builder.addResolver({\n path: \"WebinyBackgroundTask.logs\",\n dependencies: [ListTaskLogsUseCase],\n resolver: (listTaskLogs: ListTaskLogsUseCase.Interface) => {\n return async ({ parent, args }: IResolverParams<IListTaskLogParams, ITask>) => {\n const result = await listTaskLogs.execute({\n sort: [\"createdBy_ASC\"],\n limit: 10000,\n ...args,\n where: {\n ...args?.where,\n task: parent.id\n }\n });\n if (result.isFail()) {\n throw result.error;\n }\n return result.value.items;\n };\n }\n });\n\n builder.addResolver({\n path: \"WebinyBackgroundTaskLog.task\",\n dependencies: [GetTaskUseCase],\n resolver: (getTask: GetTaskUseCase.Interface) => {\n return async ({ parent }: IResolverParams<unknown, ITaskLog>) => {\n return await findTask(getTask, parent.task);\n };\n }\n });\n}\n\n/**\n * The background-tasks GraphQL schema. Its shape depends on the CMS task/log content models, which\n * are loaded when the schema is composed. The settings schema lives here too, because it extends\n * the task schema's `WebinyBackgroundTaskQuery`/`Mutation` types.\n */\nclass BackgroundTasksGraphQLSchemaImpl implements GraphQLSchemaFactory.Interface {\n public constructor(\n private readonly tenantContext: TenantContext.Interface,\n private readonly identityContext: IdentityContext.Interface,\n private readonly taskModelProvider: TaskModelProvider.Interface,\n private readonly logModelProvider: TaskLogModelProvider.Interface,\n private readonly listModelsUseCase: ListModelsUseCase.Interface,\n private readonly fieldRegistry: CmsModelFieldToGraphQLRegistry.Interface\n ) {}\n\n public async getSchemaKey(): Promise<string> {\n if (!this.tenantContext.getTenant()) {\n return \"BackgroundTasks:no-tenant\";\n }\n\n const { taskModel, logModel, models } = await this.loadInputs();\n const modelKey = createModelSchemaKey([taskModel, logModel], models);\n return `BackgroundTasks:${modelKey}`;\n }\n\n public async execute(\n builder: GraphQLSchemaFactory.SchemaBuilder\n ): Promise<GraphQLSchemaFactory.SchemaBuilder> {\n if (!this.tenantContext.getTenant()) {\n return builder;\n }\n\n const typeDefs = await this.createTypeDefs();\n\n builder.addTypeDefs(typeDefs);\n addQueryResolvers(builder);\n addMutationResolvers(builder);\n addFieldResolvers(builder);\n\n return builder;\n }\n\n private async loadInputs() {\n const taskModel = await this.taskModelProvider.get();\n const logModel = await this.logModelProvider.get();\n\n const modelsResult = await this.identityContext.withoutAuthorization(async () => {\n return await this.listModelsUseCase.execute({ includePrivate: false });\n });\n if (modelsResult.isFail()) {\n throw modelsResult.error;\n }\n const models = modelsResult.value.filter(model => model.fields.length > 0);\n\n return { taskModel, logModel, models };\n }\n\n private async createTypeDefs(): Promise<string> {\n const { taskModel, logModel, models } = await this.loadInputs();\n const fieldRegistry = this.fieldRegistry;\n\n const taskFields = renderFields({\n models,\n model: taskModel,\n fields: taskModel.fields,\n type: \"manage\",\n fieldRegistry\n });\n\n const logFields = renderFields({\n models,\n model: logModel,\n fields: logModel.fields.filter(field => field.fieldId !== \"task\"),\n type: \"manage\",\n fieldRegistry\n });\n\n const listTasksFilterFieldsRender = renderListFilterFields({\n model: taskModel,\n fields: taskModel.fields,\n type: \"manage\",\n fieldRegistry,\n excludeFields: [\"entryId\"]\n });\n\n const listLogsFilterFieldsRender = renderListFilterFields({\n model: logModel,\n fields: logModel.fields,\n type: \"manage\",\n fieldRegistry,\n excludeFields: [\"entryId\"]\n });\n\n const sortTasksEnumRender = renderSortEnum({\n model: taskModel,\n fields: taskModel.fields,\n fieldRegistry,\n sorters: []\n });\n\n const sortLogsEnumRender = renderSortEnum({\n model: logModel,\n fields: logModel.fields,\n fieldRegistry,\n sorters: []\n });\n\n return /* GraphQL */ `\n type WebinyBackgroundTaskError {\n message: String\n code: String\n data: JSON\n stack: String\n }\n\n ${taskFields.map(f => f.typeDefs).join(\"\\n\")}\n ${logFields.map(f => f.typeDefs).join(\"\\n\")}\n\n type WebinyBackgroundTask {\n id: String!\n createdOn: DateTime!\n savedOn: DateTime\n createdBy: WebinyBackgroundTaskIdentity!\n logs(\n where: WebinyBackgroundTaskLogListWhereInput\n limit: Number\n sort: [WebinyBackgroundTaskLogListSorter!]\n ): [WebinyBackgroundTaskLog!]!\n ${taskFields.map(f => f.fields).join(\"\\n\")}\n }\n\n type WebinyBackgroundTaskResponse {\n data: WebinyBackgroundTask\n error: WebinyBackgroundTaskError\n }\n\n type WebinyBackgroundTaskMeta {\n cursor: String\n hasMoreItems: Boolean!\n totalCount: Int!\n }\n\n type WebinyBackgroundTaskListResponse {\n data: [WebinyBackgroundTask!]\n meta: WebinyBackgroundTaskMeta\n error: WebinyBackgroundTaskError\n }\n\n type WebinyBackgroundTaskLog {\n id: String!\n createdOn: DateTime!\n createdBy: WebinyBackgroundTaskIdentity!\n task: WebinyBackgroundTask!\n ${logFields.map(f => f.fields).join(\"\\n\")}\n }\n\n type WebinyBackgroundTaskLogListResponse {\n data: [WebinyBackgroundTaskLog!]\n meta: WebinyBackgroundTaskMeta\n error: WebinyBackgroundTaskError\n }\n\n type WebinyBackgroundTaskDefinition {\n id: String!\n title: String!\n description: String\n }\n\n type WebinyBackgroundTaskListDefinitionsResponse {\n data: [WebinyBackgroundTaskDefinition!]\n error: WebinyBackgroundTaskError\n }\n\n type WebinyBackgroundTaskIdentity {\n id: String!\n displayName: String!\n type: String\n }\n\n type WebinyBackgroundTaskTriggerResponse {\n data: WebinyBackgroundTask\n error: WebinyBackgroundTaskError\n }\n\n type WebinyBackgroundTaskDeleteResponse {\n data: Boolean\n error: WebinyBackgroundTaskError\n }\n\n input WebinyBackgroundTaskListWhereInput {\n ${listTasksFilterFieldsRender.allFiltersAsString() || \"_empty: String\"}\n }\n\n input WebinyBackgroundTaskLogListWhereInput {\n ${listLogsFilterFieldsRender.allFiltersAsString() || \"_empty: String\"}\n }\n\n enum WebinyBackgroundTaskListSorter {\n ${sortTasksEnumRender}\n }\n\n enum WebinyBackgroundTaskLogListSorter {\n ${sortLogsEnumRender}\n }\n\n type WebinyBackgroundTaskQuery {\n _empty: String\n }\n\n type WebinyBackgroundTaskMutation {\n _empty: String\n }\n\n extend type Query {\n backgroundTasks: WebinyBackgroundTaskQuery\n }\n\n extend type Mutation {\n backgroundTasks: WebinyBackgroundTaskMutation\n }\n\n extend type WebinyBackgroundTaskQuery {\n getTask(id: ID!): WebinyBackgroundTaskResponse!\n listTasks(\n where: WebinyBackgroundTaskListWhereInput\n sort: [WebinyBackgroundTaskListSorter!]\n limit: Int\n after: String\n search: String\n ): WebinyBackgroundTaskListResponse!\n listDefinitions: WebinyBackgroundTaskListDefinitionsResponse!\n\n listLogs(\n where: WebinyBackgroundTaskLogListWhereInput\n sort: [WebinyBackgroundTaskLogListSorter!]\n limit: Int\n after: String\n search: String\n ): WebinyBackgroundTaskLogListResponse!\n }\n\n extend type WebinyBackgroundTaskMutation {\n triggerTask(definition: String!, input: JSON, name: String, delay: Number): WebinyBackgroundTaskTriggerResponse!\n abortTask(id: ID!, message: String): WebinyBackgroundTaskResponse!\n deleteTask(id: ID!): WebinyBackgroundTaskDeleteResponse!\n }\n\n type WebinyBackgroundTaskSettings {\n retentionDays: Int\n }\n\n type WebinyBackgroundTaskSettingsResponse {\n data: WebinyBackgroundTaskSettings\n error: WebinyBackgroundTaskError\n }\n\n input UpdateBackgroundTaskSettingsInput {\n retentionDays: Int\n }\n\n extend type WebinyBackgroundTaskQuery {\n getSettings: WebinyBackgroundTaskSettingsResponse\n }\n\n extend type WebinyBackgroundTaskMutation {\n updateSettings(\n input: UpdateBackgroundTaskSettingsInput!\n ): WebinyBackgroundTaskSettingsResponse\n }\n `;\n }\n}\n\nexport const BackgroundTasksGraphQLSchema = GraphQLSchemaFactory.createImplementation({\n implementation: BackgroundTasksGraphQLSchemaImpl,\n dependencies: [\n TenantContext,\n IdentityContext,\n TaskModelProvider,\n TaskLogModelProvider,\n ListModelsUseCase,\n CmsModelFieldToGraphQLRegistry\n ]\n});\n"],"names":["findTask","getTask","id","result","TaskNotFoundError","addQueryResolvers","builder","emptyResolver","GetTaskUseCase","args","context","resolve","checkPermissions","ListTasksUseCase","listTasks","resolveList","ListTaskDefinitionsUseCase","listTaskDefinitions","item","ListTaskLogsUseCase","listTaskLogs","GetBackgroundTaskSettingsRepository","repository","addMutationResolvers","AbortTaskUseCase","abortTask","TriggerTaskUseCase","triggerTask","DeleteTaskUseCase","deleteTask","UpdateBackgroundTaskSettingsUseCase","updateSettings","addFieldResolvers","parent","BackgroundTasksGraphQLSchemaImpl","tenantContext","identityContext","taskModelProvider","logModelProvider","listModelsUseCase","fieldRegistry","taskModel","logModel","models","modelKey","createModelSchemaKey","typeDefs","modelsResult","model","taskFields","renderFields","logFields","field","listTasksFilterFieldsRender","renderListFilterFields","listLogsFilterFieldsRender","sortTasksEnumRender","renderSortEnum","sortLogsEnumRender","f","BackgroundTasksGraphQLSchema","GraphQLSchemaFactory","TenantContext","IdentityContext","TaskModelProvider","TaskLogModelProvider","ListModelsUseCase","CmsModelFieldToGraphQLRegistry"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"api/graphql/BackgroundTasksGraphQLSchema.js","sources":["../../../src/api/graphql/BackgroundTasksGraphQLSchema.ts"],"sourcesContent":["import { GraphQLSchemaFactory } from \"@webiny/api-graphql/graphql/abstractions.js\";\nimport { createModelSchemaKey } from \"@webiny/api-headless-cms/utils/createModelSchemaKey.js\";\nimport { renderSortEnum } from \"@webiny/api-headless-cms/utils/renderSortEnum.js\";\nimport { renderListFilterFields } from \"@webiny/api-headless-cms/utils/renderListFilterFields.js\";\nimport { renderFields } from \"@webiny/api-headless-cms/utils/renderFields.js\";\nimport { TenantContext } from \"@webiny/api-core/features/tenancy/TenantContext/abstractions.js\";\nimport { IdentityContext } from \"@webiny/api-core/features/security/IdentityContext/abstractions.js\";\nimport { ListModelsUseCase } from \"@webiny/api-headless-cms/features/contentModel/ListModels/index.js\";\nimport { CmsModelFieldToGraphQLRegistry } from \"@webiny/api-headless-cms/exports/api/cms/graphql.js\";\nimport type { Context, IListTaskLogParams, IListTaskParams, ITask, ITaskLog } from \"~/api/types.js\";\nimport { TaskLogModelProvider } from \"~/api/domain/task/abstractions.js\";\nimport { TaskModelProvider } from \"~/api/domain/task/abstractions.js\";\nimport { ListTaskLogsUseCase } from \"~/api/features/ListTaskLogs/index.js\";\nimport { GetTaskUseCase } from \"~/api/features/GetTask/index.js\";\nimport { ListTasksUseCase } from \"~/api/features/ListTasks/index.js\";\nimport { DeleteTaskUseCase } from \"~/api/features/DeleteTask/index.js\";\nimport { TaskNotFoundError } from \"~/api/domain/errors.js\";\nimport { ListVisibleTaskDefinitionsUseCase } from \"~/api/features/ListVisibleTaskDefinitions/index.js\";\nimport { TriggerVisibleTaskUseCase } from \"~/api/features/TriggerVisibleTask/index.js\";\nimport { AbortTaskUseCase } from \"~/api/features/AbortTask/abstractions.js\";\nimport { GetBackgroundTaskSettingsRepository } from \"~/api/features/GetBackgroundTaskSettings/abstractions.js\";\nimport { UpdateBackgroundTaskSettingsUseCase } from \"~/api/features/UpdateBackgroundTaskSettings/abstractions.js\";\nimport type { IUpdateBackgroundTaskSettingsInput } from \"~/api/features/UpdateBackgroundTaskSettings/abstractions.js\";\nimport { emptyResolver, resolve, resolveList } from \"./utils.js\";\nimport { checkPermissions } from \"./checkPermissions.js\";\n\n// The API answers `null` for a task that doesn't exist; any other failure is an error.\nconst findTask = async (getTask: GetTaskUseCase.Interface, id: string) => {\n const result = await getTask.execute(id);\n if (result.isOk()) {\n return result.value;\n } else if (result.error instanceof TaskNotFoundError) {\n return null;\n }\n throw result.error;\n};\n\ninterface IGetTaskQueryParams {\n id: string;\n}\n\ninterface IAbortTaskMutationParams {\n id: string;\n message?: string;\n}\n\ninterface ITriggerTaskMutationParams {\n name?: string;\n definition: string;\n input?: Record<string, any>;\n delay?: number;\n}\n\ninterface IDeleteTaskMutationParams {\n id: string;\n}\n\ninterface IUpdateSettingsArgs {\n input: IUpdateBackgroundTaskSettingsInput;\n}\n\ninterface IResolverParams<TArgs = unknown, TParent = unknown> {\n parent: TParent;\n args: TArgs;\n context: Context;\n}\n\nfunction addQueryResolvers(builder: GraphQLSchemaFactory.SchemaBuilder): void {\n builder.addResolver({\n path: \"Query.backgroundTasks\",\n resolver: () => emptyResolver\n });\n\n builder.addResolver({\n path: \"WebinyBackgroundTaskQuery.getTask\",\n dependencies: [GetTaskUseCase],\n resolver: (getTask: GetTaskUseCase.Interface) => {\n return ({ args, context }: IResolverParams<IGetTaskQueryParams>) => {\n return resolve(async () => {\n await checkPermissions(context, { rwd: \"r\" });\n return await findTask(getTask, args.id);\n });\n };\n }\n });\n\n builder.addResolver({\n path: \"WebinyBackgroundTaskQuery.listTasks\",\n dependencies: [ListTasksUseCase],\n resolver: (listTasks: ListTasksUseCase.Interface) => {\n return ({ args, context }: IResolverParams<IListTaskParams>) => {\n return resolveList(async () => {\n await checkPermissions(context, { rwd: \"r\" });\n const result = await listTasks.execute(args);\n if (result.isFail()) {\n throw result.error;\n }\n return result.value;\n });\n };\n }\n });\n\n builder.addResolver({\n path: \"WebinyBackgroundTaskQuery.listDefinitions\",\n dependencies: [ListVisibleTaskDefinitionsUseCase],\n resolver: (listTaskDefinitions: ListVisibleTaskDefinitionsUseCase.Interface) => {\n return ({ context }: IResolverParams) => {\n return resolve(async () => {\n await checkPermissions(context, { rwd: \"r\" });\n return listTaskDefinitions.execute();\n });\n };\n }\n });\n\n builder.addResolver({\n path: \"WebinyBackgroundTaskQuery.listLogs\",\n dependencies: [ListTaskLogsUseCase],\n resolver: (listTaskLogs: ListTaskLogsUseCase.Interface) => {\n return ({ args, context }: IResolverParams<IListTaskLogParams>) => {\n return resolveList(async () => {\n await checkPermissions(context, { rwd: \"r\" });\n const result = await listTaskLogs.execute(args);\n if (result.isFail()) {\n throw result.error;\n }\n return result.value;\n });\n };\n }\n });\n\n builder.addResolver({\n path: \"WebinyBackgroundTaskQuery.getSettings\",\n dependencies: [GetBackgroundTaskSettingsRepository],\n resolver: (repository: GetBackgroundTaskSettingsRepository.Interface) => {\n return ({ context }: IResolverParams) => {\n return resolve(async () => {\n await checkPermissions(context, { rwd: \"r\" });\n const result = await repository.execute();\n if (result.isFail()) {\n throw result.error;\n }\n return result.value;\n });\n };\n }\n });\n}\n\nfunction addMutationResolvers(builder: GraphQLSchemaFactory.SchemaBuilder): void {\n builder.addResolver({\n path: \"Mutation.backgroundTasks\",\n resolver: () => emptyResolver\n });\n\n builder.addResolver({\n path: \"WebinyBackgroundTaskMutation.abortTask\",\n dependencies: [AbortTaskUseCase],\n resolver: (abortTask: AbortTaskUseCase.Interface) => {\n return async ({ args, context }: IResolverParams<IAbortTaskMutationParams>) => {\n await checkPermissions(context, { rwd: \"w\" });\n return resolve<ITask>(async () => {\n const result = await abortTask.execute(args);\n if (result.isOk()) {\n return result.value;\n }\n\n throw result.error;\n });\n };\n }\n });\n\n builder.addResolver({\n path: \"WebinyBackgroundTaskMutation.triggerTask\",\n dependencies: [TriggerVisibleTaskUseCase],\n resolver: (triggerTask: TriggerVisibleTaskUseCase.Interface) => {\n return async ({ args, context }: IResolverParams<ITriggerTaskMutationParams>) => {\n await checkPermissions(context, { rwd: \"w\" });\n return resolve<ITask>(async () => {\n const result = await triggerTask.execute(args);\n if (result.isOk()) {\n return result.value;\n }\n\n throw result.error;\n });\n };\n }\n });\n\n builder.addResolver({\n path: \"WebinyBackgroundTaskMutation.deleteTask\",\n dependencies: [DeleteTaskUseCase],\n resolver: (deleteTask: DeleteTaskUseCase.Interface) => {\n return async ({ args, context }: IResolverParams<IDeleteTaskMutationParams>) => {\n await checkPermissions(context, { rwd: \"d\" });\n return resolve(async () => {\n const result = await deleteTask.execute(args.id);\n if (result.isFail()) {\n throw result.error;\n }\n return true;\n });\n };\n }\n });\n\n builder.addResolver({\n path: \"WebinyBackgroundTaskMutation.updateSettings\",\n dependencies: [UpdateBackgroundTaskSettingsUseCase],\n resolver: (updateSettings: UpdateBackgroundTaskSettingsUseCase.Interface) => {\n return ({ args }: IResolverParams<IUpdateSettingsArgs>) => {\n return resolve(async () => {\n const result = await updateSettings.execute(args.input);\n if (result.isFail()) {\n throw result.error;\n }\n return result.value;\n });\n };\n }\n });\n}\n\nfunction addFieldResolvers(builder: GraphQLSchemaFactory.SchemaBuilder): void {\n builder.addResolver({\n path: \"WebinyBackgroundTask.logs\",\n dependencies: [ListTaskLogsUseCase],\n resolver: (listTaskLogs: ListTaskLogsUseCase.Interface) => {\n return async ({ parent, args }: IResolverParams<IListTaskLogParams, ITask>) => {\n const result = await listTaskLogs.execute({\n sort: [\"createdBy_ASC\"],\n limit: 10000,\n ...args,\n where: {\n ...args?.where,\n task: parent.id\n }\n });\n if (result.isFail()) {\n throw result.error;\n }\n return result.value.items;\n };\n }\n });\n\n // N+1: this field reads its task once per log, so a `listLogs` page that selects `task` runs one\n // `GetTaskUseCase` read per log on top of the list query (logs of the same task read it again).\n // Known and left as is: logs are an operator view. A request-scoped dataloader batching the ids\n // into one `ListTasksUseCase` call (`id_in`) would fix it.\n builder.addResolver({\n path: \"WebinyBackgroundTaskLog.task\",\n dependencies: [GetTaskUseCase],\n resolver: (getTask: GetTaskUseCase.Interface) => {\n return async ({ parent }: IResolverParams<unknown, ITaskLog>) => {\n return await findTask(getTask, parent.task);\n };\n }\n });\n}\n\n/**\n * The background-tasks GraphQL schema. Its shape depends on the CMS task/log content models, which\n * are loaded when the schema is composed. The settings schema lives here too, because it extends\n * the task schema's `WebinyBackgroundTaskQuery`/`Mutation` types.\n */\nclass BackgroundTasksGraphQLSchemaImpl implements GraphQLSchemaFactory.Interface {\n public constructor(\n private readonly tenantContext: TenantContext.Interface,\n private readonly identityContext: IdentityContext.Interface,\n private readonly taskModelProvider: TaskModelProvider.Interface,\n private readonly logModelProvider: TaskLogModelProvider.Interface,\n private readonly listModelsUseCase: ListModelsUseCase.Interface,\n private readonly fieldRegistry: CmsModelFieldToGraphQLRegistry.Interface\n ) {}\n\n public async getSchemaKey(): Promise<string> {\n if (!this.tenantContext.getTenant()) {\n return \"BackgroundTasks:no-tenant\";\n }\n\n const { taskModel, logModel, models } = await this.loadInputs();\n const modelKey = createModelSchemaKey([taskModel, logModel], models);\n return `BackgroundTasks:${modelKey}`;\n }\n\n public async execute(\n builder: GraphQLSchemaFactory.SchemaBuilder\n ): Promise<GraphQLSchemaFactory.SchemaBuilder> {\n if (!this.tenantContext.getTenant()) {\n return builder;\n }\n\n const typeDefs = await this.createTypeDefs();\n\n builder.addTypeDefs(typeDefs);\n addQueryResolvers(builder);\n addMutationResolvers(builder);\n addFieldResolvers(builder);\n\n return builder;\n }\n\n private async loadInputs() {\n const taskModel = await this.taskModelProvider.get();\n const logModel = await this.logModelProvider.get();\n\n const modelsResult = await this.identityContext.withoutAuthorization(async () => {\n return await this.listModelsUseCase.execute({ includePrivate: false });\n });\n if (modelsResult.isFail()) {\n throw modelsResult.error;\n }\n const models = modelsResult.value.filter(model => model.fields.length > 0);\n\n return { taskModel, logModel, models };\n }\n\n private async createTypeDefs(): Promise<string> {\n const { taskModel, logModel, models } = await this.loadInputs();\n const fieldRegistry = this.fieldRegistry;\n\n const taskFields = renderFields({\n models,\n model: taskModel,\n fields: taskModel.fields,\n type: \"manage\",\n fieldRegistry\n });\n\n const logFields = renderFields({\n models,\n model: logModel,\n fields: logModel.fields.filter(field => field.fieldId !== \"task\"),\n type: \"manage\",\n fieldRegistry\n });\n\n const listTasksFilterFieldsRender = renderListFilterFields({\n model: taskModel,\n fields: taskModel.fields,\n type: \"manage\",\n fieldRegistry,\n excludeFields: [\"entryId\"]\n });\n\n const listLogsFilterFieldsRender = renderListFilterFields({\n model: logModel,\n fields: logModel.fields,\n type: \"manage\",\n fieldRegistry,\n excludeFields: [\"entryId\"]\n });\n\n const sortTasksEnumRender = renderSortEnum({\n model: taskModel,\n fields: taskModel.fields,\n fieldRegistry,\n sorters: []\n });\n\n const sortLogsEnumRender = renderSortEnum({\n model: logModel,\n fields: logModel.fields,\n fieldRegistry,\n sorters: []\n });\n\n return /* GraphQL */ `\n type WebinyBackgroundTaskError {\n message: String\n code: String\n data: JSON\n stack: String\n }\n\n ${taskFields.map(f => f.typeDefs).join(\"\\n\")}\n ${logFields.map(f => f.typeDefs).join(\"\\n\")}\n\n type WebinyBackgroundTask {\n id: String!\n createdOn: DateTime!\n savedOn: DateTime\n createdBy: WebinyBackgroundTaskIdentity!\n logs(\n where: WebinyBackgroundTaskLogListWhereInput\n limit: Number\n sort: [WebinyBackgroundTaskLogListSorter!]\n ): [WebinyBackgroundTaskLog!]!\n ${taskFields.map(f => f.fields).join(\"\\n\")}\n }\n\n type WebinyBackgroundTaskResponse {\n data: WebinyBackgroundTask\n error: WebinyBackgroundTaskError\n }\n\n type WebinyBackgroundTaskMeta {\n cursor: String\n hasMoreItems: Boolean!\n totalCount: Int!\n }\n\n type WebinyBackgroundTaskListResponse {\n data: [WebinyBackgroundTask!]\n meta: WebinyBackgroundTaskMeta\n error: WebinyBackgroundTaskError\n }\n\n type WebinyBackgroundTaskLog {\n id: String!\n createdOn: DateTime!\n createdBy: WebinyBackgroundTaskIdentity!\n task: WebinyBackgroundTask!\n ${logFields.map(f => f.fields).join(\"\\n\")}\n }\n\n type WebinyBackgroundTaskLogListResponse {\n data: [WebinyBackgroundTaskLog!]\n meta: WebinyBackgroundTaskMeta\n error: WebinyBackgroundTaskError\n }\n\n type WebinyBackgroundTaskDefinition {\n id: String!\n title: String!\n description: String\n }\n\n type WebinyBackgroundTaskListDefinitionsResponse {\n data: [WebinyBackgroundTaskDefinition!]\n error: WebinyBackgroundTaskError\n }\n\n type WebinyBackgroundTaskIdentity {\n id: String!\n displayName: String!\n type: String\n }\n\n type WebinyBackgroundTaskTriggerResponse {\n data: WebinyBackgroundTask\n error: WebinyBackgroundTaskError\n }\n\n type WebinyBackgroundTaskDeleteResponse {\n data: Boolean\n error: WebinyBackgroundTaskError\n }\n\n input WebinyBackgroundTaskListWhereInput {\n ${listTasksFilterFieldsRender.allFiltersAsString() || \"_empty: String\"}\n }\n\n input WebinyBackgroundTaskLogListWhereInput {\n ${listLogsFilterFieldsRender.allFiltersAsString() || \"_empty: String\"}\n }\n\n enum WebinyBackgroundTaskListSorter {\n ${sortTasksEnumRender}\n }\n\n enum WebinyBackgroundTaskLogListSorter {\n ${sortLogsEnumRender}\n }\n\n type WebinyBackgroundTaskQuery {\n _empty: String\n }\n\n type WebinyBackgroundTaskMutation {\n _empty: String\n }\n\n extend type Query {\n backgroundTasks: WebinyBackgroundTaskQuery\n }\n\n extend type Mutation {\n backgroundTasks: WebinyBackgroundTaskMutation\n }\n\n extend type WebinyBackgroundTaskQuery {\n getTask(id: ID!): WebinyBackgroundTaskResponse!\n listTasks(\n where: WebinyBackgroundTaskListWhereInput\n sort: [WebinyBackgroundTaskListSorter!]\n limit: Int\n after: String\n search: String\n ): WebinyBackgroundTaskListResponse!\n listDefinitions: WebinyBackgroundTaskListDefinitionsResponse!\n\n listLogs(\n where: WebinyBackgroundTaskLogListWhereInput\n sort: [WebinyBackgroundTaskLogListSorter!]\n limit: Int\n after: String\n search: String\n ): WebinyBackgroundTaskLogListResponse!\n }\n\n extend type WebinyBackgroundTaskMutation {\n triggerTask(definition: String!, input: JSON, name: String, delay: Number): WebinyBackgroundTaskTriggerResponse!\n abortTask(id: ID!, message: String): WebinyBackgroundTaskResponse!\n deleteTask(id: ID!): WebinyBackgroundTaskDeleteResponse!\n }\n\n type WebinyBackgroundTaskSettings {\n retentionDays: Int\n }\n\n type WebinyBackgroundTaskSettingsResponse {\n data: WebinyBackgroundTaskSettings\n error: WebinyBackgroundTaskError\n }\n\n input UpdateBackgroundTaskSettingsInput {\n retentionDays: Int\n }\n\n extend type WebinyBackgroundTaskQuery {\n getSettings: WebinyBackgroundTaskSettingsResponse\n }\n\n extend type WebinyBackgroundTaskMutation {\n updateSettings(\n input: UpdateBackgroundTaskSettingsInput!\n ): WebinyBackgroundTaskSettingsResponse\n }\n `;\n }\n}\n\nexport const BackgroundTasksGraphQLSchema = GraphQLSchemaFactory.createImplementation({\n implementation: BackgroundTasksGraphQLSchemaImpl,\n dependencies: [\n TenantContext,\n IdentityContext,\n TaskModelProvider,\n TaskLogModelProvider,\n ListModelsUseCase,\n CmsModelFieldToGraphQLRegistry\n ]\n});\n"],"names":["findTask","getTask","id","result","TaskNotFoundError","addQueryResolvers","builder","emptyResolver","GetTaskUseCase","args","context","resolve","checkPermissions","ListTasksUseCase","listTasks","resolveList","ListVisibleTaskDefinitionsUseCase","listTaskDefinitions","ListTaskLogsUseCase","listTaskLogs","GetBackgroundTaskSettingsRepository","repository","addMutationResolvers","AbortTaskUseCase","abortTask","TriggerVisibleTaskUseCase","triggerTask","DeleteTaskUseCase","deleteTask","UpdateBackgroundTaskSettingsUseCase","updateSettings","addFieldResolvers","parent","BackgroundTasksGraphQLSchemaImpl","tenantContext","identityContext","taskModelProvider","logModelProvider","listModelsUseCase","fieldRegistry","taskModel","logModel","models","modelKey","createModelSchemaKey","typeDefs","modelsResult","model","taskFields","renderFields","logFields","field","listTasksFilterFieldsRender","renderListFilterFields","listLogsFilterFieldsRender","sortTasksEnumRender","renderSortEnum","sortLogsEnumRender","f","BackgroundTasksGraphQLSchema","GraphQLSchemaFactory","TenantContext","IdentityContext","TaskModelProvider","TaskLogModelProvider","ListModelsUseCase","CmsModelFieldToGraphQLRegistry"],"mappings":"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"}
|
|
@@ -55,12 +55,12 @@ class TaskControl {
|
|
|
55
55
|
});
|
|
56
56
|
}
|
|
57
57
|
if (task.taskStatus === TaskDataStatus.ABORTED) return this.response.aborted();
|
|
58
|
-
if (task.taskStatus === TaskDataStatus.SUCCESS) return this.response.error({
|
|
58
|
+
else if (task.taskStatus === TaskDataStatus.SUCCESS) return this.response.error({
|
|
59
59
|
error: {
|
|
60
60
|
message: "Task is already done, cannot run it again."
|
|
61
61
|
}
|
|
62
62
|
});
|
|
63
|
-
if (task.taskStatus === TaskDataStatus.FAILED) return this.response.error({
|
|
63
|
+
else if (task.taskStatus === TaskDataStatus.FAILED) return this.response.error({
|
|
64
64
|
error: {
|
|
65
65
|
message: "Task has failed, cannot run it again."
|
|
66
66
|
}
|
|
@@ -135,7 +135,7 @@ class TaskControl {
|
|
|
135
135
|
async getTask(id) {
|
|
136
136
|
const result = await this.deps.getTask.execute(id);
|
|
137
137
|
if (result.isOk()) return result.value;
|
|
138
|
-
if (!(result.error instanceof TaskNotFoundError)) {
|
|
138
|
+
else if (!(result.error instanceof TaskNotFoundError)) {
|
|
139
139
|
const error = result.error;
|
|
140
140
|
throw this.response.error({
|
|
141
141
|
error: {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"api/runner/TaskControl.js","sources":["../../../src/api/runner/TaskControl.ts"],"sourcesContent":["import type { ITaskEvent } from \"~/api/handler/types.js\";\nimport type { Context, ITask, ITaskDataInput, ITaskLog } from \"~/api/types.js\";\nimport { TaskDataStatus } from \"~/api/types.js\";\nimport type { ITaskControl, ITaskRunner } from \"./abstractions/index.js\";\nimport { TaskManager } from \"./TaskManager.js\";\nimport type { IResponse, IResponseResult } from \"~/api/response/abstractions/index.js\";\nimport { DatabaseResponse, TaskResponse } from \"~/api/response/index.js\";\nimport { TaskManagerStore } from \"./TaskManagerStore.js\";\nimport { getErrorProperties } from \"~/api/utils/getErrorProperties.js\";\nimport {\n AuthenticatedIdentity,\n IdentityContext\n} from \"@webiny/api-core/features/security/IdentityContext/index.js\";\nimport { TaskExecutionContext } from \"~/api/features/TaskExecutionContext/index.js\";\nimport {\n TaskDefinition,\n TaskResultStatus\n} from \"@webiny/api-core/features/task/TaskDefinition/index.js\";\nimport type { GetTaskUseCase } from \"~/api/features/GetTask/index.js\";\nimport type { ListTasksUseCase } from \"~/api/features/ListTasks/index.js\";\nimport type { CreateTaskLogUseCase } from \"~/api/features/CreateTaskLog/index.js\";\nimport type { GetLatestTaskLogUseCase } from \"~/api/features/GetLatestTaskLog/index.js\";\nimport type { UpdateTaskLogUseCase } from \"~/api/features/UpdateTaskLog/index.js\";\nimport type { UpdateTaskUseCase } from \"~/api/features/UpdateTask/index.js\";\nimport { TaskLogNotFoundError } from \"~/api/domain/errors.js\";\nimport { TaskNotFoundError } from \"~/api/domain/errors.js\";\nimport { GetRunnableTaskDefinitionUseCase } from \"~/api/features/GetRunnableTaskDefinition/abstractions.js\";\nimport { Logger } from \"@webiny/api-core/features/logger/index.js\";\nimport { TaskController } from \"@webiny/api-core/features/task/TaskController/abstractions.js\";\n\ninterface IGetTaskLogParams {\n task: ITask;\n databaseLogs: boolean;\n}\n\n/**\n * What TaskControl needs from the container, declared in one place.\n *\n * TaskControl is built by hand (TaskRunner does it), so it cannot take these through DI the way a\n * registered class would. Naming them here is the next best thing: the class states what it uses,\n * TaskRunner resolves them once where it assembles the object, and a test can pass fakes. Reaching\n * into `context.container` from inside a method instead would leave the class with dependencies\n * nothing can see or substitute.\n */\nexport interface ITaskControlDependencies {\n logger: Logger.Interface;\n identityContext: IdentityContext.Interface;\n taskExecutionContext: TaskExecutionContext.Interface;\n getTask: GetTaskUseCase.Interface;\n listTasks: ListTasksUseCase.Interface;\n updateTask: UpdateTaskUseCase.Interface;\n getLatestTaskLog: GetLatestTaskLogUseCase.Interface;\n createTaskLog: CreateTaskLogUseCase.Interface;\n updateTaskLog: UpdateTaskLogUseCase.Interface;\n taskController: TaskController.Interface;\n getRunnableTaskDefinition: GetRunnableTaskDefinitionUseCase.Interface;\n}\n\nexport class TaskControl implements ITaskControl {\n public readonly runner: ITaskRunner;\n public readonly response: IResponse;\n public readonly context: Context;\n private readonly deps: ITaskControlDependencies;\n\n public constructor(\n runner: ITaskRunner,\n response: IResponse,\n context: Context,\n deps: ITaskControlDependencies\n ) {\n this.runner = runner;\n this.context = context;\n this.response = response;\n this.deps = deps;\n }\n\n public async run(event: Pick<ITaskEvent, \"webinyTaskId\">): Promise<IResponseResult> {\n const taskId = event.webinyTaskId;\n /**\n * This is the initial getTask idea.\n * We will need to take care of child tasks:\n * * child tasks can be in multiple levels (child task creates a child task, etc...).\n * * child tasks could be executed in parallel.\n */\n let task: ITask<ITaskDataInput>;\n try {\n task = await this.getTask(taskId);\n this.deps.identityContext.setIdentity(\n new AuthenticatedIdentity({\n id: task.createdBy.id,\n type: task.createdBy.type,\n displayName: task.createdBy.displayName || \"\",\n context: {\n canAccessTenant: true\n }\n })\n );\n } catch (error) {\n /**\n * TODO Refactor error handling.\n */\n // @ts-expect-error\n return this.response.error({\n ...getErrorProperties(error)\n });\n }\n /**\n * Let's get the task definition.\n */\n const definitionResult = this.deps.getRunnableTaskDefinition.execute(task.definitionId);\n if (definitionResult.isFail()) {\n return this.response.error({\n error: {\n message: `Task \"${task.id}\" cannot be executed because there is no \"${task.definitionId}\" definition plugin.`,\n code: \"TASK_DEFINITION_ERROR\",\n data: {\n definitionId: task.definitionId\n }\n }\n });\n }\n const definition = definitionResult.value;\n /**\n * Only enable logs if definition explicitly allows them.\n */\n const databaseLogs = definition.databaseLogs === true;\n\n /**\n * As this as a run of the task, we need to create a new log entry.\n */\n let taskLog: ITaskLog;\n try {\n taskLog = await this.getTaskLog({\n task,\n databaseLogs\n });\n } catch (error) {\n return this.response.error({\n error\n });\n }\n /**\n * Make sure that task does not run if it is aborted.\n * This will effectively end the Step Function execution with a \"success\" status.\n */\n if (task.taskStatus === TaskDataStatus.ABORTED) {\n return this.response.aborted();\n }\n /**\n * Do not run if already a success (done).\n */\n //\n else if (task.taskStatus === TaskDataStatus.SUCCESS) {\n return this.response.error({\n error: {\n message: \"Task is already done, cannot run it again.\"\n }\n });\n }\n /**\n * Do not run if already failed.\n */\n //\n else if (task.taskStatus === TaskDataStatus.FAILED) {\n return this.response.error({\n error: {\n message: \"Task has failed, cannot run it again.\"\n }\n });\n }\n\n const store = new TaskManagerStore({\n context: this.context,\n listTasks: this.deps.listTasks,\n updateTask: this.deps.updateTask,\n updateTaskLog: this.deps.updateTaskLog,\n logger: this.deps.logger,\n task,\n log: taskLog,\n databaseLogs\n });\n\n // Populate TaskExecutionContext BEFORE executing task\n const executionContext = this.deps.taskExecutionContext;\n executionContext.setStore(store);\n executionContext.setRunner(this.runner);\n executionContext.setTimer(this.runner.timer);\n executionContext.setResponse(new TaskResponse(this.response));\n\n const manager = new TaskManager(this.context, this.response, store, {\n taskController: this.deps.taskController,\n identityContext: this.deps.identityContext\n });\n\n const databaseResponse = new DatabaseResponse(this.response, store);\n\n try {\n const result = await manager.run(definition);\n\n const responseResult = await databaseResponse.from(result);\n\n // Get the updated task from store (no database read needed - store maintains local cache)\n await this.runEvents(result, definition, store.getTask());\n\n return responseResult;\n } catch (ex) {\n /**\n * We always want to store the error in the task log.\n */\n return await databaseResponse.from(\n this.response.error({\n error: {\n message: ex.message,\n code: ex.code || \"TASK_ERROR\",\n stack: ex.stack,\n data: {\n ...ex.data,\n input: task.input\n }\n }\n })\n );\n } finally {\n // Clear execution context after task completes\n executionContext.clear();\n }\n }\n\n private async runEvents(\n result: IResponseResult,\n definition: TaskDefinition.Runnable,\n task: ITask\n ): Promise<void> {\n if (result.status === TaskResultStatus.ERROR && definition.onError) {\n try {\n await definition.onError({ task, definition });\n } catch (ex) {\n this.deps.logger.error(\n { error: getErrorProperties(ex), taskId: task.id, hook: \"onError\" },\n \"Error executing task lifecycle hook.\"\n );\n }\n } else if (result.status === TaskResultStatus.DONE && definition.onDone) {\n try {\n await definition.onDone({ task, definition });\n } catch (ex) {\n this.deps.logger.error(\n { error: getErrorProperties(ex), taskId: task.id, hook: \"onDone\" },\n \"Error executing task lifecycle hook.\"\n );\n }\n }\n }\n\n private async getTask<T extends TaskDefinition.TaskInput>(id: string): Promise<ITask<T>> {\n const result = await this.deps.getTask.execute<T>(id);\n if (result.isOk()) {\n return result.value;\n } else if (!(result.error instanceof TaskNotFoundError)) {\n const error = result.error;\n throw this.response.error({\n error: {\n message: error.message,\n code: error.code || \"TASK_ERROR\",\n stack: error.stack,\n data: error.data\n }\n });\n }\n throw this.response.error({\n error: {\n message: `Task \"${id}\" cannot be executed because it does not exist.`,\n code: \"TASK_NOT_FOUND\"\n }\n });\n }\n\n private async getTaskLog(params: IGetTaskLogParams): Promise<ITaskLog> {\n const { task, databaseLogs } = params;\n /**\n * If logs are disabled, let's return a mocked one.\n */\n if (!databaseLogs) {\n return {\n id: `${task.id}-log`,\n createdOn: task.createdOn,\n createdBy: task.createdBy,\n executionName: task.executionName,\n task: task.id,\n iteration: task.iterations,\n items: []\n };\n }\n let taskLog: ITaskLog | null = null;\n /**\n * First we are trying to get existing latest log.\n */\n const latest = await this.deps.getLatestTaskLog.execute(task.id);\n if (latest.isOk()) {\n taskLog = latest.value;\n } else if (!(latest.error instanceof TaskLogNotFoundError)) {\n // A task without a log yet is fine; any other failure is not.\n throw this.response.error({\n error: latest.error\n });\n }\n\n const currentIteration = taskLog?.iteration || 0;\n\n const created = await this.deps.createTaskLog.execute(task, {\n executionName: this.response.event.executionName,\n iteration: currentIteration + 1\n });\n if (created.isFail()) {\n throw this.response.error({\n error: created.error\n });\n }\n return created.value;\n }\n}\n"],"names":["TaskControl","runner","response","context","deps","event","taskId","task","AuthenticatedIdentity","error","getErrorProperties","definitionResult","definition","databaseLogs","taskLog","TaskDataStatus","store","TaskManagerStore","executionContext","TaskResponse","manager","TaskManager","databaseResponse","DatabaseResponse","result","responseResult","ex","TaskResultStatus","id","TaskNotFoundError","params","latest","TaskLogNotFoundError","currentIteration","created"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"api/runner/TaskControl.js","sources":["../../../src/api/runner/TaskControl.ts"],"sourcesContent":["import type { ITaskEvent } from \"~/api/handler/types.js\";\nimport type { Context, ITask, ITaskDataInput, ITaskLog } from \"~/api/types.js\";\nimport { TaskDataStatus } from \"~/api/types.js\";\nimport type { ITaskControl, ITaskRunner } from \"./abstractions/index.js\";\nimport { TaskManager } from \"./TaskManager.js\";\nimport type { IResponse, IResponseResult } from \"~/api/response/abstractions/index.js\";\nimport { DatabaseResponse, TaskResponse } from \"~/api/response/index.js\";\nimport { TaskManagerStore } from \"./TaskManagerStore.js\";\nimport { getErrorProperties } from \"~/api/utils/getErrorProperties.js\";\nimport {\n AuthenticatedIdentity,\n IdentityContext\n} from \"@webiny/api-core/features/security/IdentityContext/index.js\";\nimport { TaskExecutionContext } from \"~/api/features/TaskExecutionContext/index.js\";\nimport {\n TaskDefinition,\n TaskResultStatus\n} from \"@webiny/api-core/features/task/TaskDefinition/index.js\";\nimport type { GetTaskUseCase } from \"~/api/features/GetTask/index.js\";\nimport type { ListTasksUseCase } from \"~/api/features/ListTasks/index.js\";\nimport type { CreateTaskLogUseCase } from \"~/api/features/CreateTaskLog/index.js\";\nimport type { GetLatestTaskLogUseCase } from \"~/api/features/GetLatestTaskLog/index.js\";\nimport type { UpdateTaskLogUseCase } from \"~/api/features/UpdateTaskLog/index.js\";\nimport type { UpdateTaskUseCase } from \"~/api/features/UpdateTask/index.js\";\nimport { TaskLogNotFoundError } from \"~/api/domain/errors.js\";\nimport { TaskNotFoundError } from \"~/api/domain/errors.js\";\nimport { GetRunnableTaskDefinitionUseCase } from \"~/api/features/GetRunnableTaskDefinition/abstractions.js\";\nimport { Logger } from \"@webiny/api-core/features/logger/index.js\";\nimport { TaskController } from \"@webiny/api-core/features/task/TaskController/abstractions.js\";\n\ninterface IGetTaskLogParams {\n task: ITask;\n databaseLogs: boolean;\n}\n\n/**\n * What TaskControl needs from the container, declared in one place.\n *\n * TaskControl is built by hand (TaskRunner does it), so it cannot take these through DI the way a\n * registered class would. Naming them here is the next best thing: the class states what it uses,\n * TaskRunner resolves them once where it assembles the object, and a test can pass fakes. Reaching\n * into `context.container` from inside a method instead would leave the class with dependencies\n * nothing can see or substitute.\n */\nexport interface ITaskControlDependencies {\n logger: Logger.Interface;\n identityContext: IdentityContext.Interface;\n taskExecutionContext: TaskExecutionContext.Interface;\n getTask: GetTaskUseCase.Interface;\n listTasks: ListTasksUseCase.Interface;\n updateTask: UpdateTaskUseCase.Interface;\n getLatestTaskLog: GetLatestTaskLogUseCase.Interface;\n createTaskLog: CreateTaskLogUseCase.Interface;\n updateTaskLog: UpdateTaskLogUseCase.Interface;\n taskController: TaskController.Interface;\n getRunnableTaskDefinition: GetRunnableTaskDefinitionUseCase.Interface;\n}\n\nexport class TaskControl implements ITaskControl {\n public readonly runner: ITaskRunner;\n public readonly response: IResponse;\n public readonly context: Context;\n private readonly deps: ITaskControlDependencies;\n\n public constructor(\n runner: ITaskRunner,\n response: IResponse,\n context: Context,\n deps: ITaskControlDependencies\n ) {\n this.runner = runner;\n this.context = context;\n this.response = response;\n this.deps = deps;\n }\n\n public async run(event: Pick<ITaskEvent, \"webinyTaskId\">): Promise<IResponseResult> {\n const taskId = event.webinyTaskId;\n /**\n * This is the initial getTask idea.\n * We will need to take care of child tasks:\n * * child tasks can be in multiple levels (child task creates a child task, etc...).\n * * child tasks could be executed in parallel.\n */\n let task: ITask<ITaskDataInput>;\n try {\n task = await this.getTask(taskId);\n this.deps.identityContext.setIdentity(\n new AuthenticatedIdentity({\n id: task.createdBy.id,\n type: task.createdBy.type,\n displayName: task.createdBy.displayName || \"\",\n context: {\n canAccessTenant: true\n }\n })\n );\n } catch (error) {\n /**\n * TODO Refactor error handling.\n */\n // @ts-expect-error\n return this.response.error({\n ...getErrorProperties(error)\n });\n }\n /**\n * Let's get the task definition.\n */\n const definitionResult = this.deps.getRunnableTaskDefinition.execute(task.definitionId);\n if (definitionResult.isFail()) {\n return this.response.error({\n error: {\n message: `Task \"${task.id}\" cannot be executed because there is no \"${task.definitionId}\" definition plugin.`,\n code: \"TASK_DEFINITION_ERROR\",\n data: {\n definitionId: task.definitionId\n }\n }\n });\n }\n const definition = definitionResult.value;\n /**\n * Only enable logs if definition explicitly allows them.\n */\n const databaseLogs = definition.databaseLogs === true;\n\n /**\n * As this as a run of the task, we need to create a new log entry.\n */\n let taskLog: ITaskLog;\n try {\n taskLog = await this.getTaskLog({\n task,\n databaseLogs\n });\n } catch (error) {\n return this.response.error({\n error\n });\n }\n /**\n * Make sure that task does not run if it is aborted.\n * This will effectively end the Step Function execution with a \"success\" status.\n */\n if (task.taskStatus === TaskDataStatus.ABORTED) {\n return this.response.aborted();\n }\n /**\n * Do not run if already a success (done).\n */\n //\n else if (task.taskStatus === TaskDataStatus.SUCCESS) {\n return this.response.error({\n error: {\n message: \"Task is already done, cannot run it again.\"\n }\n });\n }\n /**\n * Do not run if already failed.\n */\n //\n else if (task.taskStatus === TaskDataStatus.FAILED) {\n return this.response.error({\n error: {\n message: \"Task has failed, cannot run it again.\"\n }\n });\n }\n\n const store = new TaskManagerStore({\n context: this.context,\n listTasks: this.deps.listTasks,\n updateTask: this.deps.updateTask,\n updateTaskLog: this.deps.updateTaskLog,\n logger: this.deps.logger,\n task,\n log: taskLog,\n databaseLogs\n });\n\n // Populate TaskExecutionContext BEFORE executing task\n const executionContext = this.deps.taskExecutionContext;\n executionContext.setStore(store);\n executionContext.setRunner(this.runner);\n executionContext.setTimer(this.runner.timer);\n executionContext.setResponse(new TaskResponse(this.response));\n\n const manager = new TaskManager(this.context, this.response, store, {\n taskController: this.deps.taskController,\n identityContext: this.deps.identityContext\n });\n\n const databaseResponse = new DatabaseResponse(this.response, store);\n\n try {\n const result = await manager.run(definition);\n\n const responseResult = await databaseResponse.from(result);\n\n // Get the updated task from store (no database read needed - store maintains local cache)\n await this.runEvents(result, definition, store.getTask());\n\n return responseResult;\n } catch (ex) {\n /**\n * We always want to store the error in the task log.\n */\n return await databaseResponse.from(\n this.response.error({\n error: {\n message: ex.message,\n code: ex.code || \"TASK_ERROR\",\n stack: ex.stack,\n data: {\n ...ex.data,\n input: task.input\n }\n }\n })\n );\n } finally {\n // Clear execution context after task completes\n executionContext.clear();\n }\n }\n\n private async runEvents(\n result: IResponseResult,\n definition: TaskDefinition.Runnable,\n task: ITask\n ): Promise<void> {\n if (result.status === TaskResultStatus.ERROR && definition.onError) {\n try {\n await definition.onError({ task, definition });\n } catch (ex) {\n this.deps.logger.error(\n { error: getErrorProperties(ex), taskId: task.id, hook: \"onError\" },\n \"Error executing task lifecycle hook.\"\n );\n }\n } else if (result.status === TaskResultStatus.DONE && definition.onDone) {\n try {\n await definition.onDone({ task, definition });\n } catch (ex) {\n this.deps.logger.error(\n { error: getErrorProperties(ex), taskId: task.id, hook: \"onDone\" },\n \"Error executing task lifecycle hook.\"\n );\n }\n }\n }\n\n private async getTask<T extends TaskDefinition.TaskInput>(id: string): Promise<ITask<T>> {\n const result = await this.deps.getTask.execute<T>(id);\n if (result.isOk()) {\n return result.value;\n } else if (!(result.error instanceof TaskNotFoundError)) {\n const error = result.error;\n throw this.response.error({\n error: {\n message: error.message,\n code: error.code || \"TASK_ERROR\",\n stack: error.stack,\n data: error.data\n }\n });\n }\n throw this.response.error({\n error: {\n message: `Task \"${id}\" cannot be executed because it does not exist.`,\n code: \"TASK_NOT_FOUND\"\n }\n });\n }\n\n private async getTaskLog(params: IGetTaskLogParams): Promise<ITaskLog> {\n const { task, databaseLogs } = params;\n /**\n * If logs are disabled, let's return a mocked one.\n */\n if (!databaseLogs) {\n return {\n id: `${task.id}-log`,\n createdOn: task.createdOn,\n createdBy: task.createdBy,\n executionName: task.executionName,\n task: task.id,\n iteration: task.iterations,\n items: []\n };\n }\n let taskLog: ITaskLog | null = null;\n /**\n * First we are trying to get existing latest log.\n */\n const latest = await this.deps.getLatestTaskLog.execute(task.id);\n if (latest.isOk()) {\n taskLog = latest.value;\n } else if (!(latest.error instanceof TaskLogNotFoundError)) {\n // A task without a log yet is fine; any other failure is not.\n throw this.response.error({\n error: latest.error\n });\n }\n\n const currentIteration = taskLog?.iteration || 0;\n\n const created = await this.deps.createTaskLog.execute(task, {\n executionName: this.response.event.executionName,\n iteration: currentIteration + 1\n });\n if (created.isFail()) {\n throw this.response.error({\n error: created.error\n });\n }\n return created.value;\n }\n}\n"],"names":["TaskControl","runner","response","context","deps","event","taskId","task","AuthenticatedIdentity","error","getErrorProperties","definitionResult","definition","databaseLogs","taskLog","TaskDataStatus","store","TaskManagerStore","executionContext","TaskResponse","manager","TaskManager","databaseResponse","DatabaseResponse","result","responseResult","ex","TaskResultStatus","id","TaskNotFoundError","params","latest","TaskLogNotFoundError","currentIteration","created"],"mappings":"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"}
|
|
@@ -10,7 +10,7 @@ class TaskManager {
|
|
|
10
10
|
}
|
|
11
11
|
async run(definition) {
|
|
12
12
|
if (this.store.getStatus() === TaskDataStatus.ABORTED) return this.response.aborted();
|
|
13
|
-
if (this.store.getStatus() === TaskDataStatus.PENDING) try {
|
|
13
|
+
else if (this.store.getStatus() === TaskDataStatus.PENDING) try {
|
|
14
14
|
await this.store.updateTask({
|
|
15
15
|
taskStatus: TaskDataStatus.RUNNING,
|
|
16
16
|
startedOn: new Date().toISOString(),
|
|
@@ -68,10 +68,10 @@ class TaskManager {
|
|
|
68
68
|
input: result.input,
|
|
69
69
|
wait: result.wait
|
|
70
70
|
});
|
|
71
|
-
if (result.status === TaskResultStatus.ERROR) return this.response.error({
|
|
71
|
+
else if (result.status === TaskResultStatus.ERROR) return this.response.error({
|
|
72
72
|
error: result.error
|
|
73
73
|
});
|
|
74
|
-
if (result.status === TaskResultStatus.ABORTED) return this.response.aborted();
|
|
74
|
+
else if (result.status === TaskResultStatus.ABORTED) return this.response.aborted();
|
|
75
75
|
return this.response.done({
|
|
76
76
|
message: result.message,
|
|
77
77
|
output: result.output
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"api/runner/TaskManager.js","sources":["../../../src/api/runner/TaskManager.ts"],"sourcesContent":["import type { ITaskManager, ITaskManagerStorePrivate } from \"./abstractions/index.js\";\nimport type { Context } from \"~/api/types.js\";\nimport { TaskDataStatus } from \"~/api/types.js\";\nimport type { IResponse, IResponseResult } from \"~/api/response/abstractions/index.js\";\nimport { getErrorProperties } from \"~/api/utils/getErrorProperties.js\";\nimport {\n TaskDefinition,\n TaskResultStatus\n} from \"@webiny/api-core/features/task/TaskDefinition/index.js\";\nimport { TaskController } from \"@webiny/api-core/features/task/TaskController/abstractions.js\";\nimport { IdentityContext } from \"@webiny/api-core/features/security/IdentityContext/abstractions.js\";\n\n/**\n * What TaskManager needs from the container. Same reasoning as ITaskControlDependencies: the class\n * is built by hand, so it states what it uses and the caller supplies it.\n */\nexport interface ITaskManagerDependencies {\n taskController: TaskController.Interface;\n identityContext: IdentityContext.Interface;\n}\n\nexport class TaskManager implements ITaskManager {\n private readonly context: Context;\n private readonly response: IResponse;\n private readonly store: ITaskManagerStorePrivate;\n\n private readonly deps: ITaskManagerDependencies;\n\n public constructor(\n context: Context,\n response: IResponse,\n store: ITaskManagerStorePrivate,\n deps: ITaskManagerDependencies\n ) {\n this.context = context;\n this.response = response;\n this.store = store;\n this.deps = deps;\n }\n\n public async run(definition: TaskDefinition.Runnable): Promise<IResponseResult> {\n /**\n * If task was aborted, do not run it again, return as it was done.\n */\n if (this.store.getStatus() === TaskDataStatus.ABORTED) {\n return this.response.aborted();\n }\n /**\n * If the task status is pending, update it to running and add a log.\n */\n //\n else if (this.store.getStatus() === TaskDataStatus.PENDING) {\n try {\n await this.store.updateTask({\n taskStatus: TaskDataStatus.RUNNING,\n startedOn: new Date().toISOString(),\n executionName: this.response.event.executionName,\n iterations: 1\n });\n await this.store.save();\n } catch (error) {\n return this.response.error({\n error\n });\n }\n }\n /**\n * We do not want to run the task indefinitely.\n * If the task has reached the max iterations, we will stop it and execute the onMaxIterations handler, if any.\n */\n //\n else if (this.store.getTask().iterations >= definition.maxIterations) {\n try {\n if (definition.onMaxIterations) {\n await definition.onMaxIterations({\n task: this.store.getTask(),\n definition\n });\n }\n return this.response.error({\n error: {\n message: \"Task reached max iterations.\"\n }\n });\n } catch (ex) {\n return this.response.error({\n error: {\n message: \"Failed to execute onMaxIterations handler.\",\n data: getErrorProperties(ex)\n }\n });\n }\n }\n /**\n * Always update the task iteration.\n */\n //\n else {\n try {\n await this.store.updateTask(task => {\n return {\n iterations: task.iterations + 1\n };\n });\n } catch (error) {\n return this.response.error({\n error\n });\n }\n }\n\n let result: TaskDefinition.Result;\n\n try {\n const input = structuredClone(this.store.getInput());\n const controller = this.deps.taskController;\n /**\n * We always run the task without authorization because we are running a task without a user - nothing to authorize against.\n */\n result = await this.deps.identityContext.withoutAuthorization(async () => {\n return await definition.run({\n input,\n controller,\n definition\n });\n });\n } catch (ex) {\n return this.response.error({\n error: getErrorProperties(ex)\n });\n }\n\n // Convert TaskDefinition.Result to IResponseResult\n if (result.status === TaskResultStatus.CONTINUE) {\n return this.response.continue({\n input: result.input,\n wait: result.wait\n });\n } else if (result.status === TaskResultStatus.ERROR) {\n return this.response.error({\n error: result.error\n });\n } else if (result.status === TaskResultStatus.ABORTED) {\n return this.response.aborted();\n }\n return this.response.done({\n message: result.message,\n output: result.output\n });\n }\n}\n"],"names":["TaskManager","context","response","store","deps","definition","TaskDataStatus","Date","error","ex","getErrorProperties","task","result","input","structuredClone","controller","TaskResultStatus"],"mappings":";;;AAqBO,MAAMA;IAOT,YACIC,OAAgB,EAChBC,QAAmB,EACnBC,KAA+B,EAC/BC,IAA8B,CAChC;QACE,IAAI,CAAC,OAAO,GAAGH;QACf,IAAI,CAAC,QAAQ,GAAGC;QAChB,IAAI,CAAC,KAAK,GAAGC;QACb,IAAI,CAAC,IAAI,GAAGC;IAChB;IAEA,MAAa,IAAIC,UAAmC,EAA4B;QAI5E,IAAI,IAAI,CAAC,KAAK,CAAC,SAAS,OAAOC,eAAe,OAAO,EACjD,OAAO,IAAI,CAAC,QAAQ,CAAC,OAAO;
|
|
1
|
+
{"version":3,"file":"api/runner/TaskManager.js","sources":["../../../src/api/runner/TaskManager.ts"],"sourcesContent":["import type { ITaskManager, ITaskManagerStorePrivate } from \"./abstractions/index.js\";\nimport type { Context } from \"~/api/types.js\";\nimport { TaskDataStatus } from \"~/api/types.js\";\nimport type { IResponse, IResponseResult } from \"~/api/response/abstractions/index.js\";\nimport { getErrorProperties } from \"~/api/utils/getErrorProperties.js\";\nimport {\n TaskDefinition,\n TaskResultStatus\n} from \"@webiny/api-core/features/task/TaskDefinition/index.js\";\nimport { TaskController } from \"@webiny/api-core/features/task/TaskController/abstractions.js\";\nimport { IdentityContext } from \"@webiny/api-core/features/security/IdentityContext/abstractions.js\";\n\n/**\n * What TaskManager needs from the container. Same reasoning as ITaskControlDependencies: the class\n * is built by hand, so it states what it uses and the caller supplies it.\n */\nexport interface ITaskManagerDependencies {\n taskController: TaskController.Interface;\n identityContext: IdentityContext.Interface;\n}\n\nexport class TaskManager implements ITaskManager {\n private readonly context: Context;\n private readonly response: IResponse;\n private readonly store: ITaskManagerStorePrivate;\n\n private readonly deps: ITaskManagerDependencies;\n\n public constructor(\n context: Context,\n response: IResponse,\n store: ITaskManagerStorePrivate,\n deps: ITaskManagerDependencies\n ) {\n this.context = context;\n this.response = response;\n this.store = store;\n this.deps = deps;\n }\n\n public async run(definition: TaskDefinition.Runnable): Promise<IResponseResult> {\n /**\n * If task was aborted, do not run it again, return as it was done.\n */\n if (this.store.getStatus() === TaskDataStatus.ABORTED) {\n return this.response.aborted();\n }\n /**\n * If the task status is pending, update it to running and add a log.\n */\n //\n else if (this.store.getStatus() === TaskDataStatus.PENDING) {\n try {\n await this.store.updateTask({\n taskStatus: TaskDataStatus.RUNNING,\n startedOn: new Date().toISOString(),\n executionName: this.response.event.executionName,\n iterations: 1\n });\n await this.store.save();\n } catch (error) {\n return this.response.error({\n error\n });\n }\n }\n /**\n * We do not want to run the task indefinitely.\n * If the task has reached the max iterations, we will stop it and execute the onMaxIterations handler, if any.\n */\n //\n else if (this.store.getTask().iterations >= definition.maxIterations) {\n try {\n if (definition.onMaxIterations) {\n await definition.onMaxIterations({\n task: this.store.getTask(),\n definition\n });\n }\n return this.response.error({\n error: {\n message: \"Task reached max iterations.\"\n }\n });\n } catch (ex) {\n return this.response.error({\n error: {\n message: \"Failed to execute onMaxIterations handler.\",\n data: getErrorProperties(ex)\n }\n });\n }\n }\n /**\n * Always update the task iteration.\n */\n //\n else {\n try {\n await this.store.updateTask(task => {\n return {\n iterations: task.iterations + 1\n };\n });\n } catch (error) {\n return this.response.error({\n error\n });\n }\n }\n\n let result: TaskDefinition.Result;\n\n try {\n const input = structuredClone(this.store.getInput());\n const controller = this.deps.taskController;\n /**\n * We always run the task without authorization because we are running a task without a user - nothing to authorize against.\n */\n result = await this.deps.identityContext.withoutAuthorization(async () => {\n return await definition.run({\n input,\n controller,\n definition\n });\n });\n } catch (ex) {\n return this.response.error({\n error: getErrorProperties(ex)\n });\n }\n\n // Convert TaskDefinition.Result to IResponseResult\n if (result.status === TaskResultStatus.CONTINUE) {\n return this.response.continue({\n input: result.input,\n wait: result.wait\n });\n } else if (result.status === TaskResultStatus.ERROR) {\n return this.response.error({\n error: result.error\n });\n } else if (result.status === TaskResultStatus.ABORTED) {\n return this.response.aborted();\n }\n return this.response.done({\n message: result.message,\n output: result.output\n });\n }\n}\n"],"names":["TaskManager","context","response","store","deps","definition","TaskDataStatus","Date","error","ex","getErrorProperties","task","result","input","structuredClone","controller","TaskResultStatus"],"mappings":";;;AAqBO,MAAMA;IAOT,YACIC,OAAgB,EAChBC,QAAmB,EACnBC,KAA+B,EAC/BC,IAA8B,CAChC;QACE,IAAI,CAAC,OAAO,GAAGH;QACf,IAAI,CAAC,QAAQ,GAAGC;QAChB,IAAI,CAAC,KAAK,GAAGC;QACb,IAAI,CAAC,IAAI,GAAGC;IAChB;IAEA,MAAa,IAAIC,UAAmC,EAA4B;QAI5E,IAAI,IAAI,CAAC,KAAK,CAAC,SAAS,OAAOC,eAAe,OAAO,EACjD,OAAO,IAAI,CAAC,QAAQ,CAAC,OAAO;aAM3B,IAAI,IAAI,CAAC,KAAK,CAAC,SAAS,OAAOA,eAAe,OAAO,EACtD,IAAI;YACA,MAAM,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC;gBACxB,YAAYA,eAAe,OAAO;gBAClC,WAAW,IAAIC,OAAO,WAAW;gBACjC,eAAe,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,aAAa;gBAChD,YAAY;YAChB;YACA,MAAM,IAAI,CAAC,KAAK,CAAC,IAAI;QACzB,EAAE,OAAOC,OAAO;YACZ,OAAO,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC;gBACvBA;YACJ;QACJ;aAOC,IAAI,IAAI,CAAC,KAAK,CAAC,OAAO,GAAG,UAAU,IAAIH,WAAW,aAAa,EAChE,IAAI;YACA,IAAIA,WAAW,eAAe,EAC1B,MAAMA,WAAW,eAAe,CAAC;gBAC7B,MAAM,IAAI,CAAC,KAAK,CAAC,OAAO;gBACxBA;YACJ;YAEJ,OAAO,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC;gBACvB,OAAO;oBACH,SAAS;gBACb;YACJ;QACJ,EAAE,OAAOI,IAAI;YACT,OAAO,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC;gBACvB,OAAO;oBACH,SAAS;oBACT,MAAMC,mBAAmBD;gBAC7B;YACJ;QACJ;aAOA,IAAI;YACA,MAAM,IAAI,CAAC,KAAK,CAAC,UAAU,CAACE,CAAAA,OACjB;oBACH,YAAYA,KAAK,UAAU,GAAG;gBAClC;QAER,EAAE,OAAOH,OAAO;YACZ,OAAO,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC;gBACvBA;YACJ;QACJ;QAGJ,IAAII;QAEJ,IAAI;YACA,MAAMC,QAAQC,gBAAgB,IAAI,CAAC,KAAK,CAAC,QAAQ;YACjD,MAAMC,aAAa,IAAI,CAAC,IAAI,CAAC,cAAc;YAI3CH,SAAS,MAAM,IAAI,CAAC,IAAI,CAAC,eAAe,CAAC,oBAAoB,CAAC,UACnD,MAAMP,WAAW,GAAG,CAAC;oBACxBQ;oBACAE;oBACAV;gBACJ;QAER,EAAE,OAAOI,IAAI;YACT,OAAO,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC;gBACvB,OAAOC,mBAAmBD;YAC9B;QACJ;QAGA,IAAIG,OAAO,MAAM,KAAKI,iBAAiB,QAAQ,EAC3C,OAAO,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC;YAC1B,OAAOJ,OAAO,KAAK;YACnB,MAAMA,OAAO,IAAI;QACrB;aACG,IAAIA,OAAO,MAAM,KAAKI,iBAAiB,KAAK,EAC/C,OAAO,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC;YACvB,OAAOJ,OAAO,KAAK;QACvB;aACG,IAAIA,OAAO,MAAM,KAAKI,iBAAiB,OAAO,EACjD,OAAO,IAAI,CAAC,QAAQ,CAAC,OAAO;QAEhC,OAAO,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC;YACtB,SAASJ,OAAO,OAAO;YACvB,QAAQA,OAAO,MAAM;QACzB;IACJ;AACJ"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@webiny/background-tasks",
|
|
3
|
-
"version": "0.0.0-unstable.
|
|
3
|
+
"version": "0.0.0-unstable.9609e4e0c9",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"exports": {
|
|
6
6
|
".": "./index.js",
|
|
@@ -19,41 +19,41 @@
|
|
|
19
19
|
},
|
|
20
20
|
"license": "MIT",
|
|
21
21
|
"dependencies": {
|
|
22
|
-
"@webiny/admin-ui": "0.0.0-unstable.
|
|
23
|
-
"@webiny/api": "0.0.0-unstable.
|
|
24
|
-
"@webiny/api-core": "0.0.0-unstable.
|
|
25
|
-
"@webiny/api-graphql": "0.0.0-unstable.
|
|
26
|
-
"@webiny/api-headless-cms": "0.0.0-unstable.
|
|
27
|
-
"@webiny/app": "0.0.0-unstable.
|
|
28
|
-
"@webiny/app-admin": "0.0.0-unstable.
|
|
29
|
-
"@webiny/error": "0.0.0-unstable.
|
|
30
|
-
"@webiny/feature": "0.0.0-unstable.
|
|
31
|
-
"@webiny/handler": "0.0.0-unstable.
|
|
32
|
-
"@webiny/icons": "0.0.0-unstable.
|
|
33
|
-
"@webiny/plugins": "0.0.0-unstable.
|
|
34
|
-
"@webiny/sdk": "0.0.0-unstable.
|
|
35
|
-
"@webiny/utils": "0.0.0-unstable.
|
|
22
|
+
"@webiny/admin-ui": "0.0.0-unstable.9609e4e0c9",
|
|
23
|
+
"@webiny/api": "0.0.0-unstable.9609e4e0c9",
|
|
24
|
+
"@webiny/api-core": "0.0.0-unstable.9609e4e0c9",
|
|
25
|
+
"@webiny/api-graphql": "0.0.0-unstable.9609e4e0c9",
|
|
26
|
+
"@webiny/api-headless-cms": "0.0.0-unstable.9609e4e0c9",
|
|
27
|
+
"@webiny/app": "0.0.0-unstable.9609e4e0c9",
|
|
28
|
+
"@webiny/app-admin": "0.0.0-unstable.9609e4e0c9",
|
|
29
|
+
"@webiny/error": "0.0.0-unstable.9609e4e0c9",
|
|
30
|
+
"@webiny/feature": "0.0.0-unstable.9609e4e0c9",
|
|
31
|
+
"@webiny/handler": "0.0.0-unstable.9609e4e0c9",
|
|
32
|
+
"@webiny/icons": "0.0.0-unstable.9609e4e0c9",
|
|
33
|
+
"@webiny/plugins": "0.0.0-unstable.9609e4e0c9",
|
|
34
|
+
"@webiny/sdk": "0.0.0-unstable.9609e4e0c9",
|
|
35
|
+
"@webiny/utils": "0.0.0-unstable.9609e4e0c9",
|
|
36
36
|
"deep-equal": "2.2.3",
|
|
37
37
|
"graphql": "16.14.2",
|
|
38
38
|
"lodash": "4.18.1",
|
|
39
|
-
"mobx": "7.
|
|
40
|
-
"mobx-react-lite": "5.
|
|
41
|
-
"object-merge-advanced": "14.2.
|
|
39
|
+
"mobx": "7.1.3",
|
|
40
|
+
"mobx-react-lite": "5.1.2",
|
|
41
|
+
"object-merge-advanced": "14.2.5",
|
|
42
42
|
"object-sizeof": "2.6.5",
|
|
43
43
|
"react": "18.3.1",
|
|
44
44
|
"react-dom": "18.3.1",
|
|
45
|
-
"zod": "4.
|
|
45
|
+
"zod": "4.6.7"
|
|
46
46
|
},
|
|
47
47
|
"devDependencies": {
|
|
48
|
-
"@webiny/api-core-testing": "0.0.0-unstable.
|
|
49
|
-
"@webiny/build-tools": "0.0.0-unstable.
|
|
48
|
+
"@webiny/api-core-testing": "0.0.0-unstable.9609e4e0c9",
|
|
49
|
+
"@webiny/build-tools": "0.0.0-unstable.9609e4e0c9",
|
|
50
50
|
"@webiny/di": "2.0.0",
|
|
51
|
-
"@webiny/event-handler-core": "0.0.0-unstable.
|
|
52
|
-
"@webiny/wcp": "0.0.0-unstable.
|
|
51
|
+
"@webiny/event-handler-core": "0.0.0-unstable.9609e4e0c9",
|
|
52
|
+
"@webiny/wcp": "0.0.0-unstable.9609e4e0c9",
|
|
53
53
|
"rimraf": "6.1.3",
|
|
54
|
-
"type-fest": "5.
|
|
54
|
+
"type-fest": "5.10.0",
|
|
55
55
|
"typescript": "7.0.2",
|
|
56
|
-
"vitest": "
|
|
56
|
+
"vitest": "5.0.5"
|
|
57
57
|
},
|
|
58
58
|
"publishConfig": {
|
|
59
59
|
"access": "public"
|