@contember/engine-system-api 0.12.0-beta.2 → 1.0.0-alpha.0

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 (296) hide show
  1. package/dist/src/SystemContainer.d.ts +15 -14
  2. package/dist/src/SystemContainer.d.ts.map +1 -1
  3. package/dist/src/SystemContainer.js +7 -11
  4. package/dist/src/SystemContainer.js.map +1 -1
  5. package/dist/src/index.d.ts +1 -1
  6. package/dist/src/index.d.ts.map +1 -1
  7. package/dist/src/index.js +1 -2
  8. package/dist/src/index.js.map +1 -1
  9. package/dist/src/model/ProjectInitializer.d.ts.map +1 -1
  10. package/dist/src/model/ProjectInitializer.js +7 -17
  11. package/dist/src/model/ProjectInitializer.js.map +1 -1
  12. package/dist/src/model/ProjectTruncateExecutor.js +3 -3
  13. package/dist/src/model/ProjectTruncateExecutor.js.map +1 -1
  14. package/dist/src/model/authorization/AuthorizationActions.d.ts +0 -20
  15. package/dist/src/model/authorization/AuthorizationActions.d.ts.map +1 -1
  16. package/dist/src/model/authorization/AuthorizationActions.js +0 -5
  17. package/dist/src/model/authorization/AuthorizationActions.js.map +1 -1
  18. package/dist/src/model/authorization/StagePermissionsFactory.d.ts.map +1 -1
  19. package/dist/src/model/authorization/StagePermissionsFactory.js +1 -21
  20. package/dist/src/model/authorization/StagePermissionsFactory.js.map +1 -1
  21. package/dist/src/model/commands/migrations/ModifyMigrationCommand.js +1 -1
  22. package/dist/src/model/commands/migrations/ModifyMigrationCommand.js.map +1 -1
  23. package/dist/src/model/commands/migrations/SaveMigrationCommand.js +1 -1
  24. package/dist/src/model/commands/migrations/SaveMigrationCommand.js.map +1 -1
  25. package/dist/src/model/commands/stages/CreateOrUpdateStageCommand.d.ts.map +1 -1
  26. package/dist/src/model/commands/stages/CreateOrUpdateStageCommand.js +2 -3
  27. package/dist/src/model/commands/stages/CreateOrUpdateStageCommand.js.map +1 -1
  28. package/dist/src/model/commands/stages/index.d.ts +0 -1
  29. package/dist/src/model/commands/stages/index.d.ts.map +1 -1
  30. package/dist/src/model/commands/stages/index.js +0 -1
  31. package/dist/src/model/commands/stages/index.js.map +1 -1
  32. package/dist/src/model/database/DatabaseContext.js +1 -1
  33. package/dist/src/model/database/DatabaseContext.js.map +1 -1
  34. package/dist/src/model/dependencies/content/index.d.ts +0 -1
  35. package/dist/src/model/dependencies/content/index.d.ts.map +1 -1
  36. package/dist/src/model/dependencies/content/index.js +0 -1
  37. package/dist/src/model/dependencies/content/index.js.map +1 -1
  38. package/dist/src/model/dependencies/index.d.ts +1 -0
  39. package/dist/src/model/dependencies/index.d.ts.map +1 -1
  40. package/dist/src/model/dependencies/index.js +1 -0
  41. package/dist/src/model/dependencies/index.js.map +1 -1
  42. package/dist/src/model/dependencies/tenant/IdentityFetcher.d.ts +2 -1
  43. package/dist/src/model/dependencies/tenant/IdentityFetcher.d.ts.map +1 -1
  44. package/dist/src/model/dependencies/tenant/index.d.ts +2 -0
  45. package/dist/src/model/dependencies/tenant/index.d.ts.map +1 -0
  46. package/dist/src/model/{events/dependency → dependencies/tenant}/index.js +1 -5
  47. package/dist/src/model/dependencies/tenant/index.js.map +1 -0
  48. package/dist/src/model/events/EventResponseBuilder.d.ts +11 -0
  49. package/dist/src/model/events/EventResponseBuilder.d.ts.map +1 -0
  50. package/dist/src/model/events/{HistoryEventResponseBuilder.js → EventResponseBuilder.js} +19 -18
  51. package/dist/src/model/events/EventResponseBuilder.js.map +1 -0
  52. package/dist/src/model/events/EventResponseHelper.d.ts +3 -3
  53. package/dist/src/model/events/EventResponseHelper.js +3 -3
  54. package/dist/src/model/events/EventResponseHelper.js.map +1 -1
  55. package/dist/src/model/events/identityUtils.js +1 -1
  56. package/dist/src/model/events/identityUtils.js.map +1 -1
  57. package/dist/src/model/events/index.d.ts +1 -5
  58. package/dist/src/model/events/index.d.ts.map +1 -1
  59. package/dist/src/model/events/index.js +1 -5
  60. package/dist/src/model/events/index.js.map +1 -1
  61. package/dist/src/model/helpers/modelHelpers.js +1 -1
  62. package/dist/src/model/helpers/modelHelpers.js.map +1 -1
  63. package/dist/src/model/migrations/MigrationExecutor.d.ts.map +1 -1
  64. package/dist/src/model/migrations/MigrationExecutor.js +2 -2
  65. package/dist/src/model/migrations/MigrationExecutor.js.map +1 -1
  66. package/dist/src/model/migrations/ProjectMigrator.d.ts.map +1 -1
  67. package/dist/src/model/migrations/ProjectMigrator.js +6 -12
  68. package/dist/src/model/migrations/ProjectMigrator.js.map +1 -1
  69. package/dist/src/model/migrations/SchemaVersionBuilder.js +2 -2
  70. package/dist/src/model/migrations/SchemaVersionBuilder.js.map +1 -1
  71. package/dist/src/model/queries/events/EventQueryHelpers.d.ts +4 -3
  72. package/dist/src/model/queries/events/EventQueryHelpers.d.ts.map +1 -1
  73. package/dist/src/model/queries/events/EventQueryHelpers.js +4 -5
  74. package/dist/src/model/queries/events/EventQueryHelpers.js.map +1 -1
  75. package/dist/src/model/queries/events/EventsQuery.d.ts +12 -0
  76. package/dist/src/model/queries/events/EventsQuery.d.ts.map +1 -0
  77. package/dist/src/model/queries/events/EventsQuery.js +88 -0
  78. package/dist/src/model/queries/events/EventsQuery.js.map +1 -0
  79. package/dist/src/model/queries/events/OldValuesQuery.d.ts +7 -0
  80. package/dist/src/model/queries/events/OldValuesQuery.d.ts.map +1 -0
  81. package/dist/src/model/queries/events/OldValuesQuery.js +25 -0
  82. package/dist/src/model/queries/events/OldValuesQuery.js.map +1 -0
  83. package/dist/src/model/queries/events/index.d.ts +2 -0
  84. package/dist/src/model/queries/events/index.d.ts.map +1 -1
  85. package/dist/src/model/queries/events/index.js +2 -0
  86. package/dist/src/model/queries/events/index.js.map +1 -1
  87. package/dist/src/model/queries/migrations/ExecutedMigrationByVersionQuery.js +2 -2
  88. package/dist/src/model/queries/migrations/ExecutedMigrationByVersionQuery.js.map +1 -1
  89. package/dist/src/model/queries/migrations/ExecutedMigrationsQuery.js +1 -1
  90. package/dist/src/model/queries/migrations/ExecutedMigrationsQuery.js.map +1 -1
  91. package/dist/src/model/queries/stages/StageBySlugQuery.js +1 -1
  92. package/dist/src/model/queries/stages/StageBySlugQuery.js.map +1 -1
  93. package/dist/src/model/queries/stages/StageQueryFactory.d.ts.map +1 -1
  94. package/dist/src/model/queries/stages/StageQueryFactory.js +0 -1
  95. package/dist/src/model/queries/stages/StageQueryFactory.js.map +1 -1
  96. package/dist/src/model/stages/StageCreator.d.ts +1 -2
  97. package/dist/src/model/stages/StageCreator.d.ts.map +1 -1
  98. package/dist/src/model/stages/StageCreator.js +2 -10
  99. package/dist/src/model/stages/StageCreator.js.map +1 -1
  100. package/dist/src/model/stages/index.d.ts +0 -1
  101. package/dist/src/model/stages/index.d.ts.map +1 -1
  102. package/dist/src/model/stages/index.js +0 -1
  103. package/dist/src/model/stages/index.js.map +1 -1
  104. package/dist/src/resolvers/ResolverContext.d.ts +3 -1
  105. package/dist/src/resolvers/ResolverContext.d.ts.map +1 -1
  106. package/dist/src/resolvers/ResolverContext.js +2 -1
  107. package/dist/src/resolvers/ResolverContext.js.map +1 -1
  108. package/dist/src/resolvers/ResolverFactory.d.ts +7 -11
  109. package/dist/src/resolvers/ResolverFactory.d.ts.map +1 -1
  110. package/dist/src/resolvers/ResolverFactory.js +21 -14
  111. package/dist/src/resolvers/ResolverFactory.js.map +1 -1
  112. package/dist/src/resolvers/mutation/MigrateMutationResolver.d.ts.map +1 -1
  113. package/dist/src/resolvers/mutation/MigrateMutationResolver.js +3 -2
  114. package/dist/src/resolvers/mutation/MigrateMutationResolver.js.map +1 -1
  115. package/dist/src/resolvers/mutation/index.d.ts +1 -0
  116. package/dist/src/resolvers/mutation/index.d.ts.map +1 -1
  117. package/dist/src/resolvers/mutation/index.js +1 -0
  118. package/dist/src/resolvers/mutation/index.js.map +1 -1
  119. package/dist/src/resolvers/query/EventsQueryResolver.d.ts +11 -0
  120. package/dist/src/resolvers/query/EventsQueryResolver.d.ts.map +1 -0
  121. package/dist/src/resolvers/query/EventsQueryResolver.js +26 -0
  122. package/dist/src/resolvers/query/EventsQueryResolver.js.map +1 -0
  123. package/dist/src/resolvers/query/index.d.ts +1 -0
  124. package/dist/src/resolvers/query/index.d.ts.map +1 -1
  125. package/dist/src/resolvers/query/index.js +1 -0
  126. package/dist/src/resolvers/query/index.js.map +1 -1
  127. package/dist/src/resolvers/types/EventOldValuesResolver.d.ts +6 -0
  128. package/dist/src/resolvers/types/EventOldValuesResolver.d.ts.map +1 -0
  129. package/dist/src/resolvers/types/EventOldValuesResolver.js +11 -0
  130. package/dist/src/resolvers/types/EventOldValuesResolver.js.map +1 -0
  131. package/dist/src/resolvers/types/OldValuesHelpers.d.ts +3 -0
  132. package/dist/src/resolvers/types/OldValuesHelpers.d.ts.map +1 -0
  133. package/dist/src/resolvers/types/OldValuesHelpers.js +10 -0
  134. package/dist/src/resolvers/types/OldValuesHelpers.js.map +1 -0
  135. package/dist/src/resolvers/types/index.d.ts +2 -0
  136. package/dist/src/resolvers/types/index.d.ts.map +1 -0
  137. package/dist/src/resolvers/types/index.js +14 -0
  138. package/dist/src/resolvers/types/index.js.map +1 -0
  139. package/dist/src/schema/dev.graphql.js +1 -1
  140. package/dist/src/schema/dev.graphql.js.map +1 -1
  141. package/dist/src/schema/system.graphql.d.ts.map +1 -1
  142. package/dist/src/schema/system.graphql.js +47 -43
  143. package/dist/src/schema/system.graphql.js.map +1 -1
  144. package/dist/src/schema/types.d.ts +146 -170
  145. package/dist/src/schema/types.d.ts.map +1 -1
  146. package/dist/src/schema/types.js +14 -12
  147. package/dist/src/schema/types.js.map +1 -1
  148. package/dist/src/tsconfig.tsbuildinfo +1 -1
  149. package/dist/src/types.d.ts +0 -1
  150. package/dist/src/types.d.ts.map +1 -1
  151. package/dist/src/utils/batchQuery.js +1 -1
  152. package/dist/src/utils/batchQuery.js.map +1 -1
  153. package/dist/tests/cases/integration/systemApi/projectInitializer.test.js +1 -1
  154. package/dist/tests/cases/integration/systemApi/projectInitializer.test.js.map +1 -1
  155. package/dist/tests/src/asserts.js +1 -1
  156. package/dist/tests/src/asserts.js.map +1 -1
  157. package/dist/tests/tsconfig.tsbuildinfo +1 -1
  158. package/migrations/2020-05-06-150000-composed-primary.js +4 -4
  159. package/migrations/2020-05-06-150000-composed-primary.test.js +3 -3
  160. package/migrations/2020-06-01-103000-event-trigger-perf.js +1 -1
  161. package/migrations/2020-06-01-103000-event-trigger-perf.test.js +3 -3
  162. package/migrations/2021-05-07-155800-event-log-rework.js +1 -1
  163. package/migrations/2021-05-19-1232000-event-log-fix-constraint.js +1 -1
  164. package/migrations/2021-12-21-155500-events-up.sql +6 -0
  165. package/migrations/index.js +1 -1
  166. package/migrations/tsconfig.tsbuildinfo +1 -1
  167. package/package.json +14 -14
  168. package/src/SystemContainer.ts +18 -26
  169. package/src/index.ts +0 -1
  170. package/src/model/ProjectInitializer.ts +5 -16
  171. package/src/model/authorization/AuthorizationActions.ts +0 -8
  172. package/src/model/authorization/StagePermissionsFactory.ts +0 -21
  173. package/src/model/commands/stages/CreateOrUpdateStageCommand.ts +1 -2
  174. package/src/model/commands/stages/index.ts +0 -1
  175. package/src/model/dependencies/content/index.ts +0 -1
  176. package/src/model/dependencies/index.ts +1 -0
  177. package/src/model/dependencies/tenant/IdentityFetcher.ts +3 -1
  178. package/src/model/dependencies/tenant/index.ts +1 -0
  179. package/src/model/events/{HistoryEventResponseBuilder.ts → EventResponseBuilder.ts} +13 -17
  180. package/src/model/events/EventResponseHelper.ts +3 -3
  181. package/src/model/events/index.ts +1 -5
  182. package/src/model/migrations/MigrationExecutor.ts +0 -2
  183. package/src/model/migrations/ProjectMigrator.ts +5 -11
  184. package/src/model/migrations/SchemaVersionBuilder.ts +1 -1
  185. package/src/model/queries/events/EventQueryHelpers.ts +15 -12
  186. package/src/model/queries/events/EventsQuery.ts +105 -0
  187. package/src/model/queries/events/OldValuesQuery.ts +23 -0
  188. package/src/model/queries/events/index.ts +2 -0
  189. package/src/model/queries/stages/StageQueryFactory.ts +0 -1
  190. package/src/model/stages/StageCreator.ts +1 -12
  191. package/src/model/stages/index.ts +0 -1
  192. package/src/resolvers/ResolverContext.ts +4 -0
  193. package/src/resolvers/ResolverFactory.ts +27 -37
  194. package/src/resolvers/mutation/MigrateMutationResolver.ts +4 -3
  195. package/src/resolvers/mutation/index.ts +1 -0
  196. package/src/resolvers/query/EventsQueryResolver.ts +42 -0
  197. package/src/resolvers/query/index.ts +1 -0
  198. package/src/resolvers/types/EventOldValuesResolver.ts +13 -0
  199. package/src/resolvers/types/OldValuesHelpers.ts +11 -0
  200. package/src/resolvers/types/index.ts +1 -0
  201. package/src/schema/system.graphql.ts +46 -42
  202. package/src/schema/types.ts +148 -175
  203. package/src/types.ts +0 -1
  204. package/tests/src/asserts.ts +1 -1
  205. package/dist/src/model/commands/stages/UpdateStageEventCommand.d.ts +0 -8
  206. package/dist/src/model/commands/stages/UpdateStageEventCommand.d.ts.map +0 -1
  207. package/dist/src/model/commands/stages/UpdateStageEventCommand.js +0 -21
  208. package/dist/src/model/commands/stages/UpdateStageEventCommand.js.map +0 -1
  209. package/dist/src/model/dependencies/content/ContentEventsApplier.d.ts +0 -23
  210. package/dist/src/model/dependencies/content/ContentEventsApplier.d.ts.map +0 -1
  211. package/dist/src/model/dependencies/content/ContentEventsApplier.js +0 -3
  212. package/dist/src/model/dependencies/content/ContentEventsApplier.js.map +0 -1
  213. package/dist/src/model/events/DependencyBuilder.d.ts +0 -8
  214. package/dist/src/model/events/DependencyBuilder.d.ts.map +0 -1
  215. package/dist/src/model/events/DependencyBuilder.js +0 -3
  216. package/dist/src/model/events/DependencyBuilder.js.map +0 -1
  217. package/dist/src/model/events/DiffBuilder.d.ts +0 -48
  218. package/dist/src/model/events/DiffBuilder.d.ts.map +0 -1
  219. package/dist/src/model/events/DiffBuilder.js +0 -95
  220. package/dist/src/model/events/DiffBuilder.js.map +0 -1
  221. package/dist/src/model/events/EventFilterValidator.d.ts +0 -12
  222. package/dist/src/model/events/EventFilterValidator.d.ts.map +0 -1
  223. package/dist/src/model/events/EventFilterValidator.js +0 -50
  224. package/dist/src/model/events/EventFilterValidator.js.map +0 -1
  225. package/dist/src/model/events/HistoryEventResponseBuilder.d.ts +0 -10
  226. package/dist/src/model/events/HistoryEventResponseBuilder.d.ts.map +0 -1
  227. package/dist/src/model/events/HistoryEventResponseBuilder.js.map +0 -1
  228. package/dist/src/model/events/TableReferencingResolver.d.ts +0 -8
  229. package/dist/src/model/events/TableReferencingResolver.d.ts.map +0 -1
  230. package/dist/src/model/events/TableReferencingResolver.js +0 -31
  231. package/dist/src/model/events/TableReferencingResolver.js.map +0 -1
  232. package/dist/src/model/events/dependency/CreatedRowReferenceDependencyBuilder.d.ts +0 -19
  233. package/dist/src/model/events/dependency/CreatedRowReferenceDependencyBuilder.d.ts.map +0 -1
  234. package/dist/src/model/events/dependency/CreatedRowReferenceDependencyBuilder.js +0 -79
  235. package/dist/src/model/events/dependency/CreatedRowReferenceDependencyBuilder.js.map +0 -1
  236. package/dist/src/model/events/dependency/DeletedRowReferenceDependencyBuilder.d.ts +0 -17
  237. package/dist/src/model/events/dependency/DeletedRowReferenceDependencyBuilder.d.ts.map +0 -1
  238. package/dist/src/model/events/dependency/DeletedRowReferenceDependencyBuilder.js +0 -76
  239. package/dist/src/model/events/dependency/DeletedRowReferenceDependencyBuilder.js.map +0 -1
  240. package/dist/src/model/events/dependency/DependencyBuilderList.d.ts +0 -9
  241. package/dist/src/model/events/dependency/DependencyBuilderList.d.ts.map +0 -1
  242. package/dist/src/model/events/dependency/DependencyBuilderList.js +0 -20
  243. package/dist/src/model/events/dependency/DependencyBuilderList.js.map +0 -1
  244. package/dist/src/model/events/dependency/SameRowDependencyBuilder.d.ts +0 -16
  245. package/dist/src/model/events/dependency/SameRowDependencyBuilder.d.ts.map +0 -1
  246. package/dist/src/model/events/dependency/SameRowDependencyBuilder.js +0 -38
  247. package/dist/src/model/events/dependency/SameRowDependencyBuilder.js.map +0 -1
  248. package/dist/src/model/events/dependency/TransactionDependencyBuilder.d.ts +0 -15
  249. package/dist/src/model/events/dependency/TransactionDependencyBuilder.d.ts.map +0 -1
  250. package/dist/src/model/events/dependency/TransactionDependencyBuilder.js +0 -30
  251. package/dist/src/model/events/dependency/TransactionDependencyBuilder.js.map +0 -1
  252. package/dist/src/model/events/dependency/index.d.ts +0 -6
  253. package/dist/src/model/events/dependency/index.d.ts.map +0 -1
  254. package/dist/src/model/events/dependency/index.js.map +0 -1
  255. package/dist/src/model/stages/StageTree.d.ts +0 -14
  256. package/dist/src/model/stages/StageTree.d.ts.map +0 -1
  257. package/dist/src/model/stages/StageTree.js +0 -38
  258. package/dist/src/model/stages/StageTree.js.map +0 -1
  259. package/dist/src/resolvers/helpers/StageFetchHelper.d.ts +0 -22
  260. package/dist/src/resolvers/helpers/StageFetchHelper.d.ts.map +0 -1
  261. package/dist/src/resolvers/helpers/StageFetchHelper.js +0 -45
  262. package/dist/src/resolvers/helpers/StageFetchHelper.js.map +0 -1
  263. package/dist/tests/cases/unit/events/createdRowReference.test.d.ts +0 -2
  264. package/dist/tests/cases/unit/events/createdRowReference.test.d.ts.map +0 -1
  265. package/dist/tests/cases/unit/events/createdRowReference.test.js +0 -138
  266. package/dist/tests/cases/unit/events/createdRowReference.test.js.map +0 -1
  267. package/dist/tests/cases/unit/events/deletedRowReference.test.d.ts +0 -2
  268. package/dist/tests/cases/unit/events/deletedRowReference.test.d.ts.map +0 -1
  269. package/dist/tests/cases/unit/events/deletedRowReference.test.js +0 -103
  270. package/dist/tests/cases/unit/events/deletedRowReference.test.js.map +0 -1
  271. package/dist/tests/cases/unit/events/sameRowDependency.test.d.ts +0 -2
  272. package/dist/tests/cases/unit/events/sameRowDependency.test.d.ts.map +0 -1
  273. package/dist/tests/cases/unit/events/sameRowDependency.test.js +0 -63
  274. package/dist/tests/cases/unit/events/sameRowDependency.test.js.map +0 -1
  275. package/dist/tests/cases/unit/events/transactionDependency.test.d.ts +0 -2
  276. package/dist/tests/cases/unit/events/transactionDependency.test.d.ts.map +0 -1
  277. package/dist/tests/cases/unit/events/transactionDependency.test.js +0 -62
  278. package/dist/tests/cases/unit/events/transactionDependency.test.js.map +0 -1
  279. package/src/model/commands/stages/UpdateStageEventCommand.ts +0 -16
  280. package/src/model/dependencies/content/ContentEventsApplier.ts +0 -27
  281. package/src/model/events/DependencyBuilder.ts +0 -9
  282. package/src/model/events/DiffBuilder.ts +0 -150
  283. package/src/model/events/EventFilterValidator.ts +0 -52
  284. package/src/model/events/TableReferencingResolver.ts +0 -45
  285. package/src/model/events/dependency/CreatedRowReferenceDependencyBuilder.ts +0 -80
  286. package/src/model/events/dependency/DeletedRowReferenceDependencyBuilder.ts +0 -75
  287. package/src/model/events/dependency/DependencyBuilderList.ts +0 -18
  288. package/src/model/events/dependency/SameRowDependencyBuilder.ts +0 -36
  289. package/src/model/events/dependency/TransactionDependencyBuilder.ts +0 -31
  290. package/src/model/events/dependency/index.ts +0 -5
  291. package/src/model/stages/StageTree.ts +0 -36
  292. package/src/resolvers/helpers/StageFetchHelper.ts +0 -48
  293. package/tests/cases/unit/events/createdRowReference.test.ts +0 -131
  294. package/tests/cases/unit/events/deletedRowReference.test.ts +0 -95
  295. package/tests/cases/unit/events/sameRowDependency.test.ts +0 -48
  296. package/tests/cases/unit/events/transactionDependency.test.ts +0 -47
