@contember/engine-actions 2.1.0-beta.1 → 2.2.0-alpha.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (294) hide show
  1. package/dist/development/index.cjs +10 -4
  2. package/dist/development/index.cjs.map +1 -1
  3. package/dist/development/index.js +10 -4
  4. package/dist/development/index.js.map +1 -1
  5. package/dist/development/src/ActionsExecutionContainerHookFactory.cjs +3 -2
  6. package/dist/development/src/ActionsExecutionContainerHookFactory.cjs.map +1 -1
  7. package/dist/development/src/ActionsExecutionContainerHookFactory.js +3 -2
  8. package/dist/development/src/ActionsExecutionContainerHookFactory.js.map +1 -1
  9. package/dist/development/src/ListenerStoreProvider.cjs.map +1 -1
  10. package/dist/development/src/ListenerStoreProvider.js.map +1 -1
  11. package/dist/development/src/authorization/ActionsPermissionsFactory.cjs.map +1 -1
  12. package/dist/development/src/authorization/ActionsPermissionsFactory.js.map +1 -1
  13. package/dist/development/src/dispatch/DispatchWorkerSupervisor.cjs.map +1 -1
  14. package/dist/development/src/dispatch/DispatchWorkerSupervisor.js.map +1 -1
  15. package/dist/development/src/dispatch/EventDispatcher.cjs.map +1 -1
  16. package/dist/development/src/dispatch/EventDispatcher.js.map +1 -1
  17. package/dist/development/src/dispatch/EventsRepository.cjs.map +1 -1
  18. package/dist/development/src/dispatch/EventsRepository.js.map +1 -1
  19. package/dist/development/src/dispatch/LazyDispatchWorker.cjs +67 -0
  20. package/dist/development/src/dispatch/LazyDispatchWorker.cjs.map +1 -0
  21. package/dist/development/src/dispatch/LazyDispatchWorker.js +67 -0
  22. package/dist/development/src/dispatch/LazyDispatchWorker.js.map +1 -0
  23. package/dist/development/src/dispatch/ProjectDispatcher.cjs.map +1 -1
  24. package/dist/development/src/dispatch/ProjectDispatcher.js.map +1 -1
  25. package/dist/development/src/dispatch/TargetHandlerResolver.cjs.map +1 -1
  26. package/dist/development/src/dispatch/TargetHandlerResolver.js.map +1 -1
  27. package/dist/development/src/dispatch/WebhookTargetHandler.cjs.map +1 -1
  28. package/dist/development/src/dispatch/WebhookTargetHandler.js.map +1 -1
  29. package/dist/development/src/graphql/http/ActionsApiMiddlewareFactory.cjs.map +1 -1
  30. package/dist/development/src/graphql/http/ActionsApiMiddlewareFactory.js.map +1 -1
  31. package/dist/development/src/graphql/http/ActionsContextResolver.cjs.map +1 -1
  32. package/dist/development/src/graphql/http/ActionsContextResolver.js.map +1 -1
  33. package/dist/development/src/graphql/http/ActionsGraphQLHandlerFactory.cjs.map +1 -1
  34. package/dist/development/src/graphql/http/ActionsGraphQLHandlerFactory.js.map +1 -1
  35. package/dist/development/src/graphql/http/ActionsWebsocketControllerFactory.cjs.map +1 -1
  36. package/dist/development/src/graphql/http/ActionsWebsocketControllerFactory.js.map +1 -1
  37. package/dist/development/src/graphql/resolvers/ResolversFactory.cjs.map +1 -1
  38. package/dist/development/src/graphql/resolvers/ResolversFactory.js.map +1 -1
  39. package/dist/development/src/graphql/resolvers/mutation/ProcessBatchMutationResolver.cjs.map +1 -1
  40. package/dist/development/src/graphql/resolvers/mutation/ProcessBatchMutationResolver.js.map +1 -1
  41. package/dist/development/src/graphql/resolvers/mutation/RetryEventMutationResolver.cjs.map +1 -1
  42. package/dist/development/src/graphql/resolvers/mutation/RetryEventMutationResolver.js.map +1 -1
  43. package/dist/development/src/graphql/resolvers/mutation/SetVariablesMutationResolver.cjs.map +1 -1
  44. package/dist/development/src/graphql/resolvers/mutation/SetVariablesMutationResolver.js.map +1 -1
  45. package/dist/development/src/graphql/resolvers/mutation/StopEventMutationResolver.cjs.map +1 -1
  46. package/dist/development/src/graphql/resolvers/mutation/StopEventMutationResolver.js.map +1 -1
  47. package/dist/development/src/graphql/resolvers/query/EventsQueryResolver.cjs.map +1 -1
  48. package/dist/development/src/graphql/resolvers/query/EventsQueryResolver.js.map +1 -1
  49. package/dist/development/src/graphql/resolvers/query/VariablesQueryResolver.cjs.map +1 -1
  50. package/dist/development/src/graphql/resolvers/query/VariablesQueryResolver.js.map +1 -1
  51. package/dist/development/src/migrations/index.cjs.map +1 -1
  52. package/dist/development/src/migrations/index.js.map +1 -1
  53. package/dist/development/src/model/EventByIdQuery.cjs.map +1 -1
  54. package/dist/development/src/model/EventByIdQuery.js.map +1 -1
  55. package/dist/development/src/model/EventsInProcessingQuery.cjs.map +1 -1
  56. package/dist/development/src/model/EventsInProcessingQuery.js.map +1 -1
  57. package/dist/development/src/model/EventsToProcessQuery.cjs.map +1 -1
  58. package/dist/development/src/model/EventsToProcessQuery.js.map +1 -1
  59. package/dist/development/src/model/FailedEventsQuery.cjs.map +1 -1
  60. package/dist/development/src/model/FailedEventsQuery.js.map +1 -1
  61. package/dist/development/src/model/VariablesManager.cjs.map +1 -1
  62. package/dist/development/src/model/VariablesManager.js.map +1 -1
  63. package/dist/development/src/triggers/TriggerHandler.cjs.map +1 -1
  64. package/dist/development/src/triggers/TriggerHandler.js.map +1 -1
  65. package/dist/development/src/triggers/TriggerIndirectChangesFetcher.cjs.map +1 -1
  66. package/dist/development/src/triggers/TriggerIndirectChangesFetcher.js.map +1 -1
  67. package/dist/development/src/triggers/TriggerListenersBuilder.cjs.map +1 -1
  68. package/dist/development/src/triggers/TriggerListenersBuilder.js.map +1 -1
  69. package/dist/development/src/triggers/TriggerListenersFactory.cjs.map +1 -1
  70. package/dist/development/src/triggers/TriggerListenersFactory.js.map +1 -1
  71. package/dist/development/src/triggers/TriggerListenersStore.cjs.map +1 -1
  72. package/dist/development/src/triggers/TriggerListenersStore.js.map +1 -1
  73. package/dist/development/src/triggers/TriggerPayloadBuilder.cjs.map +1 -1
  74. package/dist/development/src/triggers/TriggerPayloadBuilder.js.map +1 -1
  75. package/dist/development/src/triggers/TriggerPayloadManager.cjs.map +1 -1
  76. package/dist/development/src/triggers/TriggerPayloadManager.js.map +1 -1
  77. package/dist/development/src/triggers/TriggerPayloadPersister.cjs +32 -20
  78. package/dist/development/src/triggers/TriggerPayloadPersister.cjs.map +1 -1
  79. package/dist/development/src/triggers/TriggerPayloadPersister.js +32 -20
  80. package/dist/development/src/triggers/TriggerPayloadPersister.js.map +1 -1
  81. package/dist/production/index.cjs +10 -4
  82. package/dist/production/index.cjs.map +1 -1
  83. package/dist/production/index.js +10 -4
  84. package/dist/production/index.js.map +1 -1
  85. package/dist/production/src/ActionsExecutionContainerHookFactory.cjs +3 -2
  86. package/dist/production/src/ActionsExecutionContainerHookFactory.cjs.map +1 -1
  87. package/dist/production/src/ActionsExecutionContainerHookFactory.js +3 -2
  88. package/dist/production/src/ActionsExecutionContainerHookFactory.js.map +1 -1
  89. package/dist/production/src/ListenerStoreProvider.cjs.map +1 -1
  90. package/dist/production/src/ListenerStoreProvider.js.map +1 -1
  91. package/dist/production/src/authorization/ActionsPermissionsFactory.cjs.map +1 -1
  92. package/dist/production/src/authorization/ActionsPermissionsFactory.js.map +1 -1
  93. package/dist/production/src/dispatch/DispatchWorkerSupervisor.cjs.map +1 -1
  94. package/dist/production/src/dispatch/DispatchWorkerSupervisor.js.map +1 -1
  95. package/dist/production/src/dispatch/EventDispatcher.cjs.map +1 -1
  96. package/dist/production/src/dispatch/EventDispatcher.js.map +1 -1
  97. package/dist/production/src/dispatch/EventsRepository.cjs.map +1 -1
  98. package/dist/production/src/dispatch/EventsRepository.js.map +1 -1
  99. package/dist/production/src/dispatch/LazyDispatchWorker.cjs +67 -0
  100. package/dist/production/src/dispatch/LazyDispatchWorker.cjs.map +1 -0
  101. package/dist/production/src/dispatch/LazyDispatchWorker.js +67 -0
  102. package/dist/production/src/dispatch/LazyDispatchWorker.js.map +1 -0
  103. package/dist/production/src/dispatch/ProjectDispatcher.cjs.map +1 -1
  104. package/dist/production/src/dispatch/ProjectDispatcher.js.map +1 -1
  105. package/dist/production/src/dispatch/TargetHandlerResolver.cjs.map +1 -1
  106. package/dist/production/src/dispatch/TargetHandlerResolver.js.map +1 -1
  107. package/dist/production/src/dispatch/WebhookTargetHandler.cjs.map +1 -1
  108. package/dist/production/src/dispatch/WebhookTargetHandler.js.map +1 -1
  109. package/dist/production/src/graphql/http/ActionsApiMiddlewareFactory.cjs.map +1 -1
  110. package/dist/production/src/graphql/http/ActionsApiMiddlewareFactory.js.map +1 -1
  111. package/dist/production/src/graphql/http/ActionsContextResolver.cjs.map +1 -1
  112. package/dist/production/src/graphql/http/ActionsContextResolver.js.map +1 -1
  113. package/dist/production/src/graphql/http/ActionsGraphQLHandlerFactory.cjs.map +1 -1
  114. package/dist/production/src/graphql/http/ActionsGraphQLHandlerFactory.js.map +1 -1
  115. package/dist/production/src/graphql/http/ActionsWebsocketControllerFactory.cjs.map +1 -1
  116. package/dist/production/src/graphql/http/ActionsWebsocketControllerFactory.js.map +1 -1
  117. package/dist/production/src/graphql/resolvers/ResolversFactory.cjs.map +1 -1
  118. package/dist/production/src/graphql/resolvers/ResolversFactory.js.map +1 -1
  119. package/dist/production/src/graphql/resolvers/mutation/ProcessBatchMutationResolver.cjs.map +1 -1
  120. package/dist/production/src/graphql/resolvers/mutation/ProcessBatchMutationResolver.js.map +1 -1
  121. package/dist/production/src/graphql/resolvers/mutation/RetryEventMutationResolver.cjs.map +1 -1
  122. package/dist/production/src/graphql/resolvers/mutation/RetryEventMutationResolver.js.map +1 -1
  123. package/dist/production/src/graphql/resolvers/mutation/SetVariablesMutationResolver.cjs.map +1 -1
  124. package/dist/production/src/graphql/resolvers/mutation/SetVariablesMutationResolver.js.map +1 -1
  125. package/dist/production/src/graphql/resolvers/mutation/StopEventMutationResolver.cjs.map +1 -1
  126. package/dist/production/src/graphql/resolvers/mutation/StopEventMutationResolver.js.map +1 -1
  127. package/dist/production/src/graphql/resolvers/query/EventsQueryResolver.cjs.map +1 -1
  128. package/dist/production/src/graphql/resolvers/query/EventsQueryResolver.js.map +1 -1
  129. package/dist/production/src/graphql/resolvers/query/VariablesQueryResolver.cjs.map +1 -1
  130. package/dist/production/src/graphql/resolvers/query/VariablesQueryResolver.js.map +1 -1
  131. package/dist/production/src/migrations/index.cjs.map +1 -1
  132. package/dist/production/src/migrations/index.js.map +1 -1
  133. package/dist/production/src/model/EventByIdQuery.cjs.map +1 -1
  134. package/dist/production/src/model/EventByIdQuery.js.map +1 -1
  135. package/dist/production/src/model/EventsInProcessingQuery.cjs.map +1 -1
  136. package/dist/production/src/model/EventsInProcessingQuery.js.map +1 -1
  137. package/dist/production/src/model/EventsToProcessQuery.cjs.map +1 -1
  138. package/dist/production/src/model/EventsToProcessQuery.js.map +1 -1
  139. package/dist/production/src/model/FailedEventsQuery.cjs.map +1 -1
  140. package/dist/production/src/model/FailedEventsQuery.js.map +1 -1
  141. package/dist/production/src/model/VariablesManager.cjs.map +1 -1
  142. package/dist/production/src/model/VariablesManager.js.map +1 -1
  143. package/dist/production/src/triggers/TriggerHandler.cjs.map +1 -1
  144. package/dist/production/src/triggers/TriggerHandler.js.map +1 -1
  145. package/dist/production/src/triggers/TriggerIndirectChangesFetcher.cjs.map +1 -1
  146. package/dist/production/src/triggers/TriggerIndirectChangesFetcher.js.map +1 -1
  147. package/dist/production/src/triggers/TriggerListenersBuilder.cjs.map +1 -1
  148. package/dist/production/src/triggers/TriggerListenersBuilder.js.map +1 -1
  149. package/dist/production/src/triggers/TriggerListenersFactory.cjs.map +1 -1
  150. package/dist/production/src/triggers/TriggerListenersFactory.js.map +1 -1
  151. package/dist/production/src/triggers/TriggerListenersStore.cjs.map +1 -1
  152. package/dist/production/src/triggers/TriggerListenersStore.js.map +1 -1
  153. package/dist/production/src/triggers/TriggerPayloadBuilder.cjs.map +1 -1
  154. package/dist/production/src/triggers/TriggerPayloadBuilder.js.map +1 -1
  155. package/dist/production/src/triggers/TriggerPayloadManager.cjs.map +1 -1
  156. package/dist/production/src/triggers/TriggerPayloadManager.js.map +1 -1
  157. package/dist/production/src/triggers/TriggerPayloadPersister.cjs +32 -20
  158. package/dist/production/src/triggers/TriggerPayloadPersister.cjs.map +1 -1
  159. package/dist/production/src/triggers/TriggerPayloadPersister.js +32 -20
  160. package/dist/production/src/triggers/TriggerPayloadPersister.js.map +1 -1
  161. package/dist/tests/cases/unit/lazyDispatchWorker.test.d.ts +2 -0
  162. package/dist/tests/cases/unit/lazyDispatchWorker.test.d.ts.map +1 -0
  163. package/dist/tests/tsconfig.tsbuildinfo +1 -1
  164. package/dist/types/ActionsExecutionContainerHookFactory.d.ts +1 -1
  165. package/dist/types/ActionsExecutionContainerHookFactory.d.ts.map +1 -1
  166. package/dist/types/ListenerStoreProvider.d.ts +1 -1
  167. package/dist/types/ListenerStoreProvider.d.ts.map +1 -1
  168. package/dist/types/authorization/index.d.ts +3 -3
  169. package/dist/types/authorization/index.d.ts.map +1 -1
  170. package/dist/types/dispatch/DispatchWorkerSupervisor.d.ts +1 -1
  171. package/dist/types/dispatch/DispatchWorkerSupervisor.d.ts.map +1 -1
  172. package/dist/types/dispatch/EventDispatcher.d.ts +3 -3
  173. package/dist/types/dispatch/EventDispatcher.d.ts.map +1 -1
  174. package/dist/types/dispatch/EventsRepository.d.ts +1 -1
  175. package/dist/types/dispatch/EventsRepository.d.ts.map +1 -1
  176. package/dist/types/dispatch/LazyDispatchWorker.d.ts +11 -0
  177. package/dist/types/dispatch/LazyDispatchWorker.d.ts.map +1 -0
  178. package/dist/types/dispatch/ProjectDispatcher.d.ts +1 -1
  179. package/dist/types/dispatch/ProjectDispatcher.d.ts.map +1 -1
  180. package/dist/types/dispatch/TargetHandlerResolver.d.ts +2 -2
  181. package/dist/types/dispatch/TargetHandlerResolver.d.ts.map +1 -1
  182. package/dist/types/dispatch/WebhookTargetHandler.d.ts +2 -2
  183. package/dist/types/dispatch/WebhookTargetHandler.d.ts.map +1 -1
  184. package/dist/types/dispatch/types.d.ts +2 -2
  185. package/dist/types/dispatch/types.d.ts.map +1 -1
  186. package/dist/types/graphql/http/ActionsApiMiddlewareFactory.d.ts +3 -3
  187. package/dist/types/graphql/http/ActionsApiMiddlewareFactory.d.ts.map +1 -1
  188. package/dist/types/graphql/http/ActionsContextResolver.d.ts +1 -1
  189. package/dist/types/graphql/http/ActionsContextResolver.d.ts.map +1 -1
  190. package/dist/types/graphql/http/ActionsGraphQLHandlerFactory.d.ts +2 -2
  191. package/dist/types/graphql/http/ActionsGraphQLHandlerFactory.d.ts.map +1 -1
  192. package/dist/types/graphql/http/ActionsWebsocketControllerFactory.d.ts +2 -2
  193. package/dist/types/graphql/http/ActionsWebsocketControllerFactory.d.ts.map +1 -1
  194. package/dist/types/graphql/resolvers/ResolversFactory.d.ts +4 -4
  195. package/dist/types/graphql/resolvers/ResolversFactory.d.ts.map +1 -1
  196. package/dist/types/graphql/resolvers/index.d.ts +2 -2
  197. package/dist/types/graphql/resolvers/index.d.ts.map +1 -1
  198. package/dist/types/graphql/resolvers/mutation/ProcessBatchMutationResolver.d.ts +3 -3
  199. package/dist/types/graphql/resolvers/mutation/ProcessBatchMutationResolver.d.ts.map +1 -1
  200. package/dist/types/graphql/resolvers/mutation/RetryEventMutationResolver.d.ts +3 -3
  201. package/dist/types/graphql/resolvers/mutation/RetryEventMutationResolver.d.ts.map +1 -1
  202. package/dist/types/graphql/resolvers/mutation/SetVariablesMutationResolver.d.ts +3 -3
  203. package/dist/types/graphql/resolvers/mutation/SetVariablesMutationResolver.d.ts.map +1 -1
  204. package/dist/types/graphql/resolvers/mutation/StopEventMutationResolver.d.ts +3 -3
  205. package/dist/types/graphql/resolvers/mutation/StopEventMutationResolver.d.ts.map +1 -1
  206. package/dist/types/graphql/resolvers/mutation/index.d.ts +4 -4
  207. package/dist/types/graphql/resolvers/mutation/index.d.ts.map +1 -1
  208. package/dist/types/graphql/resolvers/query/EventsQueryResolver.d.ts +2 -2
  209. package/dist/types/graphql/resolvers/query/EventsQueryResolver.d.ts.map +1 -1
  210. package/dist/types/graphql/resolvers/query/VariablesQueryResolver.d.ts +3 -3
  211. package/dist/types/graphql/resolvers/query/VariablesQueryResolver.d.ts.map +1 -1
  212. package/dist/types/graphql/resolvers/query/index.d.ts +1 -1
  213. package/dist/types/graphql/resolvers/query/index.d.ts.map +1 -1
  214. package/dist/types/index.d.ts +3 -3
  215. package/dist/types/index.d.ts.map +1 -1
  216. package/dist/types/model/EventByIdQuery.d.ts +1 -1
  217. package/dist/types/model/EventByIdQuery.d.ts.map +1 -1
  218. package/dist/types/model/EventsInProcessingQuery.d.ts +2 -2
  219. package/dist/types/model/EventsInProcessingQuery.d.ts.map +1 -1
  220. package/dist/types/model/EventsToProcessQuery.d.ts +2 -2
  221. package/dist/types/model/EventsToProcessQuery.d.ts.map +1 -1
  222. package/dist/types/model/FailedEventsQuery.d.ts +2 -2
  223. package/dist/types/model/FailedEventsQuery.d.ts.map +1 -1
  224. package/dist/types/model/VariablesManager.d.ts +1 -1
  225. package/dist/types/model/VariablesManager.d.ts.map +1 -1
  226. package/dist/types/triggers/TriggerHandler.d.ts +3 -3
  227. package/dist/types/triggers/TriggerHandler.d.ts.map +1 -1
  228. package/dist/types/triggers/TriggerIndirectChangesFetcher.d.ts +1 -1
  229. package/dist/types/triggers/TriggerIndirectChangesFetcher.d.ts.map +1 -1
  230. package/dist/types/triggers/TriggerListeners.d.ts +1 -1
  231. package/dist/types/triggers/TriggerListeners.d.ts.map +1 -1
  232. package/dist/types/triggers/TriggerListenersBuilder.d.ts +1 -1
  233. package/dist/types/triggers/TriggerListenersBuilder.d.ts.map +1 -1
  234. package/dist/types/triggers/TriggerListenersFactory.d.ts +1 -1
  235. package/dist/types/triggers/TriggerListenersFactory.d.ts.map +1 -1
  236. package/dist/types/triggers/TriggerListenersStore.d.ts +1 -1
  237. package/dist/types/triggers/TriggerListenersStore.d.ts.map +1 -1
  238. package/dist/types/triggers/TriggerPayloadBuilder.d.ts +1 -1
  239. package/dist/types/triggers/TriggerPayloadBuilder.d.ts.map +1 -1
  240. package/dist/types/triggers/TriggerPayloadManager.d.ts +4 -4
  241. package/dist/types/triggers/TriggerPayloadManager.d.ts.map +1 -1
  242. package/dist/types/triggers/TriggerPayloadPersister.d.ts +3 -2
  243. package/dist/types/triggers/TriggerPayloadPersister.d.ts.map +1 -1
  244. package/dist/types/triggers/index.d.ts +7 -7
  245. package/dist/types/triggers/index.d.ts.map +1 -1
  246. package/dist/types/tsconfig.tsbuildinfo +1 -1
  247. package/package.json +15 -15
  248. package/src/ActionsExecutionContainerHookFactory.ts +9 -5
  249. package/src/ListenerStoreProvider.ts +1 -1
  250. package/src/authorization/ActionsPermissionsFactory.ts +1 -1
  251. package/src/authorization/index.ts +3 -3
  252. package/src/dispatch/DispatchWorkerSupervisor.ts +2 -2
  253. package/src/dispatch/EventDispatcher.ts +4 -4
  254. package/src/dispatch/EventsRepository.ts +3 -3
  255. package/src/dispatch/LazyDispatchWorker.ts +72 -0
  256. package/src/dispatch/ProjectDispatcher.ts +2 -2
  257. package/src/dispatch/TargetHandlerResolver.ts +3 -3
  258. package/src/dispatch/WebhookTargetHandler.ts +3 -3
  259. package/src/dispatch/types.ts +2 -2
  260. package/src/graphql/http/ActionsApiMiddlewareFactory.ts +4 -4
  261. package/src/graphql/http/ActionsContextResolver.ts +1 -1
  262. package/src/graphql/http/ActionsGraphQLHandlerFactory.ts +3 -2
  263. package/src/graphql/http/ActionsWebsocketControllerFactory.ts +2 -2
  264. package/src/graphql/resolvers/ResolversFactory.ts +10 -5
  265. package/src/graphql/resolvers/index.ts +2 -2
  266. package/src/graphql/resolvers/mutation/ProcessBatchMutationResolver.ts +4 -4
  267. package/src/graphql/resolvers/mutation/RetryEventMutationResolver.ts +5 -5
  268. package/src/graphql/resolvers/mutation/SetVariablesMutationResolver.ts +4 -4
  269. package/src/graphql/resolvers/mutation/StopEventMutationResolver.ts +4 -4
  270. package/src/graphql/resolvers/mutation/index.ts +4 -4
  271. package/src/graphql/resolvers/query/EventsQueryResolver.ts +8 -8
  272. package/src/graphql/resolvers/query/VariablesQueryResolver.ts +4 -4
  273. package/src/graphql/resolvers/query/index.ts +1 -1
  274. package/src/index.ts +39 -27
  275. package/src/migrations/index.ts +3 -3
  276. package/src/model/EventByIdQuery.ts +1 -1
  277. package/src/model/EventsInProcessingQuery.ts +2 -2
  278. package/src/model/EventsToProcessQuery.ts +3 -3
  279. package/src/model/FailedEventsQuery.ts +2 -2
  280. package/src/model/VariablesManager.ts +3 -3
  281. package/src/triggers/TriggerHandler.ts +3 -3
  282. package/src/triggers/TriggerIndirectChangesFetcher.ts +1 -1
  283. package/src/triggers/TriggerListeners.ts +1 -1
  284. package/src/triggers/TriggerListenersBuilder.ts +4 -4
  285. package/src/triggers/TriggerListenersFactory.ts +2 -2
  286. package/src/triggers/TriggerListenersStore.ts +1 -1
  287. package/src/triggers/TriggerPayloadBuilder.ts +3 -3
  288. package/src/triggers/TriggerPayloadManager.ts +4 -4
  289. package/src/triggers/TriggerPayloadPersister.ts +22 -9
  290. package/src/triggers/index.ts +7 -7
  291. package/tests/cases/unit/generator.test.ts +1 -1
  292. package/tests/cases/unit/lazyDispatchWorker.test.ts +226 -0
  293. package/tests/cases/unit/webhookHandler.test.ts +5 -5
  294. package/vitest.config.ts +0 -3
