@contember/engine-content-api 1.3.0-alpha.1 → 1.3.0-alpha.13

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (328) hide show
  1. package/dist/src/ExecutionContainer.d.ts +144 -0
  2. package/dist/src/ExecutionContainer.d.ts.map +1 -0
  3. package/dist/src/ExecutionContainer.js +85 -0
  4. package/dist/src/ExecutionContainer.js.map +1 -0
  5. package/dist/src/acl/PermissionFactory.d.ts +5 -4
  6. package/dist/src/acl/PermissionFactory.d.ts.map +1 -1
  7. package/dist/src/acl/PermissionFactory.js +10 -13
  8. package/dist/src/acl/PermissionFactory.js.map +1 -1
  9. package/dist/src/acl/index.d.ts +0 -1
  10. package/dist/src/acl/index.d.ts.map +1 -1
  11. package/dist/src/acl/index.js +0 -1
  12. package/dist/src/acl/index.js.map +1 -1
  13. package/dist/src/index.d.ts +2 -1
  14. package/dist/src/index.d.ts.map +1 -1
  15. package/dist/src/index.js +18 -2
  16. package/dist/src/index.js.map +1 -1
  17. package/dist/src/mapper/ColumnValue.d.ts +2 -2
  18. package/dist/src/mapper/ColumnValue.d.ts.map +1 -1
  19. package/dist/src/mapper/ErrorUtils.d.ts +3 -2
  20. package/dist/src/mapper/ErrorUtils.d.ts.map +1 -1
  21. package/dist/src/mapper/ErrorUtils.js +55 -35
  22. package/dist/src/mapper/ErrorUtils.js.map +1 -1
  23. package/dist/src/mapper/EventManager.d.ts +86 -0
  24. package/dist/src/mapper/EventManager.d.ts.map +1 -0
  25. package/dist/src/mapper/EventManager.js +118 -0
  26. package/dist/src/mapper/EventManager.js.map +1 -0
  27. package/dist/src/mapper/JunctionTableManager.d.ts +12 -11
  28. package/dist/src/mapper/JunctionTableManager.d.ts.map +1 -1
  29. package/dist/src/mapper/JunctionTableManager.js +20 -8
  30. package/dist/src/mapper/JunctionTableManager.js.map +1 -1
  31. package/dist/src/mapper/Mapper.d.ts +13 -6
  32. package/dist/src/mapper/Mapper.d.ts.map +1 -1
  33. package/dist/src/mapper/Mapper.js +41 -21
  34. package/dist/src/mapper/Mapper.js.map +1 -1
  35. package/dist/src/mapper/MapperFactory.d.ts +34 -0
  36. package/dist/src/mapper/MapperFactory.d.ts.map +1 -0
  37. package/dist/src/mapper/MapperFactory.js +41 -0
  38. package/dist/src/mapper/MapperFactory.js.map +1 -0
  39. package/dist/src/mapper/Result.d.ts +5 -3
  40. package/dist/src/mapper/Result.d.ts.map +1 -1
  41. package/dist/src/mapper/Result.js +4 -3
  42. package/dist/src/mapper/Result.js.map +1 -1
  43. package/dist/src/mapper/delete/DeleteExecutor.d.ts.map +1 -1
  44. package/dist/src/mapper/delete/DeleteExecutor.js +41 -1
  45. package/dist/src/mapper/delete/DeleteExecutor.js.map +1 -1
  46. package/dist/src/mapper/index.d.ts +3 -1
  47. package/dist/src/mapper/index.d.ts.map +1 -1
  48. package/dist/src/mapper/index.js +3 -1
  49. package/dist/src/mapper/index.js.map +1 -1
  50. package/dist/src/mapper/insert/InsertBuilder.d.ts +2 -2
  51. package/dist/src/mapper/insert/InsertBuilder.d.ts.map +1 -1
  52. package/dist/src/mapper/insert/InsertBuilder.js +8 -2
  53. package/dist/src/mapper/insert/InsertBuilder.js.map +1 -1
  54. package/dist/src/mapper/insert/Inserter.d.ts +3 -2
  55. package/dist/src/mapper/insert/Inserter.d.ts.map +1 -1
  56. package/dist/src/mapper/insert/Inserter.js +7 -6
  57. package/dist/src/mapper/insert/Inserter.js.map +1 -1
  58. package/dist/src/mapper/select/OrderByHelper.d.ts +1 -1
  59. package/dist/src/mapper/select/OrderByHelper.d.ts.map +1 -1
  60. package/dist/src/mapper/select/OrderByHelper.js +3 -1
  61. package/dist/src/mapper/select/OrderByHelper.js.map +1 -1
  62. package/dist/src/mapper/select/RelationFetcher.js +2 -2
  63. package/dist/src/mapper/select/RelationFetcher.js.map +1 -1
  64. package/dist/src/mapper/update/UpdateBuilder.d.ts +4 -4
  65. package/dist/src/mapper/update/UpdateBuilder.d.ts.map +1 -1
  66. package/dist/src/mapper/update/UpdateBuilder.js +26 -8
  67. package/dist/src/mapper/update/UpdateBuilder.js.map +1 -1
  68. package/dist/src/mapper/update/UpdateBuilderFactory.d.ts +1 -1
  69. package/dist/src/mapper/update/UpdateBuilderFactory.d.ts.map +1 -1
  70. package/dist/src/mapper/update/UpdateBuilderFactory.js +2 -2
  71. package/dist/src/mapper/update/UpdateBuilderFactory.js.map +1 -1
  72. package/dist/src/mapper/update/Updater.d.ts +3 -1
  73. package/dist/src/mapper/update/Updater.d.ts.map +1 -1
  74. package/dist/src/mapper/update/Updater.js +9 -12
  75. package/dist/src/mapper/update/Updater.js.map +1 -1
  76. package/dist/src/resolvers/GraphQlQueryAstFactory.d.ts +1 -3
  77. package/dist/src/resolvers/GraphQlQueryAstFactory.d.ts.map +1 -1
  78. package/dist/src/resolvers/GraphQlQueryAstFactory.js +1 -4
  79. package/dist/src/resolvers/GraphQlQueryAstFactory.js.map +1 -1
  80. package/dist/src/resolvers/MutationResolver.d.ts +3 -4
  81. package/dist/src/resolvers/MutationResolver.d.ts.map +1 -1
  82. package/dist/src/resolvers/MutationResolver.js +11 -12
  83. package/dist/src/resolvers/MutationResolver.js.map +1 -1
  84. package/dist/src/resolvers/ReadResolver.d.ts +1 -3
  85. package/dist/src/resolvers/ReadResolver.d.ts.map +1 -1
  86. package/dist/src/resolvers/ReadResolver.js +6 -10
  87. package/dist/src/resolvers/ReadResolver.js.map +1 -1
  88. package/dist/src/resolvers/ValidationResolver.d.ts +1 -3
  89. package/dist/src/resolvers/ValidationResolver.d.ts.map +1 -1
  90. package/dist/src/resolvers/ValidationResolver.js +3 -4
  91. package/dist/src/resolvers/ValidationResolver.js.map +1 -1
  92. package/dist/src/resolvers/index.d.ts +0 -1
  93. package/dist/src/resolvers/index.d.ts.map +1 -1
  94. package/dist/src/resolvers/index.js +0 -1
  95. package/dist/src/resolvers/index.js.map +1 -1
  96. package/dist/src/schema/CustomTypesProvider.d.ts.map +1 -1
  97. package/dist/src/schema/CustomTypesProvider.js +1 -23
  98. package/dist/src/schema/CustomTypesProvider.js.map +1 -1
  99. package/dist/src/schema/MutationProvider.js +4 -4
  100. package/dist/src/schema/MutationProvider.js.map +1 -1
  101. package/dist/src/schema/QueryProvider.js +3 -3
  102. package/dist/src/schema/QueryProvider.js.map +1 -1
  103. package/dist/src/tsconfig.tsbuildinfo +1 -1
  104. package/dist/src/types.d.ts +3 -4
  105. package/dist/src/types.d.ts.map +1 -1
  106. package/dist/src/utils/index.d.ts +0 -1
  107. package/dist/src/utils/index.d.ts.map +1 -1
  108. package/dist/src/utils/index.js +0 -1
  109. package/dist/src/utils/index.js.map +1 -1
  110. package/dist/src/utils/uniqueWhereFields.js +1 -1
  111. package/dist/src/utils/uniqueWhereFields.js.map +1 -1
  112. package/dist/tests/cases/bugs/bug-update-by-nested-unique.test.js +3 -5
  113. package/dist/tests/cases/bugs/bug-update-by-nested-unique.test.js.map +1 -1
  114. package/dist/tests/cases/integration/graphQlDb/insert/insertSequence.test.js +2 -2
  115. package/dist/tests/cases/integration/graphQlDb/insert/insertSequence.test.js.map +1 -1
  116. package/dist/tests/cases/integration/graphQlDb/update/bug-freeze-connect-missing-one.test.js +1 -1
  117. package/dist/tests/cases/integration/graphQlDb/update/bug-freeze-connect-missing-one.test.js.map +1 -1
  118. package/dist/tests/cases/integration/graphQlDb/update/deferedConstraints.test.js +45 -45
  119. package/dist/tests/cases/integration/graphQlDb/update/deferedConstraints.test.js.map +1 -1
  120. package/dist/tests/cases/integration/graphQlDb/update/failedDelete.test.js +5 -5
  121. package/dist/tests/cases/integration/graphQlDb/update/failedDelete.test.js.map +1 -1
  122. package/dist/tests/cases/integration/graphQlDb/update/invalidInput.test.js +2 -2
  123. package/dist/tests/cases/integration/graphQlDb/update/invalidInput.test.js.map +1 -1
  124. package/dist/tests/cases/integration/graphQlDb/update/nullChecksNotNull.test.js +7 -7
  125. package/dist/tests/cases/integration/graphQlDb/update/nullChecksNotNull.test.js.map +1 -1
  126. package/dist/tests/cases/integration/graphQlDb/update/nullChecksNullable.test.js +7 -7
  127. package/dist/tests/cases/integration/graphQlDb/update/nullChecksNullable.test.js.map +1 -1
  128. package/dist/tests/cases/integration/graphQlDb/update/uniqueConstraint.test.js +2 -2
  129. package/dist/tests/cases/integration/graphQlDb/update/uniqueConstraint.test.js.map +1 -1
  130. package/dist/tests/cases/integration/graphQlRequests/insert/oneHasMany/connect.test.js +3 -3
  131. package/dist/tests/cases/integration/graphQlRequests/insert/oneHasMany/connect.test.js.map +1 -1
  132. package/dist/tests/cases/integration/graphQlRequests/query/acl/isNullAcl.test.d.ts +2 -0
  133. package/dist/tests/cases/integration/graphQlRequests/query/acl/isNullAcl.test.d.ts.map +1 -0
  134. package/dist/tests/cases/integration/graphQlRequests/query/acl/isNullAcl.test.js +91 -0
  135. package/dist/tests/cases/integration/graphQlRequests/query/acl/isNullAcl.test.js.map +1 -0
  136. package/dist/tests/cases/integration/graphQlRequests/query/acl/rowPredicateSubset.test.js +1 -1
  137. package/dist/tests/cases/integration/graphQlRequests/query/acl/rowPredicateSubset.test.js.map +1 -1
  138. package/dist/tests/cases/integration/graphQlRequests/query/sorting/orderBy.test.d.ts +2 -0
  139. package/dist/tests/cases/integration/graphQlRequests/query/sorting/orderBy.test.d.ts.map +1 -0
  140. package/dist/tests/cases/integration/graphQlRequests/query/sorting/orderBy.test.js +67 -0
  141. package/dist/tests/cases/integration/graphQlRequests/query/sorting/orderBy.test.js.map +1 -0
  142. package/dist/tests/cases/integration/graphQlRequests/update/acl/aclUpdate.test.js +6 -18
  143. package/dist/tests/cases/integration/graphQlRequests/update/acl/aclUpdate.test.js.map +1 -1
  144. package/dist/tests/cases/integration/graphQlRequests/update/additionalFilter.test.js +3 -4
  145. package/dist/tests/cases/integration/graphQlRequests/update/additionalFilter.test.js.map +1 -1
  146. package/dist/tests/cases/integration/graphQlRequests/update/basic/columnUpdate.test.js +3 -8
  147. package/dist/tests/cases/integration/graphQlRequests/update/basic/columnUpdate.test.js.map +1 -1
  148. package/dist/tests/cases/integration/graphQlRequests/update/manyHasManyInverse/update.test.js +3 -9
  149. package/dist/tests/cases/integration/graphQlRequests/update/manyHasManyInverse/update.test.js.map +1 -1
  150. package/dist/tests/cases/integration/graphQlRequests/update/manyHasManyInverse/upsert.test.js +3 -9
  151. package/dist/tests/cases/integration/graphQlRequests/update/manyHasManyInverse/upsert.test.js.map +1 -1
  152. package/dist/tests/cases/integration/graphQlRequests/update/manyHasManyOwning/update.test.js +3 -9
  153. package/dist/tests/cases/integration/graphQlRequests/update/manyHasManyOwning/update.test.js.map +1 -1
  154. package/dist/tests/cases/integration/graphQlRequests/update/manyHasManyOwning/upsert.test.js +3 -9
  155. package/dist/tests/cases/integration/graphQlRequests/update/manyHasManyOwning/upsert.test.js.map +1 -1
  156. package/dist/tests/cases/integration/graphQlRequests/update/manyHasOne/connect.test.js +3 -10
  157. package/dist/tests/cases/integration/graphQlRequests/update/manyHasOne/connect.test.js.map +1 -1
  158. package/dist/tests/cases/integration/graphQlRequests/update/manyHasOne/create.test.js +3 -10
  159. package/dist/tests/cases/integration/graphQlRequests/update/manyHasOne/create.test.js.map +1 -1
  160. package/dist/tests/cases/integration/graphQlRequests/update/manyHasOne/disconnect.test.js +3 -9
  161. package/dist/tests/cases/integration/graphQlRequests/update/manyHasOne/disconnect.test.js.map +1 -1
  162. package/dist/tests/cases/integration/graphQlRequests/update/manyHasOne/update.test.js +3 -9
  163. package/dist/tests/cases/integration/graphQlRequests/update/manyHasOne/update.test.js.map +1 -1
  164. package/dist/tests/cases/integration/graphQlRequests/update/manyHasOne/upsert.test.js +6 -18
  165. package/dist/tests/cases/integration/graphQlRequests/update/manyHasOne/upsert.test.js.map +1 -1
  166. package/dist/tests/cases/integration/graphQlRequests/update/oneHasMany/connect.test.js +3 -11
  167. package/dist/tests/cases/integration/graphQlRequests/update/oneHasMany/connect.test.js.map +1 -1
  168. package/dist/tests/cases/integration/graphQlRequests/update/oneHasMany/disconnect.test.js +3 -8
  169. package/dist/tests/cases/integration/graphQlRequests/update/oneHasMany/disconnect.test.js.map +1 -1
  170. package/dist/tests/cases/integration/graphQlRequests/update/oneHasMany/update.test.js +3 -6
  171. package/dist/tests/cases/integration/graphQlRequests/update/oneHasMany/update.test.js.map +1 -1
  172. package/dist/tests/cases/integration/graphQlRequests/update/oneHasMany/upsert.test.js +3 -6
  173. package/dist/tests/cases/integration/graphQlRequests/update/oneHasMany/upsert.test.js.map +1 -1
  174. package/dist/tests/cases/integration/graphQlRequests/update/oneHasOneInverse/connect.test.js +15 -50
  175. package/dist/tests/cases/integration/graphQlRequests/update/oneHasOneInverse/connect.test.js.map +1 -1
  176. package/dist/tests/cases/integration/graphQlRequests/update/oneHasOneInverse/create.test.js +3 -10
  177. package/dist/tests/cases/integration/graphQlRequests/update/oneHasOneInverse/create.test.js.map +1 -1
  178. package/dist/tests/cases/integration/graphQlRequests/update/oneHasOneInverse/disconnect.test.js +3 -10
  179. package/dist/tests/cases/integration/graphQlRequests/update/oneHasOneInverse/disconnect.test.js.map +1 -1
  180. package/dist/tests/cases/integration/graphQlRequests/update/oneHasOneInverse/update.test.js +3 -6
  181. package/dist/tests/cases/integration/graphQlRequests/update/oneHasOneInverse/update.test.js.map +1 -1
  182. package/dist/tests/cases/integration/graphQlRequests/update/oneHasOneInverse/upsert.test.js +3 -7
  183. package/dist/tests/cases/integration/graphQlRequests/update/oneHasOneInverse/upsert.test.js.map +1 -1
  184. package/dist/tests/cases/integration/graphQlRequests/update/oneHasOneOwning/connect.test.js +12 -32
  185. package/dist/tests/cases/integration/graphQlRequests/update/oneHasOneOwning/connect.test.js.map +1 -1
  186. package/dist/tests/cases/integration/graphQlRequests/update/oneHasOneOwning/connectOrCreate.test.js +3 -3
  187. package/dist/tests/cases/integration/graphQlRequests/update/oneHasOneOwning/connectOrCreate.test.js.map +1 -1
  188. package/dist/tests/cases/integration/graphQlRequests/update/oneHasOneOwning/create.test.js +6 -20
  189. package/dist/tests/cases/integration/graphQlRequests/update/oneHasOneOwning/create.test.js.map +1 -1
  190. package/dist/tests/cases/integration/graphQlRequests/update/oneHasOneOwning/disconnect.test.js +3 -10
  191. package/dist/tests/cases/integration/graphQlRequests/update/oneHasOneOwning/disconnect.test.js.map +1 -1
  192. package/dist/tests/cases/integration/graphQlRequests/update/oneHasOneOwning/update.test.js +3 -9
  193. package/dist/tests/cases/integration/graphQlRequests/update/oneHasOneOwning/update.test.js.map +1 -1
  194. package/dist/tests/cases/integration/graphQlRequests/update/oneHasOneOwning/upsert.test.js +6 -19
  195. package/dist/tests/cases/integration/graphQlRequests/update/oneHasOneOwning/upsert.test.js.map +1 -1
  196. package/dist/tests/cases/integration/graphQlRequests/update/queryPortal.test.js +6 -8
  197. package/dist/tests/cases/integration/graphQlRequests/update/queryPortal.test.js.map +1 -1
  198. package/dist/tests/cases/integration/graphQlRequests/update/transaction.test.js +9 -24
  199. package/dist/tests/cases/integration/graphQlRequests/update/transaction.test.js.map +1 -1
  200. package/dist/tests/cases/integration/graphQlRequests/upsert/basicUpsert.test.js +3 -7
  201. package/dist/tests/cases/integration/graphQlRequests/upsert/basicUpsert.test.js.map +1 -1
  202. package/dist/tests/cases/unit/orderbyHelper.test.js +13 -2
  203. package/dist/tests/cases/unit/orderbyHelper.test.js.map +1 -1
  204. package/dist/tests/cases/unit/permissionMerger.test.js +8 -3
  205. package/dist/tests/cases/unit/permissionMerger.test.js.map +1 -1
  206. package/dist/tests/cases/unit/predicatesInjector.test.js +1 -1
  207. package/dist/tests/cases/unit/predicatesInjector.test.js.map +1 -1
  208. package/dist/tests/src/test.d.ts +1 -0
  209. package/dist/tests/src/test.d.ts.map +1 -1
  210. package/dist/tests/src/test.js +35 -6
  211. package/dist/tests/src/test.js.map +1 -1
  212. package/dist/tests/tsconfig.tsbuildinfo +1 -1
  213. package/package.json +16 -13
  214. package/src/ExecutionContainer.ts +208 -0
  215. package/src/acl/PermissionFactory.ts +15 -13
  216. package/src/acl/index.ts +0 -1
  217. package/src/index.ts +24 -1
  218. package/src/mapper/ColumnValue.ts +2 -2
  219. package/src/mapper/ErrorUtils.ts +66 -41
  220. package/src/mapper/EventManager.ts +158 -0
  221. package/src/mapper/JunctionTableManager.ts +50 -32
  222. package/src/mapper/Mapper.ts +48 -27
  223. package/src/mapper/MapperFactory.ts +69 -0
  224. package/src/mapper/Result.ts +5 -2
  225. package/src/mapper/delete/DeleteExecutor.ts +42 -1
  226. package/src/mapper/index.ts +3 -1
  227. package/src/mapper/insert/InsertBuilder.ts +12 -2
  228. package/src/mapper/insert/Inserter.ts +7 -7
  229. package/src/mapper/select/OrderByHelper.ts +2 -1
  230. package/src/mapper/select/RelationFetcher.ts +2 -2
  231. package/src/mapper/update/UpdateBuilder.ts +30 -7
  232. package/src/mapper/update/UpdateBuilderFactory.ts +2 -2
  233. package/src/mapper/update/Updater.ts +9 -13
  234. package/src/resolvers/GraphQlQueryAstFactory.ts +1 -2
  235. package/src/resolvers/MutationResolver.ts +15 -14
  236. package/src/resolvers/ReadResolver.ts +5 -9
  237. package/src/resolvers/ValidationResolver.ts +2 -4
  238. package/src/resolvers/index.ts +0 -1
  239. package/src/schema/CustomTypesProvider.ts +2 -27
  240. package/src/schema/MutationProvider.ts +4 -4
  241. package/src/schema/QueryProvider.ts +3 -3
  242. package/src/tsconfig.json +7 -21
  243. package/src/types.ts +3 -4
  244. package/src/utils/index.ts +0 -1
  245. package/src/utils/uniqueWhereFields.ts +1 -1
  246. package/tests/cases/bugs/bug-update-by-nested-unique.test.ts +3 -5
  247. package/tests/cases/integration/graphQlDb/insert/insertSequence.test.ts +2 -2
  248. package/tests/cases/integration/graphQlDb/update/bug-freeze-connect-missing-one.test.ts +1 -1
  249. package/tests/cases/integration/graphQlDb/update/deferedConstraints.test.ts +9 -9
  250. package/tests/cases/integration/graphQlDb/update/failedDelete.test.ts +3 -3
  251. package/tests/cases/integration/graphQlDb/update/invalidInput.test.ts +2 -2
  252. package/tests/cases/integration/graphQlDb/update/nullChecksNotNull.test.ts +7 -7
  253. package/tests/cases/integration/graphQlDb/update/nullChecksNullable.test.ts +7 -7
  254. package/tests/cases/integration/graphQlDb/update/uniqueConstraint.test.ts +2 -2
  255. package/tests/cases/integration/graphQlRequests/insert/oneHasMany/connect.test.ts +3 -3
  256. package/tests/cases/integration/graphQlRequests/query/acl/isNullAcl.test.ts +77 -0
  257. package/tests/cases/integration/graphQlRequests/query/acl/rowPredicateSubset.test.ts +1 -1
  258. package/tests/cases/integration/graphQlRequests/query/sorting/orderBy.test.ts +67 -0
  259. package/tests/cases/integration/graphQlRequests/update/acl/aclUpdate.test.ts +6 -18
  260. package/tests/cases/integration/graphQlRequests/update/additionalFilter.test.ts +3 -4
  261. package/tests/cases/integration/graphQlRequests/update/basic/columnUpdate.test.ts +3 -8
  262. package/tests/cases/integration/graphQlRequests/update/manyHasManyInverse/update.test.ts +3 -9
  263. package/tests/cases/integration/graphQlRequests/update/manyHasManyInverse/upsert.test.ts +3 -9
  264. package/tests/cases/integration/graphQlRequests/update/manyHasManyOwning/update.test.ts +3 -9
  265. package/tests/cases/integration/graphQlRequests/update/manyHasManyOwning/upsert.test.ts +3 -9
  266. package/tests/cases/integration/graphQlRequests/update/manyHasOne/connect.test.ts +3 -10
  267. package/tests/cases/integration/graphQlRequests/update/manyHasOne/create.test.ts +3 -10
  268. package/tests/cases/integration/graphQlRequests/update/manyHasOne/disconnect.test.ts +3 -9
  269. package/tests/cases/integration/graphQlRequests/update/manyHasOne/update.test.ts +3 -9
  270. package/tests/cases/integration/graphQlRequests/update/manyHasOne/upsert.test.ts +6 -18
  271. package/tests/cases/integration/graphQlRequests/update/oneHasMany/connect.test.ts +3 -11
  272. package/tests/cases/integration/graphQlRequests/update/oneHasMany/disconnect.test.ts +3 -8
  273. package/tests/cases/integration/graphQlRequests/update/oneHasMany/update.test.ts +3 -6
  274. package/tests/cases/integration/graphQlRequests/update/oneHasMany/upsert.test.ts +3 -6
  275. package/tests/cases/integration/graphQlRequests/update/oneHasOneInverse/connect.test.ts +15 -50
  276. package/tests/cases/integration/graphQlRequests/update/oneHasOneInverse/create.test.ts +3 -10
  277. package/tests/cases/integration/graphQlRequests/update/oneHasOneInverse/disconnect.test.ts +3 -10
  278. package/tests/cases/integration/graphQlRequests/update/oneHasOneInverse/update.test.ts +3 -6
  279. package/tests/cases/integration/graphQlRequests/update/oneHasOneInverse/upsert.test.ts +3 -7
  280. package/tests/cases/integration/graphQlRequests/update/oneHasOneOwning/connect.test.ts +12 -32
  281. package/tests/cases/integration/graphQlRequests/update/oneHasOneOwning/connectOrCreate.test.ts +3 -3
  282. package/tests/cases/integration/graphQlRequests/update/oneHasOneOwning/create.test.ts +6 -20
  283. package/tests/cases/integration/graphQlRequests/update/oneHasOneOwning/disconnect.test.ts +3 -10
  284. package/tests/cases/integration/graphQlRequests/update/oneHasOneOwning/update.test.ts +3 -9
  285. package/tests/cases/integration/graphQlRequests/update/oneHasOneOwning/upsert.test.ts +6 -19
  286. package/tests/cases/integration/graphQlRequests/update/queryPortal.test.ts +6 -8
  287. package/tests/cases/integration/graphQlRequests/update/transaction.test.ts +9 -24
  288. package/tests/cases/integration/graphQlRequests/upsert/basicUpsert.test.ts +3 -7
  289. package/tests/cases/unit/orderbyHelper.test.ts +15 -2
  290. package/tests/cases/unit/permissionMerger.test.ts +9 -4
  291. package/tests/cases/unit/predicatesInjector.test.ts +1 -1
  292. package/tests/src/test.ts +40 -16
  293. package/tests/tsconfig.json +3 -9
  294. package/dist/src/acl/PermissionsByIdentityFactory.d.ts +0 -12
  295. package/dist/src/acl/PermissionsByIdentityFactory.d.ts.map +0 -1
  296. package/dist/src/acl/PermissionsByIdentityFactory.js +0 -15
  297. package/dist/src/acl/PermissionsByIdentityFactory.js.map +0 -1
  298. package/dist/src/mapper/MapperContainer.d.ts +0 -18
  299. package/dist/src/mapper/MapperContainer.d.ts.map +0 -1
  300. package/dist/src/mapper/MapperContainer.js +0 -55
  301. package/dist/src/mapper/MapperContainer.js.map +0 -1
  302. package/dist/src/resolvers/ExecutionContainerFactory.d.ts +0 -24
  303. package/dist/src/resolvers/ExecutionContainerFactory.d.ts.map +0 -1
  304. package/dist/src/resolvers/ExecutionContainerFactory.js +0 -45
  305. package/dist/src/resolvers/ExecutionContainerFactory.js.map +0 -1
  306. package/dist/src/utils/arrays.d.ts +0 -3
  307. package/dist/src/utils/arrays.d.ts.map +0 -1
  308. package/dist/src/utils/arrays.js +0 -22
  309. package/dist/src/utils/arrays.js.map +0 -1
  310. package/dist/tests/cases/integration/graphQlSchema/schema-acl-allowed.gql +0 -420
  311. package/dist/tests/cases/integration/graphQlSchema/schema-acl-create-only.gql +0 -229
  312. package/dist/tests/cases/integration/graphQlSchema/schema-acl-predicate.gql +0 -112
  313. package/dist/tests/cases/integration/graphQlSchema/schema-acl-predicate2.gql +0 -112
  314. package/dist/tests/cases/integration/graphQlSchema/schema-acl-restricted-create.gql +0 -309
  315. package/dist/tests/cases/integration/graphQlSchema/schema-acl-restricted-delete.gql +0 -402
  316. package/dist/tests/cases/integration/graphQlSchema/schema-acl-restricted-update.gql +0 -338
  317. package/dist/tests/cases/integration/graphQlSchema/schema-acl.gql +0 -221
  318. package/dist/tests/cases/integration/graphQlSchema/schema-aliased-type.gql +0 -226
  319. package/dist/tests/cases/integration/graphQlSchema/schema-basic.gql +0 -841
  320. package/dist/tests/cases/integration/graphQlSchema/schema-bug-66.gql +0 -540
  321. package/dist/tests/cases/integration/graphQlSchema/schema-custom-primary.gql +0 -851
  322. package/dist/tests/cases/integration/graphQlSchema/schema-has-many-reduction.gql +0 -453
  323. package/dist/tests/cases/integration/graphQlSchema/schema-new-builder.gql +0 -912
  324. package/dist/tests/cases/integration/graphQlSchema/schema-view-entity.gql +0 -112
  325. package/src/acl/PermissionsByIdentityFactory.ts +0 -21
  326. package/src/mapper/MapperContainer.ts +0 -142
  327. package/src/resolvers/ExecutionContainerFactory.ts +0 -74
  328. package/src/utils/arrays.ts +0 -19