@@ -0,0 +1,105 @@
1
+ import {
2
+ ConditionBuilder,
3
+ DatabaseQuery,
4
+ DatabaseQueryable,
5
+ Operator,
6
+ SelectBuilder,
7
+ SelectBuilderSpecification, Value,
8
+ } from '@contember/database'
9
+ import { AnyEvent, ContentEvent } from '@contember/engine-common'
10
+ import { EventsFilter, EventsFilterDate, EventsOrder } from '../../../schema'
11
+ import { createEventsFromRows, EventRow } from './EventQueryHelpers'
12
+
13
+ export class EventsQuery extends DatabaseQuery<AnyEvent[]> {
14
+ constructor(
15
+ private readonly filter: EventsFilter,
16
+ private readonly order: EventsOrder,
17
+ private readonly offset: number,
18
+ private readonly limit: number,
19
+ ) {
20
+ super()
21
+ }
22
+
23
+ async fetch({ db }: DatabaseQueryable): Promise<ContentEvent[]> {
24
+ const createDateMatcher = (column: string, dateFilter: EventsFilterDate | undefined): SelectBuilderSpecification => qb => {
25
+ if (!dateFilter) {
26
+ return qb
27
+ }
28
+ const { from, to } = dateFilter
29
+ if (from) {
30
+ qb = qb.where(expr => expr.compare(column, Operator.lte, from))
31
+ }
32
+ if (to) {
33
+ qb = qb.where(expr => expr.compare(column, Operator.gte, to))
34
+ }
35
+ return qb
36
+ }
37
+ const createInMatcher = (column: string | [string, string], values?: readonly Value[] | null): SelectBuilderSpecification => qb => {
38
+ if (!values) {
39
+ return qb
40
+ }
41
+ return qb.where(ConditionBuilder.create().in(column, values))
42
+ }
43
+
44
+ const qb = SelectBuilder.create<EventRow>()
45
+ .select('id')
46
+ .select('type')
47
+ .select('table_name')
48
+ .select('row_ids')
49
+ .select('values')
50
+ .select('created_at')
51
+ .select('applied_at')
52
+ .select('identity_id')
53
+ .select(['event_data', 'transaction_id'])
54
+
55
+ .from('event_data')
56
+ .join('stage_transaction', undefined, on =>
57
+ on.columnsEq(['event_data', 'transaction_id'], ['stage_transaction', 'transaction_id']),
58
+ )
59
+ .match(qb => {
60
+ switch (this.order) {
61
+ case EventsOrder.AppliedAtAsc:
62
+ return qb.orderBy('applied_at', 'asc')
63
+ case EventsOrder.AppliedAtDesc:
64
+ return qb.orderBy('applied_at', 'desc')
65
+ case EventsOrder.CreatedAtAsc:
66
+ return qb.orderBy('created_at', 'asc')
67
+ case EventsOrder.CreatedAtDesc:
68
+ return qb.orderBy('created_at', 'desc')
69
+ }
70
+ })
71
+ .match(createInMatcher('type', this.filter.types?.map(it => it.toLowerCase())))
72
+ .match(createInMatcher('table_name', this.filter.tables))
73
+ .match(createInMatcher('transactions', this.filter.transactions))
74
+ .match(createInMatcher('identities', this.filter.identities))
75
+ .match(createDateMatcher('created_at', this.filter.createdAt ?? undefined))
76
+ .match(createDateMatcher('applied_at', this.filter.appliedAt ?? undefined))
77
+ .match(qb => {
78
+ if (!this.filter.rows) {
79
+ return qb
80
+ }
81
+ type PrimaryKey = readonly string[]
82
+ const byTable: Record<string, PrimaryKey[]> = {}
83
+ for (const row of this.filter.rows) {
84
+ byTable[row.tableName] ??= []
85
+ byTable[row.tableName].push(row.primaryKey)
86
+ }
87
+ const rowFilters = Object.entries(byTable)
88
+ const ors = rowFilters.reduce(
89
+ (expr, [table, rowIds]) =>
90
+ expr.and(
91
+ ConditionBuilder.create()
92
+ .compare('table_name', Operator.eq, table)
93
+ .in('row_ids', rowIds.map(it => JSON.stringify(it))),
94
+ ),
95
+ ConditionBuilder.create(),
96
+ )
97
+ return qb.where(ConditionBuilder.create().or(ors))
98
+ })
99
+
100
+ .limit(this.limit, this.offset)
101
+
102
+ return createEventsFromRows(await qb.getResult(db))
103
+ }
104
+
105
+ }
@@ -0,0 +1,23 @@
1
+ import { DatabaseQuery, DatabaseQueryable, Literal, Operator, SelectBuilder } from '@contember/database'
2
+
3
+ export class OldValuesQuery extends DatabaseQuery<Record<string, any>> {
4
+ constructor(private readonly ids: string[]) {
5
+ super()
6
+ }
7
+
8
+ async fetch(queryable: DatabaseQueryable): Promise<Record<string, any>> {
9
+ const qb = SelectBuilder.create()
10
+ .select(expr => expr.raw('JSONB_OBJECT_AGG(values.key, values.value ORDER BY previous.created_at ASC)'), 'values')
11
+ .select(['event_data', 'id'])
12
+ .from('event_data')
13
+ .join('event_data', 'previous', on => on
14
+ .columnsEq(['event_data', 'row_ids'], ['previous', 'row_ids'])
15
+ .compareColumns(['event_data', 'created_at'], Operator.gt, ['previous', 'created_at']),
16
+ )
17
+ .join(new Literal('JSONB_EACH(previous.values)'), 'values')
18
+ .where(where => where.in(['event_data', 'id'], this.ids))
19
+ .groupBy(['event_data', 'id'])
20
+
21
+ return Object.fromEntries((await qb.getResult(queryable.db)).map(it => [it.id, it.values]))
22
+ }
23
+ }
@@ -1 +1,3 @@
1
+ export * from './EventsQuery'
1
2
  export * from './LatestTransactionIdByStageQuery'
