@contember/engine-content-api 1.2.1 → 1.3.0-alpha.2

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 (555) hide show
  1. package/dist/src/ExecutionContainer.d.ts +141 -0
  2. package/dist/src/ExecutionContainer.d.ts.map +1 -0
  3. package/dist/src/ExecutionContainer.js +84 -0
  4. package/dist/src/ExecutionContainer.js.map +1 -0
  5. package/dist/src/index.d.ts +2 -1
  6. package/dist/src/index.d.ts.map +1 -1
  7. package/dist/src/index.js +18 -2
  8. package/dist/src/index.js.map +1 -1
  9. package/dist/src/input-validation/preValidation/CreateInputPreValidationProcessor.d.ts.map +1 -1
  10. package/dist/src/input-validation/preValidation/CreateInputPreValidationProcessor.js +6 -0
  11. package/dist/src/input-validation/preValidation/CreateInputPreValidationProcessor.js.map +1 -1
  12. package/dist/src/input-validation/preValidation/UpdateInputPreValidationProcessor.d.ts.map +1 -1
  13. package/dist/src/input-validation/preValidation/UpdateInputPreValidationProcessor.js +6 -0
  14. package/dist/src/input-validation/preValidation/UpdateInputPreValidationProcessor.js.map +1 -1
  15. package/dist/src/inputProcessing/CreateInputProcessor.d.ts +27 -9
  16. package/dist/src/inputProcessing/CreateInputProcessor.d.ts.map +1 -1
  17. package/dist/src/inputProcessing/CreateInputVisitor.d.ts.map +1 -1
  18. package/dist/src/inputProcessing/CreateInputVisitor.js +10 -2
  19. package/dist/src/inputProcessing/CreateInputVisitor.js.map +1 -1
  20. package/dist/src/inputProcessing/UniqueWhereExpander.d.ts +2 -1
  21. package/dist/src/inputProcessing/UniqueWhereExpander.d.ts.map +1 -1
  22. package/dist/src/inputProcessing/UniqueWhereExpander.js +4 -0
  23. package/dist/src/inputProcessing/UniqueWhereExpander.js.map +1 -1
  24. package/dist/src/inputProcessing/UpdateInputProcessor.d.ts +41 -16
  25. package/dist/src/inputProcessing/UpdateInputProcessor.d.ts.map +1 -1
  26. package/dist/src/inputProcessing/UpdateInputVisitor.d.ts.map +1 -1
  27. package/dist/src/inputProcessing/UpdateInputVisitor.js +7 -2
  28. package/dist/src/inputProcessing/UpdateInputVisitor.js.map +1 -1
  29. package/dist/src/mapper/ColumnValue.d.ts +2 -2
  30. package/dist/src/mapper/ColumnValue.d.ts.map +1 -1
  31. package/dist/src/mapper/DataManipulationBuilder.d.ts +7 -0
  32. package/dist/src/mapper/DataManipulationBuilder.d.ts.map +1 -0
  33. package/dist/src/mapper/DataManipulationBuilder.js +5 -0
  34. package/dist/src/mapper/DataManipulationBuilder.js.map +1 -0
  35. package/dist/src/mapper/EventManager.d.ts +86 -0
  36. package/dist/src/mapper/EventManager.d.ts.map +1 -0
  37. package/dist/src/mapper/EventManager.js +118 -0
  38. package/dist/src/mapper/EventManager.js.map +1 -0
  39. package/dist/src/mapper/JunctionTableManager.d.ts +12 -11
  40. package/dist/src/mapper/JunctionTableManager.d.ts.map +1 -1
  41. package/dist/src/mapper/JunctionTableManager.js +20 -8
  42. package/dist/src/mapper/JunctionTableManager.js.map +1 -1
  43. package/dist/src/mapper/Mapper.d.ts +19 -19
  44. package/dist/src/mapper/Mapper.d.ts.map +1 -1
  45. package/dist/src/mapper/Mapper.js +71 -21
  46. package/dist/src/mapper/Mapper.js.map +1 -1
  47. package/dist/src/mapper/MapperFactory.d.ts +33 -0
  48. package/dist/src/mapper/MapperFactory.d.ts.map +1 -0
  49. package/dist/src/mapper/MapperFactory.js +40 -0
  50. package/dist/src/mapper/MapperFactory.js.map +1 -0
  51. package/dist/src/mapper/Result.d.ts +5 -4
  52. package/dist/src/mapper/Result.d.ts.map +1 -1
  53. package/dist/src/mapper/Result.js +2 -1
  54. package/dist/src/mapper/Result.js.map +1 -1
  55. package/dist/src/mapper/delete/DeleteExecutor.d.ts +12 -5
  56. package/dist/src/mapper/delete/DeleteExecutor.d.ts.map +1 -1
  57. package/dist/src/mapper/delete/DeleteExecutor.js +183 -77
  58. package/dist/src/mapper/delete/DeleteExecutor.js.map +1 -1
  59. package/dist/src/mapper/delete/DeleteState.d.ts +22 -0
  60. package/dist/src/mapper/delete/DeleteState.d.ts.map +1 -0
  61. package/dist/src/mapper/delete/DeleteState.js +68 -0
  62. package/dist/src/mapper/delete/DeleteState.js.map +1 -0
  63. package/dist/src/mapper/delete/DeletedEntitiesStorage.d.ts +1 -0
  64. package/dist/src/mapper/delete/DeletedEntitiesStorage.d.ts.map +1 -1
  65. package/dist/src/mapper/delete/DeletedEntitiesStorage.js +5 -0
  66. package/dist/src/mapper/delete/DeletedEntitiesStorage.js.map +1 -1
  67. package/dist/src/mapper/delete/helpers.d.ts +11 -0
  68. package/dist/src/mapper/delete/helpers.d.ts.map +1 -0
  69. package/dist/src/mapper/delete/helpers.js +49 -0
  70. package/dist/src/mapper/delete/helpers.js.map +1 -0
  71. package/dist/src/mapper/index.d.ts +3 -1
  72. package/dist/src/mapper/index.d.ts.map +1 -1
  73. package/dist/src/mapper/index.js +3 -1
  74. package/dist/src/mapper/index.js.map +1 -1
  75. package/dist/src/mapper/insert/InsertBuilder.d.ts +10 -7
  76. package/dist/src/mapper/insert/InsertBuilder.d.ts.map +1 -1
  77. package/dist/src/mapper/insert/InsertBuilder.js +24 -11
  78. package/dist/src/mapper/insert/InsertBuilder.js.map +1 -1
  79. package/dist/src/mapper/insert/InsertBuilderFactory.d.ts +3 -1
  80. package/dist/src/mapper/insert/InsertBuilderFactory.d.ts.map +1 -1
  81. package/dist/src/mapper/insert/InsertBuilderFactory.js +3 -2
  82. package/dist/src/mapper/insert/InsertBuilderFactory.js.map +1 -1
  83. package/dist/src/mapper/insert/Inserter.d.ts +3 -6
  84. package/dist/src/mapper/insert/Inserter.d.ts.map +1 -1
  85. package/dist/src/mapper/insert/Inserter.js +9 -12
  86. package/dist/src/mapper/insert/Inserter.js.map +1 -1
  87. package/dist/src/mapper/insert/SqlCreateInputProcessor.d.ts +5 -0
  88. package/dist/src/mapper/insert/SqlCreateInputProcessor.d.ts.map +1 -1
  89. package/dist/src/mapper/insert/SqlCreateInputProcessor.js +54 -120
  90. package/dist/src/mapper/insert/SqlCreateInputProcessor.js.map +1 -1
  91. package/dist/src/mapper/relations/ManyHasManyInputProcessor.d.ts +32 -0
  92. package/dist/src/mapper/relations/ManyHasManyInputProcessor.d.ts.map +1 -0
  93. package/dist/src/mapper/relations/ManyHasManyInputProcessor.js +77 -0
  94. package/dist/src/mapper/relations/ManyHasManyInputProcessor.js.map +1 -0
  95. package/dist/src/mapper/relations/ManyHasOneInputProcessor.d.ts +32 -0
  96. package/dist/src/mapper/relations/ManyHasOneInputProcessor.d.ts.map +1 -0
  97. package/dist/src/mapper/relations/ManyHasOneInputProcessor.js +108 -0
  98. package/dist/src/mapper/relations/ManyHasOneInputProcessor.js.map +1 -0
  99. package/dist/src/mapper/relations/OneHasManyInputProcessor.d.ts +29 -0
  100. package/dist/src/mapper/relations/OneHasManyInputProcessor.d.ts.map +1 -0
  101. package/dist/src/mapper/relations/OneHasManyInputProcessor.js +61 -0
  102. package/dist/src/mapper/relations/OneHasManyInputProcessor.js.map +1 -0
  103. package/dist/src/mapper/relations/OneHasOneInverseCreateInputProcessor.d.ts +21 -0
  104. package/dist/src/mapper/relations/OneHasOneInverseCreateInputProcessor.d.ts.map +1 -0
  105. package/dist/src/mapper/relations/OneHasOneInverseCreateInputProcessor.js +74 -0
  106. package/dist/src/mapper/relations/OneHasOneInverseCreateInputProcessor.js.map +1 -0
  107. package/dist/src/mapper/relations/OneHasOneInverseUpdateInputProcessor.d.ts +32 -0
  108. package/dist/src/mapper/relations/OneHasOneInverseUpdateInputProcessor.d.ts.map +1 -0
  109. package/dist/src/mapper/relations/OneHasOneInverseUpdateInputProcessor.js +125 -0
  110. package/dist/src/mapper/relations/OneHasOneInverseUpdateInputProcessor.js.map +1 -0
  111. package/dist/src/mapper/relations/OneHasOneOwningCreateInputProcessor.d.ts +21 -0
  112. package/dist/src/mapper/relations/OneHasOneOwningCreateInputProcessor.d.ts.map +1 -0
  113. package/dist/src/mapper/relations/OneHasOneOwningCreateInputProcessor.js +72 -0
  114. package/dist/src/mapper/relations/OneHasOneOwningCreateInputProcessor.js.map +1 -0
  115. package/dist/src/mapper/relations/OneHasOneOwningUpdateInputProcessor.d.ts +37 -0
  116. package/dist/src/mapper/relations/OneHasOneOwningUpdateInputProcessor.d.ts.map +1 -0
  117. package/dist/src/mapper/relations/OneHasOneOwningUpdateInputProcessor.js +193 -0
  118. package/dist/src/mapper/relations/OneHasOneOwningUpdateInputProcessor.js.map +1 -0
  119. package/dist/src/mapper/select/JoinBuilder.d.ts +1 -1
  120. package/dist/src/mapper/select/JoinBuilder.d.ts.map +1 -1
  121. package/dist/src/mapper/select/JoinBuilder.js.map +1 -1
  122. package/dist/src/mapper/select/OrderByHelper.d.ts +1 -1
  123. package/dist/src/mapper/select/OrderByHelper.d.ts.map +1 -1
  124. package/dist/src/mapper/select/OrderByHelper.js +3 -1
  125. package/dist/src/mapper/select/OrderByHelper.js.map +1 -1
  126. package/dist/src/mapper/select/RelationFetcher.js +2 -2
  127. package/dist/src/mapper/select/RelationFetcher.js.map +1 -1
  128. package/dist/src/mapper/select/WhereBuilder.d.ts +2 -2
  129. package/dist/src/mapper/select/WhereBuilder.d.ts.map +1 -1
  130. package/dist/src/mapper/select/WhereBuilder.js.map +1 -1
  131. package/dist/src/mapper/update/SqlUpdateInputProcessor.d.ts +5 -0
  132. package/dist/src/mapper/update/SqlUpdateInputProcessor.d.ts.map +1 -1
  133. package/dist/src/mapper/update/SqlUpdateInputProcessor.js +52 -389
  134. package/dist/src/mapper/update/SqlUpdateInputProcessor.js.map +1 -1
  135. package/dist/src/mapper/update/UpdateBuilder.d.ts +10 -7
  136. package/dist/src/mapper/update/UpdateBuilder.d.ts.map +1 -1
  137. package/dist/src/mapper/update/UpdateBuilder.js +43 -19
  138. package/dist/src/mapper/update/UpdateBuilder.js.map +1 -1
  139. package/dist/src/mapper/update/UpdateBuilderFactory.d.ts +4 -2
  140. package/dist/src/mapper/update/UpdateBuilderFactory.d.ts.map +1 -1
  141. package/dist/src/mapper/update/UpdateBuilderFactory.js +4 -3
  142. package/dist/src/mapper/update/UpdateBuilderFactory.js.map +1 -1
  143. package/dist/src/mapper/update/Updater.d.ts +1 -4
  144. package/dist/src/mapper/update/Updater.d.ts.map +1 -1
  145. package/dist/src/mapper/update/Updater.js +17 -23
  146. package/dist/src/mapper/update/Updater.js.map +1 -1
  147. package/dist/src/resolvers/GraphQlQueryAstFactory.d.ts +1 -3
  148. package/dist/src/resolvers/GraphQlQueryAstFactory.d.ts.map +1 -1
  149. package/dist/src/resolvers/GraphQlQueryAstFactory.js +1 -4
  150. package/dist/src/resolvers/GraphQlQueryAstFactory.js.map +1 -1
  151. package/dist/src/resolvers/MutationResolver.d.ts +1 -4
  152. package/dist/src/resolvers/MutationResolver.d.ts.map +1 -1
  153. package/dist/src/resolvers/MutationResolver.js +10 -12
  154. package/dist/src/resolvers/MutationResolver.js.map +1 -1
  155. package/dist/src/resolvers/ReadResolver.d.ts +1 -3
  156. package/dist/src/resolvers/ReadResolver.d.ts.map +1 -1
  157. package/dist/src/resolvers/ReadResolver.js +6 -10
  158. package/dist/src/resolvers/ReadResolver.js.map +1 -1
  159. package/dist/src/resolvers/ValidationResolver.d.ts +1 -3
  160. package/dist/src/resolvers/ValidationResolver.d.ts.map +1 -1
  161. package/dist/src/resolvers/ValidationResolver.js +3 -4
  162. package/dist/src/resolvers/ValidationResolver.js.map +1 -1
  163. package/dist/src/resolvers/index.d.ts +0 -1
  164. package/dist/src/resolvers/index.d.ts.map +1 -1
  165. package/dist/src/resolvers/index.js +0 -1
  166. package/dist/src/resolvers/index.js.map +1 -1
  167. package/dist/src/schema/CustomTypesProvider.d.ts.map +1 -1
  168. package/dist/src/schema/CustomTypesProvider.js +1 -23
  169. package/dist/src/schema/CustomTypesProvider.js.map +1 -1
  170. package/dist/src/schema/GraphQlSchemaBuilderFactory.d.ts +3 -0
  171. package/dist/src/schema/GraphQlSchemaBuilderFactory.d.ts.map +1 -1
  172. package/dist/src/schema/GraphQlSchemaBuilderFactory.js +4 -2
  173. package/dist/src/schema/GraphQlSchemaBuilderFactory.js.map +1 -1
  174. package/dist/src/schema/MutationProvider.js +4 -4
  175. package/dist/src/schema/MutationProvider.js.map +1 -1
  176. package/dist/src/schema/QueryProvider.js +3 -3
  177. package/dist/src/schema/QueryProvider.js.map +1 -1
  178. package/dist/src/schema/mutations/ConnectOrCreateRelationInputProvider.d.ts +15 -0
  179. package/dist/src/schema/mutations/ConnectOrCreateRelationInputProvider.d.ts.map +1 -0
  180. package/dist/src/schema/mutations/ConnectOrCreateRelationInputProvider.js +43 -0
  181. package/dist/src/schema/mutations/ConnectOrCreateRelationInputProvider.js.map +1 -0
  182. package/dist/src/schema/mutations/CreateEntityInputFieldVisitor.d.ts.map +1 -1
  183. package/dist/src/schema/mutations/CreateEntityInputFieldVisitor.js +2 -6
  184. package/dist/src/schema/mutations/CreateEntityInputFieldVisitor.js.map +1 -1
  185. package/dist/src/schema/mutations/CreateEntityRelationAllowedOperationsVisitor.d.ts.map +1 -1
  186. package/dist/src/schema/mutations/CreateEntityRelationAllowedOperationsVisitor.js +3 -0
  187. package/dist/src/schema/mutations/CreateEntityRelationAllowedOperationsVisitor.js.map +1 -1
  188. package/dist/src/schema/mutations/CreateEntityRelationInputFieldVisitor.d.ts +3 -1
  189. package/dist/src/schema/mutations/CreateEntityRelationInputFieldVisitor.d.ts.map +1 -1
  190. package/dist/src/schema/mutations/CreateEntityRelationInputFieldVisitor.js +15 -8
  191. package/dist/src/schema/mutations/CreateEntityRelationInputFieldVisitor.js.map +1 -1
  192. package/dist/src/schema/mutations/EntityInputProvider.d.ts.map +1 -1
  193. package/dist/src/schema/mutations/EntityInputProvider.js +0 -3
  194. package/dist/src/schema/mutations/EntityInputProvider.js.map +1 -1
  195. package/dist/src/schema/mutations/UpdateEntityInputFieldVisitor.d.ts.map +1 -1
  196. package/dist/src/schema/mutations/UpdateEntityInputFieldVisitor.js +2 -6
  197. package/dist/src/schema/mutations/UpdateEntityInputFieldVisitor.js.map +1 -1
  198. package/dist/src/schema/mutations/UpdateEntityRelationAllowedOperationsVisitor.d.ts.map +1 -1
  199. package/dist/src/schema/mutations/UpdateEntityRelationAllowedOperationsVisitor.js +3 -0
  200. package/dist/src/schema/mutations/UpdateEntityRelationAllowedOperationsVisitor.js.map +1 -1
  201. package/dist/src/schema/mutations/UpdateEntityRelationInputFieldVisitor.d.ts +3 -1
  202. package/dist/src/schema/mutations/UpdateEntityRelationInputFieldVisitor.d.ts.map +1 -1
  203. package/dist/src/schema/mutations/UpdateEntityRelationInputFieldVisitor.js +11 -22
  204. package/dist/src/schema/mutations/UpdateEntityRelationInputFieldVisitor.js.map +1 -1
  205. package/dist/src/tsconfig.tsbuildinfo +1 -1
  206. package/dist/src/types.d.ts +2 -3
  207. package/dist/src/types.d.ts.map +1 -1
  208. package/dist/tests/cases/bugs/bug-update-by-nested-unique.test.js +3 -5
  209. package/dist/tests/cases/bugs/bug-update-by-nested-unique.test.js.map +1 -1
  210. package/dist/tests/cases/integration/graphQlDb/insert/insertSequence.test.js +2 -2
  211. package/dist/tests/cases/integration/graphQlDb/insert/insertSequence.test.js.map +1 -1
  212. package/dist/tests/cases/integration/graphQlDb/update/bug-freeze-connect-missing-one.test.js +1 -1
  213. package/dist/tests/cases/integration/graphQlDb/update/bug-freeze-connect-missing-one.test.js.map +1 -1
  214. package/dist/tests/cases/integration/graphQlDb/update/deferedConstraints.test.js +45 -45
  215. package/dist/tests/cases/integration/graphQlDb/update/deferedConstraints.test.js.map +1 -1
  216. package/dist/tests/cases/integration/graphQlDb/update/failedDelete.test.js +5 -5
  217. package/dist/tests/cases/integration/graphQlDb/update/failedDelete.test.js.map +1 -1
  218. package/dist/tests/cases/integration/graphQlDb/update/invalidInput.test.js +2 -2
  219. package/dist/tests/cases/integration/graphQlDb/update/invalidInput.test.js.map +1 -1
  220. package/dist/tests/cases/integration/graphQlDb/update/nullChecksNotNull.test.js +8 -8
  221. package/dist/tests/cases/integration/graphQlDb/update/nullChecksNotNull.test.js.map +1 -1
  222. package/dist/tests/cases/integration/graphQlDb/update/nullChecksNullable.test.js +7 -10
  223. package/dist/tests/cases/integration/graphQlDb/update/nullChecksNullable.test.js.map +1 -1
  224. package/dist/tests/cases/integration/graphQlDb/update/uniqueConstraint.test.js +2 -2
  225. package/dist/tests/cases/integration/graphQlDb/update/uniqueConstraint.test.js.map +1 -1
  226. package/dist/tests/cases/integration/graphQlRequests/delete/aclDelete.test.js +13 -32
  227. package/dist/tests/cases/integration/graphQlRequests/delete/aclDelete.test.js.map +1 -1
  228. package/dist/tests/cases/integration/graphQlRequests/delete/additionalDeleteFilter.test.js +11 -30
  229. package/dist/tests/cases/integration/graphQlRequests/delete/additionalDeleteFilter.test.js.map +1 -1
  230. package/dist/tests/cases/integration/graphQlRequests/delete/cascadeDelete.test.js +62 -45
  231. package/dist/tests/cases/integration/graphQlRequests/delete/cascadeDelete.test.js.map +1 -1
  232. package/dist/tests/cases/integration/graphQlRequests/delete/deleteById.test.js +10 -11
  233. package/dist/tests/cases/integration/graphQlRequests/delete/deleteById.test.js.map +1 -1
  234. package/dist/tests/cases/integration/graphQlRequests/delete/orphanRemoval.test.js +29 -18
  235. package/dist/tests/cases/integration/graphQlRequests/delete/orphanRemoval.test.js.map +1 -1
  236. package/dist/tests/cases/integration/graphQlRequests/delete/restrictOnDelete.test.d.ts +2 -0
  237. package/dist/tests/cases/integration/graphQlRequests/delete/restrictOnDelete.test.d.ts.map +1 -0
  238. package/dist/tests/cases/integration/graphQlRequests/delete/restrictOnDelete.test.js +97 -0
  239. package/dist/tests/cases/integration/graphQlRequests/delete/restrictOnDelete.test.js.map +1 -0
  240. package/dist/tests/cases/integration/graphQlRequests/delete/setNullOnDelete.test.js +58 -22
  241. package/dist/tests/cases/integration/graphQlRequests/delete/setNullOnDelete.test.js.map +1 -1
  242. package/dist/tests/cases/integration/graphQlRequests/insert/manyHasManyInverse/create.test.d.ts +2 -0
  243. package/dist/tests/cases/integration/graphQlRequests/insert/manyHasManyInverse/create.test.d.ts.map +1 -0
  244. package/dist/tests/cases/integration/graphQlRequests/insert/manyHasManyInverse/{insertRelationCreate.test.js → create.test.js} +1 -1
  245. package/dist/tests/cases/integration/graphQlRequests/insert/manyHasManyInverse/create.test.js.map +1 -0
  246. package/dist/tests/cases/integration/graphQlRequests/insert/manyHasManyOwning/create.test.d.ts +2 -0
  247. package/dist/tests/cases/integration/graphQlRequests/insert/manyHasManyOwning/create.test.d.ts.map +1 -0
  248. package/dist/tests/cases/integration/graphQlRequests/insert/manyHasManyOwning/{insertRelationCreate.test.js → create.test.js} +1 -1
  249. package/dist/tests/cases/integration/graphQlRequests/insert/manyHasManyOwning/create.test.js.map +1 -0
  250. package/dist/tests/cases/integration/graphQlRequests/insert/manyHasOne/connectOrCreate.test.d.ts +2 -0
  251. package/dist/tests/cases/integration/graphQlRequests/insert/manyHasOne/connectOrCreate.test.d.ts.map +1 -0
  252. package/dist/tests/cases/integration/graphQlRequests/insert/manyHasOne/connectOrCreate.test.js +99 -0
  253. package/dist/tests/cases/integration/graphQlRequests/insert/manyHasOne/connectOrCreate.test.js.map +1 -0
  254. package/dist/tests/cases/integration/graphQlRequests/insert/manyHasOne/create.test.d.ts +2 -0
  255. package/dist/tests/cases/integration/graphQlRequests/insert/manyHasOne/create.test.d.ts.map +1 -0
  256. package/dist/tests/cases/integration/graphQlRequests/insert/manyHasOne/{insertRelationCreate.test.js → create.test.js} +1 -1
  257. package/dist/tests/cases/integration/graphQlRequests/insert/manyHasOne/create.test.js.map +1 -0
  258. package/dist/tests/cases/integration/graphQlRequests/insert/oneHasMany/connect.test.d.ts +2 -0
  259. package/dist/tests/cases/integration/graphQlRequests/insert/oneHasMany/connect.test.d.ts.map +1 -0
  260. package/dist/tests/cases/integration/graphQlRequests/insert/oneHasMany/{insertRelationConnect.test.js → connect.test.js} +4 -4
  261. package/dist/tests/cases/integration/graphQlRequests/insert/oneHasMany/connect.test.js.map +1 -0
  262. package/dist/tests/cases/integration/graphQlRequests/insert/oneHasMany/create.test.d.ts +2 -0
  263. package/dist/tests/cases/integration/graphQlRequests/insert/oneHasMany/create.test.d.ts.map +1 -0
  264. package/dist/tests/cases/integration/graphQlRequests/insert/oneHasMany/{insertRelationCreate.test.js → create.test.js} +1 -1
  265. package/dist/tests/cases/integration/graphQlRequests/insert/oneHasMany/create.test.js.map +1 -0
  266. package/dist/tests/cases/integration/graphQlRequests/insert/oneHasOneInverse/create.test.d.ts +2 -0
  267. package/dist/tests/cases/integration/graphQlRequests/insert/oneHasOneInverse/create.test.d.ts.map +1 -0
  268. package/dist/tests/cases/integration/graphQlRequests/insert/oneHasOneInverse/{insertRelationCreate.test.js → create.test.js} +1 -1
  269. package/dist/tests/cases/integration/graphQlRequests/insert/oneHasOneInverse/create.test.js.map +1 -0
  270. package/dist/tests/cases/integration/graphQlRequests/insert/oneHasOneOwning/create.test.d.ts +2 -0
  271. package/dist/tests/cases/integration/graphQlRequests/insert/oneHasOneOwning/create.test.d.ts.map +1 -0
  272. package/dist/tests/cases/integration/graphQlRequests/insert/oneHasOneOwning/{insertRelationCreate.test.js → create.test.js} +1 -1
  273. package/dist/tests/cases/integration/graphQlRequests/insert/oneHasOneOwning/create.test.js.map +1 -0
  274. package/dist/tests/cases/integration/graphQlRequests/insert/oneHasOneOwning/empty.test.d.ts +2 -0
  275. package/dist/tests/cases/integration/graphQlRequests/insert/oneHasOneOwning/empty.test.d.ts.map +1 -0
  276. package/dist/tests/cases/integration/graphQlRequests/insert/oneHasOneOwning/{insertRelationEmpty.test.js → empty.test.js} +1 -1
  277. package/dist/tests/cases/integration/graphQlRequests/insert/oneHasOneOwning/empty.test.js.map +1 -0
  278. package/dist/tests/cases/integration/graphQlRequests/query/sorting/orderBy.test.d.ts +2 -0
  279. package/dist/tests/cases/integration/graphQlRequests/query/sorting/orderBy.test.d.ts.map +1 -0
  280. package/dist/tests/cases/integration/graphQlRequests/query/sorting/orderBy.test.js +67 -0
  281. package/dist/tests/cases/integration/graphQlRequests/query/sorting/orderBy.test.js.map +1 -0
  282. package/dist/tests/cases/integration/graphQlRequests/update/acl/aclUpdate.test.js +6 -18
  283. package/dist/tests/cases/integration/graphQlRequests/update/acl/aclUpdate.test.js.map +1 -1
  284. package/dist/tests/cases/integration/graphQlRequests/update/additionalFilter.test.js +3 -4
  285. package/dist/tests/cases/integration/graphQlRequests/update/additionalFilter.test.js.map +1 -1
  286. package/dist/tests/cases/integration/graphQlRequests/update/basic/columnUpdate.test.js +3 -8
  287. package/dist/tests/cases/integration/graphQlRequests/update/basic/columnUpdate.test.js.map +1 -1
  288. package/dist/tests/cases/integration/graphQlRequests/update/manyHasManyInverse/delete.test.js +49 -11
  289. package/dist/tests/cases/integration/graphQlRequests/update/manyHasManyInverse/delete.test.js.map +1 -1
  290. package/dist/tests/cases/integration/graphQlRequests/update/manyHasManyInverse/update.test.js +3 -9
  291. package/dist/tests/cases/integration/graphQlRequests/update/manyHasManyInverse/update.test.js.map +1 -1
  292. package/dist/tests/cases/integration/graphQlRequests/update/manyHasManyInverse/upsert.test.js +3 -9
  293. package/dist/tests/cases/integration/graphQlRequests/update/manyHasManyInverse/upsert.test.js.map +1 -1
  294. package/dist/tests/cases/integration/graphQlRequests/update/manyHasManyOwning/delete.test.js +49 -11
  295. package/dist/tests/cases/integration/graphQlRequests/update/manyHasManyOwning/delete.test.js.map +1 -1
  296. package/dist/tests/cases/integration/graphQlRequests/update/manyHasManyOwning/update.test.js +3 -9
  297. package/dist/tests/cases/integration/graphQlRequests/update/manyHasManyOwning/update.test.js.map +1 -1
  298. package/dist/tests/cases/integration/graphQlRequests/update/manyHasManyOwning/upsert.test.js +3 -9
  299. package/dist/tests/cases/integration/graphQlRequests/update/manyHasManyOwning/upsert.test.js.map +1 -1
  300. package/dist/tests/cases/integration/graphQlRequests/update/manyHasOne/connect.test.js +3 -10
  301. package/dist/tests/cases/integration/graphQlRequests/update/manyHasOne/connect.test.js.map +1 -1
  302. package/dist/tests/cases/integration/graphQlRequests/update/manyHasOne/create.test.js +3 -10
  303. package/dist/tests/cases/integration/graphQlRequests/update/manyHasOne/create.test.js.map +1 -1
  304. package/dist/tests/cases/integration/graphQlRequests/update/manyHasOne/delete.test.js +83 -49
  305. package/dist/tests/cases/integration/graphQlRequests/update/manyHasOne/delete.test.js.map +1 -1
  306. package/dist/tests/cases/integration/graphQlRequests/update/manyHasOne/disconnect.test.js +3 -9
  307. package/dist/tests/cases/integration/graphQlRequests/update/manyHasOne/disconnect.test.js.map +1 -1
  308. package/dist/tests/cases/integration/graphQlRequests/update/manyHasOne/update.test.js +3 -9
  309. package/dist/tests/cases/integration/graphQlRequests/update/manyHasOne/update.test.js.map +1 -1
  310. package/dist/tests/cases/integration/graphQlRequests/update/manyHasOne/upsert.test.js +6 -18
  311. package/dist/tests/cases/integration/graphQlRequests/update/manyHasOne/upsert.test.js.map +1 -1
  312. package/dist/tests/cases/integration/graphQlRequests/update/oneHasMany/combination.test.js +10 -11
  313. package/dist/tests/cases/integration/graphQlRequests/update/oneHasMany/combination.test.js.map +1 -1
  314. package/dist/tests/cases/integration/graphQlRequests/update/oneHasMany/connect.test.js +3 -11
  315. package/dist/tests/cases/integration/graphQlRequests/update/oneHasMany/connect.test.js.map +1 -1
  316. package/dist/tests/cases/integration/graphQlRequests/update/oneHasMany/delete.test.js +49 -11
  317. package/dist/tests/cases/integration/graphQlRequests/update/oneHasMany/delete.test.js.map +1 -1
  318. package/dist/tests/cases/integration/graphQlRequests/update/oneHasMany/disconnect.test.js +3 -8
  319. package/dist/tests/cases/integration/graphQlRequests/update/oneHasMany/disconnect.test.js.map +1 -1
  320. package/dist/tests/cases/integration/graphQlRequests/update/oneHasMany/update.test.js +3 -6
  321. package/dist/tests/cases/integration/graphQlRequests/update/oneHasMany/update.test.js.map +1 -1
  322. package/dist/tests/cases/integration/graphQlRequests/update/oneHasMany/upsert.test.js +3 -6
  323. package/dist/tests/cases/integration/graphQlRequests/update/oneHasMany/upsert.test.js.map +1 -1
  324. package/dist/tests/cases/integration/graphQlRequests/update/oneHasOneInverse/connect.test.js +97 -29
  325. package/dist/tests/cases/integration/graphQlRequests/update/oneHasOneInverse/connect.test.js.map +1 -1
  326. package/dist/tests/cases/integration/graphQlRequests/update/oneHasOneInverse/create.test.js +14 -15
  327. package/dist/tests/cases/integration/graphQlRequests/update/oneHasOneInverse/create.test.js.map +1 -1
  328. package/dist/tests/cases/integration/graphQlRequests/update/oneHasOneInverse/delete.test.js +101 -11
  329. package/dist/tests/cases/integration/graphQlRequests/update/oneHasOneInverse/delete.test.js.map +1 -1
  330. package/dist/tests/cases/integration/graphQlRequests/update/oneHasOneInverse/disconnect.test.js +11 -12
  331. package/dist/tests/cases/integration/graphQlRequests/update/oneHasOneInverse/disconnect.test.js.map +1 -1
  332. package/dist/tests/cases/integration/graphQlRequests/update/oneHasOneInverse/schema.d.ts +1 -0
  333. package/dist/tests/cases/integration/graphQlRequests/update/oneHasOneInverse/schema.d.ts.map +1 -1
  334. package/dist/tests/cases/integration/graphQlRequests/update/oneHasOneInverse/schema.js +9 -1
  335. package/dist/tests/cases/integration/graphQlRequests/update/oneHasOneInverse/schema.js.map +1 -1
  336. package/dist/tests/cases/integration/graphQlRequests/update/oneHasOneInverse/update.test.js +3 -6
  337. package/dist/tests/cases/integration/graphQlRequests/update/oneHasOneInverse/update.test.js.map +1 -1
  338. package/dist/tests/cases/integration/graphQlRequests/update/oneHasOneInverse/upsert.test.js +11 -13
  339. package/dist/tests/cases/integration/graphQlRequests/update/oneHasOneInverse/upsert.test.js.map +1 -1
  340. package/dist/tests/cases/integration/graphQlRequests/update/oneHasOneOwning/connect.test.js +85 -29
  341. package/dist/tests/cases/integration/graphQlRequests/update/oneHasOneOwning/connect.test.js.map +1 -1
  342. package/dist/tests/cases/integration/graphQlRequests/update/oneHasOneOwning/connectOrCreate.test.d.ts +2 -0
  343. package/dist/tests/cases/integration/graphQlRequests/update/oneHasOneOwning/connectOrCreate.test.d.ts.map +1 -0
  344. package/dist/tests/cases/integration/graphQlRequests/update/oneHasOneOwning/connectOrCreate.test.js +53 -0
  345. package/dist/tests/cases/integration/graphQlRequests/update/oneHasOneOwning/connectOrCreate.test.js.map +1 -0
  346. package/dist/tests/cases/integration/graphQlRequests/update/oneHasOneOwning/create.test.js +75 -9
  347. package/dist/tests/cases/integration/graphQlRequests/update/oneHasOneOwning/create.test.js.map +1 -1
  348. package/dist/tests/cases/integration/graphQlRequests/update/oneHasOneOwning/delete.test.js +66 -25
  349. package/dist/tests/cases/integration/graphQlRequests/update/oneHasOneOwning/delete.test.js.map +1 -1
  350. package/dist/tests/cases/integration/graphQlRequests/update/oneHasOneOwning/disconnect.test.js +3 -10
  351. package/dist/tests/cases/integration/graphQlRequests/update/oneHasOneOwning/disconnect.test.js.map +1 -1
  352. package/dist/tests/cases/integration/graphQlRequests/update/oneHasOneOwning/schema.d.ts +1 -0
  353. package/dist/tests/cases/integration/graphQlRequests/update/oneHasOneOwning/schema.d.ts.map +1 -1
  354. package/dist/tests/cases/integration/graphQlRequests/update/oneHasOneOwning/schema.js +10 -2
  355. package/dist/tests/cases/integration/graphQlRequests/update/oneHasOneOwning/schema.js.map +1 -1
  356. package/dist/tests/cases/integration/graphQlRequests/update/oneHasOneOwning/update.test.js +3 -9
  357. package/dist/tests/cases/integration/graphQlRequests/update/oneHasOneOwning/update.test.js.map +1 -1
  358. package/dist/tests/cases/integration/graphQlRequests/update/oneHasOneOwning/upsert.test.js +6 -19
  359. package/dist/tests/cases/integration/graphQlRequests/update/oneHasOneOwning/upsert.test.js.map +1 -1
  360. package/dist/tests/cases/integration/graphQlRequests/update/queryPortal.test.js +6 -8
  361. package/dist/tests/cases/integration/graphQlRequests/update/queryPortal.test.js.map +1 -1
  362. package/dist/tests/cases/integration/graphQlRequests/update/transaction.test.js +9 -24
  363. package/dist/tests/cases/integration/graphQlRequests/update/transaction.test.js.map +1 -1
  364. package/dist/tests/cases/integration/graphQlRequests/upsert/basicUpsert.test.js +3 -7
  365. package/dist/tests/cases/integration/graphQlRequests/upsert/basicUpsert.test.js.map +1 -1
  366. package/dist/tests/cases/integration/graphQlSchema/schema-acl-allowed.gql +14 -1
  367. package/dist/tests/cases/integration/graphQlSchema/schema-acl-restricted-create.gql +5 -5
  368. package/dist/tests/cases/integration/graphQlSchema/schema-acl-restricted-delete.gql +14 -1
  369. package/dist/tests/cases/integration/graphQlSchema/schema-acl-restricted-update.gql +12 -0
  370. package/dist/tests/cases/integration/graphQlSchema/schema-basic.gql +40 -2
  371. package/dist/tests/cases/integration/graphQlSchema/schema-bug-66.gql +30 -3
  372. package/dist/tests/cases/integration/graphQlSchema/schema-custom-primary.gql +40 -2
  373. package/dist/tests/cases/integration/graphQlSchema/schema-has-many-reduction.gql +14 -1
  374. package/dist/tests/cases/integration/graphQlSchema/schema-new-builder.gql +40 -2
  375. package/dist/tests/cases/unit/orderbyHelper.test.js +11 -0
  376. package/dist/tests/cases/unit/orderbyHelper.test.js.map +1 -1
  377. package/dist/tests/src/test.d.ts +1 -1
  378. package/dist/tests/src/test.d.ts.map +1 -1
  379. package/dist/tests/src/test.js +34 -32
  380. package/dist/tests/src/test.js.map +1 -1
  381. package/dist/tests/src/testGraphql.js +1 -1
  382. package/dist/tests/src/testGraphql.js.map +1 -1
  383. package/dist/tests/tsconfig.tsbuildinfo +1 -1
  384. package/package.json +11 -11
  385. package/src/ExecutionContainer.ts +204 -0
  386. package/src/index.ts +24 -1
  387. package/src/input-validation/preValidation/CreateInputPreValidationProcessor.ts +6 -0
  388. package/src/input-validation/preValidation/UpdateInputPreValidationProcessor.ts +6 -0
  389. package/src/inputProcessing/CreateInputProcessor.ts +8 -11
  390. package/src/inputProcessing/CreateInputVisitor.ts +11 -2
  391. package/src/inputProcessing/UniqueWhereExpander.ts +5 -1
  392. package/src/inputProcessing/UpdateInputProcessor.ts +18 -18
  393. package/src/inputProcessing/UpdateInputVisitor.ts +6 -2
  394. package/src/mapper/ColumnValue.ts +2 -2
  395. package/src/mapper/DataManipulationBuilder.ts +12 -0
  396. package/src/mapper/EventManager.ts +158 -0
  397. package/src/mapper/JunctionTableManager.ts +50 -32
  398. package/src/mapper/Mapper.ts +101 -55
  399. package/src/mapper/MapperFactory.ts +67 -0
  400. package/src/mapper/Result.ts +3 -2
  401. package/src/mapper/delete/DeleteExecutor.ts +262 -95
  402. package/src/mapper/delete/DeleteState.ts +80 -0
  403. package/src/mapper/delete/DeletedEntitiesStorage.ts +6 -0
  404. package/src/mapper/delete/helpers.ts +68 -0
  405. package/src/mapper/index.ts +3 -1
  406. package/src/mapper/insert/InsertBuilder.ts +35 -14
  407. package/src/mapper/insert/InsertBuilderFactory.ts +3 -1
  408. package/src/mapper/insert/Inserter.ts +9 -13
  409. package/src/mapper/insert/SqlCreateInputProcessor.ts +61 -139
  410. package/src/mapper/relations/ManyHasManyInputProcessor.ts +108 -0
  411. package/src/mapper/relations/ManyHasOneInputProcessor.ts +158 -0
  412. package/src/mapper/relations/OneHasManyInputProcessor.ts +101 -0
  413. package/src/mapper/relations/OneHasOneInverseCreateInputProcessor.ts +99 -0
  414. package/src/mapper/relations/OneHasOneInverseUpdateInputProcessor.ts +164 -0
  415. package/src/mapper/relations/OneHasOneOwningCreateInputProcessor.ts +92 -0
  416. package/src/mapper/relations/OneHasOneOwningUpdateInputProcessor.ts +253 -0
  417. package/src/mapper/select/JoinBuilder.ts +4 -4
  418. package/src/mapper/select/OrderByHelper.ts +2 -1
  419. package/src/mapper/select/RelationFetcher.ts +2 -2
  420. package/src/mapper/select/WhereBuilder.ts +11 -11
  421. package/src/mapper/update/SqlUpdateInputProcessor.ts +55 -484
  422. package/src/mapper/update/UpdateBuilder.ts +52 -22
  423. package/src/mapper/update/UpdateBuilderFactory.ts +11 -2
  424. package/src/mapper/update/Updater.ts +16 -30
  425. package/src/resolvers/GraphQlQueryAstFactory.ts +1 -2
  426. package/src/resolvers/MutationResolver.ts +13 -14
  427. package/src/resolvers/ReadResolver.ts +5 -9
  428. package/src/resolvers/ValidationResolver.ts +2 -4
  429. package/src/resolvers/index.ts +0 -1
  430. package/src/schema/CustomTypesProvider.ts +2 -27
  431. package/src/schema/GraphQlSchemaBuilderFactory.ts +7 -4
  432. package/src/schema/MutationProvider.ts +4 -4
  433. package/src/schema/QueryProvider.ts +3 -3
  434. package/src/schema/mutations/ConnectOrCreateRelationInputProvider.ts +54 -0
  435. package/src/schema/mutations/CreateEntityInputFieldVisitor.ts +2 -6
  436. package/src/schema/mutations/CreateEntityRelationAllowedOperationsVisitor.ts +3 -1
  437. package/src/schema/mutations/CreateEntityRelationInputFieldVisitor.ts +20 -15
  438. package/src/schema/mutations/EntityInputProvider.ts +0 -3
  439. package/src/schema/mutations/UpdateEntityInputFieldVisitor.ts +2 -6
  440. package/src/schema/mutations/UpdateEntityRelationAllowedOperationsVisitor.ts +3 -1
  441. package/src/schema/mutations/UpdateEntityRelationInputFieldVisitor.ts +52 -57
  442. package/src/tsconfig.json +7 -21
  443. package/src/types.ts +2 -3
  444. package/tests/cases/bugs/bug-update-by-nested-unique.test.ts +3 -5
  445. package/tests/cases/integration/graphQlDb/insert/insertSequence.test.ts +2 -2
  446. package/tests/cases/integration/graphQlDb/update/bug-freeze-connect-missing-one.test.ts +1 -1
  447. package/tests/cases/integration/graphQlDb/update/deferedConstraints.test.ts +9 -9
  448. package/tests/cases/integration/graphQlDb/update/failedDelete.test.ts +3 -3
  449. package/tests/cases/integration/graphQlDb/update/invalidInput.test.ts +2 -2
  450. package/tests/cases/integration/graphQlDb/update/nullChecksNotNull.test.ts +8 -8
  451. package/tests/cases/integration/graphQlDb/update/nullChecksNullable.test.ts +7 -10
  452. package/tests/cases/integration/graphQlDb/update/uniqueConstraint.test.ts +2 -2
  453. package/tests/cases/integration/graphQlRequests/delete/aclDelete.test.ts +15 -34
  454. package/tests/cases/integration/graphQlRequests/delete/additionalDeleteFilter.test.ts +12 -31
  455. package/tests/cases/integration/graphQlRequests/delete/cascadeDelete.test.ts +68 -46
  456. package/tests/cases/integration/graphQlRequests/delete/deleteById.test.ts +11 -12
  457. package/tests/cases/integration/graphQlRequests/delete/orphanRemoval.test.ts +30 -19
  458. package/tests/cases/integration/graphQlRequests/delete/restrictOnDelete.test.ts +102 -0
  459. package/tests/cases/integration/graphQlRequests/delete/setNullOnDelete.test.ts +63 -23
  460. package/tests/cases/integration/graphQlRequests/insert/manyHasOne/connectOrCreate.test.ts +106 -0
  461. package/tests/cases/integration/graphQlRequests/insert/oneHasMany/{insertRelationConnect.test.ts → connect.test.ts} +3 -3
  462. package/tests/cases/integration/graphQlRequests/query/sorting/orderBy.test.ts +67 -0
  463. package/tests/cases/integration/graphQlRequests/update/acl/aclUpdate.test.ts +6 -18
  464. package/tests/cases/integration/graphQlRequests/update/additionalFilter.test.ts +3 -4
  465. package/tests/cases/integration/graphQlRequests/update/basic/columnUpdate.test.ts +3 -8
  466. package/tests/cases/integration/graphQlRequests/update/manyHasManyInverse/delete.test.ts +51 -12
  467. package/tests/cases/integration/graphQlRequests/update/manyHasManyInverse/update.test.ts +3 -9
  468. package/tests/cases/integration/graphQlRequests/update/manyHasManyInverse/upsert.test.ts +3 -9
  469. package/tests/cases/integration/graphQlRequests/update/manyHasManyOwning/delete.test.ts +51 -12
  470. package/tests/cases/integration/graphQlRequests/update/manyHasManyOwning/update.test.ts +3 -9
  471. package/tests/cases/integration/graphQlRequests/update/manyHasManyOwning/upsert.test.ts +3 -9
  472. package/tests/cases/integration/graphQlRequests/update/manyHasOne/connect.test.ts +3 -10
  473. package/tests/cases/integration/graphQlRequests/update/manyHasOne/create.test.ts +3 -10
  474. package/tests/cases/integration/graphQlRequests/update/manyHasOne/delete.test.ts +86 -50
  475. package/tests/cases/integration/graphQlRequests/update/manyHasOne/disconnect.test.ts +3 -9
  476. package/tests/cases/integration/graphQlRequests/update/manyHasOne/update.test.ts +3 -9
  477. package/tests/cases/integration/graphQlRequests/update/manyHasOne/upsert.test.ts +6 -18
  478. package/tests/cases/integration/graphQlRequests/update/oneHasMany/combination.test.ts +11 -12
  479. package/tests/cases/integration/graphQlRequests/update/oneHasMany/connect.test.ts +3 -11
  480. package/tests/cases/integration/graphQlRequests/update/oneHasMany/delete.test.ts +51 -12
  481. package/tests/cases/integration/graphQlRequests/update/oneHasMany/disconnect.test.ts +3 -8
  482. package/tests/cases/integration/graphQlRequests/update/oneHasMany/update.test.ts +3 -6
  483. package/tests/cases/integration/graphQlRequests/update/oneHasMany/upsert.test.ts +3 -6
  484. package/tests/cases/integration/graphQlRequests/update/oneHasOneInverse/connect.test.ts +101 -31
  485. package/tests/cases/integration/graphQlRequests/update/oneHasOneInverse/create.test.ts +14 -15
  486. package/tests/cases/integration/graphQlRequests/update/oneHasOneInverse/delete.test.ts +106 -12
  487. package/tests/cases/integration/graphQlRequests/update/oneHasOneInverse/disconnect.test.ts +11 -12
  488. package/tests/cases/integration/graphQlRequests/update/oneHasOneInverse/schema.ts +13 -0
  489. package/tests/cases/integration/graphQlRequests/update/oneHasOneInverse/update.test.ts +3 -6
  490. package/tests/cases/integration/graphQlRequests/update/oneHasOneInverse/upsert.test.ts +11 -13
  491. package/tests/cases/integration/graphQlRequests/update/oneHasOneOwning/connect.test.ts +89 -30
  492. package/tests/cases/integration/graphQlRequests/update/oneHasOneOwning/connectOrCreate.test.ts +51 -0
  493. package/tests/cases/integration/graphQlRequests/update/oneHasOneOwning/create.test.ts +77 -11
  494. package/tests/cases/integration/graphQlRequests/update/oneHasOneOwning/delete.test.ts +69 -26
  495. package/tests/cases/integration/graphQlRequests/update/oneHasOneOwning/disconnect.test.ts +3 -10
  496. package/tests/cases/integration/graphQlRequests/update/oneHasOneOwning/schema.ts +14 -1
  497. package/tests/cases/integration/graphQlRequests/update/oneHasOneOwning/update.test.ts +3 -9
  498. package/tests/cases/integration/graphQlRequests/update/oneHasOneOwning/upsert.test.ts +6 -19
  499. package/tests/cases/integration/graphQlRequests/update/queryPortal.test.ts +6 -8
  500. package/tests/cases/integration/graphQlRequests/update/transaction.test.ts +9 -24
  501. package/tests/cases/integration/graphQlRequests/upsert/basicUpsert.test.ts +3 -7
  502. package/tests/cases/integration/graphQlSchema/schema-acl-allowed.gql +14 -1
  503. package/tests/cases/integration/graphQlSchema/schema-acl-restricted-create.gql +5 -5
  504. package/tests/cases/integration/graphQlSchema/schema-acl-restricted-delete.gql +14 -1
  505. package/tests/cases/integration/graphQlSchema/schema-acl-restricted-update.gql +12 -0
  506. package/tests/cases/integration/graphQlSchema/schema-basic.gql +40 -2
  507. package/tests/cases/integration/graphQlSchema/schema-bug-66.gql +30 -3
  508. package/tests/cases/integration/graphQlSchema/schema-custom-primary.gql +40 -2
  509. package/tests/cases/integration/graphQlSchema/schema-has-many-reduction.gql +14 -1
  510. package/tests/cases/integration/graphQlSchema/schema-new-builder.gql +40 -2
  511. package/tests/cases/unit/orderbyHelper.test.ts +13 -0
  512. package/tests/src/test.ts +38 -40
  513. package/tests/src/testGraphql.ts +1 -1
  514. package/tests/tsconfig.json +3 -9
  515. package/dist/src/mapper/MapperContainer.d.ts +0 -18
  516. package/dist/src/mapper/MapperContainer.d.ts.map +0 -1
  517. package/dist/src/mapper/MapperContainer.js +0 -55
  518. package/dist/src/mapper/MapperContainer.js.map +0 -1
  519. package/dist/src/resolvers/ExecutionContainerFactory.d.ts +0 -24
  520. package/dist/src/resolvers/ExecutionContainerFactory.d.ts.map +0 -1
  521. package/dist/src/resolvers/ExecutionContainerFactory.js +0 -45
  522. package/dist/src/resolvers/ExecutionContainerFactory.js.map +0 -1
  523. package/dist/tests/cases/integration/graphQlRequests/insert/manyHasManyInverse/insertRelationCreate.test.d.ts +0 -2
  524. package/dist/tests/cases/integration/graphQlRequests/insert/manyHasManyInverse/insertRelationCreate.test.d.ts.map +0 -1
  525. package/dist/tests/cases/integration/graphQlRequests/insert/manyHasManyInverse/insertRelationCreate.test.js.map +0 -1
  526. package/dist/tests/cases/integration/graphQlRequests/insert/manyHasManyOwning/insertRelationCreate.test.d.ts +0 -2
  527. package/dist/tests/cases/integration/graphQlRequests/insert/manyHasManyOwning/insertRelationCreate.test.d.ts.map +0 -1
  528. package/dist/tests/cases/integration/graphQlRequests/insert/manyHasManyOwning/insertRelationCreate.test.js.map +0 -1
  529. package/dist/tests/cases/integration/graphQlRequests/insert/manyHasOne/insertRelationCreate.test.d.ts +0 -2
  530. package/dist/tests/cases/integration/graphQlRequests/insert/manyHasOne/insertRelationCreate.test.d.ts.map +0 -1
  531. package/dist/tests/cases/integration/graphQlRequests/insert/manyHasOne/insertRelationCreate.test.js.map +0 -1
  532. package/dist/tests/cases/integration/graphQlRequests/insert/oneHasMany/insertRelationConnect.test.d.ts +0 -2
  533. package/dist/tests/cases/integration/graphQlRequests/insert/oneHasMany/insertRelationConnect.test.d.ts.map +0 -1
  534. package/dist/tests/cases/integration/graphQlRequests/insert/oneHasMany/insertRelationConnect.test.js.map +0 -1
  535. package/dist/tests/cases/integration/graphQlRequests/insert/oneHasMany/insertRelationCreate.test.d.ts +0 -2
  536. package/dist/tests/cases/integration/graphQlRequests/insert/oneHasMany/insertRelationCreate.test.d.ts.map +0 -1
  537. package/dist/tests/cases/integration/graphQlRequests/insert/oneHasMany/insertRelationCreate.test.js.map +0 -1
  538. package/dist/tests/cases/integration/graphQlRequests/insert/oneHasOneInverse/insertRelationCreate.test.d.ts +0 -2
  539. package/dist/tests/cases/integration/graphQlRequests/insert/oneHasOneInverse/insertRelationCreate.test.d.ts.map +0 -1
  540. package/dist/tests/cases/integration/graphQlRequests/insert/oneHasOneInverse/insertRelationCreate.test.js.map +0 -1
  541. package/dist/tests/cases/integration/graphQlRequests/insert/oneHasOneOwning/insertRelationCreate.test.d.ts +0 -2
  542. package/dist/tests/cases/integration/graphQlRequests/insert/oneHasOneOwning/insertRelationCreate.test.d.ts.map +0 -1
  543. package/dist/tests/cases/integration/graphQlRequests/insert/oneHasOneOwning/insertRelationCreate.test.js.map +0 -1
  544. package/dist/tests/cases/integration/graphQlRequests/insert/oneHasOneOwning/insertRelationEmpty.test.d.ts +0 -2
  545. package/dist/tests/cases/integration/graphQlRequests/insert/oneHasOneOwning/insertRelationEmpty.test.d.ts.map +0 -1
  546. package/dist/tests/cases/integration/graphQlRequests/insert/oneHasOneOwning/insertRelationEmpty.test.js.map +0 -1
  547. package/src/mapper/MapperContainer.ts +0 -138
  548. package/src/resolvers/ExecutionContainerFactory.ts +0 -74
  549. /package/tests/cases/integration/graphQlRequests/insert/manyHasManyInverse/{insertRelationCreate.test.ts → create.test.ts} +0 -0
  550. /package/tests/cases/integration/graphQlRequests/insert/manyHasManyOwning/{insertRelationCreate.test.ts → create.test.ts} +0 -0
  551. /package/tests/cases/integration/graphQlRequests/insert/manyHasOne/{insertRelationCreate.test.ts → create.test.ts} +0 -0
  552. /package/tests/cases/integration/graphQlRequests/insert/oneHasMany/{insertRelationCreate.test.ts → create.test.ts} +0 -0
  553. /package/tests/cases/integration/graphQlRequests/insert/oneHasOneInverse/{insertRelationCreate.test.ts → create.test.ts} +0 -0
  554. /package/tests/cases/integration/graphQlRequests/insert/oneHasOneOwning/{insertRelationCreate.test.ts → create.test.ts} +0 -0
  555. /package/tests/cases/integration/graphQlRequests/insert/oneHasOneOwning/{insertRelationEmpty.test.ts → empty.test.ts} +0 -0
