@contember/engine-actions 2.1.0-alpha.3 → 2.1.0-alpha.30

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 (251) hide show
  1. package/dist/development/index.cjs +10 -5
  2. package/dist/development/index.cjs.map +1 -1
  3. package/dist/development/index.js +10 -5
  4. package/dist/development/index.js.map +1 -1
  5. package/dist/development/src/ActionsExecutionContainerHookFactory.cjs +3 -3
  6. package/dist/development/src/ActionsExecutionContainerHookFactory.cjs.map +1 -1
  7. package/dist/development/src/ActionsExecutionContainerHookFactory.js +3 -3
  8. package/dist/development/src/ActionsExecutionContainerHookFactory.js.map +1 -1
  9. package/dist/development/src/authorization/ActionsAuthorizationActions.cjs +2 -0
  10. package/dist/development/src/authorization/ActionsAuthorizationActions.cjs.map +1 -1
  11. package/dist/development/src/authorization/ActionsAuthorizationActions.js +2 -0
  12. package/dist/development/src/authorization/ActionsAuthorizationActions.js.map +1 -1
  13. package/dist/development/src/dispatch/EventsRepository.cjs +17 -4
  14. package/dist/development/src/dispatch/EventsRepository.cjs.map +1 -1
  15. package/dist/development/src/dispatch/EventsRepository.js +17 -4
  16. package/dist/development/src/dispatch/EventsRepository.js.map +1 -1
  17. package/dist/development/src/dispatch/ProjectDispatcher.cjs +2 -2
  18. package/dist/development/src/dispatch/ProjectDispatcher.cjs.map +1 -1
  19. package/dist/development/src/dispatch/ProjectDispatcher.js +1 -1
  20. package/dist/development/src/dispatch/ProjectDispatcher.js.map +1 -1
  21. package/dist/development/src/dispatch/WebhookTargetHandler.cjs +3 -0
  22. package/dist/development/src/dispatch/WebhookTargetHandler.cjs.map +1 -1
  23. package/dist/development/src/dispatch/WebhookTargetHandler.js +3 -0
  24. package/dist/development/src/dispatch/WebhookTargetHandler.js.map +1 -1
  25. package/dist/development/src/graphql/http/ActionsApiMiddlewareFactory.cjs +1 -0
  26. package/dist/development/src/graphql/http/ActionsApiMiddlewareFactory.cjs.map +1 -1
  27. package/dist/development/src/graphql/http/ActionsApiMiddlewareFactory.js +1 -0
  28. package/dist/development/src/graphql/http/ActionsApiMiddlewareFactory.js.map +1 -1
  29. package/dist/development/src/graphql/resolvers/ResolversFactory.cjs +7 -2
  30. package/dist/development/src/graphql/resolvers/ResolversFactory.cjs.map +1 -1
  31. package/dist/development/src/graphql/resolvers/ResolversFactory.js +7 -2
  32. package/dist/development/src/graphql/resolvers/ResolversFactory.js.map +1 -1
  33. package/dist/development/src/graphql/resolvers/mutation/RetryEventMutationResolver.cjs +21 -0
  34. package/dist/development/src/graphql/resolvers/mutation/RetryEventMutationResolver.cjs.map +1 -0
  35. package/dist/development/src/graphql/resolvers/mutation/RetryEventMutationResolver.js +21 -0
  36. package/dist/development/src/graphql/resolvers/mutation/RetryEventMutationResolver.js.map +1 -0
  37. package/dist/development/src/graphql/resolvers/mutation/StopEventMutationResolver.cjs +19 -0
  38. package/dist/development/src/graphql/resolvers/mutation/StopEventMutationResolver.cjs.map +1 -0
  39. package/dist/development/src/graphql/resolvers/mutation/StopEventMutationResolver.js +19 -0
  40. package/dist/development/src/graphql/resolvers/mutation/StopEventMutationResolver.js.map +1 -0
  41. package/dist/development/src/graphql/resolvers/query/EventsQueryResolver.cjs +14 -1
  42. package/dist/development/src/graphql/resolvers/query/EventsQueryResolver.cjs.map +1 -1
  43. package/dist/development/src/graphql/resolvers/query/EventsQueryResolver.js +14 -1
  44. package/dist/development/src/graphql/resolvers/query/EventsQueryResolver.js.map +1 -1
  45. package/dist/development/src/graphql/schema/actions.graphql.cjs +18 -4
  46. package/dist/development/src/graphql/schema/actions.graphql.cjs.map +1 -1
  47. package/dist/development/src/graphql/schema/actions.graphql.js +18 -4
  48. package/dist/development/src/graphql/schema/actions.graphql.js.map +1 -1
  49. package/dist/development/src/migrations/2025-05-28-160000-action-event-user.cjs +16 -0
  50. package/dist/development/src/migrations/2025-05-28-160000-action-event-user.cjs.map +1 -0
  51. package/dist/development/src/migrations/2025-05-28-160000-action-event-user.js +17 -0
  52. package/dist/development/src/migrations/2025-05-28-160000-action-event-user.js.map +1 -0
  53. package/dist/development/src/migrations/index.cjs +3 -1
  54. package/dist/development/src/migrations/index.cjs.map +1 -1
  55. package/dist/development/src/migrations/index.js +3 -1
  56. package/dist/development/src/migrations/index.js.map +1 -1
  57. package/dist/development/src/migrations/snapshot.cjs +5 -2
  58. package/dist/development/src/migrations/snapshot.cjs.map +1 -1
  59. package/dist/development/src/migrations/snapshot.js +5 -2
  60. package/dist/development/src/migrations/snapshot.js.map +1 -1
  61. package/dist/development/src/model/EventByIdQuery.cjs +17 -0
  62. package/dist/development/src/model/EventByIdQuery.cjs.map +1 -0
  63. package/dist/development/src/model/EventByIdQuery.js +17 -0
  64. package/dist/development/src/model/EventByIdQuery.js.map +1 -0
  65. package/dist/development/src/triggers/TriggerHandler.cjs +12 -11
  66. package/dist/development/src/triggers/TriggerHandler.cjs.map +1 -1
  67. package/dist/development/src/triggers/TriggerHandler.js +12 -11
  68. package/dist/development/src/triggers/TriggerHandler.js.map +1 -1
  69. package/dist/development/src/triggers/TriggerIndirectChangesFetcher.cjs +44 -2
  70. package/dist/development/src/triggers/TriggerIndirectChangesFetcher.cjs.map +1 -1
  71. package/dist/development/src/triggers/TriggerIndirectChangesFetcher.js +44 -2
  72. package/dist/development/src/triggers/TriggerIndirectChangesFetcher.js.map +1 -1
  73. package/dist/development/src/triggers/TriggerListenersStore.cjs.map +1 -1
  74. package/dist/development/src/triggers/TriggerListenersStore.js.map +1 -1
  75. package/dist/development/src/triggers/TriggerPayloadBuilder.cjs +20 -5
  76. package/dist/development/src/triggers/TriggerPayloadBuilder.cjs.map +1 -1
  77. package/dist/development/src/triggers/TriggerPayloadBuilder.js +20 -5
  78. package/dist/development/src/triggers/TriggerPayloadBuilder.js.map +1 -1
  79. package/dist/development/src/triggers/TriggerPayloadManager.cjs.map +1 -1
  80. package/dist/development/src/triggers/TriggerPayloadManager.js.map +1 -1
  81. package/dist/development/src/triggers/TriggerPayloadPersister.cjs +9 -5
  82. package/dist/development/src/triggers/TriggerPayloadPersister.cjs.map +1 -1
  83. package/dist/development/src/triggers/TriggerPayloadPersister.js +9 -5
  84. package/dist/development/src/triggers/TriggerPayloadPersister.js.map +1 -1
  85. package/dist/development/src/utils/notifyChannel.cjs +9 -0
  86. package/dist/development/src/utils/notifyChannel.cjs.map +1 -0
  87. package/dist/development/src/utils/notifyChannel.js +9 -0
  88. package/dist/development/src/utils/notifyChannel.js.map +1 -0
  89. package/dist/production/index.cjs +10 -5
  90. package/dist/production/index.cjs.map +1 -1
  91. package/dist/production/index.js +10 -5
  92. package/dist/production/index.js.map +1 -1
  93. package/dist/production/src/ActionsExecutionContainerHookFactory.cjs +3 -3
  94. package/dist/production/src/ActionsExecutionContainerHookFactory.cjs.map +1 -1
  95. package/dist/production/src/ActionsExecutionContainerHookFactory.js +3 -3
  96. package/dist/production/src/ActionsExecutionContainerHookFactory.js.map +1 -1
  97. package/dist/production/src/authorization/ActionsAuthorizationActions.cjs +2 -0
  98. package/dist/production/src/authorization/ActionsAuthorizationActions.cjs.map +1 -1
  99. package/dist/production/src/authorization/ActionsAuthorizationActions.js +2 -0
  100. package/dist/production/src/authorization/ActionsAuthorizationActions.js.map +1 -1
  101. package/dist/production/src/dispatch/EventsRepository.cjs +17 -4
  102. package/dist/production/src/dispatch/EventsRepository.cjs.map +1 -1
  103. package/dist/production/src/dispatch/EventsRepository.js +17 -4
  104. package/dist/production/src/dispatch/EventsRepository.js.map +1 -1
  105. package/dist/production/src/dispatch/ProjectDispatcher.cjs +2 -2
  106. package/dist/production/src/dispatch/ProjectDispatcher.cjs.map +1 -1
  107. package/dist/production/src/dispatch/ProjectDispatcher.js +1 -1
  108. package/dist/production/src/dispatch/ProjectDispatcher.js.map +1 -1
  109. package/dist/production/src/dispatch/WebhookTargetHandler.cjs +3 -0
  110. package/dist/production/src/dispatch/WebhookTargetHandler.cjs.map +1 -1
  111. package/dist/production/src/dispatch/WebhookTargetHandler.js +3 -0
  112. package/dist/production/src/dispatch/WebhookTargetHandler.js.map +1 -1
  113. package/dist/production/src/graphql/http/ActionsApiMiddlewareFactory.cjs +1 -0
  114. package/dist/production/src/graphql/http/ActionsApiMiddlewareFactory.cjs.map +1 -1
  115. package/dist/production/src/graphql/http/ActionsApiMiddlewareFactory.js +1 -0
  116. package/dist/production/src/graphql/http/ActionsApiMiddlewareFactory.js.map +1 -1
  117. package/dist/production/src/graphql/resolvers/ResolversFactory.cjs +7 -2
  118. package/dist/production/src/graphql/resolvers/ResolversFactory.cjs.map +1 -1
  119. package/dist/production/src/graphql/resolvers/ResolversFactory.js +7 -2
  120. package/dist/production/src/graphql/resolvers/ResolversFactory.js.map +1 -1
  121. package/dist/production/src/graphql/resolvers/mutation/RetryEventMutationResolver.cjs +21 -0
  122. package/dist/production/src/graphql/resolvers/mutation/RetryEventMutationResolver.cjs.map +1 -0
  123. package/dist/production/src/graphql/resolvers/mutation/RetryEventMutationResolver.js +21 -0
  124. package/dist/production/src/graphql/resolvers/mutation/RetryEventMutationResolver.js.map +1 -0
  125. package/dist/production/src/graphql/resolvers/mutation/StopEventMutationResolver.cjs +19 -0
  126. package/dist/production/src/graphql/resolvers/mutation/StopEventMutationResolver.cjs.map +1 -0
  127. package/dist/production/src/graphql/resolvers/mutation/StopEventMutationResolver.js +19 -0
  128. package/dist/production/src/graphql/resolvers/mutation/StopEventMutationResolver.js.map +1 -0
  129. package/dist/production/src/graphql/resolvers/query/EventsQueryResolver.cjs +14 -1
  130. package/dist/production/src/graphql/resolvers/query/EventsQueryResolver.cjs.map +1 -1
  131. package/dist/production/src/graphql/resolvers/query/EventsQueryResolver.js +14 -1
  132. package/dist/production/src/graphql/resolvers/query/EventsQueryResolver.js.map +1 -1
  133. package/dist/production/src/graphql/schema/actions.graphql.cjs +18 -4
  134. package/dist/production/src/graphql/schema/actions.graphql.cjs.map +1 -1
  135. package/dist/production/src/graphql/schema/actions.graphql.js +18 -4
  136. package/dist/production/src/graphql/schema/actions.graphql.js.map +1 -1
  137. package/dist/production/src/migrations/2025-05-28-160000-action-event-user.cjs +16 -0
  138. package/dist/production/src/migrations/2025-05-28-160000-action-event-user.cjs.map +1 -0
  139. package/dist/production/src/migrations/2025-05-28-160000-action-event-user.js +17 -0
  140. package/dist/production/src/migrations/2025-05-28-160000-action-event-user.js.map +1 -0
  141. package/dist/production/src/migrations/index.cjs +3 -1
  142. package/dist/production/src/migrations/index.cjs.map +1 -1
  143. package/dist/production/src/migrations/index.js +3 -1
  144. package/dist/production/src/migrations/index.js.map +1 -1
  145. package/dist/production/src/migrations/snapshot.cjs +5 -2
  146. package/dist/production/src/migrations/snapshot.cjs.map +1 -1
  147. package/dist/production/src/migrations/snapshot.js +5 -2
  148. package/dist/production/src/migrations/snapshot.js.map +1 -1
  149. package/dist/production/src/model/EventByIdQuery.cjs +17 -0
  150. package/dist/production/src/model/EventByIdQuery.cjs.map +1 -0
  151. package/dist/production/src/model/EventByIdQuery.js +17 -0
  152. package/dist/production/src/model/EventByIdQuery.js.map +1 -0
  153. package/dist/production/src/triggers/TriggerHandler.cjs +12 -11
  154. package/dist/production/src/triggers/TriggerHandler.cjs.map +1 -1
  155. package/dist/production/src/triggers/TriggerHandler.js +12 -11
  156. package/dist/production/src/triggers/TriggerHandler.js.map +1 -1
  157. package/dist/production/src/triggers/TriggerIndirectChangesFetcher.cjs +44 -2
  158. package/dist/production/src/triggers/TriggerIndirectChangesFetcher.cjs.map +1 -1
  159. package/dist/production/src/triggers/TriggerIndirectChangesFetcher.js +44 -2
  160. package/dist/production/src/triggers/TriggerIndirectChangesFetcher.js.map +1 -1
  161. package/dist/production/src/triggers/TriggerListenersStore.cjs.map +1 -1
  162. package/dist/production/src/triggers/TriggerListenersStore.js.map +1 -1
  163. package/dist/production/src/triggers/TriggerPayloadBuilder.cjs +20 -5
  164. package/dist/production/src/triggers/TriggerPayloadBuilder.cjs.map +1 -1
  165. package/dist/production/src/triggers/TriggerPayloadBuilder.js +20 -5
  166. package/dist/production/src/triggers/TriggerPayloadBuilder.js.map +1 -1
  167. package/dist/production/src/triggers/TriggerPayloadManager.cjs.map +1 -1
  168. package/dist/production/src/triggers/TriggerPayloadManager.js.map +1 -1
  169. package/dist/production/src/triggers/TriggerPayloadPersister.cjs +9 -5
  170. package/dist/production/src/triggers/TriggerPayloadPersister.cjs.map +1 -1
  171. package/dist/production/src/triggers/TriggerPayloadPersister.js +9 -5
  172. package/dist/production/src/triggers/TriggerPayloadPersister.js.map +1 -1
  173. package/dist/production/src/utils/notifyChannel.cjs +9 -0
  174. package/dist/production/src/utils/notifyChannel.cjs.map +1 -0
  175. package/dist/production/src/utils/notifyChannel.js +9 -0
  176. package/dist/production/src/utils/notifyChannel.js.map +1 -0
  177. package/dist/tests/tsconfig.tsbuildinfo +1 -1
  178. package/dist/types/authorization/ActionsAuthorizationActions.d.ts +10 -0
  179. package/dist/types/authorization/ActionsAuthorizationActions.d.ts.map +1 -1
  180. package/dist/types/dispatch/EventsRepository.d.ts +2 -1
  181. package/dist/types/dispatch/EventsRepository.d.ts.map +1 -1
  182. package/dist/types/dispatch/WebhookTargetHandler.d.ts.map +1 -1
  183. package/dist/types/graphql/http/ActionsApiMiddlewareFactory.d.ts.map +1 -1
  184. package/dist/types/graphql/resolvers/ActionsContext.d.ts +3 -0
  185. package/dist/types/graphql/resolvers/ActionsContext.d.ts.map +1 -1
  186. package/dist/types/graphql/resolvers/ResolversFactory.d.ts +4 -2
  187. package/dist/types/graphql/resolvers/ResolversFactory.d.ts.map +1 -1
  188. package/dist/types/graphql/resolvers/mutation/RetryEventMutationResolver.d.ts +11 -0
  189. package/dist/types/graphql/resolvers/mutation/RetryEventMutationResolver.d.ts.map +1 -0
  190. package/dist/types/graphql/resolvers/mutation/StopEventMutationResolver.d.ts +11 -0
  191. package/dist/types/graphql/resolvers/mutation/StopEventMutationResolver.d.ts.map +1 -0
  192. package/dist/types/graphql/resolvers/mutation/index.d.ts +2 -0
  193. package/dist/types/graphql/resolvers/mutation/index.d.ts.map +1 -1
  194. package/dist/types/graphql/resolvers/query/EventsQueryResolver.d.ts +3 -0
  195. package/dist/types/graphql/resolvers/query/EventsQueryResolver.d.ts.map +1 -1
  196. package/dist/types/graphql/schema/actions.graphql.d.ts.map +1 -1
  197. package/dist/types/graphql/schema/index.d.ts +45 -2
  198. package/dist/types/graphql/schema/index.d.ts.map +1 -1
  199. package/dist/types/index.d.ts.map +1 -1
  200. package/dist/types/migrations/2025-05-28-160000-action-event-user.d.ts +3 -0
  201. package/dist/types/migrations/2025-05-28-160000-action-event-user.d.ts.map +1 -0
  202. package/dist/types/migrations/index.d.ts.map +1 -1
  203. package/dist/types/migrations/snapshot.d.ts.map +1 -1
  204. package/dist/types/model/EventByIdQuery.d.ts +8 -0
  205. package/dist/types/model/EventByIdQuery.d.ts.map +1 -0
  206. package/dist/types/model/types.d.ts +3 -0
  207. package/dist/types/model/types.d.ts.map +1 -1
  208. package/dist/types/triggers/TriggerHandler.d.ts.map +1 -1
  209. package/dist/types/triggers/TriggerIndirectChangesFetcher.d.ts +11 -3
  210. package/dist/types/triggers/TriggerIndirectChangesFetcher.d.ts.map +1 -1
  211. package/dist/types/triggers/TriggerListenersStore.d.ts +2 -2
  212. package/dist/types/triggers/TriggerListenersStore.d.ts.map +1 -1
  213. package/dist/types/triggers/TriggerPayloadBuilder.d.ts.map +1 -1
  214. package/dist/types/triggers/TriggerPayloadManager.d.ts +2 -1
  215. package/dist/types/triggers/TriggerPayloadManager.d.ts.map +1 -1
  216. package/dist/types/triggers/TriggerPayloadPersister.d.ts +7 -3
  217. package/dist/types/triggers/TriggerPayloadPersister.d.ts.map +1 -1
  218. package/dist/types/tsconfig.tsbuildinfo +1 -1
  219. package/dist/types/utils/notifyChannel.d.ts +4 -0
  220. package/dist/types/utils/notifyChannel.d.ts.map +1 -0
  221. package/graphql.codegen.yml +2 -2
  222. package/package.json +15 -15
  223. package/src/ActionsExecutionContainerHookFactory.ts +3 -3
  224. package/src/authorization/ActionsAuthorizationActions.ts +2 -0
  225. package/src/dispatch/EventsRepository.ts +24 -5
  226. package/src/dispatch/ProjectDispatcher.ts +1 -1
  227. package/src/dispatch/WebhookTargetHandler.ts +3 -0
  228. package/src/graphql/http/ActionsApiMiddlewareFactory.ts +1 -0
  229. package/src/graphql/resolvers/ActionsContext.ts +1 -0
  230. package/src/graphql/resolvers/ResolversFactory.ts +6 -1
  231. package/src/graphql/resolvers/mutation/RetryEventMutationResolver.ts +22 -0
  232. package/src/graphql/resolvers/mutation/StopEventMutationResolver.ts +19 -0
  233. package/src/graphql/resolvers/mutation/index.ts +2 -0
  234. package/src/graphql/resolvers/query/EventsQueryResolver.ts +14 -0
  235. package/src/graphql/schema/actions.graphql.ts +18 -4
  236. package/src/graphql/schema/index.ts +54 -1
  237. package/src/index.ts +9 -5
  238. package/src/migrations/2025-05-28-160000-action-event-user.ts +16 -0
  239. package/src/migrations/index.ts +2 -0
  240. package/src/migrations/snapshot.ts +5 -2
  241. package/src/model/EventByIdQuery.ts +21 -0
  242. package/src/model/types.ts +3 -0
  243. package/src/triggers/TriggerHandler.ts +12 -11
  244. package/src/triggers/TriggerIndirectChangesFetcher.ts +62 -3
  245. package/src/triggers/TriggerListenersStore.ts +2 -2
  246. package/src/triggers/TriggerPayloadBuilder.ts +18 -1
  247. package/src/triggers/TriggerPayloadManager.ts +2 -1
  248. package/src/triggers/TriggerPayloadPersister.ts +9 -3
  249. package/src/utils/notifyChannel.ts +6 -0
  250. package/tests/cases/unit/generator.test.ts +1 -1
  251. package/tests/cases/unit/webhookHandler.test.ts +9 -0
