@webiny/webhooks 6.4.0-beta.3 → 6.4.0-beta.4

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 (142) hide show
  1. package/admin/WebhookRoutes.js +13 -2
  2. package/admin/WebhookRoutes.js.map +1 -1
  3. package/admin/Webhooks.js +0 -3
  4. package/admin/Webhooks.js.map +1 -1
  5. package/admin/features/getWebhookSettings/GetWebhookSettingsGateway.js +1 -0
  6. package/admin/features/getWebhookSettings/GetWebhookSettingsGateway.js.map +1 -1
  7. package/admin/features/listWebhookDeliveries/ListWebhookDeliveriesGateway.js +1 -1
  8. package/admin/features/listWebhookDeliveries/ListWebhookDeliveriesGateway.js.map +1 -1
  9. package/admin/features/listWebhookDeliveries/abstractions.d.ts +6 -1
  10. package/admin/features/listWebhookDeliveries/abstractions.js.map +1 -1
  11. package/admin/features/updateWebhookSettings/UpdateWebhookSettingsGateway.js +1 -0
  12. package/admin/features/updateWebhookSettings/UpdateWebhookSettingsGateway.js.map +1 -1
  13. package/admin/features/updateWebhookSettings/abstractions.d.ts +1 -0
  14. package/admin/features/updateWebhookSettings/abstractions.js.map +1 -1
  15. package/admin/presentation/{WebhookDeliveries → WebhookDeliveriesPage}/WebhookDeliveriesDataSource.d.ts +1 -2
  16. package/admin/presentation/{WebhookDeliveries → WebhookDeliveriesPage}/WebhookDeliveriesDataSource.js +5 -7
  17. package/admin/presentation/WebhookDeliveriesPage/WebhookDeliveriesDataSource.js.map +1 -0
  18. package/admin/presentation/WebhookDeliveriesPage/WebhookDeliveriesPagePresenter.d.ts +41 -0
  19. package/admin/presentation/WebhookDeliveriesPage/WebhookDeliveriesPagePresenter.js +223 -0
  20. package/admin/presentation/WebhookDeliveriesPage/WebhookDeliveriesPagePresenter.js.map +1 -0
  21. package/admin/presentation/WebhookDeliveriesPage/abstractions.d.ts +42 -0
  22. package/admin/presentation/WebhookDeliveriesPage/abstractions.js +5 -0
  23. package/admin/presentation/WebhookDeliveriesPage/abstractions.js.map +1 -0
  24. package/admin/presentation/WebhookDeliveriesPage/components/DeliveryAccordionRow.d.ts +11 -0
  25. package/admin/presentation/WebhookDeliveriesPage/components/DeliveryAccordionRow.js +36 -0
  26. package/admin/presentation/WebhookDeliveriesPage/components/DeliveryAccordionRow.js.map +1 -0
  27. package/admin/presentation/WebhookDeliveriesPage/components/DeliveryBottomInfoBar.d.ts +9 -0
  28. package/admin/presentation/WebhookDeliveriesPage/components/DeliveryBottomInfoBar.js +43 -0
  29. package/admin/presentation/WebhookDeliveriesPage/components/DeliveryBottomInfoBar.js.map +1 -0
  30. package/admin/presentation/WebhookDeliveriesPage/components/DeliveryDetailContent.d.ts +7 -0
  31. package/admin/presentation/WebhookDeliveriesPage/components/DeliveryDetailContent.js +76 -0
  32. package/admin/presentation/WebhookDeliveriesPage/components/DeliveryDetailContent.js.map +1 -0
  33. package/admin/presentation/WebhookDeliveriesPage/components/DeliveryFilters.d.ts +9 -0
  34. package/admin/presentation/WebhookDeliveriesPage/components/DeliveryFilters.js +85 -0
  35. package/admin/presentation/WebhookDeliveriesPage/components/DeliveryFilters.js.map +1 -0
  36. package/admin/presentation/WebhookDeliveriesPage/components/DeliveryList.d.ts +9 -0
  37. package/admin/presentation/WebhookDeliveriesPage/components/DeliveryList.js +61 -0
  38. package/admin/presentation/WebhookDeliveriesPage/components/DeliveryList.js.map +1 -0
  39. package/admin/presentation/WebhookDeliveriesPage/components/WebhookDefinitionsButton.d.ts +2 -0
  40. package/admin/presentation/WebhookDeliveriesPage/components/WebhookDefinitionsButton.js +16 -0
  41. package/admin/presentation/WebhookDeliveriesPage/components/WebhookDefinitionsButton.js.map +1 -0
  42. package/admin/presentation/WebhookDeliveriesPage/components/WebhookDeliveriesPage.d.ts +2 -0
  43. package/admin/presentation/WebhookDeliveriesPage/components/WebhookDeliveriesPage.js +73 -0
  44. package/admin/presentation/WebhookDeliveriesPage/components/WebhookDeliveriesPage.js.map +1 -0
  45. package/admin/presentation/WebhookDeliveriesPage/components/statusVariant.d.ts +1 -0
  46. package/admin/presentation/WebhookDeliveriesPage/components/statusVariant.js +13 -0
  47. package/admin/presentation/WebhookDeliveriesPage/components/statusVariant.js.map +1 -0
  48. package/admin/presentation/WebhookDeliveriesPage/feature.d.ts +3 -0
  49. package/admin/presentation/WebhookDeliveriesPage/feature.js +17 -0
  50. package/admin/presentation/WebhookDeliveriesPage/feature.js.map +1 -0
  51. package/admin/presentation/WebhookDeliveriesPage/index.d.ts +5 -0
  52. package/admin/presentation/WebhookDeliveriesPage/index.js +1 -0
  53. package/admin/presentation/WebhookForm/WebhookFormPresenter.d.ts +6 -6
  54. package/admin/presentation/WebhookForm/WebhookFormPresenter.js +83 -72
  55. package/admin/presentation/WebhookForm/WebhookFormPresenter.js.map +1 -1
  56. package/admin/presentation/WebhookForm/abstractions.d.ts +2 -9
  57. package/admin/presentation/WebhookForm/abstractions.js.map +1 -1
  58. package/admin/presentation/WebhookForm/components/SigningSecret.d.ts +5 -2
  59. package/admin/presentation/WebhookForm/components/SigningSecret.js +7 -3
  60. package/admin/presentation/WebhookForm/components/SigningSecret.js.map +1 -1
  61. package/admin/presentation/WebhookForm/components/WebhookFormView.js +49 -35
  62. package/admin/presentation/WebhookForm/components/WebhookFormView.js.map +1 -1
  63. package/admin/presentation/WebhookList/WebhookListPresenter.d.ts +26 -2
  64. package/admin/presentation/WebhookList/WebhookListPresenter.js +36 -34
  65. package/admin/presentation/WebhookList/WebhookListPresenter.js.map +1 -1
  66. package/admin/presentation/WebhookList/abstractions.d.ts +25 -7
  67. package/admin/presentation/WebhookList/abstractions.js.map +1 -1
  68. package/admin/presentation/WebhookList/components/CreateWebhookButton.d.ts +2 -0
  69. package/admin/presentation/WebhookList/components/CreateWebhookButton.js +22 -0
  70. package/admin/presentation/WebhookList/components/CreateWebhookButton.js.map +1 -0
  71. package/admin/presentation/WebhookList/components/WebhookDeliveriesButton.d.ts +2 -0
  72. package/admin/presentation/WebhookList/components/WebhookDeliveriesButton.js +16 -0
  73. package/admin/presentation/WebhookList/components/WebhookDeliveriesButton.js.map +1 -0
  74. package/admin/presentation/WebhookList/components/WebhookListContent.d.ts +9 -0
  75. package/admin/presentation/WebhookList/components/WebhookListContent.js +170 -0
  76. package/admin/presentation/WebhookList/components/WebhookListContent.js.map +1 -0
  77. package/admin/presentation/WebhookList/components/WebhookListView.js +10 -140
  78. package/admin/presentation/WebhookList/components/WebhookListView.js.map +1 -1
  79. package/admin/presentation/WebhookSettings/WebhookSettingsPresenter.js +14 -6
  80. package/admin/presentation/WebhookSettings/WebhookSettingsPresenter.js.map +1 -1
  81. package/admin/routes.d.ts +4 -1
  82. package/admin/routes.js +11 -4
  83. package/admin/routes.js.map +1 -1
  84. package/admin/shared/types.d.ts +1 -0
  85. package/api/domain/WebhookDelivery.d.ts +0 -1
  86. package/api/domain/WebhookSettings.d.ts +1 -0
  87. package/api/domain/constants.d.ts +1 -1
  88. package/api/domain/constants.js +2 -2
  89. package/api/domain/constants.js.map +1 -1
  90. package/api/features/CreateWebhookDelivery/CreateWebhookDeliveryRepository.d.ts +1 -1
  91. package/api/features/CreateWebhookDelivery/CreateWebhookDeliveryRepository.js +3 -1
  92. package/api/features/CreateWebhookDelivery/CreateWebhookDeliveryRepository.js.map +1 -1
  93. package/api/features/CreateWebhookDelivery/abstractions.d.ts +1 -1
  94. package/api/features/CreateWebhookDelivery/abstractions.js.map +1 -1
  95. package/api/features/GetWebhookSettings/GetWebhookSettingsRepository.js +4 -2
  96. package/api/features/GetWebhookSettings/GetWebhookSettingsRepository.js.map +1 -1
  97. package/api/features/ResendWebhookDelivery/ResendWebhookDeliveryUseCase.d.ts +3 -1
  98. package/api/features/ResendWebhookDelivery/ResendWebhookDeliveryUseCase.js +9 -4
  99. package/api/features/ResendWebhookDelivery/ResendWebhookDeliveryUseCase.js.map +1 -1
  100. package/api/features/SendWebhookTask/SendWebhookTask.d.ts +1 -1
  101. package/api/features/SendWebhookTask/SendWebhookTask.js +1 -1
  102. package/api/features/SendWebhookTask/SendWebhookTask.js.map +1 -1
  103. package/api/features/TriggerWebhook/TriggerWebhookUseCase.d.ts +3 -1
  104. package/api/features/TriggerWebhook/TriggerWebhookUseCase.js +9 -4
  105. package/api/features/TriggerWebhook/TriggerWebhookUseCase.js.map +1 -1
  106. package/api/features/UpdateWebhookSettings/UpdateWebhookSettingsRepository.js +4 -2
  107. package/api/features/UpdateWebhookSettings/UpdateWebhookSettingsRepository.js.map +1 -1
  108. package/api/features/UpdateWebhookSettings/abstractions.d.ts +1 -0
  109. package/api/features/UpdateWebhookSettings/abstractions.js.map +1 -1
  110. package/api/features/UpdateWebhookSettings/schema.d.ts +1 -0
  111. package/api/features/UpdateWebhookSettings/schema.js +3 -1
  112. package/api/features/UpdateWebhookSettings/schema.js.map +1 -1
  113. package/api/features/WebhookDispatcher/WebhookDispatcher.d.ts +3 -1
  114. package/api/features/WebhookDispatcher/WebhookDispatcher.js +9 -4
  115. package/api/features/WebhookDispatcher/WebhookDispatcher.js.map +1 -1
  116. package/api/graphql/WebhookDeliverySchema.js +12 -8
  117. package/api/graphql/WebhookDeliverySchema.js.map +1 -1
  118. package/api/graphql/WebhookEventSchema.js +1 -0
  119. package/api/graphql/WebhookEventSchema.js.map +1 -1
  120. package/api/graphql/WebhookSettingsSchema.js +2 -0
  121. package/api/graphql/WebhookSettingsSchema.js.map +1 -1
  122. package/api/models/WebhookSettingsModel.js +3 -2
  123. package/api/models/WebhookSettingsModel.js.map +1 -1
  124. package/package.json +24 -22
  125. package/admin/presentation/WebhookDeliveries/WebhookDeliveriesDataSource.js.map +0 -1
  126. package/admin/presentation/WebhookDeliveries/WebhookDeliveriesPresenter.d.ts +0 -19
  127. package/admin/presentation/WebhookDeliveries/WebhookDeliveriesPresenter.js +0 -77
  128. package/admin/presentation/WebhookDeliveries/WebhookDeliveriesPresenter.js.map +0 -1
  129. package/admin/presentation/WebhookDeliveries/abstractions.d.ts +0 -22
  130. package/admin/presentation/WebhookDeliveries/abstractions.js +0 -5
  131. package/admin/presentation/WebhookDeliveries/abstractions.js.map +0 -1
  132. package/admin/presentation/WebhookDeliveries/components/DeliveryDetail.d.ts +0 -11
  133. package/admin/presentation/WebhookDeliveries/components/DeliveryDetail.js +0 -73
  134. package/admin/presentation/WebhookDeliveries/components/DeliveryDetail.js.map +0 -1
  135. package/admin/presentation/WebhookDeliveries/components/WebhookDeliveriesDrawer.d.ts +0 -8
  136. package/admin/presentation/WebhookDeliveries/components/WebhookDeliveriesDrawer.js +0 -119
  137. package/admin/presentation/WebhookDeliveries/components/WebhookDeliveriesDrawer.js.map +0 -1
  138. package/admin/presentation/WebhookDeliveries/feature.d.ts +0 -3
  139. package/admin/presentation/WebhookDeliveries/feature.js +0 -17
  140. package/admin/presentation/WebhookDeliveries/feature.js.map +0 -1
  141. package/admin/presentation/WebhookDeliveries/index.d.ts +0 -2
  142. package/admin/presentation/WebhookDeliveries/index.js +0 -2