3
+ export * from './OldValuesQuery'
@@ -6,6 +6,5 @@ export const prepareStageQueryBuilder = () => {
6
6
  .select('id')
7
7
  .select('name')
8
8
  .select('slug')
9
- .select('event_id')
10
9
  .from('stage')
11
10
  }
@@ -2,30 +2,19 @@ import { CreateOrUpdateStageCommand } from '../commands'
2
2
  import { StageBySlugQuery } from '../queries'
3
3
  import { StageConfig } from '../../types'
4
4
  import { DatabaseContext } from '../database'
5
- import { Logger } from '@contember/engine-common'
6
- import { StagingDisabledError } from '../../StagingDisabledError'
7
5
 
8
6
  class StageCreator {
9
7
  constructor() {}
10
8
 
11
9
  public async createStage(
12
10
  db: DatabaseContext,
13
- parent: StageConfig | null,
14
11
  stage: StageConfig,
15
- logger: Logger,
16
12
  ): Promise<boolean> {
17
13
  const stageRow = await db.queryHandler.fetch(new StageBySlugQuery(stage.slug))
18
14
  if (stageRow && stageRow.name === stage.name) {
19
15
  return false
20
16
  }
21
- const created = await db.commandBus.execute(new CreateOrUpdateStageCommand(stage))
22
- if (!created) {
23
- return false
24
- }
25
- if (!parent) {
26
- return true
27
- }
28
- throw new StagingDisabledError()
17
+ return await db.commandBus.execute(new CreateOrUpdateStageCommand(stage))
29
18
  }
30
19
  }
