@contember/engine-actions 1.3.0-alpha.13

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 (289) hide show
  1. package/dist/src/ActionsExecutionContainerHookFactory.d.ts +8 -0
  2. package/dist/src/ActionsExecutionContainerHookFactory.d.ts.map +1 -0
  3. package/dist/src/ActionsExecutionContainerHookFactory.js +28 -0
  4. package/dist/src/ActionsExecutionContainerHookFactory.js.map +1 -0
  5. package/dist/src/ImplementationException.d.ts +3 -0
  6. package/dist/src/ImplementationException.d.ts.map +1 -0
  7. package/dist/src/ImplementationException.js +7 -0
  8. package/dist/src/ImplementationException.js.map +1 -0
  9. package/dist/src/ListenerStoreProvider.d.ts +7 -0
  10. package/dist/src/ListenerStoreProvider.d.ts.map +1 -0
  11. package/dist/src/ListenerStoreProvider.js +21 -0
  12. package/dist/src/ListenerStoreProvider.js.map +1 -0
  13. package/dist/src/dispatch/DispatchWorkerSupervisor.d.ts +17 -0
  14. package/dist/src/dispatch/DispatchWorkerSupervisor.d.ts.map +1 -0
  15. package/dist/src/dispatch/DispatchWorkerSupervisor.js +123 -0
  16. package/dist/src/dispatch/DispatchWorkerSupervisor.js.map +1 -0
  17. package/dist/src/dispatch/EventDispatcher.d.ts +25 -0
  18. package/dist/src/dispatch/EventDispatcher.d.ts.map +1 -0
  19. package/dist/src/dispatch/EventDispatcher.js +46 -0
  20. package/dist/src/dispatch/EventDispatcher.js.map +1 -0
  21. package/dist/src/dispatch/EventsRepository.d.ts +22 -0
  22. package/dist/src/dispatch/EventsRepository.d.ts.map +1 -0
  23. package/dist/src/dispatch/EventsRepository.js +138 -0
  24. package/dist/src/dispatch/EventsRepository.js.map +1 -0
  25. package/dist/src/dispatch/ProjectDispatcher.d.ts +22 -0
  26. package/dist/src/dispatch/ProjectDispatcher.d.ts.map +1 -0
  27. package/dist/src/dispatch/ProjectDispatcher.js +103 -0
  28. package/dist/src/dispatch/ProjectDispatcher.js.map +1 -0
  29. package/dist/src/dispatch/TargetHandlerResolver.d.ts +9 -0
  30. package/dist/src/dispatch/TargetHandlerResolver.d.ts.map +1 -0
  31. package/dist/src/dispatch/TargetHandlerResolver.js +17 -0
  32. package/dist/src/dispatch/TargetHandlerResolver.js.map +1 -0
  33. package/dist/src/dispatch/WebhookTargetHandler.d.ts +7 -0
  34. package/dist/src/dispatch/WebhookTargetHandler.d.ts.map +1 -0
  35. package/dist/src/dispatch/WebhookTargetHandler.js +85 -0
  36. package/dist/src/dispatch/WebhookTargetHandler.js.map +1 -0
  37. package/dist/src/dispatch/types.d.ts +27 -0
  38. package/dist/src/dispatch/types.d.ts.map +1 -0
  39. package/dist/src/dispatch/types.js +3 -0
  40. package/dist/src/dispatch/types.js.map +1 -0
  41. package/dist/src/graphql/http/ActionsApiMiddlewareFactory.d.ts +10 -0
  42. package/dist/src/graphql/http/ActionsApiMiddlewareFactory.d.ts.map +1 -0
  43. package/dist/src/graphql/http/ActionsApiMiddlewareFactory.js +31 -0
  44. package/dist/src/graphql/http/ActionsApiMiddlewareFactory.js.map +1 -0
  45. package/dist/src/graphql/http/ActionsContextResolver.d.ts +11 -0
  46. package/dist/src/graphql/http/ActionsContextResolver.d.ts.map +1 -0
  47. package/dist/src/graphql/http/ActionsContextResolver.js +33 -0
  48. package/dist/src/graphql/http/ActionsContextResolver.js.map +1 -0
  49. package/dist/src/graphql/http/ActionsGraphQLHandlerFactory.d.ts +8 -0
  50. package/dist/src/graphql/http/ActionsGraphQLHandlerFactory.d.ts.map +1 -0
  51. package/dist/src/graphql/http/ActionsGraphQLHandlerFactory.js +21 -0
  52. package/dist/src/graphql/http/ActionsGraphQLHandlerFactory.js.map +1 -0
  53. package/dist/src/graphql/http/ActionsWebsocketControllerFactory.d.ts +11 -0
  54. package/dist/src/graphql/http/ActionsWebsocketControllerFactory.d.ts.map +1 -0
  55. package/dist/src/graphql/http/ActionsWebsocketControllerFactory.js +150 -0
  56. package/dist/src/graphql/http/ActionsWebsocketControllerFactory.js.map +1 -0
  57. package/dist/src/graphql/resolvers/ActionsContext.d.ts +9 -0
  58. package/dist/src/graphql/resolvers/ActionsContext.d.ts.map +1 -0
  59. package/dist/src/graphql/resolvers/ActionsContext.js +3 -0
  60. package/dist/src/graphql/resolvers/ActionsContext.js.map +1 -0
  61. package/dist/src/graphql/resolvers/ResolversFactory.d.ts +13 -0
  62. package/dist/src/graphql/resolvers/ResolversFactory.d.ts.map +1 -0
  63. package/dist/src/graphql/resolvers/ResolversFactory.js +32 -0
  64. package/dist/src/graphql/resolvers/ResolversFactory.js.map +1 -0
  65. package/dist/src/graphql/resolvers/index.d.ts +3 -0
  66. package/dist/src/graphql/resolvers/index.d.ts.map +1 -0
  67. package/dist/src/graphql/resolvers/index.js +19 -0
  68. package/dist/src/graphql/resolvers/index.js.map +1 -0
  69. package/dist/src/graphql/resolvers/mutation/ProcessBatchMutationResolver.d.ts +11 -0
  70. package/dist/src/graphql/resolvers/mutation/ProcessBatchMutationResolver.d.ts.map +1 -0
  71. package/dist/src/graphql/resolvers/mutation/ProcessBatchMutationResolver.js +16 -0
  72. package/dist/src/graphql/resolvers/mutation/ProcessBatchMutationResolver.js.map +1 -0
  73. package/dist/src/graphql/resolvers/mutation/SetVariablesMutationResolver.d.ts +11 -0
  74. package/dist/src/graphql/resolvers/mutation/SetVariablesMutationResolver.d.ts.map +1 -0
  75. package/dist/src/graphql/resolvers/mutation/SetVariablesMutationResolver.js +16 -0
  76. package/dist/src/graphql/resolvers/mutation/SetVariablesMutationResolver.js.map +1 -0
  77. package/dist/src/graphql/resolvers/mutation/index.d.ts +3 -0
  78. package/dist/src/graphql/resolvers/mutation/index.d.ts.map +1 -0
  79. package/dist/src/graphql/resolvers/mutation/index.js +19 -0
  80. package/dist/src/graphql/resolvers/mutation/index.js.map +1 -0
  81. package/dist/src/graphql/resolvers/query/EventsQueryResolver.d.ts +11 -0
  82. package/dist/src/graphql/resolvers/query/EventsQueryResolver.d.ts.map +1 -0
  83. package/dist/src/graphql/resolvers/query/EventsQueryResolver.js +43 -0
  84. package/dist/src/graphql/resolvers/query/EventsQueryResolver.js.map +1 -0
  85. package/dist/src/graphql/resolvers/query/VariablesQueryResolver.d.ts +12 -0
  86. package/dist/src/graphql/resolvers/query/VariablesQueryResolver.d.ts.map +1 -0
  87. package/dist/src/graphql/resolvers/query/VariablesQueryResolver.js +16 -0
  88. package/dist/src/graphql/resolvers/query/VariablesQueryResolver.js.map +1 -0
  89. package/dist/src/graphql/resolvers/query/index.d.ts +2 -0
  90. package/dist/src/graphql/resolvers/query/index.d.ts.map +1 -0
  91. package/dist/src/graphql/resolvers/query/index.js +18 -0
  92. package/dist/src/graphql/resolvers/query/index.js.map +1 -0
  93. package/dist/src/graphql/schema/actions.graphql.d.ts +3 -0
  94. package/dist/src/graphql/schema/actions.graphql.d.ts.map +1 -0
  95. package/dist/src/graphql/schema/actions.graphql.js +93 -0
  96. package/dist/src/graphql/schema/actions.graphql.js.map +1 -0
  97. package/dist/src/graphql/schema/index.d.ts +224 -0
  98. package/dist/src/graphql/schema/index.d.ts.map +1 -0
  99. package/dist/src/graphql/schema/index.js +3 -0
  100. package/dist/src/graphql/schema/index.js.map +1 -0
  101. package/dist/src/index.d.ts +13 -0
  102. package/dist/src/index.d.ts.map +1 -0
  103. package/dist/src/index.js +81 -0
  104. package/dist/src/index.js.map +1 -0
  105. package/dist/src/migrations/2023-03-10-145000-actions-variables.d.ts +3 -0
  106. package/dist/src/migrations/2023-03-10-145000-actions-variables.d.ts.map +1 -0
  107. package/dist/src/migrations/2023-03-10-145000-actions-variables.js +17 -0
  108. package/dist/src/migrations/2023-03-10-145000-actions-variables.js.map +1 -0
  109. package/dist/src/migrations/index.d.ts +3 -0
  110. package/dist/src/migrations/index.d.ts.map +1 -0
  111. package/dist/src/migrations/index.js +13 -0
  112. package/dist/src/migrations/index.js.map +1 -0
  113. package/dist/src/migrations/snapshot.d.ts +3 -0
  114. package/dist/src/migrations/snapshot.d.ts.map +1 -0
  115. package/dist/src/migrations/snapshot.js +49 -0
  116. package/dist/src/migrations/snapshot.js.map +1 -0
  117. package/dist/src/model/EventsInProcessingQuery.d.ts +9 -0
  118. package/dist/src/model/EventsInProcessingQuery.d.ts.map +1 -0
  119. package/dist/src/model/EventsInProcessingQuery.js +22 -0
  120. package/dist/src/model/EventsInProcessingQuery.js.map +1 -0
  121. package/dist/src/model/EventsToProcessQuery.d.ts +9 -0
  122. package/dist/src/model/EventsToProcessQuery.d.ts.map +1 -0
  123. package/dist/src/model/EventsToProcessQuery.js +22 -0
  124. package/dist/src/model/EventsToProcessQuery.js.map +1 -0
  125. package/dist/src/model/EventsToProcessSpecification.d.ts +4 -0
  126. package/dist/src/model/EventsToProcessSpecification.d.ts.map +1 -0
  127. package/dist/src/model/EventsToProcessSpecification.js +14 -0
  128. package/dist/src/model/EventsToProcessSpecification.js.map +1 -0
  129. package/dist/src/model/FailedEventsQuery.d.ts +9 -0
  130. package/dist/src/model/FailedEventsQuery.d.ts.map +1 -0
  131. package/dist/src/model/FailedEventsQuery.js +22 -0
  132. package/dist/src/model/FailedEventsQuery.js.map +1 -0
  133. package/dist/src/model/SetVariableCommand.d.ts +8 -0
  134. package/dist/src/model/SetVariableCommand.d.ts.map +1 -0
  135. package/dist/src/model/SetVariableCommand.js +26 -0
  136. package/dist/src/model/SetVariableCommand.js.map +1 -0
  137. package/dist/src/model/VariablesManager.d.ts +8 -0
  138. package/dist/src/model/VariablesManager.d.ts.map +1 -0
  139. package/dist/src/model/VariablesManager.js +46 -0
  140. package/dist/src/model/VariablesManager.js.map +1 -0
  141. package/dist/src/model/VariablesQuery.d.ts +12 -0
  142. package/dist/src/model/VariablesQuery.d.ts.map +1 -0
  143. package/dist/src/model/VariablesQuery.js +13 -0
  144. package/dist/src/model/VariablesQuery.js.map +1 -0
  145. package/dist/src/model/types.d.ts +16 -0
  146. package/dist/src/model/types.d.ts.map +1 -0
  147. package/dist/src/model/types.js +3 -0
  148. package/dist/src/model/types.js.map +1 -0
  149. package/dist/src/triggers/Payload.d.ts +62 -0
  150. package/dist/src/triggers/Payload.d.ts.map +1 -0
  151. package/dist/src/triggers/Payload.js +3 -0
  152. package/dist/src/triggers/Payload.js.map +1 -0
  153. package/dist/src/triggers/TriggerHandler.d.ts +26 -0
  154. package/dist/src/triggers/TriggerHandler.d.ts.map +1 -0
  155. package/dist/src/triggers/TriggerHandler.js +130 -0
  156. package/dist/src/triggers/TriggerHandler.js.map +1 -0
  157. package/dist/src/triggers/TriggerIndirectChangesFetcher.d.ts +11 -0
  158. package/dist/src/triggers/TriggerIndirectChangesFetcher.d.ts.map +1 -0
  159. package/dist/src/triggers/TriggerIndirectChangesFetcher.js +24 -0
  160. package/dist/src/triggers/TriggerIndirectChangesFetcher.js.map +1 -0
  161. package/dist/src/triggers/TriggerListeners.d.ts +9 -0
  162. package/dist/src/triggers/TriggerListeners.d.ts.map +1 -0
  163. package/dist/src/triggers/TriggerListeners.js +3 -0
  164. package/dist/src/triggers/TriggerListeners.js.map +1 -0
  165. package/dist/src/triggers/TriggerListenersBuilder.d.ts +15 -0
  166. package/dist/src/triggers/TriggerListenersBuilder.d.ts.map +1 -0
  167. package/dist/src/triggers/TriggerListenersBuilder.js +169 -0
  168. package/dist/src/triggers/TriggerListenersBuilder.js.map +1 -0
  169. package/dist/src/triggers/TriggerListenersFactory.d.ts +8 -0
  170. package/dist/src/triggers/TriggerListenersFactory.d.ts.map +1 -0
  171. package/dist/src/triggers/TriggerListenersFactory.js +18 -0
  172. package/dist/src/triggers/TriggerListenersFactory.js.map +1 -0
  173. package/dist/src/triggers/TriggerListenersStore.d.ts +48 -0
  174. package/dist/src/triggers/TriggerListenersStore.d.ts.map +1 -0
  175. package/dist/src/triggers/TriggerListenersStore.js +30 -0
  176. package/dist/src/triggers/TriggerListenersStore.js.map +1 -0
  177. package/dist/src/triggers/TriggerPayloadBuilder.d.ts +14 -0
  178. package/dist/src/triggers/TriggerPayloadBuilder.d.ts.map +1 -0
  179. package/dist/src/triggers/TriggerPayloadBuilder.js +140 -0
  180. package/dist/src/triggers/TriggerPayloadBuilder.js.map +1 -0
  181. package/dist/src/triggers/TriggerPayloadManager.d.ts +27 -0
  182. package/dist/src/triggers/TriggerPayloadManager.d.ts.map +1 -0
  183. package/dist/src/triggers/TriggerPayloadManager.js +26 -0
  184. package/dist/src/triggers/TriggerPayloadManager.js.map +1 -0
  185. package/dist/src/triggers/TriggerPayloadPersister.d.ts +18 -0
  186. package/dist/src/triggers/TriggerPayloadPersister.d.ts.map +1 -0
  187. package/dist/src/triggers/TriggerPayloadPersister.js +44 -0
  188. package/dist/src/triggers/TriggerPayloadPersister.js.map +1 -0
  189. package/dist/src/triggers/index.d.ts +8 -0
  190. package/dist/src/triggers/index.d.ts.map +1 -0
  191. package/dist/src/triggers/index.js +24 -0
  192. package/dist/src/triggers/index.js.map +1 -0
  193. package/dist/src/tsconfig.tsbuildinfo +1 -0
  194. package/dist/src/utils/assertNever.d.ts +2 -0
  195. package/dist/src/utils/assertNever.d.ts.map +1 -0
  196. package/dist/src/utils/assertNever.js +8 -0
  197. package/dist/src/utils/assertNever.js.map +1 -0
  198. package/dist/src/utils/map.d.ts +2 -0
  199. package/dist/src/utils/map.d.ts.map +1 -0
  200. package/dist/src/utils/map.js +14 -0
  201. package/dist/src/utils/map.js.map +1 -0
  202. package/dist/tests/cases/integration/triggers.manyHasManyWatch.test.d.ts +2 -0
  203. package/dist/tests/cases/integration/triggers.manyHasManyWatch.test.d.ts.map +1 -0
  204. package/dist/tests/cases/integration/triggers.manyHasManyWatch.test.js +442 -0
  205. package/dist/tests/cases/integration/triggers.manyHasManyWatch.test.js.map +1 -0
  206. package/dist/tests/cases/integration/triggers.manyHasOneWatch.test.d.ts +2 -0
  207. package/dist/tests/cases/integration/triggers.manyHasOneWatch.test.d.ts.map +1 -0
  208. package/dist/tests/cases/integration/triggers.manyHasOneWatch.test.js +449 -0
  209. package/dist/tests/cases/integration/triggers.manyHasOneWatch.test.js.map +1 -0
  210. package/dist/tests/cases/integration/triggers.rootWatch.test.d.ts +2 -0
  211. package/dist/tests/cases/integration/triggers.rootWatch.test.d.ts.map +1 -0
  212. package/dist/tests/cases/integration/triggers.rootWatch.test.js +159 -0
  213. package/dist/tests/cases/integration/triggers.rootWatch.test.js.map +1 -0
  214. package/dist/tests/cases/integration/utils.d.ts +4 -0
  215. package/dist/tests/cases/integration/utils.d.ts.map +1 -0
  216. package/dist/tests/cases/integration/utils.js +12 -0
  217. package/dist/tests/cases/integration/utils.js.map +1 -0
  218. package/dist/tests/cases/unit/generator.test.d.ts +2 -0
  219. package/dist/tests/cases/unit/generator.test.d.ts.map +1 -0
  220. package/dist/tests/cases/unit/generator.test.js +627 -0
  221. package/dist/tests/cases/unit/generator.test.js.map +1 -0
  222. package/dist/tests/src/gql.d.ts +2 -0
  223. package/dist/tests/src/gql.d.ts.map +1 -0
  224. package/dist/tests/src/gql.js +14 -0
  225. package/dist/tests/src/gql.js.map +1 -0
  226. package/dist/tests/tsconfig.tsbuildinfo +1 -0
  227. package/graphql-actions.codegen.yml +21 -0
  228. package/package.json +45 -0
  229. package/src/ActionsExecutionContainerHookFactory.ts +28 -0
  230. package/src/ImplementationException.ts +2 -0
  231. package/src/ListenerStoreProvider.ts +17 -0
  232. package/src/dispatch/DispatchWorkerSupervisor.ts +137 -0
  233. package/src/dispatch/EventDispatcher.ts +64 -0
  234. package/src/dispatch/EventsRepository.ts +165 -0
  235. package/src/dispatch/ProjectDispatcher.ts +119 -0
  236. package/src/dispatch/TargetHandlerResolver.ts +18 -0
  237. package/src/dispatch/WebhookTargetHandler.ts +88 -0
  238. package/src/dispatch/types.ts +31 -0
  239. package/src/graphql/http/ActionsApiMiddlewareFactory.ts +36 -0
  240. package/src/graphql/http/ActionsContextResolver.ts +38 -0
  241. package/src/graphql/http/ActionsGraphQLHandlerFactory.ts +23 -0
  242. package/src/graphql/http/ActionsWebsocketControllerFactory.ts +143 -0
  243. package/src/graphql/resolvers/ActionsContext.ts +9 -0
  244. package/src/graphql/resolvers/ResolversFactory.ts +35 -0
  245. package/src/graphql/resolvers/index.ts +2 -0
  246. package/src/graphql/resolvers/mutation/ProcessBatchMutationResolver.ts +16 -0
  247. package/src/graphql/resolvers/mutation/SetVariablesMutationResolver.ts +19 -0
  248. package/src/graphql/resolvers/mutation/index.ts +2 -0
  249. package/src/graphql/resolvers/query/EventsQueryResolver.ts +55 -0
  250. package/src/graphql/resolvers/query/VariablesQueryResolver.ts +18 -0
  251. package/src/graphql/resolvers/query/index.ts +1 -0
  252. package/src/graphql/schema/actions.graphql.ts +91 -0
  253. package/src/graphql/schema/index.ts +295 -0
  254. package/src/index.ts +88 -0
  255. package/src/migrations/2023-03-10-145000-actions-variables.ts +16 -0
  256. package/src/migrations/index.ts +7 -0
  257. package/src/migrations/snapshot.ts +47 -0
  258. package/src/model/EventsInProcessingQuery.ts +21 -0
  259. package/src/model/EventsToProcessQuery.ts +21 -0
  260. package/src/model/EventsToProcessSpecification.ts +11 -0
  261. package/src/model/FailedEventsQuery.ts +21 -0
  262. package/src/model/SetVariableCommand.ts +26 -0
  263. package/src/model/VariablesManager.ts +49 -0
  264. package/src/model/VariablesQuery.ts +17 -0
  265. package/src/model/types.ts +15 -0
  266. package/src/triggers/Payload.ts +82 -0
  267. package/src/triggers/TriggerHandler.ts +161 -0
  268. package/src/triggers/TriggerIndirectChangesFetcher.ts +30 -0
  269. package/src/triggers/TriggerListeners.ts +16 -0
  270. package/src/triggers/TriggerListenersBuilder.ts +190 -0
  271. package/src/triggers/TriggerListenersFactory.ts +19 -0
  272. package/src/triggers/TriggerListenersStore.ts +76 -0
  273. package/src/triggers/TriggerPayloadBuilder.ts +148 -0
  274. package/src/triggers/TriggerPayloadManager.ts +47 -0
  275. package/src/triggers/TriggerPayloadPersister.ts +43 -0
  276. package/src/triggers/index.ts +7 -0
  277. package/src/tsconfig.json +21 -0
  278. package/src/utils/assertNever.ts +3 -0
  279. package/src/utils/map.ts +13 -0
  280. package/tests/cases/integration/triggers.manyHasManyWatch.test.ts +437 -0
  281. package/tests/cases/integration/triggers.manyHasOneWatch.test.ts +446 -0
  282. package/tests/cases/integration/triggers.rootWatch.test.ts +152 -0
  283. package/tests/cases/integration/utils.ts +9 -0
  284. package/tests/cases/unit/generator.test.ts +689 -0
  285. package/tests/src/gql.ts +7 -0
  286. package/tests/tsconfig.json +16 -0
  287. package/tsconfig.json +5 -0
  288. package/tsconfig.settings.json +8 -0
  289. package/vite.config.js +3 -0