@@ -1,163 +1,33 @@
1
- import react, { useCallback, useEffect, useMemo } from "react";
1
+ import react, { useEffect, useMemo } from "react";
2
2
  import { observer } from "mobx-react-lite";
3
3
  import { DiContainerProvider, useContainer, useFeature } from "@webiny/app";
4
- import { useRouter } from "@webiny/app-admin";
5
- import { Button, DataTable, DropdownMenu, Heading, IconButton, Separator, Tag, Text, TimeAgo } from "@webiny/admin-ui";
6
- import { useConfirmationDialog, useSnackbar } from "@webiny/app-admin/hooks/index.js";
7
- import { ReactComponent } from "@webiny/icons/more_vert.svg";
8
- import { ReactComponent as add_svg_ReactComponent } from "@webiny/icons/add.svg";
4
+ import { Heading, Separator } from "@webiny/admin-ui";
9
5
  import { WebhookListPresenterFeature } from "../feature.js";
10
6
  import { ListWebhooksFeature } from "../../../features/ListWebhooks/feature.js";
11
7
  import { DeleteWebhookFeature } from "../../../features/deleteWebhook/feature.js";
12
8
  import { TriggerWebhookFeature } from "../../../features/triggerWebhook/feature.js";
13
9
  import { WebhookPermissionsFeature } from "../../../features/permissions/feature.js";
14
- import { Routes } from "../../../routes.js";
15
- import { ReactComponent as edit_svg_ReactComponent } from "@webiny/icons/edit.svg";
16
- import { ReactComponent as delete_svg_ReactComponent } from "@webiny/icons/delete.svg";
17
- import { ReactComponent as webhook_svg_ReactComponent } from "@webiny/icons/webhook.svg";
10
+ import { CreateWebhookButton } from "./CreateWebhookButton.js";
11
+ import { WebhookListContent } from "./WebhookListContent.js";
12
+ import { WebhookDeliveriesButton } from "./WebhookDeliveriesButton.js";
18
13
  const WebhookListView_WebhookListViewInner = observer(function() {
19
14
  const { presenter } = useFeature(WebhookListPresenterFeature);
20
- const { goToRoute } = useRouter();
21
15
  useEffect(()=>{
22
16
  presenter.init();
23
17
  }, [
24
18
  presenter
25
19
  ]);
26
- const { vm } = presenter;
27
- const { showSnackbar } = useSnackbar();
28
- const { showConfirmation: showDeleteConfirmation } = useConfirmationDialog({
29
- title: "Delete Webhook",
30
- message: "Are you sure you want to delete this webhook?"
31
- });
32
- const sorting = useMemo(()=>{
33
- const sort = vm.list.sort;
34
- if (!sort || !sort.field) return [];
35
- return [
36
- {
37
- id: sort.field,
38
- desc: "DESC" === sort.direction
39
- }
40
- ];
41
- }, [
42
- vm.list.sort
43
- ]);
44
- const onSortingChange = useCallback((updater)=>{
45
- const next = "function" == typeof updater ? updater(sorting) : updater;
46
- if (next.length > 0) {
47
- const { id, desc } = next[0];
48
- presenter.actions.sort.set(id, desc ? "DESC" : "ASC");
49
- }
50
- }, [
51
- sorting,
52
- presenter.actions.sort
53
- ]);
54
- const columns = useMemo(()=>({
55
- name: {
56
- header: "Name",
57
- cell: (row)=>/*#__PURE__*/ react.createElement(Text, {
58
- className: "cursor-pointer text-primary hover:underline",
59
- onClick: ()=>goToRoute(Routes.Form, {
60
- id: row.id
61
- })
62
- }, row.name),
63
- enableSorting: true,
64
- size: 200
65
- },
66
- endpointUrl: {
67
- header: "Endpoint",
68
- cell: (row)=>/*#__PURE__*/ react.createElement(Text, {
69
- className: "font-mono text-sm truncate"
70
- }, row.endpointUrl),
71
- size: 250
72
- },
73
- enabled: {
74
- header: "Status",
75
- cell: (row)=>/*#__PURE__*/ react.createElement(Tag, {
76
- variant: row.enabled ? "success" : "neutral-muted",
77
- content: row.enabled ? "Active" : "Disabled"
78
- }),
79
- enableSorting: true,
80
- size: 100
81
- },
82
- createdOn: {
83
- header: "Created",
84
- cell: (row)=>row.createdOn ? /*#__PURE__*/ react.createElement(TimeAgo, {
85
- datetime: row.createdOn
86
- }) : /*#__PURE__*/ react.createElement(Text, {
87
- size: "sm"
88
- }, "—"),
89
- enableSorting: true,
90
- size: 120
91
- },
92
- actions: {
93
- header: " ",
94
- cell: (row)=>/*#__PURE__*/ react.createElement(DropdownMenu, {
95
- trigger: /*#__PURE__*/ react.createElement(IconButton, {
96
- icon: /*#__PURE__*/ react.createElement(ReactComponent, null),
97
- variant: "ghost",
98
- size: "sm",
99
- "aria-label": "Actions"
100
- })
101
- }, /*#__PURE__*/ react.createElement(DropdownMenu.Item, {
102
- icon: /*#__PURE__*/ react.createElement(edit_svg_ReactComponent, null),
103
- onClick: ()=>goToRoute(Routes.Form, {
104
- id: row.id
105
- }),
106
- text: "Edit"
107
- }), vm.permissions.canEdit && /*#__PURE__*/ react.createElement(DropdownMenu.Item, {
108
- icon: /*#__PURE__*/ react.createElement(webhook_svg_ReactComponent, null),
109
- onClick: ()=>{
110
- presenter.actions.triggerWebhook(row.id).then(()=>{
111
- showSnackbar("Test event triggered.");
112
- });
113
- },
114
- text: "Trigger Test"
115
- }), vm.permissions.canDelete && /*#__PURE__*/ react.createElement(react.Fragment, null, /*#__PURE__*/ react.createElement(DropdownMenu.Separator, null), /*#__PURE__*/ react.createElement(DropdownMenu.Item, {
116
- onClick: ()=>{
117
- showDeleteConfirmation(()=>presenter.actions.deleteWebhook(row.id));
118
- },
119
- icon: /*#__PURE__*/ react.createElement(delete_svg_ReactComponent, null),
120
- text: "Delete"
121
- }))),
122
- size: 56,
123
- enableSorting: false,
124
- enableHiding: false,
125
- enableResizing: false
126
- }
127
- }), [
128
- vm.permissions,
129
- presenter.actions,
130
- goToRoute,
131
- showDeleteConfirmation,
132
- showSnackbar
133
- ]);
134
- const createButton = /*#__PURE__*/ react.createElement(Button, {
135
- variant: "primary",
136
- onClick: ()=>goToRoute(Routes.Form, {
137
- id: "new"
138
- }),
139
- icon: /*#__PURE__*/ react.createElement(add_svg_ReactComponent, null)
140
- }, "Create Webhook");
141
20
  return /*#__PURE__*/ react.createElement("div", {
142
21
  className: "flex flex-col h-main-content"
143
22
  }, /*#__PURE__*/ react.createElement("div", {
144
23
  className: "flex items-center justify-between py-sm px-md"
145
24
  }, /*#__PURE__*/ react.createElement(Heading, {
146
25
  level: 5
147
- }, "Webhooks"), vm.permissions.canCreate && createButton), /*#__PURE__*/ react.createElement(Separator, null), /*#__PURE__*/ react.createElement("div", {
148
- className: "flex-1 overflow-auto"
149
- }, vm.list.pagination.loading || 0 !== vm.list.rows.length ? /*#__PURE__*/ react.createElement(DataTable, {
150
- columns: columns,
151
- data: vm.list.rows,
152
- loading: vm.list.pagination.loading,
153
- sorting: sorting,
154
- onSortingChange: onSortingChange,
155
- stickyHeader: true
156
- }) : /*#__PURE__*/ react.createElement("div", {
157
- className: "flex flex-col items-center justify-center h-full gap-md"
158
- }, /*#__PURE__*/ react.createElement(Text, {
159
- className: "text-neutral-strong"
160
- }, "No webhooks found."), vm.permissions.canCreate && createButton)));
26
+ }, "Webhooks"), /*#__PURE__*/ react.createElement("div", {
27
+ className: "flex gap-sm"
28
+ }, /*#__PURE__*/ react.createElement(WebhookDeliveriesButton, null), /*#__PURE__*/ react.createElement(CreateWebhookButton, null))), /*#__PURE__*/ react.createElement(Separator, null), /*#__PURE__*/ react.createElement(WebhookListContent, {
29
+ presenter: presenter
30
+ }));
161
31
  });
