@webiny/tasks 6.3.0-beta.1 → 6.3.0-beta.3

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/context.js CHANGED
@@ -1,6 +1,7 @@
1
1
  import { ContextPlugin } from "@webiny/api";
2
2
  import { TaskService } from "@webiny/api-core/features/task/TaskService/index.js";
3
3
  import { RunnableTaskDecorator } from "./decorators/RunnableTaskDecorator.js";
4
+ import { SelfCleaningTaskDecorator } from "./decorators/SelfCleaningTaskDecorator.js";
4
5
  import { TaskController } from "./features/TaskController/index.js";
5
6
  import { TaskPrivateModel } from "./crud/TaskPrivateModel.js";
6
7
  import { TaskLogPrivateModel } from "./crud/TaskLogPrivateModel.js";
@@ -11,6 +12,7 @@ import { createServicePlugins } from "./service/index.js";
11
12
  import { TaskExecutionContextFeature } from "./features/TaskExecutionContext/feature.js";
12
13
  import { GetTaskDefinitionFeature } from "./features/GetTaskDefinition/feature.js";
13
14
  import { ListTaskDefinitionsFeature } from "./features/ListTaskDefinitions/feature.js";
15
+ import { CleanupTaskSubtreeUseCase, CleanupTaskSubtreeUseCaseImpl } from "./features/CleanupTaskSubtree/index.js";
14
16
  import { TestingRunTaskDefinition } from "./tasks/testingRunTask.js";