package/package.json CHANGED
@@ -1,30 +1,33 @@
1
1
  {
2
2
  "name": "@contember/engine-content-api",
3
- "version": "1.3.0-alpha.1",
3
+ "version": "1.3.0-alpha.13",
4
4
  "license": "Apache-2.0",
5
5
  "main": "dist/src/index.js",
6
6
  "typings": "dist/src/index.d.ts",
7
+ "exports": {
8
+ "typescript": "./src/index.ts",
9
+ "default": "./dist/src/index.js"
10
+ },
7
11
  "scripts": {
8
- "build-copy": "mkdir -p dist && find ./tests/ -name '*.gql' -type f -exec cp --parents {} ./dist \\;",
9
12
  "generate": "gql-gen --config graphql.codegen.yml",
10
13
  "test": "vitest --no-threads"
11
14
  },
12
15
  "dependencies": {
13
- "@contember/database": "^1.3.0-alpha.1",
14
- "@contember/dic": "^1.3.0-alpha.1",
15
- "@contember/logger": "^1.3.0-alpha.1",
16
- "@contember/graphql-utils": "^1.3.0-alpha.1",
17
- "@contember/schema": "^1.3.0-alpha.1",
18
- "@contember/schema-definition": "^1.3.0-alpha.1",
19
- "@contember/schema-utils": "^1.3.0-alpha.1",
16
+ "@contember/database": "1.3.0-alpha.13",
17
+ "@contember/dic": "1.3.0-alpha.13",
18
+ "@contember/graphql-utils": "1.3.0-alpha.13",
19
+ "@contember/logger": "1.3.0-alpha.13",
20
+ "@contember/schema": "1.3.0-alpha.13",
21
+ "@contember/schema-definition": "1.3.0-alpha.13",
22
+ "@contember/schema-utils": "1.3.0-alpha.13",
20
23
  "@graphql-tools/schema": "^8.3.5",
21
24
  "fast-deep-equal": "^3.1.3",
22
25
  "graphql-tag": "^2.12.5"
23
26
  },
24
27
  "devDependencies": {
25
- "@contember/database-tester": "^1.3.0-alpha.1",
26
- "@contember/engine-api-tester": "^1.3.0-alpha.1",
27
- "@contember/schema-definition": "^1.3.0-alpha.1",
28
+ "@contember/database-tester": "1.3.0-alpha.13",
29
+ "@contember/engine-api-tester": "1.3.0-alpha.13",
30
+ "@contember/schema-definition": "1.3.0-alpha.13",
28
31
  "@graphql-codegen/cli": "^2.6.2",
29
32
  "@graphql-codegen/typescript": "^2.5.1",
30
33
  "@graphql-codegen/typescript-operations": "^2.4.2",
@@ -37,4 +40,4 @@
37
40
  "graphql": ">= 14.6.0",
38
41
  "pg": "^8.9.0"
39
42
  }
40
- }
43
+ }
@@ -0,0 +1,208 @@
1
+ import { PredicateFactory, PredicatesInjector, VariableInjector } from './acl'
2
+ import {
3
+ ConditionBuilder,
4
+ FieldsVisitorFactory,
5
+ JoinBuilder,
6
+ MetaHandler,
7
+ OrderByBuilder,
8
+ RelationFetcher,
9
+ WhereBuilder,
10
+ } from './mapper/select'
11
+ import { UniqueWhereExpander } from './inputProcessing'
12
+ import { HasManyToHasOneReducer, HasManyToHasOneReducerExecutionHandler } from './extensions'
13
+ import {
14
+ DeleteExecutor,
15
+ InsertBuilderFactory,
16
+ Inserter,
17
+ JunctionConnectHandler,
18
+ JunctionDisconnectHandler,
19
+ JunctionTableManager,
20
+ MapperFactory,
21
+ PathFactory,
22
+ SelectBuilder,
23
+ SelectBuilderFactory,
24
+ SelectHydrator,
25
+ UpdateBuilderFactory,
26
+ Updater,
27
+ } from './mapper'
28
+ import { Builder } from '@contember/dic'
29
+ import { Acl, Model, Schema } from '@contember/schema'
30
+ import { Client, SelectBuilder as DbSelectBuilder } from '@contember/database'
31
+ import { Providers, SchemaDatabaseMetadata } from '@contember/schema-utils'
32
+ import { PaginatedHasManyExecutionHandler } from './extensions/paginatedHasMany/PaginatedHasManyExecutionHandler'
33
+ import { PaginatedHasManyFieldProvider } from './extensions/paginatedHasMany/PaginatedHasManyFieldProvider'
34
+ import { WhereOptimizer } from './mapper/select/optimizer/WhereOptimizer'
35
+ import { ConditionOptimizer } from './mapper/select/optimizer/ConditionOptimizer'
36
+ import { GraphQlQueryAstFactory, MutationResolver, ReadResolver, ValidationResolver } from './resolvers'
37
+ import {
38
+ ColumnValueResolver,
39
+ DependencyCollector,
40
+ EntityRulesResolver, InputPreValidator,
41
+ QueryAstFactory,
42
+ ValidationDataSelector,
43
+ } from './input-validation'
44
+
45
+ export type ExecutionContainerArgs = {
46
+ schema: Schema & { id: number }
47
+ schemaDatabaseMetadata: SchemaDatabaseMetadata
48
+ db: Client
49
+ identityId: string
50
+ identityVariables: Acl.VariablesMap
51
+ permissions: Acl.Permissions
52
+ systemSchema: string
53
+ project: { slug: string }
54
+ stage: { id: string; slug: string }
55
+ }
56
+
57
+ export interface ExecutionContainer {
58
+ readResolver: ReadResolver
59
+ mutationResolver: MutationResolver
60
+ validationResolver: ValidationResolver
61
+ }
62
+
63
+ export type ExecutionContainerBuilder = ReturnType<ExecutionContainerFactory['createBuilderInternal']>
64
+ export type ExecutionContainerHook = (builder: ExecutionContainerBuilder) => ExecutionContainerBuilder
65
+
66
+ export class ExecutionContainerFactory {
67
+ public readonly hooks: ExecutionContainerHook[] = []
68
+
69
+ constructor(
70
+ private readonly providers: Providers,
71
+ ) {
72
+ }
73
+
74
+ createBuilder(args: ExecutionContainerArgs): ExecutionContainerBuilder {
75
+ const builder = this.createBuilderInternal(args)
76
+ return this.hooks.reduce((acc, cb) => cb(acc), builder)
77
+ }
78
+
79
+ createBuilderInternal({ permissions, identityVariables, identityId, db, schema, systemSchema, stage, project, schemaDatabaseMetadata }: ExecutionContainerArgs) {
80
+ return new Builder({})
81
+ .addService('systemSchema', () =>
82
+ systemSchema)
83
+ .addService('db', () =>
84
+ db)
85
+ .addService('project', () =>
86
+ project)
87
+ .addService('stage', () =>
88
+ stage)
89
+ .addService('schema', () =>
90
+ schema)
91
+ .addService('schemaDatabaseMetadata', () =>
92
+ schemaDatabaseMetadata)
93
+ .addService('providers', () =>
94
+ this.providers)
95
+ .addService('variableInjector', ({ schema }) =>
96
+ new VariableInjector(schema.model, identityVariables))
97
+ .addService('predicateFactory', ({ variableInjector, schema }) =>
98
+ new PredicateFactory(permissions, schema.model, variableInjector))
99
+ .addService('predicatesInjector', ({ predicateFactory, schema }) =>
100
+ new PredicatesInjector(schema.model, predicateFactory))
101
+ .addService('joinBuilder', ({ schema }) =>
102
+ new JoinBuilder(schema.model))
103
+ .addService('conditionBuilder', () =>
104
+ new ConditionBuilder())
105
+ .addService('pathFactory', () =>
106
+ new PathFactory())
107
+ .addService('whereOptimized', ({ schema }) =>
108
+ new WhereOptimizer(schema.model, new ConditionOptimizer()))
109
+ .addService('whereBuilder', ({ joinBuilder, conditionBuilder, pathFactory, whereOptimized, schema }) =>
110
+ new WhereBuilder(schema.model, joinBuilder, conditionBuilder, pathFactory, whereOptimized, schema.settings.useExistsInHasManyFilter === true))
111
+ .addService('orderByBuilder', ({ joinBuilder, schema }) =>
112
+ new OrderByBuilder(schema.model, joinBuilder))
113
+ .addService('relationFetcher', ({ whereBuilder, orderByBuilder, predicatesInjector, pathFactory }) =>
114
+ new RelationFetcher(whereBuilder, orderByBuilder, predicatesInjector, pathFactory))
115
+ .addService('fieldsVisitorFactory', ({ relationFetcher, predicateFactory, whereBuilder, schema }) =>
116
+ new FieldsVisitorFactory(schema.model, relationFetcher, predicateFactory, whereBuilder))
117
+ .addService('metaHandler', ({ whereBuilder, predicateFactory }) =>
118
+ new MetaHandler(whereBuilder, predicateFactory))
119
+ .addService('uniqueWhereExpander', ({ schema }) =>
120
+ new UniqueWhereExpander(schema.model))
121
+ .addService('hasManyToHasOneReducer', ({ uniqueWhereExpander, schema }) =>
122
+ new HasManyToHasOneReducerExecutionHandler(schema.model, uniqueWhereExpander))
123
+ .addService('paginatedHasManyExecutionHandler', ({ relationFetcher, schema }) =>
124
+ new PaginatedHasManyExecutionHandler(schema.model, relationFetcher))
125
+ .addService('selectHandlers', ({ hasManyToHasOneReducer, paginatedHasManyExecutionHandler }) => ({
126
+ [HasManyToHasOneReducer.extensionName]: hasManyToHasOneReducer,
127
+ [PaginatedHasManyFieldProvider.extensionName]: paginatedHasManyExecutionHandler,
128
+ }))
129
+ .addService('selectBuilderFactory', ({ whereBuilder, orderByBuilder, fieldsVisitorFactory, metaHandler, selectHandlers, pathFactory, predicateFactory, schema }) =>
130
+ new (class implements SelectBuilderFactory {
131
+ create(qb: DbSelectBuilder, hydrator: SelectHydrator, relationPath: Model.AnyRelationContext[]): SelectBuilder {
132
+ return new SelectBuilder(
133
+ schema.model,
134
+ whereBuilder,
135
+ orderByBuilder,
136
+ metaHandler,
137
+ qb,
138
+ hydrator,
139
+ fieldsVisitorFactory,
140
+ selectHandlers,
141
+ pathFactory,
142
+ relationPath,
143
+ predicateFactory,
144
+ )
145
+ }
146
+ })())
147
+ .addService('insertBuilderFactory', ({ whereBuilder, pathFactory, schema, predicateFactory }) =>
148
+ new InsertBuilderFactory(schema.model, whereBuilder, pathFactory, predicateFactory))
149
+ .addService('updateBuilderFactory', ({ whereBuilder, pathFactory, schema, predicateFactory }) =>
150
+ new UpdateBuilderFactory(schema.model, whereBuilder, pathFactory, predicateFactory))
151
+ .addService('connectJunctionHandler', () =>
152
+ new JunctionConnectHandler())
153
+ .addService('disconnectJunctionHandler', ({}) =>
154
+ new JunctionDisconnectHandler())
155
+ .addService('junctionTableManager', ({ predicateFactory, whereBuilder, connectJunctionHandler, disconnectJunctionHandler, pathFactory, schema }) =>
156
+ new JunctionTableManager(schema.model, predicateFactory, whereBuilder, connectJunctionHandler, disconnectJunctionHandler, pathFactory))
157
+ .addService('deleteExecutor', ({ predicateFactory, updateBuilderFactory, whereBuilder, pathFactory, schema }) =>
158
+ new DeleteExecutor(schema.model, predicateFactory, whereBuilder, updateBuilderFactory, pathFactory))
159
+ .addService('updater', ({ predicateFactory, updateBuilderFactory, schema, schemaDatabaseMetadata }) =>
160
+ new Updater(schema.model, schemaDatabaseMetadata, predicateFactory, updateBuilderFactory))
161
+ .addService('inserter', ({ insertBuilderFactory, providers, schema, schemaDatabaseMetadata }) =>
162
+ new Inserter(schema.model, schemaDatabaseMetadata, insertBuilderFactory, providers))
163
+ .addService('mapperFactory', ({ predicatesInjector, selectBuilderFactory, uniqueWhereExpander, whereBuilder, junctionTableManager, deleteExecutor, updater, inserter, pathFactory, providers, schema, schemaDatabaseMetadata }) => {
164
+ return new MapperFactory(
165
+ db,
166
+ identityId,
167
+ schema.model,
168
+ schemaDatabaseMetadata,
169
+ predicatesInjector,
170
+ selectBuilderFactory,
171
+ uniqueWhereExpander,
172
+ whereBuilder,
173
+ junctionTableManager,
174
+ deleteExecutor,
175
+ updater,
176
+ inserter,
177
+ pathFactory,
178
+ providers,
179
+ )
180
+ })
181
+
182
+ .addService('queryAstFactory', () =>
183
+ new GraphQlQueryAstFactory())
184
+ .addService('readResolver', ({ mapperFactory, queryAstFactory }) =>
185
+ new ReadResolver(mapperFactory, queryAstFactory))
186
+ .addService('validationDependencyCollector', () =>
187
+ new DependencyCollector())
188
+ .addService('validationQueryAstFactory', ({ schema }) =>
189
+ new QueryAstFactory(schema.model))
190
+ .addService('dataSelector', ({ validationQueryAstFactory, schema }) =>
191
+ new ValidationDataSelector(schema.model, validationQueryAstFactory))
192
+ .addService('columnValueResolver', ({ providers }) =>
193
+ new ColumnValueResolver(providers))
194
+ .addService('entityRulesResolver', ({ schema }) =>
195
+ new EntityRulesResolver(schema.validation, schema.model))
196
+ .addService('inputPreValidator', ({ entityRulesResolver, columnValueResolver, dataSelector, schema }) =>
197
+ new InputPreValidator(schema.model, entityRulesResolver, columnValueResolver, dataSelector))
198
+ .addService('mutationResolver', ({ mapperFactory, inputPreValidator, queryAstFactory, schema, schemaDatabaseMetadata }) =>
199
+ new MutationResolver(schema.model, mapperFactory, inputPreValidator, queryAstFactory, schemaDatabaseMetadata))
200
+ .addService('validationResolver', ({ inputPreValidator, mapperFactory }) =>
201
+ new ValidationResolver(mapperFactory, inputPreValidator))
202
+ }
203
+
204
+ public create(args: ExecutionContainerArgs): ExecutionContainer {
205
+ return this.createBuilder(args).build().pick('validationResolver', 'readResolver', 'mutationResolver')
206
+ }
207
+ }
208
+
@@ -1,33 +1,35 @@
1
- import { Acl, Model, Writable } from '@contember/schema'
1
+ import { Acl, Model, Schema, Writable } from '@contember/schema'
2
2
  import { getEntity, PredicateDefinitionProcessor } from '@contember/schema-utils'
