@webiny/background-tasks 6.6.0-alpha.3 → 6.6.0-alpha.5

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.
Files changed (43) hide show
  1. package/api/BackgroundTasksFeature.js +6 -6
  2. package/api/BackgroundTasksFeature.js.map +1 -1
  3. package/api/crud/crud.tasks.js.map +1 -1
  4. package/api/crud/definition.tasks.js +2 -2
  5. package/api/crud/definition.tasks.js.map +1 -1
  6. package/api/decorators/SelfCleaningTaskHandlerDecorator.d.ts +33 -0
  7. package/api/decorators/{SelfCleaningTaskDecorator.js → SelfCleaningTaskHandlerDecorator.js} +15 -39
  8. package/api/decorators/SelfCleaningTaskHandlerDecorator.js.map +1 -0
  9. package/api/decorators/TaskDefinitionDefaultsDecorator.d.ts +27 -0
  10. package/api/decorators/{RunnableTaskDecorator.js → TaskDefinitionDefaultsDecorator.js} +11 -32
  11. package/api/decorators/TaskDefinitionDefaultsDecorator.js.map +1 -0
  12. package/api/domain/errors.d.ts +0 -10
  13. package/api/domain/errors.js +1 -11
  14. package/api/domain/errors.js.map +1 -1
  15. package/api/features/{GetTaskDefinition/GetTaskDefinitionUseCase.d.ts → GetRunnableTaskDefinition/GetRunnableTaskDefinitionUseCase.d.ts} +5 -7
  16. package/api/features/GetRunnableTaskDefinition/GetRunnableTaskDefinitionUseCase.js +51 -0
  17. package/api/features/GetRunnableTaskDefinition/GetRunnableTaskDefinitionUseCase.js.map +1 -0
  18. package/api/features/{GetTaskDefinition → GetRunnableTaskDefinition}/abstractions.d.ts +7 -8
  19. package/api/features/GetRunnableTaskDefinition/abstractions.js +5 -0
  20. package/api/features/GetRunnableTaskDefinition/abstractions.js.map +1 -0
  21. package/api/features/{GetTaskDefinition → GetRunnableTaskDefinition}/feature.d.ts +1 -1
  22. package/api/features/GetRunnableTaskDefinition/feature.js +11 -0
  23. package/api/features/GetRunnableTaskDefinition/feature.js.map +1 -0
  24. package/api/features/GetRunnableTaskDefinition/index.d.ts +2 -0
  25. package/api/features/GetRunnableTaskDefinition/index.js +2 -0
  26. package/api/runner/TaskControl.d.ts +2 -2
  27. package/api/runner/TaskControl.js +1 -1
  28. package/api/runner/TaskControl.js.map +1 -1
  29. package/api/runner/TaskRunner.js +2 -2
  30. package/api/runner/TaskRunner.js.map +1 -1
  31. package/package.json +19 -19
  32. package/api/decorators/RunnableTaskDecorator.d.ts +0 -33
  33. package/api/decorators/RunnableTaskDecorator.js.map +0 -1
  34. package/api/decorators/SelfCleaningTaskDecorator.d.ts +0 -33
  35. package/api/decorators/SelfCleaningTaskDecorator.js.map +0 -1
  36. package/api/features/GetTaskDefinition/GetTaskDefinitionUseCase.js +0 -88
  37. package/api/features/GetTaskDefinition/GetTaskDefinitionUseCase.js.map +0 -1
  38. package/api/features/GetTaskDefinition/abstractions.js +0 -5
  39. package/api/features/GetTaskDefinition/abstractions.js.map +0 -1
  40. package/api/features/GetTaskDefinition/feature.js +0 -11
  41. package/api/features/GetTaskDefinition/feature.js.map +0 -1
  42. package/api/features/GetTaskDefinition/index.d.ts +0 -2
  43. package/api/features/GetTaskDefinition/index.js +0 -2
@@ -1,7 +1,7 @@
1
1
  import { createFeature } from "@webiny/feature/api";
2
2
  import { TaskService } from "@webiny/api-core/features/task/TaskService/index.js";
3
- import { RunnableTaskDecorator } from "./decorators/RunnableTaskDecorator.js";
4
- import { SelfCleaningTaskDecorator } from "./decorators/SelfCleaningTaskDecorator.js";
3
+ import { TaskDefinitionDefaultsDecorator } from "./decorators/TaskDefinitionDefaultsDecorator.js";
4
+ import { SelfCleaningTaskHandlerDecorator } from "./decorators/SelfCleaningTaskHandlerDecorator.js";
5
5
  import { TaskController } from "./features/TaskController/index.js";
6
6
  import { TaskPrivateModel } from "./crud/TaskPrivateModel.js";
7
7
  import { TaskLogPrivateModel } from "./crud/TaskLogPrivateModel.js";
@@ -11,7 +11,7 @@ import { createServiceCrud } from "./crud/service.tasks.js";
11
11
  import { createTaskCrud } from "./crud/crud.tasks.js";
12
12
  import { TaskExecutionContextFeature } from "./features/TaskExecutionContext/feature.js";
13
13
  import { TaskHandlerResolverFeature } from "./features/TaskHandlerResolver/feature.js";
14
- import { GetTaskDefinitionFeature } from "./features/GetTaskDefinition/feature.js";
14
+ import { GetRunnableTaskDefinitionFeature } from "./features/GetRunnableTaskDefinition/feature.js";
15
15
  import { ListTaskDefinitionsFeature } from "./features/ListTaskDefinitions/feature.js";
16
16
  import { CleanupTaskSubtreeUseCase, CleanupTaskSubtreeUseCaseImpl } from "./features/CleanupTaskSubtree/index.js";
17
17
  import { TasksCrud } from "./TasksCrud.js";