@@ -0,0 +1,4 @@
1
+ import { Client } from '@contember/database';
2
+ export declare const NOTIFY_CHANNEL_NAME = "actions_event";
3
+ export declare const notify: (db: Client, projectSlug: string) => Promise<void>;
4
+ //# sourceMappingURL=notifyChannel.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"notifyChannel.d.ts","sourceRoot":"","sources":["../../../src/utils/notifyChannel.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAA;AAE5C,eAAO,MAAM,mBAAmB,kBAAkB,CAAA;AAClD,eAAO,MAAM,MAAM,GAAU,IAAI,MAAM,EAAE,aAAa,MAAM,kBAE3D,CAAA"}
@@ -10,7 +10,7 @@ generates:
10
10
  enumsAsTypes: "1"
11
11
  scalars:
12
12
  DateTime: Date
13
- Uuid: String
13
+ Uuid: string
14
14
  Json: any
15
15
  plugins:
16
16
  - "typescript"
@@ -18,4 +18,4 @@ generates:
18
18
  - "typescript-resolvers"
19
19
  hooks:
20
20
  afterAllFileWrite:
21
- - yarn run -T eslint --fix
21
+ - bun run eslint --fix
package/package.json CHANGED
@@ -22,20 +22,20 @@
22
22
  }
23
23
  },
