@webiny/background-tasks 0.0.0-unstable.a4f3e4ea8b → 0.0.0-unstable.eb81deee7e
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/admin/BackgroundTaskRoutes.js +16 -3
- package/admin/BackgroundTaskRoutes.js.map +1 -1
- package/admin/features/listLogs/ListLogsGateway.js +1 -1
- package/admin/features/listLogs/ListLogsGateway.js.map +1 -1
- package/admin/features/permissions/feature.d.ts +1 -1
- package/admin/presentation/BackgroundTaskSettings/BackgroundTaskSettingsPresenter.js +2 -2
- package/admin/presentation/BackgroundTaskSettings/BackgroundTaskSettingsPresenter.js.map +1 -1
- package/admin/presentation/TaskDetail/TaskDetailPresenter.js +1 -1
- package/admin/presentation/TaskDetail/TaskDetailPresenter.js.map +1 -1
- package/admin/presentation/TaskExecutions/TaskExecutionsDataSource.js +1 -1
- package/admin/presentation/TaskExecutions/TaskExecutionsDataSource.js.map +1 -1
- package/api/{features/GetTaskDefinition/feature.d.ts → BackgroundTasksFeature.d.ts} +1 -1
- package/api/BackgroundTasksFeature.js +61 -0
- package/api/BackgroundTasksFeature.js.map +1 -0
- package/api/TasksCrud.d.ts +10 -0
- package/api/TasksCrud.js +5 -0
- package/api/TasksCrud.js.map +1 -0
- package/api/abstractions/Timer.d.ts +1 -0
- package/api/abstractions/Timer.js +0 -0
- package/api/abstractions/index.d.ts +1 -0
- package/api/abstractions/index.js +1 -0
- package/api/crud/TaskLogPrivateModel.js +2 -1
- package/api/crud/TaskLogPrivateModel.js.map +1 -1
- package/api/crud/TaskPrivateModel.js +2 -1
- package/api/crud/TaskPrivateModel.js.map +1 -1
- package/api/crud/cleanupTaskSubtree.d.ts +2 -2
- package/api/crud/cleanupTaskSubtree.js +8 -7
- package/api/crud/cleanupTaskSubtree.js.map +1 -1
- package/api/crud/crud.tasks.d.ts +3 -2
- package/api/crud/crud.tasks.js +46 -44
- package/api/crud/crud.tasks.js.map +1 -1
- package/api/crud/definition.tasks.d.ts +3 -2
- package/api/crud/definition.tasks.js +4 -4
- package/api/crud/definition.tasks.js.map +1 -1
- package/api/crud/service.tasks.d.ts +3 -2
- package/api/crud/service.tasks.js +25 -21
- package/api/crud/service.tasks.js.map +1 -1
- package/api/decorators/{SelfCleaningTaskDecorator.d.ts → SelfCleaningTaskHandlerDecorator.d.ts} +21 -18
- package/api/decorators/SelfCleaningTaskHandlerDecorator.js +69 -0
- package/api/decorators/SelfCleaningTaskHandlerDecorator.js.map +1 -0
- package/api/decorators/TaskDefinitionDefaultsDecorator.d.ts +27 -0
- package/api/decorators/TaskDefinitionDefaultsDecorator.js +47 -0
- package/api/decorators/TaskDefinitionDefaultsDecorator.js.map +1 -0
- package/api/domain/TaskService.d.ts +12 -0
- package/api/domain/TaskService.js +5 -0
- package/api/domain/TaskService.js.map +1 -0
- package/api/features/AbortTask/AbortTaskUseCase.d.ts +2 -3
- package/api/features/AbortTask/AbortTaskUseCase.js +3 -3
- package/api/features/AbortTask/AbortTaskUseCase.js.map +1 -1
- package/api/features/AbortTask/feature.d.ts +1 -2
- package/api/features/AbortTask/feature.js +3 -2
- package/api/features/AbortTask/feature.js.map +1 -1
- package/api/features/CleanupTaskSubtree/CleanupTaskSubtreeUseCase.d.ts +3 -3
- package/api/features/CleanupTaskSubtree/CleanupTaskSubtreeUseCase.js +3 -3
- package/api/features/CleanupTaskSubtree/CleanupTaskSubtreeUseCase.js.map +1 -1
- package/api/features/GetBackgroundTaskSettings/GetBackgroundTaskSettingsRepository.js +7 -4
- package/api/features/GetBackgroundTaskSettings/GetBackgroundTaskSettingsRepository.js.map +1 -1
- package/api/features/GetRunnableTaskDefinition/GetRunnableTaskDefinitionUseCase.d.ts +13 -0
- package/api/features/GetRunnableTaskDefinition/GetRunnableTaskDefinitionUseCase.js +51 -0
- package/api/features/GetRunnableTaskDefinition/GetRunnableTaskDefinitionUseCase.js.map +1 -0
- package/api/features/{GetTaskDefinition → GetRunnableTaskDefinition}/abstractions.d.ts +6 -6
- package/api/features/GetRunnableTaskDefinition/abstractions.js +5 -0
- package/api/features/GetRunnableTaskDefinition/abstractions.js.map +1 -0
- package/api/features/GetRunnableTaskDefinition/feature.d.ts +4 -0
- package/api/features/GetRunnableTaskDefinition/feature.js +11 -0
- package/api/features/GetRunnableTaskDefinition/feature.js.map +1 -0
- package/api/features/GetRunnableTaskDefinition/index.d.ts +2 -0
- package/api/features/GetRunnableTaskDefinition/index.js +2 -0
- package/api/features/GetTask/GetTaskUseCase.d.ts +3 -3
- package/api/features/GetTask/GetTaskUseCase.js +3 -3
- package/api/features/GetTask/GetTaskUseCase.js.map +1 -1
- package/api/features/GetTask/feature.d.ts +1 -2
- package/api/features/GetTask/feature.js +3 -2
- package/api/features/GetTask/feature.js.map +1 -1
- package/api/features/ListTasks/ListTasksUseCase.d.ts +4 -3
- package/api/features/ListTasks/ListTasksUseCase.js +3 -3
- package/api/features/ListTasks/ListTasksUseCase.js.map +1 -1
- package/api/features/ListTasks/feature.d.ts +1 -2
- package/api/features/ListTasks/feature.js +3 -2
- package/api/features/ListTasks/feature.js.map +1 -1
- package/api/features/TaskExecutionContext/TaskExecutionContext.d.ts +3 -3
- package/api/features/TaskExecutionContext/TaskExecutionContext.js.map +1 -1
- package/api/features/TaskExecutionContext/abstractions.d.ts +3 -3
- package/api/features/TaskExecutionContext/abstractions.js.map +1 -1
- package/api/features/TaskHandlerResolver/TaskHandlerResolver.d.ts +12 -0
- package/api/features/TaskHandlerResolver/TaskHandlerResolver.js +19 -0
- package/api/features/TaskHandlerResolver/TaskHandlerResolver.js.map +1 -0
- package/api/features/TaskHandlerResolver/abstractions.d.ts +17 -0
- package/api/features/TaskHandlerResolver/abstractions.js +5 -0
- package/api/features/TaskHandlerResolver/abstractions.js.map +1 -0
- package/api/features/TaskHandlerResolver/feature.d.ts +9 -0
- package/api/features/TaskHandlerResolver/feature.js +11 -0
- package/api/features/TaskHandlerResolver/feature.js.map +1 -0
- package/api/features/TaskHandlerResolver/index.d.ts +2 -0
- package/api/features/TaskHandlerResolver/index.js +2 -0
- package/api/features/TriggerTask/TriggerTaskUseCase.d.ts +2 -3
- package/api/features/TriggerTask/TriggerTaskUseCase.js +3 -3
- package/api/features/TriggerTask/TriggerTaskUseCase.js.map +1 -1
- package/api/features/TriggerTask/feature.d.ts +1 -2
- package/api/features/TriggerTask/feature.js +3 -2
- package/api/features/TriggerTask/feature.js.map +1 -1
- package/api/features/UpdateBackgroundTaskSettings/UpdateBackgroundTaskSettingsRepository.js +6 -3
- package/api/features/UpdateBackgroundTaskSettings/UpdateBackgroundTaskSettingsRepository.js.map +1 -1
- package/api/graphql/BackgroundTasksGraphQLSchema.d.ts +27 -0
- package/api/graphql/BackgroundTasksGraphQLSchema.js +441 -0
- package/api/graphql/BackgroundTasksGraphQLSchema.js.map +1 -0
- package/api/graphql/checkPermissions.js +2 -1
- package/api/graphql/checkPermissions.js.map +1 -1
- package/api/graphql/utils.d.ts +1 -1
- package/api/graphql/utils.js +1 -1
- package/api/graphql/utils.js.map +1 -1
- package/api/handler/types.d.ts +0 -2
- package/api/index.d.ts +10 -3
- package/api/index.js +9 -3
- package/api/response/DatabaseResponse.js +1 -1
- package/api/response/DatabaseResponse.js.map +1 -1
- package/api/runner/TaskControl.d.ts +25 -1
- package/api/runner/TaskControl.js +30 -17
- package/api/runner/TaskControl.js.map +1 -1
- package/api/runner/TaskManager.d.ts +12 -1
- package/api/runner/TaskManager.js +8 -6
- package/api/runner/TaskManager.js.map +1 -1
- package/api/runner/TaskManagerStore.d.ts +10 -2
- package/api/runner/TaskManagerStore.js +5 -3
- package/api/runner/TaskManagerStore.js.map +1 -1
- package/api/runner/TaskRunner.d.ts +3 -3
- package/api/runner/TaskRunner.js +25 -4
- package/api/runner/TaskRunner.js.map +1 -1
- package/api/runner/abstractions/TaskRunner.d.ts +2 -2
- package/api/service/createService.d.ts +3 -3
- package/api/service/createService.js +5 -10
- package/api/service/createService.js.map +1 -1
- package/api/service/index.d.ts +1 -4
- package/api/service/index.js +1 -12
- package/api/tasks/testingRunTask.d.ts +10 -2
- package/api/tasks/testingRunTask.js +10 -3
- package/api/tasks/testingRunTask.js.map +1 -1
- package/api/types.d.ts +2 -2
- package/api/types.js.map +1 -1
- package/package.json +25 -23
- package/testing/index.d.ts +3 -0
- package/testing/index.js +2 -0
- package/testing/mockTaskTriggerTransportPlugin.d.ts +2 -0
- package/testing/mockTaskTriggerTransportPlugin.js +18 -0
- package/testing/mockTaskTriggerTransportPlugin.js.map +1 -0
- package/testing/runner.d.ts +19 -0
- package/testing/runner.js +44 -0
- package/testing/runner.js.map +1 -0
- package/api/context.d.ts +0 -2
- package/api/context.js +0 -66
- package/api/context.js.map +0 -1
- package/api/decorators/RunnableTaskDecorator.d.ts +0 -32
- package/api/decorators/RunnableTaskDecorator.js +0 -69
- package/api/decorators/RunnableTaskDecorator.js.map +0 -1
- package/api/decorators/SelfCleaningTaskDecorator.js +0 -84
- package/api/decorators/SelfCleaningTaskDecorator.js.map +0 -1
- package/api/features/GetTaskDefinition/GetTaskDefinitionUseCase.d.ts +0 -12
- package/api/features/GetTaskDefinition/GetTaskDefinitionUseCase.js +0 -27
- package/api/features/GetTaskDefinition/GetTaskDefinitionUseCase.js.map +0 -1
- package/api/features/GetTaskDefinition/abstractions.js +0 -5
- package/api/features/GetTaskDefinition/abstractions.js.map +0 -1
- package/api/features/GetTaskDefinition/feature.js +0 -11
- package/api/features/GetTaskDefinition/feature.js.map +0 -1
- package/api/features/GetTaskDefinition/index.d.ts +0 -2
- package/api/features/GetTaskDefinition/index.js +0 -2
- package/api/graphql/BackgroundTaskSettingsSchema.d.ts +0 -2
- package/api/graphql/BackgroundTaskSettingsSchema.js +0 -84
- package/api/graphql/BackgroundTaskSettingsSchema.js.map +0 -1
- package/api/graphql/index.d.ts +0 -2
- package/api/graphql/index.js +0 -301
- package/api/graphql/index.js.map +0 -1
- package/api/handler/index.d.ts +0 -6
- package/api/handler/index.js +0 -55
- package/api/handler/index.js.map +0 -1
- package/api/handler/register.d.ts +0 -1
- package/api/handler/register.js +0 -15
- package/api/handler/register.js.map +0 -1
- package/api/plugins/TaskServicePlugin.d.ts +0 -19
- package/api/plugins/TaskServicePlugin.js +0 -13
- package/api/plugins/TaskServicePlugin.js.map +0 -1
- package/api/plugins/index.d.ts +0 -1
- package/api/plugins/index.js +0 -1
- package/api/service/EventBridgeEventTransportPlugin.d.ts +0 -16
- package/api/service/EventBridgeEventTransportPlugin.js +0 -52
- package/api/service/EventBridgeEventTransportPlugin.js.map +0 -1
- package/api/service/StepFunctionServicePlugin.d.ts +0 -25
- package/api/service/StepFunctionServicePlugin.js +0 -77
- package/api/service/StepFunctionServicePlugin.js.map +0 -1
- package/api/service/index.js.map +0 -1
package/api/crud/crud.tasks.js
CHANGED
|
@@ -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/
|
|
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,46 +65,48 @@ const validateTaskInput = async (params)=>{
|
|
|
64
65
|
if (result.success) return;
|
|
65
66
|
throw createZodError(result.error);
|
|
66
67
|
};
|
|
67
|
-
const createTaskCrud = (
|
|
68
|
-
const
|
|
68
|
+
const createTaskCrud = (container)=>{
|
|
69
|
+
const getCmsWhereMapper = ()=>container.resolve(CmsWhereMapper);
|
|
69
70
|
const getTaskModel = async ()=>{
|
|
70
|
-
const identityContext =
|
|
71
|
+
const identityContext = container.resolve(IdentityContext);
|
|
71
72
|
return await identityContext.withoutAuthorization(async ()=>{
|
|
72
|
-
const getModel =
|
|
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 =
|
|
80
|
+
const identityContext = container.resolve(IdentityContext);
|
|
80
81
|
return await identityContext.withoutAuthorization(async ()=>{
|
|
81
|
-
const getModel =
|
|
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
|
|
89
|
-
const
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
return result.value;
|
|
89
|
+
const revisionId = createRevisionId(id);
|
|
90
|
+
const { items } = await listTasks({
|
|
91
|
+
where: {
|
|
92
|
+
id: revisionId
|
|
93
|
+
},
|
|
94
|
+
limit: 1
|
|
95
95
|
});
|
|
96
|
-
|
|
97
|
-
|
|
96
|
+
const task = items[0];
|
|
97
|
+
if (!task) return null;
|
|
98
|
+
const { id: entryId } = parseIdentifier(revisionId);
|
|
99
|
+
if (task.id !== entryId) return null;
|
|
100
|
+
return task;
|
|
98
101
|
};
|
|
99
102
|
const listTasks = async (params)=>{
|
|
100
|
-
const identityContext =
|
|
103
|
+
const identityContext = container.resolve(IdentityContext);
|
|
101
104
|
const { entries, meta } = await identityContext.withoutAuthorization(async ()=>{
|
|
102
105
|
const model = await getTaskModel();
|
|
103
|
-
const listLatestEntries =
|
|
106
|
+
const listLatestEntries = container.resolve(ListLatestEntriesUseCase);
|
|
104
107
|
const result = await listLatestEntries.execute(model, {
|
|
105
108
|
...params,
|
|
106
|
-
where:
|
|
109
|
+
where: getCmsWhereMapper().map({
|
|
107
110
|
input: params?.where,
|
|
108
111
|
fields: model.fields
|
|
109
112
|
})
|
|
@@ -117,22 +120,21 @@ const createTaskCrud = (context)=>{
|
|
|
117
120
|
};
|
|
118
121
|
};
|
|
119
122
|
const createTask = async (data)=>{
|
|
120
|
-
const definition =
|
|
123
|
+
const definition = container.resolve(TasksCrud).getDefinition(data.definitionId);
|
|
121
124
|
if (!definition) throw new TaskDefinitionNotFoundError(data.definitionId);
|
|
122
125
|
await validateTaskInput({
|
|
123
|
-
context,
|
|
124
126
|
definition,
|
|
125
127
|
data
|
|
126
128
|
});
|
|
127
|
-
const identityContext =
|
|
128
|
-
const eventPublisher =
|
|
129
|
+
const identityContext = container.resolve(IdentityContext);
|
|
130
|
+
const eventPublisher = container.resolve(EventPublisher);
|
|
129
131
|
const beforeCreateEvent = new TaskBeforeCreateEvent({
|
|
130
132
|
input: data
|
|
131
133
|
});
|
|
132
134
|
await eventPublisher.publish(beforeCreateEvent);
|
|
133
135
|
const result = await identityContext.withoutAuthorization(async ()=>{
|
|
134
136
|
const model = await getTaskModel();
|
|
135
|
-
const createEntry =
|
|
137
|
+
const createEntry = container.resolve(CreateEntryUseCase);
|
|
136
138
|
return createEntry.execute(model, {
|
|
137
139
|
values: {
|
|
138
140
|
...data,
|
|
@@ -153,8 +155,8 @@ const createTaskCrud = (context)=>{
|
|
|
153
155
|
const updateTask = async (id, data)=>{
|
|
154
156
|
const original = await getTask(id);
|
|
155
157
|
if (!original) throw new TaskNotFoundError();
|
|
156
|
-
const identityContext =
|
|
157
|
-
const eventPublisher =
|
|
158
|
+
const identityContext = container.resolve(IdentityContext);
|
|
159
|
+
const eventPublisher = container.resolve(EventPublisher);
|
|
158
160
|
const beforeUpdateEvent = new TaskBeforeUpdateEvent({
|
|
159
161
|
input: data,
|
|
160
162
|
original
|
|
@@ -162,7 +164,7 @@ const createTaskCrud = (context)=>{
|
|
|
162
164
|
await eventPublisher.publish(beforeUpdateEvent);
|
|
163
165
|
const result = await identityContext.withoutAuthorization(async ()=>{
|
|
164
166
|
const model = await getTaskModel();
|
|
165
|
-
const updateEntry =
|
|
167
|
+
const updateEntry = container.resolve(UpdateEntryUseCase);
|
|
166
168
|
return updateEntry.execute(model, createRevisionId(id), {
|
|
167
169
|
values: {
|
|
168
170
|
...data
|
|
@@ -181,15 +183,15 @@ const createTaskCrud = (context)=>{
|
|
|
181
183
|
const deleteTask = async (id)=>{
|
|
182
184
|
const task = await getTask(id);
|
|
183
185
|
if (!task) throw new TaskNotFoundError();
|
|
184
|
-
const identityContext =
|
|
185
|
-
const eventPublisher =
|
|
186
|
+
const identityContext = container.resolve(IdentityContext);
|
|
187
|
+
const eventPublisher = container.resolve(EventPublisher);
|
|
186
188
|
const beforeDeleteEvent = new TaskBeforeDeleteEvent({
|
|
187
189
|
task
|
|
188
190
|
});
|
|
189
191
|
await eventPublisher.publish(beforeDeleteEvent);
|
|
190
192
|
const result = await identityContext.withoutAuthorization(async ()=>{
|
|
191
193
|
const model = await getTaskModel();
|
|
192
|
-
const deleteEntry =
|
|
194
|
+
const deleteEntry = container.resolve(DeleteEntryUseCase);
|
|
193
195
|
return deleteEntry.execute(model, createRevisionId(id));
|
|
194
196
|
});
|
|
195
197
|
if (result.isFail()) throw new TaskNotFoundError();
|
|
@@ -200,10 +202,10 @@ const createTaskCrud = (context)=>{
|
|
|
200
202
|
return true;
|
|
201
203
|
};
|
|
202
204
|
const createLog = async (task, data)=>{
|
|
203
|
-
const identityContext =
|
|
205
|
+
const identityContext = container.resolve(IdentityContext);
|
|
204
206
|
const result = await identityContext.withoutAuthorization(async ()=>{
|
|
205
207
|
const model = await getLogModel();
|
|
206
|
-
const createEntry =
|
|
208
|
+
const createEntry = container.resolve(CreateEntryUseCase);
|
|
207
209
|
return createEntry.execute(model, {
|
|
208
210
|
values: {
|
|
209
211
|
...data,
|
|
@@ -215,10 +217,10 @@ const createTaskCrud = (context)=>{
|
|
|
215
217
|
return convertToLog(result.value);
|
|
216
218
|
};
|
|
217
219
|
const updateLog = async (id, data)=>{
|
|
218
|
-
const identityContext =
|
|
220
|
+
const identityContext = container.resolve(IdentityContext);
|
|
219
221
|
const result = await identityContext.withoutAuthorization(async ()=>{
|
|
220
222
|
const model = await getLogModel();
|
|
221
|
-
const updateEntry =
|
|
223
|
+
const updateEntry = container.resolve(UpdateEntryUseCase);
|
|
222
224
|
return updateEntry.execute(model, createRevisionId(id), {
|
|
223
225
|
values: data
|
|
224
226
|
});
|
|
@@ -227,21 +229,21 @@ const createTaskCrud = (context)=>{
|
|
|
227
229
|
return convertToLog(result.value);
|
|
228
230
|
};
|
|
229
231
|
const deleteLog = async (id)=>{
|
|
230
|
-
const identityContext =
|
|
232
|
+
const identityContext = container.resolve(IdentityContext);
|
|
231
233
|
const result = await identityContext.withoutAuthorization(async ()=>{
|
|
232
234
|
const model = await getLogModel();
|
|
233
|
-
const deleteEntry =
|
|
235
|
+
const deleteEntry = container.resolve(DeleteEntryUseCase);
|
|
234
236
|
return deleteEntry.execute(model, id);
|
|
235
237
|
});
|
|
236
238
|
if (result.isFail()) throw new TaskLogNotFoundError();
|
|
237
239
|
return true;
|
|
238
240
|
};
|
|
239
241
|
const getLog = async (id)=>{
|
|
240
|
-
const identityContext =
|
|
242
|
+
const identityContext = container.resolve(IdentityContext);
|
|
241
243
|
try {
|
|
242
244
|
const result = await identityContext.withoutAuthorization(async ()=>{
|
|
243
245
|
const model = await getLogModel();
|
|
244
|
-
const getEntryById =
|
|
246
|
+
const getEntryById = container.resolve(GetEntryByIdUseCase);
|
|
245
247
|
return getEntryById.execute(model, id);
|
|
246
248
|
});
|
|
247
249
|
if (result.isFail()) throw result.error;
|
|
@@ -252,10 +254,10 @@ const createTaskCrud = (context)=>{
|
|
|
252
254
|
}
|
|
253
255
|
};
|
|
254
256
|
const getLatestLog = async (taskId)=>{
|
|
255
|
-
const identityContext =
|
|
257
|
+
const identityContext = container.resolve(IdentityContext);
|
|
256
258
|
const entry = await identityContext.withoutAuthorization(async ()=>{
|
|
257
259
|
const model = await getLogModel();
|
|
258
|
-
const listLatestEntries =
|
|
260
|
+
const listLatestEntries = container.resolve(ListLatestEntriesUseCase);
|
|
259
261
|
const result = await listLatestEntries.execute(model, {
|
|
260
262
|
where: {
|
|
261
263
|
values: {
|
|
@@ -275,15 +277,15 @@ const createTaskCrud = (context)=>{
|
|
|
275
277
|
});
|
|
276
278
|
return convertToLog(entry);
|
|
277
279
|
};
|
|
278
|
-
const cleanupTaskSubtree = createCleanupTaskSubtree(
|
|
280
|
+
const cleanupTaskSubtree = createCleanupTaskSubtree(container);
|
|
279
281
|
const listLogs = async (params)=>{
|
|
280
|
-
const identityContext =
|
|
282
|
+
const identityContext = container.resolve(IdentityContext);
|
|
281
283
|
const { entries, meta } = await identityContext.withoutAuthorization(async ()=>{
|
|
282
284
|
const model = await getLogModel();
|
|
283
|
-
const listLatestEntries =
|
|
285
|
+
const listLatestEntries = container.resolve(ListLatestEntriesUseCase);
|
|
284
286
|
const result = await listLatestEntries.execute(model, {
|
|
285
287
|
...params,
|
|
286
|
-
where:
|
|
288
|
+
where: getCmsWhereMapper().map({
|
|
287
289
|
input: params.where,
|
|
288
290
|
fields: model.fields
|
|
289
291
|
})
|
|
@@ -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.Runnable, \"createInputValidation\">;\n data: Pick<ITaskCreateData, \"input\">;\n}\n\nconst getZodSchema = (schema: GenericRecord<string, zod.ZodTypeAny> | zod.ZodTypeAny) => {\n if (!schema) {\n return zod.looseObject({});\n } else if (schema instanceof zod.ZodObject) {\n return schema.loose();\n } else if (schema instanceof zod.ZodType) {\n return schema;\n }\n return zod.looseObject(schema);\n};\n\nconst validateTaskInput = async (params: IValidateParams) => {\n const { definition, data } = params;\n if (!definition.createInputValidation) {\n return;\n }\n const schema = definition.createInputValidation({\n validator: zod\n });\n /**\n * If the schema is not an object, we need to wrap it with the `object` function.\n */\n const validate = getZodSchema(schema);\n\n const result = await validate.safeParseAsync(data.input);\n if (result.success) {\n return;\n }\n throw createZodError(result.error);\n};\n\nexport const createTaskCrud = (container: Container): ITasksContextCrudObject => {\n // Resolved lazily (inside listTasks/listLogs) rather than at build time — the factory is now\n // invoked from BackgroundTasksFeature.register, which may run before CmsWhereMapper is registered.\n const getCmsWhereMapper = () => container.resolve(CmsWhereMapper);\n\n const getTaskModel = async (): Promise<CmsModel> => {\n const identityContext = container.resolve(IdentityContext);\n return await identityContext.withoutAuthorization(async () => {\n const getModel = container.resolve(GetModelUseCase);\n const result = await getModel.execute(WEBINY_TASK_MODEL_ID);\n if (result.isFail()) {\n throw new WebinyError(`There is no model \"${WEBINY_TASK_MODEL_ID}\".`);\n }\n return result.value;\n });\n };\n\n const getLogModel = async (): Promise<CmsModel> => {\n const identityContext = container.resolve(IdentityContext);\n return await identityContext.withoutAuthorization(async () => {\n const getModel = container.resolve(GetModelUseCase);\n const result = await getModel.execute(WEBINY_TASK_LOG_MODEL_ID);\n if (result.isFail()) {\n throw new WebinyError(`There is no model \"${WEBINY_TASK_LOG_MODEL_ID}\".`);\n }\n return result.value;\n });\n };\n\n /*\n * Reads through the same query path `listTasks` uses, rather than fetching the entry by id.\n *\n * This is a workaround, not a design. Fetching a CMS entry by id goes through a DataLoader that\n * is registered in singleton scope, so in Lambda it memoises per warm container and a task\n * written by the background-task function is served stale to the GraphQL function for that\n * container's whole life — `getTask` reported `pending` for a task that had finished seven\n * minutes earlier, and a failed task reported `running` with no error, while `listTasks` was\n * correct throughout. Two readers of one record disagreeing is the bug; routing both through the\n * same reader is what makes them agree.\n *\n * The real fix is per-request scoping of that DataLoader, which is core CMS and affects every\n * entry fetched by id — see the issue filed against @webiny/api-headless-cms-ddb. Remove this\n * and restore the by-id read when that lands, rather than leaving it in place permanently.\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 revisionId = createRevisionId(id);\n const { items } = await listTasks<T, O>({ where: { id: revisionId }, limit: 1 });\n\n const task = items[0];\n if (!task) {\n return null;\n }\n\n /*\n * The filter is on the revision id while a task's own id is the entry id, so the match is\n * confirmed rather than assumed: a where clause that silently stopped filtering would\n * otherwise hand back whichever task happened to be first.\n */\n const { id: entryId } = parseIdentifier(revisionId);\n if (task.id !== entryId) {\n return null;\n }\n\n return task;\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","revisionId","items","listTasks","task","entries","meta","model","listLatestEntries","ListLatestEntriesUseCase","item","createTask","TasksCrud","TaskDefinitionNotFoundError","eventPublisher","EventPublisher","beforeCreateEvent","TaskBeforeCreateEvent","createEntry","CreateEntryUseCase","TaskDataStatus","afterCreateEvent","TaskAfterCreateEvent","updateTask","original","TaskNotFoundError","beforeUpdateEvent","TaskBeforeUpdateEvent","updateEntry","UpdateEntryUseCase","afterUpdateEvent","TaskAfterUpdateEvent","deleteTask","beforeDeleteEvent","TaskBeforeDeleteEvent","deleteEntry","DeleteEntryUseCase","afterDeleteEvent","TaskAfterDeleteEvent","createLog","updateLog","TaskLogNotFoundError","deleteLog","getLog","getEntryById","GetEntryByIdUseCase","ex","NotFoundError","getLatestLog","taskId","cleanupTaskSubtree","createCleanupTaskSubtree","listLogs"],"mappings":"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"}
|
|
@@ -1,2 +1,3 @@
|
|
|
1
|
-
import type {
|
|
2
|
-
|
|
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
|
-
import {
|
|
1
|
+
import { GetRunnableTaskDefinitionUseCase } from "../features/GetRunnableTaskDefinition/index.js";
|
|
2
2
|
import { ListTaskDefinitionsUseCase } from "../features/ListTaskDefinitions/index.js";
|
|
3
|
-
const createDefinitionCrud = (
|
|
3
|
+
const createDefinitionCrud = (container)=>({
|
|
4
4
|
getDefinition: (id)=>{
|
|
5
|
-
const useCase =
|
|
5
|
+
const useCase = container.resolve(GetRunnableTaskDefinitionUseCase);
|
|
6
6
|
const result = useCase.execute(id);
|
|
7
7
|
if (result.isOk()) return result.value;
|
|
8
8
|
return null;
|
|
9
9
|
},
|
|
10
10
|
listDefinitions: ()=>{
|
|
11
|
-
const useCase =
|
|
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 {
|
|
1
|
+
{"version":3,"file":"api/crud/definition.tasks.js","sources":["../../../src/api/crud/definition.tasks.ts"],"sourcesContent":["import type { Container } from \"@webiny/di\";\nimport type { ITasksContextDefinitionObject } from \"~/api/types.js\";\nimport { TaskDefinition } from \"@webiny/api-core/features/task/TaskDefinition/index.js\";\nimport { GetRunnableTaskDefinitionUseCase } from \"~/api/features/GetRunnableTaskDefinition/index.js\";\nimport { ListTaskDefinitionsUseCase } from \"~/api/features/ListTaskDefinitions/index.js\";\n\nexport const createDefinitionCrud = (container: Container): ITasksContextDefinitionObject => {\n return {\n getDefinition: <\n I extends TaskDefinition.TaskInput = TaskDefinition.TaskInput,\n O extends TaskDefinition.TaskOutput = TaskDefinition.TaskOutput\n >(\n id: string\n ) => {\n const useCase = container.resolve(GetRunnableTaskDefinitionUseCase);\n const result = useCase.execute<I, O>(id);\n\n if (result.isOk()) {\n return result.value;\n }\n\n return null;\n },\n listDefinitions: () => {\n const useCase = container.resolve(ListTaskDefinitionsUseCase);\n return useCase.execute();\n }\n };\n};\n"],"names":["createDefinitionCrud","container","id","useCase","GetRunnableTaskDefinitionUseCase","result","ListTaskDefinitionsUseCase"],"mappings":";;AAMO,MAAMA,uBAAuB,CAACC,YAC1B;QACH,eAAe,CAIXC;YAEA,MAAMC,UAAUF,UAAU,OAAO,CAACG;YAClC,MAAMC,SAASF,QAAQ,OAAO,CAAOD;YAErC,IAAIG,OAAO,IAAI,IACX,OAAOA,OAAO,KAAK;YAGvB,OAAO;QACX;QACA,iBAAiB;YACb,MAAMF,UAAUF,UAAU,OAAO,CAACK;YAClC,OAAOH,QAAQ,OAAO;QAC1B;IACJ"}
|
|
@@ -1,2 +1,3 @@
|
|
|
1
|
-
import type {
|
|
2
|
-
|
|
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/
|
|
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 = (
|
|
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 =
|
|
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
|
});
|
|
@@ -32,7 +32,8 @@ const createServiceCrud = (context)=>{
|
|
|
32
32
|
parentId: parent?.id
|
|
33
33
|
};
|
|
34
34
|
if (definition.onBeforeTrigger) await definition.onBeforeTrigger({
|
|
35
|
-
data: input
|
|
35
|
+
data: input,
|
|
36
|
+
definition
|
|
36
37
|
});
|
|
37
38
|
validateDelay({
|
|
38
39
|
input,
|
|
@@ -40,7 +41,7 @@ const createServiceCrud = (context)=>{
|
|
|
40
41
|
});
|
|
41
42
|
let task;
|
|
42
43
|
try {
|
|
43
|
-
task = await
|
|
44
|
+
task = await container.resolve(TasksCrud).createTask(input);
|
|
44
45
|
} catch (ex) {
|
|
45
46
|
console.log("Could not create the task.", ex);
|
|
46
47
|
throw ex;
|
|
@@ -54,16 +55,19 @@ const createServiceCrud = (context)=>{
|
|
|
54
55
|
} catch (ex) {
|
|
55
56
|
console.log("Could not trigger the step function.");
|
|
56
57
|
console.error(ex);
|
|
57
|
-
await
|
|
58
|
+
await container.resolve(TasksCrud).deleteTask(task.id);
|
|
58
59
|
throw ex;
|
|
59
60
|
}
|
|
60
|
-
const updatedTask = await
|
|
61
|
+
const updatedTask = await container.resolve(TasksCrud).updateTask(task.id, {
|
|
61
62
|
eventResponse: result
|
|
62
63
|
});
|
|
63
64
|
return Result.ok(updatedTask);
|
|
64
65
|
},
|
|
65
66
|
fetchServiceInfo: async (input)=>{
|
|
66
|
-
const
|
|
67
|
+
const service = createService({
|
|
68
|
+
container
|
|
69
|
+
});
|
|
70
|
+
const task = "object" == typeof input ? input : await container.resolve(TasksCrud).getTask(input);
|
|
67
71
|
if (task || "string" != typeof input) {
|
|
68
72
|
if (!task) throw new error("Task was not found!", "TASK_FETCH_ERROR", {
|
|
69
73
|
input
|
|
@@ -80,9 +84,9 @@ const createServiceCrud = (context)=>{
|
|
|
80
84
|
}
|
|
81
85
|
},
|
|
82
86
|
abort: async (params)=>{
|
|
83
|
-
const task = await
|
|
87
|
+
const task = await container.resolve(TasksCrud).getTask(params.id);
|
|
84
88
|
if (!task) return Result.fail(new TaskNotFoundError());
|
|
85
|
-
const definition =
|
|
89
|
+
const definition = container.resolve(TasksCrud).getDefinition(task.definitionId);
|
|
86
90
|
if (!definition) return Result.fail(new TaskDefinitionNotFoundError(task.definitionId));
|
|
87
91
|
if (false === [
|
|
88
92
|
TaskDataStatus.PENDING,
|
|
@@ -93,17 +97,17 @@ const createServiceCrud = (context)=>{
|
|
|
93
97
|
}));
|
|
94
98
|
let taskLog = null;
|
|
95
99
|
try {
|
|
96
|
-
taskLog = await
|
|
100
|
+
taskLog = await container.resolve(TasksCrud).getLatestLog(task.id);
|
|
97
101
|
} catch {}
|
|
98
|
-
if (!taskLog) taskLog = await
|
|
102
|
+
if (!taskLog) taskLog = await container.resolve(TasksCrud).createLog(task, {
|
|
99
103
|
iteration: 1,
|
|
100
104
|
executionName: task.executionName
|
|
101
105
|
});
|
|
102
106
|
try {
|
|
103
|
-
const updatedTask = await
|
|
107
|
+
const updatedTask = await container.resolve(TasksCrud).updateTask(task.id, {
|
|
104
108
|
taskStatus: TaskDataStatus.ABORTED
|
|
105
109
|
});
|
|
106
|
-
await
|
|
110
|
+
await container.resolve(TasksCrud).updateLog(taskLog.id, {
|
|
107
111
|
items: taskLog.items.concat([
|
|
108
112
|
{
|
|
109
113
|
message: params.message || "Task aborted.",
|
|
@@ -113,7 +117,8 @@ const createServiceCrud = (context)=>{
|
|
|
113
117
|
])
|
|
114
118
|
});
|
|
115
119
|
if (definition.onAbort) await definition.onAbort({
|
|
116
|
-
task: updatedTask
|
|
120
|
+
task: updatedTask,
|
|
121
|
+
definition
|
|
117
122
|
});
|
|
118
123
|
return Result.ok(updatedTask);
|
|
119
124
|
} catch (ex) {
|
|
@@ -123,8 +128,7 @@ const createServiceCrud = (context)=>{
|
|
|
123
128
|
});
|
|
124
129
|
}
|
|
125
130
|
}
|
|
126
|
-
};
|
|
127
|
-
};
|
|
131
|
+
});
|
|
128
132
|
export { createServiceCrud };
|
|
129
133
|
|
|
130
134
|
//# 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, definition });\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 definition\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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"}
|