@@ -30,10 +30,10 @@ const BackgroundTasksFeature = createFeature({
30
30
  container.register(TaskPrivateModel);
31
31
  container.register(TaskLogPrivateModel);
32
32
  container.register(BackgroundTaskSettingsModel);
33
- container.registerDecorator(RunnableTaskDecorator);
34
- container.registerDecorator(SelfCleaningTaskDecorator);
33
+ container.registerDecorator(TaskDefinitionDefaultsDecorator);
34
+ container.registerDecorator(SelfCleaningTaskHandlerDecorator);
35
35
  TaskHandlerResolverFeature.register(container);
36
- GetTaskDefinitionFeature.register(container);
36
+ GetRunnableTaskDefinitionFeature.register(container);
37
37
  ListTaskDefinitionsFeature.register(container);
38
38
  const tasksCrud = {
39
39
  ...createDefinitionCrud(container),
@@ -1 +1 @@
1
- {"version":3,"file":"api/BackgroundTasksFeature.js","sources":["../../src/api/BackgroundTasksFeature.ts"],"sourcesContent":["import { createFeature } from \"@webiny/feature/api\";\nimport { TaskService } from \"@webiny/api-core/features/task/TaskService/index.js\";\nimport { RunnableTaskDecorator } from \"./decorators/RunnableTaskDecorator.js\";\nimport { SelfCleaningTaskDecorator } from \"./decorators/SelfCleaningTaskDecorator.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 { createDefinitionCrud } from \"./crud/definition.tasks.js\";\nimport { createServiceCrud } from \"./crud/service.tasks.js\";\nimport { createTaskCrud } from \"./crud/crud.tasks.js\";\nimport { TaskExecutionContextFeature } from \"./features/TaskExecutionContext/feature.js\";\nimport { TaskHandlerResolverFeature } from \"./features/TaskHandlerResolver/feature.js\";\nimport { GetTaskDefinitionFeature } from \"./features/GetTaskDefinition/feature.js\";\nimport { ListTaskDefinitionsFeature } from \"./features/ListTaskDefinitions/feature.js\";\nimport {\n CleanupTaskSubtreeUseCase,\n CleanupTaskSubtreeUseCaseImpl\n} from \"./features/CleanupTaskSubtree/index.js\";\nimport { TasksCrud } from \"./TasksCrud.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 { BackgroundTasksContextualSchema } from \"./graphql/BackgroundTasksContextualSchema.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 // Decorators wrapping all TaskDefinition instances.\n container.registerDecorator(RunnableTaskDecorator);\n container.registerDecorator(SelfCleaningTaskDecorator);\n\n // Task definition use cases.\n TaskHandlerResolverFeature.register(container);\n GetTaskDefinitionFeature.register(container);\n ListTaskDefinitionsFeature.register(container);\n\n // Build the tasks CRUD facade from the container and register it as the canonical TasksCrud\n // abstraction (plus the legacy TaskService alias). The factory methods resolve TasksCrud\n // lazily for sibling calls, so registering the assembled object up front is sufficient.\n const tasksCrud = {\n ...createDefinitionCrud(container),\n ...createTaskCrud(container),\n ...createServiceCrud(container)\n };\n container.registerInstance(TasksCrud, tasksCrud);\n container.registerInstance(TaskService, tasksCrud);\n\n // Task CRUD use cases (must be after TasksCrud is registered).\n TriggerTaskFeature.register(container);\n AbortTaskFeature.register(container);\n GetTaskFeature.register(container);\n ListTasksFeature.register(container);\n container.registerInstance(\n CleanupTaskSubtreeUseCase,\n new CleanupTaskSubtreeUseCaseImpl(container.resolve(TasksCrud))\n );\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 per-request from the CMS task/log content models.\n container.register(BackgroundTasksContextualSchema);\n }\n});\n"],"names":["BackgroundTasksFeature","createFeature","container","TaskPrivateModel","TaskLogPrivateModel","BackgroundTaskSettingsModel","RunnableTaskDecorator","SelfCleaningTaskDecorator","TaskHandlerResolverFeature","GetTaskDefinitionFeature","ListTaskDefinitionsFeature","tasksCrud","createDefinitionCrud","createTaskCrud","createServiceCrud","TasksCrud","TaskService","TriggerTaskFeature","AbortTaskFeature","GetTaskFeature","ListTasksFeature","CleanupTaskSubtreeUseCase","CleanupTaskSubtreeUseCaseImpl","TaskExecutionContextFeature","TaskController","TestingRunTaskDefinition","BackgroundTaskPermissionsFeature","GetBackgroundTaskSettingsFeature","UpdateBackgroundTaskSettingsFeature","BackgroundTasksContextualSchema"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;AA8BO,MAAMA,yBAAyBC,cAAc;IAChD,MAAM;IACN,UAASC,SAAS;QAGdA,UAAU,QAAQ,CAACC;QACnBD,UAAU,QAAQ,CAACE;QACnBF,UAAU,QAAQ,CAACG;QAGnBH,UAAU,iBAAiB,CAACI;QAC5BJ,UAAU,iBAAiB,CAACK;QAG5BC,2BAA2B,QAAQ,CAACN;QACpCO,yBAAyB,QAAQ,CAACP;QAClCQ,2BAA2B,QAAQ,CAACR;QAKpC,MAAMS,YAAY;YACd,GAAGC,qBAAqBV,UAAU;YAClC,GAAGW,eAAeX,UAAU;YAC5B,GAAGY,kBAAkBZ,UAAU;QACnC;QACAA,UAAU,gBAAgB,CAACa,WAAWJ;QACtCT,UAAU,gBAAgB,CAACc,aAAaL;QAGxCM,mBAAmB,QAAQ,CAACf;QAC5BgB,iBAAiB,QAAQ,CAAChB;QAC1BiB,eAAe,QAAQ,CAACjB;QACxBkB,iBAAiB,QAAQ,CAAClB;QAC1BA,UAAU,gBAAgB,CACtBmB,2BACA,IAAIC,8BAA8BpB,UAAU,OAAO,CAACa;QAIxDQ,4BAA4B,QAAQ,CAACrB;QACrCA,UAAU,QAAQ,CAACsB;QACnBtB,UAAU,QAAQ,CAACuB;QAGnBC,iCAAiC,QAAQ,CAACxB;QAC1CyB,iCAAiC,QAAQ,CAACzB;QAC1C0B,oCAAoC,QAAQ,CAAC1B;QAG7CA,UAAU,QAAQ,CAAC2B;IACvB;AACJ"}
1
+ {"version":3,"file":"api/BackgroundTasksFeature.js","sources":["../../src/api/BackgroundTasksFeature.ts"],"sourcesContent":["import { createFeature } from \"@webiny/feature/api\";\nimport { TaskService } from \"@webiny/api-core/features/task/TaskService/index.js\";\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 { createDefinitionCrud } from \"./crud/definition.tasks.js\";\nimport { createServiceCrud } from \"./crud/service.tasks.js\";\nimport { createTaskCrud } from \"./crud/crud.tasks.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 {\n CleanupTaskSubtreeUseCase,\n CleanupTaskSubtreeUseCaseImpl\n} from \"./features/CleanupTaskSubtree/index.js\";\nimport { TasksCrud } from \"./TasksCrud.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 { BackgroundTasksContextualSchema } from \"./graphql/BackgroundTasksContextualSchema.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 // Build the tasks CRUD facade from the container and register it as the canonical TasksCrud\n // abstraction (plus the legacy TaskService alias). The factory methods resolve TasksCrud\n // lazily for sibling calls, so registering the assembled object up front is sufficient.\n const tasksCrud = {\n ...createDefinitionCrud(container),\n ...createTaskCrud(container),\n ...createServiceCrud(container)\n };\n container.registerInstance(TasksCrud, tasksCrud);\n container.registerInstance(TaskService, tasksCrud);\n\n // Task CRUD use cases (must be after TasksCrud is registered).\n TriggerTaskFeature.register(container);\n AbortTaskFeature.register(container);\n GetTaskFeature.register(container);\n ListTasksFeature.register(container);\n container.registerInstance(\n CleanupTaskSubtreeUseCase,\n new CleanupTaskSubtreeUseCaseImpl(container.resolve(TasksCrud))\n );\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 per-request from the CMS task/log content models.\n container.register(BackgroundTasksContextualSchema);\n }\n});\n"],"names":["BackgroundTasksFeature","createFeature","container","TaskPrivateModel","TaskLogPrivateModel","BackgroundTaskSettingsModel","TaskDefinitionDefaultsDecorator","SelfCleaningTaskHandlerDecorator","TaskHandlerResolverFeature","GetRunnableTaskDefinitionFeature","ListTaskDefinitionsFeature","tasksCrud","createDefinitionCrud","createTaskCrud","createServiceCrud","TasksCrud","TaskService","TriggerTaskFeature","AbortTaskFeature","GetTaskFeature","ListTasksFeature","CleanupTaskSubtreeUseCase","CleanupTaskSubtreeUseCaseImpl","TaskExecutionContextFeature","TaskController","TestingRunTaskDefinition","BackgroundTaskPermissionsFeature","GetBackgroundTaskSettingsFeature","UpdateBackgroundTaskSettingsFeature","BackgroundTasksContextualSchema"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;AA8BO,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;QAKpC,MAAMS,YAAY;YACd,GAAGC,qBAAqBV,UAAU;YAClC,GAAGW,eAAeX,UAAU;YAC5B,GAAGY,kBAAkBZ,UAAU;QACnC;QACAA,UAAU,gBAAgB,CAACa,WAAWJ;QACtCT,UAAU,gBAAgB,CAACc,aAAaL;QAGxCM,mBAAmB,QAAQ,CAACf;QAC5BgB,iBAAiB,QAAQ,CAAChB;QAC1BiB,eAAe,QAAQ,CAACjB;QACxBkB,iBAAiB,QAAQ,CAAClB;QAC1BA,UAAU,gBAAgB,CACtBmB,2BACA,IAAIC,8BAA8BpB,UAAU,OAAO,CAACa;QAIxDQ,4BAA4B,QAAQ,CAACrB;QACrCA,UAAU,QAAQ,CAACsB;QACnBtB,UAAU,QAAQ,CAACuB;QAGnBC,iCAAiC,QAAQ,CAACxB;QAC1CyB,iCAAiC,QAAQ,CAACzB;QAC1C0B,oCAAoC,QAAQ,CAAC1B;QAG7CA,UAAU,QAAQ,CAAC2B;IACvB;AACJ"}
@@ -1 +1 @@
1
- {"version":3,"file":"api/crud/crud.tasks.js","sources":["../../../src/api/crud/crud.tasks.ts"],"sourcesContent":["import WebinyError from \"@webiny/error\";\nimport type { Container } from \"@webiny/di\";\nimport type {\n IListTaskLogParams,\n IListTaskParams,\n ITaskCreateData,\n ITaskLog,\n ITaskLogCreateInput,\n ITaskLogUpdateInput,\n ITasksContextCrudObject,\n ITaskUpdateData\n} from \"~/api/types.js\";\nimport { TaskDataStatus } from \"~/api/types.js\";\nimport { TasksCrud } from \"~/api/TasksCrud.js\";\nimport { WEBINY_TASK_MODEL_ID } from \"./TaskPrivateModel.js\";\nimport { WEBINY_TASK_LOG_MODEL_ID } from \"./TaskLogPrivateModel.js\";\nimport type { CmsEntry, CmsModel } from \"@webiny/api-headless-cms/types/index.js\";\nimport { NotFoundError } from \"@webiny/api-graphql\";\nimport { createZodError, parseIdentifier } from \"@webiny/utils\";\nimport zod from \"zod\";\nimport type { GenericRecord } from \"@webiny/api/types.js\";\nimport { GetModelUseCase } from \"@webiny/api-headless-cms/features/contentModel/GetModel\";\nimport { GetEntryByIdUseCase } from \"@webiny/api-headless-cms/features/contentEntry/GetEntryById\";\nimport { ListLatestEntriesUseCase } from \"@webiny/api-headless-cms/features/contentEntry/ListEntries\";\nimport { CreateEntryUseCase } from \"@webiny/api-headless-cms/features/contentEntry/CreateEntry\";\nimport { UpdateEntryUseCase } from \"@webiny/api-headless-cms/features/contentEntry/UpdateEntry\";\nimport { DeleteEntryUseCase } from \"@webiny/api-headless-cms/features/contentEntry/DeleteEntry\";\nimport { IdentityContext } from \"@webiny/api-core/features/security/IdentityContext/index.js\";\nimport {\n TaskDefinitionNotFoundError,\n TaskLogNotFoundError,\n TaskNotFoundError\n} from \"~/api/domain/errors.js\";\nimport { TaskService } from \"@webiny/api-core/features/task/TaskService/index.js\";\nimport { TaskDefinition } from \"@webiny/api-core/features/task/TaskDefinition/index.js\";\nimport { EventPublisher } from \"@webiny/api-core/features/eventPublisher/index.js\";\nimport {\n TaskAfterCreateEvent,\n TaskAfterDeleteEvent,\n TaskAfterUpdateEvent,\n TaskBeforeCreateEvent,\n TaskBeforeDeleteEvent,\n TaskBeforeUpdateEvent\n} from \"~/api/events/index.js\";\nimport { CmsWhereMapper } from \"@webiny/api-headless-cms\";\nimport { createCleanupTaskSubtree } from \"./cleanupTaskSubtree.js\";\n\nconst createRevisionId = (id: string) => {\n const { id: entryId } = parseIdentifier(id);\n return `${entryId}#0001`;\n};\n\nconst convertToTask = <\n T extends TaskService.TaskInput = TaskService.TaskInput,\n O extends TaskService.GenericOutput = TaskService.GenericOutput\n>(\n entry: CmsEntry<TaskService.Task<T, O>>\n): TaskService.Task<T, O> => {\n return {\n id: entry.entryId,\n createdOn: entry.createdOn,\n savedOn: entry.savedOn,\n createdBy: entry.createdBy,\n name: entry.values.name,\n definitionId: entry.values.definitionId,\n input: entry.values.input,\n output: entry.values.output,\n taskStatus: entry.values.taskStatus,\n executionName: entry.values.executionName || \"\",\n eventResponse: entry.values.eventResponse,\n startedOn: entry.values.startedOn,\n finishedOn: entry.values.finishedOn,\n iterations: entry.values.iterations,\n parentId: entry.values.parentId\n };\n};\n\nconst convertToLog = (entry: CmsEntry<ITaskLog>): ITaskLog => {\n return {\n id: entry.entryId,\n createdOn: entry.createdOn,\n createdBy: entry.createdBy,\n executionName: entry.values.executionName,\n task: entry.values.task,\n iteration: entry.values.iteration,\n items: entry.values.items || []\n };\n};\n\ninterface IValidateParams {\n definition: Pick<TaskDefinition.Interface, \"createInputValidation\">;\n data: Pick<ITaskCreateData, \"input\">;\n}\n\nconst getZodSchema = (schema: GenericRecord<string, zod.ZodTypeAny> | zod.ZodTypeAny) => {\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 validateTaskInput = async (params: IValidateParams) => {\n const { definition, data } = params;\n if (!definition.createInputValidation) {\n return;\n }\n const schema = definition.createInputValidation({\n validator: zod\n });\n /**\n * If the schema is not an object, we need to wrap it with the `object` function.\n */\n const validate = getZodSchema(schema);\n\n const result = await validate.safeParseAsync(data.input);\n if (result.success) {\n return;\n }\n throw createZodError(result.error);\n};\n\nexport const createTaskCrud = (container: Container): ITasksContextCrudObject => {\n // Resolved lazily (inside listTasks/listLogs) rather than at build time — the factory is now\n // invoked from BackgroundTasksFeature.register, which may run before CmsWhereMapper is registered.\n const getCmsWhereMapper = () => container.resolve(CmsWhereMapper);\n\n const getTaskModel = async (): Promise<CmsModel> => {\n const identityContext = container.resolve(IdentityContext);\n return await identityContext.withoutAuthorization(async () => {\n const getModel = container.resolve(GetModelUseCase);\n const result = await getModel.execute(WEBINY_TASK_MODEL_ID);\n if (result.isFail()) {\n throw new WebinyError(`There is no model \"${WEBINY_TASK_MODEL_ID}\".`);\n }\n return result.value;\n });\n };\n\n const getLogModel = async (): Promise<CmsModel> => {\n const identityContext = container.resolve(IdentityContext);\n return await identityContext.withoutAuthorization(async () => {\n const getModel = container.resolve(GetModelUseCase);\n const result = await getModel.execute(WEBINY_TASK_LOG_MODEL_ID);\n if (result.isFail()) {\n throw new WebinyError(`There is no model \"${WEBINY_TASK_LOG_MODEL_ID}\".`);\n }\n return result.value;\n });\n };\n\n const getTask = async <\n T extends TaskService.TaskInput = TaskService.TaskInput,\n O extends TaskService.GenericOutput = TaskService.GenericOutput\n >(\n id: string\n ) => {\n const identityContext = container.resolve(IdentityContext);\n\n const entry = await identityContext.withoutAuthorization(async () => {\n const model = await getTaskModel();\n const getEntryById = container.resolve(GetEntryByIdUseCase);\n const result = await getEntryById.execute(model, createRevisionId(id));\n if (result.isFail()) {\n return null;\n }\n return result.value;\n });\n\n if (!entry) {\n return null;\n }\n\n return convertToTask(entry as unknown as CmsEntry<TaskService.Task<T, O>>);\n };\n\n const listTasks = async <\n T extends TaskService.TaskInput = TaskService.TaskInput,\n O extends TaskService.GenericOutput = TaskService.GenericOutput\n >(\n params?: IListTaskParams\n ) => {\n const identityContext = container.resolve(IdentityContext);\n const { entries, meta } = await identityContext.withoutAuthorization(async () => {\n const model = await getTaskModel();\n const listLatestEntries = container.resolve(ListLatestEntriesUseCase);\n const result = await listLatestEntries.execute<TaskService.Task<T, O>>(model, {\n ...params,\n where: getCmsWhereMapper().map({\n input: params?.where,\n fields: model.fields\n })\n });\n if (result.isFail()) {\n throw result.error;\n }\n return result.value;\n });\n\n return {\n items: entries.map(item => convertToTask<T, O>(item)),\n meta\n };\n };\n\n const createTask = async (data: ITaskCreateData) => {\n const definition = container.resolve(TasksCrud).getDefinition(data.definitionId);\n if (!definition) {\n throw new TaskDefinitionNotFoundError(data.definitionId);\n }\n\n await validateTaskInput({\n definition,\n data\n });\n\n const identityContext = container.resolve(IdentityContext);\n const eventPublisher = container.resolve(EventPublisher);\n\n const beforeCreateEvent = new TaskBeforeCreateEvent({\n input: data\n });\n await eventPublisher.publish(beforeCreateEvent);\n\n const result = await identityContext.withoutAuthorization(async () => {\n const model = await getTaskModel();\n const createEntry = container.resolve(CreateEntryUseCase);\n return createEntry.execute(model, {\n values: {\n ...data,\n iterations: 0,\n taskStatus: TaskDataStatus.PENDING\n }\n });\n });\n\n if (result.isFail()) {\n throw result.error;\n }\n\n const task = convertToTask(result.value as unknown as CmsEntry<TaskService.Task>);\n\n const afterCreateEvent = new TaskAfterCreateEvent({\n input: data,\n task\n });\n await eventPublisher.publish(afterCreateEvent);\n\n return task;\n };\n\n const updateTask = async <\n T extends TaskService.TaskInput = TaskService.TaskInput,\n O extends TaskService.GenericOutput = TaskService.GenericOutput\n >(\n id: string,\n data: ITaskUpdateData<T, O>\n ) => {\n const original = await getTask<T, O>(id);\n if (!original) {\n throw new TaskNotFoundError();\n }\n\n const identityContext = container.resolve(IdentityContext);\n const eventPublisher = container.resolve(EventPublisher);\n\n const beforeUpdateEvent = new TaskBeforeUpdateEvent({\n input: data,\n original\n });\n await eventPublisher.publish(beforeUpdateEvent);\n\n const result = await identityContext.withoutAuthorization(async () => {\n const model = await getTaskModel();\n const updateEntry = container.resolve(UpdateEntryUseCase);\n return updateEntry.execute(model, createRevisionId(id), {\n values: {\n ...data\n }\n });\n });\n\n if (result.isFail()) {\n throw result.error;\n }\n\n const task = convertToTask<T, O>(\n result.value as unknown as CmsEntry<TaskService.Task<T, O>>\n );\n\n const afterUpdateEvent = new TaskAfterUpdateEvent({\n input: data,\n task\n });\n await eventPublisher.publish(afterUpdateEvent);\n\n return task;\n };\n\n const deleteTask = async (id: string) => {\n const task = await getTask(id);\n if (!task) {\n throw new TaskNotFoundError();\n }\n\n const identityContext = container.resolve(IdentityContext);\n const eventPublisher = container.resolve(EventPublisher);\n\n const beforeDeleteEvent = new TaskBeforeDeleteEvent({\n task\n });\n await eventPublisher.publish(beforeDeleteEvent);\n\n const result = await identityContext.withoutAuthorization(async () => {\n const model = await getTaskModel();\n const deleteEntry = container.resolve(DeleteEntryUseCase);\n return deleteEntry.execute(model, createRevisionId(id));\n });\n\n if (result.isFail()) {\n throw new TaskNotFoundError();\n }\n\n const afterDeleteEvent = new TaskAfterDeleteEvent({ task });\n await eventPublisher.publish(afterDeleteEvent);\n\n return true;\n };\n\n const createLog = async (task: Pick<TaskService.Task, \"id\">, data: ITaskLogCreateInput) => {\n const identityContext = container.resolve(IdentityContext);\n const result = await identityContext.withoutAuthorization(async () => {\n const model = await getLogModel();\n const createEntry = container.resolve(CreateEntryUseCase);\n return createEntry.execute(model, {\n values: {\n ...data,\n task: task.id\n }\n });\n });\n\n if (result.isFail()) {\n throw result.error;\n }\n\n return convertToLog(result.value as unknown as CmsEntry<ITaskLog>);\n };\n\n const updateLog = async (id: string, data: ITaskLogUpdateInput) => {\n const identityContext = container.resolve(IdentityContext);\n const result = await identityContext.withoutAuthorization(async () => {\n const model = await getLogModel();\n const updateEntry = container.resolve(UpdateEntryUseCase);\n return updateEntry.execute(model, createRevisionId(id), {\n values: data\n });\n });\n\n if (result.isFail()) {\n throw new TaskLogNotFoundError();\n }\n\n return convertToLog(result.value as unknown as CmsEntry<ITaskLog>);\n };\n\n const deleteLog = async (id: string) => {\n const identityContext = container.resolve(IdentityContext);\n const result = await identityContext.withoutAuthorization(async () => {\n const model = await getLogModel();\n const deleteEntry = container.resolve(DeleteEntryUseCase);\n return deleteEntry.execute(model, id);\n });\n\n if (result.isFail()) {\n throw new TaskLogNotFoundError();\n }\n\n return true;\n };\n\n const getLog = async (id: string): Promise<ITaskLog | null> => {\n const identityContext = container.resolve(IdentityContext);\n try {\n const result = await identityContext.withoutAuthorization(async () => {\n const model = await getLogModel();\n const getEntryById = container.resolve(GetEntryByIdUseCase);\n return getEntryById.execute(model, id);\n });\n\n if (result.isFail()) {\n throw result.error;\n }\n\n return convertToLog(result.value as unknown as CmsEntry<ITaskLog>);\n } catch (ex) {\n if (ex instanceof NotFoundError) {\n return null;\n }\n throw ex;\n }\n };\n\n const getLatestLog = async (taskId: string): Promise<ITaskLog> => {\n const identityContext = container.resolve(IdentityContext);\n const entry = await identityContext.withoutAuthorization(async () => {\n const model = await getLogModel();\n const listLatestEntries = container.resolve(ListLatestEntriesUseCase);\n const result = await listLatestEntries.execute<ITaskLog>(model, {\n where: {\n values: {\n task: taskId\n }\n },\n sort: [\"createdOn_DESC\"],\n limit: 1\n });\n if (result.isFail()) {\n throw result.error;\n }\n const { entries } = result.value;\n const [item] = entries;\n if (!item) {\n throw new NotFoundError(`No existing latest log found for task \"${taskId}\".`);\n }\n return item;\n });\n\n return convertToLog(entry as unknown as CmsEntry<ITaskLog>);\n };\n\n const cleanupTaskSubtree = createCleanupTaskSubtree(container);\n\n const listLogs = async (params: IListTaskLogParams) => {\n const identityContext = container.resolve(IdentityContext);\n const { entries, meta } = await identityContext.withoutAuthorization(async () => {\n const model = await getLogModel();\n const listLatestEntries = container.resolve(ListLatestEntriesUseCase);\n const result = await listLatestEntries.execute<ITaskLog>(model, {\n ...params,\n where: getCmsWhereMapper().map({\n input: params.where,\n fields: model.fields\n })\n });\n if (result.isFail()) {\n throw result.error;\n }\n return result.value;\n });\n\n return {\n items: entries.map(item => convertToLog(item)),\n meta\n };\n };\n\n return {\n getTask,\n listTasks,\n createTask,\n updateTask,\n deleteTask,\n cleanupTaskSubtree,\n createLog,\n updateLog,\n deleteLog,\n getLog,\n listLogs,\n getLatestLog,\n getTaskModel,\n getLogModel\n };\n};\n"],"names":["createRevisionId","id","entryId","parseIdentifier","convertToTask","entry","convertToLog","getZodSchema","schema","zod","validateTaskInput","params","definition","data","validate","result","createZodError","createTaskCrud","container","getCmsWhereMapper","CmsWhereMapper","getTaskModel","identityContext","IdentityContext","getModel","GetModelUseCase","WEBINY_TASK_MODEL_ID","WebinyError","getLogModel","WEBINY_TASK_LOG_MODEL_ID","getTask","model","getEntryById","GetEntryByIdUseCase","listTasks","entries","meta","listLatestEntries","ListLatestEntriesUseCase","item","createTask","TasksCrud","TaskDefinitionNotFoundError","eventPublisher","EventPublisher","beforeCreateEvent","TaskBeforeCreateEvent","createEntry","CreateEntryUseCase","TaskDataStatus","task","afterCreateEvent","TaskAfterCreateEvent","updateTask","original","TaskNotFoundError","beforeUpdateEvent","TaskBeforeUpdateEvent","updateEntry","UpdateEntryUseCase","afterUpdateEvent","TaskAfterUpdateEvent","deleteTask","beforeDeleteEvent","TaskBeforeDeleteEvent","deleteEntry","DeleteEntryUseCase","afterDeleteEvent","TaskAfterDeleteEvent","createLog","updateLog","TaskLogNotFoundError","deleteLog","getLog","ex","NotFoundError","getLatestLog","taskId","cleanupTaskSubtree","createCleanupTaskSubtree","listLogs"],"mappings":"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"}
1
+ {"version":3,"file":"api/crud/crud.tasks.js","sources":["../../../src/api/crud/crud.tasks.ts"],"sourcesContent":["import WebinyError from \"@webiny/error\";\nimport type { Container } from \"@webiny/di\";\nimport type {\n IListTaskLogParams,\n IListTaskParams,\n ITaskCreateData,\n ITaskLog,\n ITaskLogCreateInput,\n ITaskLogUpdateInput,\n ITasksContextCrudObject,\n ITaskUpdateData\n} from \"~/api/types.js\";\nimport { TaskDataStatus } from \"~/api/types.js\";\nimport { TasksCrud } from \"~/api/TasksCrud.js\";\nimport { WEBINY_TASK_MODEL_ID } from \"./TaskPrivateModel.js\";\nimport { WEBINY_TASK_LOG_MODEL_ID } from \"./TaskLogPrivateModel.js\";\nimport type { CmsEntry, CmsModel } from \"@webiny/api-headless-cms/types/index.js\";\nimport { NotFoundError } from \"@webiny/api-graphql\";\nimport { createZodError, parseIdentifier } from \"@webiny/utils\";\nimport zod from \"zod\";\nimport type { GenericRecord } from \"@webiny/api/types.js\";\nimport { GetModelUseCase } from \"@webiny/api-headless-cms/features/contentModel/GetModel\";\nimport { GetEntryByIdUseCase } from \"@webiny/api-headless-cms/features/contentEntry/GetEntryById\";\nimport { ListLatestEntriesUseCase } from \"@webiny/api-headless-cms/features/contentEntry/ListEntries\";\nimport { CreateEntryUseCase } from \"@webiny/api-headless-cms/features/contentEntry/CreateEntry\";\nimport { UpdateEntryUseCase } from \"@webiny/api-headless-cms/features/contentEntry/UpdateEntry\";\nimport { DeleteEntryUseCase } from \"@webiny/api-headless-cms/features/contentEntry/DeleteEntry\";\nimport { IdentityContext } from \"@webiny/api-core/features/security/IdentityContext/index.js\";\nimport {\n TaskDefinitionNotFoundError,\n TaskLogNotFoundError,\n TaskNotFoundError\n} from \"~/api/domain/errors.js\";\nimport { TaskService } from \"@webiny/api-core/features/task/TaskService/index.js\";\nimport { TaskDefinition } from \"@webiny/api-core/features/task/TaskDefinition/index.js\";\nimport { EventPublisher } from \"@webiny/api-core/features/eventPublisher/index.js\";\nimport {\n TaskAfterCreateEvent,\n TaskAfterDeleteEvent,\n TaskAfterUpdateEvent,\n TaskBeforeCreateEvent,\n TaskBeforeDeleteEvent,\n TaskBeforeUpdateEvent\n} from \"~/api/events/index.js\";\nimport { CmsWhereMapper } from \"@webiny/api-headless-cms\";\nimport { createCleanupTaskSubtree } from \"./cleanupTaskSubtree.js\";\n\nconst createRevisionId = (id: string) => {\n const { id: entryId } = parseIdentifier(id);\n return `${entryId}#0001`;\n};\n\nconst convertToTask = <\n T extends TaskService.TaskInput = TaskService.TaskInput,\n O extends TaskService.GenericOutput = TaskService.GenericOutput\n>(\n entry: CmsEntry<TaskService.Task<T, O>>\n): TaskService.Task<T, O> => {\n return {\n id: entry.entryId,\n createdOn: entry.createdOn,\n savedOn: entry.savedOn,\n createdBy: entry.createdBy,\n name: entry.values.name,\n definitionId: entry.values.definitionId,\n input: entry.values.input,\n output: entry.values.output,\n taskStatus: entry.values.taskStatus,\n executionName: entry.values.executionName || \"\",\n eventResponse: entry.values.eventResponse,\n startedOn: entry.values.startedOn,\n finishedOn: entry.values.finishedOn,\n iterations: entry.values.iterations,\n parentId: entry.values.parentId\n };\n};\n\nconst convertToLog = (entry: CmsEntry<ITaskLog>): ITaskLog => {\n return {\n id: entry.entryId,\n createdOn: entry.createdOn,\n createdBy: entry.createdBy,\n executionName: entry.values.executionName,\n task: entry.values.task,\n iteration: entry.values.iteration,\n items: entry.values.items || []\n };\n};\n\ninterface IValidateParams {\n definition: Pick<TaskDefinition.Runnable, \"createInputValidation\">;\n data: Pick<ITaskCreateData, \"input\">;\n}\n\nconst getZodSchema = (schema: GenericRecord<string, zod.ZodTypeAny> | zod.ZodTypeAny) => {\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 validateTaskInput = async (params: IValidateParams) => {\n const { definition, data } = params;\n if (!definition.createInputValidation) {\n return;\n }\n const schema = definition.createInputValidation({\n validator: zod\n });\n /**\n * If the schema is not an object, we need to wrap it with the `object` function.\n */\n const validate = getZodSchema(schema);\n\n const result = await validate.safeParseAsync(data.input);\n if (result.success) {\n return;\n }\n throw createZodError(result.error);\n};\n\nexport const createTaskCrud = (container: Container): ITasksContextCrudObject => {\n // Resolved lazily (inside listTasks/listLogs) rather than at build time — the factory is now\n // invoked from BackgroundTasksFeature.register, which may run before CmsWhereMapper is registered.\n const getCmsWhereMapper = () => container.resolve(CmsWhereMapper);\n\n const getTaskModel = async (): Promise<CmsModel> => {\n const identityContext = container.resolve(IdentityContext);\n return await identityContext.withoutAuthorization(async () => {\n const getModel = container.resolve(GetModelUseCase);\n const result = await getModel.execute(WEBINY_TASK_MODEL_ID);\n if (result.isFail()) {\n throw new WebinyError(`There is no model \"${WEBINY_TASK_MODEL_ID}\".`);\n }\n return result.value;\n });\n };\n\n const getLogModel = async (): Promise<CmsModel> => {\n const identityContext = container.resolve(IdentityContext);\n return await identityContext.withoutAuthorization(async () => {\n const getModel = container.resolve(GetModelUseCase);\n const result = await getModel.execute(WEBINY_TASK_LOG_MODEL_ID);\n if (result.isFail()) {\n throw new WebinyError(`There is no model \"${WEBINY_TASK_LOG_MODEL_ID}\".`);\n }\n return result.value;\n });\n };\n\n const getTask = async <\n T extends TaskService.TaskInput = TaskService.TaskInput,\n O extends TaskService.GenericOutput = TaskService.GenericOutput\n >(\n id: string\n ) => {\n const identityContext = container.resolve(IdentityContext);\n\n const entry = await identityContext.withoutAuthorization(async () => {\n const model = await getTaskModel();\n const getEntryById = container.resolve(GetEntryByIdUseCase);\n const result = await getEntryById.execute(model, createRevisionId(id));\n if (result.isFail()) {\n return null;\n }\n return result.value;\n });\n\n if (!entry) {\n return null;\n }\n\n return convertToTask(entry as unknown as CmsEntry<TaskService.Task<T, O>>);\n };\n\n const listTasks = async <\n T extends TaskService.TaskInput = TaskService.TaskInput,\n O extends TaskService.GenericOutput = TaskService.GenericOutput\n >(\n params?: IListTaskParams\n ) => {\n const identityContext = container.resolve(IdentityContext);\n const { entries, meta } = await identityContext.withoutAuthorization(async () => {\n const model = await getTaskModel();\n const listLatestEntries = container.resolve(ListLatestEntriesUseCase);\n const result = await listLatestEntries.execute<TaskService.Task<T, O>>(model, {\n ...params,\n where: getCmsWhereMapper().map({\n input: params?.where,\n fields: model.fields\n })\n });\n if (result.isFail()) {\n throw result.error;\n }\n return result.value;\n });\n\n return {\n items: entries.map(item => convertToTask<T, O>(item)),\n meta\n };\n };\n\n const createTask = async (data: ITaskCreateData) => {\n const definition = container.resolve(TasksCrud).getDefinition(data.definitionId);\n if (!definition) {\n throw new TaskDefinitionNotFoundError(data.definitionId);\n }\n\n await validateTaskInput({\n definition,\n data\n });\n\n const identityContext = container.resolve(IdentityContext);\n const eventPublisher = container.resolve(EventPublisher);\n\n const beforeCreateEvent = new TaskBeforeCreateEvent({\n input: data\n });\n await eventPublisher.publish(beforeCreateEvent);\n\n const result = await identityContext.withoutAuthorization(async () => {\n const model = await getTaskModel();\n const createEntry = container.resolve(CreateEntryUseCase);\n return createEntry.execute(model, {\n values: {\n ...data,\n iterations: 0,\n taskStatus: TaskDataStatus.PENDING\n }\n });\n });\n\n if (result.isFail()) {\n throw result.error;\n }\n\n const task = convertToTask(result.value as unknown as CmsEntry<TaskService.Task>);\n\n const afterCreateEvent = new TaskAfterCreateEvent({\n input: data,\n task\n });\n await eventPublisher.publish(afterCreateEvent);\n\n return task;\n };\n\n const updateTask = async <\n T extends TaskService.TaskInput = TaskService.TaskInput,\n O extends TaskService.GenericOutput = TaskService.GenericOutput\n >(\n id: string,\n data: ITaskUpdateData<T, O>\n ) => {\n const original = await getTask<T, O>(id);\n if (!original) {\n throw new TaskNotFoundError();\n }\n\n const identityContext = container.resolve(IdentityContext);\n const eventPublisher = container.resolve(EventPublisher);\n\n const beforeUpdateEvent = new TaskBeforeUpdateEvent({\n input: data,\n original\n });\n await eventPublisher.publish(beforeUpdateEvent);\n\n const result = await identityContext.withoutAuthorization(async () => {\n const model = await getTaskModel();\n const updateEntry = container.resolve(UpdateEntryUseCase);\n return updateEntry.execute(model, createRevisionId(id), {\n values: {\n ...data\n }\n });\n });\n\n if (result.isFail()) {\n throw result.error;\n }\n\n const task = convertToTask<T, O>(\n result.value as unknown as CmsEntry<TaskService.Task<T, O>>\n );\n\n const afterUpdateEvent = new TaskAfterUpdateEvent({\n input: data,\n task\n });\n await eventPublisher.publish(afterUpdateEvent);\n\n return task;\n };\n\n const deleteTask = async (id: string) => {\n const task = await getTask(id);\n if (!task) {\n throw new TaskNotFoundError();\n }\n\n const identityContext = container.resolve(IdentityContext);\n const eventPublisher = container.resolve(EventPublisher);\n\n const beforeDeleteEvent = new TaskBeforeDeleteEvent({\n task\n });\n await eventPublisher.publish(beforeDeleteEvent);\n\n const result = await identityContext.withoutAuthorization(async () => {\n const model = await getTaskModel();\n const deleteEntry = container.resolve(DeleteEntryUseCase);\n return deleteEntry.execute(model, createRevisionId(id));\n });\n\n if (result.isFail()) {\n throw new TaskNotFoundError();\n }\n\n const afterDeleteEvent = new TaskAfterDeleteEvent({ task });\n await eventPublisher.publish(afterDeleteEvent);\n\n return true;\n };\n\n const createLog = async (task: Pick<TaskService.Task, \"id\">, data: ITaskLogCreateInput) => {\n const identityContext = container.resolve(IdentityContext);\n const result = await identityContext.withoutAuthorization(async () => {\n const model = await getLogModel();\n const createEntry = container.resolve(CreateEntryUseCase);\n return createEntry.execute(model, {\n values: {\n ...data,\n task: task.id\n }\n });\n });\n\n if (result.isFail()) {\n throw result.error;\n }\n\n return convertToLog(result.value as unknown as CmsEntry<ITaskLog>);\n };\n\n const updateLog = async (id: string, data: ITaskLogUpdateInput) => {\n const identityContext = container.resolve(IdentityContext);\n const result = await identityContext.withoutAuthorization(async () => {\n const model = await getLogModel();\n const updateEntry = container.resolve(UpdateEntryUseCase);\n return updateEntry.execute(model, createRevisionId(id), {\n values: data\n });\n });\n\n if (result.isFail()) {\n throw new TaskLogNotFoundError();\n }\n\n return convertToLog(result.value as unknown as CmsEntry<ITaskLog>);\n };\n\n const deleteLog = async (id: string) => {\n const identityContext = container.resolve(IdentityContext);\n const result = await identityContext.withoutAuthorization(async () => {\n const model = await getLogModel();\n const deleteEntry = container.resolve(DeleteEntryUseCase);\n return deleteEntry.execute(model, id);\n });\n\n if (result.isFail()) {\n throw new TaskLogNotFoundError();\n }\n\n return true;\n };\n\n const getLog = async (id: string): Promise<ITaskLog | null> => {\n const identityContext = container.resolve(IdentityContext);\n try {\n const result = await identityContext.withoutAuthorization(async () => {\n const model = await getLogModel();\n const getEntryById = container.resolve(GetEntryByIdUseCase);\n return getEntryById.execute(model, id);\n });\n\n if (result.isFail()) {\n throw result.error;\n }\n\n return convertToLog(result.value as unknown as CmsEntry<ITaskLog>);\n } catch (ex) {\n if (ex instanceof NotFoundError) {\n return null;\n }\n throw ex;\n }\n };\n\n const getLatestLog = async (taskId: string): Promise<ITaskLog> => {\n const identityContext = container.resolve(IdentityContext);\n const entry = await identityContext.withoutAuthorization(async () => {\n const model = await getLogModel();\n const listLatestEntries = container.resolve(ListLatestEntriesUseCase);\n const result = await listLatestEntries.execute<ITaskLog>(model, {\n where: {\n values: {\n task: taskId\n }\n },\n sort: [\"createdOn_DESC\"],\n limit: 1\n });\n if (result.isFail()) {\n throw result.error;\n }\n const { entries } = result.value;\n const [item] = entries;\n if (!item) {\n throw new NotFoundError(`No existing latest log found for task \"${taskId}\".`);\n }\n return item;\n });\n\n return convertToLog(entry as unknown as CmsEntry<ITaskLog>);\n };\n\n const cleanupTaskSubtree = createCleanupTaskSubtree(container);\n\n const listLogs = async (params: IListTaskLogParams) => {\n const identityContext = container.resolve(IdentityContext);\n const { entries, meta } = await identityContext.withoutAuthorization(async () => {\n const model = await getLogModel();\n const listLatestEntries = container.resolve(ListLatestEntriesUseCase);\n const result = await listLatestEntries.execute<ITaskLog>(model, {\n ...params,\n where: getCmsWhereMapper().map({\n input: params.where,\n fields: model.fields\n })\n });\n if (result.isFail()) {\n throw result.error;\n }\n return result.value;\n });\n\n return {\n items: entries.map(item => convertToLog(item)),\n meta\n };\n };\n\n return {\n getTask,\n listTasks,\n createTask,\n updateTask,\n deleteTask,\n cleanupTaskSubtree,\n createLog,\n updateLog,\n deleteLog,\n getLog,\n listLogs,\n getLatestLog,\n getTaskModel,\n getLogModel\n };\n};\n"],"names":["createRevisionId","id","entryId","parseIdentifier","convertToTask","entry","convertToLog","getZodSchema","schema","zod","validateTaskInput","params","definition","data","validate","result","createZodError","createTaskCrud","container","getCmsWhereMapper","CmsWhereMapper","getTaskModel","identityContext","IdentityContext","getModel","GetModelUseCase","WEBINY_TASK_MODEL_ID","WebinyError","getLogModel","WEBINY_TASK_LOG_MODEL_ID","getTask","model","getEntryById","GetEntryByIdUseCase","listTasks","entries","meta","listLatestEntries","ListLatestEntriesUseCase","item","createTask","TasksCrud","TaskDefinitionNotFoundError","eventPublisher","EventPublisher","beforeCreateEvent","TaskBeforeCreateEvent","createEntry","CreateEntryUseCase","TaskDataStatus","task","afterCreateEvent","TaskAfterCreateEvent","updateTask","original","TaskNotFoundError","beforeUpdateEvent","TaskBeforeUpdateEvent","updateEntry","UpdateEntryUseCase","afterUpdateEvent","TaskAfterUpdateEvent","deleteTask","beforeDeleteEvent","TaskBeforeDeleteEvent","deleteEntry","DeleteEntryUseCase","afterDeleteEvent","TaskAfterDeleteEvent","createLog","updateLog","TaskLogNotFoundError","deleteLog","getLog","ex","NotFoundError","getLatestLog","taskId","cleanupTaskSubtree","createCleanupTaskSubtree","listLogs"],"mappings":"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"}
@@ -1,8 +1,8 @@
1
- import { GetTaskDefinitionUseCase } from "../features/GetTaskDefinition/index.js";
1
+ import { GetRunnableTaskDefinitionUseCase } from "../features/GetRunnableTaskDefinition/index.js";
2
2
  import { ListTaskDefinitionsUseCase } from "../features/ListTaskDefinitions/index.js";
3
3
  const createDefinitionCrud = (container)=>({
4
4
  getDefinition: (id)=>{
5
- const useCase = container.resolve(GetTaskDefinitionUseCase);
5
+ const useCase = container.resolve(GetRunnableTaskDefinitionUseCase);
6
6
  const result = useCase.execute(id);
7
7
  if (result.isOk()) return result.value;
8
8
  return null;
@@ -1 +1 @@
1
- {"version":3,"file":"api/crud/definition.tasks.js","sources":["../../../src/api/crud/definition.tasks.ts"],"sourcesContent":["import type { Container } from \"@webiny/di\";\nimport type { ITasksContextDefinitionObject } from \"~/api/types.js\";\nimport { TaskDefinition } from \"@webiny/api-core/features/task/TaskDefinition/index.js\";\nimport { GetTaskDefinitionUseCase } from \"~/api/features/GetTaskDefinition/index.js\";\nimport { ListTaskDefinitionsUseCase } from \"~/api/features/ListTaskDefinitions/index.js\";\n\nexport const createDefinitionCrud = (container: Container): ITasksContextDefinitionObject => {\n return {\n getDefinition: <\n I extends TaskDefinition.TaskInput = TaskDefinition.TaskInput,\n O extends TaskDefinition.TaskOutput = TaskDefinition.TaskOutput\n >(\n id: string\n ) => {\n const useCase = container.resolve(GetTaskDefinitionUseCase);\n const result = useCase.execute<I, O>(id);\n\n if (result.isOk()) {\n return result.value;\n }\n\n return null;\n },\n listDefinitions: () => {\n const useCase = container.resolve(ListTaskDefinitionsUseCase);\n return useCase.execute();\n }\n };\n};\n"],"names":["createDefinitionCrud","container","id","useCase","GetTaskDefinitionUseCase","result","ListTaskDefinitionsUseCase"],"mappings":";;AAMO,MAAMA,uBAAuB,CAACC,YAC1B;QACH,eAAe,CAIXC;YAEA,MAAMC,UAAUF,UAAU,OAAO,CAACG;YAClC,MAAMC,SAASF,QAAQ,OAAO,CAAOD;YAErC,IAAIG,OAAO,IAAI,IACX,OAAOA,OAAO,KAAK;YAGvB,OAAO;QACX;QACA,iBAAiB;YACb,MAAMF,UAAUF,UAAU,OAAO,CAACK;YAClC,OAAOH,QAAQ,OAAO;QAC1B;IACJ"}
1
+ {"version":3,"file":"api/crud/definition.tasks.js","sources":["../../../src/api/crud/definition.tasks.ts"],"sourcesContent":["import type { Container } from \"@webiny/di\";\nimport type { ITasksContextDefinitionObject } from \"~/api/types.js\";\nimport { TaskDefinition } from \"@webiny/api-core/features/task/TaskDefinition/index.js\";\nimport { GetRunnableTaskDefinitionUseCase } from \"~/api/features/GetRunnableTaskDefinition/index.js\";\nimport { ListTaskDefinitionsUseCase } from \"~/api/features/ListTaskDefinitions/index.js\";\n\nexport const createDefinitionCrud = (container: Container): ITasksContextDefinitionObject => {\n return {\n getDefinition: <\n I extends TaskDefinition.TaskInput = TaskDefinition.TaskInput,\n O extends TaskDefinition.TaskOutput = TaskDefinition.TaskOutput\n >(\n id: string\n ) => {\n const useCase = container.resolve(GetRunnableTaskDefinitionUseCase);\n const result = useCase.execute<I, O>(id);\n\n if (result.isOk()) {\n return result.value;\n }\n\n return null;\n },\n listDefinitions: () => {\n const useCase = container.resolve(ListTaskDefinitionsUseCase);\n return useCase.execute();\n }\n };\n};\n"],"names":["createDefinitionCrud","container","id","useCase","GetRunnableTaskDefinitionUseCase","result","ListTaskDefinitionsUseCase"],"mappings":";;AAMO,MAAMA,uBAAuB,CAACC,YAC1B;QACH,eAAe,CAIXC;YAEA,MAAMC,UAAUF,UAAU,OAAO,CAACG;YAClC,MAAMC,SAASF,QAAQ,OAAO,CAAOD;YAErC,IAAIG,OAAO,IAAI,IACX,OAAOA,OAAO,KAAK;YAGvB,OAAO;QACX;QACA,iBAAiB;YACb,MAAMF,UAAUF,UAAU,OAAO,CAACK;YAClC,OAAOH,QAAQ,OAAO;QAC1B;IACJ"}
@@ -0,0 +1,33 @@
1
+ import { TaskHandler } from "@webiny/api-core/features/task/TaskDefinition/index.js";
2
+ import { Logger } from "@webiny/api-core/features/logger/index.js";
3
+ import { CleanupTaskSubtreeUseCase } from "../../api/features/CleanupTaskSubtree/index.js";
4
+ type HookParams = TaskHandler.LifecycleHookParams;
5
+ /**
6
+ * Deletes a finished task, and its descendants, for the events its definition asked for.
7
+ *
8
+ * Registered against `TaskHandler`, so it wraps every task's handler. Which task it is wrapping, and
9
+ * whether that task wants cleaning up, both come from `params.definition` rather than from anything
10
+ * captured at construction: one decorator instance serves whichever handler is resolved.
11
+ *
12
+ * The user's hook runs first and its failure is swallowed, so a task that throws on the way out is
13
+ * still cleaned up. That is what the previous single-object implementation did.
14
+ */
15
+ export declare class SelfCleaningTaskHandlerDecoratorImpl implements TaskHandler.Interface {
16
+ private readonly cleanupTaskSubtree;
17
+ private readonly logger;
18
+ private readonly decoratee;
19
+ constructor(cleanupTaskSubtree: CleanupTaskSubtreeUseCase.Interface, logger: Logger.Interface, decoratee: TaskHandler.Interface);
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
+ 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
+ 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").ZodType<unknown, unknown, import("zod/v4/core").$ZodTypeInternals<unknown, unknown>>> | import("zod").ZodType<unknown, unknown, import("zod/v4/core").$ZodTypeInternals<unknown, unknown>>) | undefined;
24
+ get onDone(): (params: HookParams) => Promise<void>;
25
+ get onError(): (params: HookParams) => Promise<void>;
26
+ get onAbort(): (params: HookParams) => Promise<void>;
27
+ private cleanUpIfAsked;
28
+ private safeCall;
29
+ }
30
+ export declare const SelfCleaningTaskHandlerDecorator: typeof SelfCleaningTaskHandlerDecoratorImpl & {
31
+ __abstraction: import("@webiny/di").Abstraction<import("@webiny/api-core/features/task/TaskDefinition/abstractions").ITaskHandler<import("@webiny/api-core/features/task/TaskDefinition/abstractions").ITaskInput, import("@webiny/api-core/features/task/TaskDefinition/abstractions").ITaskOutput>>;
32
+ };
33
+ export {};
@@ -1,41 +1,16 @@
1
- import { TaskDefinition } from "@webiny/api-core/features/task/TaskDefinition/index.js";
1
+ import { TaskHandler } from "@webiny/api-core/features/task/TaskDefinition/index.js";
2
2
  import { Logger } from "@webiny/api-core/features/logger/index.js";
3
3
  import { normalizeSelfCleanup } from "../utils/normalizeSelfCleanup.js";
4
4
  import { CleanupTaskSubtreeUseCase } from "../features/CleanupTaskSubtree/index.js";
5
5
  import { getErrorProperties } from "../utils/getErrorProperties.js";
6
- class SelfCleaningTaskDecoratorImpl {
6
+ class SelfCleaningTaskHandlerDecoratorImpl {
7
7
  constructor(cleanupTaskSubtree, logger, decoratee){
8
8
  this.cleanupTaskSubtree = cleanupTaskSubtree;
9
9
  this.logger = logger;
10
10
  this.decoratee = decoratee;
11
- this.events = normalizeSelfCleanup(decoratee.selfCleanup);
12
- }
13
- get handler() {
14
- return this.decoratee.handler;
15
- }
16
- get id() {
17
- return this.decoratee.id;
18
- }
19
- get title() {
20
- return this.decoratee.title;
21
- }
22
- get description() {
23
- return this.decoratee.description;
24
- }
25
- get isPrivate() {
26
- return this.decoratee.isPrivate;
27
- }
28
- get maxIterations() {
29
- return this.decoratee.maxIterations;
30
- }
31
- get selfCleanup() {
32
- return this.decoratee.selfCleanup;
33
- }
34
- get createInputValidation() {
35
- return this.decoratee.createInputValidation;
36
11
  }
37
12
  get run() {
38
- return this.decoratee.run?.bind(this.decoratee);
13
+ return this.decoratee.run.bind(this.decoratee);
39
14
  }
40
15
  get onBeforeTrigger() {
41
16
  return this.decoratee.onBeforeTrigger?.bind(this.decoratee);
@@ -43,29 +18,30 @@ class SelfCleaningTaskDecoratorImpl {
43
18
  get onMaxIterations() {
44
19
  return this.decoratee.onMaxIterations?.bind(this.decoratee);
45
20
  }
46
- get databaseLogs() {
47
- if (this.events.size > 0) return false;
48
- return this.decoratee.databaseLogs;
21
+ get createInputValidation() {
22
+ return this.decoratee.createInputValidation?.bind(this.decoratee);
49
23
  }
50
24
  get onDone() {
51
25
  return async (params)=>{
52
26
  await this.safeCall(this.decoratee.onDone, params, "onDone");
53
- if (this.events.has("onSuccess")) await this.runCleanup(params);
27
+ await this.cleanUpIfAsked(params, "onSuccess");
54
28
  };
55
29
  }
56
30
  get onError() {
57
31
  return async (params)=>{
58
32
  await this.safeCall(this.decoratee.onError, params, "onError");
59
- if (this.events.has("onError")) await this.runCleanup(params);
33
+ await this.cleanUpIfAsked(params, "onError");
60
34
  };
61
35
  }
62
36
  get onAbort() {
63
37
  return async (params)=>{
64
38
  await this.safeCall(this.decoratee.onAbort, params, "onAbort");
65
- if (this.events.has("onAbort")) await this.runCleanup(params);
39
+ await this.cleanUpIfAsked(params, "onAbort");
66
40
  };
67
41
  }
68
- async runCleanup(params) {
42
+ async cleanUpIfAsked(params, event) {
43
+ const events = normalizeSelfCleanup(params.definition.selfCleanup);
44
+ if (!events.has(event)) return;
69
45
  await this.cleanupTaskSubtree.execute(params.task.id);
70
46
  }
71
47
  async safeCall(hook, params, name) {
@@ -81,13 +57,13 @@ class SelfCleaningTaskDecoratorImpl {
81
57
  }
82
58
  }
83
59
  }
84
- const SelfCleaningTaskDecorator = TaskDefinition.createDecorator({
85
- decorator: SelfCleaningTaskDecoratorImpl,
60
+ const SelfCleaningTaskHandlerDecorator = TaskHandler.createDecorator({
61
+ decorator: SelfCleaningTaskHandlerDecoratorImpl,
86
62
  dependencies: [
87
63
  CleanupTaskSubtreeUseCase,
88
64
  Logger
89
65
  ]
90
66
  });
91
- export { SelfCleaningTaskDecorator, SelfCleaningTaskDecoratorImpl };
67
+ export { SelfCleaningTaskHandlerDecorator, SelfCleaningTaskHandlerDecoratorImpl };
92
68
 
93
- //# sourceMappingURL=SelfCleaningTaskDecorator.js.map
69
+ //# sourceMappingURL=SelfCleaningTaskHandlerDecorator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"api/decorators/SelfCleaningTaskHandlerDecorator.js","sources":["../../../src/api/decorators/SelfCleaningTaskHandlerDecorator.ts"],"sourcesContent":["import { TaskHandler } from \"@webiny/api-core/features/task/TaskDefinition/index.js\";\nimport { Logger } from \"@webiny/api-core/features/logger/index.js\";\nimport { normalizeSelfCleanup } from \"~/api/utils/normalizeSelfCleanup.js\";\nimport { CleanupTaskSubtreeUseCase } from \"~/api/features/CleanupTaskSubtree/index.js\";\nimport { getErrorProperties } from \"~/api/utils/getErrorProperties.js\";\n\ntype HookParams = TaskHandler.LifecycleHookParams;\n\n/**\n * Deletes a finished task, and its descendants, for the events its definition asked for.\n *\n * Registered against `TaskHandler`, so it wraps every task's handler. Which task it is wrapping, and\n * whether that task wants cleaning up, both come from `params.definition` rather than from anything\n * captured at construction: one decorator instance serves whichever handler is resolved.\n *\n * The user's hook runs first and its failure is swallowed, so a task that throws on the way out is\n * still cleaned up. That is what the previous single-object implementation did.\n */\nexport class SelfCleaningTaskHandlerDecoratorImpl implements TaskHandler.Interface {\n public constructor(\n private readonly cleanupTaskSubtree: CleanupTaskSubtreeUseCase.Interface,\n private readonly logger: Logger.Interface,\n private readonly decoratee: TaskHandler.Interface\n ) {}\n\n get run() {\n return this.decoratee.run.bind(this.decoratee);\n }\n\n get onBeforeTrigger() {\n return this.decoratee.onBeforeTrigger?.bind(this.decoratee);\n }\n\n get onMaxIterations() {\n return this.decoratee.onMaxIterations?.bind(this.decoratee);\n }\n\n get createInputValidation() {\n return this.decoratee.createInputValidation?.bind(this.decoratee);\n }\n\n get onDone() {\n return async (params: HookParams) => {\n await this.safeCall(this.decoratee.onDone, params, \"onDone\");\n await this.cleanUpIfAsked(params, \"onSuccess\");\n };\n }\n\n get onError() {\n return async (params: HookParams) => {\n await this.safeCall(this.decoratee.onError, params, \"onError\");\n await this.cleanUpIfAsked(params, \"onError\");\n };\n }\n\n get onAbort() {\n return async (params: HookParams) => {\n await this.safeCall(this.decoratee.onAbort, params, \"onAbort\");\n await this.cleanUpIfAsked(params, \"onAbort\");\n };\n }\n\n private async cleanUpIfAsked(\n params: HookParams,\n event: \"onSuccess\" | \"onError\" | \"onAbort\"\n ): Promise<void> {\n const events = normalizeSelfCleanup(params.definition.selfCleanup);\n if (!events.has(event)) {\n return;\n }\n\n await this.cleanupTaskSubtree.execute(params.task.id);\n }\n\n private async safeCall(\n hook: TaskHandler.Interface[\"onDone\"],\n params: HookParams,\n name: string\n ): Promise<void> {\n if (!hook) {\n return;\n }\n\n try {\n await hook.call(this.decoratee, params);\n } catch (ex) {\n this.logger.error(\n { error: getErrorProperties(ex), taskId: params.task.id, hook: name },\n \"Error executing task lifecycle hook.\"\n );\n }\n }\n}\n\nexport const SelfCleaningTaskHandlerDecorator = TaskHandler.createDecorator({\n decorator: SelfCleaningTaskHandlerDecoratorImpl,\n dependencies: [CleanupTaskSubtreeUseCase, Logger]\n});\n"],"names":["SelfCleaningTaskHandlerDecoratorImpl","cleanupTaskSubtree","logger","decoratee","params","event","events","normalizeSelfCleanup","hook","name","ex","getErrorProperties","SelfCleaningTaskHandlerDecorator","TaskHandler","CleanupTaskSubtreeUseCase","Logger"],"mappings":";;;;;AAkBO,MAAMA;IACT,YACqBC,kBAAuD,EACvDC,MAAwB,EACxBC,SAAgC,CACnD;aAHmBF,kBAAkB,GAAlBA;aACAC,MAAM,GAANA;aACAC,SAAS,GAATA;IAClB;IAEH,IAAI,MAAM;QACN,OAAO,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS;IACjD;IAEA,IAAI,kBAAkB;QAClB,OAAO,IAAI,CAAC,SAAS,CAAC,eAAe,EAAE,KAAK,IAAI,CAAC,SAAS;IAC9D;IAEA,IAAI,kBAAkB;QAClB,OAAO,IAAI,CAAC,SAAS,CAAC,eAAe,EAAE,KAAK,IAAI,CAAC,SAAS;IAC9D;IAEA,IAAI,wBAAwB;QACxB,OAAO,IAAI,CAAC,SAAS,CAAC,qBAAqB,EAAE,KAAK,IAAI,CAAC,SAAS;IACpE;IAEA,IAAI,SAAS;QACT,OAAO,OAAOC;YACV,MAAM,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,EAAEA,QAAQ;YACnD,MAAM,IAAI,CAAC,cAAc,CAACA,QAAQ;QACtC;IACJ;IAEA,IAAI,UAAU;QACV,OAAO,OAAOA;YACV,MAAM,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,SAAS,CAAC,OAAO,EAAEA,QAAQ;YACpD,MAAM,IAAI,CAAC,cAAc,CAACA,QAAQ;QACtC;IACJ;IAEA,IAAI,UAAU;QACV,OAAO,OAAOA;YACV,MAAM,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,SAAS,CAAC,OAAO,EAAEA,QAAQ;YACpD,MAAM,IAAI,CAAC,cAAc,CAACA,QAAQ;QACtC;IACJ;IAEA,MAAc,eACVA,MAAkB,EAClBC,KAA0C,EAC7B;QACb,MAAMC,SAASC,qBAAqBH,OAAO,UAAU,CAAC,WAAW;QACjE,IAAI,CAACE,OAAO,GAAG,CAACD,QACZ;QAGJ,MAAM,IAAI,CAAC,kBAAkB,CAAC,OAAO,CAACD,OAAO,IAAI,CAAC,EAAE;IACxD;IAEA,MAAc,SACVI,IAAqC,EACrCJ,MAAkB,EAClBK,IAAY,EACC;QACb,IAAI,CAACD,MACD;QAGJ,IAAI;YACA,MAAMA,KAAK,IAAI,CAAC,IAAI,CAAC,SAAS,EAAEJ;QACpC,EAAE,OAAOM,IAAI;YACT,IAAI,CAAC,MAAM,CAAC,KAAK,CACb;gBAAE,OAAOC,mBAAmBD;gBAAK,QAAQN,OAAO,IAAI,CAAC,EAAE;gBAAE,MAAMK;YAAK,GACpE;QAER;IACJ;AACJ;AAEO,MAAMG,mCAAmCC,YAAY,eAAe,CAAC;IACxE,WAAWb;IACX,cAAc;QAACc;QAA2BC;KAAO;AACrD"}
@@ -0,0 +1,27 @@
1
+ import { TaskDefinition } from "@webiny/api-core/features/task/TaskDefinition/index.js";
2
+ /**
3
+ * Fills in the defaults a definition is allowed to leave out, applies the one rule that overrides
4
+ * what a definition asked for (self-cleanup forces `databaseLogs` off), and rejects an id that is
5
+ * not camelCase.
6
+ *
7
+ * Everything here is metadata. A definition carries no behaviour, so there is nothing to forward:
8
+ * `GetRunnableTaskDefinitionUseCase` takes `run` and the hooks from the handler that `handler` names, after
9
+ * this decorator has run.
10
+ */
11
+ export declare class TaskDefinitionDefaultsDecoratorImpl implements TaskDefinition.Interface {
12
+ private decoratee;
13
+ private readonly cleansUp;
14
+ constructor(decoratee: TaskDefinition.Interface);
15
+ get id(): string;
16
+ get title(): string;
17
+ get description(): string | undefined;
18
+ get handler(): import("@webiny/di").Constructor<import("@webiny/api-core/features/task/TaskDefinition/abstractions").ITaskHandler<import("@webiny/api-core/features/task/TaskDefinition/abstractions").ITaskInput, import("@webiny/api-core/features/task/TaskDefinition/abstractions").ITaskOutput>>;
19
+ get isPrivate(): boolean;
20
+ get databaseLogs(): boolean;
21
+ get maxIterations(): number;
22
+ get selfCleanup(): import("@webiny/api-core/features/task/TaskDefinition/abstractions").ISelfCleanup | undefined;
23
+ private validate;
24
+ }
25
+ export declare const TaskDefinitionDefaultsDecorator: typeof TaskDefinitionDefaultsDecoratorImpl & {
26
+ __abstraction: import("@webiny/di").Abstraction<import("@webiny/api-core/features/task/TaskDefinition/abstractions").ITaskDefinition<import("@webiny/api-core/features/task/TaskDefinition/abstractions").ITaskInput, import("@webiny/api-core/features/task/TaskDefinition/abstractions").ITaskOutput>>;
27
+ };
@@ -1,11 +1,13 @@
1
1
  import camelCase from "lodash/camelCase.js";
2
2
  import error from "@webiny/error";
3
3
  import { TaskDefinition } from "@webiny/api-core/features/task/TaskDefinition/index.js";
4
+ import { normalizeSelfCleanup } from "../utils/normalizeSelfCleanup.js";
4
5
  const DEFAULT_MAX_ITERATIONS = 50;
5
- class RunnableTaskDecoratorImpl {
6
+ class TaskDefinitionDefaultsDecoratorImpl {
6
7
  constructor(decoratee){
7
8
  this.decoratee = decoratee;
8
9
  this.validate();
10
+ this.cleansUp = normalizeSelfCleanup(decoratee.selfCleanup).size > 0;
9
11
  }
10
12
  get id() {
11
13
  return this.decoratee.id;
@@ -16,10 +18,14 @@ class RunnableTaskDecoratorImpl {
16
18
  get description() {
17
19
  return this.decoratee.description;
18
20
  }
21
+ get handler() {
22
+ return this.decoratee.handler;
23
+ }
19
24
  get isPrivate() {
20
25
  return this.decoratee.isPrivate || false;
21
26
  }
22
27
  get databaseLogs() {
28
+ if (this.cleansUp) return false;
23
29
  return this.decoratee.databaseLogs || false;
24
30
  }
25
31
  get maxIterations() {
@@ -28,41 +34,14 @@ class RunnableTaskDecoratorImpl {
28
34
  get selfCleanup() {
29
35
  return this.decoratee.selfCleanup;
30
36
  }
31
- get createInputValidation() {
32
- return this.decoratee.createInputValidation;
33
- }
34
- get handler() {
35
- return this.decoratee.handler;
36
- }
37
- get run() {
38
- return this.decoratee.run?.bind(this.decoratee);
39
- }
40
- get onBeforeTrigger() {
41
- return this.decoratee.onBeforeTrigger?.bind(this.decoratee);
42
- }
43
- get onDone() {
44
- return this.decoratee.onDone?.bind(this.decoratee);
45
- }
46
- get onError() {
47
- return this.decoratee.onError?.bind(this.decoratee);
48
- }
49
- get onAbort() {
50
- return this.decoratee.onAbort?.bind(this.decoratee);
51
- }
52
- get onMaxIterations() {
53
- return this.decoratee.onMaxIterations?.bind(this.decoratee);
54
- }
55
37
  validate() {
56
38
  if (camelCase(this.decoratee.id) !== this.decoratee.id) throw new error(`Task ID "${this.decoratee.id}" is invalid. It must be in camelCase format, for example: "myCustomTask".`);
57
39
  }
58
- getTask() {
59
- return this;
60
- }
61
40
  }
62
- const RunnableTaskDecorator = TaskDefinition.createDecorator({
63
- decorator: RunnableTaskDecoratorImpl,
41
+ const TaskDefinitionDefaultsDecorator = TaskDefinition.createDecorator({
42
+ decorator: TaskDefinitionDefaultsDecoratorImpl,
64
43
  dependencies: []
65
44
  });
66
- export { RunnableTaskDecorator };
45
+ export { TaskDefinitionDefaultsDecorator, TaskDefinitionDefaultsDecoratorImpl };
67
46
 
68
- //# sourceMappingURL=RunnableTaskDecorator.js.map
47
+ //# sourceMappingURL=TaskDefinitionDefaultsDecorator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"api/decorators/TaskDefinitionDefaultsDecorator.js","sources":["../../../src/api/decorators/TaskDefinitionDefaultsDecorator.ts"],"sourcesContent":["import camelCase from \"lodash/camelCase.js\";\nimport WebinyError from \"@webiny/error\";\nimport { TaskDefinition } from \"@webiny/api-core/features/task/TaskDefinition/index.js\";\nimport { normalizeSelfCleanup } from \"~/api/utils/normalizeSelfCleanup.js\";\n\nconst DEFAULT_MAX_ITERATIONS = 50;\n\n/**\n * Fills in the defaults a definition is allowed to leave out, applies the one rule that overrides\n * what a definition asked for (self-cleanup forces `databaseLogs` off), and rejects an id that is\n * not camelCase.\n *\n * Everything here is metadata. A definition carries no behaviour, so there is nothing to forward:\n * `GetRunnableTaskDefinitionUseCase` takes `run` and the hooks from the handler that `handler` names, after\n * this decorator has run.\n */\nexport class TaskDefinitionDefaultsDecoratorImpl implements TaskDefinition.Interface {\n private readonly cleansUp: boolean;\n\n constructor(private decoratee: TaskDefinition.Interface) {\n this.validate();\n this.cleansUp = normalizeSelfCleanup(decoratee.selfCleanup).size > 0;\n }\n\n get id() {\n return this.decoratee.id;\n }\n\n get title() {\n return this.decoratee.title;\n }\n\n get description() {\n return this.decoratee.description;\n }\n\n get handler() {\n return this.decoratee.handler;\n }\n\n // The three defaults.\n get isPrivate() {\n return this.decoratee.isPrivate || false;\n }\n\n get databaseLogs() {\n // A task that deletes itself on the way out has nowhere to keep logs, so asking for any\n // cleanup event overrides the task's own choice.\n if (this.cleansUp) {\n return false;\n }\n return this.decoratee.databaseLogs || false;\n }\n\n get maxIterations() {\n return this.decoratee.maxIterations || DEFAULT_MAX_ITERATIONS;\n }\n\n get selfCleanup() {\n return this.decoratee.selfCleanup;\n }\n\n private validate(): void {\n if (camelCase(this.decoratee.id) !== this.decoratee.id) {\n throw new WebinyError(\n `Task ID \"${this.decoratee.id}\" is invalid. It must be in camelCase format, for example: \"myCustomTask\".`\n );\n }\n }\n}\n\nexport const TaskDefinitionDefaultsDecorator = TaskDefinition.createDecorator({\n decorator: TaskDefinitionDefaultsDecoratorImpl,\n dependencies: []\n});\n"],"names":["DEFAULT_MAX_ITERATIONS","TaskDefinitionDefaultsDecoratorImpl","decoratee","normalizeSelfCleanup","camelCase","WebinyError","TaskDefinitionDefaultsDecorator","TaskDefinition"],"mappings":";;;;AAKA,MAAMA,yBAAyB;AAWxB,MAAMC;IAGT,YAAoBC,SAAmC,CAAE;aAArCA,SAAS,GAATA;QAChB,IAAI,CAAC,QAAQ;QACb,IAAI,CAAC,QAAQ,GAAGC,qBAAqBD,UAAU,WAAW,EAAE,IAAI,GAAG;IACvE;IAEA,IAAI,KAAK;QACL,OAAO,IAAI,CAAC,SAAS,CAAC,EAAE;IAC5B;IAEA,IAAI,QAAQ;QACR,OAAO,IAAI,CAAC,SAAS,CAAC,KAAK;IAC/B;IAEA,IAAI,cAAc;QACd,OAAO,IAAI,CAAC,SAAS,CAAC,WAAW;IACrC;IAEA,IAAI,UAAU;QACV,OAAO,IAAI,CAAC,SAAS,CAAC,OAAO;IACjC;IAGA,IAAI,YAAY;QACZ,OAAO,IAAI,CAAC,SAAS,CAAC,SAAS,IAAI;IACvC;IAEA,IAAI,eAAe;QAGf,IAAI,IAAI,CAAC,QAAQ,EACb,OAAO;QAEX,OAAO,IAAI,CAAC,SAAS,CAAC,YAAY,IAAI;IAC1C;IAEA,IAAI,gBAAgB;QAChB,OAAO,IAAI,CAAC,SAAS,CAAC,aAAa,IAAIF;IAC3C;IAEA,IAAI,cAAc;QACd,OAAO,IAAI,CAAC,SAAS,CAAC,WAAW;IACrC;IAEQ,WAAiB;QACrB,IAAII,UAAU,IAAI,CAAC,SAAS,CAAC,EAAE,MAAM,IAAI,CAAC,SAAS,CAAC,EAAE,EAClD,MAAM,IAAIC,MACN,CAAC,SAAS,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC,0EAA0E,CAAC;IAGrH;AACJ;AAEO,MAAMC,kCAAkCC,eAAe,eAAe,CAAC;IAC1E,WAAWN;IACX,cAAc,EAAE;AACpB"}
@@ -7,16 +7,6 @@ export declare class TaskDefinitionNotFoundError extends BaseError<{
7
7
  readonly code: "BackgroundTasks/TaskDefinition/NotFoundError";
8
8
  constructor(id: string);
9
9
  }
10
- /**
11
- * A definition was found by id but supplies no behaviour: neither a `handler` class nor its own
12
- * `run()`. Only reachable while definitions are migrating from one shape to the other.
13
- */
14
- export declare class TaskDefinitionNotRunnableError extends BaseError<{
15
- id: string;
16
- }> {
17
- readonly code: "BackgroundTasks/TaskDefinition/NotRunnableError";
18
- constructor(id: string);
19
- }
20
10
  export declare class TaskNotFoundError extends BaseError {
21
11
  readonly code: "BackgroundTasks/Task/NotFoundError";
22
12
  constructor();
@@ -10,16 +10,6 @@ class TaskDefinitionNotFoundError extends BaseError {
10
10
  }), this.code = "BackgroundTasks/TaskDefinition/NotFoundError";
11
11
  }
12
12
  }
13
- class TaskDefinitionNotRunnableError extends BaseError {
14
- constructor(id){
15
- super({
16
- message: `Task definition "${id}" defines neither a "handler" nor a "run" method.`,
17
- data: {
18
- id
19
- }
20
- }), this.code = "BackgroundTasks/TaskDefinition/NotRunnableError";
21
- }
22
- }
23
13
  class TaskNotFoundError extends BaseError {
24
14
  constructor(){
25
15
  super({
@@ -106,6 +96,6 @@ class BackgroundTaskNotAuthorizedError extends BaseError {
106
96
  }), this.code = "BackgroundTasks/NotAuthorized";
107
97
  }
108
98
  }
109
- export { BackgroundTaskModelNotFoundError, BackgroundTaskNotAuthorizedError, BackgroundTaskPersistenceError, BackgroundTaskValidationError, TaskAbortError, TaskDefinitionNotFoundError, TaskDefinitionNotRunnableError, TaskLogNotFoundError, TaskNotFoundError, TaskServiceInfoError };
99
+ export { BackgroundTaskModelNotFoundError, BackgroundTaskNotAuthorizedError, BackgroundTaskPersistenceError, BackgroundTaskValidationError, TaskAbortError, TaskDefinitionNotFoundError, TaskLogNotFoundError, TaskNotFoundError, TaskServiceInfoError };
110
100
 
111
101
  //# sourceMappingURL=errors.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"api/domain/errors.js","sources":["../../../src/api/domain/errors.ts"],"sourcesContent":["import { BaseError } from \"@webiny/feature/api\";\nimport type { ZodError } from \"zod\";\nimport { parseZodError } from \"@webiny/utils\";\nimport type { ValidationIssue } from \"@webiny/utils\";\n\nexport class TaskDefinitionNotFoundError extends BaseError<{ id: string }> {\n override readonly code = \"BackgroundTasks/TaskDefinition/NotFoundError\" as const;\n\n constructor(id: string) {\n super({\n message: \"Task definition not found.\",\n data: {\n id\n }\n });\n }\n}\n\n/**\n * A definition was found by id but supplies no behaviour: neither a `handler` class nor its own\n * `run()`. Only reachable while definitions are migrating from one shape to the other.\n */\nexport class TaskDefinitionNotRunnableError extends BaseError<{ id: string }> {\n override readonly code = \"BackgroundTasks/TaskDefinition/NotRunnableError\" as const;\n\n constructor(id: string) {\n super({\n message: `Task definition \"${id}\" defines neither a \"handler\" nor a \"run\" method.`,\n data: {\n id\n }\n });\n }\n}\n\nexport class TaskNotFoundError extends BaseError {\n override readonly code = \"BackgroundTasks/Task/NotFoundError\" as const;\n\n constructor() {\n super({\n message: \"Task not found.\"\n });\n }\n}\n\nexport class TaskAbortError extends BaseError<{ id: string; status: string }> {\n override readonly code = \"BackgroundTasks/Task/Abort\" as const;\n\n constructor(data: { id: string; status: string }) {\n super({\n message: \"Cannot abort a task that is not pending or running!\",\n data\n });\n }\n}\n\nexport class TaskLogNotFoundError extends BaseError {\n override readonly code = \"BackgroundTasks/Log/NotFoundError\" as const;\n\n constructor() {\n super({\n message: \"Task log not found.\"\n });\n }\n}\n\nexport class TaskServiceInfoError extends BaseError {\n override readonly code = \"BackgroundTasks/Service/InfoUnavailable\" as const;\n\n constructor() {\n super({\n message: \"Unable to fetch service info.\"\n });\n }\n}\n\ninterface BackgroundTaskValidationErrorData {\n issues: ValidationIssue[];\n}\n\nexport class BackgroundTaskValidationError extends BaseError<BackgroundTaskValidationErrorData> {\n override readonly code = \"BackgroundTasks/ValidationError\" as const;\n\n constructor(error: string | ZodError) {\n if (typeof error === \"string\") {\n super({ message: error, data: { issues: [] } });\n } else {\n const issues = parseZodError(error);\n super({ message: \"Validation failed.\", data: { issues } });\n }\n }\n}\n\ninterface BackgroundTaskPersistenceErrorData {\n originalMessage: string;\n originalCode?: string;\n originalData?: unknown;\n}\n\nexport class BackgroundTaskPersistenceError extends BaseError<BackgroundTaskPersistenceErrorData> {\n override readonly code = \"BackgroundTasks/PersistenceError\" as const;\n\n constructor(error: Error) {\n super({ message: error.message, data: { originalMessage: error.message } });\n }\n\n static from(error: unknown): BackgroundTaskPersistenceError {\n if (error instanceof Error) {\n const instance = new BackgroundTaskPersistenceError(error);\n const data: BackgroundTaskPersistenceErrorData = {\n originalMessage: error.message,\n originalCode: (error as any).code,\n originalData: (error as any).data\n };\n (instance as any).data = data;\n instance.stack = error.stack;\n return instance;\n }\n\n return new BackgroundTaskPersistenceError(new Error(String(error)));\n }\n}\n\nexport class BackgroundTaskModelNotFoundError extends BaseError {\n override readonly code = \"BackgroundTasks/ModelNotFound\" as const;\n\n constructor(modelId: string) {\n super({ message: `Background task model \"${modelId}\" was not found.` });\n }\n}\n\nexport class BackgroundTaskNotAuthorizedError extends BaseError {\n override readonly code = \"BackgroundTasks/NotAuthorized\" as const;\n\n constructor() {\n super({ message: \"Not authorized!\" });\n }\n}\n"],"names":["TaskDefinitionNotFoundError","BaseError","id","TaskDefinitionNotRunnableError","TaskNotFoundError","TaskAbortError","data","TaskLogNotFoundError","TaskServiceInfoError","BackgroundTaskValidationError","error","issues","parseZodError","BackgroundTaskPersistenceError","Error","instance","String","BackgroundTaskModelNotFoundError","modelId","BackgroundTaskNotAuthorizedError"],"mappings":";;AAKO,MAAMA,oCAAoCC;IAG7C,YAAYC,EAAU,CAAE;QACpB,KAAK,CAAC;YACF,SAAS;YACT,MAAM;gBACFA;YACJ;QACJ,SARc,IAAI,GAAG;IASzB;AACJ;AAMO,MAAMC,uCAAuCF;IAGhD,YAAYC,EAAU,CAAE;QACpB,KAAK,CAAC;YACF,SAAS,CAAC,iBAAiB,EAAEA,GAAG,iDAAiD,CAAC;YAClF,MAAM;gBACFA;YACJ;QACJ,SARc,IAAI,GAAG;IASzB;AACJ;AAEO,MAAME,0BAA0BH;IAGnC,aAAc;QACV,KAAK,CAAC;YACF,SAAS;QACb,SALc,IAAI,GAAG;IAMzB;AACJ;AAEO,MAAMI,uBAAuBJ;IAGhC,YAAYK,IAAoC,CAAE;QAC9C,KAAK,CAAC;YACF,SAAS;YACTA;QACJ,SANc,IAAI,GAAG;IAOzB;AACJ;AAEO,MAAMC,6BAA6BN;IAGtC,aAAc;QACV,KAAK,CAAC;YACF,SAAS;QACb,SALc,IAAI,GAAG;IAMzB;AACJ;AAEO,MAAMO,6BAA6BP;IAGtC,aAAc;QACV,KAAK,CAAC;YACF,SAAS;QACb,SALc,IAAI,GAAG;IAMzB;AACJ;AAMO,MAAMQ,sCAAsCR;IAG/C,YAAYS,KAAwB,CAAE;QAClC,IAAI,AAAiB,YAAjB,OAAOA,OACP,KAAK,CAAC;YAAE,SAASA;YAAO,MAAM;gBAAE,QAAQ,EAAE;YAAC;QAAE,SAJnC,IAAI,GAAG;aAKd;YACH,MAAMC,SAASC,cAAcF;YAC7B,KAAK,CAAC;gBAAE,SAAS;gBAAsB,MAAM;oBAAEC;gBAAO;YAAE,SAP9C,IAAI,GAAG;QAQrB;IACJ;AACJ;AAQO,MAAME,uCAAuCZ;IAGhD,YAAYS,KAAY,CAAE;QACtB,KAAK,CAAC;YAAE,SAASA,MAAM,OAAO;YAAE,MAAM;gBAAE,iBAAiBA,MAAM,OAAO;YAAC;QAAE,SAH3D,IAAI,GAAG;IAIzB;IAEA,OAAO,KAAKA,KAAc,EAAkC;QACxD,IAAIA,iBAAiBI,OAAO;YACxB,MAAMC,WAAW,IAAIF,+BAA+BH;YACpD,MAAMJ,OAA2C;gBAC7C,iBAAiBI,MAAM,OAAO;gBAC9B,cAAeA,MAAc,IAAI;gBACjC,cAAeA,MAAc,IAAI;YACrC;YACCK,SAAiB,IAAI,GAAGT;YACzBS,SAAS,KAAK,GAAGL,MAAM,KAAK;YAC5B,OAAOK;QACX;QAEA,OAAO,IAAIF,+BAA+B,IAAIC,MAAME,OAAON;IAC/D;AACJ;AAEO,MAAMO,yCAAyChB;IAGlD,YAAYiB,OAAe,CAAE;QACzB,KAAK,CAAC;YAAE,SAAS,CAAC,uBAAuB,EAAEA,QAAQ,gBAAgB,CAAC;QAAC,SAHvD,IAAI,GAAG;IAIzB;AACJ;AAEO,MAAMC,yCAAyClB;IAGlD,aAAc;QACV,KAAK,CAAC;YAAE,SAAS;QAAkB,SAHrB,IAAI,GAAG;IAIzB;AACJ"}
1
+ {"version":3,"file":"api/domain/errors.js","sources":["../../../src/api/domain/errors.ts"],"sourcesContent":["import { BaseError } from \"@webiny/feature/api\";\nimport type { ZodError } from \"zod\";\nimport { parseZodError } from \"@webiny/utils\";\nimport type { ValidationIssue } from \"@webiny/utils\";\n\nexport class TaskDefinitionNotFoundError extends BaseError<{ id: string }> {\n override readonly code = \"BackgroundTasks/TaskDefinition/NotFoundError\" as const;\n\n constructor(id: string) {\n super({\n message: \"Task definition not found.\",\n data: {\n id\n }\n });\n }\n}\n\nexport class TaskNotFoundError extends BaseError {\n override readonly code = \"BackgroundTasks/Task/NotFoundError\" as const;\n\n constructor() {\n super({\n message: \"Task not found.\"\n });\n }\n}\n\nexport class TaskAbortError extends BaseError<{ id: string; status: string }> {\n override readonly code = \"BackgroundTasks/Task/Abort\" as const;\n\n constructor(data: { id: string; status: string }) {\n super({\n message: \"Cannot abort a task that is not pending or running!\",\n data\n });\n }\n}\n\nexport class TaskLogNotFoundError extends BaseError {\n override readonly code = \"BackgroundTasks/Log/NotFoundError\" as const;\n\n constructor() {\n super({\n message: \"Task log not found.\"\n });\n }\n}\n\nexport class TaskServiceInfoError extends BaseError {\n override readonly code = \"BackgroundTasks/Service/InfoUnavailable\" as const;\n\n constructor() {\n super({\n message: \"Unable to fetch service info.\"\n });\n }\n}\n\ninterface BackgroundTaskValidationErrorData {\n issues: ValidationIssue[];\n}\n\nexport class BackgroundTaskValidationError extends BaseError<BackgroundTaskValidationErrorData> {\n override readonly code = \"BackgroundTasks/ValidationError\" as const;\n\n constructor(error: string | ZodError) {\n if (typeof error === \"string\") {\n super({ message: error, data: { issues: [] } });\n } else {\n const issues = parseZodError(error);\n super({ message: \"Validation failed.\", data: { issues } });\n }\n }\n}\n\ninterface BackgroundTaskPersistenceErrorData {\n originalMessage: string;\n originalCode?: string;\n originalData?: unknown;\n}\n\nexport class BackgroundTaskPersistenceError extends BaseError<BackgroundTaskPersistenceErrorData> {\n override readonly code = \"BackgroundTasks/PersistenceError\" as const;\n\n constructor(error: Error) {\n super({ message: error.message, data: { originalMessage: error.message } });\n }\n\n static from(error: unknown): BackgroundTaskPersistenceError {\n if (error instanceof Error) {\n const instance = new BackgroundTaskPersistenceError(error);\n const data: BackgroundTaskPersistenceErrorData = {\n originalMessage: error.message,\n originalCode: (error as any).code,\n originalData: (error as any).data\n };\n (instance as any).data = data;\n instance.stack = error.stack;\n return instance;\n }\n\n return new BackgroundTaskPersistenceError(new Error(String(error)));\n }\n}\n\nexport class BackgroundTaskModelNotFoundError extends BaseError {\n override readonly code = \"BackgroundTasks/ModelNotFound\" as const;\n\n constructor(modelId: string) {\n super({ message: `Background task model \"${modelId}\" was not found.` });\n }\n}\n\nexport class BackgroundTaskNotAuthorizedError extends BaseError {\n override readonly code = \"BackgroundTasks/NotAuthorized\" as const;\n\n constructor() {\n super({ message: \"Not authorized!\" });\n }\n}\n"],"names":["TaskDefinitionNotFoundError","BaseError","id","TaskNotFoundError","TaskAbortError","data","TaskLogNotFoundError","TaskServiceInfoError","BackgroundTaskValidationError","error","issues","parseZodError","BackgroundTaskPersistenceError","Error","instance","String","BackgroundTaskModelNotFoundError","modelId","BackgroundTaskNotAuthorizedError"],"mappings":";;AAKO,MAAMA,oCAAoCC;IAG7C,YAAYC,EAAU,CAAE;QACpB,KAAK,CAAC;YACF,SAAS;YACT,MAAM;gBACFA;YACJ;QACJ,SARc,IAAI,GAAG;IASzB;AACJ;AAEO,MAAMC,0BAA0BF;IAGnC,aAAc;QACV,KAAK,CAAC;YACF,SAAS;QACb,SALc,IAAI,GAAG;IAMzB;AACJ;AAEO,MAAMG,uBAAuBH;IAGhC,YAAYI,IAAoC,CAAE;QAC9C,KAAK,CAAC;YACF,SAAS;YACTA;QACJ,SANc,IAAI,GAAG;IAOzB;AACJ;AAEO,MAAMC,6BAA6BL;IAGtC,aAAc;QACV,KAAK,CAAC;YACF,SAAS;QACb,SALc,IAAI,GAAG;IAMzB;AACJ;AAEO,MAAMM,6BAA6BN;IAGtC,aAAc;QACV,KAAK,CAAC;YACF,SAAS;QACb,SALc,IAAI,GAAG;IAMzB;AACJ;AAMO,MAAMO,sCAAsCP;IAG/C,YAAYQ,KAAwB,CAAE;QAClC,IAAI,AAAiB,YAAjB,OAAOA,OACP,KAAK,CAAC;YAAE,SAASA;YAAO,MAAM;gBAAE,QAAQ,EAAE;YAAC;QAAE,SAJnC,IAAI,GAAG;aAKd;YACH,MAAMC,SAASC,cAAcF;YAC7B,KAAK,CAAC;gBAAE,SAAS;gBAAsB,MAAM;oBAAEC;gBAAO;YAAE,SAP9C,IAAI,GAAG;QAQrB;IACJ;AACJ;AAQO,MAAME,uCAAuCX;IAGhD,YAAYQ,KAAY,CAAE;QACtB,KAAK,CAAC;YAAE,SAASA,MAAM,OAAO;YAAE,MAAM;gBAAE,iBAAiBA,MAAM,OAAO;YAAC;QAAE,SAH3D,IAAI,GAAG;IAIzB;IAEA,OAAO,KAAKA,KAAc,EAAkC;QACxD,IAAIA,iBAAiBI,OAAO;YACxB,MAAMC,WAAW,IAAIF,+BAA+BH;YACpD,MAAMJ,OAA2C;gBAC7C,iBAAiBI,MAAM,OAAO;gBAC9B,cAAeA,MAAc,IAAI;gBACjC,cAAeA,MAAc,IAAI;YACrC;YACCK,SAAiB,IAAI,GAAGT;YACzBS,SAAS,KAAK,GAAGL,MAAM,KAAK;YAC5B,OAAOK;QACX;QAEA,OAAO,IAAIF,+BAA+B,IAAIC,MAAME,OAAON;IAC/D;AACJ;AAEO,MAAMO,yCAAyCf;IAGlD,YAAYgB,OAAe,CAAE;QACzB,KAAK,CAAC;YAAE,SAAS,CAAC,uBAAuB,EAAEA,QAAQ,gBAAgB,CAAC;QAAC,SAHvD,IAAI,GAAG;IAIzB;AACJ;AAEO,MAAMC,yCAAyCjB;IAGlD,aAAc;QACV,KAAK,CAAC;YAAE,SAAS;QAAkB,SAHrB,IAAI,GAAG;IAIzB;AACJ"}
@@ -1,15 +1,13 @@
1
1
  import { Result } from "@webiny/feature/api";
2
- import { GetTaskDefinitionUseCase as UseCaseAbstraction } from "./abstractions.js";
2
+ import { GetRunnableTaskDefinitionUseCase as UseCaseAbstraction } from "./abstractions.js";
3
3
  import { TaskDefinition } from "@webiny/api-core/features/task/TaskDefinition/index.js";
4
4
  import { TaskHandlerResolver } from "../../../api/features/TaskHandlerResolver/index.js";
5
- import { Logger } from "@webiny/api-core/features/logger/index.js";
6
- export declare class GetTaskDefinitionUseCaseImpl implements UseCaseAbstraction.Interface {
5
+ export declare class GetRunnableTaskDefinitionUseCaseImpl implements UseCaseAbstraction.Interface {
7
6
  private definitions;
8
7
  private handlerResolver;
9
- private logger;
10
- constructor(definitions: TaskDefinition.Interface[], handlerResolver: TaskHandlerResolver.Interface, logger: Logger.Interface);
8
+ constructor(definitions: TaskDefinition.Interface[], handlerResolver: TaskHandlerResolver.Interface);
11
9
  execute<I extends TaskDefinition.TaskInput = TaskDefinition.TaskInput, O extends TaskDefinition.TaskOutput = TaskDefinition.TaskOutput>(id: string): Result<TaskDefinition.Runnable<I, O>, UseCaseAbstraction.Error>;
12
10
  }
13
- export declare const GetTaskDefinitionUseCase: typeof GetTaskDefinitionUseCaseImpl & {
14
- __abstraction: import("@webiny/di").Abstraction<import("./abstractions.js").IGetTaskDefinitionUseCase>;
11
+ export declare const GetRunnableTaskDefinitionUseCase: typeof GetRunnableTaskDefinitionUseCaseImpl & {
12
+ __abstraction: import("@webiny/di").Abstraction<import("./abstractions.js").IGetRunnableTaskDefinitionUseCase>;
15
13
  };