@@ -0,0 +1,158 @@
1
+ import { Input, Model, Value } from '@contember/schema'
2
+ import { ResolvedColumnValue } from './ColumnValue'
3
+ import { Mapper } from './Mapper'
4
+ import { logger } from '@contember/logger'
5
+
6
+ export class BeforeInsertEvent {
7
+ public type = 'BeforeInsertEvent' as const
8
+
9
+ public afterEvent: AfterInsertEvent | undefined = undefined
10
+
11
+ constructor(
12
+ public readonly entity: Model.Entity,
13
+ public readonly data: ResolvedColumnValue[],
14
+ ) {
15
+ }
16
+ }
17
+
18
+ export class AfterInsertEvent {
19
+ public type = 'AfterInsertEvent' as const
20
+
21
+ constructor(
22
+ public readonly entity: Model.Entity,
23
+ public readonly data: ResolvedColumnValue[],
24
+ public readonly id: Input.PrimaryValue,
25
+ ) {
26
+ }
27
+ }
28
+
29
+
30
+ export class BeforeUpdateEvent {
31
+ public type = 'BeforeUpdateEvent' as const
32
+
33
+ public afterEvent: AfterUpdateEvent | undefined = undefined
34
+
35
+ constructor(
36
+ public readonly entity: Model.Entity,
37
+ public readonly data: ResolvedColumnValue[],
38
+ public readonly id: Input.PrimaryValue,
39
+ ) {
40
+ }
41
+ }
42
+
43
+ export class AfterUpdateEvent {
44
+ public type = 'AfterUpdateEvent' as const
45
+
46
+ private _hasChanges: boolean | undefined
47
+
48
+ constructor(
49
+ public readonly entity: Model.Entity,
50
+ public readonly data: (ResolvedColumnValue & { old: Value.FieldValue })[],
51
+ public readonly id: Input.PrimaryValue,
52
+ ) {
53
+ }
54
+ get hasChanges() {
55
+ // todo: deep equals
56
+ return this._hasChanges = this.data.some(it => it.resolvedValue !== it.old)
57
+ }
58
+ }
59
+
60
+ export class BeforeDeleteEvent {
61
+ public type = 'BeforeDeleteEvent' as const
62
+
63
+ constructor(
64
+ public readonly entity: Model.Entity,
65
+ public readonly id: Input.PrimaryValue,
66
+ ) {
67
+ }
68
+ }
69
+
70
+ export class BeforeJunctionUpdateEvent {
71
+ public type = 'BeforeJunctionUpdateEvent' as const
72
+
73
+ public afterEvent: AfterJunctionUpdateEvent | undefined = undefined
74
+
75
+ constructor(
76
+ public readonly owningEntity: Model.Entity,
77
+ public readonly owningRelation: Model.ManyHasManyOwningRelation,
78
+ public readonly owningId: Input.PrimaryValue,
79
+ public readonly inverseId: Input.PrimaryValue,
80
+ public readonly operation: 'connect' | 'disconnect',
81
+ ) {
82
+ }
83
+ }
84
+
85
+
86
+ export class AfterJunctionUpdateEvent {
87
+ public type = 'AfterJunctionUpdateEvent' as const
88
+
89
+ constructor(
90
+ public readonly owningEntity: Model.Entity,
91
+ public readonly owningRelation: Model.ManyHasManyOwningRelation,
92
+ public readonly owningId: Input.PrimaryValue,
93
+ public readonly inverseId: Input.PrimaryValue,
94
+ public readonly operation: 'connect' | 'disconnect',
95
+ public readonly hasChanges: boolean,
96
+ ) {
97
+ }
98
+ }
99
+
100
+ export class BeforeCommitEvent {
101
+ public type = 'BeforeCommitEvent' as const
102
+ }
103
+
104
+ export class AfterCommitEvent {
105
+ public type = 'AfterCommitEvent' as const
106
+ }
107
+
108
+ export type DataModificationEvent =
109
+ | BeforeInsertEvent
110
+ | AfterInsertEvent
111
+ | BeforeUpdateEvent
112
+ | AfterUpdateEvent
113
+ | BeforeJunctionUpdateEvent
114
+ | AfterJunctionUpdateEvent
115
+ | BeforeDeleteEvent
116
+
117
+ export type AnyEvent =
118
+ | DataModificationEvent
119
+ | BeforeCommitEvent
120
+ | AfterCommitEvent
121
+
122
+ export type EventMap<E extends AnyEvent = AnyEvent> = {
123
+ [K in E['type']]: E extends { type: K } ? E : never
124
+ }
125
+
126
+ export type EventListener<K extends keyof EventMap> = (event: EventMap[K], mapper: Mapper) => Promise<void>
127
+
128
+ export class EventManager {
129
+ private listeners: { [K in keyof EventMap]: EventListener<K>[] } = {
130
+ BeforeInsertEvent: [],
131
+ AfterInsertEvent: [],
132
+ BeforeUpdateEvent: [],
133
+ AfterUpdateEvent: [],
134
+ BeforeDeleteEvent: [],
135
+ BeforeCommitEvent: [],
136
+ AfterCommitEvent: [],
137
+ BeforeJunctionUpdateEvent: [],
138
+ AfterJunctionUpdateEvent: [],
139
+ }
140
+
141
+ constructor(
142
+ private readonly mapper: Mapper,
143
+ ) {
144
+ }
145
+
146
+ public listen<K extends keyof EventMap>(type: K, cb: EventListener<K>) {
147
+ this.listeners[type].push(cb)
148
+ }
149
+
150
+ public async fire<K extends keyof EventMap>(event: EventMap[K]) {
151
+ (await Promise.allSettled(this.listeners[event.type].map(it => (it as EventListener<K>)(event, this.mapper))))
152
+ .map(it => {
153
+ if (it.status === 'rejected') {
154
+ logger.error(it.reason)
155
+ }
156
+ })
157
+ }
158
+ }
@@ -1,6 +1,5 @@
1
1
  import { getEntity } from '@contember/schema-utils'