31
20
 
@@ -1,2 +1 @@
1
1
  export * from './StageCreator'
2
- export * from './StageTree'
@@ -7,6 +7,7 @@ import { Identity } from '../model/authorization'
7
7
  import { StagePermissionsFactory } from '../model/authorization/StagePermissionsFactory'
8
8
  import { StageScope } from '../model/authorization/StageScope'
9
9
  import { ItemLoader } from '../utils/batchQuery'
10
+ import { Client } from '@contember/database'
10
11
 
11
12
  export class ResolverContextFactory {
12
13
  constructor(
@@ -16,6 +17,7 @@ export class ResolverContextFactory {
16
17
 
17
18
  public async create(
18
19
  systemDbContext: DatabaseContext,
20
+ tenantDb: Client,
19
21
  project: ProjectConfig,
20
22
  identity: Identity,
21
23
  variables: Acl.VariablesMap,
@@ -44,6 +46,7 @@ export class ResolverContextFactory {
44
46
  loaders.set(loaderFactory, newLoader)
45
47
  return newLoader
46
48
  },
49
+ tenantDb,
47
50
  }
48
51
  }
49
52
  }
@@ -59,4 +62,5 @@ export interface ResolverContext {
59
62
  readonly authorizator: Authorizator<Identity>
60
63
  readonly requireAccess: (action: Authorizator.Action, stage: string, message?: string) => Promise<void>
61
64
  readonly getLoader: <Args, Item>(loaderFactory: LoaderFactory<Args, Item>) => ItemLoader<Args, Item>
65
+ readonly tenantDb: Client
62
66
  }
@@ -1,36 +1,34 @@
1
- import { ExecutedMigrationsQueryResolver, StagesQueryResolver } from './query'
2
- import { HistoryEvent, HistoryEventType, Resolvers } from '../schema'
1
+ import { EventsQueryResolver, ExecutedMigrationsQueryResolver, StagesQueryResolver } from './query'
2
+ import { Event, EventType, Resolvers } from '../schema'
3
3
  import { assertNever } from '../utils'
4
- import { ResolverContext } from './ResolverContext'
5
- import { GraphQLResolveInfo } from 'graphql'
6
- import { MigrateMutationResolver, TruncateMutationResolver } from './mutation'
4
+ import { MigrateMutationResolver, MigrationAlterMutationResolver, TruncateMutationResolver } from './mutation'
7
5
  import { DateTimeType, JSONType } from '@contember/graphql-utils'
8
- import { MigrationAlterMutationResolver } from './mutation/MigrationAlterMutationResolver'
6
+ import { EventOldValuesResolver } from './types'
9
7
 
10
- class ResolverFactory {
8
+ export class ResolverFactory {
11
9
  public constructor(
12
10
  private readonly stagesQueryResolver: StagesQueryResolver,
13
11
  private readonly executedMigrationsQueryResolver: ExecutedMigrationsQueryResolver,
14
12
  private readonly migrateMutationResolver: MigrateMutationResolver,
15
13
  private readonly truncateMutationResolver: TruncateMutationResolver,
16
14
  private readonly migrationAlterMutationResolver: MigrationAlterMutationResolver,
15
+ private readonly eventsQueryResolver: EventsQueryResolver,
16
+ private readonly eventOldValuesResolver: EventOldValuesResolver,
17
17
  ) {}
18
18
 
19
19
  create(debugMode: boolean): Resolvers {
20
20
  const resolvers: Resolvers & Required<Pick<Resolvers, 'Mutation'>> = {
21
21
  DateTime: DateTimeType,
22
22
  Json: JSONType,
23
- HistoryEvent: {
24
- __resolveType: (obj: HistoryEvent) => {
23
+ Event: {
24
+ __resolveType: (obj: Event) => {
25
25
  switch (obj.type) {
26
- case HistoryEventType.Create:
27
- return 'HistoryCreateEvent'
28
- case HistoryEventType.Update:
29
- return 'HistoryUpdateEvent'
30
- case HistoryEventType.Delete:
31
- return 'HistoryDeleteEvent'
32
- case HistoryEventType.RunMigration:
33
- return 'HistoryRunMigrationEvent'
26
+ case EventType.Create:
27
+ return 'CreateEvent'
28
+ case EventType.Update:
29
+ return 'UpdateEvent'
30
+ case EventType.Delete:
31
+ return 'DeleteEvent'
34
32
  case null:
35
33
  case undefined:
36
34
  return null
@@ -40,34 +38,26 @@ class ResolverFactory {
40
38
  },
41
39
  },
42
40
  Query: {
43
- stages: (parent: any, args: any, context: ResolverContext, info: GraphQLResolveInfo) =>
44
- this.stagesQueryResolver.stages(parent, args, context, info),
45
- executedMigrations: (parent: any, args: any, context: ResolverContext, info: GraphQLResolveInfo) =>
46
- this.executedMigrationsQueryResolver.executedMigrations(parent, args, context, info),
41
+ stages: this.stagesQueryResolver.stages.bind(this.stagesQueryResolver),
42
+ executedMigrations: this.executedMigrationsQueryResolver.executedMigrations.bind(this.executedMigrationsQueryResolver),
43
+ events: this.eventsQueryResolver.events.bind(this.eventsQueryResolver),
47
44
  },
48
45
  Mutation: {
49
- migrate: (parent: any, args: any, context: ResolverContext, info: GraphQLResolveInfo) =>
50
- this.migrateMutationResolver.migrate(parent, args, context, info),
46
+ migrate: this.migrateMutationResolver.migrate.bind(this.migrateMutationResolver),
47
+ },
48
+ DeleteEvent: {
49
+ oldValues: this.eventOldValuesResolver.oldValues.bind(this.eventOldValuesResolver),
50
+ },
51
+ UpdateEvent: {
52
+ oldValues: this.eventOldValuesResolver.oldValues.bind(this.eventOldValuesResolver),
51
53
  },
52
54
  }
53
55
  if (debugMode) {
54
56
  resolvers.Mutation.truncate = this.truncateMutationResolver.truncate.bind(this.truncateMutationResolver)
55
- resolvers.Mutation.migrationDelete = this.migrationAlterMutationResolver.migrationDelete.bind(
56
- this.migrationAlterMutationResolver,
57
- )
58
- resolvers.Mutation.migrationModify = this.migrationAlterMutationResolver.migrationModify.bind(
59
- this.migrationAlterMutationResolver,
60
- )
57
+ resolvers.Mutation.migrationDelete = this.migrationAlterMutationResolver.migrationDelete.bind(this.migrationAlterMutationResolver)
58
+ resolvers.Mutation.migrationModify = this.migrationAlterMutationResolver.migrationModify.bind(this.migrationAlterMutationResolver)
61
59
  resolvers.Mutation.forceMigrate = this.migrateMutationResolver.migrateForce.bind(this.migrateMutationResolver)
62
60
  }
63
61
  return resolvers
64
62
  }
65
63
  }
66
-
67
- namespace ResolverFactory {
68
- export type FieldResolverArgs = {
69
- [argument: string]: any
70
- }
71
- }
72
-
73
- export { ResolverFactory }
@@ -3,7 +3,7 @@ import { ResolverContext } from '../ResolverContext'
3
3
  import { MutationResolver } from '../Resolver'
4
4
  import { MigrateResponse, MutationMigrateArgs } from '../../schema'
5
5
  import { Migration } from '@contember/schema-migrations'
6
- import { AuthorizationActions, createStageTree, MigrationError, ProjectMigrator } from '../../model'
6
+ import { AuthorizationActions, MigrationError, ProjectMigrator } from '../../model'
7
7
 
8
8
  export class MigrateMutationResolver implements MutationResolver<'migrate'> {
9
9
  constructor(private readonly projectMigrator: ProjectMigrator) {}
@@ -24,8 +24,9 @@ export class MigrateMutationResolver implements MutationResolver<'migrate'> {
24
24
  info: GraphQLResolveInfo,
25
25
  force = false,
26
26
  ): Promise<MigrateResponse> {
27
- const rootStageSlug = createStageTree(context.project).getRoot().slug
28
- await context.requireAccess(AuthorizationActions.PROJECT_MIGRATE, rootStageSlug)
27
+ for (const stage of context.project.stages) {
28
+ await context.requireAccess(AuthorizationActions.PROJECT_MIGRATE, stage.slug)
29
+ }
29
30
  const migrations = args.migrations as readonly Migration[]
30
31
 
31
32
  return context.db.transaction(async trx => {
@@ -1,2 +1,3 @@
1
1
  export * from './MigrateMutationResolver'
2
2
  export * from './TruncateMutationResolver'
3
+ export * from './MigrationAlterMutationResolver'
@@ -0,0 +1,42 @@
1
+ import { GraphQLResolveInfo } from 'graphql'
2
+ import { ResolverContext } from '../ResolverContext'
3
+ import { QueryResolver } from '../Resolver'
4
+ import { EventsOrder, QueryEventsArgs, ResolversTypes } from '../../schema'
5
+ import { AuthorizationActions, EventResponseBuilder, EventsQuery, StageBySlugQuery } from '../../model'
6
+ import { UserInputError } from 'apollo-server-errors'
7
+
8
+ export class EventsQueryResolver implements QueryResolver<'events'> {
9
+ constructor(
10
+ private readonly eventResponseBuilder: EventResponseBuilder,
11
+ ) {
12
+ }
13
+
14
+ async events(
15
+ parent: any,
16
+ { args }: QueryEventsArgs,
17
+ context: ResolverContext,
18
+ info: GraphQLResolveInfo,
19
+ ): Promise<ResolversTypes['Event'][]> {
20
+ return context.db.transaction(async db => {
21
+ const stageSlug = args?.stage ?? context.project.stages[0].slug
22
+ const stage = await db.queryHandler.fetch(new StageBySlugQuery(stageSlug))
23
+ if (!stage) {
24
+ throw new UserInputError(`Stage ${stageSlug} not found`)
25
+ }
26
+ await context.requireAccess(
27
+ AuthorizationActions.PROJECT_HISTORY_ANY,
28
+ stage.slug,
29
+ 'You are not allowed to view a history.',
30
+ )
31
+
32
+ const history = await db.queryHandler.fetch(new EventsQuery(
33
+ args?.filter ?? {},
34
+ args?.order ?? EventsOrder.AppliedAtDesc,
35
+ args?.offset ?? 0,
36
+ Math.min(args?.limit ?? 1000, 10000),
37
+ ))
38
+
39
+ return await this.eventResponseBuilder.buildResponse(context.tenantDb, history)
40
+ })
41
+ }
42
+ }
@@ -1,2 +1,3 @@
1
+ export * from './EventsQueryResolver'
1
2
  export * from './ExecutedMigrationsQueryResolver'
2
3
  export * from './StagesQueryResolver'
@@ -0,0 +1,13 @@
1
+ import { DeleteEvent, DeleteEventResolvers, UpdateEvent, UpdateEventResolvers } from '../../schema'
2
+ import { ResolverContext } from '../ResolverContext'
3
+ import { oldValuesLoaderFactory } from './OldValuesHelpers'
4
+
5
+ export class EventOldValuesResolver implements UpdateEventResolvers<ResolverContext>, DeleteEventResolvers<ResolverContext> {
6
+ async oldValues(
7
+ parent: UpdateEvent | DeleteEvent,
8
+ args: unknown,
9
+ context: ResolverContext,
10
+ ): Promise<object> {
11
+ return await context.getLoader(oldValuesLoaderFactory)(parent.id)
12
+ }
13
+ }
@@ -0,0 +1,11 @@
1
+ import { DatabaseContext } from '../../model'
2
+ import { createBatchLoader } from '../../utils/batchQuery'
3
+ import { OldValuesQuery } from '../../model'
4
+
5
+ export const oldValuesLoaderFactory = (db: DatabaseContext) =>
6
+ createBatchLoader<string, Record<string, object>, object>(
7
+ async ids => {
8
+ return db.queryHandler.fetch(new OldValuesQuery(ids))
9
+ },
10
+ (id, items) => items[id],
11
+ )
@@ -0,0 +1 @@
1
+ export * from './EventOldValuesResolver'
@@ -13,109 +13,113 @@ const schema: DocumentNode = gql`
13
13
  type Query {
14
14
  stages: [Stage!]!
15
15
  executedMigrations(version: String): [ExecutedMigration!]!
16
- history(stage: String!, filter: [HistoryFilter!], sinceEvent: String, sinceTime: DateTime): HistoryResponse!
16
+ events(args: EventsArgs): [Event!]!
17
17
  }
18
18
 
19
19
  type Mutation {
20
20
  migrate(migrations: [Migration!]!): MigrateResponse!
21
21
  }
22
22
 
23
- # === history filter ===
23
+ # === events ===
24
24
 
25
- input HistoryFilter {
26
- entity: String!
27
- id: String!
25
+ input EventsArgs {
26
+ stage: String
27
+ filter: EventsFilter
28
+ order: EventsOrder
29
+ offset: Int
30
+ "Max 10000"
31
+ limit: Int
28
32
  }
29
33
 
30
- # === history ===
31
-
32
- enum HistoryErrorCode {
33
- STAGE_NOT_FOUND
34
+ enum EventsOrder {
35
+ CREATED_AT_ASC
36
+ CREATED_AT_DESC
37
+ APPLIED_AT_ASC
38
+ APPLIED_AT_DESC
34
39
  }
35
40
 
36
- type HistoryError {
37
- code: HistoryErrorCode!
38
- developerMessage: String!
41
+ input EventsFilter {
42
+ types: [EventType!]
43
+ rows: [EventFilterRow!]
44
+ tables: [String!]
45
+ transactions: [String!]
46
+ identities: [String!]
47
+ createdAt: EventsFilterDate
48
+ appliedAt: EventsFilterDate
39
49
  }
40
50
 
41
- type HistoryResponse {
42
- ok: Boolean
43
- errors: [HistoryErrorCode!]! @deprecated
44
- error: HistoryError
45
- result: HistoryResult
51
+ input EventsFilterDate {
52
+ from: DateTime
53
+ to: DateTime
46
54
  }
47
55
 
48
- type HistoryResult {
49
- events: [HistoryEvent!]!
56
+ input EventFilterRow {
57
+ tableName: String!
58
+ primaryKey: [String!]!
50
59
  }
51
60
 
52
- interface HistoryEvent {
61
+ interface Event {
53
62
  id: String!
54
63
  transactionId: String!
55
64
  identityDescription: String!
56
65
  identityId: String!
57
66
  description: String!
58
67
  createdAt: DateTime!
59
- type: HistoryEventType!
68
+ appliedAt: DateTime!
69
+ type: EventType!
70
+ tableName: String!
71
+ primaryKey: [String!]!
60
72
  }
61
73
 
62
- enum HistoryEventType {
74
+ enum EventType {
63
75
  UPDATE
64
76
  DELETE
65
77
  CREATE
66
- RUN_MIGRATION
67
78
  }
68
79
 
69
- type HistoryUpdateEvent implements HistoryEvent {
80
+ type UpdateEvent implements Event {
70
81
  id: String!
71
82
  transactionId: String!
72
83
  identityId: String!
73
84
  identityDescription: String!
74
85
  description: String!
75
86
  createdAt: DateTime!
76
- type: HistoryEventType!
87
+ appliedAt: DateTime!
88
+ type: EventType!
77
89
  tableName: String!
78
- primaryKeys: [String!]!
90
+ primaryKey: [String!]!
79
91
  oldValues: Json!
80
92
  diffValues: Json!
81
93
  }
82
94
 
83
- type HistoryDeleteEvent implements HistoryEvent {
95
+ type DeleteEvent implements Event {
84
96
  id: String!
85
97
  transactionId: String!
86
98
  identityId: String!
87
99
  identityDescription: String!
88
100
  description: String!
89
101
  createdAt: DateTime!
90
- type: HistoryEventType!
102
+ appliedAt: DateTime!
103
+ type: EventType!
91
104
  tableName: String!
92
- primaryKeys: [String!]!
105
+ primaryKey: [String!]!
93
106
  oldValues: Json!
94
107
  }
95
108
 
96
- type HistoryCreateEvent implements HistoryEvent {
109
+ type CreateEvent implements Event {
97
110
  id: String!
98
111
  transactionId: String!
99
112
  identityId: String!
100
113
  identityDescription: String!
101
114
  description: String!
102
115
  createdAt: DateTime!
103
- type: HistoryEventType!
116
+ appliedAt: DateTime!
117
+ type: EventType!
104
118
  tableName: String!
105
- primaryKeys: [String!]!
119
+ primaryKey: [String!]!
106
120
  newValues: Json!
107
121
  }
108
122
 
109
- type HistoryRunMigrationEvent implements HistoryEvent {
110
- id: String!
111
- transactionId: String!
112
- identityId: String!
113
- identityDescription: String!
114
- description: String!
115
- createdAt: DateTime!
116
- type: HistoryEventType!
117
- }
118
-
119
123
  # === executedMigrations ===
120
124
 
121
125
  type ExecutedMigration {