@webiny/background-tasks 6.4.5 → 6.6.0-alpha.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (135) hide show
  1. package/admin/features/listLogs/ListLogsGateway.js +1 -1
  2. package/admin/features/listLogs/ListLogsGateway.js.map +1 -1
  3. package/admin/features/permissions/feature.d.ts +1 -1
  4. package/admin/presentation/BackgroundTaskSettings/BackgroundTaskSettingsPresenter.js +2 -2
  5. package/admin/presentation/BackgroundTaskSettings/BackgroundTaskSettingsPresenter.js.map +1 -1
  6. package/admin/presentation/TaskDetail/TaskDetailPresenter.js +1 -1
  7. package/admin/presentation/TaskDetail/TaskDetailPresenter.js.map +1 -1
  8. package/admin/presentation/TaskExecutions/TaskExecutionsDataSource.js +1 -1
  9. package/admin/presentation/TaskExecutions/TaskExecutionsDataSource.js.map +1 -1
  10. package/admin/presentation/TaskExecutions/TaskExecutionsPresenter.d.ts +2 -0
  11. package/admin/presentation/TaskExecutions/TaskExecutionsPresenter.js +3 -1
  12. package/admin/presentation/TaskExecutions/TaskExecutionsPresenter.js.map +1 -1
  13. package/api/BackgroundTasksFeature.d.ts +4 -0
  14. package/api/BackgroundTasksFeature.js +59 -0
  15. package/api/BackgroundTasksFeature.js.map +1 -0
  16. package/api/TasksCrud.d.ts +10 -0
  17. package/api/TasksCrud.js +5 -0
  18. package/api/TasksCrud.js.map +1 -0
  19. package/api/abstractions/Timer.d.ts +1 -0
  20. package/api/abstractions/Timer.js +0 -0
  21. package/api/abstractions/index.d.ts +1 -0
  22. package/api/abstractions/index.js +1 -0
  23. package/api/crud/cleanupTaskSubtree.d.ts +2 -2
  24. package/api/crud/cleanupTaskSubtree.js +8 -7
  25. package/api/crud/cleanupTaskSubtree.js.map +1 -1
  26. package/api/crud/crud.tasks.d.ts +3 -2
  27. package/api/crud/crud.tasks.js +37 -37
  28. package/api/crud/crud.tasks.js.map +1 -1
  29. package/api/crud/definition.tasks.d.ts +3 -2
  30. package/api/crud/definition.tasks.js +3 -3
  31. package/api/crud/definition.tasks.js.map +1 -1
  32. package/api/crud/service.tasks.d.ts +3 -2
  33. package/api/crud/service.tasks.js +21 -19
  34. package/api/crud/service.tasks.js.map +1 -1
  35. package/api/decorators/RunnableTaskDecorator.d.ts +1 -1
  36. package/api/decorators/RunnableTaskDecorator.js +2 -2
  37. package/api/decorators/RunnableTaskDecorator.js.map +1 -1
  38. package/api/decorators/SelfCleaningTaskDecorator.d.ts +1 -1
  39. package/api/domain/TaskService.d.ts +12 -0
  40. package/api/domain/TaskService.js +5 -0
  41. package/api/domain/TaskService.js.map +1 -0
  42. package/api/features/AbortTask/AbortTaskUseCase.d.ts +2 -3
  43. package/api/features/AbortTask/AbortTaskUseCase.js +3 -3
  44. package/api/features/AbortTask/AbortTaskUseCase.js.map +1 -1
  45. package/api/features/AbortTask/feature.d.ts +1 -2
  46. package/api/features/AbortTask/feature.js +3 -2
  47. package/api/features/AbortTask/feature.js.map +1 -1
  48. package/api/features/CleanupTaskSubtree/CleanupTaskSubtreeUseCase.d.ts +3 -3
  49. package/api/features/CleanupTaskSubtree/CleanupTaskSubtreeUseCase.js +3 -3
  50. package/api/features/CleanupTaskSubtree/CleanupTaskSubtreeUseCase.js.map +1 -1
  51. package/api/features/GetBackgroundTaskSettings/GetBackgroundTaskSettingsRepository.js +7 -4
  52. package/api/features/GetBackgroundTaskSettings/GetBackgroundTaskSettingsRepository.js.map +1 -1
  53. package/api/features/GetTask/GetTaskUseCase.d.ts +3 -3
  54. package/api/features/GetTask/GetTaskUseCase.js +3 -3
  55. package/api/features/GetTask/GetTaskUseCase.js.map +1 -1
  56. package/api/features/GetTask/feature.d.ts +1 -2
  57. package/api/features/GetTask/feature.js +3 -2
  58. package/api/features/GetTask/feature.js.map +1 -1
  59. package/api/features/ListTasks/ListTasksUseCase.d.ts +4 -3
  60. package/api/features/ListTasks/ListTasksUseCase.js +3 -3
  61. package/api/features/ListTasks/ListTasksUseCase.js.map +1 -1
  62. package/api/features/ListTasks/feature.d.ts +1 -2
  63. package/api/features/ListTasks/feature.js +3 -2
  64. package/api/features/ListTasks/feature.js.map +1 -1
  65. package/api/features/TaskController/TaskController.d.ts +2 -2
  66. package/api/features/TaskExecutionContext/TaskExecutionContext.d.ts +3 -3
  67. package/api/features/TaskExecutionContext/TaskExecutionContext.js.map +1 -1
  68. package/api/features/TaskExecutionContext/abstractions.d.ts +3 -3
  69. package/api/features/TaskExecutionContext/abstractions.js.map +1 -1
  70. package/api/features/TriggerTask/TriggerTaskUseCase.d.ts +2 -3
  71. package/api/features/TriggerTask/TriggerTaskUseCase.js +3 -3
  72. package/api/features/TriggerTask/TriggerTaskUseCase.js.map +1 -1
  73. package/api/features/TriggerTask/feature.d.ts +1 -2
  74. package/api/features/TriggerTask/feature.js +3 -2
  75. package/api/features/TriggerTask/feature.js.map +1 -1
  76. package/api/features/UpdateBackgroundTaskSettings/UpdateBackgroundTaskSettingsRepository.js +3 -2
  77. package/api/features/UpdateBackgroundTaskSettings/UpdateBackgroundTaskSettingsRepository.js.map +1 -1
  78. package/api/graphql/BackgroundTasksContextualSchema.d.ts +21 -0
  79. package/api/graphql/BackgroundTasksContextualSchema.js +369 -0
  80. package/api/graphql/BackgroundTasksContextualSchema.js.map +1 -0
  81. package/api/graphql/checkPermissions.js +2 -1
  82. package/api/graphql/checkPermissions.js.map +1 -1
  83. package/api/graphql/utils.d.ts +3 -3
  84. package/api/graphql/utils.js +1 -1
  85. package/api/graphql/utils.js.map +1 -1
  86. package/api/handler/types.d.ts +0 -2
  87. package/api/index.d.ts +10 -3
  88. package/api/index.js +9 -3
  89. package/api/response/DatabaseResponse.js +1 -1
  90. package/api/response/DatabaseResponse.js.map +1 -1
  91. package/api/runner/TaskControl.js +11 -8
  92. package/api/runner/TaskControl.js.map +1 -1
  93. package/api/runner/TaskManager.js +2 -1
  94. package/api/runner/TaskManager.js.map +1 -1
  95. package/api/runner/TaskManagerStore.d.ts +3 -2
  96. package/api/runner/TaskManagerStore.js +5 -3
  97. package/api/runner/TaskManagerStore.js.map +1 -1
  98. package/api/runner/TaskRunner.d.ts +3 -3
  99. package/api/runner/TaskRunner.js.map +1 -1
  100. package/api/runner/abstractions/TaskRunner.d.ts +2 -2
  101. package/api/service/createService.d.ts +3 -3
  102. package/api/service/createService.js +5 -10
  103. package/api/service/createService.js.map +1 -1
  104. package/api/service/index.d.ts +1 -4
  105. package/api/service/index.js +1 -12
  106. package/api/types.d.ts +2 -2
  107. package/api/types.js.map +1 -1
  108. package/package.json +26 -20
  109. package/api/context.d.ts +0 -2
  110. package/api/context.js +0 -66
  111. package/api/context.js.map +0 -1
  112. package/api/graphql/BackgroundTaskSettingsSchema.d.ts +0 -2
  113. package/api/graphql/BackgroundTaskSettingsSchema.js +0 -84
  114. package/api/graphql/BackgroundTaskSettingsSchema.js.map +0 -1
  115. package/api/graphql/index.d.ts +0 -2
  116. package/api/graphql/index.js +0 -302
  117. package/api/graphql/index.js.map +0 -1
  118. package/api/handler/index.d.ts +0 -6
  119. package/api/handler/index.js +0 -55
  120. package/api/handler/index.js.map +0 -1
  121. package/api/handler/register.d.ts +0 -1
  122. package/api/handler/register.js +0 -15
  123. package/api/handler/register.js.map +0 -1
  124. package/api/plugins/TaskServicePlugin.d.ts +0 -19
  125. package/api/plugins/TaskServicePlugin.js +0 -13
  126. package/api/plugins/TaskServicePlugin.js.map +0 -1
  127. package/api/plugins/index.d.ts +0 -1
  128. package/api/plugins/index.js +0 -1
  129. package/api/service/EventBridgeEventTransportPlugin.d.ts +0 -16
  130. package/api/service/EventBridgeEventTransportPlugin.js +0 -52
  131. package/api/service/EventBridgeEventTransportPlugin.js.map +0 -1
  132. package/api/service/StepFunctionServicePlugin.d.ts +0 -25
  133. package/api/service/StepFunctionServicePlugin.js +0 -77
  134. package/api/service/StepFunctionServicePlugin.js.map +0 -1
  135. package/api/service/index.js.map +0 -1