2
- import { PathFactory } from './select'
3
- import { WhereBuilder } from './select'
2
+ import { PathFactory, WhereBuilder } from './select'
4
3
  import { PredicateFactory } from '../acl'
5
4
  import {
6
5
  Client,
@@ -16,14 +15,21 @@ import {
16
15
  MutationJunctionUpdateOk,
17
16
  MutationNoResultError,
18
17
  MutationNothingToDo,
19
- MutationResult,
20
18
  MutationResultList,
19
+ MutationResultType,
21
20
  NothingToDoReason,
22
21
  } from './Result'
23
22
  import { ImplementationException } from '../exception'
23
+ import { AfterJunctionUpdateEvent, BeforeJunctionUpdateEvent } from './EventManager'
24
+ import { Mapper } from './Mapper'
24
25
 
25
26
  type OkResultFactory = () => MutationJunctionUpdateOk
26
27
 
28
+ type JunctionMutationResult =
29
+ | MutationJunctionUpdateOk
30
+ | MutationNothingToDo
31
+ | MutationNoResultError
32
+
27
33
  export class JunctionTableManager {
28
34
  constructor(
29
35
  private readonly schema: Model.Schema,
@@ -35,43 +41,55 @@ export class JunctionTableManager {
35
41
  ) {}
36
42
 
37
43
  public async connectJunction(
38
- db: Client,
44
+ mapper: Mapper,
39
45
  owningEntity: Model.Entity,
40
46
  relation: Model.ManyHasManyOwningRelation,
41
47
  owningUnique: Input.PrimaryValue,
42
48
  inverseUnique: Input.PrimaryValue,
43
49
  ): Promise<MutationResultList> {
44
- return [
45
- await this.executeJunctionModification(
46
- db,
47
- owningEntity,
48
- relation,
49
- owningUnique,
50
- inverseUnique,
51
- this.connectJunctionHandler,
52
- ),
53
- ]
50
+ const beforeEvent = new BeforeJunctionUpdateEvent(owningEntity, relation, owningUnique, inverseUnique, 'connect')
51
+ await mapper.eventManager.fire(beforeEvent)
52
+ const result = await this.executeJunctionModification(
53
+ mapper.db,
54
+ owningEntity,
55
+ relation,
56
+ owningUnique,
57
+ inverseUnique,
58
+ this.connectJunctionHandler,
59
+ )
60
+ if (result.result !== MutationResultType.noResultError) {
61
+ const afterEvent = new AfterJunctionUpdateEvent(owningEntity, relation, owningUnique, inverseUnique, 'connect', result.result === MutationResultType.ok)
62
+ await mapper.eventManager.fire(afterEvent)
63
+ }
64
+ return [result]
54
65
  }
55
66
 
56
67
  public async disconnectJunction(
57
- db: Client,
68
+ mapper: Mapper,
58
69
  owningEntity: Model.Entity,
59
70
  relation: Model.ManyHasManyOwningRelation,
60
71
  owningUnique: Input.PrimaryValue,
61
72
  inverseUnique: Input.PrimaryValue,
62
73
  ): Promise<MutationResultList> {
63
- return [
64
- await this.executeJunctionModification(
65
- db,
66
- owningEntity,
67
- relation,
68
- owningUnique,
69
- inverseUnique,
70
- this.disconnectJunctionHandler,
71
- ),
72
- ]
74
+ const beforeEvent = new BeforeJunctionUpdateEvent(owningEntity, relation, owningUnique, inverseUnique, 'connect')
75
+ await mapper.eventManager.fire(beforeEvent)
76
+ const result = await this.executeJunctionModification(
77
+ mapper.db,
78
+ owningEntity,
79
+ relation,
80
+ owningUnique,
81
+ inverseUnique,
82
+ this.disconnectJunctionHandler,
83
+ )
84
+ if (result.result !== MutationResultType.noResultError) {
85
+ const afterEvent = new AfterJunctionUpdateEvent(owningEntity, relation, owningUnique, inverseUnique, 'disconnect', result.result === MutationResultType.ok)
86
+ beforeEvent.afterEvent = afterEvent
87
+ await mapper.eventManager.fire(afterEvent)
88
+ }
89
+ return [result]
73
90
  }
74
91
 
92
+
75
93
  private async executeJunctionModification(
76
94
  db: Client,
77
95
  owningEntity: Model.Entity,
@@ -79,7 +97,7 @@ export class JunctionTableManager {
79
97
  owningPrimary: Input.PrimaryValue,
80
98
  inversePrimary: Input.PrimaryValue,
81
99
  handler: JunctionHandler,
82
- ): Promise<MutationResult> {
100
+ ): Promise<JunctionMutationResult> {
83
101
  const joiningTable = relation.joiningTable
84
102
  const inverseEntity = getEntity(this.schema, relation.target)
85
103
  if (inverseEntity.view || owningEntity.view) {
@@ -145,9 +163,9 @@ interface JunctionComplexExecutionArgs {
145
163
  }
146
164
 
147
165
  interface JunctionHandler {
148
- executeSimple(args: JunctionSimpleExecutionArgs): Promise<MutationResult>
166
+ executeSimple(args: JunctionSimpleExecutionArgs): Promise<JunctionMutationResult>
149
167
 
150
- executeComplex(args: JunctionComplexExecutionArgs): Promise<MutationResult>
168
+ executeComplex(args: JunctionComplexExecutionArgs): Promise<JunctionMutationResult>
151
169
  }
152
170
 
153
171
  export class JunctionConnectHandler implements JunctionHandler {
@@ -157,7 +175,7 @@ export class JunctionConnectHandler implements JunctionHandler {
157
175
  owningPrimary,
158
176
  inversePrimary,
159
177
  okResultFactory,
160
- }: JunctionSimpleExecutionArgs): Promise<MutationResult> {
178
+ }: JunctionSimpleExecutionArgs): Promise<JunctionMutationResult> {
161
179
  const result = await InsertBuilder.create()
162
180
  .into(joiningTable.tableName)
163
181
  .values({
@@ -177,7 +195,7 @@ export class JunctionConnectHandler implements JunctionHandler {
177
195
  joiningTable,
178
196
  dataCallback,
179
197
  okResultFactory,
180
- }: JunctionComplexExecutionArgs): Promise<MutationResult> {
198
+ }: JunctionComplexExecutionArgs): Promise<JunctionMutationResult> {
181
199
  const insert = InsertBuilder.create()
182
200
  .into(joiningTable.tableName)
183
201
  .values({
@@ -216,7 +234,7 @@ export class JunctionDisconnectHandler implements JunctionHandler {
216
234
  owningPrimary,
217
235
  inversePrimary,
218
236
  okResultFactory,
219
- }: JunctionSimpleExecutionArgs): Promise<MutationResult> {
237
+ }: JunctionSimpleExecutionArgs): Promise<JunctionMutationResult> {
220
238
  const qb = DeleteBuilder.create()
221
239
  .from(joiningTable.tableName)
222
240
  .where(cond => cond.compare(joiningTable.joiningColumn.columnName, Operator.eq, owningPrimary))
@@ -234,7 +252,7 @@ export class JunctionDisconnectHandler implements JunctionHandler {
234
252
  joiningTable,
235
253
  dataCallback,
236
254
  okResultFactory,
237
- }: JunctionComplexExecutionArgs): Promise<MutationResult> {
255
+ }: JunctionComplexExecutionArgs): Promise<JunctionMutationResult> {
238
256
  const deleteQb = DeleteBuilder.create()
239
257
  .from(joiningTable.tableName)
240
258
  .using('data')
@@ -1,35 +1,43 @@
1
1
  import { Input, Model } from '@contember/schema'
2
- import { getColumnName } from '@contember/schema-utils'
3
- import { SelectGroupedObjects, SelectHydrator, SelectIndexedResultObjects, SelectResultObject } from './select'
4
- import { PathFactory } from './select'
5
- import * as database from '@contember/database'
6
- import { Client, SelectBuilder } from '@contember/database'
7
- import { SelectBuilderFactory } from './select'
2
+ import { acceptFieldVisitor, getColumnName } from '@contember/schema-utils'
3
+ import {
4
+ OrderByHelper,
5
+ PathFactory,
6
+ SelectBuilderFactory,
7
+ SelectGroupedObjects,
8
+ SelectHydrator,
9
+ SelectIndexedResultObjects,
10
+ SelectResultObject,
11
+ WhereBuilder,
12
+ } from './select'
13
+ import { Client, Connection, ConstraintHelper, SelectBuilder } from '@contember/database'
8
14
  import { PredicatesInjector } from '../acl'
9
- import { WhereBuilder } from './select'
10
15
  import { JunctionTableManager } from './JunctionTableManager'
11
16
  import { DeletedEntitiesStorage, DeleteExecutor } from './delete'
12
17
  import { MutationEntryNotFoundError, MutationResultList } from './Result'
13
- import { Updater } from './update'
14
- import { Inserter } from './insert'
18
+ import { UpdateBuilder, Updater } from './update'
19
+ import { InsertBuilder, Inserter } from './insert'
15
20
  import { tryMutation } from './ErrorUtils'
16
- import { OrderByHelper } from './select'
17
- import { ObjectNode, UniqueWhereExpander } from '../inputProcessing'
18
- import { UpdateBuilder } from './update'
21
+ import { ObjectNode, UniqueWhereExpander } from '../inputProcessing'
19
22
  import { Mutex } from '../utils'
20
23
  import { CheckedPrimary } from './CheckedPrimary'
21
- import { ConstraintHelper } from '@contember/database'
22
24
  import { ImplementationException } from '../exception'
25
+ import { EventManager } from './EventManager'
23
26
 
24
- export class Mapper {
27
+ export class Mapper<ConnectionType extends Connection.ConnectionLike = Connection.ConnectionLike> {
25
28
  private primaryKeyCache: Record<string, Promise<string> | string> = {}
29
+ private systemVariablesSetupDone: Promise<void> | undefined
26
30
  public readonly deletedEntities = new DeletedEntitiesStorage()
27
31
  public readonly mutex = new Mutex()
28
32
  public readonly constraintHelper: ConstraintHelper
29
33
 
34
+ public readonly eventManager: EventManager
35
+
30
36
  constructor(
37
+ public readonly db: Client<ConnectionType>,
38
+ public readonly identityId: string,
39
+ public readonly transactionId: string,
31
40
  private readonly schema: Model.Schema,
32
- public readonly db: database.Client,
33
41
  private readonly predicatesInjector: PredicatesInjector,
34
42
  private readonly selectBuilderFactory: SelectBuilderFactory,
35
43
  private readonly uniqueWhereExpander: UniqueWhereExpander,
@@ -41,9 +49,10 @@ export class Mapper {
41
49
  private readonly pathFactory: PathFactory,
42
50
  ) {
43
51
  this.constraintHelper = new ConstraintHelper(db)
52
+ this.eventManager = new EventManager(this)
44
53
  }
45
54
 
46
- public async selectField(entity: Model.Entity, where: Input.UniqueWhere, fieldName: string) {
55
+ public async selectField(entity: Model.Entity, where: Input.UniqueWhere | CheckedPrimary, fieldName: string) {
47
56
  const columnName = getColumnName(this.schema, entity, fieldName)
48
57
 
49
58
  const qb = SelectBuilder.create() //
@@ -119,7 +128,7 @@ export class Mapper {
119
128
  relationPath: Model.AnyRelationContext[],
120
129
  groupBy?: string,
121
130
  ) {
122
- const inputWithOrder = OrderByHelper.appendDefaultOrderBy(entity, input, [])
131
+ const inputWithOrder = OrderByHelper.appendDefaultOrderBy(entity, input, undefined)
123
132
  const path = this.pathFactory.create([])
124
133
  const augmentedBuilder = qb.from(entity.tableName, path.alias).meta('path', [...input.path, input.alias])
125
134
 
@@ -163,15 +172,17 @@ export class Mapper {
163
172
  return Object.fromEntries(result)
164
173
  }
165
174
 
166
- public async insert(entity: Model.Entity, data: Input.CreateDataInput): Promise<MutationResultList> {
175
+ public async insert(
176
+ entity: Model.Entity,
177
+ data: Input.CreateDataInput,
178
+ builderCb: (builder: InsertBuilder) => void = () => {},
179
+ ): Promise<MutationResultList> {
167
180
  if (entity.view) {
168
181
  throw new ImplementationException()
169
182
  }
183
+ await this.setupSystemVariables()
170
184
  return tryMutation(this.schema, () =>
171
- this.inserter.insert(this, entity, data, id => {
172
- const where = { [entity.primary]: id }
173
- this.primaryKeyCache[this.hashWhere(entity.name, where)] = id
174
- }),
185
+ this.insertInternal(entity, data, builderCb),
175
186
  )
176
187
  }
177
188
 
@@ -184,6 +195,7 @@ export class Mapper {
184
195
  if (entity.view) {
185
196
  throw new ImplementationException()
186
197
  }
198
+ await this.setupSystemVariables()
187
199
  return tryMutation(this.schema, async () => {
188
200
  const primaryValue = await this.getPrimaryValue(entity, by)
189
201
  if (primaryValue === undefined) {
@@ -195,19 +207,21 @@ export class Mapper {
195
207
 
196
208
  public async updateInternal(
197
209
  entity: Model.Entity,
198
- by: Input.UniqueWhere,
199
- predicateFields: string[],
210
+ by: Input.UniqueWhere | CheckedPrimary,
200
211
  builderCb: (builder: UpdateBuilder) => void,
201
212
  ): Promise<MutationResultList> {
213
+ if (entity.view) {
214
+ throw new ImplementationException()
215
+ }
216
+ await this.setupSystemVariables()
202
217
  return tryMutation(this.schema, async () => {
203
218
  const primaryValue = await this.getPrimaryValue(entity, by)
204
219
  if (primaryValue === undefined) {
205
- return [new MutationEntryNotFoundError([], by)]
220
+ return [new MutationEntryNotFoundError([], by as Input.UniqueWhere)]
206
221
  }
207
- return await this.updater.updateCb(this, entity, primaryValue, predicateFields, builderCb)
222
+ return await this.updater.updateCb(this, entity, primaryValue, builderCb)
208
223
  })
209
224
  }
210
-
211
225
  public async upsert(
212
226
  entity: Model.Entity,
213
227
  by: Input.UniqueWhere,
@@ -218,18 +232,23 @@ export class Mapper {
218
232
  if (entity.view) {
219
233
  throw new ImplementationException()
220
234
  }
235
+ await this.setupSystemVariables()
221
236
  return tryMutation(this.schema, async () => {
222
237
  const primaryValue = await this.getPrimaryValue(entity, by)
223
238
  if (primaryValue === undefined) {
224
- return await this.inserter.insert(this, entity, create, id => {
225
- const where = { [entity.primary]: id }
226
- this.primaryKeyCache[this.hashWhere(entity.name, where)] = id
227
- })
239
+ return await this.insertInternal(entity, create)
228
240
  }
229
241
  return await this.updater.update(this, entity, primaryValue, update, filter)
230
242
  })
231
243
  }
232
244
 
245
+ private insertInternal(entity: Model.Entity, data: Input.CreateDataInput, builderCb: (builder: InsertBuilder) => void = () => {}) {
246
+ return this.inserter.insert(this, entity, data, id => {
247
+ const where = { [entity.primary]: id }
248
+ this.primaryKeyCache[this.hashWhere(entity.name, where)] = id
249
+ }, builderCb)
250
+ }
251
+
233
252
  public async delete(
234
253
  entity: Model.Entity,
235
254
  by: Input.UniqueWhere | CheckedPrimary,
@@ -238,37 +257,58 @@ export class Mapper {
238
257
  if (entity.view) {
239
258
  throw new ImplementationException()
240
259
  }
260
+ await this.setupSystemVariables()
241
261
  return tryMutation(this.schema, () => this.deleteExecutor.execute(this, entity, by, filter))
242
262
  }
243
263
 
244
264
  public async connectJunction(
245
- owningEntity: Model.Entity,
246
- relation: Model.ManyHasManyOwningRelation,
247
- owningPrimary: Input.PrimaryValue,
248
- inversePrimary: Input.PrimaryValue,
265
+ entity: Model.Entity,
266
+ relation: Model.ManyHasManyOwningRelation | Model.ManyHasManyInverseRelation,
267
+ thisPrimary: Input.PrimaryValue,
268
+ otherPrimary: Input.PrimaryValue,
249
269
  ): Promise<MutationResultList> {
250
- return await this.junctionTableManager.connectJunction(
251
- this.db,
252
- owningEntity,
253
- relation,
254
- owningPrimary,
255
- inversePrimary,
256
- )
270
+ await this.setupSystemVariables()
271
+ const err = () => {
272
+ throw new ImplementationException()
273
+ }
274
+ return await acceptFieldVisitor(this.schema, entity, relation, {
275
+ visitManyHasManyOwning: ({ entity, relation }) => {
276
+ return this.junctionTableManager.connectJunction(this, entity, relation, thisPrimary, otherPrimary)
277
+ },
278
+ visitManyHasManyInverse: ({ targetEntity, targetRelation }) => {
279
+ return this.junctionTableManager.connectJunction(this, targetEntity, targetRelation, otherPrimary, thisPrimary)
280
+ },
281
+ visitColumn: err,
282
+ visitOneHasMany: err,
283
+ visitOneHasOneInverse: err,
284
+ visitOneHasOneOwning: err,
285
+ visitManyHasOne: err,
286
+ })
257
287
  }
258
288
 
259
289
  public async disconnectJunction(
260
- owningEntity: Model.Entity,
261
- relation: Model.ManyHasManyOwningRelation,
262
- owningPrimary: Input.PrimaryValue,
263
- inversePrimary: Input.PrimaryValue,
290
+ entity: Model.Entity,
291
+ relation: Model.ManyHasManyOwningRelation | Model.ManyHasManyInverseRelation,
292
+ thisPrimary: Input.PrimaryValue,
293
+ otherPrimary: Input.PrimaryValue,
264
294
  ): Promise<MutationResultList> {
265
- return await this.junctionTableManager.disconnectJunction(
266
- this.db,
267
- owningEntity,
268
- relation,
269
- owningPrimary,
270
- inversePrimary,
271
- )
295
+ await this.setupSystemVariables()
296
+ const err = () => {
297
+ throw new ImplementationException()
298
+ }
299
+ return await acceptFieldVisitor(this.schema, entity, relation, {
300
+ visitManyHasManyOwning: ({ entity, relation }) => {
301
+ return this.junctionTableManager.disconnectJunction(this, entity, relation, thisPrimary, otherPrimary)
302
+ },
303
+ visitManyHasManyInverse: ({ targetEntity, targetRelation }) => {
304
+ return this.junctionTableManager.disconnectJunction(this, targetEntity, targetRelation, otherPrimary, thisPrimary)
305
+ },
306
+ visitColumn: err,
307
+ visitOneHasMany: err,
308
+ visitOneHasOneInverse: err,
309
+ visitOneHasOneOwning: err,
310
+ visitManyHasOne: err,
311
+ })
272
312
  }
273
313
 
274
314
  public async getPrimaryValue(
@@ -295,6 +335,12 @@ export class Mapper {
295
335
  private hashWhere(entityName: string, where: Input.UniqueWhere): string {
296
336
  return JSON.stringify([entityName, where])
297
337
  }
298
- }
299
338
 
300
- export type MapperFactory = (db: Client) => Mapper
339
+ private async setupSystemVariables() {
340
+ this.systemVariablesSetupDone ??= (async () => {
341
+ await this.db.query('SELECT set_config(?, ?, false)', ['tenant.identity_id', this.identityId]) // todo rename to system.identity_id
342
+ await this.db.query('SELECT set_config(?, ?, false)', ['system.transaction_id', this.transactionId])
343
+ })()
344
+ await this.systemVariablesSetupDone
345
+ }
346
+ }
@@ -0,0 +1,67 @@
1
+ import { PredicatesInjector } from '../acl'
2
+ import { PathFactory, SelectBuilderFactory, WhereBuilder } from './select'
3
+ import { UniqueWhereExpander } from '../inputProcessing'
4
+ import { JunctionTableManager } from './JunctionTableManager'
5
+ import { DeleteExecutor } from './delete'
6
+ import { Updater } from './update'
7
+ import { Inserter } from './insert'
8
+ import { Model } from '@contember/schema'
9
+ import { Client, Connection } from '@contember/database'
10
+ import { Mapper } from './Mapper'
11
+ import { Providers } from '@contember/schema-utils'
12
+
13
+ export type MapperFactoryHook = (mapper: Mapper) => void
14
+
15
+ export class MapperFactory {
16
+
17
+ public readonly hooks: MapperFactoryHook[] = []
18
+
19
+ constructor(
20
+ private readonly db: Client,
21
+ private readonly identityId: string,
22
+ private readonly schema: Model.Schema,
23
+ private readonly predicatesInjector: PredicatesInjector,
24
+ private readonly selectBuilderFactory: SelectBuilderFactory,
25
+ private readonly uniqueWhereExpander: UniqueWhereExpander,
26
+ private readonly whereBuilder: WhereBuilder,
27
+ private readonly junctionTableManager: JunctionTableManager,
28
+ private readonly deleteExecutor: DeleteExecutor,
29
+ private readonly updater: Updater,
30
+ private readonly inserter: Inserter,
31
+ private readonly pathFactory: PathFactory,
32
+ private readonly providers: Providers,
33
+ ) {
34
+ }
35
+
36
+ public create() {
37
+ return this.createInternal(this.db)
38
+ }
39
+
40
+ public transaction<T>(cb: (mapper: Mapper<Connection.TransactionLike>) => Promise<T>): Promise<T> {
41
+ return this.db.transaction(async trx => {
42
+ await trx.connection.query(Connection.REPEATABLE_READ)
43
+ const mapper = this.createInternal(trx)
44
+ return await cb(mapper)
45
+ })
46
+ }
47
+
48
+ private createInternal<T extends Connection.ConnectionLike>(db: Client<T>) {
49
+ const mapper = new Mapper<T>(
50
+ db,
51
+ this.identityId,
52
+ this.providers.uuid(),
53
+ this.schema,
54
+ this.predicatesInjector,
55
+ this.selectBuilderFactory,
56
+ this.uniqueWhereExpander,
57
+ this.whereBuilder,
58
+ this.junctionTableManager,
59
+ this.deleteExecutor,
60
+ this.updater,
61
+ this.inserter,
62
+ this.pathFactory,
63
+ )
64
+ this.hooks.forEach(it => it(mapper))
65
+ return mapper
66
+ }
67
+ }
@@ -50,7 +50,7 @@ interface MutationResultInterface {
50
50
  hints: MutationResultHint[]
51
51
  }
52
52
 
53
- export type RowValues = { [fieldName: string]: Value.AtomicValue }
53
+ export type RowValues = { [fieldName: string]: Value.FieldValue }
54
54
 
55
55
  export class MutationUpdateOk implements MutationResultInterface {
56
56
  result = MutationResultType.ok as const
@@ -63,6 +63,7 @@ export class MutationUpdateOk implements MutationResultInterface {
63
63
  public readonly primary: Value.PrimaryValue,
64
64
  public readonly input: Input.UpdateDataInput,
65
65
  public readonly values: RowValues,
66
+ public readonly oldValues?: RowValues,
66
67
  ) {}
67
68
  }
68
69
 
@@ -170,7 +171,7 @@ export class MutationEntryNotFoundError implements MutationResultInterface {
170
171
  hints: MutationResultHint[] = []
171
172
  message: string
172
173
 
173
- constructor(public readonly paths: Path[], public readonly where: Input.UniqueWhere) {
174
+ constructor(public readonly paths: Path[], public readonly where: Input.UniqueWhere | Input.Where) {
174
175
  this.message = 'for input ' + JSON.stringify(where)
175
176
  }
176
177
  }