@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.
Files changed (189) hide show
  1. package/admin/BackgroundTaskRoutes.js +16 -3
  2. package/admin/BackgroundTaskRoutes.js.map +1 -1
  3. package/admin/features/listLogs/ListLogsGateway.js +1 -1
  4. package/admin/features/listLogs/ListLogsGateway.js.map +1 -1
  5. package/admin/features/permissions/feature.d.ts +1 -1
  6. package/admin/presentation/BackgroundTaskSettings/BackgroundTaskSettingsPresenter.js +2 -2
  7. package/admin/presentation/BackgroundTaskSettings/BackgroundTaskSettingsPresenter.js.map +1 -1
  8. package/admin/presentation/TaskDetail/TaskDetailPresenter.js +1 -1
  9. package/admin/presentation/TaskDetail/TaskDetailPresenter.js.map +1 -1
  10. package/admin/presentation/TaskExecutions/TaskExecutionsDataSource.js +1 -1
  11. package/admin/presentation/TaskExecutions/TaskExecutionsDataSource.js.map +1 -1
  12. package/api/{features/GetTaskDefinition/feature.d.ts → BackgroundTasksFeature.d.ts} +1 -1
  13. package/api/BackgroundTasksFeature.js +61 -0
  14. package/api/BackgroundTasksFeature.js.map +1 -0
  15. package/api/TasksCrud.d.ts +10 -0
  16. package/api/TasksCrud.js +5 -0
  17. package/api/TasksCrud.js.map +1 -0
  18. package/api/abstractions/Timer.d.ts +1 -0
  19. package/api/abstractions/Timer.js +0 -0
  20. package/api/abstractions/index.d.ts +1 -0
  21. package/api/abstractions/index.js +1 -0
  22. package/api/crud/TaskLogPrivateModel.js +2 -1
  23. package/api/crud/TaskLogPrivateModel.js.map +1 -1
  24. package/api/crud/TaskPrivateModel.js +2 -1
  25. package/api/crud/TaskPrivateModel.js.map +1 -1
  26. package/api/crud/cleanupTaskSubtree.d.ts +2 -2
  27. package/api/crud/cleanupTaskSubtree.js +8 -7
  28. package/api/crud/cleanupTaskSubtree.js.map +1 -1
  29. package/api/crud/crud.tasks.d.ts +3 -2
  30. package/api/crud/crud.tasks.js +46 -44
  31. package/api/crud/crud.tasks.js.map +1 -1
  32. package/api/crud/definition.tasks.d.ts +3 -2
  33. package/api/crud/definition.tasks.js +4 -4
  34. package/api/crud/definition.tasks.js.map +1 -1
  35. package/api/crud/service.tasks.d.ts +3 -2
  36. package/api/crud/service.tasks.js +25 -21
  37. package/api/crud/service.tasks.js.map +1 -1
  38. package/api/decorators/{SelfCleaningTaskDecorator.d.ts → SelfCleaningTaskHandlerDecorator.d.ts} +21 -18
  39. package/api/decorators/SelfCleaningTaskHandlerDecorator.js +69 -0
  40. package/api/decorators/SelfCleaningTaskHandlerDecorator.js.map +1 -0
  41. package/api/decorators/TaskDefinitionDefaultsDecorator.d.ts +27 -0
  42. package/api/decorators/TaskDefinitionDefaultsDecorator.js +47 -0
  43. package/api/decorators/TaskDefinitionDefaultsDecorator.js.map +1 -0
  44. package/api/domain/TaskService.d.ts +12 -0
  45. package/api/domain/TaskService.js +5 -0
  46. package/api/domain/TaskService.js.map +1 -0
  47. package/api/features/AbortTask/AbortTaskUseCase.d.ts +2 -3
  48. package/api/features/AbortTask/AbortTaskUseCase.js +3 -3
  49. package/api/features/AbortTask/AbortTaskUseCase.js.map +1 -1
  50. package/api/features/AbortTask/feature.d.ts +1 -2
  51. package/api/features/AbortTask/feature.js +3 -2
  52. package/api/features/AbortTask/feature.js.map +1 -1
  53. package/api/features/CleanupTaskSubtree/CleanupTaskSubtreeUseCase.d.ts +3 -3
  54. package/api/features/CleanupTaskSubtree/CleanupTaskSubtreeUseCase.js +3 -3
  55. package/api/features/CleanupTaskSubtree/CleanupTaskSubtreeUseCase.js.map +1 -1
  56. package/api/features/GetBackgroundTaskSettings/GetBackgroundTaskSettingsRepository.js +7 -4
  57. package/api/features/GetBackgroundTaskSettings/GetBackgroundTaskSettingsRepository.js.map +1 -1
  58. package/api/features/GetRunnableTaskDefinition/GetRunnableTaskDefinitionUseCase.d.ts +13 -0
  59. package/api/features/GetRunnableTaskDefinition/GetRunnableTaskDefinitionUseCase.js +51 -0
  60. package/api/features/GetRunnableTaskDefinition/GetRunnableTaskDefinitionUseCase.js.map +1 -0
  61. package/api/features/{GetTaskDefinition → GetRunnableTaskDefinition}/abstractions.d.ts +6 -6
  62. package/api/features/GetRunnableTaskDefinition/abstractions.js +5 -0
  63. package/api/features/GetRunnableTaskDefinition/abstractions.js.map +1 -0
  64. package/api/features/GetRunnableTaskDefinition/feature.d.ts +4 -0
  65. package/api/features/GetRunnableTaskDefinition/feature.js +11 -0
  66. package/api/features/GetRunnableTaskDefinition/feature.js.map +1 -0
  67. package/api/features/GetRunnableTaskDefinition/index.d.ts +2 -0
  68. package/api/features/GetRunnableTaskDefinition/index.js +2 -0
  69. package/api/features/GetTask/GetTaskUseCase.d.ts +3 -3
  70. package/api/features/GetTask/GetTaskUseCase.js +3 -3
  71. package/api/features/GetTask/GetTaskUseCase.js.map +1 -1
  72. package/api/features/GetTask/feature.d.ts +1 -2
  73. package/api/features/GetTask/feature.js +3 -2
  74. package/api/features/GetTask/feature.js.map +1 -1
  75. package/api/features/ListTasks/ListTasksUseCase.d.ts +4 -3
  76. package/api/features/ListTasks/ListTasksUseCase.js +3 -3
  77. package/api/features/ListTasks/ListTasksUseCase.js.map +1 -1
  78. package/api/features/ListTasks/feature.d.ts +1 -2
  79. package/api/features/ListTasks/feature.js +3 -2
  80. package/api/features/ListTasks/feature.js.map +1 -1
  81. package/api/features/TaskExecutionContext/TaskExecutionContext.d.ts +3 -3
  82. package/api/features/TaskExecutionContext/TaskExecutionContext.js.map +1 -1
  83. package/api/features/TaskExecutionContext/abstractions.d.ts +3 -3
  84. package/api/features/TaskExecutionContext/abstractions.js.map +1 -1
  85. package/api/features/TaskHandlerResolver/TaskHandlerResolver.d.ts +12 -0
  86. package/api/features/TaskHandlerResolver/TaskHandlerResolver.js +19 -0
  87. package/api/features/TaskHandlerResolver/TaskHandlerResolver.js.map +1 -0
  88. package/api/features/TaskHandlerResolver/abstractions.d.ts +17 -0
  89. package/api/features/TaskHandlerResolver/abstractions.js +5 -0
  90. package/api/features/TaskHandlerResolver/abstractions.js.map +1 -0
  91. package/api/features/TaskHandlerResolver/feature.d.ts +9 -0
  92. package/api/features/TaskHandlerResolver/feature.js +11 -0
  93. package/api/features/TaskHandlerResolver/feature.js.map +1 -0
  94. package/api/features/TaskHandlerResolver/index.d.ts +2 -0
  95. package/api/features/TaskHandlerResolver/index.js +2 -0
  96. package/api/features/TriggerTask/TriggerTaskUseCase.d.ts +2 -3
  97. package/api/features/TriggerTask/TriggerTaskUseCase.js +3 -3
  98. package/api/features/TriggerTask/TriggerTaskUseCase.js.map +1 -1
  99. package/api/features/TriggerTask/feature.d.ts +1 -2
  100. package/api/features/TriggerTask/feature.js +3 -2
  101. package/api/features/TriggerTask/feature.js.map +1 -1
  102. package/api/features/UpdateBackgroundTaskSettings/UpdateBackgroundTaskSettingsRepository.js +6 -3
  103. package/api/features/UpdateBackgroundTaskSettings/UpdateBackgroundTaskSettingsRepository.js.map +1 -1
  104. package/api/graphql/BackgroundTasksGraphQLSchema.d.ts +27 -0
  105. package/api/graphql/BackgroundTasksGraphQLSchema.js +441 -0
  106. package/api/graphql/BackgroundTasksGraphQLSchema.js.map +1 -0
  107. package/api/graphql/checkPermissions.js +2 -1
  108. package/api/graphql/checkPermissions.js.map +1 -1
  109. package/api/graphql/utils.d.ts +1 -1
  110. package/api/graphql/utils.js +1 -1
  111. package/api/graphql/utils.js.map +1 -1
  112. package/api/handler/types.d.ts +0 -2
  113. package/api/index.d.ts +10 -3
  114. package/api/index.js +9 -3
  115. package/api/response/DatabaseResponse.js +1 -1
  116. package/api/response/DatabaseResponse.js.map +1 -1
  117. package/api/runner/TaskControl.d.ts +25 -1
  118. package/api/runner/TaskControl.js +30 -17
  119. package/api/runner/TaskControl.js.map +1 -1
  120. package/api/runner/TaskManager.d.ts +12 -1
  121. package/api/runner/TaskManager.js +8 -6
  122. package/api/runner/TaskManager.js.map +1 -1
  123. package/api/runner/TaskManagerStore.d.ts +10 -2
  124. package/api/runner/TaskManagerStore.js +5 -3
  125. package/api/runner/TaskManagerStore.js.map +1 -1
  126. package/api/runner/TaskRunner.d.ts +3 -3
  127. package/api/runner/TaskRunner.js +25 -4
  128. package/api/runner/TaskRunner.js.map +1 -1
  129. package/api/runner/abstractions/TaskRunner.d.ts +2 -2
  130. package/api/service/createService.d.ts +3 -3
  131. package/api/service/createService.js +5 -10
  132. package/api/service/createService.js.map +1 -1
  133. package/api/service/index.d.ts +1 -4
  134. package/api/service/index.js +1 -12
  135. package/api/tasks/testingRunTask.d.ts +10 -2
  136. package/api/tasks/testingRunTask.js +10 -3
  137. package/api/tasks/testingRunTask.js.map +1 -1
  138. package/api/types.d.ts +2 -2
  139. package/api/types.js.map +1 -1
  140. package/package.json +25 -23
  141. package/testing/index.d.ts +3 -0
  142. package/testing/index.js +2 -0
  143. package/testing/mockTaskTriggerTransportPlugin.d.ts +2 -0
  144. package/testing/mockTaskTriggerTransportPlugin.js +18 -0
  145. package/testing/mockTaskTriggerTransportPlugin.js.map +1 -0
  146. package/testing/runner.d.ts +19 -0
  147. package/testing/runner.js +44 -0
  148. package/testing/runner.js.map +1 -0
  149. package/api/context.d.ts +0 -2
  150. package/api/context.js +0 -66
  151. package/api/context.js.map +0 -1
  152. package/api/decorators/RunnableTaskDecorator.d.ts +0 -32
  153. package/api/decorators/RunnableTaskDecorator.js +0 -69
  154. package/api/decorators/RunnableTaskDecorator.js.map +0 -1
  155. package/api/decorators/SelfCleaningTaskDecorator.js +0 -84
  156. package/api/decorators/SelfCleaningTaskDecorator.js.map +0 -1
  157. package/api/features/GetTaskDefinition/GetTaskDefinitionUseCase.d.ts +0 -12
  158. package/api/features/GetTaskDefinition/GetTaskDefinitionUseCase.js +0 -27
  159. package/api/features/GetTaskDefinition/GetTaskDefinitionUseCase.js.map +0 -1
  160. package/api/features/GetTaskDefinition/abstractions.js +0 -5
  161. package/api/features/GetTaskDefinition/abstractions.js.map +0 -1
  162. package/api/features/GetTaskDefinition/feature.js +0 -11
  163. package/api/features/GetTaskDefinition/feature.js.map +0 -1
  164. package/api/features/GetTaskDefinition/index.d.ts +0 -2
  165. package/api/features/GetTaskDefinition/index.js +0 -2
  166. package/api/graphql/BackgroundTaskSettingsSchema.d.ts +0 -2
  167. package/api/graphql/BackgroundTaskSettingsSchema.js +0 -84
  168. package/api/graphql/BackgroundTaskSettingsSchema.js.map +0 -1
  169. package/api/graphql/index.d.ts +0 -2
  170. package/api/graphql/index.js +0 -301
  171. package/api/graphql/index.js.map +0 -1
  172. package/api/handler/index.d.ts +0 -6
  173. package/api/handler/index.js +0 -55
  174. package/api/handler/index.js.map +0 -1
  175. package/api/handler/register.d.ts +0 -1
  176. package/api/handler/register.js +0 -15
  177. package/api/handler/register.js.map +0 -1
  178. package/api/plugins/TaskServicePlugin.d.ts +0 -19
  179. package/api/plugins/TaskServicePlugin.js +0 -13
  180. package/api/plugins/TaskServicePlugin.js.map +0 -1
  181. package/api/plugins/index.d.ts +0 -1
  182. package/api/plugins/index.js +0 -1
  183. package/api/service/EventBridgeEventTransportPlugin.d.ts +0 -16
  184. package/api/service/EventBridgeEventTransportPlugin.js +0 -52
  185. package/api/service/EventBridgeEventTransportPlugin.js.map +0 -1
  186. package/api/service/StepFunctionServicePlugin.d.ts +0 -25
  187. package/api/service/StepFunctionServicePlugin.js +0 -77
  188. package/api/service/StepFunctionServicePlugin.js.map +0 -1
  189. package/api/service/index.js.map +0 -1
