@webiny/background-tasks 6.4.11 → 6.6.0-alpha.1

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 (176) 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/TaskDetail/components/TaskDetailDrawer.js +6 -0
  11. package/admin/presentation/TaskDetail/components/TaskDetailDrawer.js.map +1 -1
  12. package/admin/presentation/TaskExecutions/TaskExecutionsDataSource.js +1 -1
  13. package/admin/presentation/TaskExecutions/TaskExecutionsDataSource.js.map +1 -1
  14. package/admin/presentation/TaskExecutions/TaskExecutionsPresenter.d.ts +2 -0
  15. package/admin/presentation/TaskExecutions/TaskExecutionsPresenter.js +3 -1
  16. package/admin/presentation/TaskExecutions/TaskExecutionsPresenter.js.map +1 -1
  17. package/admin/presentation/TaskExecutions/components/TaskExecutionsView.js +44 -24
  18. package/admin/presentation/TaskExecutions/components/TaskExecutionsView.js.map +1 -1
  19. package/api/BackgroundTasksFeature.d.ts +4 -0
  20. package/api/BackgroundTasksFeature.js +61 -0
  21. package/api/BackgroundTasksFeature.js.map +1 -0
  22. package/api/TasksCrud.d.ts +10 -0
  23. package/api/TasksCrud.js +5 -0
  24. package/api/TasksCrud.js.map +1 -0
  25. package/api/abstractions/Timer.d.ts +1 -0
  26. package/api/abstractions/Timer.js +0 -0
  27. package/api/abstractions/index.d.ts +1 -0
  28. package/api/abstractions/index.js +1 -0
  29. package/api/crud/cleanupTaskSubtree.d.ts +2 -2
  30. package/api/crud/cleanupTaskSubtree.js +8 -7
  31. package/api/crud/cleanupTaskSubtree.js.map +1 -1
  32. package/api/crud/crud.tasks.d.ts +3 -2
  33. package/api/crud/crud.tasks.js +37 -37
  34. package/api/crud/crud.tasks.js.map +1 -1
  35. package/api/crud/definition.tasks.d.ts +3 -2
  36. package/api/crud/definition.tasks.js +3 -3
  37. package/api/crud/definition.tasks.js.map +1 -1
  38. package/api/crud/service.tasks.d.ts +3 -2
  39. package/api/crud/service.tasks.js +25 -21
  40. package/api/crud/service.tasks.js.map +1 -1
  41. package/api/decorators/RunnableTaskDecorator.d.ts +3 -2
  42. package/api/decorators/RunnableTaskDecorator.js +7 -8
  43. package/api/decorators/RunnableTaskDecorator.js.map +1 -1
  44. package/api/decorators/SelfCleaningTaskDecorator.d.ts +6 -3
  45. package/api/decorators/SelfCleaningTaskDecorator.js +14 -5
  46. package/api/decorators/SelfCleaningTaskDecorator.js.map +1 -1
  47. package/api/domain/TaskService.d.ts +12 -0
  48. package/api/domain/TaskService.js +5 -0
  49. package/api/domain/TaskService.js.map +1 -0
  50. package/api/domain/errors.d.ts +10 -0
  51. package/api/domain/errors.js +11 -1
  52. package/api/domain/errors.js.map +1 -1
  53. package/api/features/AbortTask/AbortTaskUseCase.d.ts +2 -3
  54. package/api/features/AbortTask/AbortTaskUseCase.js +3 -3
  55. package/api/features/AbortTask/AbortTaskUseCase.js.map +1 -1
  56. package/api/features/AbortTask/feature.d.ts +1 -2
  57. package/api/features/AbortTask/feature.js +3 -2
  58. package/api/features/AbortTask/feature.js.map +1 -1
  59. package/api/features/CleanupTaskSubtree/CleanupTaskSubtreeUseCase.d.ts +3 -3
  60. package/api/features/CleanupTaskSubtree/CleanupTaskSubtreeUseCase.js +3 -3
  61. package/api/features/CleanupTaskSubtree/CleanupTaskSubtreeUseCase.js.map +1 -1
  62. package/api/features/GetBackgroundTaskSettings/GetBackgroundTaskSettingsRepository.js +7 -4
  63. package/api/features/GetBackgroundTaskSettings/GetBackgroundTaskSettingsRepository.js.map +1 -1
  64. package/api/features/GetTask/GetTaskUseCase.d.ts +3 -3
  65. package/api/features/GetTask/GetTaskUseCase.js +3 -3
  66. package/api/features/GetTask/GetTaskUseCase.js.map +1 -1
  67. package/api/features/GetTask/feature.d.ts +1 -2
  68. package/api/features/GetTask/feature.js +3 -2
  69. package/api/features/GetTask/feature.js.map +1 -1
  70. package/api/features/GetTaskDefinition/GetTaskDefinitionUseCase.d.ts +6 -3
  71. package/api/features/GetTaskDefinition/GetTaskDefinitionUseCase.js +66 -5
  72. package/api/features/GetTaskDefinition/GetTaskDefinitionUseCase.js.map +1 -1
  73. package/api/features/GetTaskDefinition/abstractions.d.ts +2 -1
  74. package/api/features/GetTaskDefinition/abstractions.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/TaskController/TaskController.d.ts +2 -2
  82. package/api/features/TaskExecutionContext/TaskExecutionContext.d.ts +3 -3
  83. package/api/features/TaskExecutionContext/TaskExecutionContext.js.map +1 -1
  84. package/api/features/TaskExecutionContext/abstractions.d.ts +3 -3
  85. package/api/features/TaskExecutionContext/abstractions.js.map +1 -1
  86. package/api/features/TaskHandlerResolver/TaskHandlerResolver.d.ts +12 -0
  87. package/api/features/TaskHandlerResolver/TaskHandlerResolver.js +19 -0
  88. package/api/features/TaskHandlerResolver/TaskHandlerResolver.js.map +1 -0
  89. package/api/features/TaskHandlerResolver/abstractions.d.ts +17 -0
  90. package/api/features/TaskHandlerResolver/abstractions.js +5 -0
  91. package/api/features/TaskHandlerResolver/abstractions.js.map +1 -0
  92. package/api/features/TaskHandlerResolver/feature.d.ts +9 -0
  93. package/api/features/TaskHandlerResolver/feature.js +11 -0
  94. package/api/features/TaskHandlerResolver/feature.js.map +1 -0
  95. package/api/features/TaskHandlerResolver/index.d.ts +2 -0
  96. package/api/features/TaskHandlerResolver/index.js +2 -0
  97. package/api/features/TriggerTask/TriggerTaskUseCase.d.ts +2 -3
  98. package/api/features/TriggerTask/TriggerTaskUseCase.js +3 -3
  99. package/api/features/TriggerTask/TriggerTaskUseCase.js.map +1 -1
  100. package/api/features/TriggerTask/feature.d.ts +1 -2
  101. package/api/features/TriggerTask/feature.js +3 -2
  102. package/api/features/TriggerTask/feature.js.map +1 -1
  103. package/api/features/UpdateBackgroundTaskSettings/UpdateBackgroundTaskSettingsRepository.js +3 -2
  104. package/api/features/UpdateBackgroundTaskSettings/UpdateBackgroundTaskSettingsRepository.js.map +1 -1
  105. package/api/graphql/BackgroundTasksContextualSchema.d.ts +21 -0
  106. package/api/graphql/BackgroundTasksContextualSchema.js +369 -0
  107. package/api/graphql/BackgroundTasksContextualSchema.js.map +1 -0
  108. package/api/graphql/checkPermissions.js +2 -1
  109. package/api/graphql/checkPermissions.js.map +1 -1
  110. package/api/graphql/utils.d.ts +3 -3
  111. package/api/graphql/utils.js +1 -1
  112. package/api/graphql/utils.js.map +1 -1
  113. package/api/handler/types.d.ts +0 -2
  114. package/api/index.d.ts +10 -3
  115. package/api/index.js +9 -3
  116. package/api/response/DatabaseResponse.js +1 -1
  117. package/api/response/DatabaseResponse.js.map +1 -1
  118. package/api/runner/TaskControl.d.ts +25 -1
  119. package/api/runner/TaskControl.js +30 -17
  120. package/api/runner/TaskControl.js.map +1 -1
  121. package/api/runner/TaskManager.d.ts +12 -1
  122. package/api/runner/TaskManager.js +8 -6
  123. package/api/runner/TaskManager.js.map +1 -1
  124. package/api/runner/TaskManagerStore.d.ts +10 -2
  125. package/api/runner/TaskManagerStore.js +5 -3
  126. package/api/runner/TaskManagerStore.js.map +1 -1
  127. package/api/runner/TaskRunner.d.ts +3 -3
  128. package/api/runner/TaskRunner.js +25 -4
  129. package/api/runner/TaskRunner.js.map +1 -1
  130. package/api/runner/abstractions/TaskRunner.d.ts +2 -2
  131. package/api/service/createService.d.ts +3 -3
  132. package/api/service/createService.js +5 -10
  133. package/api/service/createService.js.map +1 -1
  134. package/api/service/index.d.ts +1 -4
  135. package/api/service/index.js +1 -12
  136. package/api/tasks/testingRunTask.d.ts +10 -2
  137. package/api/tasks/testingRunTask.js +10 -3
  138. package/api/tasks/testingRunTask.js.map +1 -1
  139. package/api/types.d.ts +2 -2
  140. package/api/types.js.map +1 -1
  141. package/package.json +28 -24
  142. package/testing/index.d.ts +3 -0
  143. package/testing/index.js +2 -0
  144. package/testing/mockTaskTriggerTransportPlugin.d.ts +2 -0
  145. package/testing/mockTaskTriggerTransportPlugin.js +18 -0
  146. package/testing/mockTaskTriggerTransportPlugin.js.map +1 -0
  147. package/testing/runner.d.ts +19 -0
  148. package/testing/runner.js +44 -0
  149. package/testing/runner.js.map +1 -0
  150. package/api/context.d.ts +0 -2
  151. package/api/context.js +0 -66
  152. package/api/context.js.map +0 -1
  153. package/api/graphql/BackgroundTaskSettingsSchema.d.ts +0 -2
  154. package/api/graphql/BackgroundTaskSettingsSchema.js +0 -84
  155. package/api/graphql/BackgroundTaskSettingsSchema.js.map +0 -1
  156. package/api/graphql/index.d.ts +0 -2
  157. package/api/graphql/index.js +0 -301
  158. package/api/graphql/index.js.map +0 -1
  159. package/api/handler/index.d.ts +0 -6
  160. package/api/handler/index.js +0 -55
  161. package/api/handler/index.js.map +0 -1
  162. package/api/handler/register.d.ts +0 -1
  163. package/api/handler/register.js +0 -15
  164. package/api/handler/register.js.map +0 -1
  165. package/api/plugins/TaskServicePlugin.d.ts +0 -19
  166. package/api/plugins/TaskServicePlugin.js +0 -13
  167. package/api/plugins/TaskServicePlugin.js.map +0 -1
  168. package/api/plugins/index.d.ts +0 -1
  169. package/api/plugins/index.js +0 -1
  170. package/api/service/EventBridgeEventTransportPlugin.d.ts +0 -16
  171. package/api/service/EventBridgeEventTransportPlugin.js +0 -52
  172. package/api/service/EventBridgeEventTransportPlugin.js.map +0 -1
  173. package/api/service/StepFunctionServicePlugin.d.ts +0 -25
  174. package/api/service/StepFunctionServicePlugin.js +0 -77
  175. package/api/service/StepFunctionServicePlugin.js.map +0 -1
  176. package/api/service/index.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"admin/presentation/TaskExecutions/components/TaskExecutionsView.js","sources":["../../../../../src/admin/presentation/TaskExecutions/components/TaskExecutionsView.tsx"],"sourcesContent":["import React, { useCallback, useEffect, useMemo } from \"react\";\nimport debounce from \"lodash/debounce.js\";\nimport { observer } from \"mobx-react-lite\";\nimport { DiContainerProvider, useContainer, useFeature } from \"@webiny/app\";\nimport type { DataTableSorting, OnDataTableSortingChange } from \"@webiny/admin-ui\";\nimport {\n Button,\n DataTable,\n DatePicker,\n DropdownMenu,\n Grid,\n Heading,\n IconButton,\n Input,\n Scrollbar,\n Select,\n Separator,\n Skeleton,\n Tag,\n Text,\n TimeAgo\n} from \"@webiny/admin-ui\";\nimport { useConfirmationDialog } from \"@webiny/app-admin/hooks/index.js\";\nimport { ReactComponent as MoreVerticalIcon } from \"@webiny/icons/more_vert.svg\";\nimport { ReactComponent as DeleteIcon } from \"@webiny/icons/delete.svg\";\nimport { ReactComponent as StopCircleIcon } from \"@webiny/icons/stop_circle.svg\";\nimport { useToast } from \"@webiny/admin-ui\";\nimport { TaskExecutionsPresenterFeature } from \"../feature.js\";\nimport { ListTasksFeature } from \"~/admin/features/listTasks/feature.js\";\nimport { DeleteTaskFeature } from \"~/admin/features/deleteTask/feature.js\";\nimport { AbortTaskFeature } from \"~/admin/features/abortTask/feature.js\";\nimport { ListDefinitionsFeature } from \"~/admin/features/listDefinitions/feature.js\";\nimport { TaskPermissionsFeature } from \"~/admin/features/permissions/feature.js\";\nimport type { Task, TaskStatus } from \"~/admin/shared/types.js\";\nimport { TaskDetailDrawer } from \"~/admin/presentation/TaskDetail/components/TaskDetailDrawer.js\";\nimport { TaskDefinitionsButton } from \"~/admin/presentation/TaskExecutions/components/TaskDefinitionsButton.js\";\n\nconst STATUS_TAG_VARIANT: Record<\n string,\n \"neutral-light\" | \"accent\" | \"success\" | \"destructive\" | \"warning\"\n> = {\n pending: \"neutral-light\",\n running: \"accent\",\n success: \"success\",\n failed: \"destructive\",\n aborted: \"warning\"\n};\n\nconst STATUS_OPTIONS: { label: string; value: TaskStatus }[] = [\n { label: \"Pending\", value: \"pending\" },\n { label: \"Running\", value: \"running\" },\n { label: \"Success\", value: \"success\" },\n { label: \"Failed\", value: \"failed\" },\n { label: \"Aborted\", value: \"aborted\" }\n];\n\nconst TaskExecutionsViewInner = observer(function TaskExecutionsViewInner() {\n const { presenter } = useFeature(TaskExecutionsPresenterFeature);\n const toast = useToast();\n\n useEffect(() => {\n presenter.init();\n }, [presenter]);\n\n const { vm } = presenter;\n\n const loadMoreOnScroll = useMemo(\n () =>\n debounce(({ scrollFrame }: { scrollFrame: { top: number } }) => {\n if (scrollFrame.top > 0.8) {\n presenter.loadMore();\n }\n }, 200),\n [presenter]\n );\n\n const { showConfirmation: showDeleteConfirmation } = useConfirmationDialog({\n title: \"Delete Task\",\n message: \"Are you sure you want to delete this task?\"\n });\n\n const { showConfirmation: showAbortConfirmation } = useConfirmationDialog({\n title: \"Abort Task\",\n message: \"Are you sure you want to abort this running task?\"\n });\n\n const sorting: DataTableSorting = useMemo(() => {\n const sort = vm.list.sort;\n if (!sort || !sort.field) {\n return [];\n }\n return [{ id: sort.field, desc: sort.direction === \"DESC\" }];\n }, [vm.list.sort]);\n\n const onSortingChange: OnDataTableSortingChange = useCallback(\n updater => {\n const next = typeof updater === \"function\" ? updater(sorting) : updater;\n if (next.length > 0) {\n const { id, desc } = next[0];\n presenter.sort.set(id, desc ? \"DESC\" : \"ASC\");\n }\n },\n [sorting, presenter.sort]\n );\n\n const columns = useMemo(\n () => ({\n name: {\n header: \"Name\",\n cell: (row: Task) => (\n <Text\n className=\"cursor-pointer text-primary hover:underline\"\n onClick={() => presenter.selectTask(row)}\n >\n {row.name || row.definitionId}\n </Text>\n ),\n enableSorting: true,\n size: 200\n },\n definitionId: {\n header: \"Definition\",\n cell: (row: Task) => {\n const def = vm.definitionOptions.find(d => d.value === row.definitionId);\n return <Text size=\"sm\">{def ? def.label : row.definitionId}</Text>;\n },\n enableSorting: true,\n size: 160\n },\n taskStatus: {\n header: \"Status\",\n cell: (row: Task) => (\n <Tag\n variant={STATUS_TAG_VARIANT[row.taskStatus] ?? \"neutral-light\"}\n content={row.taskStatus}\n />\n ),\n enableSorting: true,\n size: 100\n },\n createdOn: {\n header: \"Created\",\n cell: (row: Task) =>\n row.createdOn ? <TimeAgo datetime={row.createdOn} /> : <Text size=\"sm\">—</Text>,\n enableSorting: true,\n size: 120\n },\n startedOn: {\n header: \"Started\",\n cell: (row: Task) =>\n row.startedOn ? <TimeAgo datetime={row.startedOn} /> : <Text size=\"sm\">—</Text>,\n enableSorting: true,\n size: 120\n },\n finishedOn: {\n header: \"Finished\",\n cell: (row: Task) =>\n row.finishedOn ? (\n <TimeAgo datetime={row.finishedOn} />\n ) : (\n <Text size=\"sm\">—</Text>\n ),\n enableSorting: true,\n size: 120\n },\n actions: {\n header: \" \",\n cell: (row: Task) => {\n const isRunning = row.taskStatus === \"running\";\n const isTerminal =\n row.taskStatus === \"success\" ||\n row.taskStatus === \"failed\" ||\n row.taskStatus === \"aborted\";\n\n if (!isRunning && !isTerminal) {\n return null;\n }\n\n return (\n <DropdownMenu\n trigger={\n <IconButton\n icon={<MoreVerticalIcon />}\n variant=\"ghost\"\n size=\"sm\"\n aria-label=\"Actions\"\n />\n }\n >\n {isRunning && (\n <DropdownMenu.Item\n text=\"Abort\"\n icon={<StopCircleIcon />}\n onClick={() => {\n showAbortConfirmation(() =>\n presenter.abortTask(row.id).then(() => {\n toast.showSuccessToast({ title: \"Task aborted.\" });\n })\n );\n }}\n />\n )}\n {isTerminal && vm.permissions.canDelete && (\n <>\n {isRunning && <DropdownMenu.Separator />}\n <DropdownMenu.Item\n text=\"Delete\"\n icon={<DeleteIcon />}\n onClick={() => {\n showDeleteConfirmation(() =>\n presenter.deleteTask(row.id).then(() => {\n toast.showSuccessToast({\n title: \"Task deleted.\"\n });\n })\n );\n }}\n />\n </>\n )}\n </DropdownMenu>\n );\n },\n size: 56,\n enableSorting: false,\n enableHiding: false,\n enableResizing: false\n }\n }),\n [vm.permissions, vm.definitionOptions]\n );\n\n const hasFilters = Object.keys(vm.list.filters).length > 0;\n\n return (\n <>\n <div className=\"flex flex-col h-main-content\">\n <div className=\"flex items-center justify-between py-sm px-md\">\n <Heading level={5}>Task Executions</Heading>\n <TaskDefinitionsButton />\n </div>\n <Separator />\n <div className={\"p-sm\"}>\n <Grid>\n <Grid.Column span={2}>\n <Input\n size={\"md\"}\n placeholder=\"Search by name...\"\n value={vm.list.search}\n onChange={value => {\n presenter.search.set(value);\n }}\n />\n </Grid.Column>\n <Grid.Column span={2}>\n <Select\n size={\"md\"}\n placeholder=\"Status\"\n options={STATUS_OPTIONS}\n value={(vm.list.filters.taskStatus_in as string) ?? \"\"}\n onChange={value => {\n if (value) {\n presenter.filter.set(\"taskStatus_in\", value);\n } else {\n presenter.filter.clear(\"taskStatus_in\");\n }\n }}\n />\n </Grid.Column>\n {vm.definitionOptions.length > 0 ? (\n <Grid.Column span={2}>\n <Select\n size={\"md\"}\n placeholder=\"Definition\"\n options={vm.definitionOptions}\n value={vm.list.filters.definitionId as string}\n onChange={value => {\n if (value) {\n presenter.filter.set(\"definitionId\", value);\n } else {\n presenter.filter.clear(\"definitionId\");\n }\n }}\n />\n </Grid.Column>\n ) : null}\n <Grid.Column span={2}>\n <DatePicker\n size={\"md\"}\n type=\"dateTimeTz\"\n placeholder=\"Created from\"\n value={vm.list.filters.createdOn_gte as string}\n onChange={value => {\n if (value) {\n presenter.filter.set(\"createdOn_gte\", value);\n } else {\n presenter.filter.clear(\"createdOn_gte\");\n }\n }}\n />\n </Grid.Column>\n <Grid.Column span={2}>\n <DatePicker\n size={\"md\"}\n type=\"dateTimeTz\"\n placeholder=\"Created to\"\n value={vm.list.filters.createdOn_lte as string}\n onChange={value => {\n if (value) {\n presenter.filter.set(\"createdOn_lte\", value);\n } else {\n presenter.filter.clear(\"createdOn_lte\");\n }\n }}\n />\n </Grid.Column>\n <Button\n variant=\"tertiary\"\n size=\"md\"\n onClick={() => presenter.filter.clearAll()}\n disabled={!hasFilters}\n >\n Clear filters\n </Button>\n </Grid>\n </div>\n <Separator />\n <div className=\"flex-1 overflow-hidden\">\n {!vm.list.pagination.loading &&\n !vm.list.pagination.loadingMore &&\n vm.list.rows.length === 0 ? (\n <div className=\"flex flex-col items-center justify-center h-full gap-md\">\n <Text className=\"text-neutral-strong\">No tasks found.</Text>\n </div>\n ) : (\n <Scrollbar onScrollFrame={scrollFrame => loadMoreOnScroll({ scrollFrame })}>\n <DataTable<Task>\n columns={columns}\n data={vm.list.rows}\n loading={vm.list.pagination.loading}\n sorting={sorting}\n onSortingChange={onSortingChange}\n stickyHeader\n />\n {vm.list.pagination.loadingMore ? (\n <div className=\"flex flex-col gap-sm p-md\">\n <Skeleton className=\"h-8 w-full\" />\n <Skeleton className=\"h-8 w-full\" />\n </div>\n ) : null}\n </Scrollbar>\n )}\n </div>\n </div>\n {presenter.selectedTask && (\n <TaskDetailDrawer\n task={presenter.selectedTask}\n open={!!presenter.selectedTask}\n onClose={() => presenter.selectTask(null)}\n onAbort={async (id: string) => {\n await presenter.abortTask(id);\n toast.showSuccessToast({ title: \"Task aborted.\" });\n }}\n onDelete={async (id: string) => {\n await presenter.deleteTask(id);\n toast.showSuccessToast({ title: \"Task deleted.\" });\n }}\n />\n )}\n </>\n );\n});\n\nexport const TaskExecutionsView = () => {\n const container = useContainer();\n\n const scopedContainer = useMemo(() => {\n const child = container.createChildContainer();\n ListTasksFeature.register(child);\n DeleteTaskFeature.register(child);\n AbortTaskFeature.register(child);\n ListDefinitionsFeature.register(child);\n TaskPermissionsFeature.register(child);\n TaskExecutionsPresenterFeature.register(child);\n return child;\n }, []);\n\n return (\n <DiContainerProvider container={scopedContainer}>\n <TaskExecutionsViewInner />\n </DiContainerProvider>\n );\n};\n"],"names":["STATUS_TAG_VARIANT","STATUS_OPTIONS","TaskExecutionsViewInner","observer","presenter","useFeature","TaskExecutionsPresenterFeature","toast","useToast","useEffect","vm","loadMoreOnScroll","useMemo","debounce","scrollFrame","showDeleteConfirmation","useConfirmationDialog","showAbortConfirmation","sorting","sort","onSortingChange","useCallback","updater","next","id","desc","columns","row","Text","def","d","Tag","TimeAgo","isRunning","isTerminal","DropdownMenu","IconButton","MoreVerticalIcon","StopCircleIcon","DeleteIcon","hasFilters","Object","Heading","TaskDefinitionsButton","Separator","Grid","Input","value","Select","DatePicker","Button","Scrollbar","DataTable","Skeleton","TaskDetailDrawer","TaskExecutionsView","container","useContainer","scopedContainer","child","ListTasksFeature","DeleteTaskFeature","AbortTaskFeature","ListDefinitionsFeature","TaskPermissionsFeature","DiContainerProvider"],"mappings":";;;;;;;;;;;;;;;;;AAqCA,MAAMA,qBAGF;IACA,SAAS;IACT,SAAS;IACT,SAAS;IACT,QAAQ;IACR,SAAS;AACb;AAEA,MAAMC,iBAAyD;IAC3D;QAAE,OAAO;QAAW,OAAO;IAAU;IACrC;QAAE,OAAO;QAAW,OAAO;IAAU;IACrC;QAAE,OAAO;QAAW,OAAO;IAAU;IACrC;QAAE,OAAO;QAAU,OAAO;IAAS;IACnC;QAAE,OAAO;QAAW,OAAO;IAAU;CACxC;AAED,MAAMC,6CAA0BC,SAAS;IACrC,MAAM,EAAEC,SAAS,EAAE,GAAGC,WAAWC;IACjC,MAAMC,QAAQC;IAEdC,UAAU;QACNL,UAAU,IAAI;IAClB,GAAG;QAACA;KAAU;IAEd,MAAM,EAAEM,EAAE,EAAE,GAAGN;IAEf,MAAMO,mBAAmBC,QACrB,IACIC,SAAS,CAAC,EAAEC,WAAW,EAAoC;YACvD,IAAIA,YAAY,GAAG,GAAG,KAClBV,UAAU,QAAQ;QAE1B,GAAG,MACP;QAACA;KAAU;IAGf,MAAM,EAAE,kBAAkBW,sBAAsB,EAAE,GAAGC,sBAAsB;QACvE,OAAO;QACP,SAAS;IACb;IAEA,MAAM,EAAE,kBAAkBC,qBAAqB,EAAE,GAAGD,sBAAsB;QACtE,OAAO;QACP,SAAS;IACb;IAEA,MAAME,UAA4BN,QAAQ;QACtC,MAAMO,OAAOT,GAAG,IAAI,CAAC,IAAI;QACzB,IAAI,CAACS,QAAQ,CAACA,KAAK,KAAK,EACpB,OAAO,EAAE;QAEb,OAAO;YAAC;gBAAE,IAAIA,KAAK,KAAK;gBAAE,MAAMA,AAAmB,WAAnBA,KAAK,SAAS;YAAY;SAAE;IAChE,GAAG;QAACT,GAAG,IAAI,CAAC,IAAI;KAAC;IAEjB,MAAMU,kBAA4CC,YAC9CC,CAAAA;QACI,MAAMC,OAAO,AAAmB,cAAnB,OAAOD,UAAyBA,QAAQJ,WAAWI;QAChE,IAAIC,KAAK,MAAM,GAAG,GAAG;YACjB,MAAM,EAAEC,EAAE,EAAEC,IAAI,EAAE,GAAGF,IAAI,CAAC,EAAE;YAC5BnB,UAAU,IAAI,CAAC,GAAG,CAACoB,IAAIC,OAAO,SAAS;QAC3C;IACJ,GACA;QAACP;QAASd,UAAU,IAAI;KAAC;IAG7B,MAAMsB,UAAUd,QACZ,IAAO;YACH,MAAM;gBACF,QAAQ;gBACR,MAAM,CAACe,MAAAA,WAAAA,GACH,oBAACC,MAAIA;wBACD,WAAU;wBACV,SAAS,IAAMxB,UAAU,UAAU,CAACuB;uBAEnCA,IAAI,IAAI,IAAIA,IAAI,YAAY;gBAGrC,eAAe;gBACf,MAAM;YACV;YACA,cAAc;gBACV,QAAQ;gBACR,MAAM,CAACA;oBACH,MAAME,MAAMnB,GAAG,iBAAiB,CAAC,IAAI,CAACoB,CAAAA,IAAKA,EAAE,KAAK,KAAKH,IAAI,YAAY;oBACvE,OAAO,WAAP,GAAO,oBAACC,MAAIA;wBAAC,MAAK;uBAAMC,MAAMA,IAAI,KAAK,GAAGF,IAAI,YAAY;gBAC9D;gBACA,eAAe;gBACf,MAAM;YACV;YACA,YAAY;gBACR,QAAQ;gBACR,MAAM,CAACA,MAAAA,WAAAA,GACH,oBAACI,KAAGA;wBACA,SAAS/B,kBAAkB,CAAC2B,IAAI,UAAU,CAAC,IAAI;wBAC/C,SAASA,IAAI,UAAU;;gBAG/B,eAAe;gBACf,MAAM;YACV;YACA,WAAW;gBACP,QAAQ;gBACR,MAAM,CAACA,MACHA,IAAI,SAAS,GAAG,WAAH,GAAG,oBAACK,SAAOA;wBAAC,UAAUL,IAAI,SAAS;uCAAO,oBAACC,MAAIA;wBAAC,MAAK;uBAAK;gBAC3E,eAAe;gBACf,MAAM;YACV;YACA,WAAW;gBACP,QAAQ;gBACR,MAAM,CAACD,MACHA,IAAI,SAAS,GAAG,WAAH,GAAG,oBAACK,SAAOA;wBAAC,UAAUL,IAAI,SAAS;uCAAO,oBAACC,MAAIA;wBAAC,MAAK;uBAAK;gBAC3E,eAAe;gBACf,MAAM;YACV;YACA,YAAY;gBACR,QAAQ;gBACR,MAAM,CAACD,MACHA,IAAI,UAAU,GAAG,WAAH,GACV,oBAACK,SAAOA;wBAAC,UAAUL,IAAI,UAAU;uCAEjC,oBAACC,MAAIA;wBAAC,MAAK;uBAAK;gBAExB,eAAe;gBACf,MAAM;YACV;YACA,SAAS;gBACL,QAAQ;gBACR,MAAM,CAACD;oBACH,MAAMM,YAAYN,AAAmB,cAAnBA,IAAI,UAAU;oBAChC,MAAMO,aACFP,AAAmB,cAAnBA,IAAI,UAAU,IACdA,AAAmB,aAAnBA,IAAI,UAAU,IACdA,AAAmB,cAAnBA,IAAI,UAAU;oBAElB,IAAI,CAACM,aAAa,CAACC,YACf,OAAO;oBAGX,OAAO,WAAP,GACI,oBAACC,cAAYA;wBACT,uBACI,oBAACC,YAAUA;4BACP,oBAAM,oBAACC,gBAAgBA;4BACvB,SAAQ;4BACR,MAAK;4BACL,cAAW;;uBAIlBJ,aAAa,WAAbA,GACG,oBAACE,aAAa,IAAI;wBACd,MAAK;wBACL,oBAAM,oBAACG,gCAAcA;wBACrB,SAAS;4BACLrB,sBAAsB,IAClBb,UAAU,SAAS,CAACuB,IAAI,EAAE,EAAE,IAAI,CAAC;oCAC7BpB,MAAM,gBAAgB,CAAC;wCAAE,OAAO;oCAAgB;gCACpD;wBAER;wBAGP2B,cAAcxB,GAAG,WAAW,CAAC,SAAS,IAAI,WAAJ,GACnC,0CACKuB,aAAa,WAAbA,GAAa,oBAACE,aAAa,SAAS,uBACrC,oBAACA,aAAa,IAAI;wBACd,MAAK;wBACL,oBAAM,oBAACI,2BAAUA;wBACjB,SAAS;4BACLxB,uBAAuB,IACnBX,UAAU,UAAU,CAACuB,IAAI,EAAE,EAAE,IAAI,CAAC;oCAC9BpB,MAAM,gBAAgB,CAAC;wCACnB,OAAO;oCACX;gCACJ;wBAER;;gBAMxB;gBACA,MAAM;gBACN,eAAe;gBACf,cAAc;gBACd,gBAAgB;YACpB;QACJ,IACA;QAACG,GAAG,WAAW;QAAEA,GAAG,iBAAiB;KAAC;IAG1C,MAAM8B,aAAaC,OAAO,IAAI,CAAC/B,GAAG,IAAI,CAAC,OAAO,EAAE,MAAM,GAAG;IAEzD,OAAO,WAAP,GACI,wDACI,oBAAC;QAAI,WAAU;qBACX,oBAAC;QAAI,WAAU;qBACX,oBAACgC,SAAOA;QAAC,OAAO;OAAG,kCACnB,oBAACC,uBAAqBA,QAAAA,WAAAA,GAE1B,oBAACC,WAASA,OAAAA,WAAAA,GACV,oBAAC;QAAI,WAAW;qBACZ,oBAACC,MAAIA,MAAAA,WAAAA,GACD,oBAACA,KAAK,MAAM;QAAC,MAAM;qBACf,oBAACC,OAAKA;QACF,MAAM;QACN,aAAY;QACZ,OAAOpC,GAAG,IAAI,CAAC,MAAM;QACrB,UAAUqC,CAAAA;YACN3C,UAAU,MAAM,CAAC,GAAG,CAAC2C;QACzB;uBAGR,oBAACF,KAAK,MAAM;QAAC,MAAM;qBACf,oBAACG,QAAMA;QACH,MAAM;QACN,aAAY;QACZ,SAAS/C;QACT,OAAQS,GAAG,IAAI,CAAC,OAAO,CAAC,aAAa,IAAe;QACpD,UAAUqC,CAAAA;YACN,IAAIA,OACA3C,UAAU,MAAM,CAAC,GAAG,CAAC,iBAAiB2C;iBAEtC3C,UAAU,MAAM,CAAC,KAAK,CAAC;QAE/B;SAGPM,GAAG,iBAAiB,CAAC,MAAM,GAAG,IAAI,WAAJ,GAC3B,oBAACmC,KAAK,MAAM;QAAC,MAAM;qBACf,oBAACG,QAAMA;QACH,MAAM;QACN,aAAY;QACZ,SAAStC,GAAG,iBAAiB;QAC7B,OAAOA,GAAG,IAAI,CAAC,OAAO,CAAC,YAAY;QACnC,UAAUqC,CAAAA;YACN,IAAIA,OACA3C,UAAU,MAAM,CAAC,GAAG,CAAC,gBAAgB2C;iBAErC3C,UAAU,MAAM,CAAC,KAAK,CAAC;QAE/B;UAGR,oBACJ,oBAACyC,KAAK,MAAM;QAAC,MAAM;qBACf,oBAACI,YAAUA;QACP,MAAM;QACN,MAAK;QACL,aAAY;QACZ,OAAOvC,GAAG,IAAI,CAAC,OAAO,CAAC,aAAa;QACpC,UAAUqC,CAAAA;YACN,IAAIA,OACA3C,UAAU,MAAM,CAAC,GAAG,CAAC,iBAAiB2C;iBAEtC3C,UAAU,MAAM,CAAC,KAAK,CAAC;QAE/B;uBAGR,oBAACyC,KAAK,MAAM;QAAC,MAAM;qBACf,oBAACI,YAAUA;QACP,MAAM;QACN,MAAK;QACL,aAAY;QACZ,OAAOvC,GAAG,IAAI,CAAC,OAAO,CAAC,aAAa;QACpC,UAAUqC,CAAAA;YACN,IAAIA,OACA3C,UAAU,MAAM,CAAC,GAAG,CAAC,iBAAiB2C;iBAEtC3C,UAAU,MAAM,CAAC,KAAK,CAAC;QAE/B;uBAGR,oBAAC8C,QAAMA;QACH,SAAQ;QACR,MAAK;QACL,SAAS,IAAM9C,UAAU,MAAM,CAAC,QAAQ;QACxC,UAAU,CAACoC;OACd,kCAKT,oBAACI,WAASA,OAAAA,WAAAA,GACV,oBAAC;QAAI,WAAU;OACV,AAAClC,GAAG,IAAI,CAAC,UAAU,CAAC,OAAO,IAC3BA,GAAG,IAAI,CAAC,UAAU,CAAC,WAAW,IAC/BA,AAAwB,MAAxBA,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,GAE2B,cAG1C,oBAACyC,WAASA;QAAC,eAAerC,CAAAA,cAAeH,iBAAiB;gBAAEG;YAAY;qBACpE,oBAACsC,WAASA;QACN,SAAS1B;QACT,MAAMhB,GAAG,IAAI,CAAC,IAAI;QAClB,SAASA,GAAG,IAAI,CAAC,UAAU,CAAC,OAAO;QACnC,SAASQ;QACT,iBAAiBE;QACjB;QAEHV,GAAG,IAAI,CAAC,UAAU,CAAC,WAAW,GAAG,WAAH,GAC3B,oBAAC;QAAI,WAAU;qBACX,oBAAC2C,UAAQA;QAAC,WAAU;sBACpB,oBAACA,UAAQA;QAAC,WAAU;UAExB,QAnBgB,WAAJ,GACpB,oBAAC;QAAI,WAAU;qBACX,oBAACzB,MAAIA;QAAC,WAAU;OAAsB,uBAsBrDxB,UAAU,YAAY,IAAI,WAAJ,GACnB,oBAACkD,kBAAgBA;QACb,MAAMlD,UAAU,YAAY;QAC5B,MAAM,CAAC,CAACA,UAAU,YAAY;QAC9B,SAAS,IAAMA,UAAU,UAAU,CAAC;QACpC,SAAS,OAAOoB;YACZ,MAAMpB,UAAU,SAAS,CAACoB;YAC1BjB,MAAM,gBAAgB,CAAC;gBAAE,OAAO;YAAgB;QACpD;QACA,UAAU,OAAOiB;YACb,MAAMpB,UAAU,UAAU,CAACoB;YAC3BjB,MAAM,gBAAgB,CAAC;gBAAE,OAAO;YAAgB;QACpD;;AAKpB;AAEO,MAAMgD,qBAAqB;IAC9B,MAAMC,YAAYC;IAElB,MAAMC,kBAAkB9C,QAAQ;QAC5B,MAAM+C,QAAQH,UAAU,oBAAoB;QAC5CI,iBAAiB,QAAQ,CAACD;QAC1BE,kBAAkB,QAAQ,CAACF;QAC3BG,iBAAiB,QAAQ,CAACH;QAC1BI,uBAAuB,QAAQ,CAACJ;QAChCK,uBAAuB,QAAQ,CAACL;QAChCrD,+BAA+B,QAAQ,CAACqD;QACxC,OAAOA;IACX,GAAG,EAAE;IAEL,OAAO,WAAP,GACI,oBAACM,qBAAmBA;QAAC,WAAWP;qBAC5B,oBAACxD,4CAAuBA;AAGpC"}