24
24
  "dependencies": {
25
- "@contember/authorization": "2.1.0-alpha.3",
26
- "@contember/database": "2.1.0-alpha.3",
27
- "@contember/database-migrations": "2.1.0-alpha.3",
28
- "@contember/engine-common": "2.1.0-alpha.3",
29
- "@contember/engine-content-api": "2.1.0-alpha.3",
30
- "@contember/engine-http": "2.1.0-alpha.3",
31
- "@contember/engine-plugins": "2.1.0-alpha.3",
32
- "@contember/engine-system-api": "2.1.0-alpha.3",
33
- "@contember/engine-tenant-api": "2.1.0-alpha.3",
34
- "@contember/graphql-utils": "2.1.0-alpha.3",
35
- "@contember/logger": "2.1.0-alpha.3",
36
- "@contember/schema": "2.1.0-alpha.3",
37
- "@contember/schema-utils": "2.1.0-alpha.3",
38
- "@contember/typesafe": "2.1.0-alpha.3",
25
+ "@contember/authorization": "2.1.0-alpha.30",
26
+ "@contember/database": "2.1.0-alpha.30",
27
+ "@contember/database-migrations": "2.1.0-alpha.30",
28
+ "@contember/engine-common": "2.1.0-alpha.30",
29
+ "@contember/engine-content-api": "2.1.0-alpha.30",
30
+ "@contember/engine-http": "2.1.0-alpha.30",
31
+ "@contember/engine-plugins": "2.1.0-alpha.30",
32
+ "@contember/engine-system-api": "2.1.0-alpha.30",
33
+ "@contember/engine-tenant-api": "2.1.0-alpha.30",
34
+ "@contember/graphql-utils": "2.1.0-alpha.30",
35
+ "@contember/logger": "2.1.0-alpha.30",
36
+ "@contember/schema": "2.1.0-alpha.30",
37
+ "@contember/schema-utils": "2.1.0-alpha.30",
38
+ "@contember/typesafe": "2.1.0-alpha.30",
39
39
  "@graphql-tools/schema": "^10.0.7",
40
40
  "graphql-tag": "^2.12.6"
41
41
  },