@@ -0,0 +1,441 @@
1
+ import { GraphQLSchemaFactory } from "@webiny/api-graphql/graphql/abstractions.js";
2
+ import { createModelSchemaKey } from "@webiny/api-headless-cms/utils/createModelSchemaKey.js";
3
+ import { renderSortEnum } from "@webiny/api-headless-cms/utils/renderSortEnum.js";
4
+ import { renderListFilterFields } from "@webiny/api-headless-cms/utils/renderListFilterFields.js";
5
+ import { renderFields } from "@webiny/api-headless-cms/utils/renderFields.js";
6
+ import { TenantContext } from "@webiny/api-core/features/tenancy/TenantContext/abstractions.js";
7
+ import { IdentityContext } from "@webiny/api-core/features/security/IdentityContext/abstractions.js";
8
+ import { ListModelsUseCase } from "@webiny/api-headless-cms/features/contentModel/ListModels/index.js";
9
+ import { CmsModelFieldToGraphQLRegistry } from "@webiny/api-headless-cms/exports/api/cms/graphql.js";
10
+ import { TasksCrud } from "../TasksCrud.js";
11
+ import { ListTaskDefinitionsUseCase } from "../features/ListTaskDefinitions/abstractions.js";
12
+ import { TriggerTaskUseCase } from "../features/TriggerTask/abstractions.js";
13
+ import { AbortTaskUseCase } from "../features/AbortTask/abstractions.js";
14
+ import { GetBackgroundTaskSettingsRepository } from "../features/GetBackgroundTaskSettings/abstractions.js";
15
+ import { UpdateBackgroundTaskSettingsUseCase } from "../features/UpdateBackgroundTaskSettings/abstractions.js";
16
+ import { emptyResolver, resolve, resolveList } from "./utils.js";
17
+ import { checkPermissions } from "./checkPermissions.js";
18
+ function addQueryResolvers(builder) {
19
+ builder.addResolver({
20
+ path: "Query.backgroundTasks",
21
+ resolver: ()=>emptyResolver
22
+ });
23
+ builder.addResolver({
24
+ path: "WebinyBackgroundTaskQuery.getTask",
25
+ dependencies: [
26
+ TasksCrud
27
+ ],
28
+ resolver: (tasksCrud)=>({ args, context })=>resolve(async ()=>{
29
+ await checkPermissions(context, {
30
+ rwd: "r"
31
+ });
32
+ return await tasksCrud.getTask(args.id);
33
+ })
34
+ });
35
+ builder.addResolver({
36
+ path: "WebinyBackgroundTaskQuery.listTasks",
37
+ dependencies: [
38
+ TasksCrud
39
+ ],
40
+ resolver: (tasksCrud)=>({ args, context })=>resolveList(async ()=>{
41
+ await checkPermissions(context, {
42
+ rwd: "r"
43
+ });
44
+ return await tasksCrud.listTasks(args);
45
+ })
46
+ });
47
+ builder.addResolver({
48
+ path: "WebinyBackgroundTaskQuery.listDefinitions",
49
+ dependencies: [
50
+ ListTaskDefinitionsUseCase
51
+ ],
52
+ resolver: (listTaskDefinitions)=>({ context })=>resolve(async ()=>{
53
+ await checkPermissions(context, {
54
+ rwd: "r"
55
+ });
56
+ return listTaskDefinitions.execute().filter((item)=>!item.isPrivate);
57
+ })
58
+ });
59
+ builder.addResolver({
60
+ path: "WebinyBackgroundTaskQuery.listLogs",
61
+ dependencies: [
62
+ TasksCrud
63
+ ],
64
+ resolver: (tasksCrud)=>({ args, context })=>resolveList(async ()=>{
65
+ await checkPermissions(context, {
66
+ rwd: "r"
67
+ });
68
+ return await tasksCrud.listLogs(args);
69
+ })
70
+ });
71
+ builder.addResolver({
72
+ path: "WebinyBackgroundTaskQuery.getSettings",
73
+ dependencies: [
74
+ GetBackgroundTaskSettingsRepository
75
+ ],
76
+ resolver: (repository)=>({ context })=>resolve(async ()=>{
77
+ await checkPermissions(context, {
78
+ rwd: "r"
79
+ });
80
+ const result = await repository.execute();
81
+ if (result.isFail()) throw result.error;
82
+ return result.value;
83
+ })
84
+ });
85
+ }
86
+ function addMutationResolvers(builder) {
87
+ builder.addResolver({
88
+ path: "Mutation.backgroundTasks",
89
+ resolver: ()=>emptyResolver
90
+ });
91
+ builder.addResolver({
92
+ path: "WebinyBackgroundTaskMutation.abortTask",
93
+ dependencies: [
94
+ AbortTaskUseCase
95
+ ],
96
+ resolver: (abortTask)=>async ({ args, context })=>{
97
+ await checkPermissions(context, {
98
+ rwd: "w"
99
+ });
100
+ return resolve(async ()=>{
101
+ const result = await abortTask.execute(args);
102
+ if (result.isOk()) return result.value;
103
+ throw result.error;
104
+ });
105
+ }
106
+ });
107
+ builder.addResolver({
108
+ path: "WebinyBackgroundTaskMutation.triggerTask",
109
+ dependencies: [
110
+ TriggerTaskUseCase
111
+ ],
112
+ resolver: (triggerTask)=>async ({ args, context })=>{
113
+ await checkPermissions(context, {
114
+ rwd: "w"
115
+ });
116
+ return resolve(async ()=>{
117
+ const result = await triggerTask.execute(args);
118
+ if (result.isOk()) return result.value;
119
+ throw result.error;
120
+ });
121
+ }
122
+ });
123
+ builder.addResolver({
124
+ path: "WebinyBackgroundTaskMutation.deleteTask",
125
+ dependencies: [
126
+ TasksCrud
127
+ ],
128
+ resolver: (tasksCrud)=>async ({ args, context })=>{
129
+ await checkPermissions(context, {
130
+ rwd: "d"
131
+ });
132
+ return resolve(async ()=>await tasksCrud.deleteTask(args.id));
133
+ }
134
+ });
135
+ builder.addResolver({
136
+ path: "WebinyBackgroundTaskMutation.updateSettings",
137
+ dependencies: [
138
+ UpdateBackgroundTaskSettingsUseCase
139
+ ],
140
+ resolver: (updateSettings)=>({ args })=>resolve(async ()=>{
141
+ const result = await updateSettings.execute(args.input);
142
+ if (result.isFail()) throw result.error;
143
+ return result.value;
144
+ })
145
+ });
146
+ }
147
+ function addFieldResolvers(builder) {
148
+ builder.addResolver({
149
+ path: "WebinyBackgroundTask.logs",
150
+ dependencies: [
151
+ TasksCrud
152
+ ],
153
+ resolver: (tasksCrud)=>async ({ parent, args })=>{
154
+ const { items } = await tasksCrud.listLogs({
155
+ sort: [
156
+ "createdBy_ASC"
157
+ ],
158
+ limit: 10000,
159
+ ...args,
160
+ where: {
161
+ ...args?.where,
162
+ task: parent.id
163
+ }
164
+ });
165
+ return items;
166
+ }
167
+ });
168
+ builder.addResolver({
169
+ path: "WebinyBackgroundTaskLog.task",
170
+ dependencies: [
171
+ TasksCrud
172
+ ],
173
+ resolver: (tasksCrud)=>async ({ parent })=>await tasksCrud.getTask(parent.task)
174
+ });
175
+ }
176
+ class BackgroundTasksGraphQLSchemaImpl {
177
+ constructor(tenantContext, identityContext, tasksCrud, listModelsUseCase, fieldRegistry){
178
+ this.tenantContext = tenantContext;
179
+ this.identityContext = identityContext;
180
+ this.tasksCrud = tasksCrud;
181
+ this.listModelsUseCase = listModelsUseCase;
182
+ this.fieldRegistry = fieldRegistry;
183
+ }
184
+ async getSchemaKey() {
185
+ if (!this.tenantContext.getTenant()) return "BackgroundTasks:no-tenant";
186
+ const { taskModel, logModel, models } = await this.loadInputs();
187
+ const modelKey = createModelSchemaKey([
188
+ taskModel,
189
+ logModel
190
+ ], models);
191
+ return `BackgroundTasks:${modelKey}`;
192
+ }
193
+ async execute(builder) {
194
+ if (!this.tenantContext.getTenant()) return builder;
195
+ const typeDefs = await this.createTypeDefs();
196
+ builder.addTypeDefs(typeDefs);
197
+ addQueryResolvers(builder);
198
+ addMutationResolvers(builder);
199
+ addFieldResolvers(builder);
200
+ return builder;
201
+ }
202
+ async loadInputs() {
203
+ const taskModel = await this.tasksCrud.getTaskModel();
204
+ const logModel = await this.tasksCrud.getLogModel();
205
+ const models = await this.identityContext.withoutAuthorization(async ()=>{
206
+ const modelsResult = await this.listModelsUseCase.execute({
207
+ includePrivate: false
208
+ });
209
+ return modelsResult.value.filter((model)=>model.fields.length > 0);
210
+ });
211
+ return {
212
+ taskModel,
213
+ logModel,
214
+ models
215
+ };
216
+ }
217
+ async createTypeDefs() {
218
+ const { taskModel, logModel, models } = await this.loadInputs();
219
+ const fieldRegistry = this.fieldRegistry;
220
+ const taskFields = renderFields({
221
+ models,
222
+ model: taskModel,
223
+ fields: taskModel.fields,
224
+ type: "manage",
225
+ fieldRegistry
226
+ });
227
+ const logFields = renderFields({
228
+ models,
229
+ model: logModel,
230
+ fields: logModel.fields.filter((field)=>"task" !== field.fieldId),
231
+ type: "manage",
232
+ fieldRegistry
233
+ });
234
+ const listTasksFilterFieldsRender = renderListFilterFields({
235
+ model: taskModel,
236
+ fields: taskModel.fields,
237
+ type: "manage",
238
+ fieldRegistry,
239
+ excludeFields: [
240
+ "entryId"
241
+ ]
242
+ });
243
+ const listLogsFilterFieldsRender = renderListFilterFields({
244
+ model: logModel,
245
+ fields: logModel.fields,
246
+ type: "manage",
247
+ fieldRegistry,
248
+ excludeFields: [
249
+ "entryId"
250
+ ]
251
+ });
252
+ const sortTasksEnumRender = renderSortEnum({
253
+ model: taskModel,
254
+ fields: taskModel.fields,
255
+ fieldRegistry,
256
+ sorters: []
257
+ });
258
+ const sortLogsEnumRender = renderSortEnum({
259
+ model: logModel,
260
+ fields: logModel.fields,
261
+ fieldRegistry,
262
+ sorters: []
263
+ });
264
+ return `
265
+ type WebinyBackgroundTaskError {
266
+ message: String
267
+ code: String
268
+ data: JSON
269
+ stack: String
270
+ }
271
+
272
+ ${taskFields.map((f)=>f.typeDefs).join("\n")}
273
+ ${logFields.map((f)=>f.typeDefs).join("\n")}
274
+
275
+ type WebinyBackgroundTask {
276
+ id: String!
277
+ createdOn: DateTime!
278
+ savedOn: DateTime
279
+ createdBy: WebinyBackgroundTaskIdentity!
280
+ logs(
281
+ where: WebinyBackgroundTaskLogListWhereInput
282
+ limit: Number
283
+ sort: [WebinyBackgroundTaskLogListSorter!]
284
+ ): [WebinyBackgroundTaskLog!]!
285
+ ${taskFields.map((f)=>f.fields).join("\n")}
286
+ }
287
+
288
+ type WebinyBackgroundTaskResponse {
289
+ data: WebinyBackgroundTask
290
+ error: WebinyBackgroundTaskError
291
+ }
292
+
293
+ type WebinyBackgroundTaskMeta {
294
+ cursor: String
295
+ hasMoreItems: Boolean!
296
+ totalCount: Int!
297
+ }
298
+
299
+ type WebinyBackgroundTaskListResponse {
300
+ data: [WebinyBackgroundTask!]
301
+ meta: WebinyBackgroundTaskMeta
302
+ error: WebinyBackgroundTaskError
303
+ }
304
+
305
+ type WebinyBackgroundTaskLog {
306
+ id: String!
307
+ createdOn: DateTime!
308
+ createdBy: WebinyBackgroundTaskIdentity!
309
+ task: WebinyBackgroundTask!
310
+ ${logFields.map((f)=>f.fields).join("\n")}
311
+ }
312
+
313
+ type WebinyBackgroundTaskLogListResponse {
314
+ data: [WebinyBackgroundTaskLog!]
315
+ meta: WebinyBackgroundTaskMeta
316
+ error: WebinyBackgroundTaskError
317
+ }
318
+
319
+ type WebinyBackgroundTaskDefinition {
320
+ id: String!
321
+ title: String!
322
+ description: String
323
+ }
324
+
325
+ type WebinyBackgroundTaskListDefinitionsResponse {
326
+ data: [WebinyBackgroundTaskDefinition!]
327
+ error: WebinyBackgroundTaskError
328
+ }
329
+
330
+ type WebinyBackgroundTaskIdentity {
331
+ id: String!
332
+ displayName: String!
333
+ type: String
334
+ }
335
+
336
+ type WebinyBackgroundTaskTriggerResponse {
337
+ data: WebinyBackgroundTask
338
+ error: WebinyBackgroundTaskError
339
+ }
340
+
341
+ type WebinyBackgroundTaskDeleteResponse {
342
+ data: Boolean
343
+ error: WebinyBackgroundTaskError
344
+ }
345
+
346
+ input WebinyBackgroundTaskListWhereInput {
347
+ ${listTasksFilterFieldsRender.allFiltersAsString() || "_empty: String"}
348
+ }
349
+
350
+ input WebinyBackgroundTaskLogListWhereInput {
351
+ ${listLogsFilterFieldsRender.allFiltersAsString() || "_empty: String"}
352
+ }
353
+
354
+ enum WebinyBackgroundTaskListSorter {
355
+ ${sortTasksEnumRender}
356
+ }
357
+
358
+ enum WebinyBackgroundTaskLogListSorter {
359
+ ${sortLogsEnumRender}
360
+ }
361
+
362
+ type WebinyBackgroundTaskQuery {
363
+ _empty: String
364
+ }
365
+
366
+ type WebinyBackgroundTaskMutation {
367
+ _empty: String
368
+ }
369
+
370
+ extend type Query {
371
+ backgroundTasks: WebinyBackgroundTaskQuery
372
+ }
373
+
374
+ extend type Mutation {
375
+ backgroundTasks: WebinyBackgroundTaskMutation
376
+ }
377
+
378
+ extend type WebinyBackgroundTaskQuery {
379
+ getTask(id: ID!): WebinyBackgroundTaskResponse!
380
+ listTasks(
381
+ where: WebinyBackgroundTaskListWhereInput
382
+ sort: [WebinyBackgroundTaskListSorter!]
383
+ limit: Int
384
+ after: String
385
+ search: String
386
+ ): WebinyBackgroundTaskListResponse!
387
+ listDefinitions: WebinyBackgroundTaskListDefinitionsResponse!
388
+
389
+ listLogs(
390
+ where: WebinyBackgroundTaskLogListWhereInput
391
+ sort: [WebinyBackgroundTaskLogListSorter!]
392
+ limit: Int
393
+ after: String
394
+ search: String
395
+ ): WebinyBackgroundTaskLogListResponse!
396
+ }
397
+
398
+ extend type WebinyBackgroundTaskMutation {
399
+ triggerTask(definition: String!, input: JSON, name: String, delay: Number): WebinyBackgroundTaskTriggerResponse!
400
+ abortTask(id: ID!, message: String): WebinyBackgroundTaskResponse!
401
+ deleteTask(id: ID!): WebinyBackgroundTaskDeleteResponse!
402
+ }
403
+
404
+ type WebinyBackgroundTaskSettings {
405
+ retentionDays: Int
406
+ }
407
+
408
+ type WebinyBackgroundTaskSettingsResponse {
409
+ data: WebinyBackgroundTaskSettings
410
+ error: WebinyBackgroundTaskError
411
+ }
412
+
413
+ input UpdateBackgroundTaskSettingsInput {
414
+ retentionDays: Int
415
+ }
416
+
417
+ extend type WebinyBackgroundTaskQuery {
418
+ getSettings: WebinyBackgroundTaskSettingsResponse
419
+ }
420
+
421
+ extend type WebinyBackgroundTaskMutation {
422
+ updateSettings(
423
+ input: UpdateBackgroundTaskSettingsInput!
424
+ ): WebinyBackgroundTaskSettingsResponse
425
+ }
426
+ `;
427
+ }
428
+ }
429
+ const BackgroundTasksGraphQLSchema = GraphQLSchemaFactory.createImplementation({
430
+ implementation: BackgroundTasksGraphQLSchemaImpl,
431
+ dependencies: [
432
+ TenantContext,
433
+ IdentityContext,
434
+ TasksCrud,
435
+ ListModelsUseCase,
436
+ CmsModelFieldToGraphQLRegistry
437
+ ]
438
+ });
439
+ export { BackgroundTasksGraphQLSchema };
440
+
441
+ //# sourceMappingURL=BackgroundTasksGraphQLSchema.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"api/graphql/BackgroundTasksGraphQLSchema.js","sources":["../../../src/api/graphql/BackgroundTasksGraphQLSchema.ts"],"sourcesContent":["import { GraphQLSchemaFactory } from \"@webiny/api-graphql/graphql/abstractions.js\";\nimport { createModelSchemaKey } from \"@webiny/api-headless-cms/utils/createModelSchemaKey.js\";\nimport { renderSortEnum } from \"@webiny/api-headless-cms/utils/renderSortEnum.js\";\nimport { renderListFilterFields } from \"@webiny/api-headless-cms/utils/renderListFilterFields.js\";\nimport { renderFields } from \"@webiny/api-headless-cms/utils/renderFields.js\";\nimport { TenantContext } from \"@webiny/api-core/features/tenancy/TenantContext/abstractions.js\";\nimport { IdentityContext } from \"@webiny/api-core/features/security/IdentityContext/abstractions.js\";\nimport { ListModelsUseCase } from \"@webiny/api-headless-cms/features/contentModel/ListModels/index.js\";\nimport { CmsModelFieldToGraphQLRegistry } from \"@webiny/api-headless-cms/exports/api/cms/graphql.js\";\nimport type { Context, IListTaskLogParams, IListTaskParams, ITask, ITaskLog } from \"~/api/types.js\";\nimport { TasksCrud } from \"~/api/TasksCrud.js\";\nimport { ListTaskDefinitionsUseCase } from \"~/api/features/ListTaskDefinitions/abstractions.js\";\nimport { TriggerTaskUseCase } from \"~/api/features/TriggerTask/abstractions.js\";\nimport { AbortTaskUseCase } from \"~/api/features/AbortTask/abstractions.js\";\nimport { GetBackgroundTaskSettingsRepository } from \"~/api/features/GetBackgroundTaskSettings/abstractions.js\";\nimport { UpdateBackgroundTaskSettingsUseCase } from \"~/api/features/UpdateBackgroundTaskSettings/abstractions.js\";\nimport type { IUpdateBackgroundTaskSettingsInput } from \"~/api/features/UpdateBackgroundTaskSettings/abstractions.js\";\nimport { emptyResolver, resolve, resolveList } from \"./utils.js\";\nimport { checkPermissions } from \"./checkPermissions.js\";\n\ninterface IGetTaskQueryParams {\n id: string;\n}\n\ninterface IAbortTaskMutationParams {\n id: string;\n message?: string;\n}\n\ninterface ITriggerTaskMutationParams {\n name?: string;\n definition: string;\n input?: Record<string, any>;\n delay?: number;\n}\n\ninterface IDeleteTaskMutationParams {\n id: string;\n}\n\ninterface IUpdateSettingsArgs {\n input: IUpdateBackgroundTaskSettingsInput;\n}\n\ninterface IResolverParams<TArgs = unknown, TParent = unknown> {\n parent: TParent;\n args: TArgs;\n context: Context;\n}\n\nfunction addQueryResolvers(builder: GraphQLSchemaFactory.SchemaBuilder): void {\n builder.addResolver({\n path: \"Query.backgroundTasks\",\n resolver: () => emptyResolver\n });\n\n builder.addResolver({\n path: \"WebinyBackgroundTaskQuery.getTask\",\n dependencies: [TasksCrud],\n resolver: (tasksCrud: TasksCrud.Interface) => {\n return ({ args, context }: IResolverParams<IGetTaskQueryParams>) => {\n return resolve(async () => {\n await checkPermissions(context, { rwd: \"r\" });\n return await tasksCrud.getTask(args.id);\n });\n };\n }\n });\n\n builder.addResolver({\n path: \"WebinyBackgroundTaskQuery.listTasks\",\n dependencies: [TasksCrud],\n resolver: (tasksCrud: TasksCrud.Interface) => {\n return ({ args, context }: IResolverParams<IListTaskParams>) => {\n return resolveList(async () => {\n await checkPermissions(context, { rwd: \"r\" });\n return await tasksCrud.listTasks(args);\n });\n };\n }\n });\n\n builder.addResolver({\n path: \"WebinyBackgroundTaskQuery.listDefinitions\",\n dependencies: [ListTaskDefinitionsUseCase],\n resolver: (listTaskDefinitions: ListTaskDefinitionsUseCase.Interface) => {\n return ({ context }: IResolverParams) => {\n return resolve(async () => {\n await checkPermissions(context, { rwd: \"r\" });\n // Do not output private tasks.\n return listTaskDefinitions.execute().filter(item => {\n return !item.isPrivate;\n });\n });\n };\n }\n });\n\n builder.addResolver({\n path: \"WebinyBackgroundTaskQuery.listLogs\",\n dependencies: [TasksCrud],\n resolver: (tasksCrud: TasksCrud.Interface) => {\n return ({ args, context }: IResolverParams<IListTaskLogParams>) => {\n return resolveList(async () => {\n await checkPermissions(context, { rwd: \"r\" });\n return await tasksCrud.listLogs(args);\n });\n };\n }\n });\n\n builder.addResolver({\n path: \"WebinyBackgroundTaskQuery.getSettings\",\n dependencies: [GetBackgroundTaskSettingsRepository],\n resolver: (repository: GetBackgroundTaskSettingsRepository.Interface) => {\n return ({ context }: IResolverParams) => {\n return resolve(async () => {\n await checkPermissions(context, { rwd: \"r\" });\n const result = await repository.execute();\n if (result.isFail()) {\n throw result.error;\n }\n return result.value;\n });\n };\n }\n });\n}\n\nfunction addMutationResolvers(builder: GraphQLSchemaFactory.SchemaBuilder): void {\n builder.addResolver({\n path: \"Mutation.backgroundTasks\",\n resolver: () => emptyResolver\n });\n\n builder.addResolver({\n path: \"WebinyBackgroundTaskMutation.abortTask\",\n dependencies: [AbortTaskUseCase],\n resolver: (abortTask: AbortTaskUseCase.Interface) => {\n return async ({ args, context }: IResolverParams<IAbortTaskMutationParams>) => {\n await checkPermissions(context, { rwd: \"w\" });\n return resolve<ITask>(async () => {\n const result = await abortTask.execute(args);\n if (result.isOk()) {\n return result.value;\n }\n\n throw result.error;\n });\n };\n }\n });\n\n builder.addResolver({\n path: \"WebinyBackgroundTaskMutation.triggerTask\",\n dependencies: [TriggerTaskUseCase],\n resolver: (triggerTask: TriggerTaskUseCase.Interface) => {\n return async ({ args, context }: IResolverParams<ITriggerTaskMutationParams>) => {\n await checkPermissions(context, { rwd: \"w\" });\n return resolve<ITask>(async () => {\n const result = await triggerTask.execute(args);\n if (result.isOk()) {\n return result.value;\n }\n\n throw result.error;\n });\n };\n }\n });\n\n builder.addResolver({\n path: \"WebinyBackgroundTaskMutation.deleteTask\",\n dependencies: [TasksCrud],\n resolver: (tasksCrud: TasksCrud.Interface) => {\n return async ({ args, context }: IResolverParams<IDeleteTaskMutationParams>) => {\n await checkPermissions(context, { rwd: \"d\" });\n return resolve(async () => {\n return await tasksCrud.deleteTask(args.id);\n });\n };\n }\n });\n\n builder.addResolver({\n path: \"WebinyBackgroundTaskMutation.updateSettings\",\n dependencies: [UpdateBackgroundTaskSettingsUseCase],\n resolver: (updateSettings: UpdateBackgroundTaskSettingsUseCase.Interface) => {\n return ({ args }: IResolverParams<IUpdateSettingsArgs>) => {\n return resolve(async () => {\n const result = await updateSettings.execute(args.input);\n if (result.isFail()) {\n throw result.error;\n }\n return result.value;\n });\n };\n }\n });\n}\n\nfunction addFieldResolvers(builder: GraphQLSchemaFactory.SchemaBuilder): void {\n builder.addResolver({\n path: \"WebinyBackgroundTask.logs\",\n dependencies: [TasksCrud],\n resolver: (tasksCrud: TasksCrud.Interface) => {\n return async ({ parent, args }: IResolverParams<IListTaskLogParams, ITask>) => {\n const { items } = await tasksCrud.listLogs({\n sort: [\"createdBy_ASC\"],\n limit: 10000,\n ...args,\n where: {\n ...args?.where,\n task: parent.id\n }\n });\n return items;\n };\n }\n });\n\n builder.addResolver({\n path: \"WebinyBackgroundTaskLog.task\",\n dependencies: [TasksCrud],\n resolver: (tasksCrud: TasksCrud.Interface) => {\n return async ({ parent }: IResolverParams<unknown, ITaskLog>) => {\n return await tasksCrud.getTask(parent.task);\n };\n }\n });\n}\n\n/**\n * The background-tasks GraphQL schema. Its shape depends on the CMS task/log content models, which\n * are loaded when the schema is composed. The settings schema lives here too, because it extends\n * the task schema's `WebinyBackgroundTaskQuery`/`Mutation` types.\n */\nclass BackgroundTasksGraphQLSchemaImpl implements GraphQLSchemaFactory.Interface {\n public constructor(\n private readonly tenantContext: TenantContext.Interface,\n private readonly identityContext: IdentityContext.Interface,\n private readonly tasksCrud: TasksCrud.Interface,\n private readonly listModelsUseCase: ListModelsUseCase.Interface,\n private readonly fieldRegistry: CmsModelFieldToGraphQLRegistry.Interface\n ) {}\n\n public async getSchemaKey(): Promise<string> {\n if (!this.tenantContext.getTenant()) {\n return \"BackgroundTasks:no-tenant\";\n }\n\n const { taskModel, logModel, models } = await this.loadInputs();\n const modelKey = createModelSchemaKey([taskModel, logModel], models);\n return `BackgroundTasks:${modelKey}`;\n }\n\n public async execute(\n builder: GraphQLSchemaFactory.SchemaBuilder\n ): Promise<GraphQLSchemaFactory.SchemaBuilder> {\n if (!this.tenantContext.getTenant()) {\n return builder;\n }\n\n const typeDefs = await this.createTypeDefs();\n\n builder.addTypeDefs(typeDefs);\n addQueryResolvers(builder);\n addMutationResolvers(builder);\n addFieldResolvers(builder);\n\n return builder;\n }\n\n private async loadInputs() {\n const taskModel = await this.tasksCrud.getTaskModel();\n const logModel = await this.tasksCrud.getLogModel();\n\n const models = await this.identityContext.withoutAuthorization(async () => {\n const modelsResult = await this.listModelsUseCase.execute({ includePrivate: false });\n return modelsResult.value.filter(model => model.fields.length > 0);\n });\n\n return { taskModel, logModel, models };\n }\n\n private async createTypeDefs(): Promise<string> {\n const { taskModel, logModel, models } = await this.loadInputs();\n const fieldRegistry = this.fieldRegistry;\n\n const taskFields = renderFields({\n models,\n model: taskModel,\n fields: taskModel.fields,\n type: \"manage\",\n fieldRegistry\n });\n\n const logFields = renderFields({\n models,\n model: logModel,\n fields: logModel.fields.filter(field => field.fieldId !== \"task\"),\n type: \"manage\",\n fieldRegistry\n });\n\n const listTasksFilterFieldsRender = renderListFilterFields({\n model: taskModel,\n fields: taskModel.fields,\n type: \"manage\",\n fieldRegistry,\n excludeFields: [\"entryId\"]\n });\n\n const listLogsFilterFieldsRender = renderListFilterFields({\n model: logModel,\n fields: logModel.fields,\n type: \"manage\",\n fieldRegistry,\n excludeFields: [\"entryId\"]\n });\n\n const sortTasksEnumRender = renderSortEnum({\n model: taskModel,\n fields: taskModel.fields,\n fieldRegistry,\n sorters: []\n });\n\n const sortLogsEnumRender = renderSortEnum({\n model: logModel,\n fields: logModel.fields,\n fieldRegistry,\n sorters: []\n });\n\n return /* GraphQL */ `\n type WebinyBackgroundTaskError {\n message: String\n code: String\n data: JSON\n stack: String\n }\n\n ${taskFields.map(f => f.typeDefs).join(\"\\n\")}\n ${logFields.map(f => f.typeDefs).join(\"\\n\")}\n\n type WebinyBackgroundTask {\n id: String!\n createdOn: DateTime!\n savedOn: DateTime\n createdBy: WebinyBackgroundTaskIdentity!\n logs(\n where: WebinyBackgroundTaskLogListWhereInput\n limit: Number\n sort: [WebinyBackgroundTaskLogListSorter!]\n ): [WebinyBackgroundTaskLog!]!\n ${taskFields.map(f => f.fields).join(\"\\n\")}\n }\n\n type WebinyBackgroundTaskResponse {\n data: WebinyBackgroundTask\n error: WebinyBackgroundTaskError\n }\n\n type WebinyBackgroundTaskMeta {\n cursor: String\n hasMoreItems: Boolean!\n totalCount: Int!\n }\n\n type WebinyBackgroundTaskListResponse {\n data: [WebinyBackgroundTask!]\n meta: WebinyBackgroundTaskMeta\n error: WebinyBackgroundTaskError\n }\n\n type WebinyBackgroundTaskLog {\n id: String!\n createdOn: DateTime!\n createdBy: WebinyBackgroundTaskIdentity!\n task: WebinyBackgroundTask!\n ${logFields.map(f => f.fields).join(\"\\n\")}\n }\n\n type WebinyBackgroundTaskLogListResponse {\n data: [WebinyBackgroundTaskLog!]\n meta: WebinyBackgroundTaskMeta\n error: WebinyBackgroundTaskError\n }\n\n type WebinyBackgroundTaskDefinition {\n id: String!\n title: String!\n description: String\n }\n\n type WebinyBackgroundTaskListDefinitionsResponse {\n data: [WebinyBackgroundTaskDefinition!]\n error: WebinyBackgroundTaskError\n }\n\n type WebinyBackgroundTaskIdentity {\n id: String!\n displayName: String!\n type: String\n }\n\n type WebinyBackgroundTaskTriggerResponse {\n data: WebinyBackgroundTask\n error: WebinyBackgroundTaskError\n }\n\n type WebinyBackgroundTaskDeleteResponse {\n data: Boolean\n error: WebinyBackgroundTaskError\n }\n\n input WebinyBackgroundTaskListWhereInput {\n ${listTasksFilterFieldsRender.allFiltersAsString() || \"_empty: String\"}\n }\n\n input WebinyBackgroundTaskLogListWhereInput {\n ${listLogsFilterFieldsRender.allFiltersAsString() || \"_empty: String\"}\n }\n\n enum WebinyBackgroundTaskListSorter {\n ${sortTasksEnumRender}\n }\n\n enum WebinyBackgroundTaskLogListSorter {\n ${sortLogsEnumRender}\n }\n\n type WebinyBackgroundTaskQuery {\n _empty: String\n }\n\n type WebinyBackgroundTaskMutation {\n _empty: String\n }\n\n extend type Query {\n backgroundTasks: WebinyBackgroundTaskQuery\n }\n\n extend type Mutation {\n backgroundTasks: WebinyBackgroundTaskMutation\n }\n\n extend type WebinyBackgroundTaskQuery {\n getTask(id: ID!): WebinyBackgroundTaskResponse!\n listTasks(\n where: WebinyBackgroundTaskListWhereInput\n sort: [WebinyBackgroundTaskListSorter!]\n limit: Int\n after: String\n search: String\n ): WebinyBackgroundTaskListResponse!\n listDefinitions: WebinyBackgroundTaskListDefinitionsResponse!\n\n listLogs(\n where: WebinyBackgroundTaskLogListWhereInput\n sort: [WebinyBackgroundTaskLogListSorter!]\n limit: Int\n after: String\n search: String\n ): WebinyBackgroundTaskLogListResponse!\n }\n\n extend type WebinyBackgroundTaskMutation {\n triggerTask(definition: String!, input: JSON, name: String, delay: Number): WebinyBackgroundTaskTriggerResponse!\n abortTask(id: ID!, message: String): WebinyBackgroundTaskResponse!\n deleteTask(id: ID!): WebinyBackgroundTaskDeleteResponse!\n }\n\n type WebinyBackgroundTaskSettings {\n retentionDays: Int\n }\n\n type WebinyBackgroundTaskSettingsResponse {\n data: WebinyBackgroundTaskSettings\n error: WebinyBackgroundTaskError\n }\n\n input UpdateBackgroundTaskSettingsInput {\n retentionDays: Int\n }\n\n extend type WebinyBackgroundTaskQuery {\n getSettings: WebinyBackgroundTaskSettingsResponse\n }\n\n extend type WebinyBackgroundTaskMutation {\n updateSettings(\n input: UpdateBackgroundTaskSettingsInput!\n ): WebinyBackgroundTaskSettingsResponse\n }\n `;\n }\n}\n\nexport const BackgroundTasksGraphQLSchema = GraphQLSchemaFactory.createImplementation({\n implementation: BackgroundTasksGraphQLSchemaImpl,\n dependencies: [\n TenantContext,\n IdentityContext,\n TasksCrud,\n ListModelsUseCase,\n CmsModelFieldToGraphQLRegistry\n ]\n});\n"],"names":["addQueryResolvers","builder","emptyResolver","TasksCrud","tasksCrud","args","context","resolve","checkPermissions","resolveList","ListTaskDefinitionsUseCase","listTaskDefinitions","item","GetBackgroundTaskSettingsRepository","repository","result","addMutationResolvers","AbortTaskUseCase","abortTask","TriggerTaskUseCase","triggerTask","UpdateBackgroundTaskSettingsUseCase","updateSettings","addFieldResolvers","parent","items","BackgroundTasksGraphQLSchemaImpl","tenantContext","identityContext","listModelsUseCase","fieldRegistry","taskModel","logModel","models","modelKey","createModelSchemaKey","typeDefs","modelsResult","model","taskFields","renderFields","logFields","field","listTasksFilterFieldsRender","renderListFilterFields","listLogsFilterFieldsRender","sortTasksEnumRender","renderSortEnum","sortLogsEnumRender","f","BackgroundTasksGraphQLSchema","GraphQLSchemaFactory","TenantContext","IdentityContext","ListModelsUseCase","CmsModelFieldToGraphQLRegistry"],"mappings":"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"}
@@ -1,6 +1,7 @@
1
+ import { IdentityContext } from "@webiny/api-core/features/security/IdentityContext/abstractions.js";
1
2
  import { NotAuthorizedError } from "@webiny/api-core/features/security/shared/index.js";