1
+ {"version":3,"file":"admin/presentation/TaskExecutions/components/TaskExecutionsView.js","sources":["../../../../../src/admin/presentation/TaskExecutions/components/TaskExecutionsView.tsx"],"sourcesContent":["import React, { useCallback, useEffect, useMemo, useState } from \"react\";\nimport debounce from \"lodash/debounce.js\";\nimport { observer } from \"mobx-react-lite\";\nimport { DiContainerProvider, useContainer, useFeature } from \"@webiny/app\";\nimport type { DataTableSorting, OnDataTableSortingChange } from \"@webiny/admin-ui\";\nimport {\n DataTable,\n DatePicker,\n Drawer,\n DropdownMenu,\n Heading,\n IconButton,\n Input,\n Scrollbar,\n Select,\n Separator,\n Skeleton,\n Tag,\n Text,\n TimeAgo\n} from \"@webiny/admin-ui\";\nimport { useConfirmationDialog } from \"@webiny/app-admin/hooks/index.js\";\nimport { ReactComponent as MoreVerticalIcon } from \"@webiny/icons/more_vert.svg\";\nimport { ReactComponent as DeleteIcon } from \"@webiny/icons/delete.svg\";\nimport { ReactComponent as StopCircleIcon } from \"@webiny/icons/stop_circle.svg\";\nimport { ReactComponent as FilterIcon } from \"@webiny/icons/filter_list.svg\";\nimport { useToast } from \"@webiny/admin-ui\";\nimport { TaskExecutionsPresenterFeature } from \"../feature.js\";\nimport { ListTasksFeature } from \"~/admin/features/listTasks/feature.js\";\nimport { DeleteTaskFeature } from \"~/admin/features/deleteTask/feature.js\";\nimport { AbortTaskFeature } from \"~/admin/features/abortTask/feature.js\";\nimport { ListDefinitionsFeature } from \"~/admin/features/listDefinitions/feature.js\";\nimport { TaskPermissionsFeature } from \"~/admin/features/permissions/feature.js\";\nimport type { Task, TaskStatus } from \"~/admin/shared/types.js\";\nimport { TaskDetailDrawer } from \"~/admin/presentation/TaskDetail/components/TaskDetailDrawer.js\";\nimport { TaskDefinitionsButton } from \"~/admin/presentation/TaskExecutions/components/TaskDefinitionsButton.js\";\n\nconst STATUS_TAG_VARIANT: Record<\n string,\n \"neutral-light\" | \"accent\" | \"success\" | \"destructive\" | \"warning\"\n> = {\n pending: \"neutral-light\",\n running: \"accent\",\n success: \"success\",\n failed: \"destructive\",\n aborted: \"warning\"\n};\n\nconst STATUS_OPTIONS: { label: string; value: TaskStatus }[] = [\n { label: \"Pending\", value: \"pending\" },\n { label: \"Running\", value: \"running\" },\n { label: \"Success\", value: \"success\" },\n { label: \"Failed\", value: \"failed\" },\n { label: \"Aborted\", value: \"aborted\" }\n];\n\nconst TaskExecutionsViewInner = observer(function TaskExecutionsViewInner() {\n const { presenter } = useFeature(TaskExecutionsPresenterFeature);\n const toast = useToast();\n\n useEffect(() => {\n presenter.init();\n }, [presenter]);\n\n const { vm } = presenter;\n\n const loadMoreOnScroll = useMemo(\n () =>\n debounce(({ scrollFrame }: { scrollFrame: { top: number } }) => {\n if (scrollFrame.top > 0.8) {\n presenter.loadMore();\n }\n }, 200),\n [presenter]\n );\n\n const { showConfirmation: showDeleteConfirmation } = useConfirmationDialog({\n title: \"Delete Task\",\n message: \"Are you sure you want to delete this task?\"\n });\n\n const { showConfirmation: showAbortConfirmation } = useConfirmationDialog({\n title: \"Abort Task\",\n message: \"Are you sure you want to abort this running task?\"\n });\n\n const sorting: DataTableSorting = useMemo(() => {\n const sort = vm.list.sort;\n if (!sort || !sort.field) {\n return [];\n }\n return [{ id: sort.field, desc: sort.direction === \"DESC\" }];\n }, [vm.list.sort]);\n\n const onSortingChange: OnDataTableSortingChange = useCallback(\n updater => {\n const next = typeof updater === \"function\" ? updater(sorting) : updater;\n if (next.length > 0) {\n const { id, desc } = next[0];\n presenter.sort.set(id, desc ? \"DESC\" : \"ASC\");\n }\n },\n [sorting, presenter.sort]\n );\n\n const columns = useMemo(\n () => ({\n name: {\n header: \"Name\",\n cell: (row: Task) => (\n <Text\n className=\"cursor-pointer text-primary hover:underline\"\n onClick={() => presenter.selectTask(row)}\n >\n {row.name || row.definitionId}\n </Text>\n ),\n enableSorting: true,\n size: 200\n },\n definitionId: {\n header: \"Definition\",\n cell: (row: Task) => {\n const def = vm.definitionOptions.find(d => d.value === row.definitionId);\n return <Text size=\"sm\">{def ? def.label : row.definitionId}</Text>;\n },\n enableSorting: true,\n size: 160\n },\n taskStatus: {\n header: \"Status\",\n cell: (row: Task) => (\n <Tag\n variant={STATUS_TAG_VARIANT[row.taskStatus] ?? \"neutral-light\"}\n content={row.taskStatus}\n />\n ),\n enableSorting: true,\n size: 100\n },\n createdOn: {\n header: \"Created\",\n cell: (row: Task) =>\n row.createdOn ? <TimeAgo datetime={row.createdOn} /> : <Text size=\"sm\">—</Text>,\n enableSorting: true,\n size: 120\n },\n startedOn: {\n header: \"Started\",\n cell: (row: Task) =>\n row.startedOn ? <TimeAgo datetime={row.startedOn} /> : <Text size=\"sm\">—</Text>,\n enableSorting: true,\n size: 120\n },\n finishedOn: {\n header: \"Finished\",\n cell: (row: Task) =>\n row.finishedOn ? (\n <TimeAgo datetime={row.finishedOn} />\n ) : (\n <Text size=\"sm\">—</Text>\n ),\n enableSorting: true,\n size: 120\n },\n actions: {\n header: \" \",\n cell: (row: Task) => {\n const isRunning = row.taskStatus === \"running\";\n const isTerminal =\n row.taskStatus === \"success\" ||\n row.taskStatus === \"failed\" ||\n row.taskStatus === \"aborted\";\n\n if (!isRunning && !isTerminal) {\n return null;\n }\n\n return (\n <DropdownMenu\n trigger={\n <IconButton\n icon={<MoreVerticalIcon />}\n variant=\"ghost\"\n size=\"sm\"\n aria-label=\"Actions\"\n />\n }\n >\n {isRunning && (\n <DropdownMenu.Item\n text=\"Abort\"\n icon={<StopCircleIcon />}\n onClick={() => {\n showAbortConfirmation(() =>\n presenter.abortTask(row.id).then(() => {\n toast.showSuccessToast({ title: \"Task aborted.\" });\n })\n );\n }}\n />\n )}\n {isTerminal && vm.permissions.canDelete && (\n <>\n {isRunning && <DropdownMenu.Separator />}\n <DropdownMenu.Item\n text=\"Delete\"\n icon={<DeleteIcon />}\n onClick={() => {\n showDeleteConfirmation(() =>\n presenter.deleteTask(row.id).then(() => {\n toast.showSuccessToast({\n title: \"Task deleted.\"\n });\n })\n );\n }}\n />\n </>\n )}\n </DropdownMenu>\n );\n },\n size: 56,\n enableSorting: false,\n enableHiding: false,\n enableResizing: false\n }\n }),\n [vm.permissions, vm.definitionOptions]\n );\n\n const [filtersOpen, setFiltersOpen] = useState(false);\n const hasFilters = Object.keys(vm.list.filters).length > 0;\n const hasActiveFilters = hasFilters || !!vm.list.search;\n\n const clearAllFilters = () => {\n presenter.filter.clearAll();\n presenter.search.set(\"\");\n };\n\n return (\n <>\n <div className=\"flex flex-col h-main-content\">\n <div className=\"flex items-center justify-between py-sm px-md\">\n <Heading level={5}>Task Executions</Heading>\n <div className=\"flex items-center gap-sm\">\n <IconButton\n variant={hasActiveFilters ? \"primary\" : \"ghost\"}\n icon={<FilterIcon />}\n onClick={() => setFiltersOpen(true)}\n data-testid=\"background-tasks.toggle-filters\"\n />\n <TaskDefinitionsButton />\n </div>\n </div>\n <Separator />\n <Drawer\n open={filtersOpen}\n onClose={() => setFiltersOpen(false)}\n modal={true}\n width={360}\n title=\"Filters\"\n headerSeparator={true}\n footerSeparator={true}\n bodyPadding={false}\n actions={\n <>\n <Drawer.CancelButton text=\"Clear all\" onClick={clearAllFilters} />\n <Drawer.ConfirmButton\n text=\"Apply filters\"\n onClick={() => setFiltersOpen(false)}\n />\n </>\n }\n >\n <div className=\"flex flex-col gap-lg p-lg\">\n <Input\n size={\"md\"}\n label=\"Search\"\n placeholder=\"Search by name...\"\n value={vm.list.search}\n onChange={value => {\n presenter.search.set(value);\n }}\n />\n <Select\n size={\"md\"}\n label=\"Status\"\n placeholder=\"Status\"\n options={STATUS_OPTIONS}\n value={(vm.list.filters.taskStatus_in as string) ?? \"\"}\n onChange={value => {\n if (value) {\n presenter.filter.set(\"taskStatus_in\", value);\n } else {\n presenter.filter.clear(\"taskStatus_in\");\n }\n }}\n />\n {vm.definitionOptions.length > 0 ? (\n <Select\n size={\"md\"}\n label=\"Definition\"\n placeholder=\"Definition\"\n options={vm.definitionOptions}\n value={vm.list.filters.definitionId as string}\n onChange={value => {\n if (value) {\n presenter.filter.set(\"definitionId\", value);\n } else {\n presenter.filter.clear(\"definitionId\");\n }\n }}\n />\n ) : null}\n <DatePicker\n size={\"md\"}\n type=\"dateTimeTz\"\n label=\"Created from\"\n placeholder=\"Created from\"\n value={vm.list.filters.createdOn_gte as string}\n onChange={value => {\n if (value) {\n presenter.filter.set(\"createdOn_gte\", value);\n } else {\n presenter.filter.clear(\"createdOn_gte\");\n }\n }}\n />\n <DatePicker\n size={\"md\"}\n type=\"dateTimeTz\"\n label=\"Created to\"\n placeholder=\"Created to\"\n value={vm.list.filters.createdOn_lte as string}\n onChange={value => {\n if (value) {\n presenter.filter.set(\"createdOn_lte\", value);\n } else {\n presenter.filter.clear(\"createdOn_lte\");\n }\n }}\n />\n </div>\n </Drawer>\n <div className=\"flex-1 overflow-hidden\">\n {!vm.list.pagination.loading &&\n !vm.list.pagination.loadingMore &&\n vm.list.rows.length === 0 ? (\n <div className=\"flex flex-col items-center justify-center h-full gap-md\">\n <Text className=\"text-neutral-strong\">No tasks found.</Text>\n </div>\n ) : (\n <Scrollbar onScrollFrame={scrollFrame => loadMoreOnScroll({ scrollFrame })}>\n <DataTable<Task>\n columns={columns}\n data={vm.list.rows}\n loading={vm.list.pagination.loading}\n sorting={sorting}\n onSortingChange={onSortingChange}\n stickyHeader\n />\n {vm.list.pagination.loadingMore ? (\n <div className=\"flex flex-col gap-sm p-md\">\n <Skeleton className=\"h-8 w-full\" />\n <Skeleton className=\"h-8 w-full\" />\n </div>\n ) : null}\n </Scrollbar>\n )}\n </div>\n </div>\n {presenter.selectedTask && (\n <TaskDetailDrawer\n task={presenter.selectedTask}\n open={!!presenter.selectedTask}\n onClose={() => presenter.selectTask(null)}\n onAbort={async (id: string) => {\n await presenter.abortTask(id);\n toast.showSuccessToast({ title: \"Task aborted.\" });\n }}\n onDelete={async (id: string) => {\n await presenter.deleteTask(id);\n toast.showSuccessToast({ title: \"Task deleted.\" });\n }}\n />\n )}\n </>\n );\n});\n\nexport const TaskExecutionsView = () => {\n const container = useContainer();\n\n const scopedContainer = useMemo(() => {\n const child = container.createChildContainer();\n ListTasksFeature.register(child);\n DeleteTaskFeature.register(child);\n AbortTaskFeature.register(child);\n ListDefinitionsFeature.register(child);\n TaskPermissionsFeature.register(child);\n TaskExecutionsPresenterFeature.register(child);\n return child;\n }, []);\n\n return (\n <DiContainerProvider container={scopedContainer}>\n <TaskExecutionsViewInner />\n </DiContainerProvider>\n );\n};\n"],"names":["STATUS_TAG_VARIANT","STATUS_OPTIONS","TaskExecutionsViewInner","observer","presenter","useFeature","TaskExecutionsPresenterFeature","toast","useToast","useEffect","vm","loadMoreOnScroll","useMemo","debounce","scrollFrame","showDeleteConfirmation","useConfirmationDialog","showAbortConfirmation","sorting","sort","onSortingChange","useCallback","updater","next","id","desc","columns","row","Text","def","d","Tag","TimeAgo","isRunning","isTerminal","DropdownMenu","IconButton","MoreVerticalIcon","StopCircleIcon","DeleteIcon","filtersOpen","setFiltersOpen","useState","hasFilters","Object","hasActiveFilters","clearAllFilters","Heading","FilterIcon","TaskDefinitionsButton","Separator","Drawer","Input","value","Select","DatePicker","Scrollbar","DataTable","Skeleton","TaskDetailDrawer","TaskExecutionsView","container","useContainer","scopedContainer","child","ListTasksFeature","DeleteTaskFeature","AbortTaskFeature","ListDefinitionsFeature","TaskPermissionsFeature","DiContainerProvider"],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ export declare const BackgroundTasksFeature: {
2
+ name: string;
3
+ register(container: import("@webiny/di").Container): void;
4
+ };
@@ -0,0 +1,61 @@
1
+ import { createFeature } from "@webiny/feature/api";
2
+ import { TaskService } from "@webiny/api-core/features/task/TaskService/index.js";
3
+ import { RunnableTaskDecorator } from "./decorators/RunnableTaskDecorator.js";
4
+ import { SelfCleaningTaskDecorator } from "./decorators/SelfCleaningTaskDecorator.js";
5
+ import { TaskController } from "./features/TaskController/index.js";
6
+ import { TaskPrivateModel } from "./crud/TaskPrivateModel.js";
7
+ import { TaskLogPrivateModel } from "./crud/TaskLogPrivateModel.js";
8
+ import { BackgroundTaskSettingsModel } from "./models/BackgroundTaskSettingsModel.js";
9
+ import { createDefinitionCrud } from "./crud/definition.tasks.js";
10
+ import { createServiceCrud } from "./crud/service.tasks.js";
11
+ import { createTaskCrud } from "./crud/crud.tasks.js";
12
+ import { TaskExecutionContextFeature } from "./features/TaskExecutionContext/feature.js";
13
+ import { TaskHandlerResolverFeature } from "./features/TaskHandlerResolver/feature.js";
14
+ import { GetTaskDefinitionFeature } from "./features/GetTaskDefinition/feature.js";
15
+ import { ListTaskDefinitionsFeature } from "./features/ListTaskDefinitions/feature.js";
16
+ import { CleanupTaskSubtreeUseCase, CleanupTaskSubtreeUseCaseImpl } from "./features/CleanupTaskSubtree/index.js";
17
+ import { TasksCrud } from "./TasksCrud.js";
18
+ import { TriggerTaskFeature } from "./features/TriggerTask/feature.js";
19
+ import { AbortTaskFeature } from "./features/AbortTask/feature.js";
20
+ import { GetTaskFeature } from "./features/GetTask/feature.js";
21
+ import { ListTasksFeature } from "./features/ListTasks/feature.js";
22
+ import { TestingRunTaskDefinition } from "./tasks/testingRunTask.js";
23
+ import { BackgroundTaskPermissionsFeature } from "./features/BackgroundTaskPermissions/feature.js";
24
+ import { GetBackgroundTaskSettingsFeature } from "./features/GetBackgroundTaskSettings/feature.js";
25
+ import { UpdateBackgroundTaskSettingsFeature } from "./features/UpdateBackgroundTaskSettings/feature.js";
26
+ import { BackgroundTasksContextualSchema } from "./graphql/BackgroundTasksContextualSchema.js";
27
+ const BackgroundTasksFeature = createFeature({
28
+ name: "BackgroundTasks",
29
+ register (container) {
30
+ container.register(TaskPrivateModel);
31
+ container.register(TaskLogPrivateModel);
32
+ container.register(BackgroundTaskSettingsModel);
33
+ container.registerDecorator(RunnableTaskDecorator);
34
+ container.registerDecorator(SelfCleaningTaskDecorator);
35
+ TaskHandlerResolverFeature.register(container);
36
+ GetTaskDefinitionFeature.register(container);
37
+ ListTaskDefinitionsFeature.register(container);
38
+ const tasksCrud = {
39
+ ...createDefinitionCrud(container),
40
+ ...createTaskCrud(container),
41
+ ...createServiceCrud(container)
42
+ };
43
+ container.registerInstance(TasksCrud, tasksCrud);
44
+ container.registerInstance(TaskService, tasksCrud);
45
+ TriggerTaskFeature.register(container);
46
+ AbortTaskFeature.register(container);
47
+ GetTaskFeature.register(container);
48
+ ListTasksFeature.register(container);
49
+ container.registerInstance(CleanupTaskSubtreeUseCase, new CleanupTaskSubtreeUseCaseImpl(container.resolve(TasksCrud)));
50
+ TaskExecutionContextFeature.register(container);
51
+ container.register(TaskController);
52
+ container.register(TestingRunTaskDefinition);
53
+ BackgroundTaskPermissionsFeature.register(container);
54
+ GetBackgroundTaskSettingsFeature.register(container);
55
+ UpdateBackgroundTaskSettingsFeature.register(container);
56
+ container.register(BackgroundTasksContextualSchema);
57
+ }
58
+ });
59
+ export { BackgroundTasksFeature };
60
+
61
+ //# sourceMappingURL=BackgroundTasksFeature.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"api/BackgroundTasksFeature.js","sources":["../../src/api/BackgroundTasksFeature.ts"],"sourcesContent":["import { createFeature } from \"@webiny/feature/api\";\nimport { TaskService } from \"@webiny/api-core/features/task/TaskService/index.js\";\nimport { RunnableTaskDecorator } from \"./decorators/RunnableTaskDecorator.js\";\nimport { SelfCleaningTaskDecorator } from \"./decorators/SelfCleaningTaskDecorator.js\";\nimport { TaskController } from \"./features/TaskController/index.js\";\nimport { TaskPrivateModel } from \"./crud/TaskPrivateModel.js\";\nimport { TaskLogPrivateModel } from \"./crud/TaskLogPrivateModel.js\";\nimport { BackgroundTaskSettingsModel } from \"./models/BackgroundTaskSettingsModel.js\";\nimport { createDefinitionCrud } from \"./crud/definition.tasks.js\";\nimport { createServiceCrud } from \"./crud/service.tasks.js\";\nimport { createTaskCrud } from \"./crud/crud.tasks.js\";\nimport { TaskExecutionContextFeature } from \"./features/TaskExecutionContext/feature.js\";\nimport { TaskHandlerResolverFeature } from \"./features/TaskHandlerResolver/feature.js\";\nimport { GetTaskDefinitionFeature } from \"./features/GetTaskDefinition/feature.js\";\nimport { ListTaskDefinitionsFeature } from \"./features/ListTaskDefinitions/feature.js\";\nimport {\n CleanupTaskSubtreeUseCase,\n CleanupTaskSubtreeUseCaseImpl\n} from \"./features/CleanupTaskSubtree/index.js\";\nimport { TasksCrud } from \"./TasksCrud.js\";\nimport { TriggerTaskFeature } from \"./features/TriggerTask/feature.js\";\nimport { AbortTaskFeature } from \"./features/AbortTask/feature.js\";\nimport { GetTaskFeature } from \"./features/GetTask/feature.js\";\nimport { ListTasksFeature } from \"./features/ListTasks/feature.js\";\nimport { TestingRunTaskDefinition } from \"./tasks/testingRunTask.js\";\nimport { BackgroundTaskPermissionsFeature } from \"./features/BackgroundTaskPermissions/feature.js\";\nimport { GetBackgroundTaskSettingsFeature } from \"./features/GetBackgroundTaskSettings/feature.js\";\nimport { UpdateBackgroundTaskSettingsFeature } from \"./features/UpdateBackgroundTaskSettings/feature.js\";\nimport { BackgroundTasksContextualSchema } from \"./graphql/BackgroundTasksContextualSchema.js\";\n\nexport const BackgroundTasksFeature = createFeature({\n name: \"BackgroundTasks\",\n register(container) {\n // Register models at register() time so they are available to GetModelUseCase when the\n // ModelsFetcher cache is first filled (which may happen during an earlier feature's enhance).\n container.register(TaskPrivateModel);\n container.register(TaskLogPrivateModel);\n container.register(BackgroundTaskSettingsModel);\n\n // Decorators wrapping all TaskDefinition instances.\n container.registerDecorator(RunnableTaskDecorator);\n container.registerDecorator(SelfCleaningTaskDecorator);\n\n // Task definition use cases.\n TaskHandlerResolverFeature.register(container);\n GetTaskDefinitionFeature.register(container);\n ListTaskDefinitionsFeature.register(container);\n\n // Build the tasks CRUD facade from the container and register it as the canonical TasksCrud\n // abstraction (plus the legacy TaskService alias). The factory methods resolve TasksCrud\n // lazily for sibling calls, so registering the assembled object up front is sufficient.\n const tasksCrud = {\n ...createDefinitionCrud(container),\n ...createTaskCrud(container),\n ...createServiceCrud(container)\n };\n container.registerInstance(TasksCrud, tasksCrud);\n container.registerInstance(TaskService, tasksCrud);\n\n // Task CRUD use cases (must be after TasksCrud is registered).\n TriggerTaskFeature.register(container);\n AbortTaskFeature.register(container);\n GetTaskFeature.register(container);\n ListTasksFeature.register(container);\n container.registerInstance(\n CleanupTaskSubtreeUseCase,\n new CleanupTaskSubtreeUseCaseImpl(container.resolve(TasksCrud))\n );\n\n // Execution context (singleton), controller, and the built-in test task.\n TaskExecutionContextFeature.register(container);\n container.register(TaskController);\n container.register(TestingRunTaskDefinition);\n\n // Permissions + settings features.\n BackgroundTaskPermissionsFeature.register(container);\n GetBackgroundTaskSettingsFeature.register(container);\n UpdateBackgroundTaskSettingsFeature.register(container);\n\n // GraphQL schema — rendered per-request from the CMS task/log content models.\n container.register(BackgroundTasksContextualSchema);\n }\n});\n"],"names":["BackgroundTasksFeature","createFeature","container","TaskPrivateModel","TaskLogPrivateModel","BackgroundTaskSettingsModel","RunnableTaskDecorator","SelfCleaningTaskDecorator","TaskHandlerResolverFeature","GetTaskDefinitionFeature","ListTaskDefinitionsFeature","tasksCrud","createDefinitionCrud","createTaskCrud","createServiceCrud","TasksCrud","TaskService","TriggerTaskFeature","AbortTaskFeature","GetTaskFeature","ListTasksFeature","CleanupTaskSubtreeUseCase","CleanupTaskSubtreeUseCaseImpl","TaskExecutionContextFeature","TaskController","TestingRunTaskDefinition","BackgroundTaskPermissionsFeature","GetBackgroundTaskSettingsFeature","UpdateBackgroundTaskSettingsFeature","BackgroundTasksContextualSchema"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;AA8BO,MAAMA,yBAAyBC,cAAc;IAChD,MAAM;IACN,UAASC,SAAS;QAGdA,UAAU,QAAQ,CAACC;QACnBD,UAAU,QAAQ,CAACE;QACnBF,UAAU,QAAQ,CAACG;QAGnBH,UAAU,iBAAiB,CAACI;QAC5BJ,UAAU,iBAAiB,CAACK;QAG5BC,2BAA2B,QAAQ,CAACN;QACpCO,yBAAyB,QAAQ,CAACP;QAClCQ,2BAA2B,QAAQ,CAACR;QAKpC,MAAMS,YAAY;YACd,GAAGC,qBAAqBV,UAAU;YAClC,GAAGW,eAAeX,UAAU;YAC5B,GAAGY,kBAAkBZ,UAAU;QACnC;QACAA,UAAU,gBAAgB,CAACa,WAAWJ;QACtCT,UAAU,gBAAgB,CAACc,aAAaL;QAGxCM,mBAAmB,QAAQ,CAACf;QAC5BgB,iBAAiB,QAAQ,CAAChB;QAC1BiB,eAAe,QAAQ,CAACjB;QACxBkB,iBAAiB,QAAQ,CAAClB;QAC1BA,UAAU,gBAAgB,CACtBmB,2BACA,IAAIC,8BAA8BpB,UAAU,OAAO,CAACa;QAIxDQ,4BAA4B,QAAQ,CAACrB;QACrCA,UAAU,QAAQ,CAACsB;QACnBtB,UAAU,QAAQ,CAACuB;QAGnBC,iCAAiC,QAAQ,CAACxB;QAC1CyB,iCAAiC,QAAQ,CAACzB;QAC1C0B,oCAAoC,QAAQ,CAAC1B;QAG7CA,UAAU,QAAQ,CAAC2B;IACvB;AACJ"}
@@ -0,0 +1,10 @@
1
+ import type { ITasksContextObject } from "../api/types.js";
2
+ /**
3
+ * At runtime this is the full tasks facade (CRUD + definition + service methods), assembled and
4
+ * registered by BackgroundTasksFeature. Typed as the full `ITasksContextObject` so sibling calls
5
+ * (e.g. `getDefinition`, `trigger`) type-check.
6
+ */
7
+ export declare const TasksCrud: import("@webiny/di").Abstraction<ITasksContextObject>;
8
+ export declare namespace TasksCrud {
9
+ type Interface = ITasksContextObject;
10
+ }
@@ -0,0 +1,5 @@
1
+ import { createAbstraction } from "@webiny/feature/api";
2
+ const TasksCrud = createAbstraction("Tasks/TasksCrud");
3
+ export { TasksCrud };
4
+
5
+ //# sourceMappingURL=TasksCrud.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"api/TasksCrud.js","sources":["../../src/api/TasksCrud.ts"],"sourcesContent":["import { createAbstraction } from \"@webiny/feature/api\";\nimport type { ITasksContextObject } from \"~/api/types.js\";\n\n/**\n * At runtime this is the full tasks facade (CRUD + definition + service methods), assembled and\n * registered by BackgroundTasksFeature. Typed as the full `ITasksContextObject` so sibling calls\n * (e.g. `getDefinition`, `trigger`) type-check.\n */\nexport const TasksCrud = createAbstraction<ITasksContextObject>(\"Tasks/TasksCrud\");\n\nexport namespace TasksCrud {\n export type Interface = ITasksContextObject;\n}\n"],"names":["TasksCrud","createAbstraction"],"mappings":";AAQO,MAAMA,YAAYC,kBAAuC"}
@@ -0,0 +1 @@
1
+ export type { Timer } from "@webiny/utils/features/Timer/abstraction.js";
File without changes
@@ -0,0 +1 @@
1
+ export { Timer } from "./Timer.js";
@@ -0,0 +1 @@
1
+ export { Timer } from "./Timer.js";
@@ -1,8 +1,8 @@
1
- import type { Context } from "../../api/types.js";
1
+ import type { Container } from "@webiny/di";
2
2
  /**
3
3
  * Recursively deletes the task identified by `rootId`, all its descendants, and
4
4
  * their logs (when the owning definition has databaseLogs=true). Bottom-up,
5
5
  * best-effort: per-record errors are logged and swallowed, the function never
6
6
  * throws.
7
7
  */
8
- export declare const createCleanupTaskSubtree: (context: Context) => (rootId: string) => Promise<void>;
8
+ export declare const createCleanupTaskSubtree: (container: Container) => (rootId: string) => Promise<void>;
@@ -1,6 +1,7 @@
1
- const createCleanupTaskSubtree = (context)=>{
1
+ import { TasksCrud } from "../TasksCrud.js";
2
+ const createCleanupTaskSubtree = (container)=>{
2
3
  const listChildren = async (parentId)=>{
3
- const { items } = await context.tasks.listTasks({
4
+ const { items } = await container.resolve(TasksCrud).listTasks({
4
5
  where: {
5
6
  parentId
6
7
  }
@@ -8,7 +9,7 @@ const createCleanupTaskSubtree = (context)=>{
8
9
  return items;
9
10
  };
10
11
  const collectSubtree = async (rootId)=>{
11
- const root = await context.tasks.getTask(rootId);
12
+ const root = await container.resolve(TasksCrud).getTask(rootId);
12
13
  if (!root) return [];
13
14
  const order = [
14
15
  root
@@ -28,16 +29,16 @@ const createCleanupTaskSubtree = (context)=>{
28
29
  return order.reverse();
29
30
  };
30
31
  const deleteTaskLogs = async (task)=>{
31
- const definition = context.tasks.getDefinition(task.definitionId);
32
+ const definition = container.resolve(TasksCrud).getDefinition(task.definitionId);
32
33
  if (!definition || true !== definition.databaseLogs) return;
33
34
  try {
34
- const { items } = await context.tasks.listLogs({
35
+ const { items } = await container.resolve(TasksCrud).listLogs({
35
36
  where: {
36
37
  task: task.id
37
38
  }
38
39
  });
39
40
  for (const log of items)try {
40
- await context.tasks.deleteLog(log.id);
41
+ await container.resolve(TasksCrud).deleteLog(log.id);
41
42
  } catch (ex) {
42
43
  console.warn(`cleanupTaskSubtree: failed to delete log "${log.id}" for task "${task.id}": ${ex.message}`);
43
44
  }
@@ -50,7 +51,7 @@ const createCleanupTaskSubtree = (context)=>{
50
51
  for (const task of ordered){
51
52
  await deleteTaskLogs(task);
52
53
  try {
53
- await context.tasks.deleteTask(task.id);
54
+ await container.resolve(TasksCrud).deleteTask(task.id);
54
55
  } catch (ex) {
55
56
  console.warn(`cleanupTaskSubtree: failed to delete task "${task.id}": ${ex.message}`);
56
57
  }
@@ -1 +1 @@
1
- {"version":3,"file":"api/crud/cleanupTaskSubtree.js","sources":["../../../src/api/crud/cleanupTaskSubtree.ts"],"sourcesContent":["import type { Context, ITask } from \"~/api/types.js\";\n\n/**\n * Recursively deletes the task identified by `rootId`, all its descendants, and\n * their logs (when the owning definition has databaseLogs=true). Bottom-up,\n * best-effort: per-record errors are logged and swallowed, the function never\n * throws.\n */\nexport const createCleanupTaskSubtree = (context: Context) => {\n const listChildren = async (parentId: string): Promise<ITask[]> => {\n const { items } = await context.tasks.listTasks({\n where: { parentId }\n });\n return items;\n };\n\n const collectSubtree = async (rootId: string): Promise<ITask[]> => {\n const root = await context.tasks.getTask(rootId);\n if (!root) {\n return [];\n }\n const order: ITask[] = [root];\n const seen = new Set<string>([root.id]);\n let i = 0;\n while (i < order.length) {\n const current = order[i++];\n const kids = await listChildren(current.id);\n for (const kid of kids) {\n if (seen.has(kid.id)) {\n continue;\n }\n seen.add(kid.id);\n order.push(kid);\n }\n }\n return order.reverse();\n };\n\n const deleteTaskLogs = async (task: ITask): Promise<void> => {\n const definition = context.tasks.getDefinition(task.definitionId);\n if (!definition || definition.databaseLogs !== true) {\n return;\n }\n try {\n const { items } = await context.tasks.listLogs({\n where: { task: task.id }\n });\n for (const log of items) {\n try {\n await context.tasks.deleteLog(log.id);\n } catch (ex: any) {\n console.warn(\n `cleanupTaskSubtree: failed to delete log \"${log.id}\" for task \"${task.id}\": ${ex.message}`\n );\n }\n }\n } catch (ex: any) {\n console.warn(\n `cleanupTaskSubtree: failed to list logs for task \"${task.id}\": ${ex.message}`\n );\n }\n };\n\n return async (rootId: string): Promise<void> => {\n const ordered = await collectSubtree(rootId);\n for (const task of ordered) {\n await deleteTaskLogs(task);\n try {\n await context.tasks.deleteTask(task.id);\n } catch (ex: any) {\n console.warn(\n `cleanupTaskSubtree: failed to delete task \"${task.id}\": ${ex.message}`\n );\n }\n }\n };\n};\n"],"names":["createCleanupTaskSubtree","context","listChildren","parentId","items","collectSubtree","rootId","root","order","seen","Set","i","current","kids","kid","deleteTaskLogs","task","definition","log","ex","console","ordered"],"mappings":"AAQO,MAAMA,2BAA2B,CAACC;IACrC,MAAMC,eAAe,OAAOC;QACxB,MAAM,EAAEC,KAAK,EAAE,GAAG,MAAMH,QAAQ,KAAK,CAAC,SAAS,CAAC;YAC5C,OAAO;gBAAEE;YAAS;QACtB;QACA,OAAOC;IACX;IAEA,MAAMC,iBAAiB,OAAOC;QAC1B,MAAMC,OAAO,MAAMN,QAAQ,KAAK,CAAC,OAAO,CAACK;QACzC,IAAI,CAACC,MACD,OAAO,EAAE;QAEb,MAAMC,QAAiB;YAACD;SAAK;QAC7B,MAAME,OAAO,IAAIC,IAAY;YAACH,KAAK,EAAE;SAAC;QACtC,IAAII,IAAI;QACR,MAAOA,IAAIH,MAAM,MAAM,CAAE;YACrB,MAAMI,UAAUJ,KAAK,CAACG,IAAI;YAC1B,MAAME,OAAO,MAAMX,aAAaU,QAAQ,EAAE;YAC1C,KAAK,MAAME,OAAOD,KACd,KAAIJ,KAAK,GAAG,CAACK,IAAI,EAAE;gBAGnBL,KAAK,GAAG,CAACK,IAAI,EAAE;gBACfN,MAAM,IAAI,CAACM;;QAEnB;QACA,OAAON,MAAM,OAAO;IACxB;IAEA,MAAMO,iBAAiB,OAAOC;QAC1B,MAAMC,aAAahB,QAAQ,KAAK,CAAC,aAAa,CAACe,KAAK,YAAY;QAChE,IAAI,CAACC,cAAcA,AAA4B,SAA5BA,WAAW,YAAY,EACtC;QAEJ,IAAI;YACA,MAAM,EAAEb,KAAK,EAAE,GAAG,MAAMH,QAAQ,KAAK,CAAC,QAAQ,CAAC;gBAC3C,OAAO;oBAAE,MAAMe,KAAK,EAAE;gBAAC;YAC3B;YACA,KAAK,MAAME,OAAOd,MACd,IAAI;gBACA,MAAMH,QAAQ,KAAK,CAAC,SAAS,CAACiB,IAAI,EAAE;YACxC,EAAE,OAAOC,IAAS;gBACdC,QAAQ,IAAI,CACR,CAAC,0CAA0C,EAAEF,IAAI,EAAE,CAAC,YAAY,EAAEF,KAAK,EAAE,CAAC,GAAG,EAAEG,GAAG,OAAO,EAAE;YAEnG;QAER,EAAE,OAAOA,IAAS;YACdC,QAAQ,IAAI,CACR,CAAC,kDAAkD,EAAEJ,KAAK,EAAE,CAAC,GAAG,EAAEG,GAAG,OAAO,EAAE;QAEtF;IACJ;IAEA,OAAO,OAAOb;QACV,MAAMe,UAAU,MAAMhB,eAAeC;QACrC,KAAK,MAAMU,QAAQK,QAAS;YACxB,MAAMN,eAAeC;YACrB,IAAI;gBACA,MAAMf,QAAQ,KAAK,CAAC,UAAU,CAACe,KAAK,EAAE;YAC1C,EAAE,OAAOG,IAAS;gBACdC,QAAQ,IAAI,CACR,CAAC,2CAA2C,EAAEJ,KAAK,EAAE,CAAC,GAAG,EAAEG,GAAG,OAAO,EAAE;YAE/E;QACJ;IACJ;AACJ"}
1
+ {"version":3,"file":"api/crud/cleanupTaskSubtree.js","sources":["../../../src/api/crud/cleanupTaskSubtree.ts"],"sourcesContent":["import type { Container } from \"@webiny/di\";\nimport type { ITask } from \"~/api/types.js\";\nimport { TasksCrud } from \"~/api/TasksCrud.js\";\n\n/**\n * Recursively deletes the task identified by `rootId`, all its descendants, and\n * their logs (when the owning definition has databaseLogs=true). Bottom-up,\n * best-effort: per-record errors are logged and swallowed, the function never\n * throws.\n */\nexport const createCleanupTaskSubtree = (container: Container) => {\n const listChildren = async (parentId: string): Promise<ITask[]> => {\n const { items } = await container.resolve(TasksCrud).listTasks({\n where: { parentId }\n });\n return items;\n };\n\n const collectSubtree = async (rootId: string): Promise<ITask[]> => {\n const root = await container.resolve(TasksCrud).getTask(rootId);\n if (!root) {\n return [];\n }\n const order: ITask[] = [root];\n const seen = new Set<string>([root.id]);\n let i = 0;\n while (i < order.length) {\n const current = order[i++];\n const kids = await listChildren(current.id);\n for (const kid of kids) {\n if (seen.has(kid.id)) {\n continue;\n }\n seen.add(kid.id);\n order.push(kid);\n }\n }\n return order.reverse();\n };\n\n const deleteTaskLogs = async (task: ITask): Promise<void> => {\n const definition = container.resolve(TasksCrud).getDefinition(task.definitionId);\n if (!definition || definition.databaseLogs !== true) {\n return;\n }\n try {\n const { items } = await container.resolve(TasksCrud).listLogs({\n where: { task: task.id }\n });\n for (const log of items) {\n try {\n await container.resolve(TasksCrud).deleteLog(log.id);\n } catch (ex: any) {\n console.warn(\n `cleanupTaskSubtree: failed to delete log \"${log.id}\" for task \"${task.id}\": ${ex.message}`\n );\n }\n }\n } catch (ex: any) {\n console.warn(\n `cleanupTaskSubtree: failed to list logs for task \"${task.id}\": ${ex.message}`\n );\n }\n };\n\n return async (rootId: string): Promise<void> => {\n const ordered = await collectSubtree(rootId);\n for (const task of ordered) {\n await deleteTaskLogs(task);\n try {\n await container.resolve(TasksCrud).deleteTask(task.id);\n } catch (ex: any) {\n console.warn(\n `cleanupTaskSubtree: failed to delete task \"${task.id}\": ${ex.message}`\n );\n }\n }\n };\n};\n"],"names":["createCleanupTaskSubtree","container","listChildren","parentId","items","TasksCrud","collectSubtree","rootId","root","order","seen","Set","i","current","kids","kid","deleteTaskLogs","task","definition","log","ex","console","ordered"],"mappings":";AAUO,MAAMA,2BAA2B,CAACC;IACrC,MAAMC,eAAe,OAAOC;QACxB,MAAM,EAAEC,KAAK,EAAE,GAAG,MAAMH,UAAU,OAAO,CAACI,WAAW,SAAS,CAAC;YAC3D,OAAO;gBAAEF;YAAS;QACtB;QACA,OAAOC;IACX;IAEA,MAAME,iBAAiB,OAAOC;QAC1B,MAAMC,OAAO,MAAMP,UAAU,OAAO,CAACI,WAAW,OAAO,CAACE;QACxD,IAAI,CAACC,MACD,OAAO,EAAE;QAEb,MAAMC,QAAiB;YAACD;SAAK;QAC7B,MAAME,OAAO,IAAIC,IAAY;YAACH,KAAK,EAAE;SAAC;QACtC,IAAII,IAAI;QACR,MAAOA,IAAIH,MAAM,MAAM,CAAE;YACrB,MAAMI,UAAUJ,KAAK,CAACG,IAAI;YAC1B,MAAME,OAAO,MAAMZ,aAAaW,QAAQ,EAAE;YAC1C,KAAK,MAAME,OAAOD,KACd,KAAIJ,KAAK,GAAG,CAACK,IAAI,EAAE;gBAGnBL,KAAK,GAAG,CAACK,IAAI,EAAE;gBACfN,MAAM,IAAI,CAACM;;QAEnB;QACA,OAAON,MAAM,OAAO;IACxB;IAEA,MAAMO,iBAAiB,OAAOC;QAC1B,MAAMC,aAAajB,UAAU,OAAO,CAACI,WAAW,aAAa,CAACY,KAAK,YAAY;QAC/E,IAAI,CAACC,cAAcA,AAA4B,SAA5BA,WAAW,YAAY,EACtC;QAEJ,IAAI;YACA,MAAM,EAAEd,KAAK,EAAE,GAAG,MAAMH,UAAU,OAAO,CAACI,WAAW,QAAQ,CAAC;gBAC1D,OAAO;oBAAE,MAAMY,KAAK,EAAE;gBAAC;YAC3B;YACA,KAAK,MAAME,OAAOf,MACd,IAAI;gBACA,MAAMH,UAAU,OAAO,CAACI,WAAW,SAAS,CAACc,IAAI,EAAE;YACvD,EAAE,OAAOC,IAAS;gBACdC,QAAQ,IAAI,CACR,CAAC,0CAA0C,EAAEF,IAAI,EAAE,CAAC,YAAY,EAAEF,KAAK,EAAE,CAAC,GAAG,EAAEG,GAAG,OAAO,EAAE;YAEnG;QAER,EAAE,OAAOA,IAAS;YACdC,QAAQ,IAAI,CACR,CAAC,kDAAkD,EAAEJ,KAAK,EAAE,CAAC,GAAG,EAAEG,GAAG,OAAO,EAAE;QAEtF;IACJ;IAEA,OAAO,OAAOb;QACV,MAAMe,UAAU,MAAMhB,eAAeC;QACrC,KAAK,MAAMU,QAAQK,QAAS;YACxB,MAAMN,eAAeC;YACrB,IAAI;gBACA,MAAMhB,UAAU,OAAO,CAACI,WAAW,UAAU,CAACY,KAAK,EAAE;YACzD,EAAE,OAAOG,IAAS;gBACdC,QAAQ,IAAI,CACR,CAAC,2CAA2C,EAAEJ,KAAK,EAAE,CAAC,GAAG,EAAEG,GAAG,OAAO,EAAE;YAE/E;QACJ;IACJ;AACJ"}
@@ -1,2 +1,3 @@
1
- import type { Context, ITasksContextCrudObject } from "../../api/types.js";
2
- export declare const createTaskCrud: (context: Context) => ITasksContextCrudObject;
1
+ import type { Container } from "@webiny/di";
2
+ import type { ITasksContextCrudObject } from "../../api/types.js";
3
+ export declare const createTaskCrud: (container: Container) => ITasksContextCrudObject;
@@ -1,8 +1,9 @@
1
1
  import error from "@webiny/error";
2
2
  import { TaskDataStatus } from "../types.js";
3
+ import { TasksCrud } from "../TasksCrud.js";
3
4
  import { WEBINY_TASK_MODEL_ID } from "./TaskPrivateModel.js";
4
5
  import { WEBINY_TASK_LOG_MODEL_ID } from "./TaskLogPrivateModel.js";
5
- import { NotFoundError } from "@webiny/handler-graphql";
6
+ import { NotFoundError } from "@webiny/api-graphql";
6
7
  import { createZodError, parseIdentifier } from "@webiny/utils";
7
8
  import zod from "zod";
8
9
  import { GetModelUseCase } from "@webiny/api-headless-cms/features/contentModel/GetModel";
@@ -64,31 +65,31 @@ const validateTaskInput = async (params)=>{
64
65
  if (result.success) return;
65
66
  throw createZodError(result.error);
66
67
  };
67
- const createTaskCrud = (context)=>{
68
- const cmsWhereMapper = context.container.resolve(CmsWhereMapper);
68
+ const createTaskCrud = (container)=>{
69
+ const getCmsWhereMapper = ()=>container.resolve(CmsWhereMapper);
69
70
  const getTaskModel = async ()=>{
70
- const identityContext = context.container.resolve(IdentityContext);
71
+ const identityContext = container.resolve(IdentityContext);
71
72
  return await identityContext.withoutAuthorization(async ()=>{
72
- const getModel = context.container.resolve(GetModelUseCase);
73
+ const getModel = container.resolve(GetModelUseCase);
73
74
  const result = await getModel.execute(WEBINY_TASK_MODEL_ID);
74
75
  if (result.isFail()) throw new error(`There is no model "${WEBINY_TASK_MODEL_ID}".`);
75
76
  return result.value;
76
77
  });
77
78
  };
78
79
  const getLogModel = async ()=>{
79
- const identityContext = context.container.resolve(IdentityContext);
80
+ const identityContext = container.resolve(IdentityContext);
80
81
  return await identityContext.withoutAuthorization(async ()=>{
81
- const getModel = context.container.resolve(GetModelUseCase);
82
+ const getModel = container.resolve(GetModelUseCase);
82
83
  const result = await getModel.execute(WEBINY_TASK_LOG_MODEL_ID);
83
84
  if (result.isFail()) throw new error(`There is no model "${WEBINY_TASK_LOG_MODEL_ID}".`);
84
85
  return result.value;
85
86
  });
86
87
  };
87
88
  const getTask = async (id)=>{
88
- const identityContext = context.container.resolve(IdentityContext);
89
+ const identityContext = container.resolve(IdentityContext);
89
90
  const entry = await identityContext.withoutAuthorization(async ()=>{
90
91
  const model = await getTaskModel();
91
- const getEntryById = context.container.resolve(GetEntryByIdUseCase);
92
+ const getEntryById = container.resolve(GetEntryByIdUseCase);
92
93
  const result = await getEntryById.execute(model, createRevisionId(id));
93
94
  if (result.isFail()) return null;
94
95
  return result.value;
@@ -97,13 +98,13 @@ const createTaskCrud = (context)=>{
97
98
  return convertToTask(entry);
98
99
  };
99
100
  const listTasks = async (params)=>{
100
- const identityContext = context.container.resolve(IdentityContext);
101
+ const identityContext = container.resolve(IdentityContext);
101
102
  const { entries, meta } = await identityContext.withoutAuthorization(async ()=>{
102
103
  const model = await getTaskModel();
103
- const listLatestEntries = context.container.resolve(ListLatestEntriesUseCase);
104
+ const listLatestEntries = container.resolve(ListLatestEntriesUseCase);
104
105
  const result = await listLatestEntries.execute(model, {
105
106
  ...params,
106
- where: cmsWhereMapper.map({
107
+ where: getCmsWhereMapper().map({
107
108
  input: params?.where,
108
109
  fields: model.fields
109
110
  })
@@ -117,22 +118,21 @@ const createTaskCrud = (context)=>{
117
118
  };
118
119
  };
119
120
  const createTask = async (data)=>{
120
- const definition = context.tasks.getDefinition(data.definitionId);
121
+ const definition = container.resolve(TasksCrud).getDefinition(data.definitionId);
121
122
  if (!definition) throw new TaskDefinitionNotFoundError(data.definitionId);
122
123
  await validateTaskInput({
123
- context,
124
124
  definition,
125
125
  data
126
126
  });
127
- const identityContext = context.container.resolve(IdentityContext);
128
- const eventPublisher = context.container.resolve(EventPublisher);
127
+ const identityContext = container.resolve(IdentityContext);
128
+ const eventPublisher = container.resolve(EventPublisher);
129
129
  const beforeCreateEvent = new TaskBeforeCreateEvent({
130
130
  input: data
131
131
  });
132
132
  await eventPublisher.publish(beforeCreateEvent);
133
133
  const result = await identityContext.withoutAuthorization(async ()=>{
134
134
  const model = await getTaskModel();
135
- const createEntry = context.container.resolve(CreateEntryUseCase);
135
+ const createEntry = container.resolve(CreateEntryUseCase);
136
136
  return createEntry.execute(model, {
137
137
  values: {
138
138
  ...data,
@@ -153,8 +153,8 @@ const createTaskCrud = (context)=>{
153
153
  const updateTask = async (id, data)=>{
154
154
  const original = await getTask(id);
155
155
  if (!original) throw new TaskNotFoundError();
156
- const identityContext = context.container.resolve(IdentityContext);
157
- const eventPublisher = context.container.resolve(EventPublisher);
156
+ const identityContext = container.resolve(IdentityContext);
157
+ const eventPublisher = container.resolve(EventPublisher);
158
158
  const beforeUpdateEvent = new TaskBeforeUpdateEvent({
159
159
  input: data,
160
160
  original
@@ -162,7 +162,7 @@ const createTaskCrud = (context)=>{
162
162
  await eventPublisher.publish(beforeUpdateEvent);
163
163
  const result = await identityContext.withoutAuthorization(async ()=>{
164
164
  const model = await getTaskModel();
165
- const updateEntry = context.container.resolve(UpdateEntryUseCase);
165
+ const updateEntry = container.resolve(UpdateEntryUseCase);
166
166
  return updateEntry.execute(model, createRevisionId(id), {
167
167
  values: {
168
168
  ...data
@@ -181,15 +181,15 @@ const createTaskCrud = (context)=>{
181
181
  const deleteTask = async (id)=>{
182
182
  const task = await getTask(id);
183
183
  if (!task) throw new TaskNotFoundError();
184
- const identityContext = context.container.resolve(IdentityContext);
185
- const eventPublisher = context.container.resolve(EventPublisher);
184
+ const identityContext = container.resolve(IdentityContext);
185
+ const eventPublisher = container.resolve(EventPublisher);
186
186
  const beforeDeleteEvent = new TaskBeforeDeleteEvent({
187
187
  task
188
188
  });
189
189
  await eventPublisher.publish(beforeDeleteEvent);
190
190
  const result = await identityContext.withoutAuthorization(async ()=>{
191
191
  const model = await getTaskModel();
192
- const deleteEntry = context.container.resolve(DeleteEntryUseCase);
192
+ const deleteEntry = container.resolve(DeleteEntryUseCase);
193
193
  return deleteEntry.execute(model, createRevisionId(id));
194
194
  });
195
195
  if (result.isFail()) throw new TaskNotFoundError();
@@ -200,10 +200,10 @@ const createTaskCrud = (context)=>{
200
200
  return true;
201
201
  };
202
202
  const createLog = async (task, data)=>{
203
- const identityContext = context.container.resolve(IdentityContext);
203
+ const identityContext = container.resolve(IdentityContext);
204
204
  const result = await identityContext.withoutAuthorization(async ()=>{
205
205
  const model = await getLogModel();
206
- const createEntry = context.container.resolve(CreateEntryUseCase);
206
+ const createEntry = container.resolve(CreateEntryUseCase);
207
207
  return createEntry.execute(model, {
208
208
  values: {
209
209
  ...data,
@@ -215,10 +215,10 @@ const createTaskCrud = (context)=>{
215
215
  return convertToLog(result.value);
216
216
  };
217
217
  const updateLog = async (id, data)=>{
218
- const identityContext = context.container.resolve(IdentityContext);
218
+ const identityContext = container.resolve(IdentityContext);
219
219
  const result = await identityContext.withoutAuthorization(async ()=>{
220
220
  const model = await getLogModel();
221
- const updateEntry = context.container.resolve(UpdateEntryUseCase);
221
+ const updateEntry = container.resolve(UpdateEntryUseCase);
222
222
  return updateEntry.execute(model, createRevisionId(id), {
223
223
  values: data
224
224
  });
@@ -227,21 +227,21 @@ const createTaskCrud = (context)=>{
227
227
  return convertToLog(result.value);
228
228
  };
229
229
  const deleteLog = async (id)=>{
230
- const identityContext = context.container.resolve(IdentityContext);
230
+ const identityContext = container.resolve(IdentityContext);
231
231
  const result = await identityContext.withoutAuthorization(async ()=>{
232
232
  const model = await getLogModel();
233
- const deleteEntry = context.container.resolve(DeleteEntryUseCase);
233
+ const deleteEntry = container.resolve(DeleteEntryUseCase);
234
234
  return deleteEntry.execute(model, id);
235
235
  });
236
236
  if (result.isFail()) throw new TaskLogNotFoundError();
237
237
  return true;
238
238
  };
239
239
  const getLog = async (id)=>{
240
- const identityContext = context.container.resolve(IdentityContext);
240
+ const identityContext = container.resolve(IdentityContext);
241
241
  try {
242
242
  const result = await identityContext.withoutAuthorization(async ()=>{
243
243
  const model = await getLogModel();
244
- const getEntryById = context.container.resolve(GetEntryByIdUseCase);
244
+ const getEntryById = container.resolve(GetEntryByIdUseCase);
245
245
  return getEntryById.execute(model, id);
246
246
  });
247
247
  if (result.isFail()) throw result.error;
@@ -252,10 +252,10 @@ const createTaskCrud = (context)=>{
252
252
  }
253
253
  };
254
254
  const getLatestLog = async (taskId)=>{
255
- const identityContext = context.container.resolve(IdentityContext);
255
+ const identityContext = container.resolve(IdentityContext);
256
256
  const entry = await identityContext.withoutAuthorization(async ()=>{
257
257
  const model = await getLogModel();
258
- const listLatestEntries = context.container.resolve(ListLatestEntriesUseCase);
258
+ const listLatestEntries = container.resolve(ListLatestEntriesUseCase);
259
259
  const result = await listLatestEntries.execute(model, {
260
260
  where: {
261
261
  values: {
@@ -275,15 +275,15 @@ const createTaskCrud = (context)=>{
275
275
  });
276
276
  return convertToLog(entry);
277
277
  };
278
- const cleanupTaskSubtree = createCleanupTaskSubtree(context);
278
+ const cleanupTaskSubtree = createCleanupTaskSubtree(container);
279
279
  const listLogs = async (params)=>{
280
- const identityContext = context.container.resolve(IdentityContext);
280
+ const identityContext = container.resolve(IdentityContext);
281
281
  const { entries, meta } = await identityContext.withoutAuthorization(async ()=>{
282
282
  const model = await getLogModel();
283
- const listLatestEntries = context.container.resolve(ListLatestEntriesUseCase);
283
+ const listLatestEntries = container.resolve(ListLatestEntriesUseCase);
284
284
  const result = await listLatestEntries.execute(model, {
285
285
  ...params,
286
- where: cmsWhereMapper.map({
286
+ where: getCmsWhereMapper().map({
287
287
  input: params.where,
288
288
  fields: model.fields
289
289
  })