3
3
  import { mapObject } from '../utils'
4
4
  import { prefixVariable } from './VariableUtils'
5
5
 
6
- export class PermissionFactory {
7
- constructor(private readonly schema: Model.Schema) {}
6
+ export interface Identity {
7
+ projectRoles: readonly string[]
8
+ }
8
9
 
9
- public create(acl: Acl.Schema, roles: readonly string[], prefix?: string): Acl.Permissions {
10
+ export class PermissionFactory {
11
+ public create(schema: Schema, roles: readonly string[], prefix?: string): Acl.Permissions {
10
12
  let result: Acl.Permissions = {}
11
13
  for (let role of roles) {
12
- const roleDefinition = acl.roles[role] || { entities: {} }
13
- let rolePermissions: Acl.Permissions = this.prefixPredicatesWithRole(roleDefinition.entities, prefix || role)
14
+ const roleDefinition = schema.acl.roles[role] || { entities: {} }
15
+ let rolePermissions: Acl.Permissions = this.prefixPredicatesWithRole(schema.model, roleDefinition.entities, prefix || role)
14
16
  if (roleDefinition.inherits) {
15
- const inheritedPermissions = this.create(acl, roleDefinition.inherits, prefix || role)
17
+ const inheritedPermissions = this.create(schema, roleDefinition.inherits, prefix || role)
16
18
  rolePermissions = this.mergePermissions(inheritedPermissions, rolePermissions)
17
19
  }
18
20
  result = this.mergePermissions(result, rolePermissions)
19
21
  }
20
- result = this.makePrimaryPredicatesUnionOfAllFields(result)
22
+ result = this.makePrimaryPredicatesUnionOfAllFields(schema.model, result)
21
23
 
22
24
  return result
23
25
  }
24
26
 
25
- private prefixPredicatesWithRole(permissions: Acl.Permissions, role: string): Acl.Permissions {
27
+ private prefixPredicatesWithRole(model: Model.Schema, permissions: Acl.Permissions, role: string): Acl.Permissions {
26
28
  return mapObject(permissions, ({ operations, predicates }, entityName) => ({
27
29
  operations,
28
30
  predicates: mapObject(predicates, predicate => {
29
- const predicateDefinitionProcessor = new PredicateDefinitionProcessor(this.schema)
30
- return predicateDefinitionProcessor.process(getEntity(this.schema, entityName), predicate, {
31
+ const predicateDefinitionProcessor = new PredicateDefinitionProcessor(model)
32
+ return predicateDefinitionProcessor.process(getEntity(model, entityName), predicate, {
31
33
  handleColumn: ({ value }) => {
32
34
  if (typeof value === 'string') {
33
35
  return prefixVariable(role, value)
@@ -45,9 +47,9 @@ export class PermissionFactory {
45
47
  }))
46
48
  }
47
49
 
48
- private makePrimaryPredicatesUnionOfAllFields(permissions: Acl.Permissions): Acl.Permissions {
50
+ private makePrimaryPredicatesUnionOfAllFields(model: Model.Schema, permissions: Acl.Permissions): Acl.Permissions {
49
51
  return mapObject(permissions, (permission, entityName): Acl.EntityPermissions => {
50
- const entity = getEntity(this.schema, entityName)
52
+ const entity = getEntity(model, entityName)
51
53
  const entityPredicates: Writable<Acl.PredicateMap> = { ...permission.predicates }
52
54
  const entityOperations: Writable<Acl.EntityOperations> = { ...permission.operations }
53
55
 
package/src/acl/index.ts CHANGED
@@ -1,6 +1,5 @@
1
1
  export * from './Authorizator'
2
2
  export * from './PermissionFactory'
3
- export * from './PermissionsByIdentityFactory'
4
3
  export * from './PredicateFactory'
5
4
  export * from './PredicatesInjector'
6
5
  export * from './VariableInjector'
package/src/index.ts CHANGED
@@ -5,6 +5,29 @@ export * from './schema'
5
5
  export * from './inputProcessing'
6
6
  export { EntityRulesResolver } from './input-validation'
7
7
  export * from './types'
8
+ export * from './ExecutionContainer'
8
9
  export { graphql } from 'graphql'
9
10
  export { UserError } from './exception'
10
- export { createMapperContainer } from './mapper'
11
+ export {
12
+ DataModificationEvent,
13
+ AfterCommitEvent,
14
+ AfterInsertEvent,
15
+ AfterJunctionUpdateEvent,
16
+ AfterUpdateEvent,
17
+ BeforeCommitEvent,
18
+ BeforeDeleteEvent,
19
+ BeforeInsertEvent,
20
+ BeforeJunctionUpdateEvent,
21
+ BeforeUpdateEvent,
22
+ EventManager,
23
+ Mapper,
24
+ MapperFactory,
25
+ ExecutionContainer,
26
+ ExecutionContainerBuilder,
27
+ Path,
28
+ WhereBuilder,
29
+ PathFactory,
30
+ ExecutionContainerFactory,
31
+ ExecutionContainerHook,
32
+ ExecutionContainerArgs,
33
+ } from './mapper'
@@ -2,14 +2,14 @@ import { Value } from '@contember/schema'
2
2
  import { getFulfilledValues, getRejections } from '../utils'
3
3
 
4
4
  export type ColumnValue<E = never> = {
5
- value: PromiseLike<Value.AtomicValue<E> | undefined>
5
+ value: PromiseLike<Value.FieldValue<E> | undefined>
6
6
  fieldName: string
7
7
  columnName: string
8
8
  columnType: string
9
9
  }
10
10
 
11
11
  export type ResolvedColumnValue<E = never> = ColumnValue<E> & {
12
- resolvedValue: Value.AtomicValue<E>
12
+ resolvedValue: Value.FieldValue<E>
13
13
  }
14
14
 
15
15
  export const resolveGenericValue = <T>(value: Value.GenericValueLike<T>): Promise<T> => {
@@ -11,31 +11,37 @@ import {
11
11
  import * as Database from '@contember/database'
12
12
  import { UniqueWhereError } from '../inputProcessing'
13
13
  import { Model } from '@contember/schema'
14
- import { isOwningRelation, isRelation, NamingHelper } from '@contember/schema-utils'
14
+ import { acceptFieldVisitor, SchemaDatabaseMetadata, tryGetColumnName } from '@contember/schema-utils'
15
15
  import { logger } from '@contember/logger'
16
- import RelationType = Model.RelationType
17
16
 
18
17
 
19
- const findUniqueConstraint = (schema: Model.Schema, constraintName: string): [Model.Entity, Model.UniqueConstraint] | [null, null] => {
20
- for (const entity of Object.values(schema.entities)) {
21
- for (const constraint of Object.values(entity.unique)) {
22
- if (constraint.name === constraintName) {
23
- return [entity, constraint]
24
- }
25
- }
18
+ type UniqueConstraintResult = {
19
+ entity: Model.Entity
20
+ fields: string[]
21
+ }
22
+
23
+ const getEntityByTableName = (model: Model.Schema, tableName: string) => Object.values(model.entities).find(it => it.tableName === tableName)
24
+
25
+ const findUniqueConstraint = (model: Model.Schema, databaseMetadata: SchemaDatabaseMetadata, tableName: string, constraintName: string): UniqueConstraintResult | null => {
26
+ const constraint = databaseMetadata.getUniqueConstraint(tableName, constraintName)
27
+ if (!constraint) {
28
+ return null
26
29
  }
27
- for (const entity of Object.values(schema.entities)) {
28
- for (const field of Object.values(entity.fields)) {
29
- if (
30
- field.type === RelationType.OneHasOne &&
31
- isOwningRelation(field) &&
32
- NamingHelper.createUniqueConstraintName(entity.name, [field.name]) === constraintName
33
- ) {
34
- return [entity, { name: constraintName, fields: [field.name] }]
35
- }
30
+ const entity = getEntityByTableName(model, constraint.tableName)
31
+ if (!entity) {
32
+ return null
33
+ }
34
+ const fieldsInConstraint: string[] = []
35
+ for (const field of Object.values(entity.fields)) {
36
+ const columnName = tryGetColumnName(model, entity, field.name)
37
+ if (columnName && constraint.columnNames.includes(columnName)) {
38
+ fieldsInConstraint.push(field.name)
36
39
  }
37
40
  }
38
- return [null, null]
41
+ if (fieldsInConstraint.length === constraint.columnNames.length) {
42
+ return { entity, fields: fieldsInConstraint }
43
+ }
44
+ return null
39
45
  }
40
46
 
41
47
  type RelationInfo = {
@@ -44,28 +50,47 @@ type RelationInfo = {
44
50
  targetEntity: Model.Entity
45
51
  }
46
52
 
47
- const findForeignConstraint = (schema: Model.Schema, constraintName: string): RelationInfo | null => {
48
- for (const owningEntity of Object.values(schema.entities)) {
49
- for (const field of Object.values(owningEntity.fields)) {
50
- if (!isRelation(field) || !isOwningRelation(field) || !('joiningColumn' in field)) {
51
- continue
52
- }
53
- const targetEntity = schema.entities[field.target]
54
- const fkName = NamingHelper.createForeignKeyName(
55
- owningEntity.tableName,
56
- field.joiningColumn.columnName,
57
- targetEntity.tableName,
58
- targetEntity.primaryColumn,
59
- )
60
- if (fkName === constraintName) {
61
- return { owningEntity, targetEntity, owningRelation: field }
53
+ const findForeignConstraint = (model: Model.Schema, databaseMetadata: SchemaDatabaseMetadata, tableName: string, constraintName: string): RelationInfo | null => {
54
+ const constraint = databaseMetadata.getForeignKeyConstraint(tableName, constraintName)
55
+ if (!constraint) {
56
+ return null
57
+ }
58
+ const owningEntity = getEntityByTableName(model, constraint.fromTable)
59
+ if (!owningEntity) {
60
+ // todo m:n
61
+ return null
62
+ }
63
+
64
+ const targetEntity = getEntityByTableName(model, constraint.toTable)
65
+ if (!targetEntity) {
66
+ return null
67
+ }
68
+ for (const field of Object.values(owningEntity.fields)) {
69
+ const relation = acceptFieldVisitor<(Model.Relation & Model.JoiningColumnRelation) | null>(model, owningEntity, field, {
70
+ visitColumn: () => null,
71
+ visitOneHasOneInverse: () => null,
72
+ visitManyHasManyInverse: () => null,
73
+ visitManyHasManyOwning: () => null,
74
+ visitOneHasMany: () => null,
75
+ visitOneHasOneOwning: ({ relation }) => relation,
76
+ visitManyHasOne: ({ relation }) => relation,
77
+ })
78
+ if (relation && relation.joiningColumn.columnName === constraint.fromColumn) {
79
+ return {
80
+ owningEntity,
81
+ owningRelation: relation,
82
+ targetEntity,
62
83
  }
63
84
  }
64
85
  }
65
86
  return null
66
87
  }
67
88
 
68
- export const convertError = (schema: Model.Schema, e: any): MutationResult => {
89
+ export const convertError = (
90
+ schema: Model.Schema,
91
+ databaseMetadata: SchemaDatabaseMetadata,
92
+ e: any,
93
+ ): MutationResult => {
69
94
 
70
95
  if (e instanceof Database.NotNullViolationError) {
71
96
  return new MutationConstraintViolationError([], ConstraintType.notNull, e.originalMessage, [
@@ -73,7 +98,7 @@ export const convertError = (schema: Model.Schema, e: any): MutationResult => {
73
98
  ])
74
99
  }
75
100
  if (e instanceof Database.ForeignKeyViolationError) {
76
- const relationInfo = e.constraint ? findForeignConstraint(schema, e.constraint) : null
101
+ const relationInfo = e.constraint && e.table ? findForeignConstraint(schema, databaseMetadata, e.table, e.constraint) : null
77
102
  const violationDetail: string = 'detail' in e.previous ? e.previous.detail : ''
78
103
  const matchResult = violationDetail.match(/^Key \(.+\)=\((.+)\) is still referenced from table/)
79
104
  const message = relationInfo
@@ -85,13 +110,13 @@ export const convertError = (schema: Model.Schema, e: any): MutationResult => {
85
110
  return new MutationConstraintViolationError([], ConstraintType.foreignKey, message, [MutationResultHint.sqlError])
86
111
  }
87
112
  if (e instanceof Database.UniqueViolationError) {
88
- const [entity, constraint] = e.constraint ? findUniqueConstraint(schema, e.constraint) : [null, null]
113
+ const constraint = e.constraint && e.table ? findUniqueConstraint(schema, databaseMetadata, e.table, e.constraint) : null
89
114
  const violationDetail: string = 'detail' in e.previous ? e.previous.detail : ''
90
115
  const matchResult = violationDetail.match(/^Key \(.+\)=\((.+)\) already exists\.$/)
91
116
  const values = matchResult?.[1]
92
- const message = constraint && entity
117
+ const message = constraint
93
118
  ? `${values ? `Value (${values})` : 'Unknown value'}` +
94
- ` already exists in unique columns (${constraint.fields.join(', ')}) on entity ${entity.name}`
119
+ ` already exists in unique columns (${constraint.fields.join(', ')}) on entity ${constraint.entity.name}`
95
120
  : e.originalMessage
96
121
  const paths = constraint ? constraint.fields.map(it => [{ field: it }]) : []
97
122
  return new MutationConstraintViolationError(paths, ConstraintType.uniqueKey, message, [MutationResultHint.sqlError])
@@ -115,10 +140,10 @@ export const convertError = (schema: Model.Schema, e: any): MutationResult => {
115
140
  throw e
116
141
  }
117
142
 
118
- export const tryMutation = async (schema: Model.Schema, cb: () => Promise<MutationResultList>): Promise<MutationResultList> => {
143
+ export const tryMutation = async (schema: Model.Schema, databaseMetadata: SchemaDatabaseMetadata, cb: () => Promise<MutationResultList>): Promise<MutationResultList> => {
119
144
  try {
120
145
  return await cb()
121
146
  } catch (e) {
122
- return [convertError(schema, e)]
147
+ return [convertError(schema, databaseMetadata, e)]
123
148
  }
124
149
  }