2
3
  const checkPermissions = async (context, check = {})=>{
3
- const taskPermissions = await context.security.getPermissions("tasks");
4
+ const taskPermissions = await context.container.resolve(IdentityContext).getPermissions("tasks");
4
5
  const relevant = taskPermissions.filter((current)=>{
5
6
  if (check.rwd && !hasRwd(current, check.rwd)) return false;
6
7
  return true;
@@ -1 +1 @@
1
- {"version":3,"file":"api/graphql/checkPermissions.js","sources":["../../../src/api/graphql/checkPermissions.ts"],"sourcesContent":["import type { Context, TaskPermission } from \"~/api/types.js\";\nimport { NotAuthorizedError } from \"@webiny/api-core/features/security/shared/index.js\";\n\n/**\n * @throws\n */\nexport const checkPermissions = async (\n context: Context,\n check: { rwd?: string } = {}\n): Promise<void> => {\n const taskPermissions = await context.security.getPermissions<TaskPermission>(\"tasks\");\n\n const relevant = taskPermissions.filter(current => {\n if (check.rwd && !hasRwd(current, check.rwd)) {\n return false;\n }\n\n return true;\n });\n\n if (relevant.length === 0) {\n throw new NotAuthorizedError();\n }\n};\n\nconst hasRwd = (permissions: TaskPermission | TaskPermission[], rwd: string): boolean => {\n if (!Array.isArray(permissions)) {\n permissions = [permissions];\n }\n\n if (!rwd) {\n return true;\n }\n\n // Is there a permission that doesn't restrict RWD permissions, that means all RWD permissions are allowed.\n const permissionWithoutRwdRestrictions = permissions.some(permission => {\n return typeof permission.rwd !== \"string\";\n });\n\n if (permissionWithoutRwdRestrictions) {\n return true;\n }\n\n // If there is no permission that doesn't restrict RWD permissions, that means we need to check if the RWD.\n return permissions.some(permission => {\n return permission.rwd && permission.rwd.includes(rwd);\n });\n};\n"],"names":["checkPermissions","context","check","taskPermissions","relevant","current","hasRwd","NotAuthorizedError","permissions","rwd","Array","permissionWithoutRwdRestrictions","permission"],"mappings":";AAMO,MAAMA,mBAAmB,OAC5BC,SACAC,QAA0B,CAAC,CAAC;IAE5B,MAAMC,kBAAkB,MAAMF,QAAQ,QAAQ,CAAC,cAAc,CAAiB;IAE9E,MAAMG,WAAWD,gBAAgB,MAAM,CAACE,CAAAA;QACpC,IAAIH,MAAM,GAAG,IAAI,CAACI,OAAOD,SAASH,MAAM,GAAG,GACvC,OAAO;QAGX,OAAO;IACX;IAEA,IAAIE,AAAoB,MAApBA,SAAS,MAAM,EACf,MAAM,IAAIG;AAElB;AAEA,MAAMD,SAAS,CAACE,aAAgDC;IAC5D,IAAI,CAACC,MAAM,OAAO,CAACF,cACfA,cAAc;QAACA;KAAY;IAG/B,IAAI,CAACC,KACD,OAAO;IAIX,MAAME,mCAAmCH,YAAY,IAAI,CAACI,CAAAA,aAC/C,AAA0B,YAA1B,OAAOA,WAAW,GAAG;IAGhC,IAAID,kCACA,OAAO;IAIX,OAAOH,YAAY,IAAI,CAACI,CAAAA,aACbA,WAAW,GAAG,IAAIA,WAAW,GAAG,CAAC,QAAQ,CAACH;AAEzD"}
1
+ {"version":3,"file":"api/graphql/checkPermissions.js","sources":["../../../src/api/graphql/checkPermissions.ts"],"sourcesContent":["import type { Context, TaskPermission } from \"~/api/types.js\";\nimport { IdentityContext } from \"@webiny/api-core/features/security/IdentityContext/abstractions.js\";\nimport { NotAuthorizedError } from \"@webiny/api-core/features/security/shared/index.js\";\n\n/**\n * @throws\n */\nexport const checkPermissions = async (\n context: Context,\n check: { rwd?: string } = {}\n): Promise<void> => {\n const taskPermissions = await context.container\n .resolve(IdentityContext)\n .getPermissions<TaskPermission>(\"tasks\");\n\n const relevant = taskPermissions.filter(current => {\n if (check.rwd && !hasRwd(current, check.rwd)) {\n return false;\n }\n\n return true;\n });\n\n if (relevant.length === 0) {\n throw new NotAuthorizedError();\n }\n};\n\nconst hasRwd = (permissions: TaskPermission | TaskPermission[], rwd: string): boolean => {\n if (!Array.isArray(permissions)) {\n permissions = [permissions];\n }\n\n if (!rwd) {\n return true;\n }\n\n // Is there a permission that doesn't restrict RWD permissions, that means all RWD permissions are allowed.\n const permissionWithoutRwdRestrictions = permissions.some(permission => {\n return typeof permission.rwd !== \"string\";\n });\n\n if (permissionWithoutRwdRestrictions) {\n return true;\n }\n\n // If there is no permission that doesn't restrict RWD permissions, that means we need to check if the RWD.\n return permissions.some(permission => {\n return permission.rwd && permission.rwd.includes(rwd);\n });\n};\n"],"names":["checkPermissions","context","check","taskPermissions","IdentityContext","relevant","current","hasRwd","NotAuthorizedError","permissions","rwd","Array","permissionWithoutRwdRestrictions","permission"],"mappings":";;AAOO,MAAMA,mBAAmB,OAC5BC,SACAC,QAA0B,CAAC,CAAC;IAE5B,MAAMC,kBAAkB,MAAMF,QAAQ,SAAS,CAC1C,OAAO,CAACG,iBACR,cAAc,CAAiB;IAEpC,MAAMC,WAAWF,gBAAgB,MAAM,CAACG,CAAAA;QACpC,IAAIJ,MAAM,GAAG,IAAI,CAACK,OAAOD,SAASJ,MAAM,GAAG,GACvC,OAAO;QAGX,OAAO;IACX;IAEA,IAAIG,AAAoB,MAApBA,SAAS,MAAM,EACf,MAAM,IAAIG;AAElB;AAEA,MAAMD,SAAS,CAACE,aAAgDC;IAC5D,IAAI,CAACC,MAAM,OAAO,CAACF,cACfA,cAAc;QAACA;KAAY;IAG/B,IAAI,CAACC,KACD,OAAO;IAIX,MAAME,mCAAmCH,YAAY,IAAI,CAACI,CAAAA,aAC/C,AAA0B,YAA1B,OAAOA,WAAW,GAAG;IAGhC,IAAID,kCACA,OAAO;IAIX,OAAOH,YAAY,IAAI,CAACI,CAAAA,aACbA,WAAW,GAAG,IAAIA,WAAW,GAAG,CAAC,QAAQ,CAACH;AAEzD"}
@@ -1,4 +1,4 @@
1
- import { ErrorResponse, ListErrorResponse, ListResponse, Response } from "@webiny/handler-graphql";
1
+ import { ErrorResponse, ListErrorResponse, ListResponse, Response } from "@webiny/api-graphql";
2
2
  import type { CmsEntryMeta } from "@webiny/api-headless-cms/types/index.js";
3
3
  export declare const emptyResolver: () => {};
4
4
  interface ResolveCallable<T = any> {
@@ -1,4 +1,4 @@
1
- import { ErrorResponse, ListErrorResponse, ListResponse, Response } from "@webiny/handler-graphql";
1
+ import { ErrorResponse, ListErrorResponse, ListResponse, Response } from "@webiny/api-graphql";
2
2
  const emptyResolver = ()=>({});
3
3
  const resolve = async (fn)=>{
4
4
  try {
@@ -1 +1 @@
1
- {"version":3,"file":"api/graphql/utils.js","sources":["../../../src/api/graphql/utils.ts"],"sourcesContent":["import { ErrorResponse, ListErrorResponse, ListResponse, Response } from \"@webiny/handler-graphql\";\nimport type { CmsEntryMeta } from \"@webiny/api-headless-cms/types/index.js\";\n\nexport const emptyResolver = () => ({});\n\ninterface ResolveCallable<T = any> {\n (): Promise<T>;\n}\n\nexport const resolve = async <T = any>(fn: ResolveCallable<T>) => {\n try {\n return new Response(await fn());\n } catch (ex) {\n return new ErrorResponse(ex);\n }\n};\n\ninterface IListResult {\n items: any[];\n meta: CmsEntryMeta;\n}\n\nexport const resolveList = async (fn: ResolveCallable) => {\n try {\n const result = (await fn()) as IListResult;\n return new ListResponse(result.items, result.meta);\n } catch (ex) {\n return new ListErrorResponse(ex);\n }\n};\n"],"names":["emptyResolver","resolve","fn","Response","ex","ErrorResponse","resolveList","result","ListResponse","ListErrorResponse"],"mappings":";AAGO,MAAMA,gBAAgB,IAAO,EAAC;AAM9B,MAAMC,UAAU,OAAgBC;IACnC,IAAI;QACA,OAAO,IAAIC,SAAS,MAAMD;IAC9B,EAAE,OAAOE,IAAI;QACT,OAAO,IAAIC,cAAcD;IAC7B;AACJ;AAOO,MAAME,cAAc,OAAOJ;IAC9B,IAAI;QACA,MAAMK,SAAU,MAAML;QACtB,OAAO,IAAIM,aAAaD,OAAO,KAAK,EAAEA,OAAO,IAAI;IACrD,EAAE,OAAOH,IAAI;QACT,OAAO,IAAIK,kBAAkBL;IACjC;AACJ"}
1
+ {"version":3,"file":"api/graphql/utils.js","sources":["../../../src/api/graphql/utils.ts"],"sourcesContent":["import { ErrorResponse, ListErrorResponse, ListResponse, Response } from \"@webiny/api-graphql\";\nimport type { CmsEntryMeta } from \"@webiny/api-headless-cms/types/index.js\";\n\nexport const emptyResolver = () => ({});\n\ninterface ResolveCallable<T = any> {\n (): Promise<T>;\n}\n\nexport const resolve = async <T = any>(fn: ResolveCallable<T>) => {\n try {\n return new Response(await fn());\n } catch (ex) {\n return new ErrorResponse(ex);\n }\n};\n\ninterface IListResult {\n items: any[];\n meta: CmsEntryMeta;\n}\n\nexport const resolveList = async (fn: ResolveCallable) => {\n try {\n const result = (await fn()) as IListResult;\n return new ListResponse(result.items, result.meta);\n } catch (ex) {\n return new ListErrorResponse(ex);\n }\n};\n"],"names":["emptyResolver","resolve","fn","Response","ex","ErrorResponse","resolveList","result","ListResponse","ListErrorResponse"],"mappings":";AAGO,MAAMA,gBAAgB,IAAO,EAAC;AAM9B,MAAMC,UAAU,OAAgBC;IACnC,IAAI;QACA,OAAO,IAAIC,SAAS,MAAMD;IAC9B,EAAE,OAAOE,IAAI;QACT,OAAO,IAAIC,cAAcD;IAC7B;AACJ;AAOO,MAAME,cAAc,OAAOJ;IAC9B,IAAI;QACA,MAAMK,SAAU,MAAML;QACtB,OAAO,IAAIM,aAAaD,OAAO,KAAK,EAAEA,OAAO,IAAI;IACrD,EAAE,OAAOH,IAAI;QACT,OAAO,IAAIK,kBAAkBL;IACjC;AACJ"}
@@ -1,5 +1,3 @@
1
- import type { HandlerFactoryParams } from "@webiny/handler-aws/types.js";
2
- export type HandlerParams = HandlerFactoryParams;
3
1
  export interface IIncomingEvent<TEvent> {
4
2
  name: string;
5
3
  payload: TEvent;
package/api/index.d.ts CHANGED
@@ -1,5 +1,12 @@
1
- import "./handler/register.js";
2
- export { createBackgroundTaskGraphQL } from "./graphql/index.js";
3
- export { createBackgroundTaskContext } from "./context.js";
1
+ export type { Timer } from "./abstractions/Timer.js";
2
+ export { TaskService } from "./domain/TaskService.js";
4
3
  export * from "./response/index.js";
5
4
  export * from "./types.js";
5
+ export { BackgroundTasksFeature } from "./BackgroundTasksFeature.js";
6
+ export { BackgroundTasksGraphQLSchema } from "./graphql/BackgroundTasksGraphQLSchema.js";
7
+ export { TasksCrud } from "./TasksCrud.js";
8
+ export { TriggerTaskUseCase } from "./features/TriggerTask/abstractions.js";
9
+ export { AbortTaskUseCase } from "./features/AbortTask/abstractions.js";
10
+ export { GetTaskUseCase } from "./features/GetTask/abstractions.js";
11
+ export { ListTasksUseCase } from "./features/ListTasks/abstractions.js";
12
+ export { CleanupTaskSubtreeUseCase } from "./features/CleanupTaskSubtree/abstractions.js";
package/api/index.js CHANGED
@@ -1,5 +1,11 @@
1
- import "./handler/register.js";
2
1
  export * from "./response/index.js";
3
2
  export * from "./types.js";
4
- export { createBackgroundTaskGraphQL } from "./graphql/index.js";
5
- export { createBackgroundTaskContext } from "./context.js";
3
+ export { TaskService } from "./domain/TaskService.js";
4
+ export { BackgroundTasksFeature } from "./BackgroundTasksFeature.js";
5
+ export { BackgroundTasksGraphQLSchema } from "./graphql/BackgroundTasksGraphQLSchema.js";
6
+ export { TasksCrud } from "./TasksCrud.js";
7
+ export { TriggerTaskUseCase } from "./features/TriggerTask/abstractions.js";
8
+ export { AbortTaskUseCase } from "./features/AbortTask/abstractions.js";
9
+ export { GetTaskUseCase } from "./features/GetTask/abstractions.js";
10
+ export { ListTasksUseCase } from "./features/ListTasks/abstractions.js";
11
+ export { CleanupTaskSubtreeUseCase } from "./features/CleanupTaskSubtree/abstractions.js";
@@ -1,5 +1,5 @@
1
1
  import { TaskDataStatus } from "../types.js";
2
- import { NotFoundError } from "@webiny/handler-graphql";
2
+ import { NotFoundError } from "@webiny/api-graphql";
3
3
  import { getErrorProperties } from "../utils/getErrorProperties.js";
4
4
  import { TaskResultStatus } from "@webiny/api-core/features/task/TaskDefinition/index.js";
5
5
  class DatabaseResponse {
@@ -1 +1 @@
1
- {"version":3,"file":"api/response/DatabaseResponse.js","sources":["../../../src/api/response/DatabaseResponse.ts"],"sourcesContent":["import { TaskDataStatus } from \"~/api/types.js\";\nimport { NotFoundError } from \"@webiny/handler-graphql\";\nimport type {\n IResponse,\n IResponseAsync,\n IResponseContinueParams,\n IResponseContinueResult,\n IResponseDoneParams,\n IResponseDoneResult,\n IResponseErrorParams,\n IResponseErrorResult,\n IResponseResult\n} from \"./abstractions/index.js\";\nimport type { ITaskManagerStorePrivate } from \"~/api/runner/abstractions/index.js\";\nimport { getErrorProperties } from \"~/api/utils/getErrorProperties.js\";\nimport { TaskResultStatus } from \"@webiny/api-core/features/task/TaskDefinition/index.js\";\n\nexport class DatabaseResponse implements IResponseAsync {\n public readonly response: IResponse;\n\n private readonly store: ITaskManagerStorePrivate;\n\n public constructor(response: IResponse, store: ITaskManagerStorePrivate) {\n this.response = response;\n this.store = store;\n }\n\n public from(result: IResponseResult): Promise<IResponseResult> {\n switch (result.status) {\n case TaskResultStatus.DONE:\n return this.done(result);\n case TaskResultStatus.CONTINUE:\n return this.continue(result);\n case TaskResultStatus.ERROR:\n return this.error(result);\n case TaskResultStatus.ABORTED:\n return this.aborted();\n }\n }\n\n public async done(params: IResponseDoneParams): Promise<IResponseDoneResult> {\n const { output, ...rest } = params;\n let message = params.message;\n try {\n await this.store.updateTask({\n taskStatus: TaskDataStatus.SUCCESS,\n finishedOn: new Date().toISOString(),\n output\n });\n await this.store.addInfoLog({\n message: message || \"Task done.\"\n });\n await this.store.save();\n } catch (ex) {\n message = `Task done, but failed to update task log. (${ex.message || \"unknown\"})`;\n }\n /**\n * Default behavior is to return the done response.\n */\n return this.response.done({\n ...rest,\n message,\n output\n });\n }\n\n public async aborted() {\n return this.response.aborted();\n }\n\n public async continue(\n params: IResponseContinueParams\n ): Promise<IResponseContinueResult | IResponseErrorResult> {\n try {\n const task = this.store.getTask();\n await this.store.updateTask({\n input: {\n ...task.input,\n ...params.input\n },\n taskStatus: TaskDataStatus.RUNNING\n });\n await this.store.addInfoLog({\n message: \"Task continuing.\",\n data: params.input\n });\n await this.store.save();\n } catch (ex) {\n /**\n * If task was not found, we just return the error.\n */\n if (ex instanceof NotFoundError) {\n return this.response.error({\n error: {\n message: ex.message || `Task not found.`,\n code: ex.code || \"TASK_NOT_FOUND\",\n data: {\n ...ex.data,\n input: this.store.getInput()\n }\n }\n });\n }\n /**\n * Otherwise, we store the error and return it...\n */\n return this.error({\n error: {\n message: `Failed to update task input: ${ex.message || \"unknown error\"}`,\n code: ex.code || \"TASK_UPDATE_ERROR\"\n }\n });\n }\n /**\n * Default behavior is to return the continue response.\n */\n return this.response.continue(params);\n }\n\n public async error(params: IResponseErrorParams): Promise<IResponseErrorResult> {\n const error =\n params.error instanceof Error ? getErrorProperties(params.error) : params.error;\n try {\n await this.store.updateTask({\n taskStatus: TaskDataStatus.FAILED,\n finishedOn: new Date().toISOString(),\n output: {\n error\n }\n });\n await this.store.addErrorLog({\n message: params.error.message,\n data: this.store.getInput(),\n error\n });\n await this.store.save();\n } catch (ex) {\n return this.response.error({\n ...params,\n error: {\n ...error,\n message: ex.message || error.message,\n code: ex.code || error.code,\n data: {\n ...error.data,\n ...ex.data,\n input: this.store.getInput()\n }\n }\n });\n }\n /**\n * Default behavior is to return the error response.\n */\n return this.response.error({\n ...params,\n error: {\n ...params.error,\n data: {\n ...error.data,\n input: this.store.getInput()\n }\n }\n });\n }\n}\n"],"names":["DatabaseResponse","response","store","result","TaskResultStatus","params","output","rest","message","TaskDataStatus","Date","ex","task","NotFoundError","error","Error","getErrorProperties"],"mappings":"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"}
1
+ {"version":3,"file":"api/response/DatabaseResponse.js","sources":["../../../src/api/response/DatabaseResponse.ts"],"sourcesContent":["import { TaskDataStatus } from \"~/api/types.js\";\nimport { NotFoundError } from \"@webiny/api-graphql\";\nimport type {\n IResponse,\n IResponseAsync,\n IResponseContinueParams,\n IResponseContinueResult,\n IResponseDoneParams,\n IResponseDoneResult,\n IResponseErrorParams,\n IResponseErrorResult,\n IResponseResult\n} from \"./abstractions/index.js\";\nimport type { ITaskManagerStorePrivate } from \"~/api/runner/abstractions/index.js\";\nimport { getErrorProperties } from \"~/api/utils/getErrorProperties.js\";\nimport { TaskResultStatus } from \"@webiny/api-core/features/task/TaskDefinition/index.js\";\n\nexport class DatabaseResponse implements IResponseAsync {\n public readonly response: IResponse;\n\n private readonly store: ITaskManagerStorePrivate;\n\n public constructor(response: IResponse, store: ITaskManagerStorePrivate) {\n this.response = response;\n this.store = store;\n }\n\n public from(result: IResponseResult): Promise<IResponseResult> {\n switch (result.status) {\n case TaskResultStatus.DONE:\n return this.done(result);\n case TaskResultStatus.CONTINUE:\n return this.continue(result);\n case TaskResultStatus.ERROR:\n return this.error(result);\n case TaskResultStatus.ABORTED:\n return this.aborted();\n }\n }\n\n public async done(params: IResponseDoneParams): Promise<IResponseDoneResult> {\n const { output, ...rest } = params;\n let message = params.message;\n try {\n await this.store.updateTask({\n taskStatus: TaskDataStatus.SUCCESS,\n finishedOn: new Date().toISOString(),\n output\n });\n await this.store.addInfoLog({\n message: message || \"Task done.\"\n });\n await this.store.save();\n } catch (ex) {\n message = `Task done, but failed to update task log. (${ex.message || \"unknown\"})`;\n }\n /**\n * Default behavior is to return the done response.\n */\n return this.response.done({\n ...rest,\n message,\n output\n });\n }\n\n public async aborted() {\n return this.response.aborted();\n }\n\n public async continue(\n params: IResponseContinueParams\n ): Promise<IResponseContinueResult | IResponseErrorResult> {\n try {\n const task = this.store.getTask();\n await this.store.updateTask({\n input: {\n ...task.input,\n ...params.input\n },\n taskStatus: TaskDataStatus.RUNNING\n });\n await this.store.addInfoLog({\n message: \"Task continuing.\",\n data: params.input\n });\n await this.store.save();\n } catch (ex) {\n /**\n * If task was not found, we just return the error.\n */\n if (ex instanceof NotFoundError) {\n return this.response.error({\n error: {\n message: ex.message || `Task not found.`,\n code: ex.code || \"TASK_NOT_FOUND\",\n data: {\n ...ex.data,\n input: this.store.getInput()\n }\n }\n });\n }\n /**\n * Otherwise, we store the error and return it...\n */\n return this.error({\n error: {\n message: `Failed to update task input: ${ex.message || \"unknown error\"}`,\n code: ex.code || \"TASK_UPDATE_ERROR\"\n }\n });\n }\n /**\n * Default behavior is to return the continue response.\n */\n return this.response.continue(params);\n }\n\n public async error(params: IResponseErrorParams): Promise<IResponseErrorResult> {\n const error =\n params.error instanceof Error ? getErrorProperties(params.error) : params.error;\n try {\n await this.store.updateTask({\n taskStatus: TaskDataStatus.FAILED,\n finishedOn: new Date().toISOString(),\n output: {\n error\n }\n });\n await this.store.addErrorLog({\n message: params.error.message,\n data: this.store.getInput(),\n error\n });\n await this.store.save();\n } catch (ex) {\n return this.response.error({\n ...params,\n error: {\n ...error,\n message: ex.message || error.message,\n code: ex.code || error.code,\n data: {\n ...error.data,\n ...ex.data,\n input: this.store.getInput()\n }\n }\n });\n }\n /**\n * Default behavior is to return the error response.\n */\n return this.response.error({\n ...params,\n error: {\n ...params.error,\n data: {\n ...error.data,\n input: this.store.getInput()\n }\n }\n });\n }\n}\n"],"names":["DatabaseResponse","response","store","result","TaskResultStatus","params","output","rest","message","TaskDataStatus","Date","ex","task","NotFoundError","error","Error","getErrorProperties"],"mappings":"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"}