@@ -49,5 +49,5 @@
49
49
  "pg": "^8.5.0"
50
50
  },
51
51
  "type": "module",
52
- "version": "2.1.0-alpha.3"
52
+ "version": "2.1.0-alpha.30"
53
53
  }
@@ -12,12 +12,12 @@ export class ActionsExecutionContainerHookFactory {
12
12
 
13
13
  create(): ExecutionContainerHook {
14
14
  return builder => {
15
- return builder.setupService('mapperFactory', (mapperFactory, { whereBuilder, schema, pathFactory, systemSchema, providers, stage, project, schemaMeta }) => {
15
+ return builder.setupService('mapperFactory', (mapperFactory, { whereBuilder, schema, pathFactory, systemSchema, providers, stage, project, schemaMeta, joinBuilder, userInfo }) => {
16
16
  mapperFactory.hooks.push(mapper => {
17
- const triggerPayloadPersister = new TriggerPayloadPersister(mapper, mapper.db.forSchema(systemSchema), providers, project.slug, stage.id, schemaMeta.id)
17
+ const triggerPayloadPersister = new TriggerPayloadPersister(mapper, mapper.db.forSchema(systemSchema), providers, project.slug, stage.id, schemaMeta.id, mapper.identityId, userInfo)
18
18
  const triggerPayloadBuilder = new TriggerPayloadBuilder(mapper)
19
19
  const payloadManager = new TriggerPayloadManager(triggerPayloadBuilder, triggerPayloadPersister)
20
- const changesFetcher = new TriggerIndirectChangesFetcher(mapper, whereBuilder, pathFactory)
20
+ const changesFetcher = new TriggerIndirectChangesFetcher(schema.model, mapper, whereBuilder, joinBuilder, pathFactory)
21
21
  const listenersStore = this.listenerStoreProvider.getListenerStore(schema)
22
22
  const triggerHandler = new TriggerHandler(payloadManager, listenersStore, changesFetcher)
23
23
  triggerHandler.attach(mapper.eventManager)
@@ -11,4 +11,6 @@ export namespace ActionsAuthorizationActions {
11
11
 
12
12
  export const EVENTS_VIEW = Authorizator.createAction(Resources.events, 'view')
13
13
  export const EVENTS_PROCESS = Authorizator.createAction(Resources.events, 'process')
14
+ export const EVENTS_RETRY = Authorizator.createAction(Resources.events, 'retry')
15
+ export const EVENTS_STOP = Authorizator.createAction(Resources.events, 'stop')
14
16
  }
@@ -11,6 +11,7 @@ import {
11
11
  import { EventRow, HandledEvent } from './types'
12
12
  import { Actions } from '@contember/schema'
13
13
  import { eventsToProcessSpecification, eventsToProcessStateSpecification } from '../model/EventsToProcessSpecification'
14
+ import { notify } from '../utils/notifyChannel'
14
15
 
15
16
 
16
17
  const ACK_TIMEOUT_MS = 1_000 * 60 * 10 // 10 minutes
@@ -87,15 +88,33 @@ export class EventsRepository {
87
88
  })
88
89
  }
89
90
 
90
- public async requeue(db: Client, events: EventRow[]): Promise<void> {
91
+ public async requeue(db: Client, events: string[]): Promise<void> {
91
92
  await UpdateBuilder.create()
92
93
  .table('actions_event')
93
94
  .values<EventRow>({
94
- state: it => it.raw('CASE WHEN num_retries = 0 THEN ? ELSE ? END', 'created', 'retrying'),
95
+ state: it => it.raw(`
96
+ CASE
97
+ WHEN num_retries = 0 THEN
98
+ ?::__SCHEMA__.actions_trigger_state
99
+ ELSE
100
+ ?::__SCHEMA__.actions_trigger_state END
101
+ `, 'created', 'retrying'),
95
102
  last_state_change: new Date(),
96
103
  visible_at: new Date(),
97
104
  })
98
- .where(it => it.in('id', events.map(it => it.id)))
105
+ .where(it => it.in('id', events))
106
+ .execute(db)
107
+ }
108
+
109
+ public async markStopped(db: Client, events: string[]): Promise<void> {
110
+ await UpdateBuilder.create()
111
+ .table('actions_event')
112
+ .values<EventRow>({
113
+ state: 'stopped',
114
+ last_state_change: new Date(),
115
+ resolved_at: new Date(),
116
+ })
117
+ .where(it => it.in('id', events))
99
118
  .execute(db)
100
119
  }
101
120
 
@@ -114,7 +133,7 @@ export class EventsRepository {
114
133
  }
115
134
 
116
135
  private async markFailed(db: Client, event: HandledEvent): Promise<void> {
117
- const numRetries = event.row.num_retries
136
+ const numRetries = event.row.num_retries + 1
118
137
  const now = new Date()
119
138
  const nextAttempt = new Date()
120
139
  nextAttempt.setTime(nextAttempt.getTime() + (event.target?.initialRepeatIntervalMs ?? DEFAULT_REPEAT_INTERVAL_MS) * Math.pow(2, event.row.num_retries))
@@ -122,7 +141,7 @@ export class EventsRepository {
122
141
  .table('actions_event')
123
142
  .values<EventRow>({
124
143
  last_state_change: now,
125
- num_retries: event.row.num_retries + 1,
144
+ num_retries: numRetries,
126
145
  log: JSON.stringify([...event.row.log, event.result]) as any,
127
146
  ...(numRetries < (event.target?.maxAttempts ?? DEFAULT_MAX_ATTEMPTS) ? {
128
147
  state: 'retrying',
@@ -3,7 +3,7 @@ import { EventDispatcher } from './EventDispatcher'
3
3
  import { ContentSchemaResolver } from '@contember/engine-http'
4
4
  import { Runnable, RunnableArgs, Running } from '@contember/engine-common'
5
5
  import { Listener } from '@contember/database'
6
- import { NOTIFY_CHANNEL_NAME } from '../triggers/TriggerPayloadPersister'
6
+ import { NOTIFY_CHANNEL_NAME } from '../utils/notifyChannel'
7
7
 
8
8
 
9
9
  export class ProjectDispatcherFactory {
@@ -174,6 +174,9 @@ export class WebhookTargetHandler implements InvokeHandler<Actions.WebhookTarget
174
174
  meta: {
175
175
  eventId: it.id,
176
176
  transactionId: it.transaction_id,
177
+ identityId: it.identity_id ?? null,
178
+ ipAddress: it.ip_address ?? null,
179
+ userAgent: it.user_agent ?? null,
177
180
  createdAt: it.created_at.toISOString(),
178
181
  lastStateChange: it.last_state_change.toISOString(),
179
182
  numRetries: it.num_retries,
@@ -25,6 +25,7 @@ export class ActionsApiMiddlewareFactory {
25
25
  const graphqlContext: ActionsContext = {
26
26
  db: systemDatabase,
27
27
  logger,
28
+ project: projectContainer.project,
28
29
  contentSchemaResolver: projectContainer.contentSchemaResolver,
29
30
  requireAccess: async (action, message) => {
30
31
  if (!(await this.authorizator.isAllowed(identity, new AuthorizationScope.Global(), action))) {
@@ -7,5 +7,6 @@ export interface ActionsContext {
7
7
  logger: Logger
8
8
  db: DatabaseContext
9
9
  contentSchemaResolver: ContentSchemaResolver
10
+ project: { slug: string }
10
11
  requireAccess: (action: Authorizator.Action, message?: string) => Promise<void>
11
12
  }
@@ -1,7 +1,7 @@
1
1
  import { DateTimeType, JSONType, UuidType } from '@contember/graphql-utils'
2
2
  import { Resolvers } from '../schema'
3
3
  import { EventsQueryResolver } from './query'
4
- import { ProcessBatchMutationResolver, SetVariablesMutationResolver } from './mutation'
4
+ import { ProcessBatchMutationResolver, RetryEventMutationResolver, SetVariablesMutationResolver, StopEventMutationResolver } from './mutation'
5
5
  import { ActionsContext } from './ActionsContext'
6
6
  import { VariablesQueryResolver } from './query/VariablesQueryResolver'
7
7
 
@@ -11,6 +11,8 @@ export class ResolversFactory {
11
11
  private readonly processBatchMutationResolver: ProcessBatchMutationResolver,
12
12
  private readonly variablesQueryResolver: VariablesQueryResolver,
13
13
  private readonly setVariablesMutationResolver: SetVariablesMutationResolver,
14
+ private readonly retryEventMutationResolver: RetryEventMutationResolver,
15
+ private readonly stopEventMutationResolver: StopEventMutationResolver,
14
16
  ) {
15
17
  }
16
18
 
@@ -22,11 +24,14 @@ export class ResolversFactory {
22
24
  Mutation: {
23
25
  processBatch: this.processBatchMutationResolver.processBatch.bind(this.processBatchMutationResolver),
24
26
  setVariables: this.setVariablesMutationResolver.setVariables.bind(this.setVariablesMutationResolver),
27
+ retryEvent: this.retryEventMutationResolver.retryEvent.bind(this.retryEventMutationResolver),
28
+ stopEvent: this.stopEventMutationResolver.stopEvent.bind(this.stopEventMutationResolver),
25
29
  },
26
30
  Query: {
27
31
  eventsInProcessing: this.eventsQueryResolver.eventsInProcessing.bind(this.eventsQueryResolver),
28
32
  eventsToProcess: this.eventsQueryResolver.eventsToProcess.bind(this.eventsQueryResolver),
29
33
  failedEvents: this.eventsQueryResolver.failedEvents.bind(this.eventsQueryResolver),
34
+ event: this.eventsQueryResolver.event.bind(this.eventsQueryResolver),
30
35
  variables: this.variablesQueryResolver.variables.bind(this.variablesQueryResolver),
31
36
  },
32
37
  }
@@ -0,0 +1,22 @@
1
+ import { MutationResolvers, MutationRetryEventArgs } from '../../schema'
2
+ import { ActionsContext } from '../ActionsContext'
3
+ import { ActionsAuthorizationActions } from '../../../authorization'
4
+ import { EventsRepository } from '../../../dispatch/EventsRepository'
5
+ import { notify } from '../../../utils/notifyChannel'
6
+
7
+ export class RetryEventMutationResolver implements MutationResolvers<ActionsContext> {
8
+ constructor(
9
+ private readonly eventsRepository: EventsRepository,
10
+ ) {
11
+ }
12
+ async retryEvent(parent: unknown, args: MutationRetryEventArgs, ctx: ActionsContext) {
13
+ await ctx.requireAccess(ActionsAuthorizationActions.EVENTS_RETRY)
14
+
15
+ await this.eventsRepository.requeue(ctx.db.client, [args.id])
16
+ await notify(ctx.db.client, ctx.project.slug)
17
+
18
+ return {
19
+ ok: true,
20
+ }
21
+ }
22
+ }
@@ -0,0 +1,19 @@
1
+ import { MutationResolvers, MutationRetryEventArgs } from '../../schema'
2
+ import { ActionsContext } from '../ActionsContext'
3
+ import { ActionsAuthorizationActions } from '../../../authorization'
4
+ import { EventsRepository } from '../../../dispatch/EventsRepository'
5
+
6
+ export class StopEventMutationResolver implements MutationResolvers<ActionsContext> {
7
+ constructor(
8
+ private readonly eventsRepository: EventsRepository,
9
+ ) {
10
+ }
11
+ async stopEvent(parent: unknown, args: MutationRetryEventArgs, ctx: ActionsContext) {
12
+ await ctx.requireAccess(ActionsAuthorizationActions.EVENTS_STOP)
13
+
14
+ await this.eventsRepository.markStopped(ctx.db.client, [args.id])
15
+ return {
16
+ ok: true,
17
+ }
18
+ }
19
+ }
@@ -1,2 +1,4 @@
1
1
  export * from './ProcessBatchMutationResolver'
2
2
  export * from './SetVariablesMutationResolver'
3
+ export * from './RetryEventMutationResolver'
4
+ export * from './StopEventMutationResolver'
@@ -13,6 +13,7 @@ import { Client, DatabaseQuery } from '@contember/database'
13
13
  import { EventsInProcessingQuery } from '../../../model/EventsInProcessingQuery'
14
14
  import { FailedEventsQuery } from '../../../model/FailedEventsQuery'
15
15
  import { ActionsAuthorizationActions } from '../../../authorization'
16
+ import { EventByIdQuery } from '../../../model/EventByIdQuery'
16
17
 
17
18
  export class EventsQueryResolver implements QueryResolvers<ActionsContext> {
18
19
  async eventsInProcessing(parent: unknown, { args }: QueryEventsInProcessingArgs, ctx: ActionsContext) {
@@ -33,6 +34,16 @@ export class EventsQueryResolver implements QueryResolvers<ActionsContext> {
33
34
  return await this.fetchEvents(ctx.db, new FailedEventsQuery(args ?? {}))
34
35
  }
35
36
 
37
+ async event(parent: unknown, { id }: { id: string }, ctx: ActionsContext): Promise<Event | null> {
38
+ await ctx.requireAccess(ActionsAuthorizationActions.EVENTS_VIEW)
39
+ const stages = await this.fetchStagesMap(ctx.db)
40
+ const result = await ctx.db.queryHandler.fetch(new EventByIdQuery(id))
41
+ if (!result) {
42
+ return null
43
+ }
44
+ return this.mapEventRows([result], stages)[0]
45
+ }
46
+
36
47
  private async fetchEvents(db: DatabaseContext, query: DatabaseQuery<EventRow[]>) {
37
48
  const stages = await this.fetchStagesMap(db)
38
49
  return this.mapEventRows(await db.queryHandler.fetch(query), stages)
@@ -57,6 +68,9 @@ export class EventsQueryResolver implements QueryResolvers<ActionsContext> {
57
68
  state: row.state,
58
69
  target: row.target,
59
70
  transactionId: row.transaction_id,
71
+ identityId: row.identity_id ?? undefined,
72
+ ipAddress: row.ip_address ?? undefined,
73
+ userAgent: row.user_agent ?? undefined,
60
74
  }))
61
75
  }
62
76
  }
@@ -15,11 +15,14 @@ export const schema: DocumentNode = gql`
15
15
  failedEvents(args: EventArgs): [Event!]!
16
16
  eventsToProcess(args: EventArgs): [Event!]!
17
17
  eventsInProcessing(args: EventArgs): [Event!]!
18
+ event(id: Uuid!): Event
18
19
  variables: [Variable!]!
19
20
  }
20
21
 
21
22
  type Mutation {
22
23
  processBatch: ProcessBatchResponse!
24
+ retryEvent(id: Uuid!): RetryEventResponse!
25
+ stopEvent(id: Uuid!): StopEventResponse!
23
26
  setVariables(args: SetVariablesArgs!): SetVariablesResponse!
24
27
  }
25
28
 
@@ -32,6 +35,9 @@ export const schema: DocumentNode = gql`
32
35
  type Event {
33
36
  id: Uuid!
34
37
  transactionId: Uuid!
38
+ identityId: Uuid
39
+ ipAddress: String
40
+ userAgent: String
35
41
  createdAt: DateTime!
36
42
  lastStateChange: DateTime!
37
43
  resolvedAt: DateTime
@@ -57,16 +63,24 @@ export const schema: DocumentNode = gql`
57
63
  ok: Boolean!
58
64
  }
59
65
 
66
+ type RetryEventResponse {
67
+ ok: Boolean!
68
+ }
69
+
70
+ type StopEventResponse {
71
+ ok: Boolean!
72
+ }
73
+
60
74
  input SetVariablesArgs {
61
75
  variables: [VariableInput!]!
62
76
  mode: SetVariablesMode
63
77
  }
64
-
78
+
65
79
  """
66
- Defines how it handles original variables.
80
+ Defines how it handles original variables.
67
81
  - MERGE merges with new values (default behaviour)
68
82
  - SET replaces all variables
69
- - APPEND_ONLY_MISSING appends values if not already exist
83
+ - APPEND_ONLY_MISSING appends values if not already exist
70
84
  """
71
85
  enum SetVariablesMode {
72
86
  MERGE
@@ -78,7 +92,7 @@ export const schema: DocumentNode = gql`
78
92
  name: String!
79
93
  value: String!
80
94
  }
81
-
95
+
82
96
  type SetVariablesResponse {
83
97
  ok: Boolean!
84
98
  }
@@ -16,13 +16,15 @@ export type Scalars = {
16
16
  Float: { input: number; output: number }
17
17
  DateTime: { input: Date; output: Date }
18
18
  Json: { input: any; output: any }
19
- Uuid: { input: String; output: String }
19
+ Uuid: { input: string; output: string }
20
20
  }
21
21
 
22
22
  export type Event = {
23
23
  readonly __typename?: 'Event'
24
24
  readonly createdAt: Scalars['DateTime']['output']
25
25
  readonly id: Scalars['Uuid']['output']
26
+ readonly identityId?: Maybe<Scalars['Uuid']['output']>
27
+ readonly ipAddress?: Maybe<Scalars['String']['output']>
26
28
  readonly lastStateChange: Scalars['DateTime']['output']
27
29
  readonly log: Scalars['Json']['output']
28
30
  readonly numRetries: Scalars['Int']['output']
@@ -32,6 +34,7 @@ export type Event = {
32
34
  readonly state: EventState
33
35
  readonly target: Scalars['String']['output']
34
36
  readonly transactionId: Scalars['Uuid']['output']
37
+ readonly userAgent?: Maybe<Scalars['String']['output']>
35
38
  readonly visibleAt?: Maybe<Scalars['DateTime']['output']>
36
39
  }
37
40
 
@@ -52,7 +55,14 @@ export type EventState =
52
55
  export type Mutation = {
53
56
  readonly __typename?: 'Mutation'
54
57
  readonly processBatch: ProcessBatchResponse
58
+ readonly retryEvent: RetryEventResponse
55
59
  readonly setVariables: SetVariablesResponse
60
+ readonly stopEvent: StopEventResponse
61
+ }
62
+
63
+
64
+ export type MutationRetryEventArgs = {
65
+ id: Scalars['Uuid']['input']
56
66
  }
57
67
 
58
68
 
@@ -60,6 +70,11 @@ export type MutationSetVariablesArgs = {
60
70
  args: SetVariablesArgs
61
71
  }
62
72
 
73
+
74
+ export type MutationStopEventArgs = {
75
+ id: Scalars['Uuid']['input']
76
+ }
77
+
63
78
  export type ProcessBatchResponse = {
64
79
  readonly __typename?: 'ProcessBatchResponse'
65
80
  readonly ok: Scalars['Boolean']['output']
@@ -67,6 +82,7 @@ export type ProcessBatchResponse = {
67
82
 
68
83
  export type Query = {
69
84
  readonly __typename?: 'Query'
85
+ readonly event?: Maybe<Event>
70
86
  readonly eventsInProcessing: ReadonlyArray<Event>
71
87
  readonly eventsToProcess: ReadonlyArray<Event>
72
88
  readonly failedEvents: ReadonlyArray<Event>
@@ -74,6 +90,11 @@ export type Query = {
74
90
  }
75
91
 
76
92
 
93
+ export type QueryEventArgs = {
94
+ id: Scalars['Uuid']['input']
95
+ }
96
+
97
+
77
98
  export type QueryEventsInProcessingArgs = {
78
99
  args?: InputMaybe<EventArgs>
79
100
  }
@@ -88,6 +109,11 @@ export type QueryFailedEventsArgs = {
88
109
  args?: InputMaybe<EventArgs>
89
110
  }
90
111
 
112
+ export type RetryEventResponse = {
113
+ readonly __typename?: 'RetryEventResponse'
114
+ readonly ok: Scalars['Boolean']['output']
115
+ }
116
+
91
117
  export type SetVariablesArgs = {
92
118
  readonly mode?: InputMaybe<SetVariablesMode>
93
119
  readonly variables: ReadonlyArray<VariableInput>
@@ -109,6 +135,11 @@ export type SetVariablesResponse = {
109
135
  readonly ok: Scalars['Boolean']['output']
110
136
  }
111
137
 
138
+ export type StopEventResponse = {
139
+ readonly __typename?: 'StopEventResponse'
140
+ readonly ok: Scalars['Boolean']['output']
141
+ }
142
+
112
143
  export type Variable = {
113
144
  readonly __typename?: 'Variable'
114
145
  readonly name: Scalars['String']['output']
@@ -201,9 +232,11 @@ export type ResolversTypes = {
201
232
  Mutation: ResolverTypeWrapper<{}>
202
233
  ProcessBatchResponse: ResolverTypeWrapper<ProcessBatchResponse>
203
234
  Query: ResolverTypeWrapper<{}>
235
+ RetryEventResponse: ResolverTypeWrapper<RetryEventResponse>
204
236
  SetVariablesArgs: SetVariablesArgs
205
237
  SetVariablesMode: SetVariablesMode
206
238
  SetVariablesResponse: ResolverTypeWrapper<SetVariablesResponse>
239
+ StopEventResponse: ResolverTypeWrapper<StopEventResponse>
207
240
  String: ResolverTypeWrapper<Scalars['String']['output']>
208
241
  Uuid: ResolverTypeWrapper<Scalars['Uuid']['output']>
209
242
  Variable: ResolverTypeWrapper<Variable>
@@ -221,8 +254,10 @@ export type ResolversParentTypes = {
221
254
  Mutation: {}
222
255
  ProcessBatchResponse: ProcessBatchResponse
223
256
  Query: {}
257
+ RetryEventResponse: RetryEventResponse
224
258
  SetVariablesArgs: SetVariablesArgs
225
259
  SetVariablesResponse: SetVariablesResponse
260
+ StopEventResponse: StopEventResponse
226
261
  String: Scalars['String']['output']
227
262
  Uuid: Scalars['Uuid']['output']
228
263
  Variable: Variable
@@ -236,6 +271,8 @@ export interface DateTimeScalarConfig extends GraphQLScalarTypeConfig<ResolversT
236
271
  export type EventResolvers<ContextType = any, ParentType extends ResolversParentTypes['Event'] = ResolversParentTypes['Event']> = {
237
272
  createdAt?: Resolver<ResolversTypes['DateTime'], ParentType, ContextType>
238
273
  id?: Resolver<ResolversTypes['Uuid'], ParentType, ContextType>
274
+ identityId?: Resolver<Maybe<ResolversTypes['Uuid']>, ParentType, ContextType>
275
+ ipAddress?: Resolver<Maybe<ResolversTypes['String']>, ParentType, ContextType>
239
276
  lastStateChange?: Resolver<ResolversTypes['DateTime'], ParentType, ContextType>
240
277
  log?: Resolver<ResolversTypes['Json'], ParentType, ContextType>
241
278
  numRetries?: Resolver<ResolversTypes['Int'], ParentType, ContextType>
@@ -245,6 +282,7 @@ export type EventResolvers<ContextType = any, ParentType extends ResolversParent
245
282
  state?: Resolver<ResolversTypes['EventState'], ParentType, ContextType>
246
283
  target?: Resolver<ResolversTypes['String'], ParentType, ContextType>
247
284
  transactionId?: Resolver<ResolversTypes['Uuid'], ParentType, ContextType>
285
+ userAgent?: Resolver<Maybe<ResolversTypes['String']>, ParentType, ContextType>
248
286
  visibleAt?: Resolver<Maybe<ResolversTypes['DateTime']>, ParentType, ContextType>
249
287
  __isTypeOf?: IsTypeOfResolverFn<ParentType, ContextType>
250
288
  }
@@ -255,7 +293,9 @@ export interface JsonScalarConfig extends GraphQLScalarTypeConfig<ResolversTypes
255
293
 
256
294
  export type MutationResolvers<ContextType = any, ParentType extends ResolversParentTypes['Mutation'] = ResolversParentTypes['Mutation']> = {
257
295
  processBatch?: Resolver<ResolversTypes['ProcessBatchResponse'], ParentType, ContextType>
296
+ retryEvent?: Resolver<ResolversTypes['RetryEventResponse'], ParentType, ContextType, RequireFields<MutationRetryEventArgs, 'id'>>
258
297
  setVariables?: Resolver<ResolversTypes['SetVariablesResponse'], ParentType, ContextType, RequireFields<MutationSetVariablesArgs, 'args'>>
298
+ stopEvent?: Resolver<ResolversTypes['StopEventResponse'], ParentType, ContextType, RequireFields<MutationStopEventArgs, 'id'>>
259
299
  }
260
300
 
261
301
  export type ProcessBatchResponseResolvers<ContextType = any, ParentType extends ResolversParentTypes['ProcessBatchResponse'] = ResolversParentTypes['ProcessBatchResponse']> = {
@@ -264,17 +304,28 @@ export type ProcessBatchResponseResolvers<ContextType = any, ParentType extends
264
304
  }
265
305
 
266
306
  export type QueryResolvers<ContextType = any, ParentType extends ResolversParentTypes['Query'] = ResolversParentTypes['Query']> = {
307
+ event?: Resolver<Maybe<ResolversTypes['Event']>, ParentType, ContextType, RequireFields<QueryEventArgs, 'id'>>
267
308
  eventsInProcessing?: Resolver<ReadonlyArray<ResolversTypes['Event']>, ParentType, ContextType, Partial<QueryEventsInProcessingArgs>>
268
309
  eventsToProcess?: Resolver<ReadonlyArray<ResolversTypes['Event']>, ParentType, ContextType, Partial<QueryEventsToProcessArgs>>
269
310
  failedEvents?: Resolver<ReadonlyArray<ResolversTypes['Event']>, ParentType, ContextType, Partial<QueryFailedEventsArgs>>
270
311
  variables?: Resolver<ReadonlyArray<ResolversTypes['Variable']>, ParentType, ContextType>
271
312
  }
272
313
 
314
+ export type RetryEventResponseResolvers<ContextType = any, ParentType extends ResolversParentTypes['RetryEventResponse'] = ResolversParentTypes['RetryEventResponse']> = {
315
+ ok?: Resolver<ResolversTypes['Boolean'], ParentType, ContextType>
316
+ __isTypeOf?: IsTypeOfResolverFn<ParentType, ContextType>
317
+ }
318
+
273
319
  export type SetVariablesResponseResolvers<ContextType = any, ParentType extends ResolversParentTypes['SetVariablesResponse'] = ResolversParentTypes['SetVariablesResponse']> = {
274
320
  ok?: Resolver<ResolversTypes['Boolean'], ParentType, ContextType>
275
321
  __isTypeOf?: IsTypeOfResolverFn<ParentType, ContextType>
276
322
  }
277
323
 
324
+ export type StopEventResponseResolvers<ContextType = any, ParentType extends ResolversParentTypes['StopEventResponse'] = ResolversParentTypes['StopEventResponse']> = {
325
+ ok?: Resolver<ResolversTypes['Boolean'], ParentType, ContextType>
326
+ __isTypeOf?: IsTypeOfResolverFn<ParentType, ContextType>
327
+ }
328
+
278
329
  export interface UuidScalarConfig extends GraphQLScalarTypeConfig<ResolversTypes['Uuid'], any> {
279
330
  name: 'Uuid'
280
331
  }
@@ -292,7 +343,9 @@ export type Resolvers<ContextType = any> = {
292
343
  Mutation?: MutationResolvers<ContextType>
293
344
  ProcessBatchResponse?: ProcessBatchResponseResolvers<ContextType>
294
345
  Query?: QueryResolvers<ContextType>
346
+ RetryEventResponse?: RetryEventResponseResolvers<ContextType>
295
347
  SetVariablesResponse?: SetVariablesResponseResolvers<ContextType>
348
+ StopEventResponse?: StopEventResponseResolvers<ContextType>
296
349
  Uuid?: GraphQLScalarType
297
350
  Variable?: VariableResolvers<ContextType>
298
351
  }
package/src/index.ts CHANGED
@@ -7,7 +7,7 @@ import { MasterContainerBuilder, MasterContainerHook } from '@contember/engine-h
7
7
  import { ActionsApiMiddlewareFactory } from './graphql/http/ActionsApiMiddlewareFactory'
8
8
  import { ActionsGraphQLHandlerFactory } from './graphql/http/ActionsGraphQLHandlerFactory'
9
9
  import { ResolversFactory } from './graphql/resolvers/ResolversFactory'
10
- import { EventsQueryResolver, ProcessBatchMutationResolver, SetVariablesMutationResolver } from './graphql/resolvers'
10
+ import { EventsQueryResolver, ProcessBatchMutationResolver, RetryEventMutationResolver, SetVariablesMutationResolver, StopEventMutationResolver } from './graphql/resolvers'
11
11
  import { EventDispatcher } from './dispatch/EventDispatcher'
12
12
  import { EventsRepository } from './dispatch/EventsRepository'
13
13
  import { TargetHandlerResolver } from './dispatch/TargetHandlerResolver'
@@ -50,11 +50,13 @@ export default class ActionsPlugin implements Plugin {
50
50
  .addService('actions_variableManager', () => {
51
51
  return new VariablesManager()
52
52
  })
53
- .addService('actions_eventDispatcher', ({ actions_variableManager }) => {
54
- const eventsRepository = new EventsRepository()
53
+ .addService('actions_eventRepository', () => {
54
+ return new EventsRepository()
55
+ })
56
+ .addService('actions_eventDispatcher', ({ actions_eventRepository, actions_variableManager }) => {
55
57
  const webhookTargetHandler = new WebhookTargetHandler(new WebhookFetcherNative())
56
58
  const targetHandlerResolver = new TargetHandlerResolver(webhookTargetHandler)
57
- return new EventDispatcher(eventsRepository, actions_variableManager, targetHandlerResolver)
59
+ return new EventDispatcher(actions_eventRepository, actions_variableManager, targetHandlerResolver)
58
60
  })
59
61
  .addService('actions_dispatchWorkerSupervisorFactory', ({ actions_eventDispatcher }) => {
60
62
  const projectDispatcherFactory = new ProjectDispatcherFactory(actions_eventDispatcher)
@@ -63,7 +65,7 @@ export default class ActionsPlugin implements Plugin {
63
65
  .addService('actions_authorizator', () => {
64
66
  return new Authorizator.Default(new AccessEvaluator.PermissionEvaluator(new ActionsPermissionsFactory().create()))
65
67
  })
66
- .setupService('application', (it, { projectContextResolver, debugMode, actions_eventDispatcher, actions_dispatchWorkerSupervisorFactory, actions_variableManager, actions_authorizator }) => {
68
+ .setupService('application', (it, { projectContextResolver, debugMode, actions_eventRepository, actions_eventDispatcher, actions_dispatchWorkerSupervisorFactory, actions_variableManager, actions_authorizator }) => {
67
69
  const handlerFactory = new ActionsGraphQLHandlerFactory()
68
70
  const eventsQueryResolver = new EventsQueryResolver()
69
71
  const processBatchMutationResolver = new ProcessBatchMutationResolver(actions_eventDispatcher)
@@ -74,6 +76,8 @@ export default class ActionsPlugin implements Plugin {
74
76
  processBatchMutationResolver,
75
77
  variablesQueryResolver,
76
78
  setVariablesMutationResolver,
79
+ new RetryEventMutationResolver(actions_eventRepository),
80
+ new StopEventMutationResolver(actions_eventRepository),
77
81
  )
78
82
 
79
83
  const actionsContextResolver = new ActionsContextResolver(debugMode, projectContextResolver)
@@ -0,0 +1,16 @@
1
+ import { MigrationBuilder } from '@contember/database-migrations'
2
+
3
+ const sql = `
4
+ ALTER TABLE actions_event
5
+ ADD COLUMN IF NOT EXISTS identity_id UUID DEFAULT NULL;
6
+
7
+ ALTER TABLE actions_event
8
+ ADD COLUMN IF NOT EXISTS ip_address INET DEFAULT NULL;
9
+
10
+ ALTER TABLE actions_event
11
+ ADD COLUMN IF NOT EXISTS user_agent TEXT DEFAULT NULL;
12
+ `
13
+
14
+ export default async function (builder: MigrationBuilder) {
15
+ builder.sql(sql)
16
+ }
@@ -1,7 +1,9 @@
1
1
  import snapshot from './snapshot'
2
2
  import { MigrationGroup } from '@contember/database-migrations'
3
3
  import _20230310145000actionsvariables from './2023-03-10-145000-actions-variables'
4
+ import _20250528160000actioneventuser from './2025-05-28-160000-action-event-user'
4
5
 
5
6
  export const migrationsGroup = new MigrationGroup(snapshot, {
6
7
  '2023-03-10-145000-actions-variables': _20230310145000actionsvariables,
8
+ '2025-05-28-160000-action-event-user': _20250528160000actioneventuser,
7
9
  })
@@ -30,11 +30,14 @@ export default async function (builder: MigrationBuilder) {
30
30
  trigger TEXT NOT NULL,
31
31
  priority INT NOT NULL DEFAULT 0,
32
32
  payload JSONB NOT NULL,
33
- log JSONB NOT NULL DEFAULT '[]'
33
+ log JSONB NOT NULL DEFAULT '[]',
34
+ identity_id UUID DEFAULT NULL,
35
+ ip_address INET DEFAULT NULL,
36
+ user_agent TEXT DEFAULT NULL
34
37
  );
35
38
 
36
39
  CREATE INDEX ON actions_event (priority DESC, visible_at) WHERE state IN ('created', 'retrying', 'processing');
37
-
40
+
38
41
  CREATE TABLE actions_variable
39
42
  (
40
43
  id UUID PRIMARY KEY NOT NULL,