15
17
  const createTasksCrud = () => {
16
18
  const plugin = new ContextPlugin(async context => {
@@ -20,6 +22,7 @@ const createTasksCrud = () => {
20
22
 
21
23
  // Register the RunnableTaskDecorator to wrap all TaskDefinition instances
22
24
  context.container.registerDecorator(RunnableTaskDecorator);
25
+ context.container.registerDecorator(SelfCleaningTaskDecorator);
23
26
 
24
27
  // Register task definition use cases
25
28
  GetTaskDefinitionFeature.register(context.container);
@@ -29,6 +32,10 @@ const createTasksCrud = () => {
29
32
  ...createTaskCrud(context),
30
33
  ...createServiceCrud(context)
31
34
  };
35
+
36
+ // The cleanup use case is a thin wrapper around `context.tasks.cleanupTaskSubtree`,
37
+ // so it must register AFTER the CRUD is wired onto the context.
38
+ context.container.registerInstance(CleanupTaskSubtreeUseCase, new CleanupTaskSubtreeUseCaseImpl(context));
32
39
  });
33
40
  plugin.name = "tasks.context";
34
41
  return plugin;
package/context.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"names":["ContextPlugin","TaskService","RunnableTaskDecorator","TaskController","TaskPrivateModel","TaskLogPrivateModel","createDefinitionCrud","createServiceCrud","createTaskCrud","createServicePlugins","TaskExecutionContextFeature","GetTaskDefinitionFeature","ListTaskDefinitionsFeature","TestingRunTaskDefinition","createTasksCrud","plugin","context","container","register","registerDecorator","tasks","name","createTasksContext","createBackgroundTaskContext","registerInstance"],"sources":["context.ts"],"sourcesContent":["import type { Plugin } from \"@webiny/plugins\";\nimport { ContextPlugin } from \"@webiny/api\";\nimport { TaskService } from \"@webiny/api-core/features/task/TaskService/index.js\";\nimport { RunnableTaskDecorator } from \"./decorators/RunnableTaskDecorator.js\";\nimport { TaskController } from \"./features/TaskController/index.js\";\nimport type { Context } from \"~/types.js\";\nimport { TaskPrivateModel } from \"./crud/TaskPrivateModel.js\";\nimport { TaskLogPrivateModel } from \"./crud/TaskLogPrivateModel.js\";\nimport { createDefinitionCrud } from \"./crud/definition.tasks.js\";\nimport { createServiceCrud } from \"~/crud/service.tasks.js\";\nimport { createTaskCrud } from \"./crud/crud.tasks.js\";\nimport { createServicePlugins } from \"~/service/index.js\";\nimport { TaskExecutionContextFeature } from \"~/features/TaskExecutionContext/feature.js\";\nimport { GetTaskDefinitionFeature } from \"~/features/GetTaskDefinition/feature.js\";\nimport { ListTaskDefinitionsFeature } from \"~/features/ListTaskDefinitions/feature.js\";\nimport { TestingRunTaskDefinition } from \"~/tasks/testingRunTask.js\";\n\nconst createTasksCrud = () => {\n const plugin = new ContextPlugin<Context>(async context => {\n // Register the private models\n context.container.register(TaskPrivateModel);\n context.container.register(TaskLogPrivateModel);\n\n // Register the RunnableTaskDecorator to wrap all TaskDefinition instances\n context.container.registerDecorator(RunnableTaskDecorator);\n\n // Register task definition use cases\n GetTaskDefinitionFeature.register(context.container);\n ListTaskDefinitionsFeature.register(context.container);\n\n context.tasks = {\n ...createDefinitionCrud(context),\n ...createTaskCrud(context),\n ...createServiceCrud(context)\n };\n });\n\n plugin.name = \"tasks.context\";\n\n return plugin;\n};\n\nconst createTasksContext = (): Plugin[] => {\n return [...createServicePlugins(), createTasksCrud()];\n};\n\nexport const createBackgroundTaskContext = (): Plugin[] => {\n return [\n ...createTasksContext(),\n new ContextPlugin<Context>(context => {\n // Register legacy tasks context via a new abstraction\n context.container.registerInstance(TaskService, context.tasks);\n\n // Register TaskExecutionContext EARLY (singleton, empty)\n TaskExecutionContextFeature.register(context.container);\n\n // Register TaskController (depends on TaskExecutionContext)\n context.container.register(TaskController);\n\n // Register a test task\n context.container.register(TestingRunTaskDefinition);\n })\n ];\n};\n"],"mappings":"AACA,SAASA,aAAa,QAAQ,aAAa;AAC3C,SAASC,WAAW,QAAQ,qDAAqD;AACjF,SAASC,qBAAqB;AAC9B,SAASC,cAAc;AAEvB,SAASC,gBAAgB;AACzB,SAASC,mBAAmB;AAC5B,SAASC,oBAAoB;AAC7B,SAASC,iBAAiB;AAC1B,SAASC,cAAc;AACvB,SAASC,oBAAoB;AAC7B,SAASC,2BAA2B;AACpC,SAASC,wBAAwB;AACjC,SAASC,0BAA0B;AACnC,SAASC,wBAAwB;AAEjC,MAAMC,eAAe,GAAGA,CAAA,KAAM;EAC1B,MAAMC,MAAM,GAAG,IAAIf,aAAa,CAAU,MAAMgB,OAAO,IAAI;IACvD;IACAA,OAAO,CAACC,SAAS,CAACC,QAAQ,CAACd,gBAAgB,CAAC;IAC5CY,OAAO,CAACC,SAAS,CAACC,QAAQ,CAACb,mBAAmB,CAAC;;IAE/C;IACAW,OAAO,CAACC,SAAS,CAACE,iBAAiB,CAACjB,qBAAqB,CAAC;;IAE1D;IACAS,wBAAwB,CAACO,QAAQ,CAACF,OAAO,CAACC,SAAS,CAAC;IACpDL,0BAA0B,CAACM,QAAQ,CAACF,OAAO,CAACC,SAAS,CAAC;IAEtDD,OAAO,CAACI,KAAK,GAAG;MACZ,GAAGd,oBAAoB,CAACU,OAAO,CAAC;MAChC,GAAGR,cAAc,CAACQ,OAAO,CAAC;MAC1B,GAAGT,iBAAiB,CAACS,OAAO;IAChC,CAAC;EACL,CAAC,CAAC;EAEFD,MAAM,CAACM,IAAI,GAAG,eAAe;EAE7B,OAAON,MAAM;AACjB,CAAC;AAED,MAAMO,kBAAkB,GAAGA,CAAA,KAAgB;EACvC,OAAO,CAAC,GAAGb,oBAAoB,CAAC,CAAC,EAAEK,eAAe,CAAC,CAAC,CAAC;AACzD,CAAC;AAED,OAAO,MAAMS,2BAA2B,GAAGA,CAAA,KAAgB;EACvD,OAAO,CACH,GAAGD,kBAAkB,CAAC,CAAC,EACvB,IAAItB,aAAa,CAAUgB,OAAO,IAAI;IAClC;IACAA,OAAO,CAACC,SAAS,CAACO,gBAAgB,CAACvB,WAAW,EAAEe,OAAO,CAACI,KAAK,CAAC;;IAE9D;IACAV,2BAA2B,CAACQ,QAAQ,CAACF,OAAO,CAACC,SAAS,CAAC;;IAEvD;IACAD,OAAO,CAACC,SAAS,CAACC,QAAQ,CAACf,cAAc,CAAC;;IAE1C;IACAa,OAAO,CAACC,SAAS,CAACC,QAAQ,CAACL,wBAAwB,CAAC;EACxD,CAAC,CAAC,CACL;AACL,CAAC","ignoreList":[]}
1
+ {"version":3,"names":["ContextPlugin","TaskService","RunnableTaskDecorator","SelfCleaningTaskDecorator","TaskController","TaskPrivateModel","TaskLogPrivateModel","createDefinitionCrud","createServiceCrud","createTaskCrud","createServicePlugins","TaskExecutionContextFeature","GetTaskDefinitionFeature","ListTaskDefinitionsFeature","CleanupTaskSubtreeUseCase","CleanupTaskSubtreeUseCaseImpl","TestingRunTaskDefinition","createTasksCrud","plugin","context","container","register","registerDecorator","tasks","registerInstance","name","createTasksContext","createBackgroundTaskContext"],"sources":["context.ts"],"sourcesContent":["import type { Plugin } from \"@webiny/plugins\";\nimport { ContextPlugin } from \"@webiny/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 type { Context } from \"~/types.js\";\nimport { TaskPrivateModel } from \"./crud/TaskPrivateModel.js\";\nimport { TaskLogPrivateModel } from \"./crud/TaskLogPrivateModel.js\";\nimport { createDefinitionCrud } from \"./crud/definition.tasks.js\";\nimport { createServiceCrud } from \"~/crud/service.tasks.js\";\nimport { createTaskCrud } from \"./crud/crud.tasks.js\";\nimport { createServicePlugins } from \"~/service/index.js\";\nimport { TaskExecutionContextFeature } from \"~/features/TaskExecutionContext/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 { TestingRunTaskDefinition } from \"~/tasks/testingRunTask.js\";\n\nconst createTasksCrud = () => {\n const plugin = new ContextPlugin<Context>(async context => {\n // Register the private models\n context.container.register(TaskPrivateModel);\n context.container.register(TaskLogPrivateModel);\n\n // Register the RunnableTaskDecorator to wrap all TaskDefinition instances\n context.container.registerDecorator(RunnableTaskDecorator);\n context.container.registerDecorator(SelfCleaningTaskDecorator);\n\n // Register task definition use cases\n GetTaskDefinitionFeature.register(context.container);\n ListTaskDefinitionsFeature.register(context.container);\n\n context.tasks = {\n ...createDefinitionCrud(context),\n ...createTaskCrud(context),\n ...createServiceCrud(context)\n };\n\n // The cleanup use case is a thin wrapper around `context.tasks.cleanupTaskSubtree`,\n // so it must register AFTER the CRUD is wired onto the context.\n context.container.registerInstance(\n CleanupTaskSubtreeUseCase,\n new CleanupTaskSubtreeUseCaseImpl(context)\n );\n });\n\n plugin.name = \"tasks.context\";\n\n return plugin;\n};\n\nconst createTasksContext = (): Plugin[] => {\n return [...createServicePlugins(), createTasksCrud()];\n};\n\nexport const createBackgroundTaskContext = (): Plugin[] => {\n return [\n ...createTasksContext(),\n new ContextPlugin<Context>(context => {\n // Register legacy tasks context via a new abstraction\n context.container.registerInstance(TaskService, context.tasks);\n\n // Register TaskExecutionContext EARLY (singleton, empty)\n TaskExecutionContextFeature.register(context.container);\n\n // Register TaskController (depends on TaskExecutionContext)\n context.container.register(TaskController);\n\n // Register a test task\n context.container.register(TestingRunTaskDefinition);\n })\n ];\n};\n"],"mappings":"AACA,SAASA,aAAa,QAAQ,aAAa;AAC3C,SAASC,WAAW,QAAQ,qDAAqD;AACjF,SAASC,qBAAqB;AAC9B,SAASC,yBAAyB;AAClC,SAASC,cAAc;AAEvB,SAASC,gBAAgB;AACzB,SAASC,mBAAmB;AAC5B,SAASC,oBAAoB;AAC7B,SAASC,iBAAiB;AAC1B,SAASC,cAAc;AACvB,SAASC,oBAAoB;AAC7B,SAASC,2BAA2B;AACpC,SAASC,wBAAwB;AACjC,SAASC,0BAA0B;AACnC,SACIC,yBAAyB,EACzBC,6BAA6B;AAEjC,SAASC,wBAAwB;AAEjC,MAAMC,eAAe,GAAGA,CAAA,KAAM;EAC1B,MAAMC,MAAM,GAAG,IAAIlB,aAAa,CAAU,MAAMmB,OAAO,IAAI;IACvD;IACAA,OAAO,CAACC,SAAS,CAACC,QAAQ,CAAChB,gBAAgB,CAAC;IAC5Cc,OAAO,CAACC,SAAS,CAACC,QAAQ,CAACf,mBAAmB,CAAC;;IAE/C;IACAa,OAAO,CAACC,SAAS,CAACE,iBAAiB,CAACpB,qBAAqB,CAAC;IAC1DiB,OAAO,CAACC,SAAS,CAACE,iBAAiB,CAACnB,yBAAyB,CAAC;;IAE9D;IACAS,wBAAwB,CAACS,QAAQ,CAACF,OAAO,CAACC,SAAS,CAAC;IACpDP,0BAA0B,CAACQ,QAAQ,CAACF,OAAO,CAACC,SAAS,CAAC;IAEtDD,OAAO,CAACI,KAAK,GAAG;MACZ,GAAGhB,oBAAoB,CAACY,OAAO,CAAC;MAChC,GAAGV,cAAc,CAACU,OAAO,CAAC;MAC1B,GAAGX,iBAAiB,CAACW,OAAO;IAChC,CAAC;;IAED;IACA;IACAA,OAAO,CAACC,SAAS,CAACI,gBAAgB,CAC9BV,yBAAyB,EACzB,IAAIC,6BAA6B,CAACI,OAAO,CAC7C,CAAC;EACL,CAAC,CAAC;EAEFD,MAAM,CAACO,IAAI,GAAG,eAAe;EAE7B,OAAOP,MAAM;AACjB,CAAC;AAED,MAAMQ,kBAAkB,GAAGA,CAAA,KAAgB;EACvC,OAAO,CAAC,GAAGhB,oBAAoB,CAAC,CAAC,EAAEO,eAAe,CAAC,CAAC,CAAC;AACzD,CAAC;AAED,OAAO,MAAMU,2BAA2B,GAAGA,CAAA,KAAgB;EACvD,OAAO,CACH,GAAGD,kBAAkB,CAAC,CAAC,EACvB,IAAI1B,aAAa,CAAUmB,OAAO,IAAI;IAClC;IACAA,OAAO,CAACC,SAAS,CAACI,gBAAgB,CAACvB,WAAW,EAAEkB,OAAO,CAACI,KAAK,CAAC;;IAE9D;IACAZ,2BAA2B,CAACU,QAAQ,CAACF,OAAO,CAACC,SAAS,CAAC;;IAEvD;IACAD,OAAO,CAACC,SAAS,CAACC,QAAQ,CAACjB,cAAc,CAAC;;IAE1C;IACAe,OAAO,CAACC,SAAS,CAACC,QAAQ,CAACL,wBAAwB,CAAC;EACxD,CAAC,CAAC,CACL;AACL,CAAC","ignoreList":[]}
@@ -0,0 +1,8 @@
1
+ import type { Context } from "../types.js";
2
+ /**
3
+ * Recursively deletes the task identified by `rootId`, all its descendants, and
4
+ * their logs (when the owning definition has databaseLogs=true). Bottom-up,
5
+ * best-effort: per-record errors are logged and swallowed, the function never
6
+ * throws.
7
+ */
8
+ export declare const createCleanupTaskSubtree: (context: Context) => (rootId: string) => Promise<void>;
@@ -0,0 +1,76 @@
1
+ /**
2
+ * Recursively deletes the task identified by `rootId`, all its descendants, and
3
+ * their logs (when the owning definition has databaseLogs=true). Bottom-up,
4
+ * best-effort: per-record errors are logged and swallowed, the function never
5
+ * throws.
6
+ */
7
+ export const createCleanupTaskSubtree = context => {
8
+ const listChildren = async parentId => {
9
+ const {
10
+ items
11
+ } = await context.tasks.listTasks({
12
+ where: {
13
+ parentId
14
+ }
15
+ });
16
+ return items;
17
+ };
18
+ const collectSubtree = async rootId => {
19
+ const root = await context.tasks.getTask(rootId);
20
+ if (!root) {
21
+ return [];
22
+ }
23
+ const order = [root];
24
+ const seen = new Set([root.id]);
25
+ let i = 0;
26
+ while (i < order.length) {
27
+ const current = order[i++];
28
+ const kids = await listChildren(current.id);
29
+ for (const kid of kids) {
30
+ if (seen.has(kid.id)) {
31
+ continue;
32
+ }
33
+ seen.add(kid.id);
34
+ order.push(kid);
35
+ }
36
+ }
37
+ return order.reverse();
38
+ };
39
+ const deleteTaskLogs = async task => {
40
+ const definition = context.tasks.getDefinition(task.definitionId);
41
+ if (!definition || definition.databaseLogs !== true) {
42
+ return;
43
+ }
44
+ try {
45
+ const {
46
+ items
47
+ } = await context.tasks.listLogs({
48
+ where: {
49
+ task: task.id
50
+ }
51
+ });
52
+ for (const log of items) {
53
+ try {
54
+ await context.tasks.deleteLog(log.id);
55
+ } catch (ex) {
56
+ console.warn(`cleanupTaskSubtree: failed to delete log "${log.id}" for task "${task.id}": ${ex.message}`);
57
+ }
58
+ }
59
+ } catch (ex) {
60
+ console.warn(`cleanupTaskSubtree: failed to list logs for task "${task.id}": ${ex.message}`);
61
+ }
62
+ };
63
+ return async rootId => {
64
+ const ordered = await collectSubtree(rootId);
65
+ for (const task of ordered) {
66
+ await deleteTaskLogs(task);
67
+ try {
68
+ await context.tasks.deleteTask(task.id);
69
+ } catch (ex) {
70
+ console.warn(`cleanupTaskSubtree: failed to delete task "${task.id}": ${ex.message}`);
71
+ }
72
+ }
73
+ };
74
+ };
75
+
76
+ //# sourceMappingURL=cleanupTaskSubtree.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["createCleanupTaskSubtree","context","listChildren","parentId","items","tasks","listTasks","where","collectSubtree","rootId","root","getTask","order","seen","Set","id","i","length","current","kids","kid","has","add","push","reverse","deleteTaskLogs","task","definition","getDefinition","definitionId","databaseLogs","listLogs","log","deleteLog","ex","console","warn","message","ordered","deleteTask"],"sources":["cleanupTaskSubtree.ts"],"sourcesContent":["import type { Context, ITask } from \"~/types.js\";\n\n/**\n * Recursively deletes the task identified by `rootId`, all its descendants, and\n * their logs (when the owning definition has databaseLogs=true). Bottom-up,\n * best-effort: per-record errors are logged and swallowed, the function never\n * throws.\n */\nexport const createCleanupTaskSubtree = (context: Context) => {\n const listChildren = async (parentId: string): Promise<ITask[]> => {\n const { items } = await context.tasks.listTasks({\n where: { parentId }\n });\n return items;\n };\n\n const collectSubtree = async (rootId: string): Promise<ITask[]> => {\n const root = await context.tasks.getTask(rootId);\n if (!root) {\n return [];\n }\n const order: ITask[] = [root];\n const seen = new Set<string>([root.id]);\n let i = 0;\n while (i < order.length) {\n const current = order[i++];\n const kids = await listChildren(current.id);\n for (const kid of kids) {\n if (seen.has(kid.id)) {\n continue;\n }\n seen.add(kid.id);\n order.push(kid);\n }\n }\n return order.reverse();\n };\n\n const deleteTaskLogs = async (task: ITask): Promise<void> => {\n const definition = context.tasks.getDefinition(task.definitionId);\n if (!definition || definition.databaseLogs !== true) {\n return;\n }\n try {\n const { items } = await context.tasks.listLogs({\n where: { task: task.id }\n });\n for (const log of items) {\n try {\n await context.tasks.deleteLog(log.id);\n } catch (ex: any) {\n console.warn(\n `cleanupTaskSubtree: failed to delete log \"${log.id}\" for task \"${task.id}\": ${ex.message}`\n );\n }\n }\n } catch (ex: any) {\n console.warn(\n `cleanupTaskSubtree: failed to list logs for task \"${task.id}\": ${ex.message}`\n );\n }\n };\n\n return async (rootId: string): Promise<void> => {\n const ordered = await collectSubtree(rootId);\n for (const task of ordered) {\n await deleteTaskLogs(task);\n try {\n await context.tasks.deleteTask(task.id);\n } catch (ex: any) {\n console.warn(\n `cleanupTaskSubtree: failed to delete task \"${task.id}\": ${ex.message}`\n );\n }\n }\n };\n};\n"],"mappings":"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","ignoreList":[]}
@@ -16,6 +16,7 @@ import { TaskDefinitionNotFoundError, TaskLogNotFoundError, TaskNotFoundError }
16
16
  import { EventPublisher } from "@webiny/api-core/features/eventPublisher/index.js";
17
17
  import { TaskAfterCreateEvent, TaskAfterDeleteEvent, TaskAfterUpdateEvent, TaskBeforeCreateEvent, TaskBeforeDeleteEvent, TaskBeforeUpdateEvent } from "../events/index.js";
18
18
  import { CmsWhereMapper } from "@webiny/api-headless-cms";
19
+ import { createCleanupTaskSubtree } from "./cleanupTaskSubtree.js";
19
20
  const createRevisionId = id => {
20
21
  const {
21
22
  id: entryId
@@ -333,6 +334,7 @@ export const createTaskCrud = context => {
333
334
  });
334
335
  return convertToLog(entry);
335
336
  };
337
+ const cleanupTaskSubtree = createCleanupTaskSubtree(context);
336
338
  const listLogs = async params => {
337
339
  const identityContext = context.container.resolve(IdentityContext);
338
340
  const {
@@ -364,6 +366,7 @@ export const createTaskCrud = context => {
364
366
  createTask,
365
367
  updateTask,
366
368
  deleteTask,
369
+ cleanupTaskSubtree,
367
370
  createLog,
368
371
  updateLog,
369
372
  deleteLog,
@@ -1 +1 @@
1
- {"version":3,"names":["WebinyError","TaskDataStatus","WEBINY_TASK_MODEL_ID","WEBINY_TASK_LOG_MODEL_ID","NotFoundError","createZodError","parseIdentifier","zod","GetModelUseCase","GetEntryByIdUseCase","ListLatestEntriesUseCase","CreateEntryUseCase","UpdateEntryUseCase","DeleteEntryUseCase","IdentityContext","TaskDefinitionNotFoundError","TaskLogNotFoundError","TaskNotFoundError","EventPublisher","TaskAfterCreateEvent","TaskAfterDeleteEvent","TaskAfterUpdateEvent","TaskBeforeCreateEvent","TaskBeforeDeleteEvent","TaskBeforeUpdateEvent","CmsWhereMapper","createRevisionId","id","entryId","convertToTask","entry","createdOn","savedOn","createdBy","name","values","definitionId","input","output","taskStatus","executionName","eventResponse","startedOn","finishedOn","iterations","parentId","convertToLog","task","iteration","items","getZodSchema","schema","looseObject","ZodObject","loose","ZodType","validateTaskInput","params","definition","data","createInputValidation","validator","validate","result","safeParseAsync","success","error","createTaskCrud","context","cmsWhereMapper","container","resolve","getTaskModel","identityContext","withoutAuthorization","getModel","execute","isFail","value","getLogModel","getTask","model","getEntryById","listTasks","entries","meta","listLatestEntries","where","map","fields","item","createTask","tasks","getDefinition","eventPublisher","beforeCreateEvent","publish","createEntry","PENDING","afterCreateEvent","updateTask","original","beforeUpdateEvent","updateEntry","afterUpdateEvent","deleteTask","beforeDeleteEvent","deleteEntry","afterDeleteEvent","createLog","updateLog","deleteLog","getLog","ex","getLatestLog","taskId","sort","limit","listLogs"],"sources":["crud.tasks.ts"],"sourcesContent":["import WebinyError from \"@webiny/error\";\nimport type {\n Context,\n IListTaskLogParams,\n IListTaskParams,\n ITaskCreateData,\n ITaskLog,\n ITaskLogCreateInput,\n ITaskLogUpdateInput,\n ITasksContextCrudObject,\n ITaskUpdateData\n} from \"~/types.js\";\nimport { TaskDataStatus } from \"~/types.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/handler-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 \"~/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 \"~/events/index.js\";\nimport { CmsWhereMapper } from \"@webiny/api-headless-cms\";\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 context: Context;\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 = (context: Context): ITasksContextCrudObject => {\n const cmsWhereMapper = context.container.resolve(CmsWhereMapper);\n\n const getTaskModel = async (): Promise<CmsModel> => {\n const identityContext = context.container.resolve(IdentityContext);\n return await identityContext.withoutAuthorization(async () => {\n const getModel = context.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 = context.container.resolve(IdentityContext);\n return await identityContext.withoutAuthorization(async () => {\n const getModel = context.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 = context.container.resolve(IdentityContext);\n\n const entry = await identityContext.withoutAuthorization(async () => {\n const model = await getTaskModel();\n const getEntryById = context.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 = context.container.resolve(IdentityContext);\n const { entries, meta } = await identityContext.withoutAuthorization(async () => {\n const model = await getTaskModel();\n const listLatestEntries = context.container.resolve(ListLatestEntriesUseCase);\n const result = await listLatestEntries.execute<TaskService.Task<T, O>>(model, {\n ...params,\n where: cmsWhereMapper.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 = context.tasks.getDefinition(data.definitionId);\n if (!definition) {\n throw new TaskDefinitionNotFoundError(data.definitionId);\n }\n\n await validateTaskInput({\n context,\n definition,\n data\n });\n\n const identityContext = context.container.resolve(IdentityContext);\n const eventPublisher = context.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 = context.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 = context.container.resolve(IdentityContext);\n const eventPublisher = context.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 = context.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 = context.container.resolve(IdentityContext);\n const eventPublisher = context.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 = context.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 = context.container.resolve(IdentityContext);\n const result = await identityContext.withoutAuthorization(async () => {\n const model = await getLogModel();\n const createEntry = context.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 = context.container.resolve(IdentityContext);\n const result = await identityContext.withoutAuthorization(async () => {\n const model = await getLogModel();\n const updateEntry = context.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 = context.container.resolve(IdentityContext);\n const result = await identityContext.withoutAuthorization(async () => {\n const model = await getLogModel();\n const deleteEntry = context.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 = context.container.resolve(IdentityContext);\n try {\n const result = await identityContext.withoutAuthorization(async () => {\n const model = await getLogModel();\n const getEntryById = context.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 = context.container.resolve(IdentityContext);\n const entry = await identityContext.withoutAuthorization(async () => {\n const model = await getLogModel();\n const listLatestEntries = context.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 listLogs = async (params: IListTaskLogParams) => {\n const identityContext = context.container.resolve(IdentityContext);\n const { entries, meta } = await identityContext.withoutAuthorization(async () => {\n const model = await getLogModel();\n const listLatestEntries = context.container.resolve(ListLatestEntriesUseCase);\n const result = await listLatestEntries.execute<ITaskLog>(model, {\n ...params,\n where: cmsWhereMapper.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 createLog,\n updateLog,\n deleteLog,\n getLog,\n listLogs,\n getLatestLog,\n getTaskModel,\n getLogModel\n };\n};\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"names":["WebinyError","TaskDataStatus","WEBINY_TASK_MODEL_ID","WEBINY_TASK_LOG_MODEL_ID","NotFoundError","createZodError","parseIdentifier","zod","GetModelUseCase","GetEntryByIdUseCase","ListLatestEntriesUseCase","CreateEntryUseCase","UpdateEntryUseCase","DeleteEntryUseCase","IdentityContext","TaskDefinitionNotFoundError","TaskLogNotFoundError","TaskNotFoundError","EventPublisher","TaskAfterCreateEvent","TaskAfterDeleteEvent","TaskAfterUpdateEvent","TaskBeforeCreateEvent","TaskBeforeDeleteEvent","TaskBeforeUpdateEvent","CmsWhereMapper","createCleanupTaskSubtree","createRevisionId","id","entryId","convertToTask","entry","createdOn","savedOn","createdBy","name","values","definitionId","input","output","taskStatus","executionName","eventResponse","startedOn","finishedOn","iterations","parentId","convertToLog","task","iteration","items","getZodSchema","schema","looseObject","ZodObject","loose","ZodType","validateTaskInput","params","definition","data","createInputValidation","validator","validate","result","safeParseAsync","success","error","createTaskCrud","context","cmsWhereMapper","container","resolve","getTaskModel","identityContext","withoutAuthorization","getModel","execute","isFail","value","getLogModel","getTask","model","getEntryById","listTasks","entries","meta","listLatestEntries","where","map","fields","item","createTask","tasks","getDefinition","eventPublisher","beforeCreateEvent","publish","createEntry","PENDING","afterCreateEvent","updateTask","original","beforeUpdateEvent","updateEntry","afterUpdateEvent","deleteTask","beforeDeleteEvent","deleteEntry","afterDeleteEvent","createLog","updateLog","deleteLog","getLog","ex","getLatestLog","taskId","sort","limit","cleanupTaskSubtree","listLogs"],"sources":["crud.tasks.ts"],"sourcesContent":["import WebinyError from \"@webiny/error\";\nimport type {\n Context,\n IListTaskLogParams,\n IListTaskParams,\n ITaskCreateData,\n ITaskLog,\n ITaskLogCreateInput,\n ITaskLogUpdateInput,\n ITasksContextCrudObject,\n ITaskUpdateData\n} from \"~/types.js\";\nimport { TaskDataStatus } from \"~/types.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/handler-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 \"~/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 \"~/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 context: Context;\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 = (context: Context): ITasksContextCrudObject => {\n const cmsWhereMapper = context.container.resolve(CmsWhereMapper);\n\n const getTaskModel = async (): Promise<CmsModel> => {\n const identityContext = context.container.resolve(IdentityContext);\n return await identityContext.withoutAuthorization(async () => {\n const getModel = context.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 = context.container.resolve(IdentityContext);\n return await identityContext.withoutAuthorization(async () => {\n const getModel = context.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 = context.container.resolve(IdentityContext);\n\n const entry = await identityContext.withoutAuthorization(async () => {\n const model = await getTaskModel();\n const getEntryById = context.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 = context.container.resolve(IdentityContext);\n const { entries, meta } = await identityContext.withoutAuthorization(async () => {\n const model = await getTaskModel();\n const listLatestEntries = context.container.resolve(ListLatestEntriesUseCase);\n const result = await listLatestEntries.execute<TaskService.Task<T, O>>(model, {\n ...params,\n where: cmsWhereMapper.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 = context.tasks.getDefinition(data.definitionId);\n if (!definition) {\n throw new TaskDefinitionNotFoundError(data.definitionId);\n }\n\n await validateTaskInput({\n context,\n definition,\n data\n });\n\n const identityContext = context.container.resolve(IdentityContext);\n const eventPublisher = context.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 = context.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 = context.container.resolve(IdentityContext);\n const eventPublisher = context.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 = context.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 = context.container.resolve(IdentityContext);\n const eventPublisher = context.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 = context.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 = context.container.resolve(IdentityContext);\n const result = await identityContext.withoutAuthorization(async () => {\n const model = await getLogModel();\n const createEntry = context.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 = context.container.resolve(IdentityContext);\n const result = await identityContext.withoutAuthorization(async () => {\n const model = await getLogModel();\n const updateEntry = context.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 = context.container.resolve(IdentityContext);\n const result = await identityContext.withoutAuthorization(async () => {\n const model = await getLogModel();\n const deleteEntry = context.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 = context.container.resolve(IdentityContext);\n try {\n const result = await identityContext.withoutAuthorization(async () => {\n const model = await getLogModel();\n const getEntryById = context.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 = context.container.resolve(IdentityContext);\n const entry = await identityContext.withoutAuthorization(async () => {\n const model = await getLogModel();\n const listLatestEntries = context.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(context);\n\n const listLogs = async (params: IListTaskLogParams) => {\n const identityContext = context.container.resolve(IdentityContext);\n const { entries, meta } = await identityContext.withoutAuthorization(async () => {\n const model = await getLogModel();\n const listLatestEntries = context.container.resolve(ListLatestEntriesUseCase);\n const result = await listLatestEntries.execute<ITaskLog>(model, {\n ...params,\n where: cmsWhereMapper.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"],"mappings":"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","ignoreList":[]}
@@ -15,6 +15,7 @@ declare class RunnableTaskDecoratorImpl implements TaskDefinition.Interface {
15
15
  get isPrivate(): boolean;
16
16
  get databaseLogs(): boolean;
17
17
  get maxIterations(): number;
18
+ get selfCleanup(): import("@webiny/api-core/features/task/TaskDefinition/abstractions").ISelfCleanup | undefined;
18
19
  get createInputValidation(): ((params: import("@webiny/api-core/features/task/TaskDefinition/abstractions").ITaskCreateInputValidationParams) => import("zod").ZodType<unknown, unknown, import("zod/v4/core").$ZodTypeInternals<unknown, unknown>> | import("@webiny/api/types").GenericRecord<PropertyKey, import("zod").ZodType<unknown, unknown, import("zod/v4/core").$ZodTypeInternals<unknown, unknown>>>) | undefined;
19
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>>;
20
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;
@@ -36,6 +36,9 @@ class RunnableTaskDecoratorImpl {
36
36
  get maxIterations() {
37
37
  return this.decoratee.maxIterations || DEFAULT_MAX_ITERATIONS;
38
38
  }
39
+ get selfCleanup() {
40
+ return this.decoratee.selfCleanup;
41
+ }
39
42
  get createInputValidation() {
40
43
  return this.decoratee.createInputValidation;
41
44
  }
@@ -1 +1 @@
1
- {"version":3,"names":["camelCase","WebinyError","TaskDefinition","DEFAULT_MAX_ITERATIONS","RunnableTaskDecoratorImpl","constructor","decoratee","validate","id","title","description","isPrivate","databaseLogs","maxIterations","createInputValidation","run","bind","onBeforeTrigger","onDone","onError","onAbort","onMaxIterations","message","console","log","getTask","RunnableTaskDecorator","createDecorator","decorator","dependencies"],"sources":["RunnableTaskDecorator.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 type { ITaskDefinition } from \"@webiny/api-core/features/task/TaskDefinition/index.js\";\n\nconst DEFAULT_MAX_ITERATIONS = 50;\n\n/**\n * RunnableTaskDecorator adds runtime behavior to TaskDefinition:\n * - Applies default values (maxIterations, isPrivate, databaseLogs, fields)\n * - Validates task ID (must be camelCase)\n * - Provides field management methods\n */\nclass RunnableTaskDecoratorImpl implements TaskDefinition.Interface {\n constructor(private decoratee: TaskDefinition.Interface) {\n this.validate();\n }\n\n // Delegate simple properties\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 // Apply default values\n get isPrivate() {\n return this.decoratee.isPrivate ?? false;\n }\n\n get databaseLogs() {\n return this.decoratee.databaseLogs ?? false;\n }\n\n get maxIterations() {\n return this.decoratee.maxIterations || DEFAULT_MAX_ITERATIONS;\n }\n\n get createInputValidation() {\n return this.decoratee.createInputValidation;\n }\n\n // Delegate lifecycle methods (bind to preserve context)\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 onDone() {\n return this.decoratee.onDone?.bind(this.decoratee);\n }\n\n get onError() {\n return this.decoratee.onError?.bind(this.decoratee);\n }\n\n get onAbort() {\n return this.decoratee.onAbort?.bind(this.decoratee);\n }\n\n get onMaxIterations() {\n return this.decoratee.onMaxIterations?.bind(this.decoratee);\n }\n\n // Validation logic\n private validate(): void {\n if (camelCase(this.decoratee.id) !== this.decoratee.id) {\n const message = `Task ID \"${this.decoratee.id}\" is invalid. It must be in camelCase format, for example: \"myCustomTask\".`;\n console.log(message);\n throw new WebinyError(message);\n }\n }\n\n // Method to get the underlying task (for compatibility with existing code)\n public getTask(): ITaskDefinition {\n return this;\n }\n}\n\nexport const RunnableTaskDecorator = TaskDefinition.createDecorator({\n decorator: RunnableTaskDecoratorImpl,\n dependencies: []\n});\n"],"mappings":"AAAA,OAAOA,SAAS,MAAM,qBAAqB;AAC3C,OAAOC,WAAW,MAAM,eAAe;AACvC,SAASC,cAAc,QAAQ,wDAAwD;AAGvF,MAAMC,sBAAsB,GAAG,EAAE;;AAEjC;AACA;AACA;AACA;AACA;AACA;AACA,MAAMC,yBAAyB,CAAqC;EAChEC,WAAWA,CAASC,SAAmC,EAAE;IAAA,KAArCA,SAAmC,GAAnCA,SAAmC;IACnD,IAAI,CAACC,QAAQ,CAAC,CAAC;EACnB;;EAEA;EACA,IAAIC,EAAEA,CAAA,EAAG;IACL,OAAO,IAAI,CAACF,SAAS,CAACE,EAAE;EAC5B;EAEA,IAAIC,KAAKA,CAAA,EAAG;IACR,OAAO,IAAI,CAACH,SAAS,CAACG,KAAK;EAC/B;EAEA,IAAIC,WAAWA,CAAA,EAAG;IACd,OAAO,IAAI,CAACJ,SAAS,CAACI,WAAW;EACrC;;EAEA;EACA,IAAIC,SAASA,CAAA,EAAG;IACZ,OAAO,IAAI,CAACL,SAAS,CAACK,SAAS,IAAI,KAAK;EAC5C;EAEA,IAAIC,YAAYA,CAAA,EAAG;IACf,OAAO,IAAI,CAACN,SAAS,CAACM,YAAY,IAAI,KAAK;EAC/C;EAEA,IAAIC,aAAaA,CAAA,EAAG;IAChB,OAAO,IAAI,CAACP,SAAS,CAACO,aAAa,IAAIV,sBAAsB;EACjE;EAEA,IAAIW,qBAAqBA,CAAA,EAAG;IACxB,OAAO,IAAI,CAACR,SAAS,CAACQ,qBAAqB;EAC/C;;EAEA;EACA,IAAIC,GAAGA,CAAA,EAAG;IACN,OAAO,IAAI,CAACT,SAAS,CAACS,GAAG,CAACC,IAAI,CAAC,IAAI,CAACV,SAAS,CAAC;EAClD;EAEA,IAAIW,eAAeA,CAAA,EAAG;IAClB,OAAO,IAAI,CAACX,SAAS,CAACW,eAAe,EAAED,IAAI,CAAC,IAAI,CAACV,SAAS,CAAC;EAC/D;EAEA,IAAIY,MAAMA,CAAA,EAAG;IACT,OAAO,IAAI,CAACZ,SAAS,CAACY,MAAM,EAAEF,IAAI,CAAC,IAAI,CAACV,SAAS,CAAC;EACtD;EAEA,IAAIa,OAAOA,CAAA,EAAG;IACV,OAAO,IAAI,CAACb,SAAS,CAACa,OAAO,EAAEH,IAAI,CAAC,IAAI,CAACV,SAAS,CAAC;EACvD;EAEA,IAAIc,OAAOA,CAAA,EAAG;IACV,OAAO,IAAI,CAACd,SAAS,CAACc,OAAO,EAAEJ,IAAI,CAAC,IAAI,CAACV,SAAS,CAAC;EACvD;EAEA,IAAIe,eAAeA,CAAA,EAAG;IAClB,OAAO,IAAI,CAACf,SAAS,CAACe,eAAe,EAAEL,IAAI,CAAC,IAAI,CAACV,SAAS,CAAC;EAC/D;;EAEA;EACQC,QAAQA,CAAA,EAAS;IACrB,IAAIP,SAAS,CAAC,IAAI,CAACM,SAAS,CAACE,EAAE,CAAC,KAAK,IAAI,CAACF,SAAS,CAACE,EAAE,EAAE;MACpD,MAAMc,OAAO,GAAG,YAAY,IAAI,CAAChB,SAAS,CAACE,EAAE,4EAA4E;MACzHe,OAAO,CAACC,GAAG,CAACF,OAAO,CAAC;MACpB,MAAM,IAAIrB,WAAW,CAACqB,OAAO,CAAC;IAClC;EACJ;;EAEA;EACOG,OAAOA,CAAA,EAAoB;IAC9B,OAAO,IAAI;EACf;AACJ;AAEA,OAAO,MAAMC,qBAAqB,GAAGxB,cAAc,CAACyB,eAAe,CAAC;EAChEC,SAAS,EAAExB,yBAAyB;EACpCyB,YAAY,EAAE;AAClB,CAAC,CAAC","ignoreList":[]}
1
+ {"version":3,"names":["camelCase","WebinyError","TaskDefinition","DEFAULT_MAX_ITERATIONS","RunnableTaskDecoratorImpl","constructor","decoratee","validate","id","title","description","isPrivate","databaseLogs","maxIterations","selfCleanup","createInputValidation","run","bind","onBeforeTrigger","onDone","onError","onAbort","onMaxIterations","message","console","log","getTask","RunnableTaskDecorator","createDecorator","decorator","dependencies"],"sources":["RunnableTaskDecorator.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 type { ITaskDefinition } from \"@webiny/api-core/features/task/TaskDefinition/index.js\";\n\nconst DEFAULT_MAX_ITERATIONS = 50;\n\n/**\n * RunnableTaskDecorator adds runtime behavior to TaskDefinition:\n * - Applies default values (maxIterations, isPrivate, databaseLogs, fields)\n * - Validates task ID (must be camelCase)\n * - Provides field management methods\n */\nclass RunnableTaskDecoratorImpl implements TaskDefinition.Interface {\n constructor(private decoratee: TaskDefinition.Interface) {\n this.validate();\n }\n\n // Delegate simple properties\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 // Apply default values\n get isPrivate() {\n return this.decoratee.isPrivate ?? false;\n }\n\n get databaseLogs() {\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 get createInputValidation() {\n return this.decoratee.createInputValidation;\n }\n\n // Delegate lifecycle methods (bind to preserve context)\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 onDone() {\n return this.decoratee.onDone?.bind(this.decoratee);\n }\n\n get onError() {\n return this.decoratee.onError?.bind(this.decoratee);\n }\n\n get onAbort() {\n return this.decoratee.onAbort?.bind(this.decoratee);\n }\n\n get onMaxIterations() {\n return this.decoratee.onMaxIterations?.bind(this.decoratee);\n }\n\n // Validation logic\n private validate(): void {\n if (camelCase(this.decoratee.id) !== this.decoratee.id) {\n const message = `Task ID \"${this.decoratee.id}\" is invalid. It must be in camelCase format, for example: \"myCustomTask\".`;\n console.log(message);\n throw new WebinyError(message);\n }\n }\n\n // Method to get the underlying task (for compatibility with existing code)\n public getTask(): ITaskDefinition {\n return this;\n }\n}\n\nexport const RunnableTaskDecorator = TaskDefinition.createDecorator({\n decorator: RunnableTaskDecoratorImpl,\n dependencies: []\n});\n"],"mappings":"AAAA,OAAOA,SAAS,MAAM,qBAAqB;AAC3C,OAAOC,WAAW,MAAM,eAAe;AACvC,SAASC,cAAc,QAAQ,wDAAwD;AAGvF,MAAMC,sBAAsB,GAAG,EAAE;;AAEjC;AACA;AACA;AACA;AACA;AACA;AACA,MAAMC,yBAAyB,CAAqC;EAChEC,WAAWA,CAASC,SAAmC,EAAE;IAAA,KAArCA,SAAmC,GAAnCA,SAAmC;IACnD,IAAI,CAACC,QAAQ,CAAC,CAAC;EACnB;;EAEA;EACA,IAAIC,EAAEA,CAAA,EAAG;IACL,OAAO,IAAI,CAACF,SAAS,CAACE,EAAE;EAC5B;EAEA,IAAIC,KAAKA,CAAA,EAAG;IACR,OAAO,IAAI,CAACH,SAAS,CAACG,KAAK;EAC/B;EAEA,IAAIC,WAAWA,CAAA,EAAG;IACd,OAAO,IAAI,CAACJ,SAAS,CAACI,WAAW;EACrC;;EAEA;EACA,IAAIC,SAASA,CAAA,EAAG;IACZ,OAAO,IAAI,CAACL,SAAS,CAACK,SAAS,IAAI,KAAK;EAC5C;EAEA,IAAIC,YAAYA,CAAA,EAAG;IACf,OAAO,IAAI,CAACN,SAAS,CAACM,YAAY,IAAI,KAAK;EAC/C;EAEA,IAAIC,aAAaA,CAAA,EAAG;IAChB,OAAO,IAAI,CAACP,SAAS,CAACO,aAAa,IAAIV,sBAAsB;EACjE;EAEA,IAAIW,WAAWA,CAAA,EAAG;IACd,OAAO,IAAI,CAACR,SAAS,CAACQ,WAAW;EACrC;EAEA,IAAIC,qBAAqBA,CAAA,EAAG;IACxB,OAAO,IAAI,CAACT,SAAS,CAACS,qBAAqB;EAC/C;;EAEA;EACA,IAAIC,GAAGA,CAAA,EAAG;IACN,OAAO,IAAI,CAACV,SAAS,CAACU,GAAG,CAACC,IAAI,CAAC,IAAI,CAACX,SAAS,CAAC;EAClD;EAEA,IAAIY,eAAeA,CAAA,EAAG;IAClB,OAAO,IAAI,CAACZ,SAAS,CAACY,eAAe,EAAED,IAAI,CAAC,IAAI,CAACX,SAAS,CAAC;EAC/D;EAEA,IAAIa,MAAMA,CAAA,EAAG;IACT,OAAO,IAAI,CAACb,SAAS,CAACa,MAAM,EAAEF,IAAI,CAAC,IAAI,CAACX,SAAS,CAAC;EACtD;EAEA,IAAIc,OAAOA,CAAA,EAAG;IACV,OAAO,IAAI,CAACd,SAAS,CAACc,OAAO,EAAEH,IAAI,CAAC,IAAI,CAACX,SAAS,CAAC;EACvD;EAEA,IAAIe,OAAOA,CAAA,EAAG;IACV,OAAO,IAAI,CAACf,SAAS,CAACe,OAAO,EAAEJ,IAAI,CAAC,IAAI,CAACX,SAAS,CAAC;EACvD;EAEA,IAAIgB,eAAeA,CAAA,EAAG;IAClB,OAAO,IAAI,CAAChB,SAAS,CAACgB,eAAe,EAAEL,IAAI,CAAC,IAAI,CAACX,SAAS,CAAC;EAC/D;;EAEA;EACQC,QAAQA,CAAA,EAAS;IACrB,IAAIP,SAAS,CAAC,IAAI,CAACM,SAAS,CAACE,EAAE,CAAC,KAAK,IAAI,CAACF,SAAS,CAACE,EAAE,EAAE;MACpD,MAAMe,OAAO,GAAG,YAAY,IAAI,CAACjB,SAAS,CAACE,EAAE,4EAA4E;MACzHgB,OAAO,CAACC,GAAG,CAACF,OAAO,CAAC;MACpB,MAAM,IAAItB,WAAW,CAACsB,OAAO,CAAC;IAClC;EACJ;;EAEA;EACOG,OAAOA,CAAA,EAAoB;IAC9B,OAAO,IAAI;EACf;AACJ;AAEA,OAAO,MAAMC,qBAAqB,GAAGzB,cAAc,CAAC0B,eAAe,CAAC;EAChEC,SAAS,EAAEzB,yBAAyB;EACpC0B,YAAY,EAAE;AAClB,CAAC,CAAC","ignoreList":[]}
@@ -0,0 +1,30 @@
1
+ import { TaskDefinition } from "@webiny/api-core/features/task/TaskDefinition/index.js";
2
+ import { CleanupTaskSubtreeUseCase } from "../features/CleanupTaskSubtree/index.js";
3
+ type LifecycleHook = TaskDefinition.Interface["onDone"];
4
+ type HookParams = Parameters<NonNullable<LifecycleHook>>[0];
5
+ export declare class SelfCleaningTaskDecoratorImpl implements TaskDefinition.Interface {
6
+ private readonly cleanupTaskSubtree;
7
+ private decoratee;
8
+ private readonly events;
9
+ constructor(cleanupTaskSubtree: CleanupTaskSubtreeUseCase.Interface, decoratee: TaskDefinition.Interface);
10
+ get id(): string;
11
+ get title(): string;
12
+ get description(): string | undefined;
13
+ get isPrivate(): boolean | undefined;
14
+ get maxIterations(): number | undefined;
15
+ get selfCleanup(): import("@webiny/api-core/features/task/TaskDefinition/abstractions").ISelfCleanup | undefined;
16
+ get createInputValidation(): ((params: import("@webiny/api-core/features/task/TaskDefinition/abstractions").ITaskCreateInputValidationParams) => import("zod").ZodType<unknown, unknown, import("zod/v4/core").$ZodTypeInternals<unknown, unknown>> | import("@webiny/api/types").GenericRecord<PropertyKey, import("zod").ZodType<unknown, unknown, import("zod/v4/core").$ZodTypeInternals<unknown, unknown>>>) | undefined;
17
+ 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>>;
18
+ get onBeforeTrigger(): ((params: import("@webiny/api-core/features/task/TaskDefinition/abstractions").ITaskBeforeTriggerParams<import("@webiny/api-core/features/task/TaskDefinition/abstractions").ITaskInput>) => Promise<void>) | undefined;
19
+ 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;
20
+ get databaseLogs(): boolean | undefined;
21
+ get onDone(): (params: HookParams) => Promise<void>;
22
+ get onError(): (params: HookParams) => Promise<void>;
23
+ get onAbort(): (params: HookParams) => Promise<void>;
24
+ private runCleanup;
25
+ private safeCall;
26
+ }
27
+ export declare const SelfCleaningTaskDecorator: typeof SelfCleaningTaskDecoratorImpl & {
28
+ __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>>;
29
+ };
30
+ export {};
@@ -0,0 +1,98 @@
1
+ import { TaskDefinition } from "@webiny/api-core/features/task/TaskDefinition/index.js";
2
+ import { normalizeSelfCleanup } from "../utils/normalizeSelfCleanup.js";
3
+ import { CleanupTaskSubtreeUseCase } from "../features/CleanupTaskSubtree/index.js";
4
+ import { getErrorProperties } from "../utils/getErrorProperties.js";
5
+ export class SelfCleaningTaskDecoratorImpl {
6
+ constructor(cleanupTaskSubtree, decoratee) {
7
+ this.cleanupTaskSubtree = cleanupTaskSubtree;
8
+ this.decoratee = decoratee;
9
+ this.events = normalizeSelfCleanup(decoratee.selfCleanup);
10
+ }
11
+
12
+ // Pass-through properties.
13
+ get id() {
14
+ return this.decoratee.id;
15
+ }
16
+ get title() {
17
+ return this.decoratee.title;
18
+ }
19
+ get description() {
20
+ return this.decoratee.description;
21
+ }
22
+ get isPrivate() {
23
+ return this.decoratee.isPrivate;
24
+ }
25
+ get maxIterations() {
26
+ return this.decoratee.maxIterations;
27
+ }
28
+ get selfCleanup() {
29
+ return this.decoratee.selfCleanup;
30
+ }
31
+ get createInputValidation() {
32
+ return this.decoratee.createInputValidation;
33
+ }
34
+ get run() {
35
+ return this.decoratee.run.bind(this.decoratee);
36
+ }
37
+ get onBeforeTrigger() {
38
+ return this.decoratee.onBeforeTrigger?.bind(this.decoratee);
39
+ }
40
+ get onMaxIterations() {
41
+ return this.decoratee.onMaxIterations?.bind(this.decoratee);
42
+ }
43
+
44
+ // databaseLogs override — any non-empty event set forces false.
45
+ get databaseLogs() {
46
+ if (this.events.size > 0) {
47
+ return false;
48
+ }
49
+ return this.decoratee.databaseLogs;
50
+ }
51
+
52
+ // Always-defined lifecycle hooks. Each runs the user's hook first, then
53
+ // triggers cleanup if the matching event is in the set.
54
+ get onDone() {
55
+ return async params => {
56
+ await this.safeCall(this.decoratee.onDone, params, "onDone");
57
+ if (this.events.has("onSuccess")) {
58
+ await this.runCleanup(params);
59
+ }
60
+ };
61
+ }
62
+ get onError() {
63
+ return async params => {
64
+ await this.safeCall(this.decoratee.onError, params, "onError");
65
+ if (this.events.has("onError")) {
66
+ await this.runCleanup(params);
67
+ }
68
+ };
69
+ }
70
+ get onAbort() {
71
+ return async params => {
72
+ await this.safeCall(this.decoratee.onAbort, params, "onAbort");
73
+ if (this.events.has("onAbort")) {
74
+ await this.runCleanup(params);
75
+ }
76
+ };
77
+ }
78
+ async runCleanup(params) {
79
+ await this.cleanupTaskSubtree.execute(params.task.id);
80
+ }
81
+ async safeCall(hook, params, name) {
82
+ if (!hook) {
83
+ return;
84
+ }
85
+ try {
86
+ await hook.call(this.decoratee, params);
87
+ } catch (ex) {
88
+ console.error(`Error executing ${name} hook for task "${params.task.id}".`);
89
+ console.log(getErrorProperties(ex));
90
+ }
91
+ }
92
+ }
93
+ export const SelfCleaningTaskDecorator = TaskDefinition.createDecorator({
94
+ decorator: SelfCleaningTaskDecoratorImpl,
95
+ dependencies: [CleanupTaskSubtreeUseCase]
96
+ });
97
+
98
+ //# sourceMappingURL=SelfCleaningTaskDecorator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["TaskDefinition","normalizeSelfCleanup","CleanupTaskSubtreeUseCase","getErrorProperties","SelfCleaningTaskDecoratorImpl","constructor","cleanupTaskSubtree","decoratee","events","selfCleanup","id","title","description","isPrivate","maxIterations","createInputValidation","run","bind","onBeforeTrigger","onMaxIterations","databaseLogs","size","onDone","params","safeCall","has","runCleanup","onError","onAbort","execute","task","hook","name","call","ex","console","error","log","SelfCleaningTaskDecorator","createDecorator","decorator","dependencies"],"sources":["SelfCleaningTaskDecorator.ts"],"sourcesContent":["import { TaskDefinition } from \"@webiny/api-core/features/task/TaskDefinition/index.js\";\nimport type { ISelfCleanupEvent } from \"@webiny/api-core/features/task/TaskDefinition/index.js\";\nimport { normalizeSelfCleanup } from \"~/utils/normalizeSelfCleanup.js\";\nimport { CleanupTaskSubtreeUseCase } from \"~/features/CleanupTaskSubtree/index.js\";\nimport { getErrorProperties } from \"~/utils/getErrorProperties.js\";\n\ntype LifecycleHook = TaskDefinition.Interface[\"onDone\"];\ntype HookParams = Parameters<NonNullable<LifecycleHook>>[0];\n\nexport class SelfCleaningTaskDecoratorImpl implements TaskDefinition.Interface {\n private readonly events: ReadonlySet<ISelfCleanupEvent>;\n\n public constructor(\n private readonly cleanupTaskSubtree: CleanupTaskSubtreeUseCase.Interface,\n private decoratee: TaskDefinition.Interface\n ) {\n this.events = normalizeSelfCleanup(decoratee.selfCleanup);\n }\n\n // Pass-through properties.\n get id() {\n return this.decoratee.id;\n }\n get title() {\n return this.decoratee.title;\n }\n get description() {\n return this.decoratee.description;\n }\n get isPrivate() {\n return this.decoratee.isPrivate;\n }\n get maxIterations() {\n return this.decoratee.maxIterations;\n }\n get selfCleanup() {\n return this.decoratee.selfCleanup;\n }\n get createInputValidation() {\n return this.decoratee.createInputValidation;\n }\n get run() {\n return this.decoratee.run.bind(this.decoratee);\n }\n get onBeforeTrigger() {\n return this.decoratee.onBeforeTrigger?.bind(this.decoratee);\n }\n get onMaxIterations() {\n return this.decoratee.onMaxIterations?.bind(this.decoratee);\n }\n\n // databaseLogs override — any non-empty event set forces false.\n get databaseLogs() {\n if (this.events.size > 0) {\n return false;\n }\n return this.decoratee.databaseLogs;\n }\n\n // Always-defined lifecycle hooks. Each runs the user's hook first, then\n // triggers cleanup if the matching event is in the set.\n get onDone() {\n return async (params: HookParams) => {\n await this.safeCall(this.decoratee.onDone, params, \"onDone\");\n if (this.events.has(\"onSuccess\")) {\n await this.runCleanup(params);\n }\n };\n }\n\n get onError() {\n return async (params: HookParams) => {\n await this.safeCall(this.decoratee.onError, params, \"onError\");\n if (this.events.has(\"onError\")) {\n await this.runCleanup(params);\n }\n };\n }\n\n get onAbort() {\n return async (params: HookParams) => {\n await this.safeCall(this.decoratee.onAbort, params, \"onAbort\");\n if (this.events.has(\"onAbort\")) {\n await this.runCleanup(params);\n }\n };\n }\n\n private async runCleanup(params: HookParams): Promise<void> {\n await this.cleanupTaskSubtree.execute(params.task.id);\n }\n\n private async safeCall(\n hook: LifecycleHook | undefined,\n params: HookParams,\n name: string\n ): Promise<void> {\n if (!hook) {\n return;\n }\n try {\n await hook.call(this.decoratee, params);\n } catch (ex) {\n console.error(`Error executing ${name} hook for task \"${params.task.id}\".`);\n console.log(getErrorProperties(ex));\n }\n }\n}\n\nexport const SelfCleaningTaskDecorator = TaskDefinition.createDecorator({\n decorator: SelfCleaningTaskDecoratorImpl,\n dependencies: [CleanupTaskSubtreeUseCase]\n});\n"],"mappings":"AAAA,SAASA,cAAc,QAAQ,wDAAwD;AAEvF,SAASC,oBAAoB;AAC7B,SAASC,yBAAyB;AAClC,SAASC,kBAAkB;AAK3B,OAAO,MAAMC,6BAA6B,CAAqC;EAGpEC,WAAWA,CACGC,kBAAuD,EAChEC,SAAmC,EAC7C;IAAA,KAFmBD,kBAAuD,GAAvDA,kBAAuD;IAAA,KAChEC,SAAmC,GAAnCA,SAAmC;IAE3C,IAAI,CAACC,MAAM,GAAGP,oBAAoB,CAACM,SAAS,CAACE,WAAW,CAAC;EAC7D;;EAEA;EACA,IAAIC,EAAEA,CAAA,EAAG;IACL,OAAO,IAAI,CAACH,SAAS,CAACG,EAAE;EAC5B;EACA,IAAIC,KAAKA,CAAA,EAAG;IACR,OAAO,IAAI,CAACJ,SAAS,CAACI,KAAK;EAC/B;EACA,IAAIC,WAAWA,CAAA,EAAG;IACd,OAAO,IAAI,CAACL,SAAS,CAACK,WAAW;EACrC;EACA,IAAIC,SAASA,CAAA,EAAG;IACZ,OAAO,IAAI,CAACN,SAAS,CAACM,SAAS;EACnC;EACA,IAAIC,aAAaA,CAAA,EAAG;IAChB,OAAO,IAAI,CAACP,SAAS,CAACO,aAAa;EACvC;EACA,IAAIL,WAAWA,CAAA,EAAG;IACd,OAAO,IAAI,CAACF,SAAS,CAACE,WAAW;EACrC;EACA,IAAIM,qBAAqBA,CAAA,EAAG;IACxB,OAAO,IAAI,CAACR,SAAS,CAACQ,qBAAqB;EAC/C;EACA,IAAIC,GAAGA,CAAA,EAAG;IACN,OAAO,IAAI,CAACT,SAAS,CAACS,GAAG,CAACC,IAAI,CAAC,IAAI,CAACV,SAAS,CAAC;EAClD;EACA,IAAIW,eAAeA,CAAA,EAAG;IAClB,OAAO,IAAI,CAACX,SAAS,CAACW,eAAe,EAAED,IAAI,CAAC,IAAI,CAACV,SAAS,CAAC;EAC/D;EACA,IAAIY,eAAeA,CAAA,EAAG;IAClB,OAAO,IAAI,CAACZ,SAAS,CAACY,eAAe,EAAEF,IAAI,CAAC,IAAI,CAACV,SAAS,CAAC;EAC/D;;EAEA;EACA,IAAIa,YAAYA,CAAA,EAAG;IACf,IAAI,IAAI,CAACZ,MAAM,CAACa,IAAI,GAAG,CAAC,EAAE;MACtB,OAAO,KAAK;IAChB;IACA,OAAO,IAAI,CAACd,SAAS,CAACa,YAAY;EACtC;;EAEA;EACA;EACA,IAAIE,MAAMA,CAAA,EAAG;IACT,OAAO,MAAOC,MAAkB,IAAK;MACjC,MAAM,IAAI,CAACC,QAAQ,CAAC,IAAI,CAACjB,SAAS,CAACe,MAAM,EAAEC,MAAM,EAAE,QAAQ,CAAC;MAC5D,IAAI,IAAI,CAACf,MAAM,CAACiB,GAAG,CAAC,WAAW,CAAC,EAAE;QAC9B,MAAM,IAAI,CAACC,UAAU,CAACH,MAAM,CAAC;MACjC;IACJ,CAAC;EACL;EAEA,IAAII,OAAOA,CAAA,EAAG;IACV,OAAO,MAAOJ,MAAkB,IAAK;MACjC,MAAM,IAAI,CAACC,QAAQ,CAAC,IAAI,CAACjB,SAAS,CAACoB,OAAO,EAAEJ,MAAM,EAAE,SAAS,CAAC;MAC9D,IAAI,IAAI,CAACf,MAAM,CAACiB,GAAG,CAAC,SAAS,CAAC,EAAE;QAC5B,MAAM,IAAI,CAACC,UAAU,CAACH,MAAM,CAAC;MACjC;IACJ,CAAC;EACL;EAEA,IAAIK,OAAOA,CAAA,EAAG;IACV,OAAO,MAAOL,MAAkB,IAAK;MACjC,MAAM,IAAI,CAACC,QAAQ,CAAC,IAAI,CAACjB,SAAS,CAACqB,OAAO,EAAEL,MAAM,EAAE,SAAS,CAAC;MAC9D,IAAI,IAAI,CAACf,MAAM,CAACiB,GAAG,CAAC,SAAS,CAAC,EAAE;QAC5B,MAAM,IAAI,CAACC,UAAU,CAACH,MAAM,CAAC;MACjC;IACJ,CAAC;EACL;EAEA,MAAcG,UAAUA,CAACH,MAAkB,EAAiB;IACxD,MAAM,IAAI,CAACjB,kBAAkB,CAACuB,OAAO,CAACN,MAAM,CAACO,IAAI,CAACpB,EAAE,CAAC;EACzD;EAEA,MAAcc,QAAQA,CAClBO,IAA+B,EAC/BR,MAAkB,EAClBS,IAAY,EACC;IACb,IAAI,CAACD,IAAI,EAAE;MACP;IACJ;IACA,IAAI;MACA,MAAMA,IAAI,CAACE,IAAI,CAAC,IAAI,CAAC1B,SAAS,EAAEgB,MAAM,CAAC;IAC3C,CAAC,CAAC,OAAOW,EAAE,EAAE;MACTC,OAAO,CAACC,KAAK,CAAC,mBAAmBJ,IAAI,mBAAmBT,MAAM,CAACO,IAAI,CAACpB,EAAE,IAAI,CAAC;MAC3EyB,OAAO,CAACE,GAAG,CAAClC,kBAAkB,CAAC+B,EAAE,CAAC,CAAC;IACvC;EACJ;AACJ;AAEA,OAAO,MAAMI,yBAAyB,GAAGtC,cAAc,CAACuC,eAAe,CAAC;EACpEC,SAAS,EAAEpC,6BAA6B;EACxCqC,YAAY,EAAE,CAACvC,yBAAyB;AAC5C,CAAC,CAAC","ignoreList":[]}
@@ -0,0 +1,7 @@
1
+ import { CleanupTaskSubtreeUseCase as UseCaseAbstraction } from "./abstractions.js";
2
+ import type { Context } from "../../types.js";
3
+ export declare class CleanupTaskSubtreeUseCaseImpl implements UseCaseAbstraction.Interface {
4
+ private readonly context;
5
+ constructor(context: Context);
6
+ execute(taskId: string): Promise<void>;
7
+ }
@@ -0,0 +1,10 @@
1
+ export class CleanupTaskSubtreeUseCaseImpl {
2
+ constructor(context) {
3
+ this.context = context;
4
+ }
5
+ async execute(taskId) {
6
+ await this.context.tasks.cleanupTaskSubtree(taskId);
7
+ }
8
+ }
9
+
10
+ //# sourceMappingURL=CleanupTaskSubtreeUseCase.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["CleanupTaskSubtreeUseCaseImpl","constructor","context","execute","taskId","tasks","cleanupTaskSubtree"],"sources":["CleanupTaskSubtreeUseCase.ts"],"sourcesContent":["import { CleanupTaskSubtreeUseCase as UseCaseAbstraction } from \"./abstractions.js\";\nimport type { Context } from \"~/types.js\";\n\nexport class CleanupTaskSubtreeUseCaseImpl implements UseCaseAbstraction.Interface {\n public constructor(private readonly context: Context) {}\n\n public async execute(taskId: string): Promise<void> {\n await this.context.tasks.cleanupTaskSubtree(taskId);\n }\n}\n"],"mappings":"AAGA,OAAO,MAAMA,6BAA6B,CAAyC;EACxEC,WAAWA,CAAkBC,OAAgB,EAAE;IAAA,KAAlBA,OAAgB,GAAhBA,OAAgB;EAAG;EAEvD,MAAaC,OAAOA,CAACC,MAAc,EAAiB;IAChD,MAAM,IAAI,CAACF,OAAO,CAACG,KAAK,CAACC,kBAAkB,CAACF,MAAM,CAAC;EACvD;AACJ","ignoreList":[]}
@@ -0,0 +1,7 @@
1
+ export interface ICleanupTaskSubtreeUseCase {
2
+ execute(taskId: string): Promise<void>;
3
+ }
4
+ export declare const CleanupTaskSubtreeUseCase: import("@webiny/di").Abstraction<ICleanupTaskSubtreeUseCase>;
5
+ export declare namespace CleanupTaskSubtreeUseCase {
6
+ type Interface = ICleanupTaskSubtreeUseCase;
7
+ }
@@ -0,0 +1,4 @@
1
+ import { createAbstraction } from "@webiny/feature/api";
2
+ export const CleanupTaskSubtreeUseCase = createAbstraction("Tasks/CleanupTaskSubtreeUseCase");
3
+
4
+ //# sourceMappingURL=abstractions.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["createAbstraction","CleanupTaskSubtreeUseCase"],"sources":["abstractions.ts"],"sourcesContent":["import { createAbstraction } from \"@webiny/feature/api\";\n\nexport interface ICleanupTaskSubtreeUseCase {\n execute(taskId: string): Promise<void>;\n}\n\nexport const CleanupTaskSubtreeUseCase = createAbstraction<ICleanupTaskSubtreeUseCase>(\n \"Tasks/CleanupTaskSubtreeUseCase\"\n);\n\nexport namespace CleanupTaskSubtreeUseCase {\n export type Interface = ICleanupTaskSubtreeUseCase;\n}\n"],"mappings":"AAAA,SAASA,iBAAiB,QAAQ,qBAAqB;AAMvD,OAAO,MAAMC,yBAAyB,GAAGD,iBAAiB,CACtD,iCACJ,CAAC","ignoreList":[]}
@@ -0,0 +1,2 @@
1
+ export { CleanupTaskSubtreeUseCase } from "./abstractions.js";
2
+ export { CleanupTaskSubtreeUseCaseImpl } from "./CleanupTaskSubtreeUseCase.js";
@@ -0,0 +1,4 @@
1
+ export { CleanupTaskSubtreeUseCase } from "./abstractions.js";
2
+ export { CleanupTaskSubtreeUseCaseImpl } from "./CleanupTaskSubtreeUseCase.js";
3
+
4
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["CleanupTaskSubtreeUseCase","CleanupTaskSubtreeUseCaseImpl"],"sources":["index.ts"],"sourcesContent":["export { CleanupTaskSubtreeUseCase } from \"./abstractions.js\";\nexport { CleanupTaskSubtreeUseCaseImpl } from \"./CleanupTaskSubtreeUseCase.js\";\n"],"mappings":"AAAA,SAASA,yBAAyB;AAClC,SAASC,6BAA6B","ignoreList":[]}
package/package.json CHANGED
@@ -1,8 +1,11 @@
1
1
  {
2
2
  "name": "@webiny/tasks",
3
- "version": "6.3.0-beta.1",
3
+ "version": "6.3.0-beta.3",
4
4
  "type": "module",
5
- "main": "index.js",
5
+ "exports": {
6
+ ".": "./index.js",
7
+ "./*": "./*"
8
+ },
6
9
  "repository": {
7
10
  "type": "git",
8
11
  "url": "https://github.com/webiny/webiny-js.git"
@@ -13,17 +16,17 @@
13
16
  ],
14
17
  "license": "MIT",
15
18
  "dependencies": {
16
- "@webiny/api": "6.3.0-beta.1",
17
- "@webiny/api-core": "6.3.0-beta.1",
18
- "@webiny/api-headless-cms": "6.3.0-beta.1",
19
- "@webiny/aws-sdk": "6.3.0-beta.1",
20
- "@webiny/error": "6.3.0-beta.1",
21
- "@webiny/feature": "6.3.0-beta.1",
22
- "@webiny/handler": "6.3.0-beta.1",
23
- "@webiny/handler-aws": "6.3.0-beta.1",
24
- "@webiny/handler-graphql": "6.3.0-beta.1",
25
- "@webiny/plugins": "6.3.0-beta.1",
26
- "@webiny/utils": "6.3.0-beta.1",
19
+ "@webiny/api": "6.3.0-beta.3",
20
+ "@webiny/api-core": "6.3.0-beta.3",
21
+ "@webiny/api-headless-cms": "6.3.0-beta.3",
22
+ "@webiny/aws-sdk": "6.3.0-beta.3",
23
+ "@webiny/error": "6.3.0-beta.3",
24
+ "@webiny/feature": "6.3.0-beta.3",
25
+ "@webiny/handler": "6.3.0-beta.3",
26
+ "@webiny/handler-aws": "6.3.0-beta.3",
27
+ "@webiny/handler-graphql": "6.3.0-beta.3",
28
+ "@webiny/plugins": "6.3.0-beta.3",
29
+ "@webiny/utils": "6.3.0-beta.3",
27
30
  "deep-equal": "2.2.3",
28
31
  "lodash": "4.18.1",
29
32
  "object-merge-advanced": "14.1.3",
@@ -31,16 +34,16 @@
31
34
  "zod": "4.3.6"
32
35
  },
33
36
  "devDependencies": {
34
- "@webiny/build-tools": "6.3.0-beta.1",
35
- "@webiny/project-utils": "6.3.0-beta.1",
37
+ "@webiny/build-tools": "6.3.0-beta.3",
38
+ "@webiny/project-utils": "6.3.0-beta.3",
36
39
  "rimraf": "6.1.3",
37
40
  "type-fest": "5.6.0",
38
41
  "typescript": "6.0.3",
39
- "vitest": "4.1.4"
42
+ "vitest": "4.1.5"
40
43
  },
41
44
  "publishConfig": {
42
45
  "access": "public",
43
46
  "directory": "dist"
44
47
  },
45
- "gitHead": "664b273a9f0a971f9ca7e6ffe920db77fefdced1"
48
+ "gitHead": "e154ec3326903876c357d35422dc60d29e061419"
46
49
  }
@@ -1 +1 @@
1
- {"version":3,"names":["TaskDataStatus","TaskManager","DatabaseResponse","TaskResponse","TaskManagerStore","getErrorProperties","AuthenticatedIdentity","TaskExecutionContext","TaskResultStatus","TaskControl","constructor","runner","response","context","run","event","taskId","webinyTaskId","task","getTask","security","setIdentity","id","createdBy","type","displayName","canAccessTenant","error","definition","tasks","getDefinition","definitionId","message","code","data","databaseLogs","taskLog","getTaskLog","taskStatus","ABORTED","aborted","SUCCESS","FAILED","store","log","executionContext","container","resolve","setStore","setRunner","setTimer","timer","setResponse","manager","databaseResponse","result","responseResult","from","runEvents","ex","stack","input","clear","status","ERROR","onError","console","DONE","onDone","params","createdOn","executionName","iteration","iterations","items","getLatestLog","currentIteration","createLog"],"sources":["TaskControl.ts"],"sourcesContent":["import type { ITaskEvent } from \"~/handler/types.js\";\nimport type { Context, ITask, ITaskDataInput, ITaskLog } from \"~/types.js\";\nimport { TaskDataStatus } from \"~/types.js\";\nimport type { ITaskControl, ITaskRunner } from \"./abstractions/index.js\";\nimport { TaskManager } from \"./TaskManager.js\";\nimport type { IResponse, IResponseResult } from \"~/response/abstractions/index.js\";\nimport { DatabaseResponse, TaskResponse } from \"~/response/index.js\";\nimport { TaskManagerStore } from \"./TaskManagerStore.js\";\nimport { getErrorProperties } from \"~/utils/getErrorProperties.js\";\nimport { AuthenticatedIdentity } from \"@webiny/api-core/features/security/IdentityContext/index.js\";\nimport { TaskExecutionContext } from \"~/features/TaskExecutionContext/index.js\";\nimport {\n TaskDefinition,\n TaskResultStatus\n} from \"@webiny/api-core/features/task/TaskDefinition/index.js\";\n\ninterface IGetTaskLogParams {\n task: ITask;\n databaseLogs: boolean;\n}\n\nexport class TaskControl implements ITaskControl {\n public readonly runner: ITaskRunner;\n public readonly response: IResponse;\n public readonly context: Context;\n\n public constructor(runner: ITaskRunner, response: IResponse, context: Context) {\n this.runner = runner;\n this.context = context;\n this.response = response;\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.context.security.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 definition = this.context.tasks.getDefinition(task.definitionId);\n if (!definition) {\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 /**\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 task,\n log: taskLog,\n databaseLogs\n });\n\n // Populate TaskExecutionContext BEFORE executing task\n const executionContext = this.context.container.resolve(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\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({\n task\n });\n } catch (ex) {\n console.error(`Error executing onError hook for task \"${task.id}\".`);\n console.log(getErrorProperties(ex));\n }\n } else if (result.status === TaskResultStatus.DONE && definition.onDone) {\n try {\n await definition.onDone({\n task\n });\n } catch (ex) {\n console.error(`Error executing onDone hook for task \"${task.id}\".`);\n console.log(getErrorProperties(ex));\n }\n }\n }\n\n private async getTask<T extends TaskDefinition.TaskInput>(id: string): Promise<ITask<T>> {\n try {\n const task = await this.runner.context.tasks.getTask<T>(id);\n if (task) {\n return task;\n }\n } catch (ex) {\n throw this.response.error({\n error: {\n message: ex.message,\n code: ex.code || \"TASK_ERROR\",\n stack: ex.stack,\n data: ex.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 try {\n taskLog = await this.context.tasks.getLatestLog(task.id);\n } catch (error) {\n /**\n * If error is not the NotFoundError, we need to throw it.\n */\n if (error.code !== \"NOT_FOUND\") {\n throw this.response.error({\n error\n });\n }\n /**\n * Otherwise just continue and create a new log.\n */\n }\n\n const currentIteration = taskLog?.iteration || 0;\n\n try {\n return await this.context.tasks.createLog(task, {\n executionName: this.response.event.executionName,\n iteration: currentIteration + 1\n });\n } catch (error) {\n throw this.response.error({\n error\n });\n }\n }\n}\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"names":["TaskDataStatus","TaskManager","DatabaseResponse","TaskResponse","TaskManagerStore","getErrorProperties","AuthenticatedIdentity","TaskExecutionContext","TaskResultStatus","TaskControl","constructor","runner","response","context","run","event","taskId","webinyTaskId","task","getTask","security","setIdentity","id","createdBy","type","displayName","canAccessTenant","error","definition","tasks","getDefinition","definitionId","message","code","data","databaseLogs","taskLog","getTaskLog","taskStatus","ABORTED","aborted","SUCCESS","FAILED","store","log","executionContext","container","resolve","setStore","setRunner","setTimer","timer","setResponse","manager","databaseResponse","result","responseResult","from","runEvents","ex","stack","input","clear","status","ERROR","onError","console","DONE","onDone","params","createdOn","executionName","iteration","iterations","items","getLatestLog","currentIteration","createLog"],"sources":["TaskControl.ts"],"sourcesContent":["import type { ITaskEvent } from \"~/handler/types.js\";\nimport type { Context, ITask, ITaskDataInput, ITaskLog } from \"~/types.js\";\nimport { TaskDataStatus } from \"~/types.js\";\nimport type { ITaskControl, ITaskRunner } from \"./abstractions/index.js\";\nimport { TaskManager } from \"./TaskManager.js\";\nimport type { IResponse, IResponseResult } from \"~/response/abstractions/index.js\";\nimport { DatabaseResponse, TaskResponse } from \"~/response/index.js\";\nimport { TaskManagerStore } from \"./TaskManagerStore.js\";\nimport { getErrorProperties } from \"~/utils/getErrorProperties.js\";\nimport { AuthenticatedIdentity } from \"@webiny/api-core/features/security/IdentityContext/index.js\";\nimport { TaskExecutionContext } from \"~/features/TaskExecutionContext/index.js\";\nimport {\n TaskDefinition,\n TaskResultStatus\n} from \"@webiny/api-core/features/task/TaskDefinition/index.js\";\n\ninterface IGetTaskLogParams {\n task: ITask;\n databaseLogs: boolean;\n}\n\nexport class TaskControl implements ITaskControl {\n public readonly runner: ITaskRunner;\n public readonly response: IResponse;\n public readonly context: Context;\n\n public constructor(runner: ITaskRunner, response: IResponse, context: Context) {\n this.runner = runner;\n this.context = context;\n this.response = response;\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.context.security.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 definition = this.context.tasks.getDefinition(task.definitionId);\n if (!definition) {\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 /**\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 task,\n log: taskLog,\n databaseLogs\n });\n\n // Populate TaskExecutionContext BEFORE executing task\n const executionContext = this.context.container.resolve(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\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 });\n } catch (ex) {\n console.error(`Error executing onError hook for task \"${task.id}\".`);\n console.log(getErrorProperties(ex));\n }\n } else if (result.status === TaskResultStatus.DONE && definition.onDone) {\n try {\n await definition.onDone({ task });\n } catch (ex) {\n console.error(`Error executing onDone hook for task \"${task.id}\".`);\n console.log(getErrorProperties(ex));\n }\n }\n }\n\n private async getTask<T extends TaskDefinition.TaskInput>(id: string): Promise<ITask<T>> {\n try {\n const task = await this.runner.context.tasks.getTask<T>(id);\n if (task) {\n return task;\n }\n } catch (ex) {\n throw this.response.error({\n error: {\n message: ex.message,\n code: ex.code || \"TASK_ERROR\",\n stack: ex.stack,\n data: ex.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 try {\n taskLog = await this.context.tasks.getLatestLog(task.id);\n } catch (error) {\n /**\n * If error is not the NotFoundError, we need to throw it.\n */\n if (error.code !== \"NOT_FOUND\") {\n throw this.response.error({\n error\n });\n }\n /**\n * Otherwise just continue and create a new log.\n */\n }\n\n const currentIteration = taskLog?.iteration || 0;\n\n try {\n return await this.context.tasks.createLog(task, {\n executionName: this.response.event.executionName,\n iteration: currentIteration + 1\n });\n } catch (error) {\n throw this.response.error({\n error\n });\n }\n }\n}\n"],"mappings":"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","ignoreList":[]}
package/types.d.ts CHANGED
@@ -3,7 +3,7 @@ import type { IResponseError } from "./response/abstractions/index.js";
3
3
  import type { GenericRecord } from "@webiny/api/types.js";
4
4
  import type { IStepFunctionServiceFetchResult } from "./service/StepFunctionServicePlugin.js";
5
5
  import type { SecurityPermission } from "@webiny/api-core/types/security.js";
6
- import { TaskDefinition } from "@webiny/api-core/features/task/TaskDefinition/index.js";
6
+ import type { TaskDefinition } from "@webiny/api-core/features/task/TaskDefinition/index.js";
7
7
  import { TaskService } from "@webiny/api-core/features/task/TaskService/index.js";
8
8
  import { BaseError, Result } from "@webiny/feature/api";
9
9
  import type { IdInterfaceGenerator, NumericInterfaceGenerator } from "@webiny/api";
@@ -117,6 +117,12 @@ export interface ITasksContextCrudObject {
117
117
  createTask<T extends TaskService.TaskInput = TaskService.TaskInput>(task: ITaskCreateData<T>): Promise<ICreateTaskResponse<T>>;
118
118
  updateTask<T extends TaskService.TaskInput = TaskService.TaskInput, O extends TaskService.GenericOutput = TaskService.GenericOutput>(id: string, data: Partial<ITaskUpdateData<T, O>>): Promise<IUpdateTaskResponse<T, O>>;
119
119
  deleteTask(id: string): Promise<IDeleteTaskResponse>;
120
+ /**
121
+ * Recursively delete a task, its logs (if any were written), and its entire
122
+ * descendant subtree. Best-effort: per-record failures are logged and swallowed,
123
+ * the method never throws.
124
+ */
125
+ cleanupTaskSubtree(id: string): Promise<void>;
120
126
  /**
121
127
  * Logs
122
128
  */
@@ -157,3 +163,5 @@ export interface TaskPermission extends SecurityPermission {
157
163
  rwd?: string;
158
164
  }
159
165
  export type ITask<I extends TaskService.TaskInput = TaskService.TaskInput, O extends TaskService.GenericOutput = TaskService.GenericOutput> = TaskService.Task<I, O>;
166
+ export type SelfCleanup = TaskDefinition.SelfCleanup;
167
+ export type SelfCleanupEvent = TaskDefinition.SelfCleanupEvent;
package/types.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"names":["TaskLogItemType","TaskDataStatus"],"sources":["types.ts"],"sourcesContent":["import type {\n CmsContext as BaseContext,\n CmsEntryListParams,\n CmsEntryMeta,\n CmsModel\n} from \"@webiny/api-headless-cms/types/index.js\";\nimport type { IResponseError } from \"~/response/abstractions/index.js\";\nimport type { GenericRecord } from \"@webiny/api/types.js\";\nimport type { IStepFunctionServiceFetchResult } from \"~/service/StepFunctionServicePlugin.js\";\nimport type { SecurityPermission } from \"@webiny/api-core/types/security.js\";\nimport { TaskDefinition } from \"@webiny/api-core/features/task/TaskDefinition/index.js\";\nimport { TaskService } from \"@webiny/api-core/features/task/TaskService/index.js\";\nimport { BaseError, Result } from \"@webiny/feature/api\";\nimport type { IdInterfaceGenerator, NumericInterfaceGenerator } from \"@webiny/api\";\n// TODO had to import for augmentation to work, but is there a better way to do this?\nimport \"./features/TaskController/augmentation.js\";\n\nexport * from \"./handler/types.js\";\nexport * from \"./response/abstractions/index.js\";\nexport * from \"./runner/abstractions/index.js\";\n\nexport type ITaskDataInput = GenericRecord;\n\nexport enum TaskLogItemType {\n INFO = \"info\",\n ERROR = \"error\"\n}\n\nexport interface ITaskLogItemData {\n [key: string]: any;\n}\n\nexport interface ITaskLogItemBase {\n message: string;\n createdOn: string;\n type: TaskLogItemType;\n data?: ITaskLogItemData;\n}\n\nexport interface ITaskLogItemInfo extends ITaskLogItemBase {\n type: TaskLogItemType.INFO;\n}\n\nexport interface ITaskLogItemError extends ITaskLogItemBase {\n type: TaskLogItemType.ERROR;\n error?: IResponseError;\n}\n\nexport type ITaskLogItem = ITaskLogItemInfo | ITaskLogItemError;\n\nexport interface ITaskLog {\n /**\n * ID without the revision number (for example: #0001).\n */\n id: string;\n createdOn: string;\n createdBy: ITaskIdentity;\n executionName: string;\n task: string;\n iteration: number;\n items: ITaskLogItem[];\n}\n\nexport enum TaskDataStatus {\n PENDING = \"pending\",\n RUNNING = \"running\",\n FAILED = \"failed\",\n SUCCESS = \"success\",\n ABORTED = \"aborted\"\n}\n\nexport interface ITaskIdentity {\n id: string;\n displayName: string;\n type: string;\n}\n\nexport type IGetTaskResponse<\n T extends TaskService.TaskInput = TaskService.TaskInput,\n O extends TaskService.GenericOutput = TaskService.GenericOutput\n> = ITask<T, O> | null;\n\nexport interface IListTasksResponse<\n T extends TaskService.TaskInput = TaskService.TaskInput,\n O extends TaskService.GenericOutput = TaskService.GenericOutput\n> {\n items: ITask<T, O>[];\n meta: CmsEntryMeta;\n}\n\nexport interface IListTaskLogsResponse {\n items: ITaskLog[];\n meta: CmsEntryMeta;\n}\n\nexport type ICreateTaskResponse<\n T extends TaskService.TaskInput = TaskService.TaskInput,\n O extends TaskService.GenericOutput = TaskService.GenericOutput\n> = ITask<T, O>;\nexport type IUpdateTaskResponse<\n T extends TaskService.TaskInput = TaskService.TaskInput,\n O extends TaskService.GenericOutput = TaskService.GenericOutput\n> = ITask<T, O>;\nexport type IDeleteTaskResponse = boolean;\n\nexport interface IListTaskParamsWhere\n extends\n IdInterfaceGenerator<\"id\">,\n IdInterfaceGenerator<\"parentId\">,\n IdInterfaceGenerator<\"definitionId\">,\n IdInterfaceGenerator<\"taskStatus\"> {\n //\n}\n\nexport interface IListTaskParams extends Omit<CmsEntryListParams, \"fields\" | \"search\"> {\n where?: IListTaskParamsWhere;\n}\n\nexport interface IListTaskLogParamsWhere\n extends\n IdInterfaceGenerator<\"id\">,\n IdInterfaceGenerator<\"task\">,\n NumericInterfaceGenerator<\"iteration\"> {}\n\nexport interface IListTaskLogParams extends Omit<\n CmsEntryListParams,\n \"fields\" | \"search\" | \"where\"\n> {\n where?: IListTaskLogParamsWhere;\n}\n\nexport interface ITaskCreateData<T extends TaskDefinition.TaskInput = TaskDefinition.TaskInput> {\n definitionId: string;\n name: string;\n input: T;\n parentId?: string;\n}\n\nexport interface ITaskUpdateData<\n I extends TaskDefinition.TaskInput = TaskDefinition.TaskInput,\n O extends TaskDefinition.TaskOutput = TaskDefinition.TaskOutput\n> {\n name?: string;\n input?: I;\n output?: O;\n taskStatus?: TaskDataStatus;\n executionName?: string;\n startedOn?: string;\n finishedOn?: string;\n eventResponse?: GenericRecord;\n iterations?: number;\n}\n\nexport interface ITaskLogCreateInput {\n executionName: string;\n iteration: number;\n}\n\nexport interface ITaskLogUpdateInput {\n items?: ITaskLogItem[];\n}\n\nexport interface ITasksContextCrudObject {\n /**\n * Models\n */\n getTaskModel(): Promise<CmsModel>;\n getLogModel(): Promise<CmsModel>;\n /**\n * Tasks\n */\n getTask<\n T extends TaskService.TaskInput = TaskService.TaskInput,\n O extends TaskService.GenericOutput = TaskService.GenericOutput\n >(\n id: string\n ): Promise<IGetTaskResponse<T, O> | null>;\n listTasks<\n T extends TaskService.TaskInput = TaskService.TaskInput,\n O extends TaskService.GenericOutput = TaskService.GenericOutput\n >(\n params?: IListTaskParams\n ): Promise<IListTasksResponse<T, O>>;\n createTask<T extends TaskService.TaskInput = TaskService.TaskInput>(\n task: ITaskCreateData<T>\n ): Promise<ICreateTaskResponse<T>>;\n updateTask<\n T extends TaskService.TaskInput = TaskService.TaskInput,\n O extends TaskService.GenericOutput = TaskService.GenericOutput\n >(\n id: string,\n data: Partial<ITaskUpdateData<T, O>>\n ): Promise<IUpdateTaskResponse<T, O>>;\n deleteTask(id: string): Promise<IDeleteTaskResponse>;\n /**\n * Logs\n */\n createLog(task: Pick<ITask, \"id\">, data: ITaskLogCreateInput): Promise<ITaskLog>;\n updateLog(id: string, data: ITaskLogUpdateInput): Promise<ITaskLog>;\n deleteLog(id: string): Promise<boolean>;\n getLog(id: string): Promise<ITaskLog | null>;\n getLatestLog(taskId: string): Promise<ITaskLog>;\n listLogs(params: IListTaskLogParams): Promise<IListTaskLogsResponse>;\n}\n\nexport interface ITasksContextDefinitionObject {\n getDefinition: <\n I extends TaskDefinition.TaskInput = TaskDefinition.TaskInput,\n O extends TaskDefinition.TaskOutput = TaskDefinition.TaskOutput\n >(\n id: string\n ) => TaskDefinition.Runnable<I, O> | null;\n listDefinitions: () => TaskDefinition.Interface[];\n}\n\nexport interface ITaskTriggerParams<I = ITaskDataInput> {\n parent?: Pick<ITask, \"id\">;\n definition: string;\n name?: string;\n input?: I;\n delay?: number;\n}\n\nexport interface ITaskAbortParams {\n id: string;\n message?: string;\n}\n\nexport interface ITasksContextServiceObject {\n trigger: <\n T extends TaskDefinition.TaskInput = TaskDefinition.TaskInput,\n O extends TaskService.GenericOutput = TaskService.GenericOutput\n >(\n params: ITaskTriggerParams<T>\n ) => Promise<Result<ITask<T, O>, BaseError>>;\n abort: <\n T extends TaskDefinition.TaskInput = TaskDefinition.TaskInput,\n O extends TaskService.GenericOutput = TaskService.GenericOutput\n >(\n params: ITaskAbortParams\n ) => Promise<Result<ITask<T, O>, BaseError>>;\n fetchServiceInfo: (\n input: ITask<any, any> | string\n ) => Promise<Result<IStepFunctionServiceFetchResult, BaseError>>;\n}\n\nexport interface ITasksContextObject\n extends ITasksContextCrudObject, ITasksContextDefinitionObject, ITasksContextServiceObject {}\n\nexport interface Context extends BaseContext {\n tasks: ITasksContextObject;\n}\n\nexport interface TaskPermission extends SecurityPermission {\n name: \"task\";\n rwd?: string;\n}\n\nexport type ITask<\n I extends TaskService.TaskInput = TaskService.TaskInput,\n O extends TaskService.GenericOutput = TaskService.GenericOutput\n> = TaskService.Task<I, O>;\n"],"mappings":"AAcA;AACA;AAEA;AACA;AACA;AAIA,WAAYA,eAAe,0BAAfA,eAAe;EAAfA,eAAe;EAAfA,eAAe;EAAA,OAAfA,eAAe;AAAA;AAwC3B,WAAYC,cAAc,0BAAdA,cAAc;EAAdA,cAAc;EAAdA,cAAc;EAAdA,cAAc;EAAdA,cAAc;EAAdA,cAAc;EAAA,OAAdA,cAAc;AAAA","ignoreList":[]}
1
+ {"version":3,"names":["TaskLogItemType","TaskDataStatus"],"sources":["types.ts"],"sourcesContent":["import type {\n CmsContext as BaseContext,\n CmsEntryListParams,\n CmsEntryMeta,\n CmsModel\n} from \"@webiny/api-headless-cms/types/index.js\";\nimport type { IResponseError } from \"~/response/abstractions/index.js\";\nimport type { GenericRecord } from \"@webiny/api/types.js\";\nimport type { IStepFunctionServiceFetchResult } from \"~/service/StepFunctionServicePlugin.js\";\nimport type { SecurityPermission } from \"@webiny/api-core/types/security.js\";\nimport type { TaskDefinition } from \"@webiny/api-core/features/task/TaskDefinition/index.js\";\nimport { TaskService } from \"@webiny/api-core/features/task/TaskService/index.js\";\nimport { BaseError, Result } from \"@webiny/feature/api\";\nimport type { IdInterfaceGenerator, NumericInterfaceGenerator } from \"@webiny/api\";\n// TODO had to import for augmentation to work, but is there a better way to do this?\nimport \"./features/TaskController/augmentation.js\";\n\nexport * from \"./handler/types.js\";\nexport * from \"./response/abstractions/index.js\";\nexport * from \"./runner/abstractions/index.js\";\n\nexport type ITaskDataInput = GenericRecord;\n\nexport enum TaskLogItemType {\n INFO = \"info\",\n ERROR = \"error\"\n}\n\nexport interface ITaskLogItemData {\n [key: string]: any;\n}\n\nexport interface ITaskLogItemBase {\n message: string;\n createdOn: string;\n type: TaskLogItemType;\n data?: ITaskLogItemData;\n}\n\nexport interface ITaskLogItemInfo extends ITaskLogItemBase {\n type: TaskLogItemType.INFO;\n}\n\nexport interface ITaskLogItemError extends ITaskLogItemBase {\n type: TaskLogItemType.ERROR;\n error?: IResponseError;\n}\n\nexport type ITaskLogItem = ITaskLogItemInfo | ITaskLogItemError;\n\nexport interface ITaskLog {\n /**\n * ID without the revision number (for example: #0001).\n */\n id: string;\n createdOn: string;\n createdBy: ITaskIdentity;\n executionName: string;\n task: string;\n iteration: number;\n items: ITaskLogItem[];\n}\n\nexport enum TaskDataStatus {\n PENDING = \"pending\",\n RUNNING = \"running\",\n FAILED = \"failed\",\n SUCCESS = \"success\",\n ABORTED = \"aborted\"\n}\n\nexport interface ITaskIdentity {\n id: string;\n displayName: string;\n type: string;\n}\n\nexport type IGetTaskResponse<\n T extends TaskService.TaskInput = TaskService.TaskInput,\n O extends TaskService.GenericOutput = TaskService.GenericOutput\n> = ITask<T, O> | null;\n\nexport interface IListTasksResponse<\n T extends TaskService.TaskInput = TaskService.TaskInput,\n O extends TaskService.GenericOutput = TaskService.GenericOutput\n> {\n items: ITask<T, O>[];\n meta: CmsEntryMeta;\n}\n\nexport interface IListTaskLogsResponse {\n items: ITaskLog[];\n meta: CmsEntryMeta;\n}\n\nexport type ICreateTaskResponse<\n T extends TaskService.TaskInput = TaskService.TaskInput,\n O extends TaskService.GenericOutput = TaskService.GenericOutput\n> = ITask<T, O>;\nexport type IUpdateTaskResponse<\n T extends TaskService.TaskInput = TaskService.TaskInput,\n O extends TaskService.GenericOutput = TaskService.GenericOutput\n> = ITask<T, O>;\nexport type IDeleteTaskResponse = boolean;\n\nexport interface IListTaskParamsWhere\n extends\n IdInterfaceGenerator<\"id\">,\n IdInterfaceGenerator<\"parentId\">,\n IdInterfaceGenerator<\"definitionId\">,\n IdInterfaceGenerator<\"taskStatus\"> {\n //\n}\n\nexport interface IListTaskParams extends Omit<CmsEntryListParams, \"fields\" | \"search\"> {\n where?: IListTaskParamsWhere;\n}\n\nexport interface IListTaskLogParamsWhere\n extends\n IdInterfaceGenerator<\"id\">,\n IdInterfaceGenerator<\"task\">,\n NumericInterfaceGenerator<\"iteration\"> {}\n\nexport interface IListTaskLogParams extends Omit<\n CmsEntryListParams,\n \"fields\" | \"search\" | \"where\"\n> {\n where?: IListTaskLogParamsWhere;\n}\n\nexport interface ITaskCreateData<T extends TaskDefinition.TaskInput = TaskDefinition.TaskInput> {\n definitionId: string;\n name: string;\n input: T;\n parentId?: string;\n}\n\nexport interface ITaskUpdateData<\n I extends TaskDefinition.TaskInput = TaskDefinition.TaskInput,\n O extends TaskDefinition.TaskOutput = TaskDefinition.TaskOutput\n> {\n name?: string;\n input?: I;\n output?: O;\n taskStatus?: TaskDataStatus;\n executionName?: string;\n startedOn?: string;\n finishedOn?: string;\n eventResponse?: GenericRecord;\n iterations?: number;\n}\n\nexport interface ITaskLogCreateInput {\n executionName: string;\n iteration: number;\n}\n\nexport interface ITaskLogUpdateInput {\n items?: ITaskLogItem[];\n}\n\nexport interface ITasksContextCrudObject {\n /**\n * Models\n */\n getTaskModel(): Promise<CmsModel>;\n getLogModel(): Promise<CmsModel>;\n /**\n * Tasks\n */\n getTask<\n T extends TaskService.TaskInput = TaskService.TaskInput,\n O extends TaskService.GenericOutput = TaskService.GenericOutput\n >(\n id: string\n ): Promise<IGetTaskResponse<T, O> | null>;\n listTasks<\n T extends TaskService.TaskInput = TaskService.TaskInput,\n O extends TaskService.GenericOutput = TaskService.GenericOutput\n >(\n params?: IListTaskParams\n ): Promise<IListTasksResponse<T, O>>;\n createTask<T extends TaskService.TaskInput = TaskService.TaskInput>(\n task: ITaskCreateData<T>\n ): Promise<ICreateTaskResponse<T>>;\n updateTask<\n T extends TaskService.TaskInput = TaskService.TaskInput,\n O extends TaskService.GenericOutput = TaskService.GenericOutput\n >(\n id: string,\n data: Partial<ITaskUpdateData<T, O>>\n ): Promise<IUpdateTaskResponse<T, O>>;\n deleteTask(id: string): Promise<IDeleteTaskResponse>;\n /**\n * Recursively delete a task, its logs (if any were written), and its entire\n * descendant subtree. Best-effort: per-record failures are logged and swallowed,\n * the method never throws.\n */\n cleanupTaskSubtree(id: string): Promise<void>;\n /**\n * Logs\n */\n createLog(task: Pick<ITask, \"id\">, data: ITaskLogCreateInput): Promise<ITaskLog>;\n updateLog(id: string, data: ITaskLogUpdateInput): Promise<ITaskLog>;\n deleteLog(id: string): Promise<boolean>;\n getLog(id: string): Promise<ITaskLog | null>;\n getLatestLog(taskId: string): Promise<ITaskLog>;\n listLogs(params: IListTaskLogParams): Promise<IListTaskLogsResponse>;\n}\n\nexport interface ITasksContextDefinitionObject {\n getDefinition: <\n I extends TaskDefinition.TaskInput = TaskDefinition.TaskInput,\n O extends TaskDefinition.TaskOutput = TaskDefinition.TaskOutput\n >(\n id: string\n ) => TaskDefinition.Runnable<I, O> | null;\n listDefinitions: () => TaskDefinition.Interface[];\n}\n\nexport interface ITaskTriggerParams<I = ITaskDataInput> {\n parent?: Pick<ITask, \"id\">;\n definition: string;\n name?: string;\n input?: I;\n delay?: number;\n}\n\nexport interface ITaskAbortParams {\n id: string;\n message?: string;\n}\n\nexport interface ITasksContextServiceObject {\n trigger: <\n T extends TaskDefinition.TaskInput = TaskDefinition.TaskInput,\n O extends TaskService.GenericOutput = TaskService.GenericOutput\n >(\n params: ITaskTriggerParams<T>\n ) => Promise<Result<ITask<T, O>, BaseError>>;\n abort: <\n T extends TaskDefinition.TaskInput = TaskDefinition.TaskInput,\n O extends TaskService.GenericOutput = TaskService.GenericOutput\n >(\n params: ITaskAbortParams\n ) => Promise<Result<ITask<T, O>, BaseError>>;\n fetchServiceInfo: (\n input: ITask<any, any> | string\n ) => Promise<Result<IStepFunctionServiceFetchResult, BaseError>>;\n}\n\nexport interface ITasksContextObject\n extends ITasksContextCrudObject, ITasksContextDefinitionObject, ITasksContextServiceObject {}\n\nexport interface Context extends BaseContext {\n tasks: ITasksContextObject;\n}\n\nexport interface TaskPermission extends SecurityPermission {\n name: \"task\";\n rwd?: string;\n}\n\nexport type ITask<\n I extends TaskService.TaskInput = TaskService.TaskInput,\n O extends TaskService.GenericOutput = TaskService.GenericOutput\n> = TaskService.Task<I, O>;\n\nexport type SelfCleanup = TaskDefinition.SelfCleanup;\nexport type SelfCleanupEvent = TaskDefinition.SelfCleanupEvent;\n"],"mappings":"AAcA;AACA;AAEA;AACA;AACA;AAIA,WAAYA,eAAe,0BAAfA,eAAe;EAAfA,eAAe;EAAfA,eAAe;EAAA,OAAfA,eAAe;AAAA;AAwC3B,WAAYC,cAAc,0BAAdA,cAAc;EAAdA,cAAc;EAAdA,cAAc;EAAdA,cAAc;EAAdA,cAAc;EAAdA,cAAc;EAAA,OAAdA,cAAc;AAAA","ignoreList":[]}
@@ -0,0 +1,2 @@
1
+ import type { TaskDefinition } from "@webiny/api-core/features/task/TaskDefinition/index.js";
2
+ export declare const normalizeSelfCleanup: (value: TaskDefinition.SelfCleanup | undefined) => ReadonlySet<TaskDefinition.SelfCleanupEvent>;
@@ -0,0 +1,15 @@
1
+ const ALL_EVENTS = ["onSuccess", "onError", "onAbort"];
2
+ export const normalizeSelfCleanup = value => {
3
+ if (value === undefined || value === "never") {
4
+ return new Set();
5
+ }
6
+ if (value === "always") {
7
+ return new Set(ALL_EVENTS);
8
+ }
9
+ if (Array.isArray(value)) {
10
+ return new Set(value);
11
+ }
12
+ return new Set([value]);
13
+ };
14
+
15
+ //# sourceMappingURL=normalizeSelfCleanup.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["ALL_EVENTS","normalizeSelfCleanup","value","undefined","Set","Array","isArray"],"sources":["normalizeSelfCleanup.ts"],"sourcesContent":["import type { TaskDefinition } from \"@webiny/api-core/features/task/TaskDefinition/index.js\";\n\nconst ALL_EVENTS: ReadonlyArray<TaskDefinition.SelfCleanupEvent> = [\n \"onSuccess\",\n \"onError\",\n \"onAbort\"\n];\n\nexport const normalizeSelfCleanup = (\n value: TaskDefinition.SelfCleanup | undefined\n): ReadonlySet<TaskDefinition.SelfCleanupEvent> => {\n if (value === undefined || value === \"never\") {\n return new Set();\n }\n if (value === \"always\") {\n return new Set(ALL_EVENTS);\n }\n if (Array.isArray(value)) {\n return new Set(value);\n }\n return new Set([value]);\n};\n"],"mappings":"AAEA,MAAMA,UAA0D,GAAG,CAC/D,WAAW,EACX,SAAS,EACT,SAAS,CACZ;AAED,OAAO,MAAMC,oBAAoB,GAC7BC,KAA6C,IACE;EAC/C,IAAIA,KAAK,KAAKC,SAAS,IAAID,KAAK,KAAK,OAAO,EAAE;IAC1C,OAAO,IAAIE,GAAG,CAAC,CAAC;EACpB;EACA,IAAIF,KAAK,KAAK,QAAQ,EAAE;IACpB,OAAO,IAAIE,GAAG,CAACJ,UAAU,CAAC;EAC9B;EACA,IAAIK,KAAK,CAACC,OAAO,CAACJ,KAAK,CAAC,EAAE;IACtB,OAAO,IAAIE,GAAG,CAACF,KAAK,CAAC;EACzB;EACA,OAAO,IAAIE,GAAG,CAAC,CAACF,KAAK,CAAC,CAAC;AAC3B,CAAC","ignoreList":[]}