@contember/engine-actions 1.3.0-alpha.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (289) hide show
  1. package/dist/src/ActionsExecutionContainerHookFactory.d.ts +8 -0
  2. package/dist/src/ActionsExecutionContainerHookFactory.d.ts.map +1 -0
  3. package/dist/src/ActionsExecutionContainerHookFactory.js +28 -0
  4. package/dist/src/ActionsExecutionContainerHookFactory.js.map +1 -0
  5. package/dist/src/ImplementationException.d.ts +3 -0
  6. package/dist/src/ImplementationException.d.ts.map +1 -0
  7. package/dist/src/ImplementationException.js +7 -0
  8. package/dist/src/ImplementationException.js.map +1 -0
  9. package/dist/src/ListenerStoreProvider.d.ts +7 -0
  10. package/dist/src/ListenerStoreProvider.d.ts.map +1 -0
  11. package/dist/src/ListenerStoreProvider.js +21 -0
  12. package/dist/src/ListenerStoreProvider.js.map +1 -0
  13. package/dist/src/dispatch/DispatchWorkerSupervisor.d.ts +17 -0
  14. package/dist/src/dispatch/DispatchWorkerSupervisor.d.ts.map +1 -0
  15. package/dist/src/dispatch/DispatchWorkerSupervisor.js +123 -0
  16. package/dist/src/dispatch/DispatchWorkerSupervisor.js.map +1 -0
  17. package/dist/src/dispatch/EventDispatcher.d.ts +25 -0
  18. package/dist/src/dispatch/EventDispatcher.d.ts.map +1 -0
  19. package/dist/src/dispatch/EventDispatcher.js +46 -0
  20. package/dist/src/dispatch/EventDispatcher.js.map +1 -0
  21. package/dist/src/dispatch/EventsRepository.d.ts +22 -0
  22. package/dist/src/dispatch/EventsRepository.d.ts.map +1 -0
  23. package/dist/src/dispatch/EventsRepository.js +138 -0
  24. package/dist/src/dispatch/EventsRepository.js.map +1 -0
  25. package/dist/src/dispatch/ProjectDispatcher.d.ts +22 -0
  26. package/dist/src/dispatch/ProjectDispatcher.d.ts.map +1 -0
  27. package/dist/src/dispatch/ProjectDispatcher.js +103 -0
  28. package/dist/src/dispatch/ProjectDispatcher.js.map +1 -0
  29. package/dist/src/dispatch/TargetHandlerResolver.d.ts +9 -0
  30. package/dist/src/dispatch/TargetHandlerResolver.d.ts.map +1 -0
  31. package/dist/src/dispatch/TargetHandlerResolver.js +17 -0
  32. package/dist/src/dispatch/TargetHandlerResolver.js.map +1 -0
  33. package/dist/src/dispatch/WebhookTargetHandler.d.ts +7 -0
  34. package/dist/src/dispatch/WebhookTargetHandler.d.ts.map +1 -0
  35. package/dist/src/dispatch/WebhookTargetHandler.js +85 -0
  36. package/dist/src/dispatch/WebhookTargetHandler.js.map +1 -0
  37. package/dist/src/dispatch/types.d.ts +27 -0
  38. package/dist/src/dispatch/types.d.ts.map +1 -0
  39. package/dist/src/dispatch/types.js +3 -0
  40. package/dist/src/dispatch/types.js.map +1 -0
  41. package/dist/src/graphql/http/ActionsApiMiddlewareFactory.d.ts +10 -0
  42. package/dist/src/graphql/http/ActionsApiMiddlewareFactory.d.ts.map +1 -0
  43. package/dist/src/graphql/http/ActionsApiMiddlewareFactory.js +31 -0
  44. package/dist/src/graphql/http/ActionsApiMiddlewareFactory.js.map +1 -0
  45. package/dist/src/graphql/http/ActionsContextResolver.d.ts +11 -0
  46. package/dist/src/graphql/http/ActionsContextResolver.d.ts.map +1 -0
  47. package/dist/src/graphql/http/ActionsContextResolver.js +33 -0
  48. package/dist/src/graphql/http/ActionsContextResolver.js.map +1 -0
  49. package/dist/src/graphql/http/ActionsGraphQLHandlerFactory.d.ts +8 -0
  50. package/dist/src/graphql/http/ActionsGraphQLHandlerFactory.d.ts.map +1 -0
  51. package/dist/src/graphql/http/ActionsGraphQLHandlerFactory.js +21 -0
  52. package/dist/src/graphql/http/ActionsGraphQLHandlerFactory.js.map +1 -0
  53. package/dist/src/graphql/http/ActionsWebsocketControllerFactory.d.ts +11 -0
  54. package/dist/src/graphql/http/ActionsWebsocketControllerFactory.d.ts.map +1 -0
  55. package/dist/src/graphql/http/ActionsWebsocketControllerFactory.js +150 -0
  56. package/dist/src/graphql/http/ActionsWebsocketControllerFactory.js.map +1 -0
  57. package/dist/src/graphql/resolvers/ActionsContext.d.ts +9 -0
  58. package/dist/src/graphql/resolvers/ActionsContext.d.ts.map +1 -0
  59. package/dist/src/graphql/resolvers/ActionsContext.js +3 -0
  60. package/dist/src/graphql/resolvers/ActionsContext.js.map +1 -0
  61. package/dist/src/graphql/resolvers/ResolversFactory.d.ts +13 -0
  62. package/dist/src/graphql/resolvers/ResolversFactory.d.ts.map +1 -0
  63. package/dist/src/graphql/resolvers/ResolversFactory.js +32 -0
  64. package/dist/src/graphql/resolvers/ResolversFactory.js.map +1 -0
  65. package/dist/src/graphql/resolvers/index.d.ts +3 -0
  66. package/dist/src/graphql/resolvers/index.d.ts.map +1 -0
  67. package/dist/src/graphql/resolvers/index.js +19 -0
  68. package/dist/src/graphql/resolvers/index.js.map +1 -0
  69. package/dist/src/graphql/resolvers/mutation/ProcessBatchMutationResolver.d.ts +11 -0
  70. package/dist/src/graphql/resolvers/mutation/ProcessBatchMutationResolver.d.ts.map +1 -0
  71. package/dist/src/graphql/resolvers/mutation/ProcessBatchMutationResolver.js +16 -0
  72. package/dist/src/graphql/resolvers/mutation/ProcessBatchMutationResolver.js.map +1 -0
  73. package/dist/src/graphql/resolvers/mutation/SetVariablesMutationResolver.d.ts +11 -0
  74. package/dist/src/graphql/resolvers/mutation/SetVariablesMutationResolver.d.ts.map +1 -0
  75. package/dist/src/graphql/resolvers/mutation/SetVariablesMutationResolver.js +16 -0
  76. package/dist/src/graphql/resolvers/mutation/SetVariablesMutationResolver.js.map +1 -0
  77. package/dist/src/graphql/resolvers/mutation/index.d.ts +3 -0
  78. package/dist/src/graphql/resolvers/mutation/index.d.ts.map +1 -0
  79. package/dist/src/graphql/resolvers/mutation/index.js +19 -0
  80. package/dist/src/graphql/resolvers/mutation/index.js.map +1 -0
  81. package/dist/src/graphql/resolvers/query/EventsQueryResolver.d.ts +11 -0
  82. package/dist/src/graphql/resolvers/query/EventsQueryResolver.d.ts.map +1 -0
  83. package/dist/src/graphql/resolvers/query/EventsQueryResolver.js +43 -0
  84. package/dist/src/graphql/resolvers/query/EventsQueryResolver.js.map +1 -0
  85. package/dist/src/graphql/resolvers/query/VariablesQueryResolver.d.ts +12 -0
  86. package/dist/src/graphql/resolvers/query/VariablesQueryResolver.d.ts.map +1 -0
  87. package/dist/src/graphql/resolvers/query/VariablesQueryResolver.js +16 -0
  88. package/dist/src/graphql/resolvers/query/VariablesQueryResolver.js.map +1 -0
  89. package/dist/src/graphql/resolvers/query/index.d.ts +2 -0
  90. package/dist/src/graphql/resolvers/query/index.d.ts.map +1 -0
  91. package/dist/src/graphql/resolvers/query/index.js +18 -0
  92. package/dist/src/graphql/resolvers/query/index.js.map +1 -0
  93. package/dist/src/graphql/schema/actions.graphql.d.ts +3 -0
  94. package/dist/src/graphql/schema/actions.graphql.d.ts.map +1 -0
  95. package/dist/src/graphql/schema/actions.graphql.js +93 -0
  96. package/dist/src/graphql/schema/actions.graphql.js.map +1 -0
  97. package/dist/src/graphql/schema/index.d.ts +224 -0
  98. package/dist/src/graphql/schema/index.d.ts.map +1 -0
  99. package/dist/src/graphql/schema/index.js +3 -0
  100. package/dist/src/graphql/schema/index.js.map +1 -0
  101. package/dist/src/index.d.ts +13 -0
  102. package/dist/src/index.d.ts.map +1 -0
  103. package/dist/src/index.js +81 -0
  104. package/dist/src/index.js.map +1 -0
  105. package/dist/src/migrations/2023-03-10-145000-actions-variables.d.ts +3 -0
  106. package/dist/src/migrations/2023-03-10-145000-actions-variables.d.ts.map +1 -0
  107. package/dist/src/migrations/2023-03-10-145000-actions-variables.js +17 -0
  108. package/dist/src/migrations/2023-03-10-145000-actions-variables.js.map +1 -0
  109. package/dist/src/migrations/index.d.ts +3 -0
  110. package/dist/src/migrations/index.d.ts.map +1 -0
  111. package/dist/src/migrations/index.js +13 -0
  112. package/dist/src/migrations/index.js.map +1 -0
  113. package/dist/src/migrations/snapshot.d.ts +3 -0
  114. package/dist/src/migrations/snapshot.d.ts.map +1 -0
  115. package/dist/src/migrations/snapshot.js +49 -0
  116. package/dist/src/migrations/snapshot.js.map +1 -0
  117. package/dist/src/model/EventsInProcessingQuery.d.ts +9 -0
  118. package/dist/src/model/EventsInProcessingQuery.d.ts.map +1 -0
  119. package/dist/src/model/EventsInProcessingQuery.js +22 -0
  120. package/dist/src/model/EventsInProcessingQuery.js.map +1 -0
  121. package/dist/src/model/EventsToProcessQuery.d.ts +9 -0
  122. package/dist/src/model/EventsToProcessQuery.d.ts.map +1 -0
  123. package/dist/src/model/EventsToProcessQuery.js +22 -0
  124. package/dist/src/model/EventsToProcessQuery.js.map +1 -0
  125. package/dist/src/model/EventsToProcessSpecification.d.ts +4 -0
  126. package/dist/src/model/EventsToProcessSpecification.d.ts.map +1 -0
  127. package/dist/src/model/EventsToProcessSpecification.js +14 -0
  128. package/dist/src/model/EventsToProcessSpecification.js.map +1 -0
  129. package/dist/src/model/FailedEventsQuery.d.ts +9 -0
  130. package/dist/src/model/FailedEventsQuery.d.ts.map +1 -0
  131. package/dist/src/model/FailedEventsQuery.js +22 -0
  132. package/dist/src/model/FailedEventsQuery.js.map +1 -0
  133. package/dist/src/model/SetVariableCommand.d.ts +8 -0
  134. package/dist/src/model/SetVariableCommand.d.ts.map +1 -0
  135. package/dist/src/model/SetVariableCommand.js +26 -0
  136. package/dist/src/model/SetVariableCommand.js.map +1 -0
  137. package/dist/src/model/VariablesManager.d.ts +8 -0
  138. package/dist/src/model/VariablesManager.d.ts.map +1 -0
  139. package/dist/src/model/VariablesManager.js +46 -0
  140. package/dist/src/model/VariablesManager.js.map +1 -0
  141. package/dist/src/model/VariablesQuery.d.ts +12 -0
  142. package/dist/src/model/VariablesQuery.d.ts.map +1 -0
  143. package/dist/src/model/VariablesQuery.js +13 -0
  144. package/dist/src/model/VariablesQuery.js.map +1 -0
  145. package/dist/src/model/types.d.ts +16 -0
  146. package/dist/src/model/types.d.ts.map +1 -0
  147. package/dist/src/model/types.js +3 -0
  148. package/dist/src/model/types.js.map +1 -0
  149. package/dist/src/triggers/Payload.d.ts +62 -0
  150. package/dist/src/triggers/Payload.d.ts.map +1 -0
  151. package/dist/src/triggers/Payload.js +3 -0
  152. package/dist/src/triggers/Payload.js.map +1 -0
  153. package/dist/src/triggers/TriggerHandler.d.ts +26 -0
  154. package/dist/src/triggers/TriggerHandler.d.ts.map +1 -0
  155. package/dist/src/triggers/TriggerHandler.js +130 -0
  156. package/dist/src/triggers/TriggerHandler.js.map +1 -0
  157. package/dist/src/triggers/TriggerIndirectChangesFetcher.d.ts +11 -0
  158. package/dist/src/triggers/TriggerIndirectChangesFetcher.d.ts.map +1 -0
  159. package/dist/src/triggers/TriggerIndirectChangesFetcher.js +24 -0
  160. package/dist/src/triggers/TriggerIndirectChangesFetcher.js.map +1 -0
  161. package/dist/src/triggers/TriggerListeners.d.ts +9 -0
  162. package/dist/src/triggers/TriggerListeners.d.ts.map +1 -0
  163. package/dist/src/triggers/TriggerListeners.js +3 -0
  164. package/dist/src/triggers/TriggerListeners.js.map +1 -0
  165. package/dist/src/triggers/TriggerListenersBuilder.d.ts +15 -0
  166. package/dist/src/triggers/TriggerListenersBuilder.d.ts.map +1 -0
  167. package/dist/src/triggers/TriggerListenersBuilder.js +169 -0
  168. package/dist/src/triggers/TriggerListenersBuilder.js.map +1 -0
  169. package/dist/src/triggers/TriggerListenersFactory.d.ts +8 -0
  170. package/dist/src/triggers/TriggerListenersFactory.d.ts.map +1 -0
  171. package/dist/src/triggers/TriggerListenersFactory.js +18 -0
  172. package/dist/src/triggers/TriggerListenersFactory.js.map +1 -0
  173. package/dist/src/triggers/TriggerListenersStore.d.ts +48 -0
  174. package/dist/src/triggers/TriggerListenersStore.d.ts.map +1 -0
  175. package/dist/src/triggers/TriggerListenersStore.js +30 -0
  176. package/dist/src/triggers/TriggerListenersStore.js.map +1 -0
  177. package/dist/src/triggers/TriggerPayloadBuilder.d.ts +14 -0
  178. package/dist/src/triggers/TriggerPayloadBuilder.d.ts.map +1 -0
  179. package/dist/src/triggers/TriggerPayloadBuilder.js +140 -0
  180. package/dist/src/triggers/TriggerPayloadBuilder.js.map +1 -0
  181. package/dist/src/triggers/TriggerPayloadManager.d.ts +27 -0
  182. package/dist/src/triggers/TriggerPayloadManager.d.ts.map +1 -0
  183. package/dist/src/triggers/TriggerPayloadManager.js +26 -0
  184. package/dist/src/triggers/TriggerPayloadManager.js.map +1 -0
  185. package/dist/src/triggers/TriggerPayloadPersister.d.ts +18 -0
  186. package/dist/src/triggers/TriggerPayloadPersister.d.ts.map +1 -0
  187. package/dist/src/triggers/TriggerPayloadPersister.js +44 -0
  188. package/dist/src/triggers/TriggerPayloadPersister.js.map +1 -0
  189. package/dist/src/triggers/index.d.ts +8 -0
  190. package/dist/src/triggers/index.d.ts.map +1 -0
  191. package/dist/src/triggers/index.js +24 -0
  192. package/dist/src/triggers/index.js.map +1 -0
  193. package/dist/src/tsconfig.tsbuildinfo +1 -0
  194. package/dist/src/utils/assertNever.d.ts +2 -0
  195. package/dist/src/utils/assertNever.d.ts.map +1 -0
  196. package/dist/src/utils/assertNever.js +8 -0
  197. package/dist/src/utils/assertNever.js.map +1 -0
  198. package/dist/src/utils/map.d.ts +2 -0
  199. package/dist/src/utils/map.d.ts.map +1 -0
  200. package/dist/src/utils/map.js +14 -0
  201. package/dist/src/utils/map.js.map +1 -0
  202. package/dist/tests/cases/integration/triggers.manyHasManyWatch.test.d.ts +2 -0
  203. package/dist/tests/cases/integration/triggers.manyHasManyWatch.test.d.ts.map +1 -0
  204. package/dist/tests/cases/integration/triggers.manyHasManyWatch.test.js +442 -0
  205. package/dist/tests/cases/integration/triggers.manyHasManyWatch.test.js.map +1 -0
  206. package/dist/tests/cases/integration/triggers.manyHasOneWatch.test.d.ts +2 -0
  207. package/dist/tests/cases/integration/triggers.manyHasOneWatch.test.d.ts.map +1 -0
  208. package/dist/tests/cases/integration/triggers.manyHasOneWatch.test.js +449 -0
  209. package/dist/tests/cases/integration/triggers.manyHasOneWatch.test.js.map +1 -0
  210. package/dist/tests/cases/integration/triggers.rootWatch.test.d.ts +2 -0
  211. package/dist/tests/cases/integration/triggers.rootWatch.test.d.ts.map +1 -0
  212. package/dist/tests/cases/integration/triggers.rootWatch.test.js +159 -0
  213. package/dist/tests/cases/integration/triggers.rootWatch.test.js.map +1 -0
  214. package/dist/tests/cases/integration/utils.d.ts +4 -0
  215. package/dist/tests/cases/integration/utils.d.ts.map +1 -0
  216. package/dist/tests/cases/integration/utils.js +12 -0
  217. package/dist/tests/cases/integration/utils.js.map +1 -0
  218. package/dist/tests/cases/unit/generator.test.d.ts +2 -0
  219. package/dist/tests/cases/unit/generator.test.d.ts.map +1 -0
  220. package/dist/tests/cases/unit/generator.test.js +627 -0
  221. package/dist/tests/cases/unit/generator.test.js.map +1 -0
  222. package/dist/tests/src/gql.d.ts +2 -0
  223. package/dist/tests/src/gql.d.ts.map +1 -0
  224. package/dist/tests/src/gql.js +14 -0
  225. package/dist/tests/src/gql.js.map +1 -0
  226. package/dist/tests/tsconfig.tsbuildinfo +1 -0
  227. package/graphql-actions.codegen.yml +21 -0
  228. package/package.json +41 -0
  229. package/src/ActionsExecutionContainerHookFactory.ts +28 -0
  230. package/src/ImplementationException.ts +2 -0
  231. package/src/ListenerStoreProvider.ts +17 -0
  232. package/src/dispatch/DispatchWorkerSupervisor.ts +137 -0
  233. package/src/dispatch/EventDispatcher.ts +64 -0
  234. package/src/dispatch/EventsRepository.ts +165 -0
  235. package/src/dispatch/ProjectDispatcher.ts +119 -0
  236. package/src/dispatch/TargetHandlerResolver.ts +18 -0
  237. package/src/dispatch/WebhookTargetHandler.ts +88 -0
  238. package/src/dispatch/types.ts +31 -0
  239. package/src/graphql/http/ActionsApiMiddlewareFactory.ts +36 -0
  240. package/src/graphql/http/ActionsContextResolver.ts +38 -0
  241. package/src/graphql/http/ActionsGraphQLHandlerFactory.ts +23 -0
  242. package/src/graphql/http/ActionsWebsocketControllerFactory.ts +143 -0
  243. package/src/graphql/resolvers/ActionsContext.ts +9 -0
  244. package/src/graphql/resolvers/ResolversFactory.ts +35 -0
  245. package/src/graphql/resolvers/index.ts +2 -0
  246. package/src/graphql/resolvers/mutation/ProcessBatchMutationResolver.ts +16 -0
  247. package/src/graphql/resolvers/mutation/SetVariablesMutationResolver.ts +19 -0
  248. package/src/graphql/resolvers/mutation/index.ts +2 -0
  249. package/src/graphql/resolvers/query/EventsQueryResolver.ts +55 -0
  250. package/src/graphql/resolvers/query/VariablesQueryResolver.ts +18 -0
  251. package/src/graphql/resolvers/query/index.ts +1 -0
  252. package/src/graphql/schema/actions.graphql.ts +91 -0
  253. package/src/graphql/schema/index.ts +295 -0
  254. package/src/index.ts +88 -0
  255. package/src/migrations/2023-03-10-145000-actions-variables.ts +16 -0
  256. package/src/migrations/index.ts +7 -0
  257. package/src/migrations/snapshot.ts +47 -0
  258. package/src/model/EventsInProcessingQuery.ts +21 -0
  259. package/src/model/EventsToProcessQuery.ts +21 -0
  260. package/src/model/EventsToProcessSpecification.ts +11 -0
  261. package/src/model/FailedEventsQuery.ts +21 -0
  262. package/src/model/SetVariableCommand.ts +26 -0
  263. package/src/model/VariablesManager.ts +49 -0
  264. package/src/model/VariablesQuery.ts +17 -0
  265. package/src/model/types.ts +15 -0
  266. package/src/triggers/Payload.ts +82 -0
  267. package/src/triggers/TriggerHandler.ts +161 -0
  268. package/src/triggers/TriggerIndirectChangesFetcher.ts +30 -0
  269. package/src/triggers/TriggerListeners.ts +16 -0
  270. package/src/triggers/TriggerListenersBuilder.ts +190 -0
  271. package/src/triggers/TriggerListenersFactory.ts +19 -0
  272. package/src/triggers/TriggerListenersStore.ts +76 -0
  273. package/src/triggers/TriggerPayloadBuilder.ts +148 -0
  274. package/src/triggers/TriggerPayloadManager.ts +47 -0
  275. package/src/triggers/TriggerPayloadPersister.ts +43 -0
  276. package/src/triggers/index.ts +7 -0
  277. package/src/tsconfig.json +21 -0
  278. package/src/utils/assertNever.ts +3 -0
  279. package/src/utils/map.ts +13 -0
  280. package/tests/cases/integration/triggers.manyHasManyWatch.test.ts +437 -0
  281. package/tests/cases/integration/triggers.manyHasOneWatch.test.ts +446 -0
  282. package/tests/cases/integration/triggers.rootWatch.test.ts +152 -0
  283. package/tests/cases/integration/utils.ts +9 -0
  284. package/tests/cases/unit/generator.test.ts +689 -0
  285. package/tests/src/gql.ts +7 -0
  286. package/tests/tsconfig.json +16 -0
  287. package/tsconfig.json +5 -0
  288. package/tsconfig.settings.json +8 -0
  289. package/vite.config.js +3 -0