@@ -1 +1 @@
1
- {"version":3,"file":"VariablesManager.js","sources":["../../../../../packages/engine-actions/src/model/VariablesManager.ts"],"sourcesContent":["import { DatabaseContext } from '@contember/engine-system-api'\nimport { VariablesQuery } from './VariablesQuery'\nimport { SetVariablesArgs } from '../graphql/schema'\nimport { DeleteBuilder } from '@contember/database'\nimport { SetVariableCommand } from './SetVariableCommand'\n\nexport type VariablesMap = Record<string, string>\n\nexport class VariablesManager {\n\tpublic async fetchVariables(db: DatabaseContext): Promise<VariablesMap> {\n\t\treturn Object.fromEntries((await db.queryHandler.fetch(new VariablesQuery())).map(it => [it.name, it.value]))\n\t}\n\n\tpublic async setVariables(db: DatabaseContext, args: SetVariablesArgs) {\n\t\treturn await db.transaction(async db => {\n\t\t\tconst current = await this.fetchVariables(db)\n\t\t\tconst mode = args.mode ?? 'MERGE'\n\t\t\tconst inputVariables = Object.fromEntries(args.variables.map(it => [it.name, it.value]))\n\n\t\t\tlet newVariables: VariablesMap = {}\n\t\t\tswitch (mode) {\n\t\t\t\tcase 'APPEND_ONLY_MISSING':\n\t\t\t\t\tnewVariables = { ...inputVariables, ...current }\n\t\t\t\t\tbreak\n\t\t\t\tcase 'MERGE':\n\t\t\t\t\tnewVariables = { ...current, ...inputVariables }\n\t\t\t\t\tbreak\n\t\t\t\tcase 'SET':\n\t\t\t\t\tnewVariables = inputVariables\n\t\t\t\t\tbreak\n\t\t\t}\n\n\t\t\tconst toDelete = Object.keys(current).filter(it => !(it in newVariables))\n\t\t\tif (toDelete.length > 0) {\n\t\t\t\tawait DeleteBuilder.create()\n\t\t\t\t\t.from('actions_variable')\n\t\t\t\t\t.where(it => it.in('name', toDelete))\n\t\t\t\t\t.execute(db.client)\n\t\t\t}\n\n\t\t\tfor (const [name, value] of Object.entries(newVariables)) {\n\t\t\t\tif (value === current[name]) {\n\t\t\t\t\tcontinue\n\t\t\t\t}\n\t\t\t\tawait db.commandBus.execute(new SetVariableCommand(name, value))\n\t\t\t}\n\t\t})\n\t}\n}\n"],"names":["db"],"mappings":";;;AAQO,MAAM,iBAAiB;AAAA,EAC7B,MAAa,eAAe,IAA4C;AACvE,WAAO,OAAO,aAAa,MAAM,GAAG,aAAa,MAAM,IAAI,eAAA,CAAgB,GAAG,IAAI,QAAM,CAAC,GAAG,MAAM,GAAG,KAAK,CAAC,CAAC;AAAA,EAC7G;AAAA,EAEA,MAAa,aAAa,IAAqB,MAAwB;AACtE,WAAO,MAAM,GAAG,YAAY,OAAMA,QAAM;AACvC,YAAM,UAAU,MAAM,KAAK,eAAeA,GAAE;AAC5C,YAAM,OAAO,KAAK,QAAQ;AAC1B,YAAM,iBAAiB,OAAO,YAAY,KAAK,UAAU,IAAI,CAAA,OAAM,CAAC,GAAG,MAAM,GAAG,KAAK,CAAC,CAAC;AAEvF,UAAI,eAA6B,CAAA;AACjC,cAAQ,MAAA;AAAA,QACP,KAAK;AACJ,yBAAe,EAAE,GAAG,gBAAgB,GAAG,QAAA;AACvC;AAAA,QACD,KAAK;AACJ,yBAAe,EAAE,GAAG,SAAS,GAAG,eAAA;AAChC;AAAA,QACD,KAAK;AACJ,yBAAe;AACf;AAAA,MAAA;AAGF,YAAM,WAAW,OAAO,KAAK,OAAO,EAAE,OAAO,CAAA,OAAM,EAAE,MAAM,aAAa;AACxE,UAAI,SAAS,SAAS,GAAG;AACxB,cAAM,cAAc,OAAA,EAClB,KAAK,kBAAkB,EACvB,MAAM,CAAA,OAAM,GAAG,GAAG,QAAQ,QAAQ,CAAC,EACnC,QAAQA,IAAG,MAAM;AAAA,MACpB;AAEA,iBAAW,CAAC,MAAM,KAAK,KAAK,OAAO,QAAQ,YAAY,GAAG;AACzD,YAAI,UAAU,QAAQ,IAAI,GAAG;AAC5B;AAAA,QACD;AACA,cAAMA,IAAG,WAAW,QAAQ,IAAI,mBAAmB,MAAM,KAAK,CAAC;AAAA,MAChE;AAAA,IACD,CAAC;AAAA,EACF;AACD;"}
1
+ {"version":3,"file":"VariablesManager.js","sources":["../../../../../packages/engine-actions/src/model/VariablesManager.ts"],"sourcesContent":["import { DatabaseContext } from '@contember/engine-system-api'\nimport { VariablesQuery } from './VariablesQuery.js'\nimport { SetVariablesArgs } from '../graphql/schema/index.js'\nimport { DeleteBuilder } from '@contember/database'\nimport { SetVariableCommand } from './SetVariableCommand.js'\n\nexport type VariablesMap = Record<string, string>\n\nexport class VariablesManager {\n\tpublic async fetchVariables(db: DatabaseContext): Promise<VariablesMap> {\n\t\treturn Object.fromEntries((await db.queryHandler.fetch(new VariablesQuery())).map(it => [it.name, it.value]))\n\t}\n\n\tpublic async setVariables(db: DatabaseContext, args: SetVariablesArgs) {\n\t\treturn await db.transaction(async db => {\n\t\t\tconst current = await this.fetchVariables(db)\n\t\t\tconst mode = args.mode ?? 'MERGE'\n\t\t\tconst inputVariables = Object.fromEntries(args.variables.map(it => [it.name, it.value]))\n\n\t\t\tlet newVariables: VariablesMap = {}\n\t\t\tswitch (mode) {\n\t\t\t\tcase 'APPEND_ONLY_MISSING':\n\t\t\t\t\tnewVariables = { ...inputVariables, ...current }\n\t\t\t\t\tbreak\n\t\t\t\tcase 'MERGE':\n\t\t\t\t\tnewVariables = { ...current, ...inputVariables }\n\t\t\t\t\tbreak\n\t\t\t\tcase 'SET':\n\t\t\t\t\tnewVariables = inputVariables\n\t\t\t\t\tbreak\n\t\t\t}\n\n\t\t\tconst toDelete = Object.keys(current).filter(it => !(it in newVariables))\n\t\t\tif (toDelete.length > 0) {\n\t\t\t\tawait DeleteBuilder.create()\n\t\t\t\t\t.from('actions_variable')\n\t\t\t\t\t.where(it => it.in('name', toDelete))\n\t\t\t\t\t.execute(db.client)\n\t\t\t}\n\n\t\t\tfor (const [name, value] of Object.entries(newVariables)) {\n\t\t\t\tif (value === current[name]) {\n\t\t\t\t\tcontinue\n\t\t\t\t}\n\t\t\t\tawait db.commandBus.execute(new SetVariableCommand(name, value))\n\t\t\t}\n\t\t})\n\t}\n}\n"],"names":["db"],"mappings":";;;AAQO,MAAM,iBAAiB;AAAA,EAC7B,MAAa,eAAe,IAA4C;AACvE,WAAO,OAAO,aAAa,MAAM,GAAG,aAAa,MAAM,IAAI,eAAA,CAAgB,GAAG,IAAI,QAAM,CAAC,GAAG,MAAM,GAAG,KAAK,CAAC,CAAC;AAAA,EAC7G;AAAA,EAEA,MAAa,aAAa,IAAqB,MAAwB;AACtE,WAAO,MAAM,GAAG,YAAY,OAAMA,QAAM;AACvC,YAAM,UAAU,MAAM,KAAK,eAAeA,GAAE;AAC5C,YAAM,OAAO,KAAK,QAAQ;AAC1B,YAAM,iBAAiB,OAAO,YAAY,KAAK,UAAU,IAAI,CAAA,OAAM,CAAC,GAAG,MAAM,GAAG,KAAK,CAAC,CAAC;AAEvF,UAAI,eAA6B,CAAA;AACjC,cAAQ,MAAA;AAAA,QACP,KAAK;AACJ,yBAAe,EAAE,GAAG,gBAAgB,GAAG,QAAA;AACvC;AAAA,QACD,KAAK;AACJ,yBAAe,EAAE,GAAG,SAAS,GAAG,eAAA;AAChC;AAAA,QACD,KAAK;AACJ,yBAAe;AACf;AAAA,MAAA;AAGF,YAAM,WAAW,OAAO,KAAK,OAAO,EAAE,OAAO,CAAA,OAAM,EAAE,MAAM,aAAa;AACxE,UAAI,SAAS,SAAS,GAAG;AACxB,cAAM,cAAc,OAAA,EAClB,KAAK,kBAAkB,EACvB,MAAM,CAAA,OAAM,GAAG,GAAG,QAAQ,QAAQ,CAAC,EACnC,QAAQA,IAAG,MAAM;AAAA,MACpB;AAEA,iBAAW,CAAC,MAAM,KAAK,KAAK,OAAO,QAAQ,YAAY,GAAG;AACzD,YAAI,UAAU,QAAQ,IAAI,GAAG;AAC5B;AAAA,QACD;AACA,cAAMA,IAAG,WAAW,QAAQ,IAAI,mBAAmB,MAAM,KAAK,CAAC;AAAA,MAChE;AAAA,IACD,CAAC;AAAA,EACF;AACD;"}
@@ -1 +1 @@
1
- {"version":3,"file":"TriggerHandler.cjs","sources":["../../../../../packages/engine-actions/src/triggers/TriggerHandler.ts"],"sourcesContent":["import {\n\tAfterInsertEvent,\n\tAfterJunctionUpdateEvent,\n\tAfterUpdateEvent,\n\tBeforeDeleteEvent,\n\tBeforeUpdateEvent,\n\tEventManager,\n} from '@contember/engine-content-api'\nimport { Input } from '@contember/schema'\nimport { IndirectListener, JunctionListener, TriggerListenersStore } from './TriggerListenersStore'\nimport { TriggerPayloadManager } from './TriggerPayloadManager'\nimport { TriggerIndirectChangesFetcher } from './TriggerIndirectChangesFetcher'\n\nexport type EventCause =\n\t| BeforeUpdateEvent\n\t| AfterUpdateEvent\n\t| BeforeDeleteEvent\n\t| AfterInsertEvent\n\t| AfterJunctionUpdateEvent\n\nexport class TriggerHandler {\n\tconstructor(\n\t\tprivate readonly payloadManager: TriggerPayloadManager,\n\t\tprivate readonly listenersStore: TriggerListenersStore,\n\t\tprivate readonly changesFetcher: TriggerIndirectChangesFetcher,\n\t) {\n\t}\n\n\tattach(evm: EventManager) {\n\t\tevm.listen('BeforeDeleteEvent', async event => {\n\t\t\tawait this.directDeleteHandler(event)\n\t\t\tawait this.indirectChangesEntityHandler(event)\n\t\t})\n\t\tevm.listen('AfterInsertEvent', async event => {\n\t\t\tawait this.indirectChangesEntityHandler(event)\n\t\t\tawait this.directCreateHandler(event)\n\t\t})\n\t\tevm.listen('BeforeUpdateEvent', async event => {\n\t\t\tawait this.indirectChangesRelationHandler(event)\n\t\t})\n\t\tevm.listen('AfterUpdateEvent', async event => {\n\t\t\tif (event.hasChanges) {\n\t\t\t\tawait this.indirectChangesUpdatesHandler(event)\n\t\t\t\tawait this.directUpdateHandler(event)\n\t\t\t}\n\t\t})\n\t\tevm.listen('AfterJunctionUpdateEvent', async event => {\n\t\t\tif (event.hasChanges) {\n\t\t\t\tawait this.junctionHandler(event)\n\t\t\t}\n\t\t})\n\t\tevm.listen('BeforeCommitEvent', async event => {\n\t\t\tawait this.payloadManager.persist()\n\t\t})\n\t}\n\n\tprivate async directDeleteHandler(event: BeforeDeleteEvent) {\n\t\tconst deleteListeners = this.listenersStore.getDeleteListener(event.entity.name)\n\t\tif (!deleteListeners) {\n\t\t\treturn\n\t\t}\n\t\tawait Promise.all(deleteListeners.map(listener => {\n\t\t\treturn this.payloadManager.add({\n\t\t\t\tlistener,\n\t\t\t\tentity: event.entity,\n\t\t\t\tprimary: event.id,\n\t\t\t\tcause: event,\n\t\t\t})\n\t\t}))\n\t}\n\n\tprivate async directUpdateHandler(event: AfterUpdateEvent) {\n\t\tconst updateListeners = this.listenersStore.getUpdateListeners(event.entity.name)\n\t\tawait Promise.all(updateListeners.map(listener => {\n\t\t\tif (event.data.some(it => listener.fields.has(it.fieldName) && it.value !== it.old)) {\n\t\t\t\treturn this.payloadManager.add({\n\t\t\t\t\tlistener,\n\t\t\t\t\tentity: event.entity,\n\t\t\t\t\tprimary: event.id,\n\t\t\t\t\tcause: event,\n\t\t\t\t})\n\t\t\t}\n\t\t}))\n\t}\n\n\tprivate async directCreateHandler(event: AfterInsertEvent) {\n\t\tconst createListeners = this.listenersStore.getCreateListener(event.entity.name)\n\t\tawait Promise.all(createListeners.map(listener => {\n\t\t\treturn this.payloadManager.add({\n\t\t\t\tlistener,\n\t\t\t\tentity: event.entity,\n\t\t\t\tprimary: event.id,\n\t\t\t\tcause: event,\n\t\t\t})\n\t\t}))\n\t}\n\n\t/**\n\t * Collect affected triggers after entity was created or before it was deleted.\n\t * todo: after insert, it should probably check only owning relations, because other relations are connected later, so it would be always empty\n\t */\n\tprivate async indirectChangesEntityHandler(event: BeforeDeleteEvent | AfterInsertEvent) {\n\t\t//\n\t\tconst indirectEntityListeners = this.listenersStore.getIndirectListeners(event.entity.name)\n\t\tconst promises = indirectEntityListeners.map(listener =>\n\t\t\tthis.collectDeepChanges(event, listener, {\n\t\t\t\t[event.entity.primary]: { eq: event.id },\n\t\t\t})\n\t\t)\n\t\tawait Promise.all(promises)\n\t}\n\n\tprivate async indirectChangesRelationHandler(event: BeforeUpdateEvent) {\n\t\tawait this.indirectChangesUpdatesHandlerInner(event, 'relations')\n\t}\n\n\tprivate async indirectChangesUpdatesHandler(event: AfterUpdateEvent) {\n\t\tawait this.indirectChangesUpdatesHandlerInner(event, 'fields')\n\t}\n\tprivate async indirectChangesUpdatesHandlerInner(event: AfterUpdateEvent | BeforeUpdateEvent, type: 'fields' | 'relations') {\n\t\tconst indirectEntityListeners = this.listenersStore.getIndirectListeners(event.entity.name)\n\t\tconst promises = indirectEntityListeners.map(listener => {\n\t\t\tif (event.data.some(val => listener[type].has(val.fieldName) && (!('old' in val) || val.value !== val.old))) {\n\t\t\t\treturn this.collectDeepChanges(event, listener, {\n\t\t\t\t\t[event.entity.primary]: { eq: event.id },\n\t\t\t\t})\n\t\t\t}\n\t\t})\n\t\tawait Promise.all(promises)\n\t}\n\n\tprivate async junctionHandler(event: AfterJunctionUpdateEvent) {\n\t\tconst listeners = this.listenersStore.getJunctionListeners(event.owningEntity.name, event.owningRelation.name)\n\t\tconst promises = listeners.map(listener => {\n\t\t\tconst primary = listener.context.type === 'owning'\n\t\t\t\t? event.owningId\n\t\t\t\t: event.inverseId\n\t\t\tconst entity = listener.context.entity\n\t\t\treturn this.collectDeepChanges(event, listener, {\n\t\t\t\t[entity.primary]: { eq: primary },\n\t\t\t})\n\t\t})\n\t\tawait Promise.all(promises)\n\t}\n\n\tprivate async collectDeepChanges(\n\t\tcause: EventCause,\n\t\tlistener: IndirectListener | JunctionListener,\n\t\twhere: Input.Where,\n\t) {\n\t\tconst result = await this.changesFetcher.fetch(listener, where)\n\t\tawait Promise.all(result.map(row => {\n\t\t\treturn this.payloadManager.add({\n\t\t\t\tlistener,\n\t\t\t\tentity: listener.rootEntity,\n\t\t\t\tprimary: row.id,\n\t\t\t\tcause,\n\t\t\t\tnodes: row.nodes,\n\t\t\t})\n\t\t}))\n\t}\n}\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"TriggerHandler.cjs","sources":["../../../../../packages/engine-actions/src/triggers/TriggerHandler.ts"],"sourcesContent":["import {\n\tAfterInsertEvent,\n\tAfterJunctionUpdateEvent,\n\tAfterUpdateEvent,\n\tBeforeDeleteEvent,\n\tBeforeUpdateEvent,\n\tEventManager,\n} from '@contember/engine-content-api'\nimport { Input } from '@contember/schema'\nimport { IndirectListener, JunctionListener, TriggerListenersStore } from './TriggerListenersStore.js'\nimport { TriggerPayloadManager } from './TriggerPayloadManager.js'\nimport { TriggerIndirectChangesFetcher } from './TriggerIndirectChangesFetcher.js'\n\nexport type EventCause =\n\t| BeforeUpdateEvent\n\t| AfterUpdateEvent\n\t| BeforeDeleteEvent\n\t| AfterInsertEvent\n\t| AfterJunctionUpdateEvent\n\nexport class TriggerHandler {\n\tconstructor(\n\t\tprivate readonly payloadManager: TriggerPayloadManager,\n\t\tprivate readonly listenersStore: TriggerListenersStore,\n\t\tprivate readonly changesFetcher: TriggerIndirectChangesFetcher,\n\t) {\n\t}\n\n\tattach(evm: EventManager) {\n\t\tevm.listen('BeforeDeleteEvent', async event => {\n\t\t\tawait this.directDeleteHandler(event)\n\t\t\tawait this.indirectChangesEntityHandler(event)\n\t\t})\n\t\tevm.listen('AfterInsertEvent', async event => {\n\t\t\tawait this.indirectChangesEntityHandler(event)\n\t\t\tawait this.directCreateHandler(event)\n\t\t})\n\t\tevm.listen('BeforeUpdateEvent', async event => {\n\t\t\tawait this.indirectChangesRelationHandler(event)\n\t\t})\n\t\tevm.listen('AfterUpdateEvent', async event => {\n\t\t\tif (event.hasChanges) {\n\t\t\t\tawait this.indirectChangesUpdatesHandler(event)\n\t\t\t\tawait this.directUpdateHandler(event)\n\t\t\t}\n\t\t})\n\t\tevm.listen('AfterJunctionUpdateEvent', async event => {\n\t\t\tif (event.hasChanges) {\n\t\t\t\tawait this.junctionHandler(event)\n\t\t\t}\n\t\t})\n\t\tevm.listen('BeforeCommitEvent', async event => {\n\t\t\tawait this.payloadManager.persist()\n\t\t})\n\t}\n\n\tprivate async directDeleteHandler(event: BeforeDeleteEvent) {\n\t\tconst deleteListeners = this.listenersStore.getDeleteListener(event.entity.name)\n\t\tif (!deleteListeners) {\n\t\t\treturn\n\t\t}\n\t\tawait Promise.all(deleteListeners.map(listener => {\n\t\t\treturn this.payloadManager.add({\n\t\t\t\tlistener,\n\t\t\t\tentity: event.entity,\n\t\t\t\tprimary: event.id,\n\t\t\t\tcause: event,\n\t\t\t})\n\t\t}))\n\t}\n\n\tprivate async directUpdateHandler(event: AfterUpdateEvent) {\n\t\tconst updateListeners = this.listenersStore.getUpdateListeners(event.entity.name)\n\t\tawait Promise.all(updateListeners.map(listener => {\n\t\t\tif (event.data.some(it => listener.fields.has(it.fieldName) && it.value !== it.old)) {\n\t\t\t\treturn this.payloadManager.add({\n\t\t\t\t\tlistener,\n\t\t\t\t\tentity: event.entity,\n\t\t\t\t\tprimary: event.id,\n\t\t\t\t\tcause: event,\n\t\t\t\t})\n\t\t\t}\n\t\t}))\n\t}\n\n\tprivate async directCreateHandler(event: AfterInsertEvent) {\n\t\tconst createListeners = this.listenersStore.getCreateListener(event.entity.name)\n\t\tawait Promise.all(createListeners.map(listener => {\n\t\t\treturn this.payloadManager.add({\n\t\t\t\tlistener,\n\t\t\t\tentity: event.entity,\n\t\t\t\tprimary: event.id,\n\t\t\t\tcause: event,\n\t\t\t})\n\t\t}))\n\t}\n\n\t/**\n\t * Collect affected triggers after entity was created or before it was deleted.\n\t * todo: after insert, it should probably check only owning relations, because other relations are connected later, so it would be always empty\n\t */\n\tprivate async indirectChangesEntityHandler(event: BeforeDeleteEvent | AfterInsertEvent) {\n\t\t//\n\t\tconst indirectEntityListeners = this.listenersStore.getIndirectListeners(event.entity.name)\n\t\tconst promises = indirectEntityListeners.map(listener =>\n\t\t\tthis.collectDeepChanges(event, listener, {\n\t\t\t\t[event.entity.primary]: { eq: event.id },\n\t\t\t})\n\t\t)\n\t\tawait Promise.all(promises)\n\t}\n\n\tprivate async indirectChangesRelationHandler(event: BeforeUpdateEvent) {\n\t\tawait this.indirectChangesUpdatesHandlerInner(event, 'relations')\n\t}\n\n\tprivate async indirectChangesUpdatesHandler(event: AfterUpdateEvent) {\n\t\tawait this.indirectChangesUpdatesHandlerInner(event, 'fields')\n\t}\n\tprivate async indirectChangesUpdatesHandlerInner(event: AfterUpdateEvent | BeforeUpdateEvent, type: 'fields' | 'relations') {\n\t\tconst indirectEntityListeners = this.listenersStore.getIndirectListeners(event.entity.name)\n\t\tconst promises = indirectEntityListeners.map(listener => {\n\t\t\tif (event.data.some(val => listener[type].has(val.fieldName) && (!('old' in val) || val.value !== val.old))) {\n\t\t\t\treturn this.collectDeepChanges(event, listener, {\n\t\t\t\t\t[event.entity.primary]: { eq: event.id },\n\t\t\t\t})\n\t\t\t}\n\t\t})\n\t\tawait Promise.all(promises)\n\t}\n\n\tprivate async junctionHandler(event: AfterJunctionUpdateEvent) {\n\t\tconst listeners = this.listenersStore.getJunctionListeners(event.owningEntity.name, event.owningRelation.name)\n\t\tconst promises = listeners.map(listener => {\n\t\t\tconst primary = listener.context.type === 'owning'\n\t\t\t\t? event.owningId\n\t\t\t\t: event.inverseId\n\t\t\tconst entity = listener.context.entity\n\t\t\treturn this.collectDeepChanges(event, listener, {\n\t\t\t\t[entity.primary]: { eq: primary },\n\t\t\t})\n\t\t})\n\t\tawait Promise.all(promises)\n\t}\n\n\tprivate async collectDeepChanges(\n\t\tcause: EventCause,\n\t\tlistener: IndirectListener | JunctionListener,\n\t\twhere: Input.Where,\n\t) {\n\t\tconst result = await this.changesFetcher.fetch(listener, where)\n\t\tawait Promise.all(result.map(row => {\n\t\t\treturn this.payloadManager.add({\n\t\t\t\tlistener,\n\t\t\t\tentity: listener.rootEntity,\n\t\t\t\tprimary: row.id,\n\t\t\t\tcause,\n\t\t\t\tnodes: row.nodes,\n\t\t\t})\n\t\t}))\n\t}\n}\n"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"TriggerHandler.js","sources":["../../../../../packages/engine-actions/src/triggers/TriggerHandler.ts"],"sourcesContent":["import {\n\tAfterInsertEvent,\n\tAfterJunctionUpdateEvent,\n\tAfterUpdateEvent,\n\tBeforeDeleteEvent,\n\tBeforeUpdateEvent,\n\tEventManager,\n} from '@contember/engine-content-api'\nimport { Input } from '@contember/schema'\nimport { IndirectListener, JunctionListener, TriggerListenersStore } from './TriggerListenersStore'\nimport { TriggerPayloadManager } from './TriggerPayloadManager'\nimport { TriggerIndirectChangesFetcher } from './TriggerIndirectChangesFetcher'\n\nexport type EventCause =\n\t| BeforeUpdateEvent\n\t| AfterUpdateEvent\n\t| BeforeDeleteEvent\n\t| AfterInsertEvent\n\t| AfterJunctionUpdateEvent\n\nexport class TriggerHandler {\n\tconstructor(\n\t\tprivate readonly payloadManager: TriggerPayloadManager,\n\t\tprivate readonly listenersStore: TriggerListenersStore,\n\t\tprivate readonly changesFetcher: TriggerIndirectChangesFetcher,\n\t) {\n\t}\n\n\tattach(evm: EventManager) {\n\t\tevm.listen('BeforeDeleteEvent', async event => {\n\t\t\tawait this.directDeleteHandler(event)\n\t\t\tawait this.indirectChangesEntityHandler(event)\n\t\t})\n\t\tevm.listen('AfterInsertEvent', async event => {\n\t\t\tawait this.indirectChangesEntityHandler(event)\n\t\t\tawait this.directCreateHandler(event)\n\t\t})\n\t\tevm.listen('BeforeUpdateEvent', async event => {\n\t\t\tawait this.indirectChangesRelationHandler(event)\n\t\t})\n\t\tevm.listen('AfterUpdateEvent', async event => {\n\t\t\tif (event.hasChanges) {\n\t\t\t\tawait this.indirectChangesUpdatesHandler(event)\n\t\t\t\tawait this.directUpdateHandler(event)\n\t\t\t}\n\t\t})\n\t\tevm.listen('AfterJunctionUpdateEvent', async event => {\n\t\t\tif (event.hasChanges) {\n\t\t\t\tawait this.junctionHandler(event)\n\t\t\t}\n\t\t})\n\t\tevm.listen('BeforeCommitEvent', async event => {\n\t\t\tawait this.payloadManager.persist()\n\t\t})\n\t}\n\n\tprivate async directDeleteHandler(event: BeforeDeleteEvent) {\n\t\tconst deleteListeners = this.listenersStore.getDeleteListener(event.entity.name)\n\t\tif (!deleteListeners) {\n\t\t\treturn\n\t\t}\n\t\tawait Promise.all(deleteListeners.map(listener => {\n\t\t\treturn this.payloadManager.add({\n\t\t\t\tlistener,\n\t\t\t\tentity: event.entity,\n\t\t\t\tprimary: event.id,\n\t\t\t\tcause: event,\n\t\t\t})\n\t\t}))\n\t}\n\n\tprivate async directUpdateHandler(event: AfterUpdateEvent) {\n\t\tconst updateListeners = this.listenersStore.getUpdateListeners(event.entity.name)\n\t\tawait Promise.all(updateListeners.map(listener => {\n\t\t\tif (event.data.some(it => listener.fields.has(it.fieldName) && it.value !== it.old)) {\n\t\t\t\treturn this.payloadManager.add({\n\t\t\t\t\tlistener,\n\t\t\t\t\tentity: event.entity,\n\t\t\t\t\tprimary: event.id,\n\t\t\t\t\tcause: event,\n\t\t\t\t})\n\t\t\t}\n\t\t}))\n\t}\n\n\tprivate async directCreateHandler(event: AfterInsertEvent) {\n\t\tconst createListeners = this.listenersStore.getCreateListener(event.entity.name)\n\t\tawait Promise.all(createListeners.map(listener => {\n\t\t\treturn this.payloadManager.add({\n\t\t\t\tlistener,\n\t\t\t\tentity: event.entity,\n\t\t\t\tprimary: event.id,\n\t\t\t\tcause: event,\n\t\t\t})\n\t\t}))\n\t}\n\n\t/**\n\t * Collect affected triggers after entity was created or before it was deleted.\n\t * todo: after insert, it should probably check only owning relations, because other relations are connected later, so it would be always empty\n\t */\n\tprivate async indirectChangesEntityHandler(event: BeforeDeleteEvent | AfterInsertEvent) {\n\t\t//\n\t\tconst indirectEntityListeners = this.listenersStore.getIndirectListeners(event.entity.name)\n\t\tconst promises = indirectEntityListeners.map(listener =>\n\t\t\tthis.collectDeepChanges(event, listener, {\n\t\t\t\t[event.entity.primary]: { eq: event.id },\n\t\t\t})\n\t\t)\n\t\tawait Promise.all(promises)\n\t}\n\n\tprivate async indirectChangesRelationHandler(event: BeforeUpdateEvent) {\n\t\tawait this.indirectChangesUpdatesHandlerInner(event, 'relations')\n\t}\n\n\tprivate async indirectChangesUpdatesHandler(event: AfterUpdateEvent) {\n\t\tawait this.indirectChangesUpdatesHandlerInner(event, 'fields')\n\t}\n\tprivate async indirectChangesUpdatesHandlerInner(event: AfterUpdateEvent | BeforeUpdateEvent, type: 'fields' | 'relations') {\n\t\tconst indirectEntityListeners = this.listenersStore.getIndirectListeners(event.entity.name)\n\t\tconst promises = indirectEntityListeners.map(listener => {\n\t\t\tif (event.data.some(val => listener[type].has(val.fieldName) && (!('old' in val) || val.value !== val.old))) {\n\t\t\t\treturn this.collectDeepChanges(event, listener, {\n\t\t\t\t\t[event.entity.primary]: { eq: event.id },\n\t\t\t\t})\n\t\t\t}\n\t\t})\n\t\tawait Promise.all(promises)\n\t}\n\n\tprivate async junctionHandler(event: AfterJunctionUpdateEvent) {\n\t\tconst listeners = this.listenersStore.getJunctionListeners(event.owningEntity.name, event.owningRelation.name)\n\t\tconst promises = listeners.map(listener => {\n\t\t\tconst primary = listener.context.type === 'owning'\n\t\t\t\t? event.owningId\n\t\t\t\t: event.inverseId\n\t\t\tconst entity = listener.context.entity\n\t\t\treturn this.collectDeepChanges(event, listener, {\n\t\t\t\t[entity.primary]: { eq: primary },\n\t\t\t})\n\t\t})\n\t\tawait Promise.all(promises)\n\t}\n\n\tprivate async collectDeepChanges(\n\t\tcause: EventCause,\n\t\tlistener: IndirectListener | JunctionListener,\n\t\twhere: Input.Where,\n\t) {\n\t\tconst result = await this.changesFetcher.fetch(listener, where)\n\t\tawait Promise.all(result.map(row => {\n\t\t\treturn this.payloadManager.add({\n\t\t\t\tlistener,\n\t\t\t\tentity: listener.rootEntity,\n\t\t\t\tprimary: row.id,\n\t\t\t\tcause,\n\t\t\t\tnodes: row.nodes,\n\t\t\t})\n\t\t}))\n\t}\n}\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"TriggerHandler.js","sources":["../../../../../packages/engine-actions/src/triggers/TriggerHandler.ts"],"sourcesContent":["import {\n\tAfterInsertEvent,\n\tAfterJunctionUpdateEvent,\n\tAfterUpdateEvent,\n\tBeforeDeleteEvent,\n\tBeforeUpdateEvent,\n\tEventManager,\n} from '@contember/engine-content-api'\nimport { Input } from '@contember/schema'\nimport { IndirectListener, JunctionListener, TriggerListenersStore } from './TriggerListenersStore.js'\nimport { TriggerPayloadManager } from './TriggerPayloadManager.js'\nimport { TriggerIndirectChangesFetcher } from './TriggerIndirectChangesFetcher.js'\n\nexport type EventCause =\n\t| BeforeUpdateEvent\n\t| AfterUpdateEvent\n\t| BeforeDeleteEvent\n\t| AfterInsertEvent\n\t| AfterJunctionUpdateEvent\n\nexport class TriggerHandler {\n\tconstructor(\n\t\tprivate readonly payloadManager: TriggerPayloadManager,\n\t\tprivate readonly listenersStore: TriggerListenersStore,\n\t\tprivate readonly changesFetcher: TriggerIndirectChangesFetcher,\n\t) {\n\t}\n\n\tattach(evm: EventManager) {\n\t\tevm.listen('BeforeDeleteEvent', async event => {\n\t\t\tawait this.directDeleteHandler(event)\n\t\t\tawait this.indirectChangesEntityHandler(event)\n\t\t})\n\t\tevm.listen('AfterInsertEvent', async event => {\n\t\t\tawait this.indirectChangesEntityHandler(event)\n\t\t\tawait this.directCreateHandler(event)\n\t\t})\n\t\tevm.listen('BeforeUpdateEvent', async event => {\n\t\t\tawait this.indirectChangesRelationHandler(event)\n\t\t})\n\t\tevm.listen('AfterUpdateEvent', async event => {\n\t\t\tif (event.hasChanges) {\n\t\t\t\tawait this.indirectChangesUpdatesHandler(event)\n\t\t\t\tawait this.directUpdateHandler(event)\n\t\t\t}\n\t\t})\n\t\tevm.listen('AfterJunctionUpdateEvent', async event => {\n\t\t\tif (event.hasChanges) {\n\t\t\t\tawait this.junctionHandler(event)\n\t\t\t}\n\t\t})\n\t\tevm.listen('BeforeCommitEvent', async event => {\n\t\t\tawait this.payloadManager.persist()\n\t\t})\n\t}\n\n\tprivate async directDeleteHandler(event: BeforeDeleteEvent) {\n\t\tconst deleteListeners = this.listenersStore.getDeleteListener(event.entity.name)\n\t\tif (!deleteListeners) {\n\t\t\treturn\n\t\t}\n\t\tawait Promise.all(deleteListeners.map(listener => {\n\t\t\treturn this.payloadManager.add({\n\t\t\t\tlistener,\n\t\t\t\tentity: event.entity,\n\t\t\t\tprimary: event.id,\n\t\t\t\tcause: event,\n\t\t\t})\n\t\t}))\n\t}\n\n\tprivate async directUpdateHandler(event: AfterUpdateEvent) {\n\t\tconst updateListeners = this.listenersStore.getUpdateListeners(event.entity.name)\n\t\tawait Promise.all(updateListeners.map(listener => {\n\t\t\tif (event.data.some(it => listener.fields.has(it.fieldName) && it.value !== it.old)) {\n\t\t\t\treturn this.payloadManager.add({\n\t\t\t\t\tlistener,\n\t\t\t\t\tentity: event.entity,\n\t\t\t\t\tprimary: event.id,\n\t\t\t\t\tcause: event,\n\t\t\t\t})\n\t\t\t}\n\t\t}))\n\t}\n\n\tprivate async directCreateHandler(event: AfterInsertEvent) {\n\t\tconst createListeners = this.listenersStore.getCreateListener(event.entity.name)\n\t\tawait Promise.all(createListeners.map(listener => {\n\t\t\treturn this.payloadManager.add({\n\t\t\t\tlistener,\n\t\t\t\tentity: event.entity,\n\t\t\t\tprimary: event.id,\n\t\t\t\tcause: event,\n\t\t\t})\n\t\t}))\n\t}\n\n\t/**\n\t * Collect affected triggers after entity was created or before it was deleted.\n\t * todo: after insert, it should probably check only owning relations, because other relations are connected later, so it would be always empty\n\t */\n\tprivate async indirectChangesEntityHandler(event: BeforeDeleteEvent | AfterInsertEvent) {\n\t\t//\n\t\tconst indirectEntityListeners = this.listenersStore.getIndirectListeners(event.entity.name)\n\t\tconst promises = indirectEntityListeners.map(listener =>\n\t\t\tthis.collectDeepChanges(event, listener, {\n\t\t\t\t[event.entity.primary]: { eq: event.id },\n\t\t\t})\n\t\t)\n\t\tawait Promise.all(promises)\n\t}\n\n\tprivate async indirectChangesRelationHandler(event: BeforeUpdateEvent) {\n\t\tawait this.indirectChangesUpdatesHandlerInner(event, 'relations')\n\t}\n\n\tprivate async indirectChangesUpdatesHandler(event: AfterUpdateEvent) {\n\t\tawait this.indirectChangesUpdatesHandlerInner(event, 'fields')\n\t}\n\tprivate async indirectChangesUpdatesHandlerInner(event: AfterUpdateEvent | BeforeUpdateEvent, type: 'fields' | 'relations') {\n\t\tconst indirectEntityListeners = this.listenersStore.getIndirectListeners(event.entity.name)\n\t\tconst promises = indirectEntityListeners.map(listener => {\n\t\t\tif (event.data.some(val => listener[type].has(val.fieldName) && (!('old' in val) || val.value !== val.old))) {\n\t\t\t\treturn this.collectDeepChanges(event, listener, {\n\t\t\t\t\t[event.entity.primary]: { eq: event.id },\n\t\t\t\t})\n\t\t\t}\n\t\t})\n\t\tawait Promise.all(promises)\n\t}\n\n\tprivate async junctionHandler(event: AfterJunctionUpdateEvent) {\n\t\tconst listeners = this.listenersStore.getJunctionListeners(event.owningEntity.name, event.owningRelation.name)\n\t\tconst promises = listeners.map(listener => {\n\t\t\tconst primary = listener.context.type === 'owning'\n\t\t\t\t? event.owningId\n\t\t\t\t: event.inverseId\n\t\t\tconst entity = listener.context.entity\n\t\t\treturn this.collectDeepChanges(event, listener, {\n\t\t\t\t[entity.primary]: { eq: primary },\n\t\t\t})\n\t\t})\n\t\tawait Promise.all(promises)\n\t}\n\n\tprivate async collectDeepChanges(\n\t\tcause: EventCause,\n\t\tlistener: IndirectListener | JunctionListener,\n\t\twhere: Input.Where,\n\t) {\n\t\tconst result = await this.changesFetcher.fetch(listener, where)\n\t\tawait Promise.all(result.map(row => {\n\t\t\treturn this.payloadManager.add({\n\t\t\t\tlistener,\n\t\t\t\tentity: listener.rootEntity,\n\t\t\t\tprimary: row.id,\n\t\t\t\tcause,\n\t\t\t\tnodes: row.nodes,\n\t\t\t})\n\t\t}))\n\t}\n}\n"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"TriggerIndirectChangesFetcher.cjs","sources":["../../../../../packages/engine-actions/src/triggers/TriggerIndirectChangesFetcher.ts"],"sourcesContent":["import { Mapper, PathFactory, WhereBuilder } from '@contember/engine-content-api'\nimport { IndirectListener, JunctionListener } from './TriggerListenersStore'\nimport { SelectBuilder } from '@contember/database'\nimport { ActionsPayload, Input, Model, Schema } from '@contember/schema'\nimport { JoinBuilder } from '@contember/engine-content-api'\nimport { getTargetEntity } from '@contember/schema-utils'\n\nexport type TriggerIndirectChangesFetcherResult = {\n\tid: Input.PrimaryValue\n\tnodes?: ActionsPayload.EntityEventPathNode[]\n}[]\n\nexport class TriggerIndirectChangesFetcher {\n\tconstructor(\n\t\tprivate readonly model: Model.Schema,\n\t\tprivate readonly mapper: Mapper,\n\t\tprivate readonly whereBuilder: WhereBuilder,\n\t\tprivate readonly joinBuilder: JoinBuilder,\n\t\tprivate readonly pathFactory: PathFactory,\n\t) {\n\t}\n\n\tpublic async fetch(\n\t\tlistener: IndirectListener | JunctionListener,\n\t\twhere: Input.Where,\n\t): Promise<TriggerIndirectChangesFetcherResult> {\n\t\tif (listener.trigger.withNodes) {\n\t\t\treturn this.fetchWithNodes(listener, where)\n\t\t}\n\n\t\tfor (let i = listener.path.length - 1; i >= 0; i--) {\n\t\t\twhere = { [listener.path[i]]: where }\n\t\t}\n\t\tconst qb = SelectBuilder.create<{ id: Input.PrimaryValue }>()\n\t\t\t.from(listener.rootEntity.tableName, 'root_')\n\t\t\t.select(['root_', listener.rootEntity.primaryColumn], 'id')\n\t\tconst path = this.pathFactory.create([])\n\t\tconst qbWithWhere = this.whereBuilder.build(qb, listener.rootEntity, path, where)\n\n\t\treturn (await qbWithWhere.getResult(this.mapper.db))\n\t}\n\n\tprivate async fetchWithNodes(\n\t\tlistener: IndirectListener | JunctionListener,\n\t\twhere: Input.Where,\n\t): Promise<TriggerIndirectChangesFetcherResult> {\n\t\tconst basePath = this.pathFactory.create([])\n\t\tlet path = basePath\n\t\tlet entity = listener.rootEntity\n\t\tlet qb = SelectBuilder.create()\n\t\t\t.from(entity.tableName, path.alias)\n\t\t\t.select([path.alias, entity.primaryColumn], path.for(entity.primary).alias)\n\n\t\tfor (let i = 0; i < listener.path.length; i++) {\n\t\t\tconst relationName = listener.path[i]\n\t\t\tpath = path.for(relationName)\n\t\t\tconst targetEntity = getTargetEntity(this.model, entity, relationName)\n\t\t\tif (!targetEntity) {\n\t\t\t\tthrow new Error(`Target entity for relation ${entity.name}::${relationName} not found`)\n\t\t\t}\n\t\t\tqb = this.joinBuilder.join(qb, path, entity, relationName)\n\n\t\t\tentity = targetEntity\n\t\t\tqb = qb.select([path.alias, targetEntity.primaryColumn], path.for(targetEntity.primary).alias)\n\t\t}\n\n\t\tconst qbWithWhere = this.whereBuilder.build(qb, entity, path, where)\n\n\t\tconst result = await qbWithWhere.getResult(this.mapper.db)\n\n\t\treturn result.map(row => {\n\t\t\tconst nodes: ActionsPayload.EntityEventPathNode[] = []\n\t\t\tlet entity = listener.rootEntity\n\t\t\tlet path = basePath\n\t\t\tconst id = row[path.for(entity.primary).alias]\n\t\t\tfor (let i = 0; i < listener.path.length; i++) {\n\t\t\t\tconst relationName = listener.path[i]\n\t\t\t\tconst targetEntity = getTargetEntity(this.model, entity, relationName)\n\t\t\t\tif (!targetEntity) {\n\t\t\t\t\tthrow new Error(`Target entity for relation ${entity.name}::${relationName} not found`)\n\t\t\t\t}\n\t\t\t\tpath = path.for(relationName)\n\t\t\t\tnodes.push({ relation: relationName, entity: targetEntity.name, id: row[path.for(targetEntity.primary).alias] })\n\t\t\t\tentity = targetEntity\n\t\t\t}\n\t\t\treturn { id, nodes }\n\t\t})\n\t}\n}\n"],"names":["SelectBuilder","getTargetEntity","entity","path"],"mappings":";;;;AAYO,MAAM,8BAA8B;AAAA,EAC1C,YACkB,OACA,QACA,cACA,aACA,aAChB;AALgB,SAAA,QAAA;AACA,SAAA,SAAA;AACA,SAAA,eAAA;AACA,SAAA,cAAA;AACA,SAAA,cAAA;AAAA,EAElB;AAAA,EAEA,MAAa,MACZ,UACA,OAC+C;AAC/C,QAAI,SAAS,QAAQ,WAAW;AAC/B,aAAO,KAAK,eAAe,UAAU,KAAK;AAAA,IAC3C;AAEA,aAAS,IAAI,SAAS,KAAK,SAAS,GAAG,KAAK,GAAG,KAAK;AACnD,cAAQ,EAAE,CAAC,SAAS,KAAK,CAAC,CAAC,GAAG,MAAA;AAAA,IAC/B;AACA,UAAM,KAAKA,SAAAA,cAAc,OAAA,EACvB,KAAK,SAAS,WAAW,WAAW,OAAO,EAC3C,OAAO,CAAC,SAAS,SAAS,WAAW,aAAa,GAAG,IAAI;AAC3D,UAAM,OAAO,KAAK,YAAY,OAAO,CAAA,CAAE;AACvC,UAAM,cAAc,KAAK,aAAa,MAAM,IAAI,SAAS,YAAY,MAAM,KAAK;AAEhF,WAAQ,MAAM,YAAY,UAAU,KAAK,OAAO,EAAE;AAAA,EACnD;AAAA,EAEA,MAAc,eACb,UACA,OAC+C;AAC/C,UAAM,WAAW,KAAK,YAAY,OAAO,CAAA,CAAE;AAC3C,QAAI,OAAO;AACX,QAAI,SAAS,SAAS;AACtB,QAAI,KAAKA,uBAAc,SACrB,KAAK,OAAO,WAAW,KAAK,KAAK,EACjC,OAAO,CAAC,KAAK,OAAO,OAAO,aAAa,GAAG,KAAK,IAAI,OAAO,OAAO,EAAE,KAAK;AAE3E,aAAS,IAAI,GAAG,IAAI,SAAS,KAAK,QAAQ,KAAK;AAC9C,YAAM,eAAe,SAAS,KAAK,CAAC;AACpC,aAAO,KAAK,IAAI,YAAY;AAC5B,YAAM,eAAeC,YAAAA,gBAAgB,KAAK,OAAO,QAAQ,YAAY;AACrE,UAAI,CAAC,cAAc;AAClB,cAAM,IAAI,MAAM,8BAA8B,OAAO,IAAI,KAAK,YAAY,YAAY;AAAA,MACvF;AACA,WAAK,KAAK,YAAY,KAAK,IAAI,MAAM,QAAQ,YAAY;AAEzD,eAAS;AACT,WAAK,GAAG,OAAO,CAAC,KAAK,OAAO,aAAa,aAAa,GAAG,KAAK,IAAI,aAAa,OAAO,EAAE,KAAK;AAAA,IAC9F;AAEA,UAAM,cAAc,KAAK,aAAa,MAAM,IAAI,QAAQ,MAAM,KAAK;AAEnE,UAAM,SAAS,MAAM,YAAY,UAAU,KAAK,OAAO,EAAE;AAEzD,WAAO,OAAO,IAAI,CAAA,QAAO;AACxB,YAAM,QAA8C,CAAA;AACpD,UAAIC,UAAS,SAAS;AACtB,UAAIC,QAAO;AACX,YAAM,KAAK,IAAIA,MAAK,IAAID,QAAO,OAAO,EAAE,KAAK;AAC7C,eAAS,IAAI,GAAG,IAAI,SAAS,KAAK,QAAQ,KAAK;AAC9C,cAAM,eAAe,SAAS,KAAK,CAAC;AACpC,cAAM,eAAeD,YAAAA,gBAAgB,KAAK,OAAOC,SAAQ,YAAY;AACrE,YAAI,CAAC,cAAc;AAClB,gBAAM,IAAI,MAAM,8BAA8BA,QAAO,IAAI,KAAK,YAAY,YAAY;AAAA,QACvF;AACAC,gBAAOA,MAAK,IAAI,YAAY;AAC5B,cAAM,KAAK,EAAE,UAAU,cAAc,QAAQ,aAAa,MAAM,IAAI,IAAIA,MAAK,IAAI,aAAa,OAAO,EAAE,KAAK,GAAG;AAC/GD,kBAAS;AAAA,MACV;AACA,aAAO,EAAE,IAAI,MAAA;AAAA,IACd,CAAC;AAAA,EACF;AACD;;"}
1
+ {"version":3,"file":"TriggerIndirectChangesFetcher.cjs","sources":["../../../../../packages/engine-actions/src/triggers/TriggerIndirectChangesFetcher.ts"],"sourcesContent":["import { Mapper, PathFactory, WhereBuilder } from '@contember/engine-content-api'\nimport { IndirectListener, JunctionListener } from './TriggerListenersStore.js'\nimport { SelectBuilder } from '@contember/database'\nimport { ActionsPayload, Input, Model, Schema } from '@contember/schema'\nimport { JoinBuilder } from '@contember/engine-content-api'\nimport { getTargetEntity } from '@contember/schema-utils'\n\nexport type TriggerIndirectChangesFetcherResult = {\n\tid: Input.PrimaryValue\n\tnodes?: ActionsPayload.EntityEventPathNode[]\n}[]\n\nexport class TriggerIndirectChangesFetcher {\n\tconstructor(\n\t\tprivate readonly model: Model.Schema,\n\t\tprivate readonly mapper: Mapper,\n\t\tprivate readonly whereBuilder: WhereBuilder,\n\t\tprivate readonly joinBuilder: JoinBuilder,\n\t\tprivate readonly pathFactory: PathFactory,\n\t) {\n\t}\n\n\tpublic async fetch(\n\t\tlistener: IndirectListener | JunctionListener,\n\t\twhere: Input.Where,\n\t): Promise<TriggerIndirectChangesFetcherResult> {\n\t\tif (listener.trigger.withNodes) {\n\t\t\treturn this.fetchWithNodes(listener, where)\n\t\t}\n\n\t\tfor (let i = listener.path.length - 1; i >= 0; i--) {\n\t\t\twhere = { [listener.path[i]]: where }\n\t\t}\n\t\tconst qb = SelectBuilder.create<{ id: Input.PrimaryValue }>()\n\t\t\t.from(listener.rootEntity.tableName, 'root_')\n\t\t\t.select(['root_', listener.rootEntity.primaryColumn], 'id')\n\t\tconst path = this.pathFactory.create([])\n\t\tconst qbWithWhere = this.whereBuilder.build(qb, listener.rootEntity, path, where)\n\n\t\treturn (await qbWithWhere.getResult(this.mapper.db))\n\t}\n\n\tprivate async fetchWithNodes(\n\t\tlistener: IndirectListener | JunctionListener,\n\t\twhere: Input.Where,\n\t): Promise<TriggerIndirectChangesFetcherResult> {\n\t\tconst basePath = this.pathFactory.create([])\n\t\tlet path = basePath\n\t\tlet entity = listener.rootEntity\n\t\tlet qb = SelectBuilder.create()\n\t\t\t.from(entity.tableName, path.alias)\n\t\t\t.select([path.alias, entity.primaryColumn], path.for(entity.primary).alias)\n\n\t\tfor (let i = 0; i < listener.path.length; i++) {\n\t\t\tconst relationName = listener.path[i]\n\t\t\tpath = path.for(relationName)\n\t\t\tconst targetEntity = getTargetEntity(this.model, entity, relationName)\n\t\t\tif (!targetEntity) {\n\t\t\t\tthrow new Error(`Target entity for relation ${entity.name}::${relationName} not found`)\n\t\t\t}\n\t\t\tqb = this.joinBuilder.join(qb, path, entity, relationName)\n\n\t\t\tentity = targetEntity\n\t\t\tqb = qb.select([path.alias, targetEntity.primaryColumn], path.for(targetEntity.primary).alias)\n\t\t}\n\n\t\tconst qbWithWhere = this.whereBuilder.build(qb, entity, path, where)\n\n\t\tconst result = await qbWithWhere.getResult(this.mapper.db)\n\n\t\treturn result.map(row => {\n\t\t\tconst nodes: ActionsPayload.EntityEventPathNode[] = []\n\t\t\tlet entity = listener.rootEntity\n\t\t\tlet path = basePath\n\t\t\tconst id = row[path.for(entity.primary).alias]\n\t\t\tfor (let i = 0; i < listener.path.length; i++) {\n\t\t\t\tconst relationName = listener.path[i]\n\t\t\t\tconst targetEntity = getTargetEntity(this.model, entity, relationName)\n\t\t\t\tif (!targetEntity) {\n\t\t\t\t\tthrow new Error(`Target entity for relation ${entity.name}::${relationName} not found`)\n\t\t\t\t}\n\t\t\t\tpath = path.for(relationName)\n\t\t\t\tnodes.push({ relation: relationName, entity: targetEntity.name, id: row[path.for(targetEntity.primary).alias] })\n\t\t\t\tentity = targetEntity\n\t\t\t}\n\t\t\treturn { id, nodes }\n\t\t})\n\t}\n}\n"],"names":["SelectBuilder","getTargetEntity","entity","path"],"mappings":";;;;AAYO,MAAM,8BAA8B;AAAA,EAC1C,YACkB,OACA,QACA,cACA,aACA,aAChB;AALgB,SAAA,QAAA;AACA,SAAA,SAAA;AACA,SAAA,eAAA;AACA,SAAA,cAAA;AACA,SAAA,cAAA;AAAA,EAElB;AAAA,EAEA,MAAa,MACZ,UACA,OAC+C;AAC/C,QAAI,SAAS,QAAQ,WAAW;AAC/B,aAAO,KAAK,eAAe,UAAU,KAAK;AAAA,IAC3C;AAEA,aAAS,IAAI,SAAS,KAAK,SAAS,GAAG,KAAK,GAAG,KAAK;AACnD,cAAQ,EAAE,CAAC,SAAS,KAAK,CAAC,CAAC,GAAG,MAAA;AAAA,IAC/B;AACA,UAAM,KAAKA,SAAAA,cAAc,OAAA,EACvB,KAAK,SAAS,WAAW,WAAW,OAAO,EAC3C,OAAO,CAAC,SAAS,SAAS,WAAW,aAAa,GAAG,IAAI;AAC3D,UAAM,OAAO,KAAK,YAAY,OAAO,CAAA,CAAE;AACvC,UAAM,cAAc,KAAK,aAAa,MAAM,IAAI,SAAS,YAAY,MAAM,KAAK;AAEhF,WAAQ,MAAM,YAAY,UAAU,KAAK,OAAO,EAAE;AAAA,EACnD;AAAA,EAEA,MAAc,eACb,UACA,OAC+C;AAC/C,UAAM,WAAW,KAAK,YAAY,OAAO,CAAA,CAAE;AAC3C,QAAI,OAAO;AACX,QAAI,SAAS,SAAS;AACtB,QAAI,KAAKA,uBAAc,SACrB,KAAK,OAAO,WAAW,KAAK,KAAK,EACjC,OAAO,CAAC,KAAK,OAAO,OAAO,aAAa,GAAG,KAAK,IAAI,OAAO,OAAO,EAAE,KAAK;AAE3E,aAAS,IAAI,GAAG,IAAI,SAAS,KAAK,QAAQ,KAAK;AAC9C,YAAM,eAAe,SAAS,KAAK,CAAC;AACpC,aAAO,KAAK,IAAI,YAAY;AAC5B,YAAM,eAAeC,YAAAA,gBAAgB,KAAK,OAAO,QAAQ,YAAY;AACrE,UAAI,CAAC,cAAc;AAClB,cAAM,IAAI,MAAM,8BAA8B,OAAO,IAAI,KAAK,YAAY,YAAY;AAAA,MACvF;AACA,WAAK,KAAK,YAAY,KAAK,IAAI,MAAM,QAAQ,YAAY;AAEzD,eAAS;AACT,WAAK,GAAG,OAAO,CAAC,KAAK,OAAO,aAAa,aAAa,GAAG,KAAK,IAAI,aAAa,OAAO,EAAE,KAAK;AAAA,IAC9F;AAEA,UAAM,cAAc,KAAK,aAAa,MAAM,IAAI,QAAQ,MAAM,KAAK;AAEnE,UAAM,SAAS,MAAM,YAAY,UAAU,KAAK,OAAO,EAAE;AAEzD,WAAO,OAAO,IAAI,CAAA,QAAO;AACxB,YAAM,QAA8C,CAAA;AACpD,UAAIC,UAAS,SAAS;AACtB,UAAIC,QAAO;AACX,YAAM,KAAK,IAAIA,MAAK,IAAID,QAAO,OAAO,EAAE,KAAK;AAC7C,eAAS,IAAI,GAAG,IAAI,SAAS,KAAK,QAAQ,KAAK;AAC9C,cAAM,eAAe,SAAS,KAAK,CAAC;AACpC,cAAM,eAAeD,YAAAA,gBAAgB,KAAK,OAAOC,SAAQ,YAAY;AACrE,YAAI,CAAC,cAAc;AAClB,gBAAM,IAAI,MAAM,8BAA8BA,QAAO,IAAI,KAAK,YAAY,YAAY;AAAA,QACvF;AACAC,gBAAOA,MAAK,IAAI,YAAY;AAC5B,cAAM,KAAK,EAAE,UAAU,cAAc,QAAQ,aAAa,MAAM,IAAI,IAAIA,MAAK,IAAI,aAAa,OAAO,EAAE,KAAK,GAAG;AAC/GD,kBAAS;AAAA,MACV;AACA,aAAO,EAAE,IAAI,MAAA;AAAA,IACd,CAAC;AAAA,EACF;AACD;;"}
@@ -1 +1 @@
1
- {"version":3,"file":"TriggerIndirectChangesFetcher.js","sources":["../../../../../packages/engine-actions/src/triggers/TriggerIndirectChangesFetcher.ts"],"sourcesContent":["import { Mapper, PathFactory, WhereBuilder } from '@contember/engine-content-api'\nimport { IndirectListener, JunctionListener } from './TriggerListenersStore'\nimport { SelectBuilder } from '@contember/database'\nimport { ActionsPayload, Input, Model, Schema } from '@contember/schema'\nimport { JoinBuilder } from '@contember/engine-content-api'\nimport { getTargetEntity } from '@contember/schema-utils'\n\nexport type TriggerIndirectChangesFetcherResult = {\n\tid: Input.PrimaryValue\n\tnodes?: ActionsPayload.EntityEventPathNode[]\n}[]\n\nexport class TriggerIndirectChangesFetcher {\n\tconstructor(\n\t\tprivate readonly model: Model.Schema,\n\t\tprivate readonly mapper: Mapper,\n\t\tprivate readonly whereBuilder: WhereBuilder,\n\t\tprivate readonly joinBuilder: JoinBuilder,\n\t\tprivate readonly pathFactory: PathFactory,\n\t) {\n\t}\n\n\tpublic async fetch(\n\t\tlistener: IndirectListener | JunctionListener,\n\t\twhere: Input.Where,\n\t): Promise<TriggerIndirectChangesFetcherResult> {\n\t\tif (listener.trigger.withNodes) {\n\t\t\treturn this.fetchWithNodes(listener, where)\n\t\t}\n\n\t\tfor (let i = listener.path.length - 1; i >= 0; i--) {\n\t\t\twhere = { [listener.path[i]]: where }\n\t\t}\n\t\tconst qb = SelectBuilder.create<{ id: Input.PrimaryValue }>()\n\t\t\t.from(listener.rootEntity.tableName, 'root_')\n\t\t\t.select(['root_', listener.rootEntity.primaryColumn], 'id')\n\t\tconst path = this.pathFactory.create([])\n\t\tconst qbWithWhere = this.whereBuilder.build(qb, listener.rootEntity, path, where)\n\n\t\treturn (await qbWithWhere.getResult(this.mapper.db))\n\t}\n\n\tprivate async fetchWithNodes(\n\t\tlistener: IndirectListener | JunctionListener,\n\t\twhere: Input.Where,\n\t): Promise<TriggerIndirectChangesFetcherResult> {\n\t\tconst basePath = this.pathFactory.create([])\n\t\tlet path = basePath\n\t\tlet entity = listener.rootEntity\n\t\tlet qb = SelectBuilder.create()\n\t\t\t.from(entity.tableName, path.alias)\n\t\t\t.select([path.alias, entity.primaryColumn], path.for(entity.primary).alias)\n\n\t\tfor (let i = 0; i < listener.path.length; i++) {\n\t\t\tconst relationName = listener.path[i]\n\t\t\tpath = path.for(relationName)\n\t\t\tconst targetEntity = getTargetEntity(this.model, entity, relationName)\n\t\t\tif (!targetEntity) {\n\t\t\t\tthrow new Error(`Target entity for relation ${entity.name}::${relationName} not found`)\n\t\t\t}\n\t\t\tqb = this.joinBuilder.join(qb, path, entity, relationName)\n\n\t\t\tentity = targetEntity\n\t\t\tqb = qb.select([path.alias, targetEntity.primaryColumn], path.for(targetEntity.primary).alias)\n\t\t}\n\n\t\tconst qbWithWhere = this.whereBuilder.build(qb, entity, path, where)\n\n\t\tconst result = await qbWithWhere.getResult(this.mapper.db)\n\n\t\treturn result.map(row => {\n\t\t\tconst nodes: ActionsPayload.EntityEventPathNode[] = []\n\t\t\tlet entity = listener.rootEntity\n\t\t\tlet path = basePath\n\t\t\tconst id = row[path.for(entity.primary).alias]\n\t\t\tfor (let i = 0; i < listener.path.length; i++) {\n\t\t\t\tconst relationName = listener.path[i]\n\t\t\t\tconst targetEntity = getTargetEntity(this.model, entity, relationName)\n\t\t\t\tif (!targetEntity) {\n\t\t\t\t\tthrow new Error(`Target entity for relation ${entity.name}::${relationName} not found`)\n\t\t\t\t}\n\t\t\t\tpath = path.for(relationName)\n\t\t\t\tnodes.push({ relation: relationName, entity: targetEntity.name, id: row[path.for(targetEntity.primary).alias] })\n\t\t\t\tentity = targetEntity\n\t\t\t}\n\t\t\treturn { id, nodes }\n\t\t})\n\t}\n}\n"],"names":["entity","path"],"mappings":";;AAYO,MAAM,8BAA8B;AAAA,EAC1C,YACkB,OACA,QACA,cACA,aACA,aAChB;AALgB,SAAA,QAAA;AACA,SAAA,SAAA;AACA,SAAA,eAAA;AACA,SAAA,cAAA;AACA,SAAA,cAAA;AAAA,EAElB;AAAA,EAEA,MAAa,MACZ,UACA,OAC+C;AAC/C,QAAI,SAAS,QAAQ,WAAW;AAC/B,aAAO,KAAK,eAAe,UAAU,KAAK;AAAA,IAC3C;AAEA,aAAS,IAAI,SAAS,KAAK,SAAS,GAAG,KAAK,GAAG,KAAK;AACnD,cAAQ,EAAE,CAAC,SAAS,KAAK,CAAC,CAAC,GAAG,MAAA;AAAA,IAC/B;AACA,UAAM,KAAK,cAAc,OAAA,EACvB,KAAK,SAAS,WAAW,WAAW,OAAO,EAC3C,OAAO,CAAC,SAAS,SAAS,WAAW,aAAa,GAAG,IAAI;AAC3D,UAAM,OAAO,KAAK,YAAY,OAAO,CAAA,CAAE;AACvC,UAAM,cAAc,KAAK,aAAa,MAAM,IAAI,SAAS,YAAY,MAAM,KAAK;AAEhF,WAAQ,MAAM,YAAY,UAAU,KAAK,OAAO,EAAE;AAAA,EACnD;AAAA,EAEA,MAAc,eACb,UACA,OAC+C;AAC/C,UAAM,WAAW,KAAK,YAAY,OAAO,CAAA,CAAE;AAC3C,QAAI,OAAO;AACX,QAAI,SAAS,SAAS;AACtB,QAAI,KAAK,cAAc,SACrB,KAAK,OAAO,WAAW,KAAK,KAAK,EACjC,OAAO,CAAC,KAAK,OAAO,OAAO,aAAa,GAAG,KAAK,IAAI,OAAO,OAAO,EAAE,KAAK;AAE3E,aAAS,IAAI,GAAG,IAAI,SAAS,KAAK,QAAQ,KAAK;AAC9C,YAAM,eAAe,SAAS,KAAK,CAAC;AACpC,aAAO,KAAK,IAAI,YAAY;AAC5B,YAAM,eAAe,gBAAgB,KAAK,OAAO,QAAQ,YAAY;AACrE,UAAI,CAAC,cAAc;AAClB,cAAM,IAAI,MAAM,8BAA8B,OAAO,IAAI,KAAK,YAAY,YAAY;AAAA,MACvF;AACA,WAAK,KAAK,YAAY,KAAK,IAAI,MAAM,QAAQ,YAAY;AAEzD,eAAS;AACT,WAAK,GAAG,OAAO,CAAC,KAAK,OAAO,aAAa,aAAa,GAAG,KAAK,IAAI,aAAa,OAAO,EAAE,KAAK;AAAA,IAC9F;AAEA,UAAM,cAAc,KAAK,aAAa,MAAM,IAAI,QAAQ,MAAM,KAAK;AAEnE,UAAM,SAAS,MAAM,YAAY,UAAU,KAAK,OAAO,EAAE;AAEzD,WAAO,OAAO,IAAI,CAAA,QAAO;AACxB,YAAM,QAA8C,CAAA;AACpD,UAAIA,UAAS,SAAS;AACtB,UAAIC,QAAO;AACX,YAAM,KAAK,IAAIA,MAAK,IAAID,QAAO,OAAO,EAAE,KAAK;AAC7C,eAAS,IAAI,GAAG,IAAI,SAAS,KAAK,QAAQ,KAAK;AAC9C,cAAM,eAAe,SAAS,KAAK,CAAC;AACpC,cAAM,eAAe,gBAAgB,KAAK,OAAOA,SAAQ,YAAY;AACrE,YAAI,CAAC,cAAc;AAClB,gBAAM,IAAI,MAAM,8BAA8BA,QAAO,IAAI,KAAK,YAAY,YAAY;AAAA,QACvF;AACAC,gBAAOA,MAAK,IAAI,YAAY;AAC5B,cAAM,KAAK,EAAE,UAAU,cAAc,QAAQ,aAAa,MAAM,IAAI,IAAIA,MAAK,IAAI,aAAa,OAAO,EAAE,KAAK,GAAG;AAC/GD,kBAAS;AAAA,MACV;AACA,aAAO,EAAE,IAAI,MAAA;AAAA,IACd,CAAC;AAAA,EACF;AACD;"}
1
+ {"version":3,"file":"TriggerIndirectChangesFetcher.js","sources":["../../../../../packages/engine-actions/src/triggers/TriggerIndirectChangesFetcher.ts"],"sourcesContent":["import { Mapper, PathFactory, WhereBuilder } from '@contember/engine-content-api'\nimport { IndirectListener, JunctionListener } from './TriggerListenersStore.js'\nimport { SelectBuilder } from '@contember/database'\nimport { ActionsPayload, Input, Model, Schema } from '@contember/schema'\nimport { JoinBuilder } from '@contember/engine-content-api'\nimport { getTargetEntity } from '@contember/schema-utils'\n\nexport type TriggerIndirectChangesFetcherResult = {\n\tid: Input.PrimaryValue\n\tnodes?: ActionsPayload.EntityEventPathNode[]\n}[]\n\nexport class TriggerIndirectChangesFetcher {\n\tconstructor(\n\t\tprivate readonly model: Model.Schema,\n\t\tprivate readonly mapper: Mapper,\n\t\tprivate readonly whereBuilder: WhereBuilder,\n\t\tprivate readonly joinBuilder: JoinBuilder,\n\t\tprivate readonly pathFactory: PathFactory,\n\t) {\n\t}\n\n\tpublic async fetch(\n\t\tlistener: IndirectListener | JunctionListener,\n\t\twhere: Input.Where,\n\t): Promise<TriggerIndirectChangesFetcherResult> {\n\t\tif (listener.trigger.withNodes) {\n\t\t\treturn this.fetchWithNodes(listener, where)\n\t\t}\n\n\t\tfor (let i = listener.path.length - 1; i >= 0; i--) {\n\t\t\twhere = { [listener.path[i]]: where }\n\t\t}\n\t\tconst qb = SelectBuilder.create<{ id: Input.PrimaryValue }>()\n\t\t\t.from(listener.rootEntity.tableName, 'root_')\n\t\t\t.select(['root_', listener.rootEntity.primaryColumn], 'id')\n\t\tconst path = this.pathFactory.create([])\n\t\tconst qbWithWhere = this.whereBuilder.build(qb, listener.rootEntity, path, where)\n\n\t\treturn (await qbWithWhere.getResult(this.mapper.db))\n\t}\n\n\tprivate async fetchWithNodes(\n\t\tlistener: IndirectListener | JunctionListener,\n\t\twhere: Input.Where,\n\t): Promise<TriggerIndirectChangesFetcherResult> {\n\t\tconst basePath = this.pathFactory.create([])\n\t\tlet path = basePath\n\t\tlet entity = listener.rootEntity\n\t\tlet qb = SelectBuilder.create()\n\t\t\t.from(entity.tableName, path.alias)\n\t\t\t.select([path.alias, entity.primaryColumn], path.for(entity.primary).alias)\n\n\t\tfor (let i = 0; i < listener.path.length; i++) {\n\t\t\tconst relationName = listener.path[i]\n\t\t\tpath = path.for(relationName)\n\t\t\tconst targetEntity = getTargetEntity(this.model, entity, relationName)\n\t\t\tif (!targetEntity) {\n\t\t\t\tthrow new Error(`Target entity for relation ${entity.name}::${relationName} not found`)\n\t\t\t}\n\t\t\tqb = this.joinBuilder.join(qb, path, entity, relationName)\n\n\t\t\tentity = targetEntity\n\t\t\tqb = qb.select([path.alias, targetEntity.primaryColumn], path.for(targetEntity.primary).alias)\n\t\t}\n\n\t\tconst qbWithWhere = this.whereBuilder.build(qb, entity, path, where)\n\n\t\tconst result = await qbWithWhere.getResult(this.mapper.db)\n\n\t\treturn result.map(row => {\n\t\t\tconst nodes: ActionsPayload.EntityEventPathNode[] = []\n\t\t\tlet entity = listener.rootEntity\n\t\t\tlet path = basePath\n\t\t\tconst id = row[path.for(entity.primary).alias]\n\t\t\tfor (let i = 0; i < listener.path.length; i++) {\n\t\t\t\tconst relationName = listener.path[i]\n\t\t\t\tconst targetEntity = getTargetEntity(this.model, entity, relationName)\n\t\t\t\tif (!targetEntity) {\n\t\t\t\t\tthrow new Error(`Target entity for relation ${entity.name}::${relationName} not found`)\n\t\t\t\t}\n\t\t\t\tpath = path.for(relationName)\n\t\t\t\tnodes.push({ relation: relationName, entity: targetEntity.name, id: row[path.for(targetEntity.primary).alias] })\n\t\t\t\tentity = targetEntity\n\t\t\t}\n\t\t\treturn { id, nodes }\n\t\t})\n\t}\n}\n"],"names":["entity","path"],"mappings":";;AAYO,MAAM,8BAA8B;AAAA,EAC1C,YACkB,OACA,QACA,cACA,aACA,aAChB;AALgB,SAAA,QAAA;AACA,SAAA,SAAA;AACA,SAAA,eAAA;AACA,SAAA,cAAA;AACA,SAAA,cAAA;AAAA,EAElB;AAAA,EAEA,MAAa,MACZ,UACA,OAC+C;AAC/C,QAAI,SAAS,QAAQ,WAAW;AAC/B,aAAO,KAAK,eAAe,UAAU,KAAK;AAAA,IAC3C;AAEA,aAAS,IAAI,SAAS,KAAK,SAAS,GAAG,KAAK,GAAG,KAAK;AACnD,cAAQ,EAAE,CAAC,SAAS,KAAK,CAAC,CAAC,GAAG,MAAA;AAAA,IAC/B;AACA,UAAM,KAAK,cAAc,OAAA,EACvB,KAAK,SAAS,WAAW,WAAW,OAAO,EAC3C,OAAO,CAAC,SAAS,SAAS,WAAW,aAAa,GAAG,IAAI;AAC3D,UAAM,OAAO,KAAK,YAAY,OAAO,CAAA,CAAE;AACvC,UAAM,cAAc,KAAK,aAAa,MAAM,IAAI,SAAS,YAAY,MAAM,KAAK;AAEhF,WAAQ,MAAM,YAAY,UAAU,KAAK,OAAO,EAAE;AAAA,EACnD;AAAA,EAEA,MAAc,eACb,UACA,OAC+C;AAC/C,UAAM,WAAW,KAAK,YAAY,OAAO,CAAA,CAAE;AAC3C,QAAI,OAAO;AACX,QAAI,SAAS,SAAS;AACtB,QAAI,KAAK,cAAc,SACrB,KAAK,OAAO,WAAW,KAAK,KAAK,EACjC,OAAO,CAAC,KAAK,OAAO,OAAO,aAAa,GAAG,KAAK,IAAI,OAAO,OAAO,EAAE,KAAK;AAE3E,aAAS,IAAI,GAAG,IAAI,SAAS,KAAK,QAAQ,KAAK;AAC9C,YAAM,eAAe,SAAS,KAAK,CAAC;AACpC,aAAO,KAAK,IAAI,YAAY;AAC5B,YAAM,eAAe,gBAAgB,KAAK,OAAO,QAAQ,YAAY;AACrE,UAAI,CAAC,cAAc;AAClB,cAAM,IAAI,MAAM,8BAA8B,OAAO,IAAI,KAAK,YAAY,YAAY;AAAA,MACvF;AACA,WAAK,KAAK,YAAY,KAAK,IAAI,MAAM,QAAQ,YAAY;AAEzD,eAAS;AACT,WAAK,GAAG,OAAO,CAAC,KAAK,OAAO,aAAa,aAAa,GAAG,KAAK,IAAI,aAAa,OAAO,EAAE,KAAK;AAAA,IAC9F;AAEA,UAAM,cAAc,KAAK,aAAa,MAAM,IAAI,QAAQ,MAAM,KAAK;AAEnE,UAAM,SAAS,MAAM,YAAY,UAAU,KAAK,OAAO,EAAE;AAEzD,WAAO,OAAO,IAAI,CAAA,QAAO;AACxB,YAAM,QAA8C,CAAA;AACpD,UAAIA,UAAS,SAAS;AACtB,UAAIC,QAAO;AACX,YAAM,KAAK,IAAIA,MAAK,IAAID,QAAO,OAAO,EAAE,KAAK;AAC7C,eAAS,IAAI,GAAG,IAAI,SAAS,KAAK,QAAQ,KAAK;AAC9C,cAAM,eAAe,SAAS,KAAK,CAAC;AACpC,cAAM,eAAe,gBAAgB,KAAK,OAAOA,SAAQ,YAAY;AACrE,YAAI,CAAC,cAAc;AAClB,gBAAM,IAAI,MAAM,8BAA8BA,QAAO,IAAI,KAAK,YAAY,YAAY;AAAA,QACvF;AACAC,gBAAOA,MAAK,IAAI,YAAY;AAC5B,cAAM,KAAK,EAAE,UAAU,cAAc,QAAQ,aAAa,MAAM,IAAI,IAAIA,MAAK,IAAI,aAAa,OAAO,EAAE,KAAK,GAAG;AAC/GD,kBAAS;AAAA,MACV;AACA,aAAO,EAAE,IAAI,MAAA;AAAA,IACd,CAAC;AAAA,EACF;AACD;"}
@@ -1 +1 @@
1
- {"version":3,"file":"TriggerListenersBuilder.cjs","sources":["../../../../../packages/engine-actions/src/triggers/TriggerListenersBuilder.ts"],"sourcesContent":["import { Actions, Model } from '@contember/schema'\nimport { TriggerListeners } from './TriggerListeners'\nimport { JunctionListener, TriggerListenersStore } from './TriggerListenersStore'\nimport { acceptFieldVisitor, getEntity } from '@contember/schema-utils'\nimport { mapGetOrPut } from '../utils/map'\nimport { ImplementationException } from '../ImplementationException'\n\nexport class TriggerListenerBuilder {\n\tprivate readonly data: TriggerListeners = {\n\t\tcreateListeners: new Map(),\n\t\tupdateListeners: new Map(),\n\t\tdeleteListeners: new Map(),\n\t\tindirectListeners: new Map(),\n\t\tjunctionListeners: new Map(),\n\t}\n\n\tconstructor(\n\t\tprivate readonly model: Model.Schema,\n\t) {\n\t}\n\n\tpublic add(trigger: Actions.AnyTrigger) {\n\t\tif (trigger.type === 'basic') {\n\t\t\tthis.processBasicTrigger(trigger)\n\t\t} else if (trigger.type === 'watch') {\n\t\t\tthis.processIndirectListeners(trigger)\n\t\t} else {\n\t\t\t;((_: never) => {\n\t\t\t\tthrow new ImplementationException(`Unhandled trigger ${(trigger as any).type}`)\n\t\t\t})(trigger)\n\t\t}\n\t}\n\n\tprivate processBasicTrigger(trigger: Actions.BasicTrigger) {\n\t\tconst entity = getEntity(this.model, trigger.entity)\n\t\tif (trigger.create) {\n\t\t\tthis.addListener('createListeners', trigger.entity, {\n\t\t\t\ttype: 'create',\n\t\t\t\tentity,\n\t\t\t\ttrigger,\n\t\t\t})\n\t\t}\n\t\tif (trigger.delete) {\n\t\t\tthis.addListener('deleteListeners', trigger.entity, {\n\t\t\t\ttype: 'delete',\n\t\t\t\tentity,\n\t\t\t\ttrigger,\n\t\t\t})\n\t\t}\n\t\tif (trigger.update) {\n\t\t\tthis.addListener('updateListeners', trigger.entity, {\n\t\t\t\ttype: 'update',\n\t\t\t\tentity,\n\t\t\t\ttrigger,\n\t\t\t\tfields: new Set(trigger.update === true ? Object.keys(entity.fields) : trigger.update), // todo: only columns and owning\n\t\t\t})\n\t\t}\n\t}\n\n\tprivate processIndirectListeners(\n\t\ttrigger: Actions.WatchTrigger,\n\t) {\n\t\tconst entity = getEntity(this.model, trigger.entity)\n\t\tthis.addListener('createListeners', trigger.entity, {\n\t\t\ttype: 'create',\n\t\t\tentity,\n\t\t\ttrigger,\n\t\t})\n\t\tthis.addListener('deleteListeners', trigger.entity, {\n\t\t\ttype: 'delete',\n\t\t\tentity,\n\t\t\ttrigger,\n\t\t})\n\t\tthis.processIndirectListenersNode(trigger, entity, entity, trigger.watch, [])\n\t}\n\tprivate processIndirectListenersNode(\n\t\ttrigger: Actions.WatchTrigger,\n\t\trootEntity: Model.Entity,\n\t\tentity: Model.Entity,\n\t\tnode: Actions.SelectionNode,\n\t\tpath: string[],\n\t) {\n\t\tconst fields = new Set<string>()\n\t\tconst relations = new Set<string>()\n\t\tfor (const entry of node) {\n\t\t\tconst [field, args, selection] = Array.isArray(entry) ? entry : [entry, undefined, undefined]\n\t\t\tacceptFieldVisitor(this.model, entity, field, {\n\t\t\t\tvisitColumn: ({ entity, column }) => {\n\t\t\t\t\tif (selection?.length > 0) {\n\t\t\t\t\t\tthrow new ImplementationException(`Column ${field} cannot have sub-selection`)\n\t\t\t\t\t}\n\t\t\t\t\tfields.add(column.name)\n\t\t\t\t},\n\t\t\t\tvisitManyHasOne: ({ entity, relation, targetEntity, targetRelation }) => {\n\t\t\t\t\tfields.add(relation.name)\n\t\t\t\t\trelations.add(relation.name)\n\t\t\t\t\tif (selection?.length > 0) {\n\t\t\t\t\t\tthis.processIndirectListenersNode(trigger, rootEntity, targetEntity, selection, [...path, relation.name])\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t\tvisitOneHasMany: ({ entity, relation, targetEntity, targetRelation }) => {\n\t\t\t\t\tthis.processIndirectListenersNode(trigger, rootEntity, targetEntity, [...selection ?? [], targetRelation.name], [...path, relation.name])\n\t\t\t\t},\n\t\t\t\tvisitOneHasOneOwning: ({ entity, relation, targetEntity, targetRelation }) => {\n\t\t\t\t\tfields.add(relation.name)\n\t\t\t\t\trelations.add(relation.name)\n\t\t\t\t\tif (selection?.length > 0) {\n\t\t\t\t\t\tthis.processIndirectListenersNode(trigger, rootEntity, targetEntity, selection, [...path, relation.name])\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t\tvisitOneHasOneInverse: ({ entity, relation, targetEntity, targetRelation }) => {\n\t\t\t\t\tthis.processIndirectListenersNode(trigger, rootEntity, targetEntity, [...selection ?? [], targetRelation.name], [...path, relation.name])\n\t\t\t\t},\n\t\t\t\tvisitManyHasManyOwning: ({ entity, relation, targetEntity, targetRelation }) => {\n\t\t\t\t\tthis.addJunctionListener(entity.name, relation.name, {\n\t\t\t\t\t\ttype: 'junction',\n\t\t\t\t\t\trootEntity,\n\t\t\t\t\t\tpath: path,\n\t\t\t\t\t\ttrigger,\n\t\t\t\t\t\tcontext: {\n\t\t\t\t\t\t\tentity,\n\t\t\t\t\t\t\trelation,\n\t\t\t\t\t\t\ttype: 'owning',\n\t\t\t\t\t\t},\n\t\t\t\t\t})\n\t\t\t\t\tif (selection?.length > 0) {\n\t\t\t\t\t\tthis.processIndirectListenersNode(trigger, rootEntity, targetEntity, selection, [...path, relation.name])\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t\tvisitManyHasManyInverse: ({ entity, relation, targetEntity, targetRelation }) => {\n\t\t\t\t\tthis.addJunctionListener(targetEntity.name, targetRelation.name, {\n\t\t\t\t\t\ttype: 'junction',\n\t\t\t\t\t\trootEntity,\n\t\t\t\t\t\tpath: path,\n\t\t\t\t\t\ttrigger,\n\t\t\t\t\t\tcontext: {\n\t\t\t\t\t\t\tentity,\n\t\t\t\t\t\t\trelation,\n\t\t\t\t\t\t\ttype: 'inverse',\n\t\t\t\t\t\t},\n\t\t\t\t\t})\n\t\t\t\t\tif (selection?.length > 0) {\n\t\t\t\t\t\tthis.processIndirectListenersNode(trigger, rootEntity, targetEntity, selection, [...path, relation.name])\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t})\n\t\t}\n\t\tif (path.length === 0) {\n\t\t\tthis.addListener('updateListeners', entity.name, {\n\t\t\t\ttype: 'update',\n\t\t\t\tentity: rootEntity,\n\t\t\t\tfields,\n\t\t\t\ttrigger,\n\t\t\t})\n\t\t} else {\n\t\t\tthis.addListener('indirectListeners', entity.name, {\n\t\t\t\ttype: 'indirect',\n\t\t\t\trootEntity: rootEntity,\n\t\t\t\tfields,\n\t\t\t\trelations,\n\t\t\t\tpath,\n\t\t\t\ttrigger,\n\t\t\t})\n\t\t}\n\t}\n\n\tpublic createStore(): TriggerListenersStore {\n\t\treturn new TriggerListenersStore(this.data)\n\t}\n\n\tprivate addListener<\n\t\tK extends Exclude<keyof TriggerListeners, 'junctionListeners'>,\n\t\tV extends TriggerListeners[K] extends Map<string, infer V extends any[]> ? V[number] : never,\n\t>(\n\t\ttype: K,\n\t\tentityName: string,\n\t\tvalue: V,\n\t) {\n\t\tmapGetOrPut<string, V[], []>(this.data[type] as Map<string, V[]>, entityName, () => []).push(value)\n\t}\n\n\tprivate addJunctionListener(entityName: string, relationName: string, listener: JunctionListener) {\n\t\tconst entityJunctionListeners = mapGetOrPut(this.data.junctionListeners, entityName, () => new Map())\n\t\tconst relationListeners = mapGetOrPut(entityJunctionListeners, relationName, () => [])\n\t\trelationListeners.push(listener)\n\t}\n}\n"],"names":["ImplementationException","getEntity","acceptFieldVisitor","entity","TriggerListenersStore","mapGetOrPut"],"mappings":"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"}
1
+ {"version":3,"file":"TriggerListenersBuilder.cjs","sources":["../../../../../packages/engine-actions/src/triggers/TriggerListenersBuilder.ts"],"sourcesContent":["import { Actions, Model } from '@contember/schema'\nimport { TriggerListeners } from './TriggerListeners.js'\nimport { JunctionListener, TriggerListenersStore } from './TriggerListenersStore.js'\nimport { acceptFieldVisitor, getEntity } from '@contember/schema-utils'\nimport { mapGetOrPut } from '../utils/map.js'\nimport { ImplementationException } from '../ImplementationException.js'\n\nexport class TriggerListenerBuilder {\n\tprivate readonly data: TriggerListeners = {\n\t\tcreateListeners: new Map(),\n\t\tupdateListeners: new Map(),\n\t\tdeleteListeners: new Map(),\n\t\tindirectListeners: new Map(),\n\t\tjunctionListeners: new Map(),\n\t}\n\n\tconstructor(\n\t\tprivate readonly model: Model.Schema,\n\t) {\n\t}\n\n\tpublic add(trigger: Actions.AnyTrigger) {\n\t\tif (trigger.type === 'basic') {\n\t\t\tthis.processBasicTrigger(trigger)\n\t\t} else if (trigger.type === 'watch') {\n\t\t\tthis.processIndirectListeners(trigger)\n\t\t} else {\n\t\t\t;((_: never) => {\n\t\t\t\tthrow new ImplementationException(`Unhandled trigger ${(trigger as any).type}`)\n\t\t\t})(trigger)\n\t\t}\n\t}\n\n\tprivate processBasicTrigger(trigger: Actions.BasicTrigger) {\n\t\tconst entity = getEntity(this.model, trigger.entity)\n\t\tif (trigger.create) {\n\t\t\tthis.addListener('createListeners', trigger.entity, {\n\t\t\t\ttype: 'create',\n\t\t\t\tentity,\n\t\t\t\ttrigger,\n\t\t\t})\n\t\t}\n\t\tif (trigger.delete) {\n\t\t\tthis.addListener('deleteListeners', trigger.entity, {\n\t\t\t\ttype: 'delete',\n\t\t\t\tentity,\n\t\t\t\ttrigger,\n\t\t\t})\n\t\t}\n\t\tif (trigger.update) {\n\t\t\tthis.addListener('updateListeners', trigger.entity, {\n\t\t\t\ttype: 'update',\n\t\t\t\tentity,\n\t\t\t\ttrigger,\n\t\t\t\tfields: new Set(trigger.update === true ? Object.keys(entity.fields) : trigger.update), // todo: only columns and owning\n\t\t\t})\n\t\t}\n\t}\n\n\tprivate processIndirectListeners(\n\t\ttrigger: Actions.WatchTrigger,\n\t) {\n\t\tconst entity = getEntity(this.model, trigger.entity)\n\t\tthis.addListener('createListeners', trigger.entity, {\n\t\t\ttype: 'create',\n\t\t\tentity,\n\t\t\ttrigger,\n\t\t})\n\t\tthis.addListener('deleteListeners', trigger.entity, {\n\t\t\ttype: 'delete',\n\t\t\tentity,\n\t\t\ttrigger,\n\t\t})\n\t\tthis.processIndirectListenersNode(trigger, entity, entity, trigger.watch, [])\n\t}\n\tprivate processIndirectListenersNode(\n\t\ttrigger: Actions.WatchTrigger,\n\t\trootEntity: Model.Entity,\n\t\tentity: Model.Entity,\n\t\tnode: Actions.SelectionNode,\n\t\tpath: string[],\n\t) {\n\t\tconst fields = new Set<string>()\n\t\tconst relations = new Set<string>()\n\t\tfor (const entry of node) {\n\t\t\tconst [field, args, selection] = Array.isArray(entry) ? entry : [entry, undefined, undefined]\n\t\t\tacceptFieldVisitor(this.model, entity, field, {\n\t\t\t\tvisitColumn: ({ entity, column }) => {\n\t\t\t\t\tif (selection?.length > 0) {\n\t\t\t\t\t\tthrow new ImplementationException(`Column ${field} cannot have sub-selection`)\n\t\t\t\t\t}\n\t\t\t\t\tfields.add(column.name)\n\t\t\t\t},\n\t\t\t\tvisitManyHasOne: ({ entity, relation, targetEntity, targetRelation }) => {\n\t\t\t\t\tfields.add(relation.name)\n\t\t\t\t\trelations.add(relation.name)\n\t\t\t\t\tif (selection?.length > 0) {\n\t\t\t\t\t\tthis.processIndirectListenersNode(trigger, rootEntity, targetEntity, selection, [...path, relation.name])\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t\tvisitOneHasMany: ({ entity, relation, targetEntity, targetRelation }) => {\n\t\t\t\t\tthis.processIndirectListenersNode(trigger, rootEntity, targetEntity, [...selection ?? [], targetRelation.name], [...path, relation.name])\n\t\t\t\t},\n\t\t\t\tvisitOneHasOneOwning: ({ entity, relation, targetEntity, targetRelation }) => {\n\t\t\t\t\tfields.add(relation.name)\n\t\t\t\t\trelations.add(relation.name)\n\t\t\t\t\tif (selection?.length > 0) {\n\t\t\t\t\t\tthis.processIndirectListenersNode(trigger, rootEntity, targetEntity, selection, [...path, relation.name])\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t\tvisitOneHasOneInverse: ({ entity, relation, targetEntity, targetRelation }) => {\n\t\t\t\t\tthis.processIndirectListenersNode(trigger, rootEntity, targetEntity, [...selection ?? [], targetRelation.name], [...path, relation.name])\n\t\t\t\t},\n\t\t\t\tvisitManyHasManyOwning: ({ entity, relation, targetEntity, targetRelation }) => {\n\t\t\t\t\tthis.addJunctionListener(entity.name, relation.name, {\n\t\t\t\t\t\ttype: 'junction',\n\t\t\t\t\t\trootEntity,\n\t\t\t\t\t\tpath: path,\n\t\t\t\t\t\ttrigger,\n\t\t\t\t\t\tcontext: {\n\t\t\t\t\t\t\tentity,\n\t\t\t\t\t\t\trelation,\n\t\t\t\t\t\t\ttype: 'owning',\n\t\t\t\t\t\t},\n\t\t\t\t\t})\n\t\t\t\t\tif (selection?.length > 0) {\n\t\t\t\t\t\tthis.processIndirectListenersNode(trigger, rootEntity, targetEntity, selection, [...path, relation.name])\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t\tvisitManyHasManyInverse: ({ entity, relation, targetEntity, targetRelation }) => {\n\t\t\t\t\tthis.addJunctionListener(targetEntity.name, targetRelation.name, {\n\t\t\t\t\t\ttype: 'junction',\n\t\t\t\t\t\trootEntity,\n\t\t\t\t\t\tpath: path,\n\t\t\t\t\t\ttrigger,\n\t\t\t\t\t\tcontext: {\n\t\t\t\t\t\t\tentity,\n\t\t\t\t\t\t\trelation,\n\t\t\t\t\t\t\ttype: 'inverse',\n\t\t\t\t\t\t},\n\t\t\t\t\t})\n\t\t\t\t\tif (selection?.length > 0) {\n\t\t\t\t\t\tthis.processIndirectListenersNode(trigger, rootEntity, targetEntity, selection, [...path, relation.name])\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t})\n\t\t}\n\t\tif (path.length === 0) {\n\t\t\tthis.addListener('updateListeners', entity.name, {\n\t\t\t\ttype: 'update',\n\t\t\t\tentity: rootEntity,\n\t\t\t\tfields,\n\t\t\t\ttrigger,\n\t\t\t})\n\t\t} else {\n\t\t\tthis.addListener('indirectListeners', entity.name, {\n\t\t\t\ttype: 'indirect',\n\t\t\t\trootEntity: rootEntity,\n\t\t\t\tfields,\n\t\t\t\trelations,\n\t\t\t\tpath,\n\t\t\t\ttrigger,\n\t\t\t})\n\t\t}\n\t}\n\n\tpublic createStore(): TriggerListenersStore {\n\t\treturn new TriggerListenersStore(this.data)\n\t}\n\n\tprivate addListener<\n\t\tK extends Exclude<keyof TriggerListeners, 'junctionListeners'>,\n\t\tV extends TriggerListeners[K] extends Map<string, infer V extends any[]> ? V[number] : never,\n\t>(\n\t\ttype: K,\n\t\tentityName: string,\n\t\tvalue: V,\n\t) {\n\t\tmapGetOrPut<string, V[], []>(this.data[type] as Map<string, V[]>, entityName, () => []).push(value)\n\t}\n\n\tprivate addJunctionListener(entityName: string, relationName: string, listener: JunctionListener) {\n\t\tconst entityJunctionListeners = mapGetOrPut(this.data.junctionListeners, entityName, () => new Map())\n\t\tconst relationListeners = mapGetOrPut(entityJunctionListeners, relationName, () => [])\n\t\trelationListeners.push(listener)\n\t}\n}\n"],"names":["ImplementationException","getEntity","acceptFieldVisitor","entity","TriggerListenersStore","mapGetOrPut"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"TriggerListenersBuilder.js","sources":["../../../../../packages/engine-actions/src/triggers/TriggerListenersBuilder.ts"],"sourcesContent":["import { Actions, Model } from '@contember/schema'\nimport { TriggerListeners } from './TriggerListeners'\nimport { JunctionListener, TriggerListenersStore } from './TriggerListenersStore'\nimport { acceptFieldVisitor, getEntity } from '@contember/schema-utils'\nimport { mapGetOrPut } from '../utils/map'\nimport { ImplementationException } from '../ImplementationException'\n\nexport class TriggerListenerBuilder {\n\tprivate readonly data: TriggerListeners = {\n\t\tcreateListeners: new Map(),\n\t\tupdateListeners: new Map(),\n\t\tdeleteListeners: new Map(),\n\t\tindirectListeners: new Map(),\n\t\tjunctionListeners: new Map(),\n\t}\n\n\tconstructor(\n\t\tprivate readonly model: Model.Schema,\n\t) {\n\t}\n\n\tpublic add(trigger: Actions.AnyTrigger) {\n\t\tif (trigger.type === 'basic') {\n\t\t\tthis.processBasicTrigger(trigger)\n\t\t} else if (trigger.type === 'watch') {\n\t\t\tthis.processIndirectListeners(trigger)\n\t\t} else {\n\t\t\t;((_: never) => {\n\t\t\t\tthrow new ImplementationException(`Unhandled trigger ${(trigger as any).type}`)\n\t\t\t})(trigger)\n\t\t}\n\t}\n\n\tprivate processBasicTrigger(trigger: Actions.BasicTrigger) {\n\t\tconst entity = getEntity(this.model, trigger.entity)\n\t\tif (trigger.create) {\n\t\t\tthis.addListener('createListeners', trigger.entity, {\n\t\t\t\ttype: 'create',\n\t\t\t\tentity,\n\t\t\t\ttrigger,\n\t\t\t})\n\t\t}\n\t\tif (trigger.delete) {\n\t\t\tthis.addListener('deleteListeners', trigger.entity, {\n\t\t\t\ttype: 'delete',\n\t\t\t\tentity,\n\t\t\t\ttrigger,\n\t\t\t})\n\t\t}\n\t\tif (trigger.update) {\n\t\t\tthis.addListener('updateListeners', trigger.entity, {\n\t\t\t\ttype: 'update',\n\t\t\t\tentity,\n\t\t\t\ttrigger,\n\t\t\t\tfields: new Set(trigger.update === true ? Object.keys(entity.fields) : trigger.update), // todo: only columns and owning\n\t\t\t})\n\t\t}\n\t}\n\n\tprivate processIndirectListeners(\n\t\ttrigger: Actions.WatchTrigger,\n\t) {\n\t\tconst entity = getEntity(this.model, trigger.entity)\n\t\tthis.addListener('createListeners', trigger.entity, {\n\t\t\ttype: 'create',\n\t\t\tentity,\n\t\t\ttrigger,\n\t\t})\n\t\tthis.addListener('deleteListeners', trigger.entity, {\n\t\t\ttype: 'delete',\n\t\t\tentity,\n\t\t\ttrigger,\n\t\t})\n\t\tthis.processIndirectListenersNode(trigger, entity, entity, trigger.watch, [])\n\t}\n\tprivate processIndirectListenersNode(\n\t\ttrigger: Actions.WatchTrigger,\n\t\trootEntity: Model.Entity,\n\t\tentity: Model.Entity,\n\t\tnode: Actions.SelectionNode,\n\t\tpath: string[],\n\t) {\n\t\tconst fields = new Set<string>()\n\t\tconst relations = new Set<string>()\n\t\tfor (const entry of node) {\n\t\t\tconst [field, args, selection] = Array.isArray(entry) ? entry : [entry, undefined, undefined]\n\t\t\tacceptFieldVisitor(this.model, entity, field, {\n\t\t\t\tvisitColumn: ({ entity, column }) => {\n\t\t\t\t\tif (selection?.length > 0) {\n\t\t\t\t\t\tthrow new ImplementationException(`Column ${field} cannot have sub-selection`)\n\t\t\t\t\t}\n\t\t\t\t\tfields.add(column.name)\n\t\t\t\t},\n\t\t\t\tvisitManyHasOne: ({ entity, relation, targetEntity, targetRelation }) => {\n\t\t\t\t\tfields.add(relation.name)\n\t\t\t\t\trelations.add(relation.name)\n\t\t\t\t\tif (selection?.length > 0) {\n\t\t\t\t\t\tthis.processIndirectListenersNode(trigger, rootEntity, targetEntity, selection, [...path, relation.name])\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t\tvisitOneHasMany: ({ entity, relation, targetEntity, targetRelation }) => {\n\t\t\t\t\tthis.processIndirectListenersNode(trigger, rootEntity, targetEntity, [...selection ?? [], targetRelation.name], [...path, relation.name])\n\t\t\t\t},\n\t\t\t\tvisitOneHasOneOwning: ({ entity, relation, targetEntity, targetRelation }) => {\n\t\t\t\t\tfields.add(relation.name)\n\t\t\t\t\trelations.add(relation.name)\n\t\t\t\t\tif (selection?.length > 0) {\n\t\t\t\t\t\tthis.processIndirectListenersNode(trigger, rootEntity, targetEntity, selection, [...path, relation.name])\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t\tvisitOneHasOneInverse: ({ entity, relation, targetEntity, targetRelation }) => {\n\t\t\t\t\tthis.processIndirectListenersNode(trigger, rootEntity, targetEntity, [...selection ?? [], targetRelation.name], [...path, relation.name])\n\t\t\t\t},\n\t\t\t\tvisitManyHasManyOwning: ({ entity, relation, targetEntity, targetRelation }) => {\n\t\t\t\t\tthis.addJunctionListener(entity.name, relation.name, {\n\t\t\t\t\t\ttype: 'junction',\n\t\t\t\t\t\trootEntity,\n\t\t\t\t\t\tpath: path,\n\t\t\t\t\t\ttrigger,\n\t\t\t\t\t\tcontext: {\n\t\t\t\t\t\t\tentity,\n\t\t\t\t\t\t\trelation,\n\t\t\t\t\t\t\ttype: 'owning',\n\t\t\t\t\t\t},\n\t\t\t\t\t})\n\t\t\t\t\tif (selection?.length > 0) {\n\t\t\t\t\t\tthis.processIndirectListenersNode(trigger, rootEntity, targetEntity, selection, [...path, relation.name])\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t\tvisitManyHasManyInverse: ({ entity, relation, targetEntity, targetRelation }) => {\n\t\t\t\t\tthis.addJunctionListener(targetEntity.name, targetRelation.name, {\n\t\t\t\t\t\ttype: 'junction',\n\t\t\t\t\t\trootEntity,\n\t\t\t\t\t\tpath: path,\n\t\t\t\t\t\ttrigger,\n\t\t\t\t\t\tcontext: {\n\t\t\t\t\t\t\tentity,\n\t\t\t\t\t\t\trelation,\n\t\t\t\t\t\t\ttype: 'inverse',\n\t\t\t\t\t\t},\n\t\t\t\t\t})\n\t\t\t\t\tif (selection?.length > 0) {\n\t\t\t\t\t\tthis.processIndirectListenersNode(trigger, rootEntity, targetEntity, selection, [...path, relation.name])\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t})\n\t\t}\n\t\tif (path.length === 0) {\n\t\t\tthis.addListener('updateListeners', entity.name, {\n\t\t\t\ttype: 'update',\n\t\t\t\tentity: rootEntity,\n\t\t\t\tfields,\n\t\t\t\ttrigger,\n\t\t\t})\n\t\t} else {\n\t\t\tthis.addListener('indirectListeners', entity.name, {\n\t\t\t\ttype: 'indirect',\n\t\t\t\trootEntity: rootEntity,\n\t\t\t\tfields,\n\t\t\t\trelations,\n\t\t\t\tpath,\n\t\t\t\ttrigger,\n\t\t\t})\n\t\t}\n\t}\n\n\tpublic createStore(): TriggerListenersStore {\n\t\treturn new TriggerListenersStore(this.data)\n\t}\n\n\tprivate addListener<\n\t\tK extends Exclude<keyof TriggerListeners, 'junctionListeners'>,\n\t\tV extends TriggerListeners[K] extends Map<string, infer V extends any[]> ? V[number] : never,\n\t>(\n\t\ttype: K,\n\t\tentityName: string,\n\t\tvalue: V,\n\t) {\n\t\tmapGetOrPut<string, V[], []>(this.data[type] as Map<string, V[]>, entityName, () => []).push(value)\n\t}\n\n\tprivate addJunctionListener(entityName: string, relationName: string, listener: JunctionListener) {\n\t\tconst entityJunctionListeners = mapGetOrPut(this.data.junctionListeners, entityName, () => new Map())\n\t\tconst relationListeners = mapGetOrPut(entityJunctionListeners, relationName, () => [])\n\t\trelationListeners.push(listener)\n\t}\n}\n"],"names":["entity"],"mappings":"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"}
1
+ {"version":3,"file":"TriggerListenersBuilder.js","sources":["../../../../../packages/engine-actions/src/triggers/TriggerListenersBuilder.ts"],"sourcesContent":["import { Actions, Model } from '@contember/schema'\nimport { TriggerListeners } from './TriggerListeners.js'\nimport { JunctionListener, TriggerListenersStore } from './TriggerListenersStore.js'\nimport { acceptFieldVisitor, getEntity } from '@contember/schema-utils'\nimport { mapGetOrPut } from '../utils/map.js'\nimport { ImplementationException } from '../ImplementationException.js'\n\nexport class TriggerListenerBuilder {\n\tprivate readonly data: TriggerListeners = {\n\t\tcreateListeners: new Map(),\n\t\tupdateListeners: new Map(),\n\t\tdeleteListeners: new Map(),\n\t\tindirectListeners: new Map(),\n\t\tjunctionListeners: new Map(),\n\t}\n\n\tconstructor(\n\t\tprivate readonly model: Model.Schema,\n\t) {\n\t}\n\n\tpublic add(trigger: Actions.AnyTrigger) {\n\t\tif (trigger.type === 'basic') {\n\t\t\tthis.processBasicTrigger(trigger)\n\t\t} else if (trigger.type === 'watch') {\n\t\t\tthis.processIndirectListeners(trigger)\n\t\t} else {\n\t\t\t;((_: never) => {\n\t\t\t\tthrow new ImplementationException(`Unhandled trigger ${(trigger as any).type}`)\n\t\t\t})(trigger)\n\t\t}\n\t}\n\n\tprivate processBasicTrigger(trigger: Actions.BasicTrigger) {\n\t\tconst entity = getEntity(this.model, trigger.entity)\n\t\tif (trigger.create) {\n\t\t\tthis.addListener('createListeners', trigger.entity, {\n\t\t\t\ttype: 'create',\n\t\t\t\tentity,\n\t\t\t\ttrigger,\n\t\t\t})\n\t\t}\n\t\tif (trigger.delete) {\n\t\t\tthis.addListener('deleteListeners', trigger.entity, {\n\t\t\t\ttype: 'delete',\n\t\t\t\tentity,\n\t\t\t\ttrigger,\n\t\t\t})\n\t\t}\n\t\tif (trigger.update) {\n\t\t\tthis.addListener('updateListeners', trigger.entity, {\n\t\t\t\ttype: 'update',\n\t\t\t\tentity,\n\t\t\t\ttrigger,\n\t\t\t\tfields: new Set(trigger.update === true ? Object.keys(entity.fields) : trigger.update), // todo: only columns and owning\n\t\t\t})\n\t\t}\n\t}\n\n\tprivate processIndirectListeners(\n\t\ttrigger: Actions.WatchTrigger,\n\t) {\n\t\tconst entity = getEntity(this.model, trigger.entity)\n\t\tthis.addListener('createListeners', trigger.entity, {\n\t\t\ttype: 'create',\n\t\t\tentity,\n\t\t\ttrigger,\n\t\t})\n\t\tthis.addListener('deleteListeners', trigger.entity, {\n\t\t\ttype: 'delete',\n\t\t\tentity,\n\t\t\ttrigger,\n\t\t})\n\t\tthis.processIndirectListenersNode(trigger, entity, entity, trigger.watch, [])\n\t}\n\tprivate processIndirectListenersNode(\n\t\ttrigger: Actions.WatchTrigger,\n\t\trootEntity: Model.Entity,\n\t\tentity: Model.Entity,\n\t\tnode: Actions.SelectionNode,\n\t\tpath: string[],\n\t) {\n\t\tconst fields = new Set<string>()\n\t\tconst relations = new Set<string>()\n\t\tfor (const entry of node) {\n\t\t\tconst [field, args, selection] = Array.isArray(entry) ? entry : [entry, undefined, undefined]\n\t\t\tacceptFieldVisitor(this.model, entity, field, {\n\t\t\t\tvisitColumn: ({ entity, column }) => {\n\t\t\t\t\tif (selection?.length > 0) {\n\t\t\t\t\t\tthrow new ImplementationException(`Column ${field} cannot have sub-selection`)\n\t\t\t\t\t}\n\t\t\t\t\tfields.add(column.name)\n\t\t\t\t},\n\t\t\t\tvisitManyHasOne: ({ entity, relation, targetEntity, targetRelation }) => {\n\t\t\t\t\tfields.add(relation.name)\n\t\t\t\t\trelations.add(relation.name)\n\t\t\t\t\tif (selection?.length > 0) {\n\t\t\t\t\t\tthis.processIndirectListenersNode(trigger, rootEntity, targetEntity, selection, [...path, relation.name])\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t\tvisitOneHasMany: ({ entity, relation, targetEntity, targetRelation }) => {\n\t\t\t\t\tthis.processIndirectListenersNode(trigger, rootEntity, targetEntity, [...selection ?? [], targetRelation.name], [...path, relation.name])\n\t\t\t\t},\n\t\t\t\tvisitOneHasOneOwning: ({ entity, relation, targetEntity, targetRelation }) => {\n\t\t\t\t\tfields.add(relation.name)\n\t\t\t\t\trelations.add(relation.name)\n\t\t\t\t\tif (selection?.length > 0) {\n\t\t\t\t\t\tthis.processIndirectListenersNode(trigger, rootEntity, targetEntity, selection, [...path, relation.name])\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t\tvisitOneHasOneInverse: ({ entity, relation, targetEntity, targetRelation }) => {\n\t\t\t\t\tthis.processIndirectListenersNode(trigger, rootEntity, targetEntity, [...selection ?? [], targetRelation.name], [...path, relation.name])\n\t\t\t\t},\n\t\t\t\tvisitManyHasManyOwning: ({ entity, relation, targetEntity, targetRelation }) => {\n\t\t\t\t\tthis.addJunctionListener(entity.name, relation.name, {\n\t\t\t\t\t\ttype: 'junction',\n\t\t\t\t\t\trootEntity,\n\t\t\t\t\t\tpath: path,\n\t\t\t\t\t\ttrigger,\n\t\t\t\t\t\tcontext: {\n\t\t\t\t\t\t\tentity,\n\t\t\t\t\t\t\trelation,\n\t\t\t\t\t\t\ttype: 'owning',\n\t\t\t\t\t\t},\n\t\t\t\t\t})\n\t\t\t\t\tif (selection?.length > 0) {\n\t\t\t\t\t\tthis.processIndirectListenersNode(trigger, rootEntity, targetEntity, selection, [...path, relation.name])\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t\tvisitManyHasManyInverse: ({ entity, relation, targetEntity, targetRelation }) => {\n\t\t\t\t\tthis.addJunctionListener(targetEntity.name, targetRelation.name, {\n\t\t\t\t\t\ttype: 'junction',\n\t\t\t\t\t\trootEntity,\n\t\t\t\t\t\tpath: path,\n\t\t\t\t\t\ttrigger,\n\t\t\t\t\t\tcontext: {\n\t\t\t\t\t\t\tentity,\n\t\t\t\t\t\t\trelation,\n\t\t\t\t\t\t\ttype: 'inverse',\n\t\t\t\t\t\t},\n\t\t\t\t\t})\n\t\t\t\t\tif (selection?.length > 0) {\n\t\t\t\t\t\tthis.processIndirectListenersNode(trigger, rootEntity, targetEntity, selection, [...path, relation.name])\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t})\n\t\t}\n\t\tif (path.length === 0) {\n\t\t\tthis.addListener('updateListeners', entity.name, {\n\t\t\t\ttype: 'update',\n\t\t\t\tentity: rootEntity,\n\t\t\t\tfields,\n\t\t\t\ttrigger,\n\t\t\t})\n\t\t} else {\n\t\t\tthis.addListener('indirectListeners', entity.name, {\n\t\t\t\ttype: 'indirect',\n\t\t\t\trootEntity: rootEntity,\n\t\t\t\tfields,\n\t\t\t\trelations,\n\t\t\t\tpath,\n\t\t\t\ttrigger,\n\t\t\t})\n\t\t}\n\t}\n\n\tpublic createStore(): TriggerListenersStore {\n\t\treturn new TriggerListenersStore(this.data)\n\t}\n\n\tprivate addListener<\n\t\tK extends Exclude<keyof TriggerListeners, 'junctionListeners'>,\n\t\tV extends TriggerListeners[K] extends Map<string, infer V extends any[]> ? V[number] : never,\n\t>(\n\t\ttype: K,\n\t\tentityName: string,\n\t\tvalue: V,\n\t) {\n\t\tmapGetOrPut<string, V[], []>(this.data[type] as Map<string, V[]>, entityName, () => []).push(value)\n\t}\n\n\tprivate addJunctionListener(entityName: string, relationName: string, listener: JunctionListener) {\n\t\tconst entityJunctionListeners = mapGetOrPut(this.data.junctionListeners, entityName, () => new Map())\n\t\tconst relationListeners = mapGetOrPut(entityJunctionListeners, relationName, () => [])\n\t\trelationListeners.push(listener)\n\t}\n}\n"],"names":["entity"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"TriggerListenersFactory.cjs","sources":["../../../../../packages/engine-actions/src/triggers/TriggerListenersFactory.ts"],"sourcesContent":["import { TriggerListenersStore } from './TriggerListenersStore'\nimport { TriggerListenerBuilder } from './TriggerListenersBuilder'\nimport { Schema } from '@contember/schema'\n\nexport class TriggerListenersFactory {\n\tconstructor(\n\t\tprivate readonly schema: Schema,\n\t) {\n\t}\n\n\tpublic create(): TriggerListenersStore {\n\t\tconst builder = new TriggerListenerBuilder(this.schema.model)\n\t\tfor (const trigger of Object.values(this.schema.actions.triggers)) {\n\t\t\tbuilder.add(trigger)\n\t\t}\n\n\t\treturn builder.createStore()\n\t}\n}\n"],"names":["TriggerListenerBuilder"],"mappings":";;;AAIO,MAAM,wBAAwB;AAAA,EACpC,YACkB,QAChB;AADgB,SAAA,SAAA;AAAA,EAElB;AAAA,EAEO,SAAgC;AACtC,UAAM,UAAU,IAAIA,wBAAAA,uBAAuB,KAAK,OAAO,KAAK;AAC5D,eAAW,WAAW,OAAO,OAAO,KAAK,OAAO,QAAQ,QAAQ,GAAG;AAClE,cAAQ,IAAI,OAAO;AAAA,IACpB;AAEA,WAAO,QAAQ,YAAA;AAAA,EAChB;AACD;;"}
1
+ {"version":3,"file":"TriggerListenersFactory.cjs","sources":["../../../../../packages/engine-actions/src/triggers/TriggerListenersFactory.ts"],"sourcesContent":["import { TriggerListenersStore } from './TriggerListenersStore.js'\nimport { TriggerListenerBuilder } from './TriggerListenersBuilder.js'\nimport { Schema } from '@contember/schema'\n\nexport class TriggerListenersFactory {\n\tconstructor(\n\t\tprivate readonly schema: Schema,\n\t) {\n\t}\n\n\tpublic create(): TriggerListenersStore {\n\t\tconst builder = new TriggerListenerBuilder(this.schema.model)\n\t\tfor (const trigger of Object.values(this.schema.actions.triggers)) {\n\t\t\tbuilder.add(trigger)\n\t\t}\n\n\t\treturn builder.createStore()\n\t}\n}\n"],"names":["TriggerListenerBuilder"],"mappings":";;;AAIO,MAAM,wBAAwB;AAAA,EACpC,YACkB,QAChB;AADgB,SAAA,SAAA;AAAA,EAElB;AAAA,EAEO,SAAgC;AACtC,UAAM,UAAU,IAAIA,wBAAAA,uBAAuB,KAAK,OAAO,KAAK;AAC5D,eAAW,WAAW,OAAO,OAAO,KAAK,OAAO,QAAQ,QAAQ,GAAG;AAClE,cAAQ,IAAI,OAAO;AAAA,IACpB;AAEA,WAAO,QAAQ,YAAA;AAAA,EAChB;AACD;;"}
@@ -1 +1 @@
1
- {"version":3,"file":"TriggerListenersFactory.js","sources":["../../../../../packages/engine-actions/src/triggers/TriggerListenersFactory.ts"],"sourcesContent":["import { TriggerListenersStore } from './TriggerListenersStore'\nimport { TriggerListenerBuilder } from './TriggerListenersBuilder'\nimport { Schema } from '@contember/schema'\n\nexport class TriggerListenersFactory {\n\tconstructor(\n\t\tprivate readonly schema: Schema,\n\t) {\n\t}\n\n\tpublic create(): TriggerListenersStore {\n\t\tconst builder = new TriggerListenerBuilder(this.schema.model)\n\t\tfor (const trigger of Object.values(this.schema.actions.triggers)) {\n\t\t\tbuilder.add(trigger)\n\t\t}\n\n\t\treturn builder.createStore()\n\t}\n}\n"],"names":[],"mappings":";AAIO,MAAM,wBAAwB;AAAA,EACpC,YACkB,QAChB;AADgB,SAAA,SAAA;AAAA,EAElB;AAAA,EAEO,SAAgC;AACtC,UAAM,UAAU,IAAI,uBAAuB,KAAK,OAAO,KAAK;AAC5D,eAAW,WAAW,OAAO,OAAO,KAAK,OAAO,QAAQ,QAAQ,GAAG;AAClE,cAAQ,IAAI,OAAO;AAAA,IACpB;AAEA,WAAO,QAAQ,YAAA;AAAA,EAChB;AACD;"}
1
+ {"version":3,"file":"TriggerListenersFactory.js","sources":["../../../../../packages/engine-actions/src/triggers/TriggerListenersFactory.ts"],"sourcesContent":["import { TriggerListenersStore } from './TriggerListenersStore.js'\nimport { TriggerListenerBuilder } from './TriggerListenersBuilder.js'\nimport { Schema } from '@contember/schema'\n\nexport class TriggerListenersFactory {\n\tconstructor(\n\t\tprivate readonly schema: Schema,\n\t) {\n\t}\n\n\tpublic create(): TriggerListenersStore {\n\t\tconst builder = new TriggerListenerBuilder(this.schema.model)\n\t\tfor (const trigger of Object.values(this.schema.actions.triggers)) {\n\t\t\tbuilder.add(trigger)\n\t\t}\n\n\t\treturn builder.createStore()\n\t}\n}\n"],"names":[],"mappings":";AAIO,MAAM,wBAAwB;AAAA,EACpC,YACkB,QAChB;AADgB,SAAA,SAAA;AAAA,EAElB;AAAA,EAEO,SAAgC;AACtC,UAAM,UAAU,IAAI,uBAAuB,KAAK,OAAO,KAAK;AAC5D,eAAW,WAAW,OAAO,OAAO,KAAK,OAAO,QAAQ,QAAQ,GAAG;AAClE,cAAQ,IAAI,OAAO;AAAA,IACpB;AAEA,WAAO,QAAQ,YAAA;AAAA,EAChB;AACD;"}
@@ -1 +1 @@
1
- {"version":3,"file":"TriggerListenersStore.cjs","sources":["../../../../../packages/engine-actions/src/triggers/TriggerListenersStore.ts"],"sourcesContent":["import { Actions, Model } from '@contember/schema'\nimport { TriggerListeners } from './TriggerListeners'\n\nexport interface IndirectListener {\n\ttype: 'indirect'\n\ttrigger: Actions.WatchTrigger\n\trootEntity: Model.Entity\n\tfields: Set<string>\n\trelations: Set<string>\n\tpath: string[]\n}\n\nexport interface JunctionListener {\n\ttype: 'junction'\n\ttrigger: Actions.WatchTrigger\n\trootEntity: Model.Entity\n\tpath: string[]\n\tcontext: {\n\t\tentity: Model.Entity\n\t\trelation: Model.ManyHasManyOwningRelation | Model.ManyHasManyInverseRelation\n\t\ttype: 'owning' | 'inverse'\n\t}\n}\n\nexport interface DeleteListener {\n\ttype: 'delete'\n\ttrigger: Actions.AnyTrigger\n\tentity: Model.Entity\n}\n\nexport interface CreateListener {\n\ttype: 'create'\n\ttrigger: Actions.AnyTrigger\n\tentity: Model.Entity\n}\n\nexport interface UpdateListener {\n\ttype: 'update'\n\ttrigger: Actions.AnyTrigger\n\tentity: Model.Entity\n\tfields: Set<string>\n}\n\nexport type AnyListener =\n\t| JunctionListener\n\t| UpdateListener\n\t| CreateListener\n\t| DeleteListener\n\t| IndirectListener\n\nexport class TriggerListenersStore {\n\tconstructor(\n\t\tprivate readonly listeners: TriggerListeners,\n\t) {\n\t}\n\n\tpublic getUpdateListeners(entityName: string): UpdateListener[] {\n\t\treturn this.listeners.updateListeners.get(entityName) ?? []\n\t}\n\n\tpublic getDeleteListener(entityName: string): DeleteListener[] {\n\t\treturn this.listeners.deleteListeners.get(entityName) ?? []\n\t}\n\n\tpublic getCreateListener(entityName: string): CreateListener[] {\n\t\treturn this.listeners.createListeners.get(entityName) ?? []\n\t}\n\n\tpublic getIndirectListeners(entityName: string): IndirectListener[] {\n\t\treturn this.listeners.indirectListeners.get(entityName) ?? []\n\t}\n\n\tpublic getJunctionListeners(entityName: string, relationName: string): JunctionListener[] {\n\t\treturn this.listeners.junctionListeners.get(entityName)?.get(relationName) ?? []\n\t}\n}\n"],"names":[],"mappings":";;AAkDO,MAAM,sBAAsB;AAAA,EAClC,YACkB,WAChB;AADgB,SAAA,YAAA;AAAA,EAElB;AAAA,EAEO,mBAAmB,YAAsC;AAC/D,WAAO,KAAK,UAAU,gBAAgB,IAAI,UAAU,KAAK,CAAA;AAAA,EAC1D;AAAA,EAEO,kBAAkB,YAAsC;AAC9D,WAAO,KAAK,UAAU,gBAAgB,IAAI,UAAU,KAAK,CAAA;AAAA,EAC1D;AAAA,EAEO,kBAAkB,YAAsC;AAC9D,WAAO,KAAK,UAAU,gBAAgB,IAAI,UAAU,KAAK,CAAA;AAAA,EAC1D;AAAA,EAEO,qBAAqB,YAAwC;AACnE,WAAO,KAAK,UAAU,kBAAkB,IAAI,UAAU,KAAK,CAAA;AAAA,EAC5D;AAAA,EAEO,qBAAqB,YAAoB,cAA0C;AACzF,WAAO,KAAK,UAAU,kBAAkB,IAAI,UAAU,GAAG,IAAI,YAAY,KAAK,CAAA;AAAA,EAC/E;AACD;;"}
1
+ {"version":3,"file":"TriggerListenersStore.cjs","sources":["../../../../../packages/engine-actions/src/triggers/TriggerListenersStore.ts"],"sourcesContent":["import { Actions, Model } from '@contember/schema'\nimport { TriggerListeners } from './TriggerListeners.js'\n\nexport interface IndirectListener {\n\ttype: 'indirect'\n\ttrigger: Actions.WatchTrigger\n\trootEntity: Model.Entity\n\tfields: Set<string>\n\trelations: Set<string>\n\tpath: string[]\n}\n\nexport interface JunctionListener {\n\ttype: 'junction'\n\ttrigger: Actions.WatchTrigger\n\trootEntity: Model.Entity\n\tpath: string[]\n\tcontext: {\n\t\tentity: Model.Entity\n\t\trelation: Model.ManyHasManyOwningRelation | Model.ManyHasManyInverseRelation\n\t\ttype: 'owning' | 'inverse'\n\t}\n}\n\nexport interface DeleteListener {\n\ttype: 'delete'\n\ttrigger: Actions.AnyTrigger\n\tentity: Model.Entity\n}\n\nexport interface CreateListener {\n\ttype: 'create'\n\ttrigger: Actions.AnyTrigger\n\tentity: Model.Entity\n}\n\nexport interface UpdateListener {\n\ttype: 'update'\n\ttrigger: Actions.AnyTrigger\n\tentity: Model.Entity\n\tfields: Set<string>\n}\n\nexport type AnyListener =\n\t| JunctionListener\n\t| UpdateListener\n\t| CreateListener\n\t| DeleteListener\n\t| IndirectListener\n\nexport class TriggerListenersStore {\n\tconstructor(\n\t\tprivate readonly listeners: TriggerListeners,\n\t) {\n\t}\n\n\tpublic getUpdateListeners(entityName: string): UpdateListener[] {\n\t\treturn this.listeners.updateListeners.get(entityName) ?? []\n\t}\n\n\tpublic getDeleteListener(entityName: string): DeleteListener[] {\n\t\treturn this.listeners.deleteListeners.get(entityName) ?? []\n\t}\n\n\tpublic getCreateListener(entityName: string): CreateListener[] {\n\t\treturn this.listeners.createListeners.get(entityName) ?? []\n\t}\n\n\tpublic getIndirectListeners(entityName: string): IndirectListener[] {\n\t\treturn this.listeners.indirectListeners.get(entityName) ?? []\n\t}\n\n\tpublic getJunctionListeners(entityName: string, relationName: string): JunctionListener[] {\n\t\treturn this.listeners.junctionListeners.get(entityName)?.get(relationName) ?? []\n\t}\n}\n"],"names":[],"mappings":";;AAkDO,MAAM,sBAAsB;AAAA,EAClC,YACkB,WAChB;AADgB,SAAA,YAAA;AAAA,EAElB;AAAA,EAEO,mBAAmB,YAAsC;AAC/D,WAAO,KAAK,UAAU,gBAAgB,IAAI,UAAU,KAAK,CAAA;AAAA,EAC1D;AAAA,EAEO,kBAAkB,YAAsC;AAC9D,WAAO,KAAK,UAAU,gBAAgB,IAAI,UAAU,KAAK,CAAA;AAAA,EAC1D;AAAA,EAEO,kBAAkB,YAAsC;AAC9D,WAAO,KAAK,UAAU,gBAAgB,IAAI,UAAU,KAAK,CAAA;AAAA,EAC1D;AAAA,EAEO,qBAAqB,YAAwC;AACnE,WAAO,KAAK,UAAU,kBAAkB,IAAI,UAAU,KAAK,CAAA;AAAA,EAC5D;AAAA,EAEO,qBAAqB,YAAoB,cAA0C;AACzF,WAAO,KAAK,UAAU,kBAAkB,IAAI,UAAU,GAAG,IAAI,YAAY,KAAK,CAAA;AAAA,EAC/E;AACD;;"}
@@ -1 +1 @@
1
- {"version":3,"file":"TriggerListenersStore.js","sources":["../../../../../packages/engine-actions/src/triggers/TriggerListenersStore.ts"],"sourcesContent":["import { Actions, Model } from '@contember/schema'\nimport { TriggerListeners } from './TriggerListeners'\n\nexport interface IndirectListener {\n\ttype: 'indirect'\n\ttrigger: Actions.WatchTrigger\n\trootEntity: Model.Entity\n\tfields: Set<string>\n\trelations: Set<string>\n\tpath: string[]\n}\n\nexport interface JunctionListener {\n\ttype: 'junction'\n\ttrigger: Actions.WatchTrigger\n\trootEntity: Model.Entity\n\tpath: string[]\n\tcontext: {\n\t\tentity: Model.Entity\n\t\trelation: Model.ManyHasManyOwningRelation | Model.ManyHasManyInverseRelation\n\t\ttype: 'owning' | 'inverse'\n\t}\n}\n\nexport interface DeleteListener {\n\ttype: 'delete'\n\ttrigger: Actions.AnyTrigger\n\tentity: Model.Entity\n}\n\nexport interface CreateListener {\n\ttype: 'create'\n\ttrigger: Actions.AnyTrigger\n\tentity: Model.Entity\n}\n\nexport interface UpdateListener {\n\ttype: 'update'\n\ttrigger: Actions.AnyTrigger\n\tentity: Model.Entity\n\tfields: Set<string>\n}\n\nexport type AnyListener =\n\t| JunctionListener\n\t| UpdateListener\n\t| CreateListener\n\t| DeleteListener\n\t| IndirectListener\n\nexport class TriggerListenersStore {\n\tconstructor(\n\t\tprivate readonly listeners: TriggerListeners,\n\t) {\n\t}\n\n\tpublic getUpdateListeners(entityName: string): UpdateListener[] {\n\t\treturn this.listeners.updateListeners.get(entityName) ?? []\n\t}\n\n\tpublic getDeleteListener(entityName: string): DeleteListener[] {\n\t\treturn this.listeners.deleteListeners.get(entityName) ?? []\n\t}\n\n\tpublic getCreateListener(entityName: string): CreateListener[] {\n\t\treturn this.listeners.createListeners.get(entityName) ?? []\n\t}\n\n\tpublic getIndirectListeners(entityName: string): IndirectListener[] {\n\t\treturn this.listeners.indirectListeners.get(entityName) ?? []\n\t}\n\n\tpublic getJunctionListeners(entityName: string, relationName: string): JunctionListener[] {\n\t\treturn this.listeners.junctionListeners.get(entityName)?.get(relationName) ?? []\n\t}\n}\n"],"names":[],"mappings":"AAkDO,MAAM,sBAAsB;AAAA,EAClC,YACkB,WAChB;AADgB,SAAA,YAAA;AAAA,EAElB;AAAA,EAEO,mBAAmB,YAAsC;AAC/D,WAAO,KAAK,UAAU,gBAAgB,IAAI,UAAU,KAAK,CAAA;AAAA,EAC1D;AAAA,EAEO,kBAAkB,YAAsC;AAC9D,WAAO,KAAK,UAAU,gBAAgB,IAAI,UAAU,KAAK,CAAA;AAAA,EAC1D;AAAA,EAEO,kBAAkB,YAAsC;AAC9D,WAAO,KAAK,UAAU,gBAAgB,IAAI,UAAU,KAAK,CAAA;AAAA,EAC1D;AAAA,EAEO,qBAAqB,YAAwC;AACnE,WAAO,KAAK,UAAU,kBAAkB,IAAI,UAAU,KAAK,CAAA;AAAA,EAC5D;AAAA,EAEO,qBAAqB,YAAoB,cAA0C;AACzF,WAAO,KAAK,UAAU,kBAAkB,IAAI,UAAU,GAAG,IAAI,YAAY,KAAK,CAAA;AAAA,EAC/E;AACD;"}
1
+ {"version":3,"file":"TriggerListenersStore.js","sources":["../../../../../packages/engine-actions/src/triggers/TriggerListenersStore.ts"],"sourcesContent":["import { Actions, Model } from '@contember/schema'\nimport { TriggerListeners } from './TriggerListeners.js'\n\nexport interface IndirectListener {\n\ttype: 'indirect'\n\ttrigger: Actions.WatchTrigger\n\trootEntity: Model.Entity\n\tfields: Set<string>\n\trelations: Set<string>\n\tpath: string[]\n}\n\nexport interface JunctionListener {\n\ttype: 'junction'\n\ttrigger: Actions.WatchTrigger\n\trootEntity: Model.Entity\n\tpath: string[]\n\tcontext: {\n\t\tentity: Model.Entity\n\t\trelation: Model.ManyHasManyOwningRelation | Model.ManyHasManyInverseRelation\n\t\ttype: 'owning' | 'inverse'\n\t}\n}\n\nexport interface DeleteListener {\n\ttype: 'delete'\n\ttrigger: Actions.AnyTrigger\n\tentity: Model.Entity\n}\n\nexport interface CreateListener {\n\ttype: 'create'\n\ttrigger: Actions.AnyTrigger\n\tentity: Model.Entity\n}\n\nexport interface UpdateListener {\n\ttype: 'update'\n\ttrigger: Actions.AnyTrigger\n\tentity: Model.Entity\n\tfields: Set<string>\n}\n\nexport type AnyListener =\n\t| JunctionListener\n\t| UpdateListener\n\t| CreateListener\n\t| DeleteListener\n\t| IndirectListener\n\nexport class TriggerListenersStore {\n\tconstructor(\n\t\tprivate readonly listeners: TriggerListeners,\n\t) {\n\t}\n\n\tpublic getUpdateListeners(entityName: string): UpdateListener[] {\n\t\treturn this.listeners.updateListeners.get(entityName) ?? []\n\t}\n\n\tpublic getDeleteListener(entityName: string): DeleteListener[] {\n\t\treturn this.listeners.deleteListeners.get(entityName) ?? []\n\t}\n\n\tpublic getCreateListener(entityName: string): CreateListener[] {\n\t\treturn this.listeners.createListeners.get(entityName) ?? []\n\t}\n\n\tpublic getIndirectListeners(entityName: string): IndirectListener[] {\n\t\treturn this.listeners.indirectListeners.get(entityName) ?? []\n\t}\n\n\tpublic getJunctionListeners(entityName: string, relationName: string): JunctionListener[] {\n\t\treturn this.listeners.junctionListeners.get(entityName)?.get(relationName) ?? []\n\t}\n}\n"],"names":[],"mappings":"AAkDO,MAAM,sBAAsB;AAAA,EAClC,YACkB,WAChB;AADgB,SAAA,YAAA;AAAA,EAElB;AAAA,EAEO,mBAAmB,YAAsC;AAC/D,WAAO,KAAK,UAAU,gBAAgB,IAAI,UAAU,KAAK,CAAA;AAAA,EAC1D;AAAA,EAEO,kBAAkB,YAAsC;AAC9D,WAAO,KAAK,UAAU,gBAAgB,IAAI,UAAU,KAAK,CAAA;AAAA,EAC1D;AAAA,EAEO,kBAAkB,YAAsC;AAC9D,WAAO,KAAK,UAAU,gBAAgB,IAAI,UAAU,KAAK,CAAA;AAAA,EAC1D;AAAA,EAEO,qBAAqB,YAAwC;AACnE,WAAO,KAAK,UAAU,kBAAkB,IAAI,UAAU,KAAK,CAAA;AAAA,EAC5D;AAAA,EAEO,qBAAqB,YAAoB,cAA0C;AACzF,WAAO,KAAK,UAAU,kBAAkB,IAAI,UAAU,GAAG,IAAI,YAAY,KAAK,CAAA;AAAA,EAC/E;AACD;"}
@@ -1 +1 @@
1
- {"version":3,"file":"TriggerPayloadBuilder.cjs","sources":["../../../../../packages/engine-actions/src/triggers/TriggerPayloadBuilder.ts"],"sourcesContent":["import { ImplementationException } from '../ImplementationException'\nimport { assertNever } from '../utils/assertNever'\nimport { FiredEvent } from './TriggerPayloadManager'\nimport { Actions, ActionsPayload, Input } from '@contember/schema'\nimport { FieldNode, Mapper, ObjectNode } from '@contember/engine-content-api'\n\ntype Selections = Record<Input.PrimaryValue, any>\n\nexport class TriggerPayloadBuilder {\n\tconstructor(\n\t\tprivate readonly mapper: Mapper,\n\t) {\n\t}\n\n\tpublic async build(events: FiredEvent[]): Promise<ActionsPayload.AnyEventPayload[]> {\n\t\tconst filteredEvents = events.filter(it => {\n\t\t\treturn it.cause.type !== 'BeforeUpdateEvent'\n\t\t\t\t|| it.cause.afterEvent?.hasChanges === true\n\t\t})\n\t\tif (filteredEvents.length === 0) {\n\t\t\treturn []\n\t\t}\n\t\tconst selections = await this.fetchSelection(filteredEvents)\n\t\tconst triggerType = filteredEvents[0].listener.trigger.type\n\t\tif (triggerType === 'basic') {\n\t\t\treturn filteredEvents.map(it => ({\n\t\t\t\ttrigger: it.listener.trigger.name,\n\t\t\t\t...this.buildBaseEventPayloads(it, it.selection ?? selections[it.primary]),\n\t\t\t}))\n\t\t}\n\t\tif (triggerType === 'watch') {\n\t\t\treturn this.buildWatchEventPayloads(filteredEvents, selections)\n\t\t}\n\t\treturn assertNever(triggerType)\n\t}\n\n\tpublic async preprocessEvent(event: FiredEvent): Promise<FiredEvent> {\n\t\tif (event.listener.type === 'delete' && event.listener.trigger.selection) {\n\t\t\tconst input = this.convertSelectionNode(event.listener.trigger.selection)\n\n\t\t\tconst selection = await this.mapper.selectUnique(\n\t\t\t\tevent.entity,\n\t\t\t\tinput.withArg('by', {\n\t\t\t\t\t[event.entity.primary]: event.primary,\n\t\t\t\t}),\n\t\t\t\t[],\n\t\t\t)\n\t\t\treturn { ...event, selection }\n\t\t}\n\t\treturn event\n\t}\n\n\tprivate buildWatchEventPayloads(events: FiredEvent[], selections: Selections): ActionsPayload.WatchEventPayload[] {\n\t\tconst byPrimary: Record<Input.PrimaryValue, { primary: Input.PrimaryValue; events: FiredEvent[] }> = {}\n\t\tfor (const event of events) {\n\t\t\tbyPrimary[event.primary] ??= { primary: event.primary, events: [] }\n\t\t\tbyPrimary[event.primary].events.push(event)\n\t\t}\n\t\tconst payloads: ActionsPayload.WatchEventPayload[] = []\n\t\tfor (const eventsByPrimary of Object.values(byPrimary)) {\n\t\t\tconst baseEvents: ActionsPayload.BaseEventPayload[] = []\n\n\t\t\tconst existingEvents = new Set<string>()\n\t\t\tfor (const event of eventsByPrimary.events) {\n\t\t\t\tconst baseEvent = this.buildBaseEventPayloads(event)\n\t\t\t\tconst stringRepresentation = JSON.stringify(baseEvent)\n\t\t\t\tif (existingEvents.has(stringRepresentation)) {\n\t\t\t\t\tcontinue\n\t\t\t\t}\n\t\t\t\texistingEvents.add(stringRepresentation)\n\t\t\t\tbaseEvents.push(baseEvent)\n\t\t\t}\n\n\t\t\tpayloads.push({\n\t\t\t\toperation: 'watch',\n\t\t\t\ttrigger: events[0].listener.trigger.name,\n\t\t\t\tentity: events[0].entity.name,\n\t\t\t\tid: eventsByPrimary.primary,\n\t\t\t\tselection: eventsByPrimary.events.find(it => it.selection)?.selection\n\t\t\t\t\t?? selections[eventsByPrimary.primary],\n\t\t\t\tevents: baseEvents,\n\t\t\t})\n\t\t}\n\t\treturn payloads\n\t}\n\n\tprivate buildBaseEventPayloads(event: FiredEvent, selection?: any): ActionsPayload.BaseEventPayload {\n\t\tswitch (event.cause.type) {\n\t\t\tcase 'AfterInsertEvent':\n\t\t\t\treturn {\n\t\t\t\t\toperation: 'create',\n\t\t\t\t\tentity: event.cause.entity.name,\n\t\t\t\t\tid: event.cause.id,\n\t\t\t\t\tselection,\n\t\t\t\t\tvalues: Object.fromEntries(event.cause.data.map(it => [it.fieldName, it.value])),\n\t\t\t\t\tpath: 'path' in event.listener ? event.listener.path : undefined,\n\t\t\t\t\tnodes: event.nodes,\n\t\t\t\t}\n\t\t\tcase 'AfterUpdateEvent':\n\t\t\tcase 'BeforeUpdateEvent':\n\t\t\t\tconst afterEvent = event.cause.type === 'AfterUpdateEvent' ? event.cause : event.cause.afterEvent\n\t\t\t\tif (!afterEvent) {\n\t\t\t\t\tthrow new ImplementationException()\n\t\t\t\t}\n\t\t\t\treturn {\n\t\t\t\t\toperation: 'update',\n\t\t\t\t\tentity: event.cause.entity.name,\n\t\t\t\t\tid: event.cause.id,\n\t\t\t\t\tselection,\n\t\t\t\t\tvalues: Object.fromEntries(event.cause.data.map(it => [it.fieldName, it.value])),\n\t\t\t\t\tpath: 'path' in event.listener ? event.listener.path : undefined,\n\t\t\t\t\told: Object.fromEntries(afterEvent.data.map(it => [it.fieldName, it.old])),\n\t\t\t\t\tnodes: event.nodes,\n\t\t\t\t}\n\t\t\tcase 'BeforeDeleteEvent':\n\t\t\t\treturn {\n\t\t\t\t\toperation: 'delete',\n\t\t\t\t\tentity: event.cause.entity.name,\n\t\t\t\t\tid: event.cause.id,\n\t\t\t\t\tselection,\n\t\t\t\t\tpath: 'path' in event.listener ? event.listener.path : undefined,\n\t\t\t\t\tnodes: event.nodes,\n\t\t\t\t}\n\t\t\tcase 'AfterJunctionUpdateEvent':\n\t\t\t\tif (event.listener.type !== 'junction') {\n\t\t\t\t\tthrow new ImplementationException()\n\t\t\t\t}\n\t\t\t\tconst [id, inverseId] = event.listener.context.type === 'owning'\n\t\t\t\t\t? [event.cause.owningId, event.cause.inverseId]\n\t\t\t\t\t: [event.cause.inverseId, event.cause.owningId]\n\t\t\t\treturn {\n\t\t\t\t\toperation: event.cause.operation === 'connect' ? 'junction_connect' : 'junction_disconnect',\n\t\t\t\t\tentity: event.listener.context.entity.name,\n\t\t\t\t\trelation: event.listener.context.relation.name,\n\t\t\t\t\tid,\n\t\t\t\t\tinverseId,\n\t\t\t\t\tpath: 'path' in event.listener ? event.listener.path : undefined,\n\t\t\t\t\tnodes: event.nodes,\n\t\t\t\t}\n\t\t\tdefault:\n\t\t\t\tassertNever(event.cause, it => it.type)\n\t\t}\n\t}\n\n\tprivate async fetchSelection(events: FiredEvent[]): Promise<Selections> {\n\t\tconst trigger = events[0].listener.trigger\n\t\tif (!trigger.selection) {\n\t\t\treturn {}\n\t\t}\n\n\t\tconst ids = Array.from(new Set(events.filter(it => it.listener.type !== 'delete').map(it => it.primary)))\n\t\tif (ids.length === 0) {\n\t\t\treturn {}\n\t\t}\n\t\tconst entity = events[0].entity\n\t\tconst input = this.convertSelectionNode(trigger.selection).withArg('filter', {\n\t\t\t[entity.primary]: { in: ids },\n\t\t})\n\t\treturn await this.mapper.selectAssoc(entity, input, [], entity.primary)\n\t}\n\n\tprivate convertSelectionNode(node: Actions.SelectionNode, nodeName = 'root', path: string[] = []): ObjectNode<Input.ListQueryInput> {\n\t\treturn new ObjectNode(\n\t\t\tnodeName,\n\t\t\tnodeName,\n\t\t\tnode.map(it => {\n\t\t\t\tconst [field, args, selection] = Array.isArray(it) ? it : [it, undefined, undefined]\n\t\t\t\tif (selection === undefined || selection.length === 0) {\n\t\t\t\t\treturn new FieldNode(field, field, {})\n\t\t\t\t}\n\t\t\t\treturn this.convertSelectionNode(selection, field, [...path, nodeName]).withArgs(args)\n\t\t\t}),\n\t\t\t{},\n\t\t\t{},\n\t\t\tpath,\n\t\t)\n\t}\n}\n"],"names":["assertNever","ImplementationException","ObjectNode","FieldNode"],"mappings":";;;;;AAQO,MAAM,sBAAsB;AAAA,EAClC,YACkB,QAChB;AADgB,SAAA,SAAA;AAAA,EAElB;AAAA,EAEA,MAAa,MAAM,QAAiE;AACnF,UAAM,iBAAiB,OAAO,OAAO,CAAA,OAAM;AAC1C,aAAO,GAAG,MAAM,SAAS,uBACrB,GAAG,MAAM,YAAY,eAAe;AAAA,IACzC,CAAC;AACD,QAAI,eAAe,WAAW,GAAG;AAChC,aAAO,CAAA;AAAA,IACR;AACA,UAAM,aAAa,MAAM,KAAK,eAAe,cAAc;AAC3D,UAAM,cAAc,eAAe,CAAC,EAAE,SAAS,QAAQ;AACvD,QAAI,gBAAgB,SAAS;AAC5B,aAAO,eAAe,IAAI,CAAA,QAAO;AAAA,QAChC,SAAS,GAAG,SAAS,QAAQ;AAAA,QAC7B,GAAG,KAAK,uBAAuB,IAAI,GAAG,aAAa,WAAW,GAAG,OAAO,CAAC;AAAA,MAAA,EACxE;AAAA,IACH;AACA,QAAI,gBAAgB,SAAS;AAC5B,aAAO,KAAK,wBAAwB,gBAAgB,UAAU;AAAA,IAC/D;AACA,WAAOA,YAAAA,YAAY,WAAW;AAAA,EAC/B;AAAA,EAEA,MAAa,gBAAgB,OAAwC;AACpE,QAAI,MAAM,SAAS,SAAS,YAAY,MAAM,SAAS,QAAQ,WAAW;AACzE,YAAM,QAAQ,KAAK,qBAAqB,MAAM,SAAS,QAAQ,SAAS;AAExE,YAAM,YAAY,MAAM,KAAK,OAAO;AAAA,QACnC,MAAM;AAAA,QACN,MAAM,QAAQ,MAAM;AAAA,UACnB,CAAC,MAAM,OAAO,OAAO,GAAG,MAAM;AAAA,QAAA,CAC9B;AAAA,QACD,CAAA;AAAA,MAAC;AAEF,aAAO,EAAE,GAAG,OAAO,UAAA;AAAA,IACpB;AACA,WAAO;AAAA,EACR;AAAA,EAEQ,wBAAwB,QAAsB,YAA4D;AApDnH,QAAA;AAqDE,UAAM,YAA+F,CAAA;AACrG,eAAW,SAAS,QAAQ;AAC3B,gBAAA,KAAU,MAAM,aAAhB,UAAA,EAAA,IAA6B,EAAE,SAAS,MAAM,SAAS,QAAQ,CAAA,EAAC;AAChE,gBAAU,MAAM,OAAO,EAAE,OAAO,KAAK,KAAK;AAAA,IAC3C;AACA,UAAM,WAA+C,CAAA;AACrD,eAAW,mBAAmB,OAAO,OAAO,SAAS,GAAG;AACvD,YAAM,aAAgD,CAAA;AAEtD,YAAM,qCAAqB,IAAA;AAC3B,iBAAW,SAAS,gBAAgB,QAAQ;AAC3C,cAAM,YAAY,KAAK,uBAAuB,KAAK;AACnD,cAAM,uBAAuB,KAAK,UAAU,SAAS;AACrD,YAAI,eAAe,IAAI,oBAAoB,GAAG;AAC7C;AAAA,QACD;AACA,uBAAe,IAAI,oBAAoB;AACvC,mBAAW,KAAK,SAAS;AAAA,MAC1B;AAEA,eAAS,KAAK;AAAA,QACb,WAAW;AAAA,QACX,SAAS,OAAO,CAAC,EAAE,SAAS,QAAQ;AAAA,QACpC,QAAQ,OAAO,CAAC,EAAE,OAAO;AAAA,QACzB,IAAI,gBAAgB;AAAA,QACpB,WAAW,gBAAgB,OAAO,KAAK,CAAA,OAAM,GAAG,SAAS,GAAG,aACxD,WAAW,gBAAgB,OAAO;AAAA,QACtC,QAAQ;AAAA,MAAA,CACR;AAAA,IACF;AACA,WAAO;AAAA,EACR;AAAA,EAEQ,uBAAuB,OAAmB,WAAkD;AACnG,YAAQ,MAAM,MAAM,MAAA;AAAA,MACnB,KAAK;AACJ,eAAO;AAAA,UACN,WAAW;AAAA,UACX,QAAQ,MAAM,MAAM,OAAO;AAAA,UAC3B,IAAI,MAAM,MAAM;AAAA,UAChB;AAAA,UACA,QAAQ,OAAO,YAAY,MAAM,MAAM,KAAK,IAAI,CAAA,OAAM,CAAC,GAAG,WAAW,GAAG,KAAK,CAAC,CAAC;AAAA,UAC/E,MAAM,UAAU,MAAM,WAAW,MAAM,SAAS,OAAO;AAAA,UACvD,OAAO,MAAM;AAAA,QAAA;AAAA,MAEf,KAAK;AAAA,MACL,KAAK;AACJ,cAAM,aAAa,MAAM,MAAM,SAAS,qBAAqB,MAAM,QAAQ,MAAM,MAAM;AACvF,YAAI,CAAC,YAAY;AAChB,gBAAM,IAAIC,wBAAAA,wBAAA;AAAA,QACX;AACA,eAAO;AAAA,UACN,WAAW;AAAA,UACX,QAAQ,MAAM,MAAM,OAAO;AAAA,UAC3B,IAAI,MAAM,MAAM;AAAA,UAChB;AAAA,UACA,QAAQ,OAAO,YAAY,MAAM,MAAM,KAAK,IAAI,CAAA,OAAM,CAAC,GAAG,WAAW,GAAG,KAAK,CAAC,CAAC;AAAA,UAC/E,MAAM,UAAU,MAAM,WAAW,MAAM,SAAS,OAAO;AAAA,UACvD,KAAK,OAAO,YAAY,WAAW,KAAK,IAAI,CAAA,OAAM,CAAC,GAAG,WAAW,GAAG,GAAG,CAAC,CAAC;AAAA,UACzE,OAAO,MAAM;AAAA,QAAA;AAAA,MAEf,KAAK;AACJ,eAAO;AAAA,UACN,WAAW;AAAA,UACX,QAAQ,MAAM,MAAM,OAAO;AAAA,UAC3B,IAAI,MAAM,MAAM;AAAA,UAChB;AAAA,UACA,MAAM,UAAU,MAAM,WAAW,MAAM,SAAS,OAAO;AAAA,UACvD,OAAO,MAAM;AAAA,QAAA;AAAA,MAEf,KAAK;AACJ,YAAI,MAAM,SAAS,SAAS,YAAY;AACvC,gBAAM,IAAIA,wBAAAA,wBAAA;AAAA,QACX;AACA,cAAM,CAAC,IAAI,SAAS,IAAI,MAAM,SAAS,QAAQ,SAAS,WACrD,CAAC,MAAM,MAAM,UAAU,MAAM,MAAM,SAAS,IAC5C,CAAC,MAAM,MAAM,WAAW,MAAM,MAAM,QAAQ;AAC/C,eAAO;AAAA,UACN,WAAW,MAAM,MAAM,cAAc,YAAY,qBAAqB;AAAA,UACtE,QAAQ,MAAM,SAAS,QAAQ,OAAO;AAAA,UACtC,UAAU,MAAM,SAAS,QAAQ,SAAS;AAAA,UAC1C;AAAA,UACA;AAAA,UACA,MAAM,UAAU,MAAM,WAAW,MAAM,SAAS,OAAO;AAAA,UACvD,OAAO,MAAM;AAAA,QAAA;AAAA,MAEf;AACCD,oBAAAA,YAAY,MAAM,OAAO,CAAA,OAAM,GAAG,IAAI;AAAA,IAAA;AAAA,EAEzC;AAAA,EAEA,MAAc,eAAe,QAA2C;AACvE,UAAM,UAAU,OAAO,CAAC,EAAE,SAAS;AACnC,QAAI,CAAC,QAAQ,WAAW;AACvB,aAAO,CAAA;AAAA,IACR;AAEA,UAAM,MAAM,MAAM,KAAK,IAAI,IAAI,OAAO,OAAO,CAAA,OAAM,GAAG,SAAS,SAAS,QAAQ,EAAE,IAAI,QAAM,GAAG,OAAO,CAAC,CAAC;AACxG,QAAI,IAAI,WAAW,GAAG;AACrB,aAAO,CAAA;AAAA,IACR;AACA,UAAM,SAAS,OAAO,CAAC,EAAE;AACzB,UAAM,QAAQ,KAAK,qBAAqB,QAAQ,SAAS,EAAE,QAAQ,UAAU;AAAA,MAC5E,CAAC,OAAO,OAAO,GAAG,EAAE,IAAI,IAAA;AAAA,IAAI,CAC5B;AACD,WAAO,MAAM,KAAK,OAAO,YAAY,QAAQ,OAAO,CAAA,GAAI,OAAO,OAAO;AAAA,EACvE;AAAA,EAEQ,qBAAqB,MAA6B,WAAW,QAAQ,OAAiB,CAAA,GAAsC;AACnI,WAAO,IAAIE,iBAAAA;AAAAA,MACV;AAAA,MACA;AAAA,MACA,KAAK,IAAI,CAAA,OAAM;AACd,cAAM,CAAC,OAAO,MAAM,SAAS,IAAI,MAAM,QAAQ,EAAE,IAAI,KAAK,CAAC,IAAI,QAAW,MAAS;AACnF,YAAI,cAAc,UAAa,UAAU,WAAW,GAAG;AACtD,iBAAO,IAAIC,iBAAAA,UAAU,OAAO,OAAO,CAAA,CAAE;AAAA,QACtC;AACA,eAAO,KAAK,qBAAqB,WAAW,OAAO,CAAC,GAAG,MAAM,QAAQ,CAAC,EAAE,SAAS,IAAI;AAAA,MACtF,CAAC;AAAA,MACD,CAAA;AAAA,MACA,CAAA;AAAA,MACA;AAAA,IAAA;AAAA,EAEF;AACD;;"}
1
+ {"version":3,"file":"TriggerPayloadBuilder.cjs","sources":["../../../../../packages/engine-actions/src/triggers/TriggerPayloadBuilder.ts"],"sourcesContent":["import { ImplementationException } from '../ImplementationException.js'\nimport { assertNever } from '../utils/assertNever.js'\nimport { FiredEvent } from './TriggerPayloadManager.js'\nimport { Actions, ActionsPayload, Input } from '@contember/schema'\nimport { FieldNode, Mapper, ObjectNode } from '@contember/engine-content-api'\n\ntype Selections = Record<Input.PrimaryValue, any>\n\nexport class TriggerPayloadBuilder {\n\tconstructor(\n\t\tprivate readonly mapper: Mapper,\n\t) {\n\t}\n\n\tpublic async build(events: FiredEvent[]): Promise<ActionsPayload.AnyEventPayload[]> {\n\t\tconst filteredEvents = events.filter(it => {\n\t\t\treturn it.cause.type !== 'BeforeUpdateEvent'\n\t\t\t\t|| it.cause.afterEvent?.hasChanges === true\n\t\t})\n\t\tif (filteredEvents.length === 0) {\n\t\t\treturn []\n\t\t}\n\t\tconst selections = await this.fetchSelection(filteredEvents)\n\t\tconst triggerType = filteredEvents[0].listener.trigger.type\n\t\tif (triggerType === 'basic') {\n\t\t\treturn filteredEvents.map(it => ({\n\t\t\t\ttrigger: it.listener.trigger.name,\n\t\t\t\t...this.buildBaseEventPayloads(it, it.selection ?? selections[it.primary]),\n\t\t\t}))\n\t\t}\n\t\tif (triggerType === 'watch') {\n\t\t\treturn this.buildWatchEventPayloads(filteredEvents, selections)\n\t\t}\n\t\treturn assertNever(triggerType)\n\t}\n\n\tpublic async preprocessEvent(event: FiredEvent): Promise<FiredEvent> {\n\t\tif (event.listener.type === 'delete' && event.listener.trigger.selection) {\n\t\t\tconst input = this.convertSelectionNode(event.listener.trigger.selection)\n\n\t\t\tconst selection = await this.mapper.selectUnique(\n\t\t\t\tevent.entity,\n\t\t\t\tinput.withArg('by', {\n\t\t\t\t\t[event.entity.primary]: event.primary,\n\t\t\t\t}),\n\t\t\t\t[],\n\t\t\t)\n\t\t\treturn { ...event, selection }\n\t\t}\n\t\treturn event\n\t}\n\n\tprivate buildWatchEventPayloads(events: FiredEvent[], selections: Selections): ActionsPayload.WatchEventPayload[] {\n\t\tconst byPrimary: Record<Input.PrimaryValue, { primary: Input.PrimaryValue; events: FiredEvent[] }> = {}\n\t\tfor (const event of events) {\n\t\t\tbyPrimary[event.primary] ??= { primary: event.primary, events: [] }\n\t\t\tbyPrimary[event.primary].events.push(event)\n\t\t}\n\t\tconst payloads: ActionsPayload.WatchEventPayload[] = []\n\t\tfor (const eventsByPrimary of Object.values(byPrimary)) {\n\t\t\tconst baseEvents: ActionsPayload.BaseEventPayload[] = []\n\n\t\t\tconst existingEvents = new Set<string>()\n\t\t\tfor (const event of eventsByPrimary.events) {\n\t\t\t\tconst baseEvent = this.buildBaseEventPayloads(event)\n\t\t\t\tconst stringRepresentation = JSON.stringify(baseEvent)\n\t\t\t\tif (existingEvents.has(stringRepresentation)) {\n\t\t\t\t\tcontinue\n\t\t\t\t}\n\t\t\t\texistingEvents.add(stringRepresentation)\n\t\t\t\tbaseEvents.push(baseEvent)\n\t\t\t}\n\n\t\t\tpayloads.push({\n\t\t\t\toperation: 'watch',\n\t\t\t\ttrigger: events[0].listener.trigger.name,\n\t\t\t\tentity: events[0].entity.name,\n\t\t\t\tid: eventsByPrimary.primary,\n\t\t\t\tselection: eventsByPrimary.events.find(it => it.selection)?.selection\n\t\t\t\t\t?? selections[eventsByPrimary.primary],\n\t\t\t\tevents: baseEvents,\n\t\t\t})\n\t\t}\n\t\treturn payloads\n\t}\n\n\tprivate buildBaseEventPayloads(event: FiredEvent, selection?: any): ActionsPayload.BaseEventPayload {\n\t\tswitch (event.cause.type) {\n\t\t\tcase 'AfterInsertEvent':\n\t\t\t\treturn {\n\t\t\t\t\toperation: 'create',\n\t\t\t\t\tentity: event.cause.entity.name,\n\t\t\t\t\tid: event.cause.id,\n\t\t\t\t\tselection,\n\t\t\t\t\tvalues: Object.fromEntries(event.cause.data.map(it => [it.fieldName, it.value])),\n\t\t\t\t\tpath: 'path' in event.listener ? event.listener.path : undefined,\n\t\t\t\t\tnodes: event.nodes,\n\t\t\t\t}\n\t\t\tcase 'AfterUpdateEvent':\n\t\t\tcase 'BeforeUpdateEvent':\n\t\t\t\tconst afterEvent = event.cause.type === 'AfterUpdateEvent' ? event.cause : event.cause.afterEvent\n\t\t\t\tif (!afterEvent) {\n\t\t\t\t\tthrow new ImplementationException()\n\t\t\t\t}\n\t\t\t\treturn {\n\t\t\t\t\toperation: 'update',\n\t\t\t\t\tentity: event.cause.entity.name,\n\t\t\t\t\tid: event.cause.id,\n\t\t\t\t\tselection,\n\t\t\t\t\tvalues: Object.fromEntries(event.cause.data.map(it => [it.fieldName, it.value])),\n\t\t\t\t\tpath: 'path' in event.listener ? event.listener.path : undefined,\n\t\t\t\t\told: Object.fromEntries(afterEvent.data.map(it => [it.fieldName, it.old])),\n\t\t\t\t\tnodes: event.nodes,\n\t\t\t\t}\n\t\t\tcase 'BeforeDeleteEvent':\n\t\t\t\treturn {\n\t\t\t\t\toperation: 'delete',\n\t\t\t\t\tentity: event.cause.entity.name,\n\t\t\t\t\tid: event.cause.id,\n\t\t\t\t\tselection,\n\t\t\t\t\tpath: 'path' in event.listener ? event.listener.path : undefined,\n\t\t\t\t\tnodes: event.nodes,\n\t\t\t\t}\n\t\t\tcase 'AfterJunctionUpdateEvent':\n\t\t\t\tif (event.listener.type !== 'junction') {\n\t\t\t\t\tthrow new ImplementationException()\n\t\t\t\t}\n\t\t\t\tconst [id, inverseId] = event.listener.context.type === 'owning'\n\t\t\t\t\t? [event.cause.owningId, event.cause.inverseId]\n\t\t\t\t\t: [event.cause.inverseId, event.cause.owningId]\n\t\t\t\treturn {\n\t\t\t\t\toperation: event.cause.operation === 'connect' ? 'junction_connect' : 'junction_disconnect',\n\t\t\t\t\tentity: event.listener.context.entity.name,\n\t\t\t\t\trelation: event.listener.context.relation.name,\n\t\t\t\t\tid,\n\t\t\t\t\tinverseId,\n\t\t\t\t\tpath: 'path' in event.listener ? event.listener.path : undefined,\n\t\t\t\t\tnodes: event.nodes,\n\t\t\t\t}\n\t\t\tdefault:\n\t\t\t\tassertNever(event.cause, it => it.type)\n\t\t}\n\t}\n\n\tprivate async fetchSelection(events: FiredEvent[]): Promise<Selections> {\n\t\tconst trigger = events[0].listener.trigger\n\t\tif (!trigger.selection) {\n\t\t\treturn {}\n\t\t}\n\n\t\tconst ids = Array.from(new Set(events.filter(it => it.listener.type !== 'delete').map(it => it.primary)))\n\t\tif (ids.length === 0) {\n\t\t\treturn {}\n\t\t}\n\t\tconst entity = events[0].entity\n\t\tconst input = this.convertSelectionNode(trigger.selection).withArg('filter', {\n\t\t\t[entity.primary]: { in: ids },\n\t\t})\n\t\treturn await this.mapper.selectAssoc(entity, input, [], entity.primary)\n\t}\n\n\tprivate convertSelectionNode(node: Actions.SelectionNode, nodeName = 'root', path: string[] = []): ObjectNode<Input.ListQueryInput> {\n\t\treturn new ObjectNode(\n\t\t\tnodeName,\n\t\t\tnodeName,\n\t\t\tnode.map(it => {\n\t\t\t\tconst [field, args, selection] = Array.isArray(it) ? it : [it, undefined, undefined]\n\t\t\t\tif (selection === undefined || selection.length === 0) {\n\t\t\t\t\treturn new FieldNode(field, field, {})\n\t\t\t\t}\n\t\t\t\treturn this.convertSelectionNode(selection, field, [...path, nodeName]).withArgs(args)\n\t\t\t}),\n\t\t\t{},\n\t\t\t{},\n\t\t\tpath,\n\t\t)\n\t}\n}\n"],"names":["assertNever","ImplementationException","ObjectNode","FieldNode"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"TriggerPayloadBuilder.js","sources":["../../../../../packages/engine-actions/src/triggers/TriggerPayloadBuilder.ts"],"sourcesContent":["import { ImplementationException } from '../ImplementationException'\nimport { assertNever } from '../utils/assertNever'\nimport { FiredEvent } from './TriggerPayloadManager'\nimport { Actions, ActionsPayload, Input } from '@contember/schema'\nimport { FieldNode, Mapper, ObjectNode } from '@contember/engine-content-api'\n\ntype Selections = Record<Input.PrimaryValue, any>\n\nexport class TriggerPayloadBuilder {\n\tconstructor(\n\t\tprivate readonly mapper: Mapper,\n\t) {\n\t}\n\n\tpublic async build(events: FiredEvent[]): Promise<ActionsPayload.AnyEventPayload[]> {\n\t\tconst filteredEvents = events.filter(it => {\n\t\t\treturn it.cause.type !== 'BeforeUpdateEvent'\n\t\t\t\t|| it.cause.afterEvent?.hasChanges === true\n\t\t})\n\t\tif (filteredEvents.length === 0) {\n\t\t\treturn []\n\t\t}\n\t\tconst selections = await this.fetchSelection(filteredEvents)\n\t\tconst triggerType = filteredEvents[0].listener.trigger.type\n\t\tif (triggerType === 'basic') {\n\t\t\treturn filteredEvents.map(it => ({\n\t\t\t\ttrigger: it.listener.trigger.name,\n\t\t\t\t...this.buildBaseEventPayloads(it, it.selection ?? selections[it.primary]),\n\t\t\t}))\n\t\t}\n\t\tif (triggerType === 'watch') {\n\t\t\treturn this.buildWatchEventPayloads(filteredEvents, selections)\n\t\t}\n\t\treturn assertNever(triggerType)\n\t}\n\n\tpublic async preprocessEvent(event: FiredEvent): Promise<FiredEvent> {\n\t\tif (event.listener.type === 'delete' && event.listener.trigger.selection) {\n\t\t\tconst input = this.convertSelectionNode(event.listener.trigger.selection)\n\n\t\t\tconst selection = await this.mapper.selectUnique(\n\t\t\t\tevent.entity,\n\t\t\t\tinput.withArg('by', {\n\t\t\t\t\t[event.entity.primary]: event.primary,\n\t\t\t\t}),\n\t\t\t\t[],\n\t\t\t)\n\t\t\treturn { ...event, selection }\n\t\t}\n\t\treturn event\n\t}\n\n\tprivate buildWatchEventPayloads(events: FiredEvent[], selections: Selections): ActionsPayload.WatchEventPayload[] {\n\t\tconst byPrimary: Record<Input.PrimaryValue, { primary: Input.PrimaryValue; events: FiredEvent[] }> = {}\n\t\tfor (const event of events) {\n\t\t\tbyPrimary[event.primary] ??= { primary: event.primary, events: [] }\n\t\t\tbyPrimary[event.primary].events.push(event)\n\t\t}\n\t\tconst payloads: ActionsPayload.WatchEventPayload[] = []\n\t\tfor (const eventsByPrimary of Object.values(byPrimary)) {\n\t\t\tconst baseEvents: ActionsPayload.BaseEventPayload[] = []\n\n\t\t\tconst existingEvents = new Set<string>()\n\t\t\tfor (const event of eventsByPrimary.events) {\n\t\t\t\tconst baseEvent = this.buildBaseEventPayloads(event)\n\t\t\t\tconst stringRepresentation = JSON.stringify(baseEvent)\n\t\t\t\tif (existingEvents.has(stringRepresentation)) {\n\t\t\t\t\tcontinue\n\t\t\t\t}\n\t\t\t\texistingEvents.add(stringRepresentation)\n\t\t\t\tbaseEvents.push(baseEvent)\n\t\t\t}\n\n\t\t\tpayloads.push({\n\t\t\t\toperation: 'watch',\n\t\t\t\ttrigger: events[0].listener.trigger.name,\n\t\t\t\tentity: events[0].entity.name,\n\t\t\t\tid: eventsByPrimary.primary,\n\t\t\t\tselection: eventsByPrimary.events.find(it => it.selection)?.selection\n\t\t\t\t\t?? selections[eventsByPrimary.primary],\n\t\t\t\tevents: baseEvents,\n\t\t\t})\n\t\t}\n\t\treturn payloads\n\t}\n\n\tprivate buildBaseEventPayloads(event: FiredEvent, selection?: any): ActionsPayload.BaseEventPayload {\n\t\tswitch (event.cause.type) {\n\t\t\tcase 'AfterInsertEvent':\n\t\t\t\treturn {\n\t\t\t\t\toperation: 'create',\n\t\t\t\t\tentity: event.cause.entity.name,\n\t\t\t\t\tid: event.cause.id,\n\t\t\t\t\tselection,\n\t\t\t\t\tvalues: Object.fromEntries(event.cause.data.map(it => [it.fieldName, it.value])),\n\t\t\t\t\tpath: 'path' in event.listener ? event.listener.path : undefined,\n\t\t\t\t\tnodes: event.nodes,\n\t\t\t\t}\n\t\t\tcase 'AfterUpdateEvent':\n\t\t\tcase 'BeforeUpdateEvent':\n\t\t\t\tconst afterEvent = event.cause.type === 'AfterUpdateEvent' ? event.cause : event.cause.afterEvent\n\t\t\t\tif (!afterEvent) {\n\t\t\t\t\tthrow new ImplementationException()\n\t\t\t\t}\n\t\t\t\treturn {\n\t\t\t\t\toperation: 'update',\n\t\t\t\t\tentity: event.cause.entity.name,\n\t\t\t\t\tid: event.cause.id,\n\t\t\t\t\tselection,\n\t\t\t\t\tvalues: Object.fromEntries(event.cause.data.map(it => [it.fieldName, it.value])),\n\t\t\t\t\tpath: 'path' in event.listener ? event.listener.path : undefined,\n\t\t\t\t\told: Object.fromEntries(afterEvent.data.map(it => [it.fieldName, it.old])),\n\t\t\t\t\tnodes: event.nodes,\n\t\t\t\t}\n\t\t\tcase 'BeforeDeleteEvent':\n\t\t\t\treturn {\n\t\t\t\t\toperation: 'delete',\n\t\t\t\t\tentity: event.cause.entity.name,\n\t\t\t\t\tid: event.cause.id,\n\t\t\t\t\tselection,\n\t\t\t\t\tpath: 'path' in event.listener ? event.listener.path : undefined,\n\t\t\t\t\tnodes: event.nodes,\n\t\t\t\t}\n\t\t\tcase 'AfterJunctionUpdateEvent':\n\t\t\t\tif (event.listener.type !== 'junction') {\n\t\t\t\t\tthrow new ImplementationException()\n\t\t\t\t}\n\t\t\t\tconst [id, inverseId] = event.listener.context.type === 'owning'\n\t\t\t\t\t? [event.cause.owningId, event.cause.inverseId]\n\t\t\t\t\t: [event.cause.inverseId, event.cause.owningId]\n\t\t\t\treturn {\n\t\t\t\t\toperation: event.cause.operation === 'connect' ? 'junction_connect' : 'junction_disconnect',\n\t\t\t\t\tentity: event.listener.context.entity.name,\n\t\t\t\t\trelation: event.listener.context.relation.name,\n\t\t\t\t\tid,\n\t\t\t\t\tinverseId,\n\t\t\t\t\tpath: 'path' in event.listener ? event.listener.path : undefined,\n\t\t\t\t\tnodes: event.nodes,\n\t\t\t\t}\n\t\t\tdefault:\n\t\t\t\tassertNever(event.cause, it => it.type)\n\t\t}\n\t}\n\n\tprivate async fetchSelection(events: FiredEvent[]): Promise<Selections> {\n\t\tconst trigger = events[0].listener.trigger\n\t\tif (!trigger.selection) {\n\t\t\treturn {}\n\t\t}\n\n\t\tconst ids = Array.from(new Set(events.filter(it => it.listener.type !== 'delete').map(it => it.primary)))\n\t\tif (ids.length === 0) {\n\t\t\treturn {}\n\t\t}\n\t\tconst entity = events[0].entity\n\t\tconst input = this.convertSelectionNode(trigger.selection).withArg('filter', {\n\t\t\t[entity.primary]: { in: ids },\n\t\t})\n\t\treturn await this.mapper.selectAssoc(entity, input, [], entity.primary)\n\t}\n\n\tprivate convertSelectionNode(node: Actions.SelectionNode, nodeName = 'root', path: string[] = []): ObjectNode<Input.ListQueryInput> {\n\t\treturn new ObjectNode(\n\t\t\tnodeName,\n\t\t\tnodeName,\n\t\t\tnode.map(it => {\n\t\t\t\tconst [field, args, selection] = Array.isArray(it) ? it : [it, undefined, undefined]\n\t\t\t\tif (selection === undefined || selection.length === 0) {\n\t\t\t\t\treturn new FieldNode(field, field, {})\n\t\t\t\t}\n\t\t\t\treturn this.convertSelectionNode(selection, field, [...path, nodeName]).withArgs(args)\n\t\t\t}),\n\t\t\t{},\n\t\t\t{},\n\t\t\tpath,\n\t\t)\n\t}\n}\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"TriggerPayloadBuilder.js","sources":["../../../../../packages/engine-actions/src/triggers/TriggerPayloadBuilder.ts"],"sourcesContent":["import { ImplementationException } from '../ImplementationException.js'\nimport { assertNever } from '../utils/assertNever.js'\nimport { FiredEvent } from './TriggerPayloadManager.js'\nimport { Actions, ActionsPayload, Input } from '@contember/schema'\nimport { FieldNode, Mapper, ObjectNode } from '@contember/engine-content-api'\n\ntype Selections = Record<Input.PrimaryValue, any>\n\nexport class TriggerPayloadBuilder {\n\tconstructor(\n\t\tprivate readonly mapper: Mapper,\n\t) {\n\t}\n\n\tpublic async build(events: FiredEvent[]): Promise<ActionsPayload.AnyEventPayload[]> {\n\t\tconst filteredEvents = events.filter(it => {\n\t\t\treturn it.cause.type !== 'BeforeUpdateEvent'\n\t\t\t\t|| it.cause.afterEvent?.hasChanges === true\n\t\t})\n\t\tif (filteredEvents.length === 0) {\n\t\t\treturn []\n\t\t}\n\t\tconst selections = await this.fetchSelection(filteredEvents)\n\t\tconst triggerType = filteredEvents[0].listener.trigger.type\n\t\tif (triggerType === 'basic') {\n\t\t\treturn filteredEvents.map(it => ({\n\t\t\t\ttrigger: it.listener.trigger.name,\n\t\t\t\t...this.buildBaseEventPayloads(it, it.selection ?? selections[it.primary]),\n\t\t\t}))\n\t\t}\n\t\tif (triggerType === 'watch') {\n\t\t\treturn this.buildWatchEventPayloads(filteredEvents, selections)\n\t\t}\n\t\treturn assertNever(triggerType)\n\t}\n\n\tpublic async preprocessEvent(event: FiredEvent): Promise<FiredEvent> {\n\t\tif (event.listener.type === 'delete' && event.listener.trigger.selection) {\n\t\t\tconst input = this.convertSelectionNode(event.listener.trigger.selection)\n\n\t\t\tconst selection = await this.mapper.selectUnique(\n\t\t\t\tevent.entity,\n\t\t\t\tinput.withArg('by', {\n\t\t\t\t\t[event.entity.primary]: event.primary,\n\t\t\t\t}),\n\t\t\t\t[],\n\t\t\t)\n\t\t\treturn { ...event, selection }\n\t\t}\n\t\treturn event\n\t}\n\n\tprivate buildWatchEventPayloads(events: FiredEvent[], selections: Selections): ActionsPayload.WatchEventPayload[] {\n\t\tconst byPrimary: Record<Input.PrimaryValue, { primary: Input.PrimaryValue; events: FiredEvent[] }> = {}\n\t\tfor (const event of events) {\n\t\t\tbyPrimary[event.primary] ??= { primary: event.primary, events: [] }\n\t\t\tbyPrimary[event.primary].events.push(event)\n\t\t}\n\t\tconst payloads: ActionsPayload.WatchEventPayload[] = []\n\t\tfor (const eventsByPrimary of Object.values(byPrimary)) {\n\t\t\tconst baseEvents: ActionsPayload.BaseEventPayload[] = []\n\n\t\t\tconst existingEvents = new Set<string>()\n\t\t\tfor (const event of eventsByPrimary.events) {\n\t\t\t\tconst baseEvent = this.buildBaseEventPayloads(event)\n\t\t\t\tconst stringRepresentation = JSON.stringify(baseEvent)\n\t\t\t\tif (existingEvents.has(stringRepresentation)) {\n\t\t\t\t\tcontinue\n\t\t\t\t}\n\t\t\t\texistingEvents.add(stringRepresentation)\n\t\t\t\tbaseEvents.push(baseEvent)\n\t\t\t}\n\n\t\t\tpayloads.push({\n\t\t\t\toperation: 'watch',\n\t\t\t\ttrigger: events[0].listener.trigger.name,\n\t\t\t\tentity: events[0].entity.name,\n\t\t\t\tid: eventsByPrimary.primary,\n\t\t\t\tselection: eventsByPrimary.events.find(it => it.selection)?.selection\n\t\t\t\t\t?? selections[eventsByPrimary.primary],\n\t\t\t\tevents: baseEvents,\n\t\t\t})\n\t\t}\n\t\treturn payloads\n\t}\n\n\tprivate buildBaseEventPayloads(event: FiredEvent, selection?: any): ActionsPayload.BaseEventPayload {\n\t\tswitch (event.cause.type) {\n\t\t\tcase 'AfterInsertEvent':\n\t\t\t\treturn {\n\t\t\t\t\toperation: 'create',\n\t\t\t\t\tentity: event.cause.entity.name,\n\t\t\t\t\tid: event.cause.id,\n\t\t\t\t\tselection,\n\t\t\t\t\tvalues: Object.fromEntries(event.cause.data.map(it => [it.fieldName, it.value])),\n\t\t\t\t\tpath: 'path' in event.listener ? event.listener.path : undefined,\n\t\t\t\t\tnodes: event.nodes,\n\t\t\t\t}\n\t\t\tcase 'AfterUpdateEvent':\n\t\t\tcase 'BeforeUpdateEvent':\n\t\t\t\tconst afterEvent = event.cause.type === 'AfterUpdateEvent' ? event.cause : event.cause.afterEvent\n\t\t\t\tif (!afterEvent) {\n\t\t\t\t\tthrow new ImplementationException()\n\t\t\t\t}\n\t\t\t\treturn {\n\t\t\t\t\toperation: 'update',\n\t\t\t\t\tentity: event.cause.entity.name,\n\t\t\t\t\tid: event.cause.id,\n\t\t\t\t\tselection,\n\t\t\t\t\tvalues: Object.fromEntries(event.cause.data.map(it => [it.fieldName, it.value])),\n\t\t\t\t\tpath: 'path' in event.listener ? event.listener.path : undefined,\n\t\t\t\t\told: Object.fromEntries(afterEvent.data.map(it => [it.fieldName, it.old])),\n\t\t\t\t\tnodes: event.nodes,\n\t\t\t\t}\n\t\t\tcase 'BeforeDeleteEvent':\n\t\t\t\treturn {\n\t\t\t\t\toperation: 'delete',\n\t\t\t\t\tentity: event.cause.entity.name,\n\t\t\t\t\tid: event.cause.id,\n\t\t\t\t\tselection,\n\t\t\t\t\tpath: 'path' in event.listener ? event.listener.path : undefined,\n\t\t\t\t\tnodes: event.nodes,\n\t\t\t\t}\n\t\t\tcase 'AfterJunctionUpdateEvent':\n\t\t\t\tif (event.listener.type !== 'junction') {\n\t\t\t\t\tthrow new ImplementationException()\n\t\t\t\t}\n\t\t\t\tconst [id, inverseId] = event.listener.context.type === 'owning'\n\t\t\t\t\t? [event.cause.owningId, event.cause.inverseId]\n\t\t\t\t\t: [event.cause.inverseId, event.cause.owningId]\n\t\t\t\treturn {\n\t\t\t\t\toperation: event.cause.operation === 'connect' ? 'junction_connect' : 'junction_disconnect',\n\t\t\t\t\tentity: event.listener.context.entity.name,\n\t\t\t\t\trelation: event.listener.context.relation.name,\n\t\t\t\t\tid,\n\t\t\t\t\tinverseId,\n\t\t\t\t\tpath: 'path' in event.listener ? event.listener.path : undefined,\n\t\t\t\t\tnodes: event.nodes,\n\t\t\t\t}\n\t\t\tdefault:\n\t\t\t\tassertNever(event.cause, it => it.type)\n\t\t}\n\t}\n\n\tprivate async fetchSelection(events: FiredEvent[]): Promise<Selections> {\n\t\tconst trigger = events[0].listener.trigger\n\t\tif (!trigger.selection) {\n\t\t\treturn {}\n\t\t}\n\n\t\tconst ids = Array.from(new Set(events.filter(it => it.listener.type !== 'delete').map(it => it.primary)))\n\t\tif (ids.length === 0) {\n\t\t\treturn {}\n\t\t}\n\t\tconst entity = events[0].entity\n\t\tconst input = this.convertSelectionNode(trigger.selection).withArg('filter', {\n\t\t\t[entity.primary]: { in: ids },\n\t\t})\n\t\treturn await this.mapper.selectAssoc(entity, input, [], entity.primary)\n\t}\n\n\tprivate convertSelectionNode(node: Actions.SelectionNode, nodeName = 'root', path: string[] = []): ObjectNode<Input.ListQueryInput> {\n\t\treturn new ObjectNode(\n\t\t\tnodeName,\n\t\t\tnodeName,\n\t\t\tnode.map(it => {\n\t\t\t\tconst [field, args, selection] = Array.isArray(it) ? it : [it, undefined, undefined]\n\t\t\t\tif (selection === undefined || selection.length === 0) {\n\t\t\t\t\treturn new FieldNode(field, field, {})\n\t\t\t\t}\n\t\t\t\treturn this.convertSelectionNode(selection, field, [...path, nodeName]).withArgs(args)\n\t\t\t}),\n\t\t\t{},\n\t\t\t{},\n\t\t\tpath,\n\t\t)\n\t}\n}\n"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"TriggerPayloadManager.cjs","sources":["../../../../../packages/engine-actions/src/triggers/TriggerPayloadManager.ts"],"sourcesContent":["import { Actions, ActionsPayload, Input, Model } from '@contember/schema'\nimport { AnyListener } from './TriggerListenersStore'\nimport { EventCause } from './TriggerHandler'\nimport { TriggerPayloadBuilder } from './TriggerPayloadBuilder'\nimport { TriggerPayloadPersister } from './TriggerPayloadPersister'\n\nexport interface FiredEvent {\n\tlistener: AnyListener\n\tcause: EventCause\n\tentity: Model.Entity\n\tprimary: Input.PrimaryValue\n\tselection?: any\n\tnodes?: ActionsPayload.EntityEventPathNode[]\n}\n\nexport class TriggerPayloadManager {\n\tprivate eventsByTrigger: Record<string, FiredEvent[]> = {}\n\n\tconstructor(\n\t\tprivate readonly triggerPayloadBuilder: TriggerPayloadBuilder,\n\t\tprivate readonly triggerPayloadPersister: TriggerPayloadPersister,\n\t) {\n\t}\n\n\tpublic async add(firedEvent: FiredEvent) {\n\t\tconst event = await this.triggerPayloadBuilder.preprocessEvent(firedEvent)\n\t\tthis.eventsByTrigger[firedEvent.listener.trigger.name] ??= []\n\t\tthis.eventsByTrigger[firedEvent.listener.trigger.name].push(event)\n\t}\n\n\tpublic async persist(): Promise<void> {\n\t\tfor (const events of Object.values(this.eventsByTrigger)) {\n\t\t\tconst payloads = await this.triggerPayloadBuilder.build(events)\n\t\t\tconst trigger = events[0].listener.trigger\n\t\t\tawait this.triggerPayloadPersister.persist(trigger, payloads)\n\t\t}\n\t}\n}\n"],"names":[],"mappings":";;;;;AAeO,MAAM,sBAAsB;AAAA,EAGlC,YACkB,uBACA,yBAChB;AAFgB,SAAA,wBAAA;AACA,SAAA,0BAAA;AAJlB,kBAAA,MAAQ,mBAAgD,EAAC;AAAA,EAMzD;AAAA,EAEA,MAAa,IAAI,YAAwB;AAxB1C,QAAA,IAAA;AAyBE,UAAM,QAAQ,MAAM,KAAK,sBAAsB,gBAAgB,UAAU;AACzE,KAAA,KAAA,KAAK,iBAAL,KAAqB,WAAW,SAAS,QAAQ,IAAA,MAAjD,SAA2D,CAAA;AAC3D,SAAK,gBAAgB,WAAW,SAAS,QAAQ,IAAI,EAAE,KAAK,KAAK;AAAA,EAClE;AAAA,EAEA,MAAa,UAAyB;AACrC,eAAW,UAAU,OAAO,OAAO,KAAK,eAAe,GAAG;AACzD,YAAM,WAAW,MAAM,KAAK,sBAAsB,MAAM,MAAM;AAC9D,YAAM,UAAU,OAAO,CAAC,EAAE,SAAS;AACnC,YAAM,KAAK,wBAAwB,QAAQ,SAAS,QAAQ;AAAA,IAC7D;AAAA,EACD;AACD;;"}
1
+ {"version":3,"file":"TriggerPayloadManager.cjs","sources":["../../../../../packages/engine-actions/src/triggers/TriggerPayloadManager.ts"],"sourcesContent":["import { Actions, ActionsPayload, Input, Model } from '@contember/schema'\nimport { AnyListener } from './TriggerListenersStore.js'\nimport { EventCause } from './TriggerHandler.js'\nimport { TriggerPayloadBuilder } from './TriggerPayloadBuilder.js'\nimport { TriggerPayloadPersister } from './TriggerPayloadPersister.js'\n\nexport interface FiredEvent {\n\tlistener: AnyListener\n\tcause: EventCause\n\tentity: Model.Entity\n\tprimary: Input.PrimaryValue\n\tselection?: any\n\tnodes?: ActionsPayload.EntityEventPathNode[]\n}\n\nexport class TriggerPayloadManager {\n\tprivate eventsByTrigger: Record<string, FiredEvent[]> = {}\n\n\tconstructor(\n\t\tprivate readonly triggerPayloadBuilder: TriggerPayloadBuilder,\n\t\tprivate readonly triggerPayloadPersister: TriggerPayloadPersister,\n\t) {\n\t}\n\n\tpublic async add(firedEvent: FiredEvent) {\n\t\tconst event = await this.triggerPayloadBuilder.preprocessEvent(firedEvent)\n\t\tthis.eventsByTrigger[firedEvent.listener.trigger.name] ??= []\n\t\tthis.eventsByTrigger[firedEvent.listener.trigger.name].push(event)\n\t}\n\n\tpublic async persist(): Promise<void> {\n\t\tfor (const events of Object.values(this.eventsByTrigger)) {\n\t\t\tconst payloads = await this.triggerPayloadBuilder.build(events)\n\t\t\tconst trigger = events[0].listener.trigger\n\t\t\tawait this.triggerPayloadPersister.persist(trigger, payloads)\n\t\t}\n\t}\n}\n"],"names":[],"mappings":";;;;;AAeO,MAAM,sBAAsB;AAAA,EAGlC,YACkB,uBACA,yBAChB;AAFgB,SAAA,wBAAA;AACA,SAAA,0BAAA;AAJlB,kBAAA,MAAQ,mBAAgD,EAAC;AAAA,EAMzD;AAAA,EAEA,MAAa,IAAI,YAAwB;AAxB1C,QAAA,IAAA;AAyBE,UAAM,QAAQ,MAAM,KAAK,sBAAsB,gBAAgB,UAAU;AACzE,KAAA,KAAA,KAAK,iBAAL,KAAqB,WAAW,SAAS,QAAQ,IAAA,MAAjD,SAA2D,CAAA;AAC3D,SAAK,gBAAgB,WAAW,SAAS,QAAQ,IAAI,EAAE,KAAK,KAAK;AAAA,EAClE;AAAA,EAEA,MAAa,UAAyB;AACrC,eAAW,UAAU,OAAO,OAAO,KAAK,eAAe,GAAG;AACzD,YAAM,WAAW,MAAM,KAAK,sBAAsB,MAAM,MAAM;AAC9D,YAAM,UAAU,OAAO,CAAC,EAAE,SAAS;AACnC,YAAM,KAAK,wBAAwB,QAAQ,SAAS,QAAQ;AAAA,IAC7D;AAAA,EACD;AACD;;"}
@@ -1 +1 @@
1
- {"version":3,"file":"TriggerPayloadManager.js","sources":["../../../../../packages/engine-actions/src/triggers/TriggerPayloadManager.ts"],"sourcesContent":["import { Actions, ActionsPayload, Input, Model } from '@contember/schema'\nimport { AnyListener } from './TriggerListenersStore'\nimport { EventCause } from './TriggerHandler'\nimport { TriggerPayloadBuilder } from './TriggerPayloadBuilder'\nimport { TriggerPayloadPersister } from './TriggerPayloadPersister'\n\nexport interface FiredEvent {\n\tlistener: AnyListener\n\tcause: EventCause\n\tentity: Model.Entity\n\tprimary: Input.PrimaryValue\n\tselection?: any\n\tnodes?: ActionsPayload.EntityEventPathNode[]\n}\n\nexport class TriggerPayloadManager {\n\tprivate eventsByTrigger: Record<string, FiredEvent[]> = {}\n\n\tconstructor(\n\t\tprivate readonly triggerPayloadBuilder: TriggerPayloadBuilder,\n\t\tprivate readonly triggerPayloadPersister: TriggerPayloadPersister,\n\t) {\n\t}\n\n\tpublic async add(firedEvent: FiredEvent) {\n\t\tconst event = await this.triggerPayloadBuilder.preprocessEvent(firedEvent)\n\t\tthis.eventsByTrigger[firedEvent.listener.trigger.name] ??= []\n\t\tthis.eventsByTrigger[firedEvent.listener.trigger.name].push(event)\n\t}\n\n\tpublic async persist(): Promise<void> {\n\t\tfor (const events of Object.values(this.eventsByTrigger)) {\n\t\t\tconst payloads = await this.triggerPayloadBuilder.build(events)\n\t\t\tconst trigger = events[0].listener.trigger\n\t\t\tawait this.triggerPayloadPersister.persist(trigger, payloads)\n\t\t}\n\t}\n}\n"],"names":[],"mappings":";;;AAeO,MAAM,sBAAsB;AAAA,EAGlC,YACkB,uBACA,yBAChB;AAFgB,SAAA,wBAAA;AACA,SAAA,0BAAA;AAJlB,kBAAA,MAAQ,mBAAgD,EAAC;AAAA,EAMzD;AAAA,EAEA,MAAa,IAAI,YAAwB;AAxB1C,QAAA,IAAA;AAyBE,UAAM,QAAQ,MAAM,KAAK,sBAAsB,gBAAgB,UAAU;AACzE,KAAA,KAAA,KAAK,iBAAL,KAAqB,WAAW,SAAS,QAAQ,IAAA,MAAjD,SAA2D,CAAA;AAC3D,SAAK,gBAAgB,WAAW,SAAS,QAAQ,IAAI,EAAE,KAAK,KAAK;AAAA,EAClE;AAAA,EAEA,MAAa,UAAyB;AACrC,eAAW,UAAU,OAAO,OAAO,KAAK,eAAe,GAAG;AACzD,YAAM,WAAW,MAAM,KAAK,sBAAsB,MAAM,MAAM;AAC9D,YAAM,UAAU,OAAO,CAAC,EAAE,SAAS;AACnC,YAAM,KAAK,wBAAwB,QAAQ,SAAS,QAAQ;AAAA,IAC7D;AAAA,EACD;AACD;"}
1
+ {"version":3,"file":"TriggerPayloadManager.js","sources":["../../../../../packages/engine-actions/src/triggers/TriggerPayloadManager.ts"],"sourcesContent":["import { Actions, ActionsPayload, Input, Model } from '@contember/schema'\nimport { AnyListener } from './TriggerListenersStore.js'\nimport { EventCause } from './TriggerHandler.js'\nimport { TriggerPayloadBuilder } from './TriggerPayloadBuilder.js'\nimport { TriggerPayloadPersister } from './TriggerPayloadPersister.js'\n\nexport interface FiredEvent {\n\tlistener: AnyListener\n\tcause: EventCause\n\tentity: Model.Entity\n\tprimary: Input.PrimaryValue\n\tselection?: any\n\tnodes?: ActionsPayload.EntityEventPathNode[]\n}\n\nexport class TriggerPayloadManager {\n\tprivate eventsByTrigger: Record<string, FiredEvent[]> = {}\n\n\tconstructor(\n\t\tprivate readonly triggerPayloadBuilder: TriggerPayloadBuilder,\n\t\tprivate readonly triggerPayloadPersister: TriggerPayloadPersister,\n\t) {\n\t}\n\n\tpublic async add(firedEvent: FiredEvent) {\n\t\tconst event = await this.triggerPayloadBuilder.preprocessEvent(firedEvent)\n\t\tthis.eventsByTrigger[firedEvent.listener.trigger.name] ??= []\n\t\tthis.eventsByTrigger[firedEvent.listener.trigger.name].push(event)\n\t}\n\n\tpublic async persist(): Promise<void> {\n\t\tfor (const events of Object.values(this.eventsByTrigger)) {\n\t\t\tconst payloads = await this.triggerPayloadBuilder.build(events)\n\t\t\tconst trigger = events[0].listener.trigger\n\t\t\tawait this.triggerPayloadPersister.persist(trigger, payloads)\n\t\t}\n\t}\n}\n"],"names":[],"mappings":";;;AAeO,MAAM,sBAAsB;AAAA,EAGlC,YACkB,uBACA,yBAChB;AAFgB,SAAA,wBAAA;AACA,SAAA,0BAAA;AAJlB,kBAAA,MAAQ,mBAAgD,EAAC;AAAA,EAMzD;AAAA,EAEA,MAAa,IAAI,YAAwB;AAxB1C,QAAA,IAAA;AAyBE,UAAM,QAAQ,MAAM,KAAK,sBAAsB,gBAAgB,UAAU;AACzE,KAAA,KAAA,KAAK,iBAAL,KAAqB,WAAW,SAAS,QAAQ,IAAA,MAAjD,SAA2D,CAAA;AAC3D,SAAK,gBAAgB,WAAW,SAAS,QAAQ,IAAI,EAAE,KAAK,KAAK;AAAA,EAClE;AAAA,EAEA,MAAa,UAAyB;AACrC,eAAW,UAAU,OAAO,OAAO,KAAK,eAAe,GAAG;AACzD,YAAM,WAAW,MAAM,KAAK,sBAAsB,MAAM,MAAM;AAC9D,YAAM,UAAU,OAAO,CAAC,EAAE,SAAS;AACnC,YAAM,KAAK,wBAAwB,QAAQ,SAAS,QAAQ;AAAA,IAC7D;AAAA,EACD;AACD;"}
@@ -3,7 +3,7 @@ Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
3
3
  const Database = require("@contember/database");
4
4
  const notifyChannel = require("../utils/notifyChannel.cjs");
5
5
  class TriggerPayloadPersister {
6
- constructor(mapper, client, providers, projectSlug, stageId, schemaId, identityId, userInfo) {
6
+ constructor(mapper, client, providers, projectSlug, stageId, schemaId, identityId, userInfo, triggeredActionsCollector) {
7
7
  this.mapper = mapper;
8
8
  this.client = client;
9
9
  this.providers = providers;
@@ -12,33 +12,45 @@ class TriggerPayloadPersister {
12
12
  this.schemaId = schemaId;
13
13
  this.identityId = identityId;
14
14
  this.userInfo = userInfo;
15
+ this.triggeredActionsCollector = triggeredActionsCollector;
15
16
  }
16
17
  async persist(trigger, payloads) {
17
18
  const chunkSize = 100;
18
19
  if (!this.schemaId) {
19
20
  throw new Error("Schema id is not set");
20
21
  }
22
+ const collector = this.triggeredActionsCollector;
21
23
  for (let i = 0; i < payloads.length; i += chunkSize) {
22
24
  const chunk = payloads.slice(i, i + chunkSize);
23
- await Database.InsertBuilder.create().into("actions_event").values(chunk.map((it) => ({
24
- id: this.providers.uuid(),
25
- transaction_id: this.mapper.transactionId,
26
- created_at: "now",
27
- visible_at: "now",
28
- num_retries: 0,
29
- state: "created",
30
- stage_id: this.stageId,
31
- schema_id: this.schemaId,
32
- target: trigger.target,
33
- trigger: trigger.name,
34
- priority: trigger.priority ?? 0,
35
- payload: it,
36
- resolved_at: null,
37
- last_state_change: "now",
38
- identity_id: this.identityId,
39
- ip_address: this.userInfo.ipAddress,
40
- user_agent: this.userInfo.userAgent
41
- }))).execute(this.client);
25
+ const collected = collector ? [] : void 0;
26
+ const rows = chunk.map((it) => {
27
+ const id = this.providers.uuid();
28
+ const transactionId = this.mapper.transactionId;
29
+ collected?.push({ id, trigger: trigger.name, target: trigger.target, transactionId });
30
+ return {
31
+ id,
32
+ transaction_id: transactionId,
33
+ created_at: "now",
34
+ visible_at: "now",
35
+ num_retries: 0,
36
+ state: "created",
37
+ stage_id: this.stageId,
38
+ schema_id: this.schemaId,
39
+ target: trigger.target,
40
+ trigger: trigger.name,
41
+ priority: trigger.priority ?? 0,
42
+ payload: it,
43
+ resolved_at: null,
44
+ last_state_change: "now",
45
+ identity_id: this.identityId,
46
+ ip_address: this.userInfo.ipAddress,
47
+ user_agent: this.userInfo.userAgent
48
+ };
49
+ });
50
+ await Database.InsertBuilder.create().into("actions_event").values(rows).execute(this.client);
51
+ if (collected && collected.length > 0) {
52
+ collector.add(collected);
53
+ }
42
54
  }
43
55
  await notifyChannel.notify(this.client, this.projectSlug);
44
56
  }
@@ -1 +1 @@
1
- {"version":3,"file":"TriggerPayloadPersister.cjs","sources":["../../../../../packages/engine-actions/src/triggers/TriggerPayloadPersister.ts"],"sourcesContent":["import { Client, InsertBuilder } from '@contember/database'\nimport { Mapper } from '@contember/engine-content-api'\nimport { Actions, ActionsPayload } from '@contember/schema'\nimport { EventRow } from '../model/types'\nimport { notify } from '../utils/notifyChannel'\n\ntype EventRowToInsert = Omit<EventRow, 'created_at' | 'visible_at' | 'last_state_change' | 'log'> & {\n\tcreated_at: string | Date\n\tvisible_at: string | Date\n\tlast_state_change: string | Date\n}\n\nexport class TriggerPayloadPersister {\n\tconstructor(\n\t\tprivate readonly mapper: Mapper,\n\t\tprivate readonly client: Client,\n\t\tprivate readonly providers: { uuid: () => string },\n\t\tprivate readonly projectSlug: string,\n\t\tprivate readonly stageId: string,\n\t\tprivate readonly schemaId: number | undefined,\n\t\tprivate readonly identityId: string,\n\t\tprivate readonly userInfo: { ipAddress: string | null; userAgent: string | null },\n\t) {\n\t}\n\n\tpublic async persist(trigger: Actions.AnyTrigger, payloads: ActionsPayload.AnyEventPayload[]): Promise<void> {\n\t\tconst chunkSize = 100\n\t\tif (!this.schemaId) {\n\t\t\tthrow new Error('Schema id is not set')\n\t\t}\n\t\tfor (let i = 0; i < payloads.length; i += chunkSize) {\n\t\t\tconst chunk = payloads.slice(i, i + chunkSize)\n\t\t\tawait InsertBuilder.create()\n\t\t\t\t.into('actions_event')\n\t\t\t\t.values(chunk.map((it): EventRowToInsert => ({\n\t\t\t\t\tid: this.providers.uuid(),\n\t\t\t\t\ttransaction_id: this.mapper.transactionId,\n\t\t\t\t\tcreated_at: 'now',\n\t\t\t\t\tvisible_at: 'now',\n\t\t\t\t\tnum_retries: 0,\n\t\t\t\t\tstate: 'created',\n\t\t\t\t\tstage_id: this.stageId,\n\t\t\t\t\tschema_id: this.schemaId!,\n\t\t\t\t\ttarget: trigger.target,\n\t\t\t\t\ttrigger: trigger.name,\n\t\t\t\t\tpriority: trigger.priority ?? 0,\n\t\t\t\t\tpayload: it,\n\t\t\t\t\tresolved_at: null,\n\t\t\t\t\tlast_state_change: 'now',\n\t\t\t\t\tidentity_id: this.identityId,\n\t\t\t\t\tip_address: this.userInfo.ipAddress,\n\t\t\t\t\tuser_agent: this.userInfo.userAgent,\n\t\t\t\t})))\n\t\t\t\t.execute(this.client)\n\t\t}\n\n\t\tawait notify(this.client, this.projectSlug)\n\t}\n}\n"],"names":["InsertBuilder","notify"],"mappings":";;;;AAYO,MAAM,wBAAwB;AAAA,EACpC,YACkB,QACA,QACA,WACA,aACA,SACA,UACA,YACA,UAChB;AARgB,SAAA,SAAA;AACA,SAAA,SAAA;AACA,SAAA,YAAA;AACA,SAAA,cAAA;AACA,SAAA,UAAA;AACA,SAAA,WAAA;AACA,SAAA,aAAA;AACA,SAAA,WAAA;AAAA,EAElB;AAAA,EAEA,MAAa,QAAQ,SAA6B,UAA2D;AAC5G,UAAM,YAAY;AAClB,QAAI,CAAC,KAAK,UAAU;AACnB,YAAM,IAAI,MAAM,sBAAsB;AAAA,IACvC;AACA,aAAS,IAAI,GAAG,IAAI,SAAS,QAAQ,KAAK,WAAW;AACpD,YAAM,QAAQ,SAAS,MAAM,GAAG,IAAI,SAAS;AAC7C,YAAMA,SAAAA,cAAc,OAAA,EAClB,KAAK,eAAe,EACpB,OAAO,MAAM,IAAI,CAAC,QAA0B;AAAA,QAC5C,IAAI,KAAK,UAAU,KAAA;AAAA,QACnB,gBAAgB,KAAK,OAAO;AAAA,QAC5B,YAAY;AAAA,QACZ,YAAY;AAAA,QACZ,aAAa;AAAA,QACb,OAAO;AAAA,QACP,UAAU,KAAK;AAAA,QACf,WAAW,KAAK;AAAA,QAChB,QAAQ,QAAQ;AAAA,QAChB,SAAS,QAAQ;AAAA,QACjB,UAAU,QAAQ,YAAY;AAAA,QAC9B,SAAS;AAAA,QACT,aAAa;AAAA,QACb,mBAAmB;AAAA,QACnB,aAAa,KAAK;AAAA,QAClB,YAAY,KAAK,SAAS;AAAA,QAC1B,YAAY,KAAK,SAAS;AAAA,MAAA,EACzB,CAAC,EACF,QAAQ,KAAK,MAAM;AAAA,IACtB;AAEA,UAAMC,cAAAA,OAAO,KAAK,QAAQ,KAAK,WAAW;AAAA,EAC3C;AACD;;"}
1
+ {"version":3,"file":"TriggerPayloadPersister.cjs","sources":["../../../../../packages/engine-actions/src/triggers/TriggerPayloadPersister.ts"],"sourcesContent":["import { Client, InsertBuilder } from '@contember/database'\nimport { Mapper, TriggeredActionEvent, TriggeredActionsCollector } from '@contember/engine-content-api'\nimport { Actions, ActionsPayload } from '@contember/schema'\nimport { EventRow } from '../model/types.js'\nimport { notify } from '../utils/notifyChannel.js'\n\ntype EventRowToInsert = Omit<EventRow, 'created_at' | 'visible_at' | 'last_state_change' | 'log'> & {\n\tcreated_at: string | Date\n\tvisible_at: string | Date\n\tlast_state_change: string | Date\n}\n\nexport class TriggerPayloadPersister {\n\tconstructor(\n\t\tprivate readonly mapper: Mapper,\n\t\tprivate readonly client: Client,\n\t\tprivate readonly providers: { uuid: () => string },\n\t\tprivate readonly projectSlug: string,\n\t\tprivate readonly stageId: string,\n\t\tprivate readonly schemaId: number | undefined,\n\t\tprivate readonly identityId: string,\n\t\tprivate readonly userInfo: { ipAddress: string | null; userAgent: string | null },\n\t\tprivate readonly triggeredActionsCollector: TriggeredActionsCollector | undefined,\n\t) {\n\t}\n\n\tpublic async persist(trigger: Actions.AnyTrigger, payloads: ActionsPayload.AnyEventPayload[]): Promise<void> {\n\t\tconst chunkSize = 100\n\t\tif (!this.schemaId) {\n\t\t\tthrow new Error('Schema id is not set')\n\t\t}\n\t\tconst collector = this.triggeredActionsCollector\n\t\tfor (let i = 0; i < payloads.length; i += chunkSize) {\n\t\t\tconst chunk = payloads.slice(i, i + chunkSize)\n\t\t\tconst collected: TriggeredActionEvent[] | undefined = collector ? [] : undefined\n\t\t\tconst rows = chunk.map((it): EventRowToInsert => {\n\t\t\t\tconst id = this.providers.uuid()\n\t\t\t\tconst transactionId = this.mapper.transactionId\n\t\t\t\tcollected?.push({ id, trigger: trigger.name, target: trigger.target, transactionId })\n\t\t\t\treturn {\n\t\t\t\t\tid,\n\t\t\t\t\ttransaction_id: transactionId,\n\t\t\t\t\tcreated_at: 'now',\n\t\t\t\t\tvisible_at: 'now',\n\t\t\t\t\tnum_retries: 0,\n\t\t\t\t\tstate: 'created',\n\t\t\t\t\tstage_id: this.stageId,\n\t\t\t\t\tschema_id: this.schemaId!,\n\t\t\t\t\ttarget: trigger.target,\n\t\t\t\t\ttrigger: trigger.name,\n\t\t\t\t\tpriority: trigger.priority ?? 0,\n\t\t\t\t\tpayload: it,\n\t\t\t\t\tresolved_at: null,\n\t\t\t\t\tlast_state_change: 'now',\n\t\t\t\t\tidentity_id: this.identityId,\n\t\t\t\t\tip_address: this.userInfo.ipAddress,\n\t\t\t\t\tuser_agent: this.userInfo.userAgent,\n\t\t\t\t}\n\t\t\t})\n\t\t\tawait InsertBuilder.create()\n\t\t\t\t.into('actions_event')\n\t\t\t\t.values(rows)\n\t\t\t\t.execute(this.client)\n\n\t\t\tif (collected && collected.length > 0) {\n\t\t\t\tcollector!.add(collected)\n\t\t\t}\n\t\t}\n\n\t\tawait notify(this.client, this.projectSlug)\n\t}\n}\n"],"names":["InsertBuilder","notify"],"mappings":";;;;AAYO,MAAM,wBAAwB;AAAA,EACpC,YACkB,QACA,QACA,WACA,aACA,SACA,UACA,YACA,UACA,2BAChB;AATgB,SAAA,SAAA;AACA,SAAA,SAAA;AACA,SAAA,YAAA;AACA,SAAA,cAAA;AACA,SAAA,UAAA;AACA,SAAA,WAAA;AACA,SAAA,aAAA;AACA,SAAA,WAAA;AACA,SAAA,4BAAA;AAAA,EAElB;AAAA,EAEA,MAAa,QAAQ,SAA6B,UAA2D;AAC5G,UAAM,YAAY;AAClB,QAAI,CAAC,KAAK,UAAU;AACnB,YAAM,IAAI,MAAM,sBAAsB;AAAA,IACvC;AACA,UAAM,YAAY,KAAK;AACvB,aAAS,IAAI,GAAG,IAAI,SAAS,QAAQ,KAAK,WAAW;AACpD,YAAM,QAAQ,SAAS,MAAM,GAAG,IAAI,SAAS;AAC7C,YAAM,YAAgD,YAAY,CAAA,IAAK;AACvE,YAAM,OAAO,MAAM,IAAI,CAAC,OAAyB;AAChD,cAAM,KAAK,KAAK,UAAU,KAAA;AAC1B,cAAM,gBAAgB,KAAK,OAAO;AAClC,mBAAW,KAAK,EAAE,IAAI,SAAS,QAAQ,MAAM,QAAQ,QAAQ,QAAQ,cAAA,CAAe;AACpF,eAAO;AAAA,UACN;AAAA,UACA,gBAAgB;AAAA,UAChB,YAAY;AAAA,UACZ,YAAY;AAAA,UACZ,aAAa;AAAA,UACb,OAAO;AAAA,UACP,UAAU,KAAK;AAAA,UACf,WAAW,KAAK;AAAA,UAChB,QAAQ,QAAQ;AAAA,UAChB,SAAS,QAAQ;AAAA,UACjB,UAAU,QAAQ,YAAY;AAAA,UAC9B,SAAS;AAAA,UACT,aAAa;AAAA,UACb,mBAAmB;AAAA,UACnB,aAAa,KAAK;AAAA,UAClB,YAAY,KAAK,SAAS;AAAA,UAC1B,YAAY,KAAK,SAAS;AAAA,QAAA;AAAA,MAE5B,CAAC;AACD,YAAMA,uBAAc,SAClB,KAAK,eAAe,EACpB,OAAO,IAAI,EACX,QAAQ,KAAK,MAAM;AAErB,UAAI,aAAa,UAAU,SAAS,GAAG;AACtC,kBAAW,IAAI,SAAS;AAAA,MACzB;AAAA,IACD;AAEA,UAAMC,cAAAA,OAAO,KAAK,QAAQ,KAAK,WAAW;AAAA,EAC3C;AACD;;"}