@@ -1,8 +1,9 @@
1
1
  import error from "@webiny/error";
2
2
  import { TaskDataStatus } from "../types.js";
3
+ import { TasksCrud } from "../TasksCrud.js";
3
4
  import { WEBINY_TASK_MODEL_ID } from "./TaskPrivateModel.js";
4
5
  import { WEBINY_TASK_LOG_MODEL_ID } from "./TaskLogPrivateModel.js";
5
- import { NotFoundError } from "@webiny/handler-graphql";
6
+ import { NotFoundError } from "@webiny/api-graphql";
6
7
  import { createZodError, parseIdentifier } from "@webiny/utils";
7
8
  import zod from "zod";
8
9
  import { GetModelUseCase } from "@webiny/api-headless-cms/features/contentModel/GetModel";
@@ -64,31 +65,31 @@ const validateTaskInput = async (params)=>{
64
65
  if (result.success) return;
65
66
  throw createZodError(result.error);
66
67
  };
67
- const createTaskCrud = (context)=>{
68
- const cmsWhereMapper = context.container.resolve(CmsWhereMapper);
68
+ const createTaskCrud = (container)=>{
69
+ const getCmsWhereMapper = ()=>container.resolve(CmsWhereMapper);
69
70
  const getTaskModel = async ()=>{
70
- const identityContext = context.container.resolve(IdentityContext);
71
+ const identityContext = container.resolve(IdentityContext);
71
72
  return await identityContext.withoutAuthorization(async ()=>{
72
- const getModel = context.container.resolve(GetModelUseCase);
73
+ const getModel = container.resolve(GetModelUseCase);
73
74
  const result = await getModel.execute(WEBINY_TASK_MODEL_ID);
74
75
  if (result.isFail()) throw new error(`There is no model "${WEBINY_TASK_MODEL_ID}".`);
75
76
  return result.value;
76
77
  });
77
78
  };
78
79
  const getLogModel = async ()=>{
79
- const identityContext = context.container.resolve(IdentityContext);
80
+ const identityContext = container.resolve(IdentityContext);
80
81
  return await identityContext.withoutAuthorization(async ()=>{
81
- const getModel = context.container.resolve(GetModelUseCase);
82
+ const getModel = container.resolve(GetModelUseCase);
82
83
  const result = await getModel.execute(WEBINY_TASK_LOG_MODEL_ID);
83
84
  if (result.isFail()) throw new error(`There is no model "${WEBINY_TASK_LOG_MODEL_ID}".`);
84
85
  return result.value;
85
86
  });
86
87
  };
87
88
  const getTask = async (id)=>{
88
- const identityContext = context.container.resolve(IdentityContext);
89
+ const identityContext = container.resolve(IdentityContext);
89
90
  const entry = await identityContext.withoutAuthorization(async ()=>{
90
91
  const model = await getTaskModel();
91
- const getEntryById = context.container.resolve(GetEntryByIdUseCase);
92
+ const getEntryById = container.resolve(GetEntryByIdUseCase);
92
93
  const result = await getEntryById.execute(model, createRevisionId(id));
93
94
  if (result.isFail()) return null;
94
95
  return result.value;
@@ -97,13 +98,13 @@ const createTaskCrud = (context)=>{
97
98
  return convertToTask(entry);
98
99
  };
99
100
  const listTasks = async (params)=>{
100
- const identityContext = context.container.resolve(IdentityContext);
101
+ const identityContext = container.resolve(IdentityContext);
101
102
  const { entries, meta } = await identityContext.withoutAuthorization(async ()=>{
102
103
  const model = await getTaskModel();
103
- const listLatestEntries = context.container.resolve(ListLatestEntriesUseCase);
104
+ const listLatestEntries = container.resolve(ListLatestEntriesUseCase);
104
105
  const result = await listLatestEntries.execute(model, {
105
106
  ...params,
106
- where: cmsWhereMapper.map({
107
+ where: getCmsWhereMapper().map({
107
108
  input: params?.where,
108
109
  fields: model.fields
109
110
  })
@@ -117,22 +118,21 @@ const createTaskCrud = (context)=>{
117
118
  };
118
119
  };
119
120
  const createTask = async (data)=>{
120
- const definition = context.tasks.getDefinition(data.definitionId);
121
+ const definition = container.resolve(TasksCrud).getDefinition(data.definitionId);
121
122
  if (!definition) throw new TaskDefinitionNotFoundError(data.definitionId);
122
123
  await validateTaskInput({
123
- context,
124
124
  definition,
125
125
  data
126
126
  });
127
- const identityContext = context.container.resolve(IdentityContext);
128
- const eventPublisher = context.container.resolve(EventPublisher);
127
+ const identityContext = container.resolve(IdentityContext);
128
+ const eventPublisher = container.resolve(EventPublisher);
129
129
  const beforeCreateEvent = new TaskBeforeCreateEvent({
130
130
  input: data
131
131
  });
132
132
  await eventPublisher.publish(beforeCreateEvent);
133
133
  const result = await identityContext.withoutAuthorization(async ()=>{
134
134
  const model = await getTaskModel();
135
- const createEntry = context.container.resolve(CreateEntryUseCase);
135
+ const createEntry = container.resolve(CreateEntryUseCase);
136
136
  return createEntry.execute(model, {
137
137
  values: {
138
138
  ...data,
@@ -153,8 +153,8 @@ const createTaskCrud = (context)=>{
153
153
  const updateTask = async (id, data)=>{
154
154
  const original = await getTask(id);
155
155
  if (!original) throw new TaskNotFoundError();
156
- const identityContext = context.container.resolve(IdentityContext);
157
- const eventPublisher = context.container.resolve(EventPublisher);
156
+ const identityContext = container.resolve(IdentityContext);
157
+ const eventPublisher = container.resolve(EventPublisher);
158
158
  const beforeUpdateEvent = new TaskBeforeUpdateEvent({
159
159
  input: data,
160
160
  original
@@ -162,7 +162,7 @@ const createTaskCrud = (context)=>{
162
162
  await eventPublisher.publish(beforeUpdateEvent);
163
163
  const result = await identityContext.withoutAuthorization(async ()=>{
164
164
  const model = await getTaskModel();
165
- const updateEntry = context.container.resolve(UpdateEntryUseCase);
165
+ const updateEntry = container.resolve(UpdateEntryUseCase);
166
166
  return updateEntry.execute(model, createRevisionId(id), {
167
167
  values: {
168
168
  ...data
@@ -181,15 +181,15 @@ const createTaskCrud = (context)=>{
181
181
  const deleteTask = async (id)=>{
182
182
  const task = await getTask(id);
183
183
  if (!task) throw new TaskNotFoundError();
184
- const identityContext = context.container.resolve(IdentityContext);
185
- const eventPublisher = context.container.resolve(EventPublisher);
184
+ const identityContext = container.resolve(IdentityContext);
185
+ const eventPublisher = container.resolve(EventPublisher);
186
186
  const beforeDeleteEvent = new TaskBeforeDeleteEvent({
187
187
  task
188
188
  });
189
189
  await eventPublisher.publish(beforeDeleteEvent);
190
190
  const result = await identityContext.withoutAuthorization(async ()=>{
191
191
  const model = await getTaskModel();
192
- const deleteEntry = context.container.resolve(DeleteEntryUseCase);
192
+ const deleteEntry = container.resolve(DeleteEntryUseCase);
193
193
  return deleteEntry.execute(model, createRevisionId(id));
194
194
  });
195
195
  if (result.isFail()) throw new TaskNotFoundError();
@@ -200,10 +200,10 @@ const createTaskCrud = (context)=>{
200
200
  return true;
201
201
  };
202
202
  const createLog = async (task, data)=>{
203
- const identityContext = context.container.resolve(IdentityContext);
203
+ const identityContext = container.resolve(IdentityContext);
204
204
  const result = await identityContext.withoutAuthorization(async ()=>{
205
205
  const model = await getLogModel();
206
- const createEntry = context.container.resolve(CreateEntryUseCase);
206
+ const createEntry = container.resolve(CreateEntryUseCase);
207
207
  return createEntry.execute(model, {
208
208
  values: {
209
209
  ...data,
@@ -215,10 +215,10 @@ const createTaskCrud = (context)=>{
215
215
  return convertToLog(result.value);
216
216
  };
217
217
  const updateLog = async (id, data)=>{
218
- const identityContext = context.container.resolve(IdentityContext);
218
+ const identityContext = container.resolve(IdentityContext);
219
219
  const result = await identityContext.withoutAuthorization(async ()=>{
220
220
  const model = await getLogModel();
221
- const updateEntry = context.container.resolve(UpdateEntryUseCase);
221
+ const updateEntry = container.resolve(UpdateEntryUseCase);
222
222
  return updateEntry.execute(model, createRevisionId(id), {
223
223
  values: data
224
224
  });
@@ -227,21 +227,21 @@ const createTaskCrud = (context)=>{
227
227
  return convertToLog(result.value);
228
228
  };
229
229
  const deleteLog = async (id)=>{
230
- const identityContext = context.container.resolve(IdentityContext);
230
+ const identityContext = container.resolve(IdentityContext);
231
231
  const result = await identityContext.withoutAuthorization(async ()=>{
232
232
  const model = await getLogModel();
233
- const deleteEntry = context.container.resolve(DeleteEntryUseCase);
233
+ const deleteEntry = container.resolve(DeleteEntryUseCase);
234
234
  return deleteEntry.execute(model, id);
235
235
  });
236
236
  if (result.isFail()) throw new TaskLogNotFoundError();
237
237
  return true;
238
238
  };
239
239
  const getLog = async (id)=>{
240
- const identityContext = context.container.resolve(IdentityContext);
240
+ const identityContext = container.resolve(IdentityContext);
241
241
  try {
242
242
  const result = await identityContext.withoutAuthorization(async ()=>{
243
243
  const model = await getLogModel();
244
- const getEntryById = context.container.resolve(GetEntryByIdUseCase);
244
+ const getEntryById = container.resolve(GetEntryByIdUseCase);
245
245
  return getEntryById.execute(model, id);
246
246
  });
247
247
  if (result.isFail()) throw result.error;
@@ -252,10 +252,10 @@ const createTaskCrud = (context)=>{
252
252
  }
253
253
  };
254
254
  const getLatestLog = async (taskId)=>{
255
- const identityContext = context.container.resolve(IdentityContext);
255
+ const identityContext = container.resolve(IdentityContext);
256
256
  const entry = await identityContext.withoutAuthorization(async ()=>{
257
257
  const model = await getLogModel();
258
- const listLatestEntries = context.container.resolve(ListLatestEntriesUseCase);
258
+ const listLatestEntries = container.resolve(ListLatestEntriesUseCase);
259
259
  const result = await listLatestEntries.execute(model, {
260
260
  where: {
261
261
  values: {
@@ -275,15 +275,15 @@ const createTaskCrud = (context)=>{
275
275
  });
276
276
  return convertToLog(entry);
277
277
  };
278
- const cleanupTaskSubtree = createCleanupTaskSubtree(context);
278
+ const cleanupTaskSubtree = createCleanupTaskSubtree(container);
279
279
  const listLogs = async (params)=>{
280
- const identityContext = context.container.resolve(IdentityContext);
280
+ const identityContext = container.resolve(IdentityContext);
281
281
  const { entries, meta } = await identityContext.withoutAuthorization(async ()=>{
282
282
  const model = await getLogModel();
283
- const listLatestEntries = context.container.resolve(ListLatestEntriesUseCase);
283
+ const listLatestEntries = container.resolve(ListLatestEntriesUseCase);
284
284
  const result = await listLatestEntries.execute(model, {
285
285
  ...params,
286
- where: cmsWhereMapper.map({
286
+ where: getCmsWhereMapper().map({
287
287
  input: params.where,
288
288
  fields: model.fields
289
289
  })
@@ -1 +1 @@
1
- {"version":3,"file":"api/crud/crud.tasks.js","sources":["../../../src/api/crud/crud.tasks.ts"],"sourcesContent":["import WebinyError from \"@webiny/error\";\nimport type {\n Context,\n IListTaskLogParams,\n IListTaskParams,\n ITaskCreateData,\n ITaskLog,\n ITaskLogCreateInput,\n ITaskLogUpdateInput,\n ITasksContextCrudObject,\n ITaskUpdateData\n} from \"~/api/types.js\";\nimport { TaskDataStatus } from \"~/api/types.js\";\nimport { 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 \"~/api/domain/errors.js\";\nimport { TaskService } from \"@webiny/api-core/features/task/TaskService/index.js\";\nimport { TaskDefinition } from \"@webiny/api-core/features/task/TaskDefinition/index.js\";\nimport { EventPublisher } from \"@webiny/api-core/features/eventPublisher/index.js\";\nimport {\n TaskAfterCreateEvent,\n TaskAfterDeleteEvent,\n TaskAfterUpdateEvent,\n TaskBeforeCreateEvent,\n TaskBeforeDeleteEvent,\n TaskBeforeUpdateEvent\n} from \"~/api/events/index.js\";\nimport { CmsWhereMapper } from \"@webiny/api-headless-cms\";\nimport { createCleanupTaskSubtree } from \"./cleanupTaskSubtree.js\";\n\nconst createRevisionId = (id: string) => {\n const { id: entryId } = parseIdentifier(id);\n return `${entryId}#0001`;\n};\n\nconst convertToTask = <\n T extends TaskService.TaskInput = TaskService.TaskInput,\n O extends TaskService.GenericOutput = TaskService.GenericOutput\n>(\n entry: CmsEntry<TaskService.Task<T, O>>\n): TaskService.Task<T, O> => {\n return {\n id: entry.entryId,\n createdOn: entry.createdOn,\n savedOn: entry.savedOn,\n createdBy: entry.createdBy,\n name: entry.values.name,\n definitionId: entry.values.definitionId,\n input: entry.values.input,\n output: entry.values.output,\n taskStatus: entry.values.taskStatus,\n executionName: entry.values.executionName || \"\",\n eventResponse: entry.values.eventResponse,\n startedOn: entry.values.startedOn,\n finishedOn: entry.values.finishedOn,\n iterations: entry.values.iterations,\n parentId: entry.values.parentId\n };\n};\n\nconst convertToLog = (entry: CmsEntry<ITaskLog>): ITaskLog => {\n return {\n id: entry.entryId,\n createdOn: entry.createdOn,\n createdBy: entry.createdBy,\n executionName: entry.values.executionName,\n task: entry.values.task,\n iteration: entry.values.iteration,\n items: entry.values.items || []\n };\n};\n\ninterface IValidateParams {\n definition: Pick<TaskDefinition.Interface, \"createInputValidation\">;\n data: Pick<ITaskCreateData, \"input\">;\n 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"],"names":["createRevisionId","id","entryId","parseIdentifier","convertToTask","entry","convertToLog","getZodSchema","schema","zod","validateTaskInput","params","definition","data","validate","result","createZodError","createTaskCrud","context","cmsWhereMapper","CmsWhereMapper","getTaskModel","identityContext","IdentityContext","getModel","GetModelUseCase","WEBINY_TASK_MODEL_ID","WebinyError","getLogModel","WEBINY_TASK_LOG_MODEL_ID","getTask","model","getEntryById","GetEntryByIdUseCase","listTasks","entries","meta","listLatestEntries","ListLatestEntriesUseCase","item","createTask","TaskDefinitionNotFoundError","eventPublisher","EventPublisher","beforeCreateEvent","TaskBeforeCreateEvent","createEntry","CreateEntryUseCase","TaskDataStatus","task","afterCreateEvent","TaskAfterCreateEvent","updateTask","original","TaskNotFoundError","beforeUpdateEvent","TaskBeforeUpdateEvent","updateEntry","UpdateEntryUseCase","afterUpdateEvent","TaskAfterUpdateEvent","deleteTask","beforeDeleteEvent","TaskBeforeDeleteEvent","deleteEntry","DeleteEntryUseCase","afterDeleteEvent","TaskAfterDeleteEvent","createLog","updateLog","TaskLogNotFoundError","deleteLog","getLog","ex","NotFoundError","getLatestLog","taskId","cleanupTaskSubtree","createCleanupTaskSubtree","listLogs"],"mappings":"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"}
1
+ {"version":3,"file":"api/crud/crud.tasks.js","sources":["../../../src/api/crud/crud.tasks.ts"],"sourcesContent":["import WebinyError from \"@webiny/error\";\nimport type { Container } from \"@webiny/di\";\nimport type {\n IListTaskLogParams,\n IListTaskParams,\n ITaskCreateData,\n ITaskLog,\n ITaskLogCreateInput,\n ITaskLogUpdateInput,\n ITasksContextCrudObject,\n ITaskUpdateData\n} from \"~/api/types.js\";\nimport { TaskDataStatus } from \"~/api/types.js\";\nimport { TasksCrud } from \"~/api/TasksCrud.js\";\nimport { WEBINY_TASK_MODEL_ID } from \"./TaskPrivateModel.js\";\nimport { WEBINY_TASK_LOG_MODEL_ID } from \"./TaskLogPrivateModel.js\";\nimport type { CmsEntry, CmsModel } from \"@webiny/api-headless-cms/types/index.js\";\nimport { NotFoundError } from \"@webiny/api-graphql\";\nimport { createZodError, parseIdentifier } from \"@webiny/utils\";\nimport zod from \"zod\";\nimport type { GenericRecord } from \"@webiny/api/types.js\";\nimport { GetModelUseCase } from \"@webiny/api-headless-cms/features/contentModel/GetModel\";\nimport { GetEntryByIdUseCase } from \"@webiny/api-headless-cms/features/contentEntry/GetEntryById\";\nimport { ListLatestEntriesUseCase } from \"@webiny/api-headless-cms/features/contentEntry/ListEntries\";\nimport { CreateEntryUseCase } from \"@webiny/api-headless-cms/features/contentEntry/CreateEntry\";\nimport { UpdateEntryUseCase } from \"@webiny/api-headless-cms/features/contentEntry/UpdateEntry\";\nimport { DeleteEntryUseCase } from \"@webiny/api-headless-cms/features/contentEntry/DeleteEntry\";\nimport { IdentityContext } from \"@webiny/api-core/features/security/IdentityContext/index.js\";\nimport {\n TaskDefinitionNotFoundError,\n TaskLogNotFoundError,\n TaskNotFoundError\n} from \"~/api/domain/errors.js\";\nimport { TaskService } from \"@webiny/api-core/features/task/TaskService/index.js\";\nimport { TaskDefinition } from \"@webiny/api-core/features/task/TaskDefinition/index.js\";\nimport { EventPublisher } from \"@webiny/api-core/features/eventPublisher/index.js\";\nimport {\n TaskAfterCreateEvent,\n TaskAfterDeleteEvent,\n TaskAfterUpdateEvent,\n TaskBeforeCreateEvent,\n TaskBeforeDeleteEvent,\n TaskBeforeUpdateEvent\n} from \"~/api/events/index.js\";\nimport { CmsWhereMapper } from \"@webiny/api-headless-cms\";\nimport { createCleanupTaskSubtree } from \"./cleanupTaskSubtree.js\";\n\nconst createRevisionId = (id: string) => {\n const { id: entryId } = parseIdentifier(id);\n return `${entryId}#0001`;\n};\n\nconst convertToTask = <\n T extends TaskService.TaskInput = TaskService.TaskInput,\n O extends TaskService.GenericOutput = TaskService.GenericOutput\n>(\n entry: CmsEntry<TaskService.Task<T, O>>\n): TaskService.Task<T, O> => {\n return {\n id: entry.entryId,\n createdOn: entry.createdOn,\n savedOn: entry.savedOn,\n createdBy: entry.createdBy,\n name: entry.values.name,\n definitionId: entry.values.definitionId,\n input: entry.values.input,\n output: entry.values.output,\n taskStatus: entry.values.taskStatus,\n executionName: entry.values.executionName || \"\",\n eventResponse: entry.values.eventResponse,\n startedOn: entry.values.startedOn,\n finishedOn: entry.values.finishedOn,\n iterations: entry.values.iterations,\n parentId: entry.values.parentId\n };\n};\n\nconst convertToLog = (entry: CmsEntry<ITaskLog>): ITaskLog => {\n return {\n id: entry.entryId,\n createdOn: entry.createdOn,\n createdBy: entry.createdBy,\n executionName: entry.values.executionName,\n task: entry.values.task,\n iteration: entry.values.iteration,\n items: entry.values.items || []\n };\n};\n\ninterface IValidateParams {\n definition: Pick<TaskDefinition.Interface, \"createInputValidation\">;\n data: Pick<ITaskCreateData, \"input\">;\n}\n\nconst getZodSchema = (schema: GenericRecord<string, zod.ZodTypeAny> | zod.ZodTypeAny) => {\n if (!schema) {\n return zod.looseObject({});\n } else if (schema instanceof zod.ZodObject) {\n return schema.loose();\n } else if (schema instanceof zod.ZodType) {\n return schema;\n }\n return zod.looseObject(schema);\n};\n\nconst validateTaskInput = async (params: IValidateParams) => {\n const { definition, data } = params;\n if (!definition.createInputValidation) {\n return;\n }\n const schema = definition.createInputValidation({\n validator: zod\n });\n /**\n * If the schema is not an object, we need to wrap it with the `object` function.\n */\n const validate = getZodSchema(schema);\n\n const result = await validate.safeParseAsync(data.input);\n if (result.success) {\n return;\n }\n throw createZodError(result.error);\n};\n\nexport const createTaskCrud = (container: Container): ITasksContextCrudObject => {\n // Resolved lazily (inside listTasks/listLogs) rather than at build time — the factory is now\n // invoked from BackgroundTasksFeature.register, which may run before CmsWhereMapper is registered.\n const getCmsWhereMapper = () => container.resolve(CmsWhereMapper);\n\n const getTaskModel = async (): Promise<CmsModel> => {\n const identityContext = container.resolve(IdentityContext);\n return await identityContext.withoutAuthorization(async () => {\n const getModel = container.resolve(GetModelUseCase);\n const result = await getModel.execute(WEBINY_TASK_MODEL_ID);\n if (result.isFail()) {\n throw new WebinyError(`There is no model \"${WEBINY_TASK_MODEL_ID}\".`);\n }\n return result.value;\n });\n };\n\n const getLogModel = async (): Promise<CmsModel> => {\n const identityContext = container.resolve(IdentityContext);\n return await identityContext.withoutAuthorization(async () => {\n const getModel = container.resolve(GetModelUseCase);\n const result = await getModel.execute(WEBINY_TASK_LOG_MODEL_ID);\n if (result.isFail()) {\n throw new WebinyError(`There is no model \"${WEBINY_TASK_LOG_MODEL_ID}\".`);\n }\n return result.value;\n });\n };\n\n const getTask = async <\n T extends TaskService.TaskInput = TaskService.TaskInput,\n O extends TaskService.GenericOutput = TaskService.GenericOutput\n >(\n id: string\n ) => {\n const identityContext = container.resolve(IdentityContext);\n\n const entry = await identityContext.withoutAuthorization(async () => {\n const model = await getTaskModel();\n const getEntryById = container.resolve(GetEntryByIdUseCase);\n const result = await getEntryById.execute(model, createRevisionId(id));\n if (result.isFail()) {\n return null;\n }\n return result.value;\n });\n\n if (!entry) {\n return null;\n }\n\n return convertToTask(entry as unknown as CmsEntry<TaskService.Task<T, O>>);\n };\n\n const listTasks = async <\n T extends TaskService.TaskInput = TaskService.TaskInput,\n O extends TaskService.GenericOutput = TaskService.GenericOutput\n >(\n params?: IListTaskParams\n ) => {\n const identityContext = container.resolve(IdentityContext);\n const { entries, meta } = await identityContext.withoutAuthorization(async () => {\n const model = await getTaskModel();\n const listLatestEntries = container.resolve(ListLatestEntriesUseCase);\n const result = await listLatestEntries.execute<TaskService.Task<T, O>>(model, {\n ...params,\n where: getCmsWhereMapper().map({\n input: params?.where,\n fields: model.fields\n })\n });\n if (result.isFail()) {\n throw result.error;\n }\n return result.value;\n });\n\n return {\n items: entries.map(item => convertToTask<T, O>(item)),\n meta\n };\n };\n\n const createTask = async (data: ITaskCreateData) => {\n const definition = container.resolve(TasksCrud).getDefinition(data.definitionId);\n if (!definition) {\n throw new TaskDefinitionNotFoundError(data.definitionId);\n }\n\n await validateTaskInput({\n definition,\n data\n });\n\n const identityContext = container.resolve(IdentityContext);\n const eventPublisher = container.resolve(EventPublisher);\n\n const beforeCreateEvent = new TaskBeforeCreateEvent({\n input: data\n });\n await eventPublisher.publish(beforeCreateEvent);\n\n const result = await identityContext.withoutAuthorization(async () => {\n const model = await getTaskModel();\n const createEntry = container.resolve(CreateEntryUseCase);\n return createEntry.execute(model, {\n values: {\n ...data,\n iterations: 0,\n taskStatus: TaskDataStatus.PENDING\n }\n });\n });\n\n if (result.isFail()) {\n throw result.error;\n }\n\n const task = convertToTask(result.value as unknown as CmsEntry<TaskService.Task>);\n\n const afterCreateEvent = new TaskAfterCreateEvent({\n input: data,\n task\n });\n await eventPublisher.publish(afterCreateEvent);\n\n return task;\n };\n\n const updateTask = async <\n T extends TaskService.TaskInput = TaskService.TaskInput,\n O extends TaskService.GenericOutput = TaskService.GenericOutput\n >(\n id: string,\n data: ITaskUpdateData<T, O>\n ) => {\n const original = await getTask<T, O>(id);\n if (!original) {\n throw new TaskNotFoundError();\n }\n\n const identityContext = container.resolve(IdentityContext);\n const eventPublisher = container.resolve(EventPublisher);\n\n const beforeUpdateEvent = new TaskBeforeUpdateEvent({\n input: data,\n original\n });\n await eventPublisher.publish(beforeUpdateEvent);\n\n const result = await identityContext.withoutAuthorization(async () => {\n const model = await getTaskModel();\n const updateEntry = container.resolve(UpdateEntryUseCase);\n return updateEntry.execute(model, createRevisionId(id), {\n values: {\n ...data\n }\n });\n });\n\n if (result.isFail()) {\n throw result.error;\n }\n\n const task = convertToTask<T, O>(\n result.value as unknown as CmsEntry<TaskService.Task<T, O>>\n );\n\n const afterUpdateEvent = new TaskAfterUpdateEvent({\n input: data,\n task\n });\n await eventPublisher.publish(afterUpdateEvent);\n\n return task;\n };\n\n const deleteTask = async (id: string) => {\n const task = await getTask(id);\n if (!task) {\n throw new TaskNotFoundError();\n }\n\n const identityContext = container.resolve(IdentityContext);\n const eventPublisher = container.resolve(EventPublisher);\n\n const beforeDeleteEvent = new TaskBeforeDeleteEvent({\n task\n });\n await eventPublisher.publish(beforeDeleteEvent);\n\n const result = await identityContext.withoutAuthorization(async () => {\n const model = await getTaskModel();\n const deleteEntry = container.resolve(DeleteEntryUseCase);\n return deleteEntry.execute(model, createRevisionId(id));\n });\n\n if (result.isFail()) {\n throw new TaskNotFoundError();\n }\n\n const afterDeleteEvent = new TaskAfterDeleteEvent({ task });\n await eventPublisher.publish(afterDeleteEvent);\n\n return true;\n };\n\n const createLog = async (task: Pick<TaskService.Task, \"id\">, data: ITaskLogCreateInput) => {\n const identityContext = container.resolve(IdentityContext);\n const result = await identityContext.withoutAuthorization(async () => {\n const model = await getLogModel();\n const createEntry = container.resolve(CreateEntryUseCase);\n return createEntry.execute(model, {\n values: {\n ...data,\n task: task.id\n }\n });\n });\n\n if (result.isFail()) {\n throw result.error;\n }\n\n return convertToLog(result.value as unknown as CmsEntry<ITaskLog>);\n };\n\n const updateLog = async (id: string, data: ITaskLogUpdateInput) => {\n const identityContext = container.resolve(IdentityContext);\n const result = await identityContext.withoutAuthorization(async () => {\n const model = await getLogModel();\n const updateEntry = container.resolve(UpdateEntryUseCase);\n return updateEntry.execute(model, createRevisionId(id), {\n values: data\n });\n });\n\n if (result.isFail()) {\n throw new TaskLogNotFoundError();\n }\n\n return convertToLog(result.value as unknown as CmsEntry<ITaskLog>);\n };\n\n const deleteLog = async (id: string) => {\n const identityContext = container.resolve(IdentityContext);\n const result = await identityContext.withoutAuthorization(async () => {\n const model = await getLogModel();\n const deleteEntry = container.resolve(DeleteEntryUseCase);\n return deleteEntry.execute(model, id);\n });\n\n if (result.isFail()) {\n throw new TaskLogNotFoundError();\n }\n\n return true;\n };\n\n const getLog = async (id: string): Promise<ITaskLog | null> => {\n const identityContext = container.resolve(IdentityContext);\n try {\n const result = await identityContext.withoutAuthorization(async () => {\n const model = await getLogModel();\n const getEntryById = container.resolve(GetEntryByIdUseCase);\n return getEntryById.execute(model, id);\n });\n\n if (result.isFail()) {\n throw result.error;\n }\n\n return convertToLog(result.value as unknown as CmsEntry<ITaskLog>);\n } catch (ex) {\n if (ex instanceof NotFoundError) {\n return null;\n }\n throw ex;\n }\n };\n\n const getLatestLog = async (taskId: string): Promise<ITaskLog> => {\n const identityContext = container.resolve(IdentityContext);\n const entry = await identityContext.withoutAuthorization(async () => {\n const model = await getLogModel();\n const listLatestEntries = container.resolve(ListLatestEntriesUseCase);\n const result = await listLatestEntries.execute<ITaskLog>(model, {\n where: {\n values: {\n task: taskId\n }\n },\n sort: [\"createdOn_DESC\"],\n limit: 1\n });\n if (result.isFail()) {\n throw result.error;\n }\n const { entries } = result.value;\n const [item] = entries;\n if (!item) {\n throw new NotFoundError(`No existing latest log found for task \"${taskId}\".`);\n }\n return item;\n });\n\n return convertToLog(entry as unknown as CmsEntry<ITaskLog>);\n };\n\n const cleanupTaskSubtree = createCleanupTaskSubtree(container);\n\n const listLogs = async (params: IListTaskLogParams) => {\n const identityContext = container.resolve(IdentityContext);\n const { entries, meta } = await identityContext.withoutAuthorization(async () => {\n const model = await getLogModel();\n const listLatestEntries = container.resolve(ListLatestEntriesUseCase);\n const result = await listLatestEntries.execute<ITaskLog>(model, {\n ...params,\n where: getCmsWhereMapper().map({\n input: params.where,\n fields: model.fields\n })\n });\n if (result.isFail()) {\n throw result.error;\n }\n return result.value;\n });\n\n return {\n items: entries.map(item => convertToLog(item)),\n meta\n };\n };\n\n return {\n getTask,\n listTasks,\n createTask,\n updateTask,\n deleteTask,\n cleanupTaskSubtree,\n createLog,\n updateLog,\n deleteLog,\n getLog,\n listLogs,\n getLatestLog,\n getTaskModel,\n getLogModel\n };\n};\n"],"names":["createRevisionId","id","entryId","parseIdentifier","convertToTask","entry","convertToLog","getZodSchema","schema","zod","validateTaskInput","params","definition","data","validate","result","createZodError","createTaskCrud","container","getCmsWhereMapper","CmsWhereMapper","getTaskModel","identityContext","IdentityContext","getModel","GetModelUseCase","WEBINY_TASK_MODEL_ID","WebinyError","getLogModel","WEBINY_TASK_LOG_MODEL_ID","getTask","model","getEntryById","GetEntryByIdUseCase","listTasks","entries","meta","listLatestEntries","ListLatestEntriesUseCase","item","createTask","TasksCrud","TaskDefinitionNotFoundError","eventPublisher","EventPublisher","beforeCreateEvent","TaskBeforeCreateEvent","createEntry","CreateEntryUseCase","TaskDataStatus","task","afterCreateEvent","TaskAfterCreateEvent","updateTask","original","TaskNotFoundError","beforeUpdateEvent","TaskBeforeUpdateEvent","updateEntry","UpdateEntryUseCase","afterUpdateEvent","TaskAfterUpdateEvent","deleteTask","beforeDeleteEvent","TaskBeforeDeleteEvent","deleteEntry","DeleteEntryUseCase","afterDeleteEvent","TaskAfterDeleteEvent","createLog","updateLog","TaskLogNotFoundError","deleteLog","getLog","ex","NotFoundError","getLatestLog","taskId","cleanupTaskSubtree","createCleanupTaskSubtree","listLogs"],"mappings":"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"}
@@ -1,2 +1,3 @@
1
- import type { Context, ITasksContextDefinitionObject } from "../../api/types.js";
2
- export declare const createDefinitionCrud: (context: Context) => ITasksContextDefinitionObject;
1
+ import type { Container } from "@webiny/di";
2
+ import type { ITasksContextDefinitionObject } from "../../api/types.js";
3
+ export declare const createDefinitionCrud: (container: Container) => ITasksContextDefinitionObject;
@@ -1,14 +1,14 @@
1
1
  import { GetTaskDefinitionUseCase } from "../features/GetTaskDefinition/index.js";
2
2
  import { ListTaskDefinitionsUseCase } from "../features/ListTaskDefinitions/index.js";
3
- const createDefinitionCrud = (context)=>({
3
+ const createDefinitionCrud = (container)=>({
4
4
  getDefinition: (id)=>{
5
- const useCase = context.container.resolve(GetTaskDefinitionUseCase);
5
+ const useCase = container.resolve(GetTaskDefinitionUseCase);
6
6
  const result = useCase.execute(id);
7
7
  if (result.isOk()) return result.value;
8
8
  return null;
9
9
  },
10
10
  listDefinitions: ()=>{
11
- const useCase = context.container.resolve(ListTaskDefinitionsUseCase);
11
+ const useCase = container.resolve(ListTaskDefinitionsUseCase);
12
12
  return useCase.execute();
13
13
  }
14
14
  });
@@ -1 +1 @@
1
- {"version":3,"file":"api/crud/definition.tasks.js","sources":["../../../src/api/crud/definition.tasks.ts"],"sourcesContent":["import type { Context, ITasksContextDefinitionObject } from \"~/api/types.js\";\nimport { TaskDefinition } from \"@webiny/api-core/features/task/TaskDefinition/index.js\";\nimport { GetTaskDefinitionUseCase } from \"~/api/features/GetTaskDefinition/index.js\";\nimport { ListTaskDefinitionsUseCase } from \"~/api/features/ListTaskDefinitions/index.js\";\n\nexport const createDefinitionCrud = (context: Context): ITasksContextDefinitionObject => {\n return {\n getDefinition: <\n I extends TaskDefinition.TaskInput = TaskDefinition.TaskInput,\n O extends TaskDefinition.TaskOutput = TaskDefinition.TaskOutput\n >(\n id: string\n ) => {\n const useCase = context.container.resolve(GetTaskDefinitionUseCase);\n const result = useCase.execute<I, O>(id);\n\n if (result.isOk()) {\n return result.value;\n }\n\n return null;\n },\n listDefinitions: () => {\n const useCase = context.container.resolve(ListTaskDefinitionsUseCase);\n return useCase.execute();\n }\n };\n};\n"],"names":["createDefinitionCrud","context","id","useCase","GetTaskDefinitionUseCase","result","ListTaskDefinitionsUseCase"],"mappings":";;AAKO,MAAMA,uBAAuB,CAACC,UAC1B;QACH,eAAe,CAIXC;YAEA,MAAMC,UAAUF,QAAQ,SAAS,CAAC,OAAO,CAACG;YAC1C,MAAMC,SAASF,QAAQ,OAAO,CAAOD;YAErC,IAAIG,OAAO,IAAI,IACX,OAAOA,OAAO,KAAK;YAGvB,OAAO;QACX;QACA,iBAAiB;YACb,MAAMF,UAAUF,QAAQ,SAAS,CAAC,OAAO,CAACK;YAC1C,OAAOH,QAAQ,OAAO;QAC1B;IACJ"}
1
+ {"version":3,"file":"api/crud/definition.tasks.js","sources":["../../../src/api/crud/definition.tasks.ts"],"sourcesContent":["import type { Container } from \"@webiny/di\";\nimport type { ITasksContextDefinitionObject } from \"~/api/types.js\";\nimport { TaskDefinition } from \"@webiny/api-core/features/task/TaskDefinition/index.js\";\nimport { GetTaskDefinitionUseCase } from \"~/api/features/GetTaskDefinition/index.js\";\nimport { ListTaskDefinitionsUseCase } from \"~/api/features/ListTaskDefinitions/index.js\";\n\nexport const createDefinitionCrud = (container: Container): ITasksContextDefinitionObject => {\n return {\n getDefinition: <\n I extends TaskDefinition.TaskInput = TaskDefinition.TaskInput,\n O extends TaskDefinition.TaskOutput = TaskDefinition.TaskOutput\n >(\n id: string\n ) => {\n const useCase = container.resolve(GetTaskDefinitionUseCase);\n const result = useCase.execute<I, O>(id);\n\n if (result.isOk()) {\n return result.value;\n }\n\n return null;\n },\n listDefinitions: () => {\n const useCase = container.resolve(ListTaskDefinitionsUseCase);\n return useCase.execute();\n }\n };\n};\n"],"names":["createDefinitionCrud","container","id","useCase","GetTaskDefinitionUseCase","result","ListTaskDefinitionsUseCase"],"mappings":";;AAMO,MAAMA,uBAAuB,CAACC,YAC1B;QACH,eAAe,CAIXC;YAEA,MAAMC,UAAUF,UAAU,OAAO,CAACG;YAClC,MAAMC,SAASF,QAAQ,OAAO,CAAOD;YAErC,IAAIG,OAAO,IAAI,IACX,OAAOA,OAAO,KAAK;YAGvB,OAAO;QACX;QACA,iBAAiB;YACb,MAAMF,UAAUF,UAAU,OAAO,CAACK;YAClC,OAAOH,QAAQ,OAAO;QAC1B;IACJ"}
@@ -1,2 +1,3 @@
1
- import type { Context, ITasksContextServiceObject } from "../../api/types.js";
2
- export declare const createServiceCrud: (context: Context) => ITasksContextServiceObject;
1
+ import type { Container } from "@webiny/di";
2
+ import type { ITasksContextServiceObject } from "../../api/types.js";
3
+ export declare const createServiceCrud: (container: Container) => ITasksContextServiceObject;
@@ -1,6 +1,7 @@
1
1
  import error from "@webiny/error";
2
+ import { TasksCrud } from "../TasksCrud.js";
2
3
  import { TaskDataStatus, TaskLogItemType } from "../types.js";
3
- import { NotFoundError } from "@webiny/handler-graphql";
4
+ import { NotFoundError } from "@webiny/api-graphql";
4
5
  import { createService } from "../service/index.js";
5
6
  import { Result } from "@webiny/feature/api";
6
7
  import { TaskAbortError, TaskDefinitionNotFoundError, TaskNotFoundError, TaskServiceInfoError } from "../domain/errors.js";
@@ -14,14 +15,13 @@ const validateDelay = ({ input, delay })=>{
14
15
  delay
15
16
  });
16
17
  };
17
- const createServiceCrud = (context)=>{
18
- const service = createService({
19
- context
20
- });
21
- return {
18
+ const createServiceCrud = (container)=>({
22
19
  trigger: async (params)=>{
20
+ const service = createService({
21
+ container
22
+ });
23
23
  const { definition: id, input: inputValues, name, parent, delay = 0 } = params;
24
- const definition = context.tasks.getDefinition(id);
24
+ const definition = container.resolve(TasksCrud).getDefinition(id);
25
25
  if (!definition) throw new error("Task definition was not found!", "TASK_DEFINITION_ERROR", {
26
26
  id
27
27
  });
@@ -40,7 +40,7 @@ const createServiceCrud = (context)=>{
40
40
  });
41
41
  let task;
42
42
  try {
43
- task = await context.tasks.createTask(input);
43
+ task = await container.resolve(TasksCrud).createTask(input);
44
44
  } catch (ex) {
45
45
  console.log("Could not create the task.", ex);
46
46
  throw ex;
@@ -54,16 +54,19 @@ const createServiceCrud = (context)=>{
54
54
  } catch (ex) {
55
55
  console.log("Could not trigger the step function.");
56
56
  console.error(ex);
57
- await context.tasks.deleteTask(task.id);
57
+ await container.resolve(TasksCrud).deleteTask(task.id);
58
58
  throw ex;
59
59
  }
60
- const updatedTask = await context.tasks.updateTask(task.id, {
60
+ const updatedTask = await container.resolve(TasksCrud).updateTask(task.id, {
61
61
  eventResponse: result
62
62
  });
63
63
  return Result.ok(updatedTask);
64
64
  },
65
65
  fetchServiceInfo: async (input)=>{
66
- const task = "object" == typeof input ? input : await context.tasks.getTask(input);
66
+ const service = createService({
67
+ container
68
+ });
69
+ const task = "object" == typeof input ? input : await container.resolve(TasksCrud).getTask(input);
67
70
  if (task || "string" != typeof input) {
68
71
  if (!task) throw new error("Task was not found!", "TASK_FETCH_ERROR", {
69
72
  input
@@ -80,9 +83,9 @@ const createServiceCrud = (context)=>{
80
83
  }
81
84
  },
82
85
  abort: async (params)=>{
83
- const task = await context.tasks.getTask(params.id);
86
+ const task = await container.resolve(TasksCrud).getTask(params.id);
84
87
  if (!task) return Result.fail(new TaskNotFoundError());
85
- const definition = context.tasks.getDefinition(task.definitionId);
88
+ const definition = container.resolve(TasksCrud).getDefinition(task.definitionId);
86
89
  if (!definition) return Result.fail(new TaskDefinitionNotFoundError(task.definitionId));
87
90
  if (false === [
88
91
  TaskDataStatus.PENDING,
@@ -93,17 +96,17 @@ const createServiceCrud = (context)=>{
93
96
  }));
94
97
  let taskLog = null;
95
98
  try {
96
- taskLog = await context.tasks.getLatestLog(task.id);
99
+ taskLog = await container.resolve(TasksCrud).getLatestLog(task.id);
97
100
  } catch {}
98
- if (!taskLog) taskLog = await context.tasks.createLog(task, {
101
+ if (!taskLog) taskLog = await container.resolve(TasksCrud).createLog(task, {
99
102
  iteration: 1,
100
103
  executionName: task.executionName
101
104
  });
102
105
  try {
103
- const updatedTask = await context.tasks.updateTask(task.id, {
106
+ const updatedTask = await container.resolve(TasksCrud).updateTask(task.id, {
104
107
  taskStatus: TaskDataStatus.ABORTED
105
108
  });
106
- await context.tasks.updateLog(taskLog.id, {
109
+ await container.resolve(TasksCrud).updateLog(taskLog.id, {
107
110
  items: taskLog.items.concat([
108
111
  {
109
112
  message: params.message || "Task aborted.",
@@ -123,8 +126,7 @@ const createServiceCrud = (context)=>{
123
126
  });
124
127
  }
125
128
  }
126
- };
127
- };
129
+ });
128
130
  export { createServiceCrud };
129
131
 
130
132
  //# sourceMappingURL=service.tasks.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"api/crud/service.tasks.js","sources":["../../../src/api/crud/service.tasks.ts"],"sourcesContent":["import WebinyError from \"@webiny/error\";\nimport type {\n Context,\n ITaskAbortParams,\n ITaskCreateData,\n ITaskLog,\n ITasksContextServiceObject,\n ITaskTriggerParams\n} from \"~/api/types.js\";\nimport { TaskDataStatus, TaskLogItemType } from \"~/api/types.js\";\nimport { NotFoundError } from \"@webiny/handler-graphql\";\nimport { createService } from \"~/api/service/index.js\";\nimport type { IStepFunctionServiceFetchResult } from \"~/api/service/StepFunctionServicePlugin.js\";\nimport { TaskService } from \"@webiny/api-core/features/task/TaskService/index.js\";\nimport { TaskDefinition } from \"@webiny/api-core/features/task/TaskDefinition/index.js\";\nimport { BaseError, Result } from \"@webiny/feature/api\";\nimport {\n TaskAbortError,\n TaskDefinitionNotFoundError,\n TaskNotFoundError,\n TaskServiceInfoError\n} from \"~/api/domain/errors.js\";\n\nconst MAX_DELAY_DAYS = 355;\nconst MAX_DELAY_SECONDS = MAX_DELAY_DAYS * 24 * 60 * 60;\n\ninterface ValidateDelayParams<T extends TaskService.TaskInput> {\n input: ITaskCreateData<T>;\n delay?: number;\n}\n\nconst validateDelay = <T extends TaskService.TaskInput = TaskService.TaskInput>({\n input,\n delay\n}: ValidateDelayParams<T>): void => {\n if (!delay || delay < 0 || typeof delay !== \"number\" || Number.isInteger(delay) === false) {\n return;\n } else if (delay < MAX_DELAY_SECONDS) {\n return;\n }\n throw new WebinyError(\n `The maximum delay for a task is ${MAX_DELAY_DAYS} days.`,\n \"MAX_DELAY_ERROR\",\n {\n ...input,\n delay\n }\n );\n};\n\nexport const createServiceCrud = (context: Context): ITasksContextServiceObject => {\n const service = createService({\n context\n });\n\n return {\n trigger: async <\n T extends TaskService.TaskInput = TaskService.TaskInput,\n O extends TaskService.GenericOutput = TaskService.GenericOutput\n >(\n params: ITaskTriggerParams<T>\n ): Promise<Result<TaskService.Task<T, O>, BaseError>> => {\n const { definition: id, input: inputValues, name, parent, delay = 0 } = params;\n const definition = context.tasks.getDefinition(id);\n if (!definition) {\n throw new WebinyError(`Task definition was not found!`, \"TASK_DEFINITION_ERROR\", {\n id\n });\n }\n const input: TaskDefinition.TaskCreateData<T> = {\n name: name || definition.title,\n definitionId: id,\n input: inputValues || ({} as T),\n parentId: parent?.id\n };\n\n if (definition.onBeforeTrigger) {\n await definition.onBeforeTrigger({ data: input });\n }\n validateDelay<T>({\n input,\n delay\n });\n\n let task: TaskService.Task<T>;\n try {\n task = await context.tasks.createTask<T>(input);\n } catch (ex) {\n console.log(\"Could not create the task.\", ex);\n throw ex;\n }\n\n let result: Awaited<ReturnType<typeof service.send>> | null = null;\n try {\n result = await service.send(task, delay);\n\n if (!result) {\n throw new WebinyError(\n `Could not trigger the step function!`,\n \"TRIGGER_STEP_FUNCTION_ERROR\",\n {\n task\n }\n );\n }\n } catch (ex) {\n console.log(\"Could not trigger the step function.\");\n console.error(ex);\n /**\n * In case of failure to create the Event Bridge Event, we need to delete the task that was meant to be created.\n * TODO maybe we can leave the task and update it as failed - with event bridge error?\n */\n await context.tasks.deleteTask(task.id);\n throw ex;\n }\n\n const updatedTask = await context.tasks.updateTask<T, O>(task.id, {\n eventResponse: result\n });\n\n return Result.ok(updatedTask);\n },\n fetchServiceInfo: async (\n input: TaskService.Task | string\n ): Promise<Result<IStepFunctionServiceFetchResult, BaseError<any>>> => {\n const task = typeof input === \"object\" ? input : await context.tasks.getTask(input);\n if (!task && typeof input === \"string\") {\n throw new NotFoundError(`Task \"${input}\" was not found!`);\n } else if (!task) {\n throw new WebinyError(`Task was not found!`, \"TASK_FETCH_ERROR\", {\n input\n });\n }\n\n try {\n const info = (await service.fetch(task)) as IStepFunctionServiceFetchResult | null;\n if (info) {\n return Result.ok(info);\n }\n\n return Result.fail(new TaskServiceInfoError());\n } catch (ex) {\n console.log(\"Service fetch error.\");\n console.error(ex);\n return Result.fail(new TaskServiceInfoError());\n }\n },\n abort: async <\n T extends TaskService.TaskInput = TaskService.TaskInput,\n O extends TaskService.GenericOutput = TaskService.GenericOutput\n >(\n params: ITaskAbortParams\n ): Promise<Result<TaskService.Task<T, O>, BaseError<any>>> => {\n const task = await context.tasks.getTask<T, O>(params.id);\n if (!task) {\n return Result.fail(new TaskNotFoundError());\n }\n\n const definition = context.tasks.getDefinition<T, O>(task.definitionId);\n if (!definition) {\n return Result.fail(new TaskDefinitionNotFoundError(task.definitionId));\n }\n /**\n * We should only be able to abort a task which is pending or running\n */\n if (\n [TaskDataStatus.PENDING, TaskDataStatus.RUNNING].includes(task.taskStatus) === false\n ) {\n return Result.fail(\n new TaskAbortError({\n id: params.id,\n status: task.taskStatus\n })\n );\n }\n let taskLog: ITaskLog | null = null;\n try {\n taskLog = await context.tasks.getLatestLog(task.id);\n } catch {}\n if (!taskLog) {\n taskLog = await context.tasks.createLog(task, {\n iteration: 1,\n executionName: task.executionName\n });\n }\n try {\n const updatedTask = await context.tasks.updateTask<T, O>(task.id, {\n taskStatus: TaskDataStatus.ABORTED\n });\n await context.tasks.updateLog(taskLog.id, {\n items: taskLog.items.concat([\n {\n message: params.message || \"Task aborted.\",\n type: TaskLogItemType.INFO,\n createdOn: new Date().toISOString()\n }\n ])\n });\n /**\n * TODO: determine when to kick off the onAbort hook\n */\n if (definition.onAbort) {\n await definition.onAbort({\n task: updatedTask\n });\n }\n\n return Result.ok(updatedTask);\n } catch (ex) {\n throw new WebinyError(`Could not abort the task!`, \"TASK_ABORT_ERROR\", {\n id: params.id,\n message: ex.message\n });\n }\n }\n };\n};\n"],"names":["MAX_DELAY_DAYS","MAX_DELAY_SECONDS","validateDelay","input","delay","Number","WebinyError","createServiceCrud","context","service","createService","params","id","inputValues","name","parent","definition","task","ex","console","result","updatedTask","Result","NotFoundError","info","TaskServiceInfoError","TaskNotFoundError","TaskDefinitionNotFoundError","TaskDataStatus","TaskAbortError","taskLog","TaskLogItemType","Date"],"mappings":"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"}
1
+ {"version":3,"file":"api/crud/service.tasks.js","sources":["../../../src/api/crud/service.tasks.ts"],"sourcesContent":["import WebinyError from \"@webiny/error\";\nimport type { Container } from \"@webiny/di\";\nimport type {\n ITaskAbortParams,\n ITaskCreateData,\n ITaskLog,\n ITasksContextServiceObject,\n ITaskTriggerParams\n} from \"~/api/types.js\";\nimport { TasksCrud } from \"~/api/TasksCrud.js\";\nimport { TaskDataStatus, TaskLogItemType } from \"~/api/types.js\";\nimport { NotFoundError } from \"@webiny/api-graphql\";\nimport { createService } from \"~/api/service/index.js\";\nimport type { IServiceInfo } from \"@webiny/api-core/features/task/TaskService/abstractions.js\";\nimport { TaskService } from \"@webiny/api-core/features/task/TaskService/index.js\";\nimport { TaskDefinition } from \"@webiny/api-core/features/task/TaskDefinition/index.js\";\nimport { BaseError, Result } from \"@webiny/feature/api\";\nimport {\n TaskAbortError,\n TaskDefinitionNotFoundError,\n TaskNotFoundError,\n TaskServiceInfoError\n} from \"~/api/domain/errors.js\";\n\nconst MAX_DELAY_DAYS = 355;\nconst MAX_DELAY_SECONDS = MAX_DELAY_DAYS * 24 * 60 * 60;\n\ninterface ValidateDelayParams<T extends TaskService.TaskInput> {\n input: ITaskCreateData<T>;\n delay?: number;\n}\n\nconst validateDelay = <T extends TaskService.TaskInput = TaskService.TaskInput>({\n input,\n delay\n}: ValidateDelayParams<T>): void => {\n if (!delay || delay < 0 || typeof delay !== \"number\" || Number.isInteger(delay) === false) {\n return;\n } else if (delay < MAX_DELAY_SECONDS) {\n return;\n }\n throw new WebinyError(\n `The maximum delay for a task is ${MAX_DELAY_DAYS} days.`,\n \"MAX_DELAY_ERROR\",\n {\n ...input,\n delay\n }\n );\n};\n\nexport const createServiceCrud = (container: Container): ITasksContextServiceObject => {\n return {\n trigger: async <\n T extends TaskService.TaskInput = TaskService.TaskInput,\n O extends TaskService.GenericOutput = TaskService.GenericOutput\n >(\n params: ITaskTriggerParams<T>\n ): Promise<Result<TaskService.Task<T, O>, BaseError>> => {\n const service = createService({ container });\n const { definition: id, input: inputValues, name, parent, delay = 0 } = params;\n const definition = container.resolve(TasksCrud).getDefinition(id);\n if (!definition) {\n throw new WebinyError(`Task definition was not found!`, \"TASK_DEFINITION_ERROR\", {\n id\n });\n }\n const input: TaskDefinition.TaskCreateData<T> = {\n name: name || definition.title,\n definitionId: id,\n input: inputValues || ({} as T),\n parentId: parent?.id\n };\n\n if (definition.onBeforeTrigger) {\n await definition.onBeforeTrigger({ data: input });\n }\n validateDelay<T>({\n input,\n delay\n });\n\n let task: TaskService.Task<T>;\n try {\n task = await container.resolve(TasksCrud).createTask<T>(input);\n } catch (ex) {\n console.log(\"Could not create the task.\", ex);\n throw ex;\n }\n\n let result: Awaited<ReturnType<typeof service.send>> | null = null;\n try {\n result = await service.send(task, delay);\n\n if (!result) {\n throw new WebinyError(\n `Could not trigger the step function!`,\n \"TRIGGER_STEP_FUNCTION_ERROR\",\n {\n task\n }\n );\n }\n } catch (ex) {\n console.log(\"Could not trigger the step function.\");\n console.error(ex);\n /**\n * In case of failure to create the Event Bridge Event, we need to delete the task that was meant to be created.\n * TODO maybe we can leave the task and update it as failed - with event bridge error?\n */\n await container.resolve(TasksCrud).deleteTask(task.id);\n throw ex;\n }\n\n const updatedTask = await container.resolve(TasksCrud).updateTask<T, O>(task.id, {\n eventResponse: result\n });\n\n return Result.ok(updatedTask);\n },\n fetchServiceInfo: async (\n input: TaskService.Task | string\n ): Promise<Result<IServiceInfo, BaseError<any>>> => {\n const service = createService({ container });\n const task =\n typeof input === \"object\"\n ? input\n : await container.resolve(TasksCrud).getTask(input);\n if (!task && typeof input === \"string\") {\n throw new NotFoundError(`Task \"${input}\" was not found!`);\n } else if (!task) {\n throw new WebinyError(`Task was not found!`, \"TASK_FETCH_ERROR\", {\n input\n });\n }\n\n try {\n const info = (await service.fetch(task)) as IServiceInfo | null;\n if (info) {\n return Result.ok(info);\n }\n\n return Result.fail(new TaskServiceInfoError());\n } catch (ex) {\n console.log(\"Service fetch error.\");\n console.error(ex);\n return Result.fail(new TaskServiceInfoError());\n }\n },\n abort: async <\n T extends TaskService.TaskInput = TaskService.TaskInput,\n O extends TaskService.GenericOutput = TaskService.GenericOutput\n >(\n params: ITaskAbortParams\n ): Promise<Result<TaskService.Task<T, O>, BaseError<any>>> => {\n const task = await container.resolve(TasksCrud).getTask<T, O>(params.id);\n if (!task) {\n return Result.fail(new TaskNotFoundError());\n }\n\n const definition = container.resolve(TasksCrud).getDefinition<T, O>(task.definitionId);\n if (!definition) {\n return Result.fail(new TaskDefinitionNotFoundError(task.definitionId));\n }\n /**\n * We should only be able to abort a task which is pending or running\n */\n if (\n [TaskDataStatus.PENDING, TaskDataStatus.RUNNING].includes(task.taskStatus) === false\n ) {\n return Result.fail(\n new TaskAbortError({\n id: params.id,\n status: task.taskStatus\n })\n );\n }\n let taskLog: ITaskLog | null = null;\n try {\n taskLog = await container.resolve(TasksCrud).getLatestLog(task.id);\n } catch {}\n if (!taskLog) {\n taskLog = await container.resolve(TasksCrud).createLog(task, {\n iteration: 1,\n executionName: task.executionName\n });\n }\n try {\n const updatedTask = await container.resolve(TasksCrud).updateTask<T, O>(task.id, {\n taskStatus: TaskDataStatus.ABORTED\n });\n await container.resolve(TasksCrud).updateLog(taskLog.id, {\n items: taskLog.items.concat([\n {\n message: params.message || \"Task aborted.\",\n type: TaskLogItemType.INFO,\n createdOn: new Date().toISOString()\n }\n ])\n });\n /**\n * TODO: determine when to kick off the onAbort hook\n */\n if (definition.onAbort) {\n await definition.onAbort({\n task: updatedTask\n });\n }\n\n return Result.ok(updatedTask);\n } catch (ex) {\n throw new WebinyError(`Could not abort the task!`, \"TASK_ABORT_ERROR\", {\n id: params.id,\n message: ex.message\n });\n }\n }\n };\n};\n"],"names":["MAX_DELAY_DAYS","MAX_DELAY_SECONDS","validateDelay","input","delay","Number","WebinyError","createServiceCrud","container","params","service","createService","id","inputValues","name","parent","definition","TasksCrud","task","ex","console","result","updatedTask","Result","NotFoundError","info","TaskServiceInfoError","TaskNotFoundError","TaskDefinitionNotFoundError","TaskDataStatus","TaskAbortError","taskLog","TaskLogItemType","Date"],"mappings":"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"}
@@ -16,7 +16,7 @@ declare class RunnableTaskDecoratorImpl implements TaskDefinition.Interface {
16
16
  get databaseLogs(): boolean;
17
17
  get maxIterations(): number;
18
18
  get selfCleanup(): import("@webiny/api-core/features/task/TaskDefinition/abstractions").ISelfCleanup | undefined;
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
+ get createInputValidation(): ((params: import("@webiny/api-core/features/task/TaskDefinition/abstractions").ITaskCreateInputValidationParams) => import("@webiny/api/types").GenericRecord<PropertyKey, import("zod").ZodType<unknown, unknown, import("zod/v4/core").$ZodTypeInternals<unknown, unknown>>> | import("zod").ZodType<unknown, unknown, import("zod/v4/core").$ZodTypeInternals<unknown, unknown>>) | undefined;
20
20
  get run(): (params: import("@webiny/api-core/features/task/TaskDefinition/abstractions").ITaskRunParams<import("@webiny/api-core/features/task/TaskDefinition/abstractions").ITaskInput, import("@webiny/api-core/features/task/TaskDefinition/abstractions").ITaskOutput>) => Promise<import("@webiny/api-core/features/task/TaskDefinition/abstractions").ITaskResult<import("@webiny/api-core/features/task/TaskDefinition/abstractions").ITaskInput, import("@webiny/api-core/features/task/TaskDefinition/abstractions").ITaskOutput>>;
21
21
  get onBeforeTrigger(): ((params: import("@webiny/api-core/features/task/TaskDefinition/abstractions").ITaskBeforeTriggerParams<import("@webiny/api-core/features/task/TaskDefinition/abstractions").ITaskInput>) => Promise<void>) | undefined;
22
22
  get onDone(): ((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;
@@ -17,10 +17,10 @@ class RunnableTaskDecoratorImpl {
17
17
  return this.decoratee.description;
18
18
  }
19
19
  get isPrivate() {
20
- return this.decoratee.isPrivate ?? false;
20
+ return this.decoratee.isPrivate || false;
21
21
  }
22
22
  get databaseLogs() {
23
- return this.decoratee.databaseLogs ?? false;
23
+ return this.decoratee.databaseLogs || false;
24
24
  }
25
25
  get maxIterations() {
26
26
  return this.decoratee.maxIterations || DEFAULT_MAX_ITERATIONS;
@@ -1 +1 @@
1
- {"version":3,"file":"api/decorators/RunnableTaskDecorator.js","sources":["../../../src/api/decorators/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"],"names":["DEFAULT_MAX_ITERATIONS","RunnableTaskDecoratorImpl","decoratee","camelCase","message","console","WebinyError","RunnableTaskDecorator","TaskDefinition"],"mappings":";;;AAKA,MAAMA,yBAAyB;AAQ/B,MAAMC;IACF,YAAoBC,SAAmC,CAAE;aAArCA,SAAS,GAATA;QAChB,IAAI,CAAC,QAAQ;IACjB;IAGA,IAAI,KAAK;QACL,OAAO,IAAI,CAAC,SAAS,CAAC,EAAE;IAC5B;IAEA,IAAI,QAAQ;QACR,OAAO,IAAI,CAAC,SAAS,CAAC,KAAK;IAC/B;IAEA,IAAI,cAAc;QACd,OAAO,IAAI,CAAC,SAAS,CAAC,WAAW;IACrC;IAGA,IAAI,YAAY;QACZ,OAAO,IAAI,CAAC,SAAS,CAAC,SAAS,IAAI;IACvC;IAEA,IAAI,eAAe;QACf,OAAO,IAAI,CAAC,SAAS,CAAC,YAAY,IAAI;IAC1C;IAEA,IAAI,gBAAgB;QAChB,OAAO,IAAI,CAAC,SAAS,CAAC,aAAa,IAAIF;IAC3C;IAEA,IAAI,cAAc;QACd,OAAO,IAAI,CAAC,SAAS,CAAC,WAAW;IACrC;IAEA,IAAI,wBAAwB;QACxB,OAAO,IAAI,CAAC,SAAS,CAAC,qBAAqB;IAC/C;IAGA,IAAI,MAAM;QACN,OAAO,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS;IACjD;IAEA,IAAI,kBAAkB;QAClB,OAAO,IAAI,CAAC,SAAS,CAAC,eAAe,EAAE,KAAK,IAAI,CAAC,SAAS;IAC9D;IAEA,IAAI,SAAS;QACT,OAAO,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,KAAK,IAAI,CAAC,SAAS;IACrD;IAEA,IAAI,UAAU;QACV,OAAO,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE,KAAK,IAAI,CAAC,SAAS;IACtD;IAEA,IAAI,UAAU;QACV,OAAO,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE,KAAK,IAAI,CAAC,SAAS;IACtD;IAEA,IAAI,kBAAkB;QAClB,OAAO,IAAI,CAAC,SAAS,CAAC,eAAe,EAAE,KAAK,IAAI,CAAC,SAAS;IAC9D;IAGQ,WAAiB;QACrB,IAAIG,UAAU,IAAI,CAAC,SAAS,CAAC,EAAE,MAAM,IAAI,CAAC,SAAS,CAAC,EAAE,EAAE;YACpD,MAAMC,UAAU,CAAC,SAAS,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC,0EAA0E,CAAC;YACzHC,QAAQ,GAAG,CAACD;YACZ,MAAM,IAAIE,MAAYF;QAC1B;IACJ;IAGO,UAA2B;QAC9B,OAAO,IAAI;IACf;AACJ;AAEO,MAAMG,wBAAwBC,eAAe,eAAe,CAAC;IAChE,WAAWP;IACX,cAAc,EAAE;AACpB"}
1
+ {"version":3,"file":"api/decorators/RunnableTaskDecorator.js","sources":["../../../src/api/decorators/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"],"names":["DEFAULT_MAX_ITERATIONS","RunnableTaskDecoratorImpl","decoratee","camelCase","message","console","WebinyError","RunnableTaskDecorator","TaskDefinition"],"mappings":";;;AAKA,MAAMA,yBAAyB;AAQ/B,MAAMC;IACF,YAAoBC,SAAmC,CAAE;aAArCA,SAAS,GAATA;QAChB,IAAI,CAAC,QAAQ;IACjB;IAGA,IAAI,KAAK;QACL,OAAO,IAAI,CAAC,SAAS,CAAC,EAAE;IAC5B;IAEA,IAAI,QAAQ;QACR,OAAO,IAAI,CAAC,SAAS,CAAC,KAAK;IAC/B;IAEA,IAAI,cAAc;QACd,OAAO,IAAI,CAAC,SAAS,CAAC,WAAW;IACrC;IAGA,IAAI,YAAY;QACZ,OAAO,IAAI,CAAC,SAAS,CAAC,SAAS,IAAI;IACvC;IAEA,IAAI,eAAe;QACf,OAAO,IAAI,CAAC,SAAS,CAAC,YAAY,IAAI;IAC1C;IAEA,IAAI,gBAAgB;QAChB,OAAO,IAAI,CAAC,SAAS,CAAC,aAAa,IAAIF;IAC3C;IAEA,IAAI,cAAc;QACd,OAAO,IAAI,CAAC,SAAS,CAAC,WAAW;IACrC;IAEA,IAAI,wBAAwB;QACxB,OAAO,IAAI,CAAC,SAAS,CAAC,qBAAqB;IAC/C;IAGA,IAAI,MAAM;QACN,OAAO,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS;IACjD;IAEA,IAAI,kBAAkB;QAClB,OAAO,IAAI,CAAC,SAAS,CAAC,eAAe,EAAE,KAAK,IAAI,CAAC,SAAS;IAC9D;IAEA,IAAI,SAAS;QACT,OAAO,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,KAAK,IAAI,CAAC,SAAS;IACrD;IAEA,IAAI,UAAU;QACV,OAAO,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE,KAAK,IAAI,CAAC,SAAS;IACtD;IAEA,IAAI,UAAU;QACV,OAAO,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE,KAAK,IAAI,CAAC,SAAS;IACtD;IAEA,IAAI,kBAAkB;QAClB,OAAO,IAAI,CAAC,SAAS,CAAC,eAAe,EAAE,KAAK,IAAI,CAAC,SAAS;IAC9D;IAGQ,WAAiB;QACrB,IAAIG,UAAU,IAAI,CAAC,SAAS,CAAC,EAAE,MAAM,IAAI,CAAC,SAAS,CAAC,EAAE,EAAE;YACpD,MAAMC,UAAU,CAAC,SAAS,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC,0EAA0E,CAAC;YACzHC,QAAQ,GAAG,CAACD;YACZ,MAAM,IAAIE,MAAYF;QAC1B;IACJ;IAGO,UAA2B;QAC9B,OAAO,IAAI;IACf;AACJ;AAEO,MAAMG,wBAAwBC,eAAe,eAAe,CAAC;IAChE,WAAWP;IACX,cAAc,EAAE;AACpB"}