@@ -0,0 +1,295 @@
1
+ import { GraphQLResolveInfo, GraphQLScalarType, GraphQLScalarTypeConfig } from 'graphql'
2
+ export type Maybe<T> = T | null
3
+ export type InputMaybe<T> = Maybe<T>
4
+ export type Exact<T extends { [key: string]: unknown }> = { [K in keyof T]: T[K] }
5
+ export type MakeOptional<T, K extends keyof T> = Omit<T, K> & { [SubKey in K]?: Maybe<T[SubKey]> }
6
+ export type MakeMaybe<T, K extends keyof T> = Omit<T, K> & { [SubKey in K]: Maybe<T[SubKey]> }
7
+ export type RequireFields<T, K extends keyof T> = Omit<T, K> & { [P in K]-?: NonNullable<T[P]> }
8
+ /** All built-in and custom scalars, mapped to their actual values */
9
+ export type Scalars = {
10
+ ID: string
11
+ String: string
12
+ Boolean: boolean
13
+ Int: number
14
+ Float: number
15
+ DateTime: Date
16
+ Json: any
17
+ Uuid: String
18
+ }
19
+
20
+ export type Event = {
21
+ readonly __typename?: 'Event'
22
+ readonly createdAt: Scalars['DateTime']
23
+ readonly id: Scalars['Uuid']
24
+ readonly lastStateChange: Scalars['DateTime']
25
+ readonly log: Scalars['Json']
26
+ readonly numRetries: Scalars['Int']
27
+ readonly payload: Scalars['Json']
28
+ readonly resolvedAt?: Maybe<Scalars['DateTime']>
29
+ readonly stage: Scalars['String']
30
+ readonly state: EventState
31
+ readonly target: Scalars['String']
32
+ readonly transactionId: Scalars['Uuid']
33
+ readonly visibleAt?: Maybe<Scalars['DateTime']>
34
+ }
35
+
36
+ export type EventArgs = {
37
+ /** Max 10000 */
38
+ readonly limit?: InputMaybe<Scalars['Int']>
39
+ readonly offset?: InputMaybe<Scalars['Int']>
40
+ }
41
+
42
+ export type EventState =
43
+ | 'created'
44
+ | 'failed'
45
+ | 'processing'
46
+ | 'retrying'
47
+ | 'stopped'
48
+ | 'succeed'
49
+
50
+ export type Mutation = {
51
+ readonly __typename?: 'Mutation'
52
+ readonly processBatch: ProcessBatchResponse
53
+ readonly setVariables: SetVariablesResponse
54
+ }
55
+
56
+
57
+ export type MutationSetVariablesArgs = {
58
+ args: SetVariablesArgs
59
+ }
60
+
61
+ export type ProcessBatchResponse = {
62
+ readonly __typename?: 'ProcessBatchResponse'
63
+ readonly ok: Scalars['Boolean']
64
+ }
65
+
66
+ export type Query = {
67
+ readonly __typename?: 'Query'
68
+ readonly eventsInProcessing: ReadonlyArray<Event>
69
+ readonly eventsToProcess: ReadonlyArray<Event>
70
+ readonly failedEvents: ReadonlyArray<Event>
71
+ readonly variables: ReadonlyArray<Variable>
72
+ }
73
+
74
+
75
+ export type QueryEventsInProcessingArgs = {
76
+ args?: InputMaybe<EventArgs>
77
+ }
78
+
79
+
80
+ export type QueryEventsToProcessArgs = {
81
+ args?: InputMaybe<EventArgs>
82
+ }
83
+
84
+
85
+ export type QueryFailedEventsArgs = {
86
+ args?: InputMaybe<EventArgs>
87
+ }
88
+
89
+ export type SetVariablesArgs = {
90
+ readonly mode?: InputMaybe<SetVariablesMode>
91
+ readonly variables: ReadonlyArray<VariableInput>
92
+ }
93
+
94
+ /**
95
+ * Defines how it handles original variables.
96
+ * - MERGE merges with new values (default behaviour)
97
+ * - SET replaces all variables
98
+ * - APPEND_ONLY_MISSING appends values if not already exist
99
+ */
100
+ export type SetVariablesMode =
101
+ | 'APPEND_ONLY_MISSING'
102
+ | 'MERGE'
103
+ | 'SET'
104
+
105
+ export type SetVariablesResponse = {
106
+ readonly __typename?: 'SetVariablesResponse'
107
+ readonly ok: Scalars['Boolean']
108
+ }
109
+
110
+ export type Variable = {
111
+ readonly __typename?: 'Variable'
112
+ readonly name: Scalars['String']
113
+ readonly value: Scalars['String']
114
+ }
115
+
116
+ export type VariableInput = {
117
+ readonly name: Scalars['String']
118
+ readonly value: Scalars['String']
119
+ }
120
+
121
+
122
+
123
+ export type ResolverTypeWrapper<T> = Promise<T> | T
124
+
125
+
126
+ export type ResolverWithResolve<TResult, TParent, TContext, TArgs> = {
127
+ resolve: ResolverFn<TResult, TParent, TContext, TArgs>
128
+ }
129
+ export type Resolver<TResult, TParent = {}, TContext = {}, TArgs = {}> = ResolverFn<TResult, TParent, TContext, TArgs> | ResolverWithResolve<TResult, TParent, TContext, TArgs>
130
+
131
+ export type ResolverFn<TResult, TParent, TContext, TArgs> = (
132
+ parent: TParent,
133
+ args: TArgs,
134
+ context: TContext,
135
+ info: GraphQLResolveInfo
136
+ ) => Promise<TResult> | TResult
137
+
138
+ export type SubscriptionSubscribeFn<TResult, TParent, TContext, TArgs> = (
139
+ parent: TParent,
140
+ args: TArgs,
141
+ context: TContext,
142
+ info: GraphQLResolveInfo
143
+ ) => AsyncIterable<TResult> | Promise<AsyncIterable<TResult>>
144
+
145
+ export type SubscriptionResolveFn<TResult, TParent, TContext, TArgs> = (
146
+ parent: TParent,
147
+ args: TArgs,
148
+ context: TContext,
149
+ info: GraphQLResolveInfo
150
+ ) => TResult | Promise<TResult>
151
+
152
+ export interface SubscriptionSubscriberObject<TResult, TKey extends string, TParent, TContext, TArgs> {
153
+ subscribe: SubscriptionSubscribeFn<{ [key in TKey]: TResult }, TParent, TContext, TArgs>
154
+ resolve?: SubscriptionResolveFn<TResult, { [key in TKey]: TResult }, TContext, TArgs>
155
+ }
156
+
157
+ export interface SubscriptionResolverObject<TResult, TParent, TContext, TArgs> {
158
+ subscribe: SubscriptionSubscribeFn<any, TParent, TContext, TArgs>
159
+ resolve: SubscriptionResolveFn<TResult, any, TContext, TArgs>
160
+ }
161
+
162
+ export type SubscriptionObject<TResult, TKey extends string, TParent, TContext, TArgs> =
163
+ | SubscriptionSubscriberObject<TResult, TKey, TParent, TContext, TArgs>
164
+ | SubscriptionResolverObject<TResult, TParent, TContext, TArgs>
165
+
166
+ export type SubscriptionResolver<TResult, TKey extends string, TParent = {}, TContext = {}, TArgs = {}> =
167
+ | ((...args: any[]) => SubscriptionObject<TResult, TKey, TParent, TContext, TArgs>)
168
+ | SubscriptionObject<TResult, TKey, TParent, TContext, TArgs>
169
+
170
+ export type TypeResolveFn<TTypes, TParent = {}, TContext = {}> = (
171
+ parent: TParent,
172
+ context: TContext,
173
+ info: GraphQLResolveInfo
174
+ ) => Maybe<TTypes> | Promise<Maybe<TTypes>>
175
+
176
+ export type IsTypeOfResolverFn<T = {}, TContext = {}> = (obj: T, context: TContext, info: GraphQLResolveInfo) => boolean | Promise<boolean>
177
+
178
+ export type NextResolverFn<T> = () => Promise<T>
179
+
180
+ export type DirectiveResolverFn<TResult = {}, TParent = {}, TContext = {}, TArgs = {}> = (
181
+ next: NextResolverFn<TResult>,
182
+ parent: TParent,
183
+ args: TArgs,
184
+ context: TContext,
185
+ info: GraphQLResolveInfo
186
+ ) => TResult | Promise<TResult>
187
+
188
+ /** Mapping between all available schema types and the resolvers types */
189
+ export type ResolversTypes = {
190
+ Boolean: ResolverTypeWrapper<Scalars['Boolean']>
191
+ DateTime: ResolverTypeWrapper<Scalars['DateTime']>
192
+ Event: ResolverTypeWrapper<Event>
193
+ EventArgs: EventArgs
194
+ EventState: EventState
195
+ Int: ResolverTypeWrapper<Scalars['Int']>
196
+ Json: ResolverTypeWrapper<Scalars['Json']>
197
+ Mutation: ResolverTypeWrapper<{}>
198
+ ProcessBatchResponse: ResolverTypeWrapper<ProcessBatchResponse>
199
+ Query: ResolverTypeWrapper<{}>
200
+ SetVariablesArgs: SetVariablesArgs
201
+ SetVariablesMode: SetVariablesMode
202
+ SetVariablesResponse: ResolverTypeWrapper<SetVariablesResponse>
203
+ String: ResolverTypeWrapper<Scalars['String']>
204
+ Uuid: ResolverTypeWrapper<Scalars['Uuid']>
205
+ Variable: ResolverTypeWrapper<Variable>
206
+ VariableInput: VariableInput
207
+ }
208
+
209
+ /** Mapping between all available schema types and the resolvers parents */
210
+ export type ResolversParentTypes = {
211
+ Boolean: Scalars['Boolean']
212
+ DateTime: Scalars['DateTime']
213
+ Event: Event
214
+ EventArgs: EventArgs
215
+ Int: Scalars['Int']
216
+ Json: Scalars['Json']
217
+ Mutation: {}
218
+ ProcessBatchResponse: ProcessBatchResponse
219
+ Query: {}
220
+ SetVariablesArgs: SetVariablesArgs
221
+ SetVariablesResponse: SetVariablesResponse
222
+ String: Scalars['String']
223
+ Uuid: Scalars['Uuid']
224
+ Variable: Variable
225
+ VariableInput: VariableInput
226
+ }
227
+
228
+ export interface DateTimeScalarConfig extends GraphQLScalarTypeConfig<ResolversTypes['DateTime'], any> {
229
+ name: 'DateTime'
230
+ }
231
+
232
+ export type EventResolvers<ContextType = any, ParentType extends ResolversParentTypes['Event'] = ResolversParentTypes['Event']> = {
233
+ createdAt?: Resolver<ResolversTypes['DateTime'], ParentType, ContextType>
234
+ id?: Resolver<ResolversTypes['Uuid'], ParentType, ContextType>
235
+ lastStateChange?: Resolver<ResolversTypes['DateTime'], ParentType, ContextType>
236
+ log?: Resolver<ResolversTypes['Json'], ParentType, ContextType>
237
+ numRetries?: Resolver<ResolversTypes['Int'], ParentType, ContextType>
238
+ payload?: Resolver<ResolversTypes['Json'], ParentType, ContextType>
239
+ resolvedAt?: Resolver<Maybe<ResolversTypes['DateTime']>, ParentType, ContextType>
240
+ stage?: Resolver<ResolversTypes['String'], ParentType, ContextType>
241
+ state?: Resolver<ResolversTypes['EventState'], ParentType, ContextType>
242
+ target?: Resolver<ResolversTypes['String'], ParentType, ContextType>
243
+ transactionId?: Resolver<ResolversTypes['Uuid'], ParentType, ContextType>
244
+ visibleAt?: Resolver<Maybe<ResolversTypes['DateTime']>, ParentType, ContextType>
245
+ __isTypeOf?: IsTypeOfResolverFn<ParentType, ContextType>
246
+ }
247
+
248
+ export interface JsonScalarConfig extends GraphQLScalarTypeConfig<ResolversTypes['Json'], any> {
249
+ name: 'Json'
250
+ }
251
+
252
+ export type MutationResolvers<ContextType = any, ParentType extends ResolversParentTypes['Mutation'] = ResolversParentTypes['Mutation']> = {
253
+ processBatch?: Resolver<ResolversTypes['ProcessBatchResponse'], ParentType, ContextType>
254
+ setVariables?: Resolver<ResolversTypes['SetVariablesResponse'], ParentType, ContextType, RequireFields<MutationSetVariablesArgs, 'args'>>
255
+ }
256
+
257
+ export type ProcessBatchResponseResolvers<ContextType = any, ParentType extends ResolversParentTypes['ProcessBatchResponse'] = ResolversParentTypes['ProcessBatchResponse']> = {
258
+ ok?: Resolver<ResolversTypes['Boolean'], ParentType, ContextType>
259
+ __isTypeOf?: IsTypeOfResolverFn<ParentType, ContextType>
260
+ }
261
+
262
+ export type QueryResolvers<ContextType = any, ParentType extends ResolversParentTypes['Query'] = ResolversParentTypes['Query']> = {
263
+ eventsInProcessing?: Resolver<ReadonlyArray<ResolversTypes['Event']>, ParentType, ContextType, Partial<QueryEventsInProcessingArgs>>
264
+ eventsToProcess?: Resolver<ReadonlyArray<ResolversTypes['Event']>, ParentType, ContextType, Partial<QueryEventsToProcessArgs>>
265
+ failedEvents?: Resolver<ReadonlyArray<ResolversTypes['Event']>, ParentType, ContextType, Partial<QueryFailedEventsArgs>>
266
+ variables?: Resolver<ReadonlyArray<ResolversTypes['Variable']>, ParentType, ContextType>
267
+ }
268
+
269
+ export type SetVariablesResponseResolvers<ContextType = any, ParentType extends ResolversParentTypes['SetVariablesResponse'] = ResolversParentTypes['SetVariablesResponse']> = {
270
+ ok?: Resolver<ResolversTypes['Boolean'], ParentType, ContextType>
271
+ __isTypeOf?: IsTypeOfResolverFn<ParentType, ContextType>
272
+ }
273
+
274
+ export interface UuidScalarConfig extends GraphQLScalarTypeConfig<ResolversTypes['Uuid'], any> {
275
+ name: 'Uuid'
276
+ }
277
+
278
+ export type VariableResolvers<ContextType = any, ParentType extends ResolversParentTypes['Variable'] = ResolversParentTypes['Variable']> = {
279
+ name?: Resolver<ResolversTypes['String'], ParentType, ContextType>
280
+ value?: Resolver<ResolversTypes['String'], ParentType, ContextType>
281
+ __isTypeOf?: IsTypeOfResolverFn<ParentType, ContextType>
282
+ }
283
+
284
+ export type Resolvers<ContextType = any> = {
285
+ DateTime?: GraphQLScalarType
286
+ Event?: EventResolvers<ContextType>
287
+ Json?: GraphQLScalarType
288
+ Mutation?: MutationResolvers<ContextType>
289
+ ProcessBatchResponse?: ProcessBatchResponseResolvers<ContextType>
290
+ Query?: QueryResolvers<ContextType>
291
+ SetVariablesResponse?: SetVariablesResponseResolvers<ContextType>
292
+ Uuid?: GraphQLScalarType
293
+ Variable?: VariableResolvers<ContextType>
294
+ }
295
+
package/src/index.ts ADDED
@@ -0,0 +1,88 @@
1
+ import { Plugin } from '@contember/engine-plugins'
2
+ import { migrationsGroup } from './migrations'
3
+ import { ActionsExecutionContainerHookFactory } from './ActionsExecutionContainerHookFactory'
4
+ import { ListenerStoreProvider } from './ListenerStoreProvider'
5
+ import { MigrationGroup } from '@contember/database-migrations'
6
+ import { MasterContainerBuilder, MasterContainerHook } from '@contember/engine-http'
7
+ import { ActionsApiMiddlewareFactory } from './graphql/http/ActionsApiMiddlewareFactory'
8
+ import { ActionsGraphQLHandlerFactory } from './graphql/http/ActionsGraphQLHandlerFactory'
9
+ import { ResolversFactory } from './graphql/resolvers/ResolversFactory'
10
+ import { EventsQueryResolver, ProcessBatchMutationResolver, SetVariablesMutationResolver } from './graphql/resolvers'
11
+ import { EventDispatcher } from './dispatch/EventDispatcher'
12
+ import { EventsRepository } from './dispatch/EventsRepository'
13
+ import { TargetHandlerResolver } from './dispatch/TargetHandlerResolver'
14
+ import { WebhookTargetHandler } from './dispatch/WebhookTargetHandler'
15
+ import { ActionsContextResolver } from './graphql/http/ActionsContextResolver'
16
+ import { ActionsWebsocketControllerFactory } from './graphql/http/ActionsWebsocketControllerFactory'
17
+ import { DispatchWorkerSupervisorFactory } from './dispatch/DispatchWorkerSupervisor'
18
+ import { ProjectDispatcherFactory } from './dispatch/ProjectDispatcher'
19
+ import { VariablesQueryResolver } from './graphql/resolvers/query/VariablesQueryResolver'
20
+ import { VariablesManager } from './model/VariablesManager'
21
+
22
+ export {
23
+ TriggerListenersFactory,
24
+ TriggerListenersStore,
25
+ TriggerHandler,
26
+ TriggerPayloadManager,
27
+ TriggerIndirectChangesFetcher,
28
+ } from './triggers'
29
+ export { ActionsExecutionContainerHookFactory } from './ActionsExecutionContainerHookFactory'
30
+ export { ListenerStoreProvider } from './ListenerStoreProvider'
31
+
32
+ export default class ActionsPlugin implements Plugin {
33
+ name = 'contember/actions'
34
+
35
+ getSystemMigrations(): MigrationGroup {
36
+ return migrationsGroup
37
+ }
38
+
39
+ getExecutionContainerHook() {
40
+ const hookFactory = new ActionsExecutionContainerHookFactory(new ListenerStoreProvider())
41
+ return hookFactory.create()
42
+ }
43
+
44
+ getMasterContainerHook() {
45
+ const hook: MasterContainerHook = (builder: MasterContainerBuilder) => {
46
+ return builder
47
+ .addService('actions_variableManager', () => {
48
+ return new VariablesManager()
49
+ })
50
+ .addService('actions_eventDispatcher', ({ actions_variableManager }) => {
51
+ const eventsRepository = new EventsRepository()
52
+ const webhookTargetHandler = new WebhookTargetHandler()
53
+ const targetHandlerResolver = new TargetHandlerResolver(webhookTargetHandler)
54
+ return new EventDispatcher(eventsRepository, actions_variableManager, targetHandlerResolver)
55
+ })
56
+ .addService('actions_dispatchWorkerSupervisorFactory', ({ actions_eventDispatcher }) => {
57
+ const projectDispatcherFactory = new ProjectDispatcherFactory(actions_eventDispatcher)
58
+ return new DispatchWorkerSupervisorFactory(projectDispatcherFactory)
59
+ })
60
+ .setupService('application', (it, { projectContextResolver, debugMode, actions_eventDispatcher, actions_dispatchWorkerSupervisorFactory, actions_variableManager }) => {
61
+ const handlerFactory = new ActionsGraphQLHandlerFactory()
62
+ const eventsQueryResolver = new EventsQueryResolver()
63
+ const processBatchMutationResolver = new ProcessBatchMutationResolver(actions_eventDispatcher)
64
+ const variablesQueryResolver = new VariablesQueryResolver(actions_variableManager)
65
+ const setVariablesMutationResolver = new SetVariablesMutationResolver(actions_variableManager)
66
+ const resolversFactory = new ResolversFactory(
67
+ eventsQueryResolver,
68
+ processBatchMutationResolver,
69
+ variablesQueryResolver,
70
+ setVariablesMutationResolver,
71
+ )
72
+
73
+ const actionsContextResolver = new ActionsContextResolver(debugMode, projectContextResolver)
74
+ const actionsMiddlewareFactory = new ActionsApiMiddlewareFactory(actionsContextResolver, handlerFactory.create(resolversFactory))
75
+ const actionsWebsocketMiddlewareFactory = new ActionsWebsocketControllerFactory(debugMode, actionsContextResolver, actions_dispatchWorkerSupervisorFactory)
76
+ it.addRoute('actions', '/actions/:projectSlug', actionsMiddlewareFactory.create())
77
+ it.addWebsocketRoute('actions', '/actions/_worker', actionsWebsocketMiddlewareFactory.create())
78
+ })
79
+ .setupService('applicationWorkers', (it, { actions_dispatchWorkerSupervisorFactory, projectGroupContainer, serverConfig }) => {
80
+ if (!(serverConfig as any).projectGroup) {
81
+ it.registerWorker(this.name, actions_dispatchWorkerSupervisorFactory.create(projectGroupContainer))
82
+ }
83
+ }) as unknown as MasterContainerBuilder
84
+
85
+ }
86
+ return hook
87
+ }
88
+ }
@@ -0,0 +1,16 @@
1
+ import { MigrationBuilder } from '@contember/database-migrations'
2
+
3
+ const sql = `
4
+ CREATE TABLE actions_variable
5
+ (
6
+ id UUID PRIMARY KEY NOT NULL,
7
+ created_at TIMESTAMPTZ NOT NULL DEFAULT NOW(),
8
+ updated_at TIMESTAMPTZ NOT NULL DEFAULT NOW(),
9
+ name TEXT NOT NULL UNIQUE,
10
+ value TEXT NOT NULL
11
+ )
12
+ `
13
+
14
+ export default async function (builder: MigrationBuilder) {
15
+ builder.sql(sql)
16
+ }
@@ -0,0 +1,7 @@
1
+ import snapshot from './snapshot'
2
+ import { MigrationGroup } from '@contember/database-migrations'
3
+ import _20230310145000actionsvariables from './2023-03-10-145000-actions-variables'
4
+
5
+ export const migrationsGroup = new MigrationGroup(snapshot, {
6
+ '2023-03-10-145000-actions-variables': _20230310145000actionsvariables,
7
+ })
@@ -0,0 +1,47 @@
1
+ import { MigrationBuilder } from '@contember/database-migrations'
2
+
3
+ export default async function (builder: MigrationBuilder) {
4
+ builder.sql(`
5
+ CREATE TYPE ACTIONS_TRIGGER_STATE AS ENUM (
6
+ 'created' ,
7
+ 'retrying',
8
+ 'processing',
9
+ 'succeed',
10
+ 'failed',
11
+ 'stopped'
12
+ );
13
+
14
+ CREATE TABLE actions_event
15
+ (
16
+ id UUID PRIMARY KEY NOT NULL,
17
+ transaction_id UUID NOT NULL,
18
+ created_at TIMESTAMPTZ NOT NULL DEFAULT NOW(),
19
+ resolved_at TIMESTAMPTZ,
20
+ visible_at TIMESTAMPTZ NOT NULL DEFAULT NOW(),
21
+ num_retries INT NOT NULL,
22
+ state ACTIONS_TRIGGER_STATE NOT NULL DEFAULT 'created',
23
+ last_state_change TIMESTAMPTZ NOT NULL DEFAULT NOW(),
24
+ stage_id UUID NOT NULL
25
+ REFERENCES stage
26
+ ON DELETE CASCADE,
27
+ schema_id INTEGER NOT NULL
28
+ REFERENCES schema_migration,
29
+ target TEXT NOT NULL,
30
+ trigger TEXT NOT NULL,
31
+ priority INT NOT NULL DEFAULT 0,
32
+ payload JSONB NOT NULL,
33
+ log JSONB NOT NULL DEFAULT '[]'
34
+ );
35
+
36
+ CREATE INDEX ON actions_event (priority DESC, visible_at) WHERE state IN ('created', 'retrying', 'processing');
37
+
38
+ CREATE TABLE actions_variable
39
+ (
40
+ id UUID PRIMARY KEY NOT NULL,
41
+ created_at TIMESTAMPTZ NOT NULL DEFAULT NOW(),
42
+ updated_at TIMESTAMPTZ NOT NULL DEFAULT NOW(),
43
+ name TEXT NOT NULL UNIQUE,
44
+ value TEXT NOT NULL
45
+ )
46
+ `)
47
+ }
@@ -0,0 +1,21 @@
1
+ import { DatabaseQuery, DatabaseQueryable, SelectBuilder } from '@contember/database'
2
+ import { EventRow } from './types'
3
+ import { EventArgs } from '../graphql/schema'
4
+
5
+ export class EventsInProcessingQuery extends DatabaseQuery<EventRow[]> {
6
+ constructor(
7
+ private readonly args: EventArgs,
8
+ ) {
9
+ super()
10
+ }
11
+
12
+ async fetch(queryable: DatabaseQueryable): Promise<EventRow[]> {
13
+ return SelectBuilder.create<EventRow>()
14
+ .from('actions_event')
15
+ .select('*')
16
+ .where(it => it.in('state', ['processing']))
17
+ .orderBy('last_state_change', 'asc')
18
+ .limit(this.args.limit ?? 100, this.args.offset ?? 0)
19
+ .getResult(queryable.db)
20
+ }
21
+ }
@@ -0,0 +1,21 @@
1
+ import { DatabaseQuery, DatabaseQueryable, SelectBuilder } from '@contember/database'
2
+ import { EventRow } from './types'
3
+ import { EventArgs } from '../graphql/schema'
4
+ import { eventsToProcessSpecification } from './EventsToProcessSpecification'
5
+
6
+ export class EventsToProcessQuery extends DatabaseQuery<EventRow[]> {
7
+ constructor(
8
+ private readonly args: EventArgs,
9
+ ) {
10
+ super()
11
+ }
12
+
13
+ async fetch(queryable: DatabaseQueryable): Promise<EventRow[]> {
14
+ return SelectBuilder.create<EventRow>()
15
+ .from('actions_event')
16
+ .select('*')
17
+ .match(eventsToProcessSpecification)
18
+ .limit(this.args.limit ?? 100, this.args.offset ?? 0)
19
+ .getResult(queryable.db)
20
+ }
21
+ }
@@ -0,0 +1,11 @@
1
+ import { Operator, SelectBuilderSpecification } from '@contember/database'
2
+
3
+
4
+ export const eventsToProcessStateSpecification: SelectBuilderSpecification = qb => qb
5
+ .where(it => it.in('state', ['retrying', 'created', 'processing']))
6
+
7
+ export const eventsToProcessSpecification: SelectBuilderSpecification = qb => qb
8
+ .match(eventsToProcessStateSpecification)
9
+ .where(it => it.compare('visible_at', Operator.lte, 'now'))
10
+ .orderBy('priority', 'desc')
11
+ .orderBy('visible_at')
@@ -0,0 +1,21 @@
1
+ import { DatabaseQuery, DatabaseQueryable, SelectBuilder } from '@contember/database'
2
+ import { EventRow } from './types'
3
+ import { EventArgs } from '../graphql/schema'
4
+
5
+ export class FailedEventsQuery extends DatabaseQuery<EventRow[]> {
6
+ constructor(
7
+ private readonly args: EventArgs,
8
+ ) {
9
+ super()
10
+ }
11
+
12
+ async fetch(queryable: DatabaseQueryable): Promise<EventRow[]> {
13
+ return SelectBuilder.create<EventRow>()
14
+ .from('actions_event')
15
+ .select('*')
16
+ .where(it => it.in('state', ['failed', 'retrying']))
17
+ .orderBy('last_state_change', 'desc')
18
+ .limit(this.args.limit ?? 100, this.args.offset ?? 0)
19
+ .getResult(queryable.db)
20
+ }
21
+ }
@@ -0,0 +1,26 @@
1
+ import { Command } from '@contember/engine-system-api'
2
+ import { ConflictActionType, InsertBuilder, Literal } from '@contember/database'
3
+
4
+ export class SetVariableCommand implements Command<void> {
5
+
6
+ constructor(
7
+ private readonly name: string,
8
+ private readonly value: string,
9
+ ) {
10
+ }
11
+
12
+ async execute({ providers, db }: Command.Args): Promise<void> {
13
+ await InsertBuilder.create()
14
+ .into('actions_variable')
15
+ .values({
16
+ id: providers.uuid(),
17
+ name: this.name,
18
+ value: this.value,
19
+ })
20
+ .onConflict(ConflictActionType.update, ['name'], {
21
+ value: this.value,
22
+ updated_at: new Literal('NOW()'),
23
+ })
24
+ .execute(db)
25
+ }
26
+ }
@@ -0,0 +1,49 @@
1
+ import { DatabaseContext } from '@contember/engine-system-api'
2
+ import { VariablesQuery } from './VariablesQuery'
3
+ import { SetVariablesArgs } from '../graphql/schema'
4
+ import { DeleteBuilder } from '@contember/database'
5
+ import { SetVariableCommand } from './SetVariableCommand'
6
+
7
+ export type VariablesMap = Record<string, string>
8
+
9
+ export class VariablesManager {
10
+ public async fetchVariables(db: DatabaseContext): Promise<VariablesMap> {
11
+ return Object.fromEntries((await db.queryHandler.fetch(new VariablesQuery())).map(it => [it.name, it.value]))
12
+ }
13
+
14
+ public async setVariables(db: DatabaseContext, args: SetVariablesArgs) {
15
+ return await db.transaction(async db => {
16
+ const current = await this.fetchVariables(db)
17
+ const mode = args.mode ?? 'MERGE'
18
+ const inputVariables = Object.fromEntries(args.variables.map(it => [it.name, it.value]))
19
+
20
+ let newVariables: VariablesMap = {}
21
+ switch (mode) {
22
+ case 'APPEND_ONLY_MISSING':
23
+ newVariables = { ...inputVariables, ...current }
24
+ break
25
+ case 'MERGE':
26
+ newVariables = { ...current, ...inputVariables }
27
+ break
28
+ case 'SET':
29
+ newVariables = inputVariables
30
+ break
31
+ }
32
+
33
+ const toDelete = Object.keys(current).filter(it => !(it in newVariables))
34
+ if (toDelete.length > 0) {
35
+ await DeleteBuilder.create()
36
+ .from('actions_variable')
37
+ .where(it => it.in('name', toDelete))
38
+ .execute(db.client)
39
+ }
40
+
41
+ for (const [name, value] of Object.entries(newVariables)) {
42
+ if (value === current[name]) {
43
+ continue
44
+ }
45
+ await db.commandBus.execute(new SetVariableCommand(name, value))
46
+ }
47
+ })
48
+ }
49
+ }
@@ -0,0 +1,17 @@
1
+ import { DatabaseQuery, DatabaseQueryable, SelectBuilder } from '@contember/database'
2
+
3
+ export class VariablesQuery extends DatabaseQuery<VariableRow[]> {
4
+ public async fetch(queryable: DatabaseQueryable): Promise<VariableRow[]> {
5
+ return await SelectBuilder.create<VariableRow>()
6
+ .from('actions_variable')
7
+ .getResult(queryable.db)
8
+ }
9
+ }
10
+
11
+ export type VariableRow = {
12
+ id: string
13
+ name: string
14
+ value: string
15
+ created_at: Date
16
+ updated_at: Date
17
+ }
@@ -0,0 +1,15 @@
1
+ export type EventRow = {
2
+ id: string
3
+ transaction_id: string
4
+ created_at: Date
5
+ resolved_at: Date | null
6
+ visible_at: Date
7
+ num_retries: number
8
+ state: 'created' | 'retrying' | 'processing' | 'succeed' | 'failed' | 'stopped'
9
+ last_state_change: Date
10
+ stage_id: number
11
+ schema_id: string
12
+ target: string
13
+ payload: any
14
+ log: any[]
15
+ }