@@ -0,0 +1,148 @@
1
+ import { AnyEventPayload, BaseEventPayload, WatchEventPayload } from './Payload'
2
+ import { ImplementationException } from '../ImplementationException'
3
+ import { assertNever } from '../utils/assertNever'
4
+ import { FiredEvent } from './TriggerPayloadManager'
5
+ import { Actions, Input } from '@contember/schema'
6
+ import { FieldNode, Mapper, ObjectNode } from '@contember/engine-content-api'
7
+
8
+ type Selections = Record<Input.PrimaryValue, any>
9
+
10
+ export class TriggerPayloadBuilder {
11
+ constructor(
12
+ private readonly mapper: Mapper,
13
+ ) {
14
+ }
15
+
16
+ public async build(events: FiredEvent[]): Promise<AnyEventPayload[]> {
17
+ const filteredEvents = events.filter(it => {
18
+ return it.cause.type !== 'BeforeUpdateEvent'
19
+ || it.cause.afterEvent?.hasChanges === true
20
+ })
21
+ if (filteredEvents.length === 0) {
22
+ return []
23
+ }
24
+ const selections = await this.fetchSelection(filteredEvents)
25
+ const triggerType = filteredEvents[0].listener.trigger.type
26
+ if (triggerType === 'basic') {
27
+ return filteredEvents.map(it => ({ trigger: it.listener.trigger.name, ...this.buildBaseEventPayloads(it, selections[it.primary]) }))
28
+ }
29
+ if (triggerType === 'watch') {
30
+ return this.buildWatchEventPayloads(filteredEvents, selections)
31
+ }
32
+ return assertNever(triggerType)
33
+ }
34
+
35
+ public async preprocessEvent(event: FiredEvent): Promise<FiredEvent> {
36
+ if (event.listener.type === 'delete' && event.listener.trigger.selection) {
37
+ const input = this.convertSelectionNode(event.listener.trigger.selection)
38
+
39
+ const selection = await this.mapper.selectUnique(event.entity, input.withArg('by', {
40
+ [event.entity.primary]: event.primary,
41
+ }), [])
42
+ return { ...event, selection }
43
+ }
44
+ return event
45
+ }
46
+
47
+ private buildWatchEventPayloads(events: FiredEvent[], selections: Selections): WatchEventPayload[] {
48
+ const byPrimary: Record<Input.PrimaryValue, { primary: Input.PrimaryValue; events: FiredEvent[] }> = {}
49
+ for (const event of events) {
50
+ byPrimary[event.primary] ??= { primary: event.primary, events: [] }
51
+ byPrimary[event.primary].events.push(event)
52
+ }
53
+ const payloads: WatchEventPayload[] = []
54
+ for (const eventsByPrimary of Object.values(byPrimary)) {
55
+ payloads.push({
56
+ operation: 'watch',
57
+ trigger: events[0].listener.trigger.name,
58
+ entity: events[0].entity.name,
59
+ id: eventsByPrimary.primary,
60
+ selection: selections[eventsByPrimary.primary],
61
+ events: eventsByPrimary.events.map(it => this.buildBaseEventPayloads(it)),
62
+ })
63
+ }
64
+ return payloads
65
+ }
66
+
67
+ private buildBaseEventPayloads(event: FiredEvent, selection?: any): BaseEventPayload {
68
+ switch (event.cause.type) {
69
+ case 'AfterInsertEvent':
70
+ return {
71
+ operation: 'create',
72
+ entity: event.cause.entity.name,
73
+ id: event.cause.id,
74
+ selection,
75
+ values: Object.fromEntries(event.cause.data.map(it => [it.fieldName, it.resolvedValue])),
76
+ path: 'path' in event.listener ? event.listener.path : undefined,
77
+ }
78
+ case 'AfterUpdateEvent':
79
+ case 'BeforeUpdateEvent':
80
+ const afterEvent = event.cause.type === 'AfterUpdateEvent' ? event.cause : event.cause.afterEvent
81
+ if (!afterEvent) {
82
+ throw new ImplementationException()
83
+ }
84
+ return {
85
+ operation: 'update',
86
+ entity: event.cause.entity.name,
87
+ id: event.cause.id,
88
+ selection,
89
+ values: Object.fromEntries(event.cause.data.map(it => [it.fieldName, it.resolvedValue])),
90
+ path: 'path' in event.listener ? event.listener.path : undefined,
91
+ old: Object.fromEntries(afterEvent.data.map(it => [it.fieldName, it.old])),
92
+ }
93
+ case 'BeforeDeleteEvent':
94
+ return {
95
+ operation: 'delete',
96
+ entity: event.cause.entity.name,
97
+ id: event.cause.id,
98
+ selection,
99
+ path: 'path' in event.listener ? event.listener.path : undefined,
100
+ }
101
+ case 'AfterJunctionUpdateEvent':
102
+ if (event.listener.type !== 'junction') {
103
+ throw new ImplementationException()
104
+ }
105
+ const [id, inverseId] = event.listener.context.type === 'owning'
106
+ ? [event.cause.owningId, event.cause.inverseId]
107
+ : [event.cause.inverseId, event.cause.owningId]
108
+ return {
109
+ operation: event.cause.operation === 'connect' ? 'junction_connect' : 'junction_disconnect',
110
+ entity: event.listener.context.entity.name,
111
+ relation: event.listener.context.relation.name,
112
+ id,
113
+ inverseId,
114
+ path: 'path' in event.listener ? event.listener.path : undefined,
115
+ }
116
+ default:
117
+ assertNever(event.cause, it => it.type)
118
+ }
119
+ }
120
+
121
+ private async fetchSelection(events: FiredEvent[]): Promise<Selections> {
122
+ const trigger = events[0].listener.trigger
123
+ if (!trigger.selection) {
124
+ return {}
125
+ }
126
+
127
+ const ids = Array.from(new Set(events.filter(it => it.listener.type !== 'delete').map(it => it.primary)))
128
+ if (ids.length === 0) {
129
+ return {}
130
+ }
131
+ const entity = events[0].entity
132
+ const input = this.convertSelectionNode(trigger.selection).withArg('filter', {
133
+ [entity.primary]: { in: ids },
134
+ })
135
+ return await this.mapper.selectAssoc(entity, input, [], entity.primary)
136
+ }
137
+
138
+
139
+ private convertSelectionNode(node: Actions.SelectionNode, nodeName = 'root', path: string[] = []): ObjectNode<Input.ListQueryInput> {
140
+ return new ObjectNode(nodeName, nodeName, node.map(it => {
141
+ const [field, args, selection] = Array.isArray(it) ? it : [it, undefined, undefined]
142
+ if (selection === undefined || selection.length === 0) {
143
+ return new FieldNode(field, field, {})
144
+ }
145
+ return this.convertSelectionNode(selection, field, [...path, nodeName]).withArgs(args)
146
+ }), {}, {}, path)
147
+ }
148
+ }
@@ -0,0 +1,47 @@
1
+ import { Actions, Input, Model } from '@contember/schema'
2
+ import { AnyEventPayload } from './Payload'
3
+ import { AnyListener } from './TriggerListenersStore'
4
+ import { EventCause } from './TriggerHandler'
5
+ import { TriggerPayloadBuilder } from './TriggerPayloadBuilder'
6
+ import { TriggerPayloadPersister } from './TriggerPayloadPersister'
7
+
8
+
9
+ export interface FiredEvent {
10
+ listener: AnyListener
11
+ cause: EventCause
12
+ entity: Model.Entity
13
+ primary: Input.PrimaryValue
14
+ selection?: any
15
+ }
16
+
17
+ export type GroupedPayloads = {
18
+ trigger: Actions.AnyTrigger
19
+ entity: Model.Entity
20
+ payloads: AnyEventPayload[]
21
+ }
22
+
23
+ export class TriggerPayloadManager {
24
+ private eventsByTrigger: Record<string, FiredEvent[]> = {}
25
+
26
+ constructor(
27
+ private readonly triggerPayloadBuilder: TriggerPayloadBuilder,
28
+ private readonly triggerPayloadPersister: TriggerPayloadPersister,
29
+ ) {
30
+ }
31
+
32
+ public async add(firedEvent: FiredEvent) {
33
+ const event = await this.triggerPayloadBuilder.preprocessEvent(firedEvent)
34
+ this.eventsByTrigger[firedEvent.listener.trigger.name] ??= []
35
+ this.eventsByTrigger[firedEvent.listener.trigger.name].push(event)
36
+ }
37
+
38
+
39
+ public async persist(): Promise<void> {
40
+ for (const events of Object.values(this.eventsByTrigger)) {
41
+ const payloads = await this.triggerPayloadBuilder.build(events)
42
+ const trigger = events[0].listener.trigger
43
+ await this.triggerPayloadPersister.persist(trigger, payloads)
44
+ }
45
+ }
46
+ }
47
+
@@ -0,0 +1,43 @@
1
+ import { Client, InsertBuilder } from '@contember/database'
2
+ import { AnyEventPayload } from './Payload'
3
+ import { Mapper } from '@contember/engine-content-api'
4
+ import { Actions } from '@contember/schema'
5
+
6
+ export const NOTIFY_CHANNEL_NAME = 'actions_event'
7
+ export class TriggerPayloadPersister {
8
+ constructor(
9
+ private readonly mapper: Mapper,
10
+ private readonly client: Client,
11
+ private readonly providers: { uuid: () => string },
12
+ private readonly projectSlug: string,
13
+ private readonly stageId: string,
14
+ private readonly schemaId: number,
15
+ ) {
16
+ }
17
+
18
+ public async persist(trigger: Actions.AnyTrigger, payloads: AnyEventPayload[]): Promise<void> {
19
+ const chunkSize = 100
20
+ for (let i = 0; i < payloads.length; i += chunkSize) {
21
+ const chunk = payloads.slice(i, i + chunkSize)
22
+ await InsertBuilder.create()
23
+ .into('actions_event')
24
+ .values(chunk.map(it => ({
25
+ id: this.providers.uuid(),
26
+ transaction_id: this.mapper.transactionId,
27
+ created_at: 'now',
28
+ visible_at: 'now',
29
+ num_retries: 0,
30
+ state: 'created',
31
+ stage_id: this.stageId,
32
+ schema_id: this.schemaId,
33
+ target: trigger.target,
34
+ trigger: trigger.name,
35
+ priority: trigger.priority ?? 0,
36
+ payload: it,
37
+ })))
38
+ .execute(this.client)
39
+ }
40
+
41
+ await this.client.query('SELECT pg_notify(?, ?)', [NOTIFY_CHANNEL_NAME, this.projectSlug])
42
+ }
43
+ }
@@ -0,0 +1,7 @@
1
+ export * from './TriggerIndirectChangesFetcher'
2
+ export * from './TriggerListeners'
3
+ export * from './TriggerListenersBuilder'
4
+ export * from './TriggerListenersFactory'
5
+ export * from './TriggerListenersStore'
6
+ export * from './TriggerHandler'
7
+ export * from './TriggerPayloadManager'
@@ -0,0 +1,21 @@
1
+ {
2
+ "extends": "../tsconfig.settings.json",
3
+ "compilerOptions": {
4
+ "outDir": "../dist/src"
5
+ },
6
+ "references": [
7
+ { "path": "../../../packages/database/src" },
8
+ { "path": "../../../packages/database-migrations/src" },
9
+ { "path": "../../../packages/engine-common/src" },
10
+ { "path": "../../../packages/engine-content-api/src" },
11
+ { "path": "../../../packages/engine-system-api/src" },
12
+ { "path": "../../../packages/engine-tenant-api/src" },
13
+ { "path": "../../../packages/graphql-utils/src" },
14
+ { "path": "../../../packages/logger/src" },
15
+ { "path": "../../../packages/schema/src" },
16
+ { "path": "../../../packages/schema-utils/src" },
17
+ { "path": "../../../packages/typesafe/src" },
18
+ { "path": "../../../packages/engine-plugins/src" },
19
+ { "path": "../../../packages/engine-http/src" }
20
+ ]
21
+ }
@@ -0,0 +1,3 @@
1
+ export function assertNever(_: never, formatUnhandledDiscriminator?: (value: any) => string): never {
2
+ throw new Error(`Unhandled case ${formatUnhandledDiscriminator?.(_)}`)
3
+ }
@@ -0,0 +1,13 @@
1
+ export const mapGetOrPut = <K, V, D extends V>(
2
+ map: Map<K, V>,
3
+ key: K,
4
+ defaultValue: () => D,
5
+ ): V => {
6
+ const value = map.get(key)
7
+ if (value !== undefined) {
8
+ return value
9
+ }
10
+ const newValue = defaultValue()
11
+ map.set(key, newValue)
12
+ return newValue
13
+ }