162
32
  const WebhookListView = ()=>{
163
33
  const container = useContainer();
@@ -1 +1 @@
1
- {"version":3,"file":"admin/presentation/WebhookList/components/WebhookListView.js","sources":["../../../../../src/admin/presentation/WebhookList/components/WebhookListView.tsx"],"sourcesContent":["import React, { useCallback, useEffect, useMemo } from \"react\";\nimport { observer } from \"mobx-react-lite\";\nimport { DiContainerProvider, useContainer, useFeature } from \"@webiny/app\";\nimport { useRouter } from \"@webiny/app-admin\";\nimport type { DataTableSorting, OnDataTableSortingChange } from \"@webiny/admin-ui\";\nimport {\n Button,\n DataTable,\n DropdownMenu,\n Heading,\n IconButton,\n Separator,\n Tag,\n Text,\n TimeAgo\n} from \"@webiny/admin-ui\";\nimport { useConfirmationDialog, useSnackbar } from \"@webiny/app-admin/hooks/index.js\";\nimport { ReactComponent as MoreVerticalIcon } from \"@webiny/icons/more_vert.svg\";\nimport { ReactComponent as AddIcon } from \"@webiny/icons/add.svg\";\nimport { WebhookListPresenterFeature } from \"../feature.js\";\nimport { ListWebhooksFeature } from \"~/admin/features/ListWebhooks/feature.js\";\nimport { DeleteWebhookFeature } from \"~/admin/features/deleteWebhook/feature.js\";\nimport { TriggerWebhookFeature } from \"~/admin/features/triggerWebhook/feature.js\";\nimport { WebhookPermissionsFeature } from \"~/admin/features/permissions/feature.js\";\nimport { Routes } from \"~/admin/routes.js\";\nimport type { Webhook } from \"~/admin/shared/types.js\";\nimport { ReactComponent as Edit } from \"@webiny/icons/edit.svg\";\nimport { ReactComponent as Delete } from \"@webiny/icons/delete.svg\";\nimport { ReactComponent as WebhookIcon } from \"@webiny/icons/webhook.svg\";\n\nconst WebhookListViewInner = observer(function WebhookListViewInner() {\n const { presenter } = useFeature(WebhookListPresenterFeature);\n const { goToRoute } = useRouter();\n\n useEffect(() => {\n presenter.init();\n }, [presenter]);\n\n const { vm } = presenter;\n\n const { showSnackbar } = useSnackbar();\n\n const { showConfirmation: showDeleteConfirmation } = useConfirmationDialog({\n title: \"Delete Webhook\",\n message: \"Are you sure you want to delete this webhook?\"\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.actions.sort.set(id, desc ? \"DESC\" : \"ASC\");\n }\n },\n [sorting, presenter.actions.sort]\n );\n\n const columns = useMemo(\n () => ({\n name: {\n header: \"Name\",\n cell: (row: Webhook) => (\n <Text\n className=\"cursor-pointer text-primary hover:underline\"\n onClick={() => goToRoute(Routes.Form, { id: row.id })}\n >\n {row.name}\n </Text>\n ),\n enableSorting: true,\n size: 200\n },\n endpointUrl: {\n header: \"Endpoint\",\n cell: (row: Webhook) => (\n <Text className=\"font-mono text-sm truncate\">{row.endpointUrl}</Text>\n ),\n size: 250\n },\n enabled: {\n header: \"Status\",\n cell: (row: Webhook) => (\n <Tag\n variant={row.enabled ? \"success\" : \"neutral-muted\"}\n content={row.enabled ? \"Active\" : \"Disabled\"}\n />\n ),\n enableSorting: true,\n size: 100\n },\n createdOn: {\n header: \"Created\",\n cell: (row: Webhook) =>\n row.createdOn ? <TimeAgo datetime={row.createdOn} /> : <Text size=\"sm\">—</Text>,\n enableSorting: true,\n size: 120\n },\n actions: {\n header: \" \",\n cell: (row: Webhook) => (\n <DropdownMenu\n trigger={\n <IconButton\n icon={<MoreVerticalIcon />}\n variant=\"ghost\"\n size=\"sm\"\n aria-label=\"Actions\"\n />\n }\n >\n <DropdownMenu.Item\n icon={<Edit />}\n onClick={() => goToRoute(Routes.Form, { id: row.id })}\n text={\"Edit\"}\n />\n {vm.permissions.canEdit && (\n <DropdownMenu.Item\n icon={<WebhookIcon />}\n onClick={() => {\n void presenter.actions.triggerWebhook(row.id).then(() => {\n showSnackbar(\"Test event triggered.\");\n });\n }}\n text={\"Trigger Test\"}\n />\n )}\n {vm.permissions.canDelete && (\n <>\n <DropdownMenu.Separator />\n <DropdownMenu.Item\n onClick={() => {\n showDeleteConfirmation(() =>\n presenter.actions.deleteWebhook(row.id)\n );\n }}\n icon={<Delete />}\n text={\"Delete\"}\n />\n </>\n )}\n </DropdownMenu>\n ),\n size: 56,\n enableSorting: false,\n enableHiding: false,\n enableResizing: false\n }\n }),\n [vm.permissions, presenter.actions, goToRoute, showDeleteConfirmation, showSnackbar]\n );\n\n const createButton = (\n <Button\n variant=\"primary\"\n onClick={() => goToRoute(Routes.Form, { id: \"new\" })}\n icon={<AddIcon />}\n >\n Create Webhook\n </Button>\n );\n\n return (\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}>Webhooks</Heading>\n {vm.permissions.canCreate && createButton}\n </div>\n <Separator />\n <div className=\"flex-1 overflow-auto\">\n {!vm.list.pagination.loading && 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 webhooks found.</Text>\n {vm.permissions.canCreate && createButton}\n </div>\n ) : (\n <DataTable<Webhook>\n columns={columns}\n data={vm.list.rows}\n loading={vm.list.pagination.loading}\n sorting={sorting}\n onSortingChange={onSortingChange}\n stickyHeader\n />\n )}\n </div>\n </div>\n );\n});\n\nexport const WebhookListView = () => {\n const container = useContainer();\n\n const scopedContainer = useMemo(() => {\n const child = container.createChildContainer();\n ListWebhooksFeature.register(child);\n DeleteWebhookFeature.register(child);\n TriggerWebhookFeature.register(child);\n WebhookPermissionsFeature.register(child);\n WebhookListPresenterFeature.register(child);\n return child;\n }, []);\n\n return (\n <DiContainerProvider container={scopedContainer}>\n <WebhookListViewInner />\n </DiContainerProvider>\n );\n};\n"],"names":["WebhookListViewInner","observer","presenter","useFeature","WebhookListPresenterFeature","goToRoute","useRouter","useEffect","vm","showSnackbar","useSnackbar","showDeleteConfirmation","useConfirmationDialog","sorting","useMemo","sort","onSortingChange","useCallback","updater","next","id","desc","columns","row","Text","Routes","Tag","TimeAgo","DropdownMenu","IconButton","MoreVerticalIcon","Edit","WebhookIcon","Delete","createButton","Button","AddIcon","Heading","Separator","DataTable","WebhookListView","container","useContainer","scopedContainer","child","ListWebhooksFeature","DeleteWebhookFeature","TriggerWebhookFeature","WebhookPermissionsFeature","DiContainerProvider"],"mappings":"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"}
1
+ {"version":3,"file":"admin/presentation/WebhookList/components/WebhookListView.js","sources":["../../../../../src/admin/presentation/WebhookList/components/WebhookListView.tsx"],"sourcesContent":["import React, { useEffect, useMemo } from \"react\";\nimport { observer } from \"mobx-react-lite\";\nimport { DiContainerProvider, useContainer, useFeature } from \"@webiny/app\";\nimport { Heading, Separator } from \"@webiny/admin-ui\";\nimport { WebhookListPresenterFeature } from \"../feature.js\";\nimport { ListWebhooksFeature } from \"~/admin/features/ListWebhooks/feature.js\";\nimport { DeleteWebhookFeature } from \"~/admin/features/deleteWebhook/feature.js\";\nimport { TriggerWebhookFeature } from \"~/admin/features/triggerWebhook/feature.js\";\nimport { WebhookPermissionsFeature } from \"~/admin/features/permissions/feature.js\";\nimport { CreateWebhookButton } from \"./CreateWebhookButton.js\";\nimport { WebhookListContent } from \"./WebhookListContent.js\";\nimport { WebhookDeliveriesButton } from \"~/admin/presentation/WebhookList/components/WebhookDeliveriesButton.js\";\n\nconst WebhookListViewInner = observer(function WebhookListViewInner() {\n const { presenter } = useFeature(WebhookListPresenterFeature);\n\n useEffect(() => {\n presenter.init();\n }, [presenter]);\n\n return (\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}>Webhooks</Heading>\n <div className={\"flex gap-sm\"}>\n <WebhookDeliveriesButton />\n <CreateWebhookButton />\n </div>\n </div>\n <Separator />\n <WebhookListContent presenter={presenter} />\n </div>\n );\n});\n\nexport const WebhookListView = () => {\n const container = useContainer();\n\n const scopedContainer = useMemo(() => {\n const child = container.createChildContainer();\n ListWebhooksFeature.register(child);\n DeleteWebhookFeature.register(child);\n TriggerWebhookFeature.register(child);\n WebhookPermissionsFeature.register(child);\n WebhookListPresenterFeature.register(child);\n return child;\n }, []);\n\n return (\n <DiContainerProvider container={scopedContainer}>\n <WebhookListViewInner />\n </DiContainerProvider>\n );\n};\n"],"names":["WebhookListViewInner","observer","presenter","useFeature","WebhookListPresenterFeature","useEffect","Heading","WebhookDeliveriesButton","CreateWebhookButton","Separator","WebhookListContent","WebhookListView","container","useContainer","scopedContainer","useMemo","child","ListWebhooksFeature","DeleteWebhookFeature","TriggerWebhookFeature","WebhookPermissionsFeature","DiContainerProvider"],"mappings":";;;;;;;;;;;;AAaA,MAAMA,uCAAuBC,SAAS;IAClC,MAAM,EAAEC,SAAS,EAAE,GAAGC,WAAWC;IAEjCC,UAAU;QACNH,UAAU,IAAI;IAClB,GAAG;QAACA;KAAU;IAEd,OAAO,WAAP,GACI,oBAAC;QAAI,WAAU;qBACX,oBAAC;QAAI,WAAU;qBACX,oBAACI,SAAOA;QAAC,OAAO;OAAG,2BACnB,oBAAC;QAAI,WAAW;qBACZ,oBAACC,yBAAuBA,OAAAA,WAAAA,GACxB,oBAACC,qBAAmBA,SAAAA,WAAAA,GAG5B,oBAACC,WAASA,OAAAA,WAAAA,GACV,oBAACC,oBAAkBA;QAAC,WAAWR;;AAG3C;AAEO,MAAMS,kBAAkB;IAC3B,MAAMC,YAAYC;IAElB,MAAMC,kBAAkBC,QAAQ;QAC5B,MAAMC,QAAQJ,UAAU,oBAAoB;QAC5CK,oBAAoB,QAAQ,CAACD;QAC7BE,qBAAqB,QAAQ,CAACF;QAC9BG,sBAAsB,QAAQ,CAACH;QAC/BI,0BAA0B,QAAQ,CAACJ;QACnCZ,4BAA4B,QAAQ,CAACY;QACrC,OAAOA;IACX,GAAG,EAAE;IAEL,OAAO,WAAP,GACI,oBAACK,qBAAmBA;QAAC,WAAWP;qBAC5B,oBAACd,sCAAoBA;AAGjC"}
@@ -3,6 +3,7 @@ import { WebhookSettingsPresenter } from "./abstractions.js";
3
3
  import { GetWebhookSettingsUseCase } from "../../features/getWebhookSettings/abstractions.js";
4
4
  import { UpdateWebhookSettingsUseCase } from "../../features/updateWebhookSettings/abstractions.js";
5
5
  import { FormModelFactory } from "@webiny/app-admin/features/formModel/abstractions.js";
6
+ import { WEBHOOK_DELIVERY_MAX_RETENTION_DAYS } from "../../../api/domain/constants.js";
6
7
  class WebhookSettingsPresenterImpl {
7
8
  get vm() {
8
9
  return {
@@ -25,24 +26,30 @@ class WebhookSettingsPresenterImpl {
25
26
  buildForm() {
26
27
  return this.formModelFactory.create({
27
28
  fields: (fields)=>({
28
- signingSecret: fields.text().label("Signing Secret").placeholder("Enter a signing secret for webhook payloads").description("Used to sign webhook payloads so receivers can verify authenticity.")
29
+ signingSecret: fields.text().label("Signing Secret").placeholder("Enter a signing secret for webhook payloads").description("Used to sign webhook payloads so receivers can verify authenticity."),
30
+ deliveryRetentionDays: fields.number().label("Delivery Retention (days)").placeholder(String(WEBHOOK_DELIVERY_MAX_RETENTION_DAYS)).description(`How long to keep delivery logs. 0 = delete immediately. Max ${WEBHOOK_DELIVERY_MAX_RETENTION_DAYS} days.`)
29
31
  }),
30
32
  layout: (layout)=>[
31
- layout.row("signingSecret")
33
+ layout.row("signingSecret"),
34
+ layout.row("deliveryRetentionDays")
32
35
  ]
33
36
  });
34
37
  }
35
38
  async save() {
36
39
  const data = await this._form.submit();
37
40
  if (false === data) return false;
38
- this._saving = true;
41
+ runInAction(()=>{
42
+ this._saving = true;
43
+ });
39
44
  try {
40
45
  const settings = await this.updateWebhookSettingsUseCase.execute({
41
- signingSecret: data.signingSecret || void 0
46
+ signingSecret: data.signingSecret || void 0,
47
+ deliveryRetentionDays: null != data.deliveryRetentionDays ? Number(data.deliveryRetentionDays) : void 0
42
48
  });
43
49
  runInAction(()=>{
44
50
  this._form.setData({
45
- signingSecret: settings.signingSecret ?? ""
51
+ signingSecret: settings.signingSecret ?? "",
52
+ deliveryRetentionDays: settings.deliveryRetentionDays ?? ""
46
53
  });
47
54
  });
48
55
  } finally{
@@ -59,7 +66,8 @@ class WebhookSettingsPresenterImpl {
59
66
  runInAction(()=>{
60
67
  this._form = this.buildForm();
61
68
  this._form.setData({
62
- signingSecret: settings.signingSecret ?? ""
69
+ signingSecret: settings.signingSecret ?? "",
70
+ deliveryRetentionDays: settings.deliveryRetentionDays ?? ""
63
71
  });
64
72
  this._loading = false;
65
73
  });
@@ -1 +1 @@
1
- {"version":3,"file":"admin/presentation/WebhookSettings/WebhookSettingsPresenter.js","sources":["../../../../src/admin/presentation/WebhookSettings/WebhookSettingsPresenter.ts"],"sourcesContent":["import { computed, makeAutoObservable, runInAction } from \"mobx\";\nimport {\n WebhookSettingsPresenter as Abstraction,\n type IWebhookSettingsPresenter,\n type IWebhookSettingsViewModel\n} from \"./abstractions.js\";\nimport { GetWebhookSettingsUseCase } from \"~/admin/features/getWebhookSettings/abstractions.js\";\nimport { UpdateWebhookSettingsUseCase } from \"~/admin/features/updateWebhookSettings/abstractions.js\";\nimport {\n FormModelFactory,\n type IFormModel\n} from \"@webiny/app-admin/features/formModel/abstractions.js\";\n\nclass WebhookSettingsPresenterImpl implements IWebhookSettingsPresenter {\n private _loading = false;\n private _saving = false;\n private _form: IFormModel;\n\n public get vm(): IWebhookSettingsViewModel {\n return {\n loading: this._loading,\n saving: this._saving,\n form: this._form.vm\n };\n }\n\n public constructor(\n private readonly formModelFactory: FormModelFactory.Interface,\n private readonly getWebhookSettingsUseCase: GetWebhookSettingsUseCase.Interface,\n private readonly updateWebhookSettingsUseCase: UpdateWebhookSettingsUseCase.Interface\n ) {\n this._form = this.buildForm();\n\n makeAutoObservable(this, { vm: computed });\n }\n\n private buildForm(): IFormModel {\n return this.formModelFactory.create({\n fields: fields => ({\n signingSecret: fields\n .text()\n .label(\"Signing Secret\")\n .placeholder(\"Enter a signing secret for webhook payloads\")\n .description(\n \"Used to sign webhook payloads so receivers can verify authenticity.\"\n )\n }),\n layout: layout => [layout.row(\"signingSecret\")]\n });\n }\n\n public async save() {\n const data = await this._form.submit<Record<string, unknown>>();\n if (data === false) {\n return false;\n }\n\n this._saving = true;\n\n try {\n const settings = await this.updateWebhookSettingsUseCase.execute({\n signingSecret: (data.signingSecret as string) || undefined\n });\n\n runInAction(() => {\n this._form.setData({\n signingSecret: settings.signingSecret ?? \"\"\n });\n });\n } finally {\n runInAction(() => {\n this._saving = false;\n });\n }\n\n return true;\n }\n\n public async init(): Promise<void> {\n this._loading = true;\n\n try {\n const settings = await this.getWebhookSettingsUseCase.execute();\n\n runInAction(() => {\n this._form = this.buildForm();\n this._form.setData({\n signingSecret: settings.signingSecret ?? \"\"\n });\n this._loading = false;\n });\n } catch {\n runInAction(() => {\n this._loading = false;\n });\n }\n }\n}\n\nexport const WebhookSettingsPresenter = Abstraction.createImplementation({\n implementation: WebhookSettingsPresenterImpl,\n dependencies: [FormModelFactory, GetWebhookSettingsUseCase, UpdateWebhookSettingsUseCase]\n});\n"],"names":["WebhookSettingsPresenterImpl","formModelFactory","getWebhookSettingsUseCase","updateWebhookSettingsUseCase","makeAutoObservable","computed","fields","layout","data","settings","undefined","runInAction","WebhookSettingsPresenter","Abstraction","FormModelFactory","GetWebhookSettingsUseCase","UpdateWebhookSettingsUseCase"],"mappings":";;;;;AAaA,MAAMA;IAKF,IAAW,KAAgC;QACvC,OAAO;YACH,SAAS,IAAI,CAAC,QAAQ;YACtB,QAAQ,IAAI,CAAC,OAAO;YACpB,MAAM,IAAI,CAAC,KAAK,CAAC,EAAE;QACvB;IACJ;IAEA,YACqBC,gBAA4C,EAC5CC,yBAA8D,EAC9DC,4BAAoE,CACvF;aAHmBF,gBAAgB,GAAhBA;aACAC,yBAAyB,GAAzBA;aACAC,4BAA4B,GAA5BA;aAfb,QAAQ,GAAG;aACX,OAAO,GAAG;QAgBd,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,SAAS;QAE3BC,mBAAmB,IAAI,EAAE;YAAE,IAAIC;QAAS;IAC5C;IAEQ,YAAwB;QAC5B,OAAO,IAAI,CAAC,gBAAgB,CAAC,MAAM,CAAC;YAChC,QAAQC,CAAAA,SAAW;oBACf,eAAeA,OACV,IAAI,GACJ,KAAK,CAAC,kBACN,WAAW,CAAC,+CACZ,WAAW,CACR;gBAEZ;YACA,QAAQC,CAAAA,SAAU;oBAACA,OAAO,GAAG,CAAC;iBAAiB;QACnD;IACJ;IAEA,MAAa,OAAO;QAChB,MAAMC,OAAO,MAAM,IAAI,CAAC,KAAK,CAAC,MAAM;QACpC,IAAIA,AAAS,UAATA,MACA,OAAO;QAGX,IAAI,CAAC,OAAO,GAAG;QAEf,IAAI;YACA,MAAMC,WAAW,MAAM,IAAI,CAAC,4BAA4B,CAAC,OAAO,CAAC;gBAC7D,eAAgBD,KAAK,aAAa,IAAeE;YACrD;YAEAC,YAAY;gBACR,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC;oBACf,eAAeF,SAAS,aAAa,IAAI;gBAC7C;YACJ;QACJ,SAAU;YACNE,YAAY;gBACR,IAAI,CAAC,OAAO,GAAG;YACnB;QACJ;QAEA,OAAO;IACX;IAEA,MAAa,OAAsB;QAC/B,IAAI,CAAC,QAAQ,GAAG;QAEhB,IAAI;YACA,MAAMF,WAAW,MAAM,IAAI,CAAC,yBAAyB,CAAC,OAAO;YAE7DE,YAAY;gBACR,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,SAAS;gBAC3B,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC;oBACf,eAAeF,SAAS,aAAa,IAAI;gBAC7C;gBACA,IAAI,CAAC,QAAQ,GAAG;YACpB;QACJ,EAAE,OAAM;YACJE,YAAY;gBACR,IAAI,CAAC,QAAQ,GAAG;YACpB;QACJ;IACJ;AACJ;AAEO,MAAMC,oDAA2BC,yBAAAA,oBAAgC,CAAC;IACrE,gBAAgBb;IAChB,cAAc;QAACc;QAAkBC;QAA2BC;KAA6B;AAC7F"}
1
+ {"version":3,"file":"admin/presentation/WebhookSettings/WebhookSettingsPresenter.js","sources":["../../../../src/admin/presentation/WebhookSettings/WebhookSettingsPresenter.ts"],"sourcesContent":["import { computed, makeAutoObservable, runInAction } from \"mobx\";\nimport {\n WebhookSettingsPresenter as Abstraction,\n type IWebhookSettingsPresenter,\n type IWebhookSettingsViewModel\n} from \"./abstractions.js\";\nimport { GetWebhookSettingsUseCase } from \"~/admin/features/getWebhookSettings/abstractions.js\";\nimport { UpdateWebhookSettingsUseCase } from \"~/admin/features/updateWebhookSettings/abstractions.js\";\nimport {\n FormModelFactory,\n type IFormModel\n} from \"@webiny/app-admin/features/formModel/abstractions.js\";\nimport { WEBHOOK_DELIVERY_MAX_RETENTION_DAYS } from \"~/api/domain/constants.js\";\n\nclass WebhookSettingsPresenterImpl implements IWebhookSettingsPresenter {\n private _loading = false;\n private _saving = false;\n private _form: IFormModel;\n\n public get vm(): IWebhookSettingsViewModel {\n return {\n loading: this._loading,\n saving: this._saving,\n form: this._form.vm\n };\n }\n\n public constructor(\n private readonly formModelFactory: FormModelFactory.Interface,\n private readonly getWebhookSettingsUseCase: GetWebhookSettingsUseCase.Interface,\n private readonly updateWebhookSettingsUseCase: UpdateWebhookSettingsUseCase.Interface\n ) {\n this._form = this.buildForm();\n\n makeAutoObservable(this, { vm: computed });\n }\n\n private buildForm(): IFormModel {\n return this.formModelFactory.create({\n fields: fields => ({\n signingSecret: fields\n .text()\n .label(\"Signing Secret\")\n .placeholder(\"Enter a signing secret for webhook payloads\")\n .description(\n \"Used to sign webhook payloads so receivers can verify authenticity.\"\n ),\n deliveryRetentionDays: fields\n .number()\n .label(\"Delivery Retention (days)\")\n .placeholder(String(WEBHOOK_DELIVERY_MAX_RETENTION_DAYS))\n .description(\n `How long to keep delivery logs. 0 = delete immediately. Max ${WEBHOOK_DELIVERY_MAX_RETENTION_DAYS} days.`\n )\n }),\n layout: layout => [layout.row(\"signingSecret\"), layout.row(\"deliveryRetentionDays\")]\n });\n }\n\n public async save(): Promise<boolean> {\n const data = await this._form.submit<Record<string, string>>();\n if (data === false) {\n return false;\n }\n\n runInAction(() => {\n this._saving = true;\n });\n\n try {\n const settings = await this.updateWebhookSettingsUseCase.execute({\n signingSecret: data.signingSecret || undefined,\n deliveryRetentionDays:\n data.deliveryRetentionDays != null\n ? Number(data.deliveryRetentionDays)\n : undefined\n });\n\n runInAction(() => {\n this._form.setData({\n signingSecret: settings.signingSecret ?? \"\",\n deliveryRetentionDays: settings.deliveryRetentionDays ?? \"\"\n });\n });\n } finally {\n runInAction(() => {\n this._saving = false;\n });\n }\n return true;\n }\n\n public async init(): Promise<void> {\n this._loading = true;\n\n try {\n const settings = await this.getWebhookSettingsUseCase.execute();\n\n runInAction(() => {\n this._form = this.buildForm();\n this._form.setData({\n signingSecret: settings.signingSecret ?? \"\",\n deliveryRetentionDays: settings.deliveryRetentionDays ?? \"\"\n });\n this._loading = false;\n });\n } catch {\n runInAction(() => {\n this._loading = false;\n });\n }\n }\n}\n\nexport const WebhookSettingsPresenter = Abstraction.createImplementation({\n implementation: WebhookSettingsPresenterImpl,\n dependencies: [FormModelFactory, GetWebhookSettingsUseCase, UpdateWebhookSettingsUseCase]\n});\n"],"names":["WebhookSettingsPresenterImpl","formModelFactory","getWebhookSettingsUseCase","updateWebhookSettingsUseCase","makeAutoObservable","computed","fields","String","WEBHOOK_DELIVERY_MAX_RETENTION_DAYS","layout","data","runInAction","settings","undefined","Number","WebhookSettingsPresenter","Abstraction","FormModelFactory","GetWebhookSettingsUseCase","UpdateWebhookSettingsUseCase"],"mappings":";;;;;;AAcA,MAAMA;IAKF,IAAW,KAAgC;QACvC,OAAO;YACH,SAAS,IAAI,CAAC,QAAQ;YACtB,QAAQ,IAAI,CAAC,OAAO;YACpB,MAAM,IAAI,CAAC,KAAK,CAAC,EAAE;QACvB;IACJ;IAEA,YACqBC,gBAA4C,EAC5CC,yBAA8D,EAC9DC,4BAAoE,CACvF;aAHmBF,gBAAgB,GAAhBA;aACAC,yBAAyB,GAAzBA;aACAC,4BAA4B,GAA5BA;aAfb,QAAQ,GAAG;aACX,OAAO,GAAG;QAgBd,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,SAAS;QAE3BC,mBAAmB,IAAI,EAAE;YAAE,IAAIC;QAAS;IAC5C;IAEQ,YAAwB;QAC5B,OAAO,IAAI,CAAC,gBAAgB,CAAC,MAAM,CAAC;YAChC,QAAQC,CAAAA,SAAW;oBACf,eAAeA,OACV,IAAI,GACJ,KAAK,CAAC,kBACN,WAAW,CAAC,+CACZ,WAAW,CACR;oBAER,uBAAuBA,OAClB,MAAM,GACN,KAAK,CAAC,6BACN,WAAW,CAACC,OAAOC,sCACnB,WAAW,CACR,CAAC,4DAA4D,EAAEA,oCAAoC,MAAM,CAAC;gBAEtH;YACA,QAAQC,CAAAA,SAAU;oBAACA,OAAO,GAAG,CAAC;oBAAkBA,OAAO,GAAG,CAAC;iBAAyB;QACxF;IACJ;IAEA,MAAa,OAAyB;QAClC,MAAMC,OAAO,MAAM,IAAI,CAAC,KAAK,CAAC,MAAM;QACpC,IAAIA,AAAS,UAATA,MACA,OAAO;QAGXC,YAAY;YACR,IAAI,CAAC,OAAO,GAAG;QACnB;QAEA,IAAI;YACA,MAAMC,WAAW,MAAM,IAAI,CAAC,4BAA4B,CAAC,OAAO,CAAC;gBAC7D,eAAeF,KAAK,aAAa,IAAIG;gBACrC,uBACIH,AAA8B,QAA9BA,KAAK,qBAAqB,GACpBI,OAAOJ,KAAK,qBAAqB,IACjCG;YACd;YAEAF,YAAY;gBACR,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC;oBACf,eAAeC,SAAS,aAAa,IAAI;oBACzC,uBAAuBA,SAAS,qBAAqB,IAAI;gBAC7D;YACJ;QACJ,SAAU;YACND,YAAY;gBACR,IAAI,CAAC,OAAO,GAAG;YACnB;QACJ;QACA,OAAO;IACX;IAEA,MAAa,OAAsB;QAC/B,IAAI,CAAC,QAAQ,GAAG;QAEhB,IAAI;YACA,MAAMC,WAAW,MAAM,IAAI,CAAC,yBAAyB,CAAC,OAAO;YAE7DD,YAAY;gBACR,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,SAAS;gBAC3B,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC;oBACf,eAAeC,SAAS,aAAa,IAAI;oBACzC,uBAAuBA,SAAS,qBAAqB,IAAI;gBAC7D;gBACA,IAAI,CAAC,QAAQ,GAAG;YACpB;QACJ,EAAE,OAAM;YACJD,YAAY;gBACR,IAAI,CAAC,QAAQ,GAAG;YACpB;QACJ;IACJ;AACJ;AAEO,MAAMI,oDAA2BC,yBAAAA,oBAAgC,CAAC;IACrE,gBAAgBhB;IAChB,cAAc;QAACiB;QAAkBC;QAA2BC;KAA6B;AAC7F"}
package/admin/routes.d.ts CHANGED
@@ -1,8 +1,11 @@
1
1
  import { Route } from "@webiny/app-admin";
2
2
  export declare const Routes: {
3
3
  List: Route<undefined>;
4
+ Deliveries: Route<{
5
+ webhookId: import("zod").ZodOptional<import("zod").ZodString>;
6
+ }>;
7
+ Settings: Route<undefined>;
4
8
  Form: Route<{
5
9
  id: import("zod").ZodString;
6
10
  }>;
7
- Settings: Route<undefined>;
8
11
  };
package/admin/routes.js CHANGED
@@ -4,16 +4,23 @@ const Routes = {
4
4
  name: "Webhooks/List",
5
5
  path: "/webhooks"
6
6
  }),
7
- Form: new Route({
8
- name: "Webhooks/Form",
9
- path: "/webhooks/:id",
7
+ Deliveries: new Route({
8
+ name: "Webhooks/Deliveries",
9
+ path: "/webhooks/deliveries",
10
10
  params: (zod)=>({
11
- id: zod.string()
11
+ webhookId: zod.string().optional()
12
12
  })
13
13
  }),
14
14
  Settings: new Route({
15
15
  name: "Webhooks/Settings",
16
16
  path: "/webhooks/settings"
17
+ }),
18
+ Form: new Route({
19
+ name: "Webhooks/Form",
20
+ path: "/webhooks/:id",
21
+ params: (zod)=>({
22
+ id: zod.string()
23
+ })
17
24
  })
18
25
  };
19
26
  export { Routes };
@@ -1 +1 @@
1
- {"version":3,"file":"admin/routes.js","sources":["../../src/admin/routes.ts"],"sourcesContent":["import { Route } from \"@webiny/app-admin\";\n\nexport const Routes = {\n List: new Route({\n name: \"Webhooks/List\",\n path: \"/webhooks\"\n }),\n Form: new Route({\n name: \"Webhooks/Form\",\n path: \"/webhooks/:id\",\n params: zod => ({\n id: zod.string()\n })\n }),\n Settings: new Route({\n name: \"Webhooks/Settings\",\n path: \"/webhooks/settings\"\n })\n};\n"],"names":["Routes","Route","zod"],"mappings":";AAEO,MAAMA,SAAS;IAClB,MAAM,IAAIC,MAAM;QACZ,MAAM;QACN,MAAM;IACV;IACA,MAAM,IAAIA,MAAM;QACZ,MAAM;QACN,MAAM;QACN,QAAQC,CAAAA,MAAQ;gBACZ,IAAIA,IAAI,MAAM;YAClB;IACJ;IACA,UAAU,IAAID,MAAM;QAChB,MAAM;QACN,MAAM;IACV;AACJ"}
1
+ {"version":3,"file":"admin/routes.js","sources":["../../src/admin/routes.ts"],"sourcesContent":["import { Route } from \"@webiny/app-admin\";\n\nexport const Routes = {\n List: new Route({\n name: \"Webhooks/List\",\n path: \"/webhooks\"\n }),\n Deliveries: new Route({\n name: \"Webhooks/Deliveries\",\n path: \"/webhooks/deliveries\",\n params: zod => ({\n webhookId: zod.string().optional()\n })\n }),\n Settings: new Route({\n name: \"Webhooks/Settings\",\n path: \"/webhooks/settings\"\n }),\n Form: new Route({\n name: \"Webhooks/Form\",\n path: \"/webhooks/:id\",\n params: zod => ({\n id: zod.string()\n })\n })\n};\n"],"names":["Routes","Route","zod"],"mappings":";AAEO,MAAMA,SAAS;IAClB,MAAM,IAAIC,MAAM;QACZ,MAAM;QACN,MAAM;IACV;IACA,YAAY,IAAIA,MAAM;QAClB,MAAM;QACN,MAAM;QACN,QAAQC,CAAAA,MAAQ;gBACZ,WAAWA,IAAI,MAAM,GAAG,QAAQ;YACpC;IACJ;IACA,UAAU,IAAID,MAAM;QAChB,MAAM;QACN,MAAM;IACV;IACA,MAAM,IAAIA,MAAM;QACZ,MAAM;QACN,MAAM;QACN,QAAQC,CAAAA,MAAQ;gBACZ,IAAIA,IAAI,MAAM;YAClB;IACJ;AACJ"}
@@ -5,4 +5,5 @@ export type { CreateWebhookParams } from "@webiny/sdk";
5
5
  export type { UpdateWebhookParams } from "@webiny/sdk";
6
6
  export interface WebhookSettings {
7
7
  signingSecret: string | undefined;
8
+ deliveryRetentionDays: number | undefined;
8
9
  }
@@ -16,7 +16,6 @@ export interface WebhookDeliveryCmsEntry {
16
16
  id: string;
17
17
  createdOn: string;
18
18
  savedOn: string;
19
- expiresAt: string;
20
19
  values: WebhookDeliveryCmsEntryValues;
21
20
  }
22
21
  export interface WebhookDelivery {
@@ -1,3 +1,4 @@
1
1
  export interface IWebhookSettings {
2
2
  signingSecret: string | undefined;
3
+ deliveryRetentionDays: number | undefined;
3
4
  }
@@ -2,4 +2,4 @@ export declare const WEBHOOK_MODEL_ID = "webhook";
2
2
  export declare const WEBHOOK_DELIVERY_MODEL_ID = "webhookDelivery";
3
3
  export declare const WEBHOOK_SETTINGS_MODEL_ID = "webhookSettings";
4
4
  export declare const SEND_WEBHOOK_TASK = "sendWebhook";
5
- export declare const WEBHOOK_DELIVERY_RETENTION_DAYS = 90;
5
+ export declare const WEBHOOK_DELIVERY_MAX_RETENTION_DAYS = 3650;
@@ -2,7 +2,7 @@ const WEBHOOK_MODEL_ID = "webhook";
2
2
  const WEBHOOK_DELIVERY_MODEL_ID = "webhookDelivery";
3
3
  const WEBHOOK_SETTINGS_MODEL_ID = "webhookSettings";
4
4
  const SEND_WEBHOOK_TASK = "sendWebhook";
5
- const WEBHOOK_DELIVERY_RETENTION_DAYS = 90;
6
- export { SEND_WEBHOOK_TASK, WEBHOOK_DELIVERY_MODEL_ID, WEBHOOK_DELIVERY_RETENTION_DAYS, WEBHOOK_MODEL_ID, WEBHOOK_SETTINGS_MODEL_ID };
5
+ const WEBHOOK_DELIVERY_MAX_RETENTION_DAYS = 3650;
6
+ export { SEND_WEBHOOK_TASK, WEBHOOK_DELIVERY_MAX_RETENTION_DAYS, WEBHOOK_DELIVERY_MODEL_ID, WEBHOOK_MODEL_ID, WEBHOOK_SETTINGS_MODEL_ID };
7
7
 
8
8
  //# sourceMappingURL=constants.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"api/domain/constants.js","sources":["../../../src/api/domain/constants.ts"],"sourcesContent":["export const WEBHOOK_MODEL_ID = \"webhook\";\nexport const WEBHOOK_DELIVERY_MODEL_ID = \"webhookDelivery\";\nexport const WEBHOOK_SETTINGS_MODEL_ID = \"webhookSettings\";\nexport const SEND_WEBHOOK_TASK = \"sendWebhook\";\nexport const WEBHOOK_DELIVERY_RETENTION_DAYS = 90;\n"],"names":["WEBHOOK_MODEL_ID","WEBHOOK_DELIVERY_MODEL_ID","WEBHOOK_SETTINGS_MODEL_ID","SEND_WEBHOOK_TASK","WEBHOOK_DELIVERY_RETENTION_DAYS"],"mappings":"AAAO,MAAMA,mBAAmB;AACzB,MAAMC,4BAA4B;AAClC,MAAMC,4BAA4B;AAClC,MAAMC,oBAAoB;AAC1B,MAAMC,kCAAkC"}
1
+ {"version":3,"file":"api/domain/constants.js","sources":["../../../src/api/domain/constants.ts"],"sourcesContent":["export const WEBHOOK_MODEL_ID = \"webhook\";\nexport const WEBHOOK_DELIVERY_MODEL_ID = \"webhookDelivery\";\nexport const WEBHOOK_SETTINGS_MODEL_ID = \"webhookSettings\";\nexport const SEND_WEBHOOK_TASK = \"sendWebhook\";\nexport const WEBHOOK_DELIVERY_MAX_RETENTION_DAYS = 3650;\n"],"names":["WEBHOOK_MODEL_ID","WEBHOOK_DELIVERY_MODEL_ID","WEBHOOK_SETTINGS_MODEL_ID","SEND_WEBHOOK_TASK","WEBHOOK_DELIVERY_MAX_RETENTION_DAYS"],"mappings":"AAAO,MAAMA,mBAAmB;AACzB,MAAMC,4BAA4B;AAClC,MAAMC,4BAA4B;AAClC,MAAMC,oBAAoB;AAC1B,MAAMC,sCAAsC"}
@@ -3,8 +3,8 @@ import { GetModelRepository } from "@webiny/api-headless-cms/features/contentMod
3
3
  import { CreateEntryDataFactory } from "@webiny/api-headless-cms/exports/api/cms/entry.js";
4
4
  import { CreateEntryRepository } from "@webiny/api-headless-cms/features/contentEntry/CreateEntry/index.js";
5
5
  import { WebhookDeliveryTransformer } from "../../../api/features/Transformers/abstractions/WebhookDeliveryTransformer.js";
6
- import { CreateWebhookDeliveryRepository as RepositoryAbstraction } from "./abstractions.js";
7
6
  import type { ICreateDeliveryInput } from "./abstractions.js";
7
+ import { CreateWebhookDeliveryRepository as RepositoryAbstraction } from "./abstractions.js";
8
8
  import type { WebhookDelivery } from "../../../api/domain/WebhookDelivery.js";
9
9
  declare class CreateWebhookDeliveryRepositoryImpl implements RepositoryAbstraction.Interface {
10
10
  private readonly getModelRepository;
@@ -32,8 +32,10 @@ class CreateWebhookDeliveryRepositoryImpl {
32
32
  responseHeaders: null,
33
33
  responseBody: null
34
34
  });
35
+ const expiresAt = new Date(input.expiresAt);
35
36
  const { entry } = await this.createEntryDataFactory.create(modelResult.value, {
36
- values: storageValues
37
+ values: storageValues,
38
+ expiresAt
37
39
  });
38
40
  const createResult = await this.createEntryRepository.execute(modelResult.value, entry);
39
41
  if (createResult.isFail()) return Result.fail(WebhookPersistenceError.from(createResult.error));
@@ -1 +1 @@
1
- {"version":3,"file":"api/features/CreateWebhookDelivery/CreateWebhookDeliveryRepository.js","sources":["../../../../src/api/features/CreateWebhookDelivery/CreateWebhookDeliveryRepository.ts"],"sourcesContent":["import { Result } from \"@webiny/feature/api\";\nimport { GetModelRepository } from \"@webiny/api-headless-cms/features/contentModel/GetModel/index.js\";\nimport { CreateEntryDataFactory } from \"@webiny/api-headless-cms/exports/api/cms/entry.js\";\nimport { CreateEntryRepository } from \"@webiny/api-headless-cms/features/contentEntry/CreateEntry/index.js\";\nimport { WebhookDeliveryTransformer } from \"~/api/features/Transformers/abstractions/WebhookDeliveryTransformer.js\";\nimport { CreateWebhookDeliveryRepository as RepositoryAbstraction } from \"./abstractions.js\";\nimport { WebhookModelNotFoundError, WebhookPersistenceError } from \"~/api/domain/errors.js\";\nimport { WEBHOOK_DELIVERY_MODEL_ID } from \"~/api/domain/constants.js\";\nimport type { ICreateDeliveryInput } from \"./abstractions.js\";\nimport type {\n WebhookDelivery,\n WebhookDeliveryCmsEntryValues\n} from \"~/api/domain/WebhookDelivery.js\";\n\nclass CreateWebhookDeliveryRepositoryImpl implements RepositoryAbstraction.Interface {\n constructor(\n private readonly getModelRepository: GetModelRepository.Interface,\n private readonly createEntryDataFactory: CreateEntryDataFactory.Interface,\n private readonly createEntryRepository: CreateEntryRepository.Interface,\n private readonly transformer: WebhookDeliveryTransformer.Interface\n ) {}\n\n async execute(\n input: ICreateDeliveryInput\n ): Promise<Result<WebhookDelivery, RepositoryAbstraction.Error>> {\n try {\n const modelResult = await this.getModelRepository.execute(WEBHOOK_DELIVERY_MODEL_ID);\n if (modelResult.isFail()) {\n return Result.fail(new WebhookModelNotFoundError(WEBHOOK_DELIVERY_MODEL_ID));\n }\n\n const storageValues = this.transformer.toStorage({\n id: \"\",\n createdOn: \"\",\n savedOn: \"\",\n webhookId: input.webhookId,\n backgroundTaskId: null,\n eventType: input.eventType,\n status: input.status,\n payload: input.payload,\n requestHeaders: null,\n responseTime: null,\n responseStatus: null,\n responseHeaders: null,\n responseBody: null\n });\n\n const { entry } =\n await this.createEntryDataFactory.create<WebhookDeliveryCmsEntryValues>(\n modelResult.value,\n { values: storageValues }\n );\n\n const createResult = await this.createEntryRepository.execute(modelResult.value, entry);\n\n if (createResult.isFail()) {\n return Result.fail(WebhookPersistenceError.from(createResult.error));\n }\n\n const delivery = this.transformer.fromStorage(entry);\n\n return Result.ok(delivery);\n } catch (error) {\n return Result.fail(WebhookPersistenceError.from(error));\n }\n }\n}\n\nexport const CreateWebhookDeliveryRepository = RepositoryAbstraction.createImplementation({\n implementation: CreateWebhookDeliveryRepositoryImpl,\n dependencies: [\n GetModelRepository,\n CreateEntryDataFactory,\n CreateEntryRepository,\n WebhookDeliveryTransformer\n ]\n});\n"],"names":["CreateWebhookDeliveryRepositoryImpl","getModelRepository","createEntryDataFactory","createEntryRepository","transformer","input","modelResult","WEBHOOK_DELIVERY_MODEL_ID","Result","WebhookModelNotFoundError","storageValues","entry","createResult","WebhookPersistenceError","delivery","error","CreateWebhookDeliveryRepository","RepositoryAbstraction","GetModelRepository","CreateEntryDataFactory","CreateEntryRepository","WebhookDeliveryTransformer"],"mappings":";;;;;;;;AAcA,MAAMA;IACF,YACqBC,kBAAgD,EAChDC,sBAAwD,EACxDC,qBAAsD,EACtDC,WAAiD,CACpE;aAJmBH,kBAAkB,GAAlBA;aACAC,sBAAsB,GAAtBA;aACAC,qBAAqB,GAArBA;aACAC,WAAW,GAAXA;IAClB;IAEH,MAAM,QACFC,KAA2B,EACkC;QAC7D,IAAI;YACA,MAAMC,cAAc,MAAM,IAAI,CAAC,kBAAkB,CAAC,OAAO,CAACC;YAC1D,IAAID,YAAY,MAAM,IAClB,OAAOE,OAAO,IAAI,CAAC,IAAIC,0BAA0BF;YAGrD,MAAMG,gBAAgB,IAAI,CAAC,WAAW,CAAC,SAAS,CAAC;gBAC7C,IAAI;gBACJ,WAAW;gBACX,SAAS;gBACT,WAAWL,MAAM,SAAS;gBAC1B,kBAAkB;gBAClB,WAAWA,MAAM,SAAS;gBAC1B,QAAQA,MAAM,MAAM;gBACpB,SAASA,MAAM,OAAO;gBACtB,gBAAgB;gBAChB,cAAc;gBACd,gBAAgB;gBAChB,iBAAiB;gBACjB,cAAc;YAClB;YAEA,MAAM,EAAEM,KAAK,EAAE,GACX,MAAM,IAAI,CAAC,sBAAsB,CAAC,MAAM,CACpCL,YAAY,KAAK,EACjB;gBAAE,QAAQI;YAAc;YAGhC,MAAME,eAAe,MAAM,IAAI,CAAC,qBAAqB,CAAC,OAAO,CAACN,YAAY,KAAK,EAAEK;YAEjF,IAAIC,aAAa,MAAM,IACnB,OAAOJ,OAAO,IAAI,CAACK,wBAAwB,IAAI,CAACD,aAAa,KAAK;YAGtE,MAAME,WAAW,IAAI,CAAC,WAAW,CAAC,WAAW,CAACH;YAE9C,OAAOH,OAAO,EAAE,CAACM;QACrB,EAAE,OAAOC,OAAO;YACZ,OAAOP,OAAO,IAAI,CAACK,wBAAwB,IAAI,CAACE;QACpD;IACJ;AACJ;AAEO,MAAMC,kEAAkCC,gCAAAA,oBAA0C,CAAC;IACtF,gBAAgBjB;IAChB,cAAc;QACVkB;QACAC;QACAC;QACAC;KACH;AACL"}
1
+ {"version":3,"file":"api/features/CreateWebhookDelivery/CreateWebhookDeliveryRepository.js","sources":["../../../../src/api/features/CreateWebhookDelivery/CreateWebhookDeliveryRepository.ts"],"sourcesContent":["import { Result } from \"@webiny/feature/api\";\nimport { GetModelRepository } from \"@webiny/api-headless-cms/features/contentModel/GetModel/index.js\";\nimport { CreateEntryDataFactory } from \"@webiny/api-headless-cms/exports/api/cms/entry.js\";\nimport { CreateEntryRepository } from \"@webiny/api-headless-cms/features/contentEntry/CreateEntry/index.js\";\nimport { WebhookDeliveryTransformer } from \"~/api/features/Transformers/abstractions/WebhookDeliveryTransformer.js\";\nimport type { ICreateDeliveryInput } from \"./abstractions.js\";\nimport { CreateWebhookDeliveryRepository as RepositoryAbstraction } from \"./abstractions.js\";\nimport { WebhookModelNotFoundError, WebhookPersistenceError } from \"~/api/domain/errors.js\";\nimport { WEBHOOK_DELIVERY_MODEL_ID } from \"~/api/domain/constants.js\";\nimport type {\n WebhookDelivery,\n WebhookDeliveryCmsEntryValues\n} from \"~/api/domain/WebhookDelivery.js\";\n\nclass CreateWebhookDeliveryRepositoryImpl implements RepositoryAbstraction.Interface {\n constructor(\n private readonly getModelRepository: GetModelRepository.Interface,\n private readonly createEntryDataFactory: CreateEntryDataFactory.Interface,\n private readonly createEntryRepository: CreateEntryRepository.Interface,\n private readonly transformer: WebhookDeliveryTransformer.Interface\n ) {}\n\n async execute(\n input: ICreateDeliveryInput\n ): Promise<Result<WebhookDelivery, RepositoryAbstraction.Error>> {\n try {\n const modelResult = await this.getModelRepository.execute(WEBHOOK_DELIVERY_MODEL_ID);\n if (modelResult.isFail()) {\n return Result.fail(new WebhookModelNotFoundError(WEBHOOK_DELIVERY_MODEL_ID));\n }\n\n const storageValues = this.transformer.toStorage({\n id: \"\",\n createdOn: \"\",\n savedOn: \"\",\n webhookId: input.webhookId,\n backgroundTaskId: null,\n eventType: input.eventType,\n status: input.status,\n payload: input.payload,\n requestHeaders: null,\n responseTime: null,\n responseStatus: null,\n responseHeaders: null,\n responseBody: null\n });\n\n const expiresAt = new Date(input.expiresAt);\n\n const { entry } =\n await this.createEntryDataFactory.create<WebhookDeliveryCmsEntryValues>(\n modelResult.value,\n {\n values: storageValues,\n expiresAt\n }\n );\n\n const createResult = await this.createEntryRepository.execute(modelResult.value, entry);\n\n if (createResult.isFail()) {\n return Result.fail(WebhookPersistenceError.from(createResult.error));\n }\n\n const delivery = this.transformer.fromStorage(entry);\n\n return Result.ok(delivery);\n } catch (error) {\n return Result.fail(WebhookPersistenceError.from(error));\n }\n }\n}\n\nexport const CreateWebhookDeliveryRepository = RepositoryAbstraction.createImplementation({\n implementation: CreateWebhookDeliveryRepositoryImpl,\n dependencies: [\n GetModelRepository,\n CreateEntryDataFactory,\n CreateEntryRepository,\n WebhookDeliveryTransformer\n ]\n});\n"],"names":["CreateWebhookDeliveryRepositoryImpl","getModelRepository","createEntryDataFactory","createEntryRepository","transformer","input","modelResult","WEBHOOK_DELIVERY_MODEL_ID","Result","WebhookModelNotFoundError","storageValues","expiresAt","Date","entry","createResult","WebhookPersistenceError","delivery","error","CreateWebhookDeliveryRepository","RepositoryAbstraction","GetModelRepository","CreateEntryDataFactory","CreateEntryRepository","WebhookDeliveryTransformer"],"mappings":";;;;;;;;AAcA,MAAMA;IACF,YACqBC,kBAAgD,EAChDC,sBAAwD,EACxDC,qBAAsD,EACtDC,WAAiD,CACpE;aAJmBH,kBAAkB,GAAlBA;aACAC,sBAAsB,GAAtBA;aACAC,qBAAqB,GAArBA;aACAC,WAAW,GAAXA;IAClB;IAEH,MAAM,QACFC,KAA2B,EACkC;QAC7D,IAAI;YACA,MAAMC,cAAc,MAAM,IAAI,CAAC,kBAAkB,CAAC,OAAO,CAACC;YAC1D,IAAID,YAAY,MAAM,IAClB,OAAOE,OAAO,IAAI,CAAC,IAAIC,0BAA0BF;YAGrD,MAAMG,gBAAgB,IAAI,CAAC,WAAW,CAAC,SAAS,CAAC;gBAC7C,IAAI;gBACJ,WAAW;gBACX,SAAS;gBACT,WAAWL,MAAM,SAAS;gBAC1B,kBAAkB;gBAClB,WAAWA,MAAM,SAAS;gBAC1B,QAAQA,MAAM,MAAM;gBACpB,SAASA,MAAM,OAAO;gBACtB,gBAAgB;gBAChB,cAAc;gBACd,gBAAgB;gBAChB,iBAAiB;gBACjB,cAAc;YAClB;YAEA,MAAMM,YAAY,IAAIC,KAAKP,MAAM,SAAS;YAE1C,MAAM,EAAEQ,KAAK,EAAE,GACX,MAAM,IAAI,CAAC,sBAAsB,CAAC,MAAM,CACpCP,YAAY,KAAK,EACjB;gBACI,QAAQI;gBACRC;YACJ;YAGR,MAAMG,eAAe,MAAM,IAAI,CAAC,qBAAqB,CAAC,OAAO,CAACR,YAAY,KAAK,EAAEO;YAEjF,IAAIC,aAAa,MAAM,IACnB,OAAON,OAAO,IAAI,CAACO,wBAAwB,IAAI,CAACD,aAAa,KAAK;YAGtE,MAAME,WAAW,IAAI,CAAC,WAAW,CAAC,WAAW,CAACH;YAE9C,OAAOL,OAAO,EAAE,CAACQ;QACrB,EAAE,OAAOC,OAAO;YACZ,OAAOT,OAAO,IAAI,CAACO,wBAAwB,IAAI,CAACE;QACpD;IACJ;AACJ;AAEO,MAAMC,kEAAkCC,gCAAAA,oBAA0C,CAAC;IACtF,gBAAgBnB;IAChB,cAAc;QACVoB;QACAC;QACAC;QACAC;KACH;AACL"}
@@ -7,7 +7,7 @@ export interface ICreateDeliveryInput {
7
7
  eventType: string;
8
8
  status: WebhookDeliveryStatus;
9
9
  payload: GenericRecord;
10
- expiresAt: string;
10
+ expiresAt: Date;
11
11
  }
12
12
  type IError = WebhookPersistenceError | WebhookModelNotFoundError;
13
13
  export interface ICreateWebhookDeliveryRepository {
@@ -1 +1 @@
1
- {"version":3,"file":"api/features/CreateWebhookDelivery/abstractions.js","sources":["../../../../src/api/features/CreateWebhookDelivery/abstractions.ts"],"sourcesContent":["import { createAbstraction, type Result } from \"@webiny/feature/api\";\nimport type { GenericRecord } from \"@webiny/api/types.js\";\nimport type { WebhookDelivery, WebhookDeliveryStatus } from \"~/api/domain/WebhookDelivery.js\";\nimport type { WebhookPersistenceError, WebhookModelNotFoundError } from \"~/api/domain/errors.js\";\n\nexport interface ICreateDeliveryInput {\n webhookId: string;\n eventType: string;\n status: WebhookDeliveryStatus;\n payload: GenericRecord;\n expiresAt: string;\n}\n\ntype IError = WebhookPersistenceError | WebhookModelNotFoundError;\n\nexport interface ICreateWebhookDeliveryRepository {\n execute(input: ICreateDeliveryInput): Promise<Result<WebhookDelivery, IError>>;\n}\n\nexport const CreateWebhookDeliveryRepository = createAbstraction<ICreateWebhookDeliveryRepository>(\n \"Webhooks/CreateWebhookDeliveryRepository\"\n);\n\nexport namespace CreateWebhookDeliveryRepository {\n export type Interface = ICreateWebhookDeliveryRepository;\n export type Error = IError;\n}\n"],"names":["CreateWebhookDeliveryRepository","createAbstraction"],"mappings":";AAmBO,MAAMA,kCAAkCC,kBAC3C"}
1
+ {"version":3,"file":"api/features/CreateWebhookDelivery/abstractions.js","sources":["../../../../src/api/features/CreateWebhookDelivery/abstractions.ts"],"sourcesContent":["import { createAbstraction, type Result } from \"@webiny/feature/api\";\nimport type { GenericRecord } from \"@webiny/api/types.js\";\nimport type { WebhookDelivery, WebhookDeliveryStatus } from \"~/api/domain/WebhookDelivery.js\";\nimport type { WebhookPersistenceError, WebhookModelNotFoundError } from \"~/api/domain/errors.js\";\n\nexport interface ICreateDeliveryInput {\n webhookId: string;\n eventType: string;\n status: WebhookDeliveryStatus;\n payload: GenericRecord;\n expiresAt: Date;\n}\n\ntype IError = WebhookPersistenceError | WebhookModelNotFoundError;\n\nexport interface ICreateWebhookDeliveryRepository {\n execute(input: ICreateDeliveryInput): Promise<Result<WebhookDelivery, IError>>;\n}\n\nexport const CreateWebhookDeliveryRepository = createAbstraction<ICreateWebhookDeliveryRepository>(\n \"Webhooks/CreateWebhookDeliveryRepository\"\n);\n\nexport namespace CreateWebhookDeliveryRepository {\n export type Interface = ICreateWebhookDeliveryRepository;\n export type Error = IError;\n}\n"],"names":["CreateWebhookDeliveryRepository","createAbstraction"],"mappings":";AAmBO,MAAMA,kCAAkCC,kBAC3C"}
@@ -25,7 +25,8 @@ class GetWebhookSettingsRepositoryImpl {
25
25
  id: entryId
26
26
  });
27
27
  if (entryResult.isOk()) return Result.ok({
28
- signingSecret: entryResult.value.values.signingSecret
28
+ signingSecret: entryResult.value.values.signingSecret,
29
+ deliveryRetentionDays: entryResult.value.values.deliveryRetentionDays
29
30
  });
30
31
  const { entry } = await this.createEntryDataFactory.create(model, {
31
32
  id: singletonId,
@@ -34,7 +35,8 @@ class GetWebhookSettingsRepositoryImpl {
34
35
  const createResult = await this.createEntryRepository.execute(model, entry);
35
36
  if (createResult.isFail()) return Result.fail(WebhookPersistenceError.from(createResult.error));
36
37
  return Result.ok({
37
- signingSecret: void 0
38
+ signingSecret: void 0,
39
+ deliveryRetentionDays: void 0
38
40
  });
39
41
  } catch (error) {
40
42
  return Result.fail(WebhookPersistenceError.from(error));
@@ -1 +1 @@
1
- {"version":3,"file":"api/features/GetWebhookSettings/GetWebhookSettingsRepository.js","sources":["../../../../src/api/features/GetWebhookSettings/GetWebhookSettingsRepository.ts"],"sourcesContent":["import { Result } from \"@webiny/feature/api\";\nimport { createCacheKey } from \"@webiny/utils\";\nimport { GetModelRepository } from \"@webiny/api-headless-cms/features/contentModel/GetModel/index.js\";\nimport { GetLatestRevisionByEntryIdRepository } from \"@webiny/api-headless-cms/features/contentEntry/GetLatestRevisionByEntryId/index.js\";\nimport { CreateEntryRepository } from \"@webiny/api-headless-cms/features/contentEntry/CreateEntry/index.js\";\nimport { CreateEntryDataFactory } from \"@webiny/api-headless-cms/exports/api/cms/entry.js\";\nimport { GetWebhookSettingsRepository as RepositoryAbstraction } from \"./abstractions.js\";\nimport { WebhookModelNotFoundError, WebhookPersistenceError } from \"~/api/domain/errors.js\";\nimport { WEBHOOK_SETTINGS_MODEL_ID } from \"~/api/domain/constants.js\";\nimport type { IWebhookSettings } from \"~/api/domain/WebhookSettings.js\";\n\ninterface WebhookSettingsValues {\n signingSecret?: string;\n}\n\nclass GetWebhookSettingsRepositoryImpl implements RepositoryAbstraction.Interface {\n constructor(\n private readonly getModelRepository: GetModelRepository.Interface,\n private readonly getLatestRevisionRepository: GetLatestRevisionByEntryIdRepository.Interface,\n private readonly createEntryRepository: CreateEntryRepository.Interface,\n private readonly createEntryDataFactory: CreateEntryDataFactory.Interface\n ) {}\n\n async execute(): Promise<Result<IWebhookSettings, RepositoryAbstraction.Error>> {\n try {\n const modelResult = await this.getModelRepository.execute(WEBHOOK_SETTINGS_MODEL_ID);\n if (modelResult.isFail()) {\n return Result.fail(new WebhookModelNotFoundError(WEBHOOK_SETTINGS_MODEL_ID));\n }\n\n const model = modelResult.value;\n const singletonId = createCacheKey(model.modelId);\n const entryId = `${singletonId}#0001`;\n\n const entryResult =\n await this.getLatestRevisionRepository.execute<WebhookSettingsValues>(model, {\n id: entryId\n });\n\n if (entryResult.isOk()) {\n return Result.ok({\n signingSecret: entryResult.value.values.signingSecret\n });\n }\n\n /* Entry doesn't exist yet — create it with empty values. */\n const { entry } = await this.createEntryDataFactory.create<WebhookSettingsValues>(\n model,\n { id: singletonId, values: {} as WebhookSettingsValues }\n );\n\n const createResult = await this.createEntryRepository.execute(model, entry);\n if (createResult.isFail()) {\n return Result.fail(WebhookPersistenceError.from(createResult.error));\n }\n\n return Result.ok({ signingSecret: undefined });\n } catch (error) {\n return Result.fail(WebhookPersistenceError.from(error));\n }\n }\n}\n\nexport const GetWebhookSettingsRepository = RepositoryAbstraction.createImplementation({\n implementation: GetWebhookSettingsRepositoryImpl,\n dependencies: [\n GetModelRepository,\n GetLatestRevisionByEntryIdRepository,\n CreateEntryRepository,\n CreateEntryDataFactory\n ]\n});\n"],"names":["GetWebhookSettingsRepositoryImpl","getModelRepository","getLatestRevisionRepository","createEntryRepository","createEntryDataFactory","modelResult","WEBHOOK_SETTINGS_MODEL_ID","Result","WebhookModelNotFoundError","model","singletonId","createCacheKey","entryId","entryResult","entry","createResult","WebhookPersistenceError","undefined","error","GetWebhookSettingsRepository","RepositoryAbstraction","GetModelRepository","GetLatestRevisionByEntryIdRepository","CreateEntryRepository","CreateEntryDataFactory"],"mappings":";;;;;;;;;AAeA,MAAMA;IACF,YACqBC,kBAAgD,EAChDC,2BAA2E,EAC3EC,qBAAsD,EACtDC,sBAAwD,CAC3E;aAJmBH,kBAAkB,GAAlBA;aACAC,2BAA2B,GAA3BA;aACAC,qBAAqB,GAArBA;aACAC,sBAAsB,GAAtBA;IAClB;IAEH,MAAM,UAA0E;QAC5E,IAAI;YACA,MAAMC,cAAc,MAAM,IAAI,CAAC,kBAAkB,CAAC,OAAO,CAACC;YAC1D,IAAID,YAAY,MAAM,IAClB,OAAOE,OAAO,IAAI,CAAC,IAAIC,0BAA0BF;YAGrD,MAAMG,QAAQJ,YAAY,KAAK;YAC/B,MAAMK,cAAcC,eAAeF,MAAM,OAAO;YAChD,MAAMG,UAAU,GAAGF,YAAY,KAAK,CAAC;YAErC,MAAMG,cACF,MAAM,IAAI,CAAC,2BAA2B,CAAC,OAAO,CAAwBJ,OAAO;gBACzE,IAAIG;YACR;YAEJ,IAAIC,YAAY,IAAI,IAChB,OAAON,OAAO,EAAE,CAAC;gBACb,eAAeM,YAAY,KAAK,CAAC,MAAM,CAAC,aAAa;YACzD;YAIJ,MAAM,EAAEC,KAAK,EAAE,GAAG,MAAM,IAAI,CAAC,sBAAsB,CAAC,MAAM,CACtDL,OACA;gBAAE,IAAIC;gBAAa,QAAQ,CAAC;YAA2B;YAG3D,MAAMK,eAAe,MAAM,IAAI,CAAC,qBAAqB,CAAC,OAAO,CAACN,OAAOK;YACrE,IAAIC,aAAa,MAAM,IACnB,OAAOR,OAAO,IAAI,CAACS,wBAAwB,IAAI,CAACD,aAAa,KAAK;YAGtE,OAAOR,OAAO,EAAE,CAAC;gBAAE,eAAeU;YAAU;QAChD,EAAE,OAAOC,OAAO;YACZ,OAAOX,OAAO,IAAI,CAACS,wBAAwB,IAAI,CAACE;QACpD;IACJ;AACJ;AAEO,MAAMC,4DAA+BC,6BAAAA,oBAA0C,CAAC;IACnF,gBAAgBpB;IAChB,cAAc;QACVqB;QACAC;QACAC;QACAC;KACH;AACL"}
1
+ {"version":3,"file":"api/features/GetWebhookSettings/GetWebhookSettingsRepository.js","sources":["../../../../src/api/features/GetWebhookSettings/GetWebhookSettingsRepository.ts"],"sourcesContent":["import { Result } from \"@webiny/feature/api\";\nimport { createCacheKey } from \"@webiny/utils\";\nimport { GetModelRepository } from \"@webiny/api-headless-cms/features/contentModel/GetModel/index.js\";\nimport { GetLatestRevisionByEntryIdRepository } from \"@webiny/api-headless-cms/features/contentEntry/GetLatestRevisionByEntryId/index.js\";\nimport { CreateEntryRepository } from \"@webiny/api-headless-cms/features/contentEntry/CreateEntry/index.js\";\nimport { CreateEntryDataFactory } from \"@webiny/api-headless-cms/exports/api/cms/entry.js\";\nimport { GetWebhookSettingsRepository as RepositoryAbstraction } from \"./abstractions.js\";\nimport { WebhookModelNotFoundError, WebhookPersistenceError } from \"~/api/domain/errors.js\";\nimport { WEBHOOK_SETTINGS_MODEL_ID } from \"~/api/domain/constants.js\";\nimport type { IWebhookSettings } from \"~/api/domain/WebhookSettings.js\";\n\ninterface WebhookSettingsValues {\n signingSecret?: string;\n deliveryRetentionDays?: number;\n}\n\nclass GetWebhookSettingsRepositoryImpl implements RepositoryAbstraction.Interface {\n constructor(\n private readonly getModelRepository: GetModelRepository.Interface,\n private readonly getLatestRevisionRepository: GetLatestRevisionByEntryIdRepository.Interface,\n private readonly createEntryRepository: CreateEntryRepository.Interface,\n private readonly createEntryDataFactory: CreateEntryDataFactory.Interface\n ) {}\n\n async execute(): Promise<Result<IWebhookSettings, RepositoryAbstraction.Error>> {\n try {\n const modelResult = await this.getModelRepository.execute(WEBHOOK_SETTINGS_MODEL_ID);\n if (modelResult.isFail()) {\n return Result.fail(new WebhookModelNotFoundError(WEBHOOK_SETTINGS_MODEL_ID));\n }\n\n const model = modelResult.value;\n const singletonId = createCacheKey(model.modelId);\n const entryId = `${singletonId}#0001`;\n\n const entryResult =\n await this.getLatestRevisionRepository.execute<WebhookSettingsValues>(model, {\n id: entryId\n });\n\n if (entryResult.isOk()) {\n return Result.ok({\n signingSecret: entryResult.value.values.signingSecret,\n deliveryRetentionDays: entryResult.value.values.deliveryRetentionDays\n });\n }\n\n /* Entry doesn't exist yet — create it with empty values. */\n const { entry } = await this.createEntryDataFactory.create<WebhookSettingsValues>(\n model,\n { id: singletonId, values: {} as WebhookSettingsValues }\n );\n\n const createResult = await this.createEntryRepository.execute(model, entry);\n if (createResult.isFail()) {\n return Result.fail(WebhookPersistenceError.from(createResult.error));\n }\n\n return Result.ok({ signingSecret: undefined, deliveryRetentionDays: undefined });\n } catch (error) {\n return Result.fail(WebhookPersistenceError.from(error));\n }\n }\n}\n\nexport const GetWebhookSettingsRepository = RepositoryAbstraction.createImplementation({\n implementation: GetWebhookSettingsRepositoryImpl,\n dependencies: [\n GetModelRepository,\n GetLatestRevisionByEntryIdRepository,\n CreateEntryRepository,\n CreateEntryDataFactory\n ]\n});\n"],"names":["GetWebhookSettingsRepositoryImpl","getModelRepository","getLatestRevisionRepository","createEntryRepository","createEntryDataFactory","modelResult","WEBHOOK_SETTINGS_MODEL_ID","Result","WebhookModelNotFoundError","model","singletonId","createCacheKey","entryId","entryResult","entry","createResult","WebhookPersistenceError","undefined","error","GetWebhookSettingsRepository","RepositoryAbstraction","GetModelRepository","GetLatestRevisionByEntryIdRepository","CreateEntryRepository","CreateEntryDataFactory"],"mappings":";;;;;;;;;AAgBA,MAAMA;IACF,YACqBC,kBAAgD,EAChDC,2BAA2E,EAC3EC,qBAAsD,EACtDC,sBAAwD,CAC3E;aAJmBH,kBAAkB,GAAlBA;aACAC,2BAA2B,GAA3BA;aACAC,qBAAqB,GAArBA;aACAC,sBAAsB,GAAtBA;IAClB;IAEH,MAAM,UAA0E;QAC5E,IAAI;YACA,MAAMC,cAAc,MAAM,IAAI,CAAC,kBAAkB,CAAC,OAAO,CAACC;YAC1D,IAAID,YAAY,MAAM,IAClB,OAAOE,OAAO,IAAI,CAAC,IAAIC,0BAA0BF;YAGrD,MAAMG,QAAQJ,YAAY,KAAK;YAC/B,MAAMK,cAAcC,eAAeF,MAAM,OAAO;YAChD,MAAMG,UAAU,GAAGF,YAAY,KAAK,CAAC;YAErC,MAAMG,cACF,MAAM,IAAI,CAAC,2BAA2B,CAAC,OAAO,CAAwBJ,OAAO;gBACzE,IAAIG;YACR;YAEJ,IAAIC,YAAY,IAAI,IAChB,OAAON,OAAO,EAAE,CAAC;gBACb,eAAeM,YAAY,KAAK,CAAC,MAAM,CAAC,aAAa;gBACrD,uBAAuBA,YAAY,KAAK,CAAC,MAAM,CAAC,qBAAqB;YACzE;YAIJ,MAAM,EAAEC,KAAK,EAAE,GAAG,MAAM,IAAI,CAAC,sBAAsB,CAAC,MAAM,CACtDL,OACA;gBAAE,IAAIC;gBAAa,QAAQ,CAAC;YAA2B;YAG3D,MAAMK,eAAe,MAAM,IAAI,CAAC,qBAAqB,CAAC,OAAO,CAACN,OAAOK;YACrE,IAAIC,aAAa,MAAM,IACnB,OAAOR,OAAO,IAAI,CAACS,wBAAwB,IAAI,CAACD,aAAa,KAAK;YAGtE,OAAOR,OAAO,EAAE,CAAC;gBAAE,eAAeU;gBAAW,uBAAuBA;YAAU;QAClF,EAAE,OAAOC,OAAO;YACZ,OAAOX,OAAO,IAAI,CAACS,wBAAwB,IAAI,CAACE;QACpD;IACJ;AACJ;AAEO,MAAMC,4DAA+BC,6BAAAA,oBAA0C,CAAC;IACnF,gBAAgBpB;IAChB,cAAc;QACVqB;QACAC;QACAC;QACAC;KACH;AACL"}
@@ -3,6 +3,7 @@ import { ResendWebhookDeliveryUseCase as UseCaseAbstraction } from "./abstractio
3
3
  import { GetWebhookDeliveryRepository } from "../../../api/features/GetWebhookDelivery/abstractions.js";
4
4
  import { GetWebhookRepository } from "../../../api/features/GetWebhook/abstractions.js";
5
5
  import { CreateWebhookDeliveryRepository } from "../../../api/features/CreateWebhookDelivery/abstractions.js";
6
+ import { GetWebhookSettingsRepository } from "../../../api/features/GetWebhookSettings/abstractions.js";
6
7
  import { WebhookPermissions } from "../../../api/features/WebhookPermissions/abstractions.js";
7
8
  import { TaskService } from "@webiny/api-core/exports/api/tasks.js";
8
9
  declare class ResendWebhookDeliveryUseCaseImpl implements UseCaseAbstraction.Interface {
@@ -11,7 +12,8 @@ declare class ResendWebhookDeliveryUseCaseImpl implements UseCaseAbstraction.Int
11
12
  private readonly getWebhookRepository;
12
13
  private readonly createDeliveryRepository;
13
14
  private readonly taskService;
14
- constructor(permissions: WebhookPermissions.Interface, getDeliveryRepository: GetWebhookDeliveryRepository.Interface, getWebhookRepository: GetWebhookRepository.Interface, createDeliveryRepository: CreateWebhookDeliveryRepository.Interface, taskService: TaskService.Interface);
15
+ private readonly getSettingsRepository;
16
+ constructor(permissions: WebhookPermissions.Interface, getDeliveryRepository: GetWebhookDeliveryRepository.Interface, getWebhookRepository: GetWebhookRepository.Interface, createDeliveryRepository: CreateWebhookDeliveryRepository.Interface, taskService: TaskService.Interface, getSettingsRepository: GetWebhookSettingsRepository.Interface);
15
17
  execute(deliveryId: string): Promise<Result<boolean, UseCaseAbstraction.Error>>;
16
18
  }
17
19
  export declare const ResendWebhookDeliveryUseCase: typeof ResendWebhookDeliveryUseCaseImpl & {
@@ -4,17 +4,19 @@ import { ResendWebhookDeliveryInputSchema } from "./schema.js";
4
4
  import { GetWebhookDeliveryRepository } from "../GetWebhookDelivery/abstractions.js";
5
5
  import { GetWebhookRepository } from "../GetWebhook/abstractions.js";
6
6
  import { CreateWebhookDeliveryRepository } from "../CreateWebhookDelivery/abstractions.js";
7
+ import { GetWebhookSettingsRepository } from "../GetWebhookSettings/abstractions.js";
7
8
  import { WebhookPermissions } from "../WebhookPermissions/abstractions.js";
8
9
  import { WebhookNotAuthorizedError, WebhookValidationError } from "../../domain/errors.js";
9
10
  import { TaskService } from "@webiny/api-core/exports/api/tasks.js";
10
- import { SEND_WEBHOOK_TASK, WEBHOOK_DELIVERY_RETENTION_DAYS } from "../../domain/constants.js";
11
+ import { SEND_WEBHOOK_TASK, WEBHOOK_DELIVERY_MAX_RETENTION_DAYS } from "../../domain/constants.js";
11
12
  class ResendWebhookDeliveryUseCaseImpl {
12
- constructor(permissions, getDeliveryRepository, getWebhookRepository, createDeliveryRepository, taskService){
13
+ constructor(permissions, getDeliveryRepository, getWebhookRepository, createDeliveryRepository, taskService, getSettingsRepository){
13
14
  this.permissions = permissions;
14
15
  this.getDeliveryRepository = getDeliveryRepository;
15
16
  this.getWebhookRepository = getWebhookRepository;
16
17
  this.createDeliveryRepository = createDeliveryRepository;
17
18
  this.taskService = taskService;
19
+ this.getSettingsRepository = getSettingsRepository;
18
20
  }
19
21
  async execute(deliveryId) {
20
22
  if (!await this.permissions.canEdit("webhook")) return Result.fail(new WebhookNotAuthorizedError());
@@ -29,7 +31,9 @@ class ResendWebhookDeliveryUseCaseImpl {
29
31
  if (webhookResult.isFail()) return Result.fail(webhookResult.error);
30
32
  const originalPayload = delivery.payload;
31
33
  const data = originalPayload?.data ?? {};
32
- const expiresAt = new Date(Date.now() + 24 * WEBHOOK_DELIVERY_RETENTION_DAYS * 3600000).toISOString();
34
+ const settingsResult = await this.getSettingsRepository.execute();
35
+ const retentionDays = settingsResult.isOk() ? settingsResult.value.deliveryRetentionDays ?? WEBHOOK_DELIVERY_MAX_RETENTION_DAYS : WEBHOOK_DELIVERY_MAX_RETENTION_DAYS;
36
+ const expiresAt = new Date(Date.now() + 24 * retentionDays * 3600000);
33
37
  const newDeliveryResult = await this.createDeliveryRepository.execute({
34
38
  webhookId: delivery.webhookId,
35
39
  eventType: delivery.eventType,
@@ -57,7 +61,8 @@ const ResendWebhookDeliveryUseCase_ResendWebhookDeliveryUseCase = ResendWebhookD
57
61
  GetWebhookDeliveryRepository,
58
62
  GetWebhookRepository,
59
63
  CreateWebhookDeliveryRepository,
60
- TaskService
64
+ TaskService,
65
+ GetWebhookSettingsRepository
61
66
  ]
62
67
  });
63
68
  export { ResendWebhookDeliveryUseCase_ResendWebhookDeliveryUseCase as ResendWebhookDeliveryUseCase };