@contember/engine-content-api 0.12.0-beta.1 → 1.0.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 (484) hide show
  1. package/dist/src/acl/PermissionFactory.d.ts.map +1 -1
  2. package/dist/src/acl/PermissionFactory.js +9 -6
  3. package/dist/src/acl/PermissionFactory.js.map +1 -1
  4. package/dist/src/acl/PermissionsByIdentityFactory.js +1 -1
  5. package/dist/src/acl/PermissionsByIdentityFactory.js.map +1 -1
  6. package/dist/src/acl/PredicatesInjector.js +1 -1
  7. package/dist/src/acl/PredicatesInjector.js.map +1 -1
  8. package/dist/src/acl/VariableUtils.d.ts +5 -1
  9. package/dist/src/acl/VariableUtils.d.ts.map +1 -1
  10. package/dist/src/acl/VariableUtils.js +25 -7
  11. package/dist/src/acl/VariableUtils.js.map +1 -1
  12. package/dist/src/bridges/system/EntitiesSelector.js +2 -2
  13. package/dist/src/bridges/system/EntitiesSelector.js.map +1 -1
  14. package/dist/src/bridges/system/index.d.ts +0 -1
  15. package/dist/src/bridges/system/index.d.ts.map +1 -1
  16. package/dist/src/bridges/system/index.js +0 -1
  17. package/dist/src/bridges/system/index.js.map +1 -1
  18. package/dist/src/extensions/hasManyToHasOneReducer/HasManyToHasOneReducer.js +1 -1
  19. package/dist/src/extensions/hasManyToHasOneReducer/HasManyToHasOneReducer.js.map +1 -1
  20. package/dist/src/extensions/hasManyToHasOneReducer/HasManyToHasOneReducerExecutionHandler.js +2 -2
  21. package/dist/src/extensions/hasManyToHasOneReducer/HasManyToHasOneReducerExecutionHandler.js.map +1 -1
  22. package/dist/src/extensions/hasManyToHasOneReducer/HasManyToHasOneRelationReducerVisitor.js +4 -4
  23. package/dist/src/extensions/hasManyToHasOneReducer/HasManyToHasOneRelationReducerVisitor.js.map +1 -1
  24. package/dist/src/extensions/paginatedHasMany/PaginatedHasManyExecutionHandler.js +3 -3
  25. package/dist/src/extensions/paginatedHasMany/PaginatedHasManyExecutionHandler.js.map +1 -1
  26. package/dist/src/extensions/paginatedHasMany/PaginatedHasManyFieldProvider.js +1 -1
  27. package/dist/src/extensions/paginatedHasMany/PaginatedHasManyFieldProvider.js.map +1 -1
  28. package/dist/src/extensions/paginatedHasMany/PaginatedHasManyFieldProviderVisitor.js +1 -1
  29. package/dist/src/extensions/paginatedHasMany/PaginatedHasManyFieldProviderVisitor.js.map +1 -1
  30. package/dist/src/input-validation/ColumnValueResolver.js +1 -1
  31. package/dist/src/input-validation/ColumnValueResolver.js.map +1 -1
  32. package/dist/src/input-validation/EntityRulesResolver.js +5 -5
  33. package/dist/src/input-validation/EntityRulesResolver.js.map +1 -1
  34. package/dist/src/input-validation/QueryAstFactory.js +2 -2
  35. package/dist/src/input-validation/QueryAstFactory.js.map +1 -1
  36. package/dist/src/input-validation/ValidationContext.js +1 -1
  37. package/dist/src/input-validation/ValidationContext.js.map +1 -1
  38. package/dist/src/input-validation/ValidationEvaluation.js +8 -8
  39. package/dist/src/input-validation/ValidationEvaluation.js.map +1 -1
  40. package/dist/src/input-validation/dependencies/DependencyCollector.js +1 -1
  41. package/dist/src/input-validation/dependencies/DependencyCollector.js.map +1 -1
  42. package/dist/src/input-validation/dependencies/DependencyMerger.js +1 -1
  43. package/dist/src/input-validation/dependencies/DependencyMerger.js.map +1 -1
  44. package/dist/src/input-validation/preValidation/CreateInputPreValidationProcessor.js +1 -1
  45. package/dist/src/input-validation/preValidation/CreateInputPreValidationProcessor.js.map +1 -1
  46. package/dist/src/input-validation/preValidation/InputPreValidator.js +6 -6
  47. package/dist/src/input-validation/preValidation/InputPreValidator.js.map +1 -1
  48. package/dist/src/input-validation/preValidation/UpdateInputPreValidationProcessor.js +3 -3
  49. package/dist/src/input-validation/preValidation/UpdateInputPreValidationProcessor.js.map +1 -1
  50. package/dist/src/inputProcessing/CreateInputVisitor.js +6 -6
  51. package/dist/src/inputProcessing/CreateInputVisitor.js.map +1 -1
  52. package/dist/src/inputProcessing/UniqueWhereExpander.js +3 -3
  53. package/dist/src/inputProcessing/UniqueWhereExpander.js.map +1 -1
  54. package/dist/src/inputProcessing/UpdateInputVisitor.js +14 -14
  55. package/dist/src/inputProcessing/UpdateInputVisitor.js.map +1 -1
  56. package/dist/src/introspection/IntrospectionSchemaFactory.js +4 -4
  57. package/dist/src/introspection/IntrospectionSchemaFactory.js.map +1 -1
  58. package/dist/src/introspection/content-schema.graphql.js +1 -1
  59. package/dist/src/introspection/content-schema.graphql.js.map +1 -1
  60. package/dist/src/introspection/content-schema.types.d.ts +4 -1
  61. package/dist/src/introspection/content-schema.types.d.ts.map +1 -1
  62. package/dist/src/mapper/ColumnValue.js +2 -2
  63. package/dist/src/mapper/ColumnValue.js.map +1 -1
  64. package/dist/src/mapper/ErrorUtils.d.ts +2 -9
  65. package/dist/src/mapper/ErrorUtils.d.ts.map +1 -1
  66. package/dist/src/mapper/ErrorUtils.js +48 -37
  67. package/dist/src/mapper/ErrorUtils.js.map +1 -1
  68. package/dist/src/mapper/JunctionTableManager.js +1 -1
  69. package/dist/src/mapper/JunctionTableManager.js.map +1 -1
  70. package/dist/src/mapper/Mapper.js +7 -7
  71. package/dist/src/mapper/Mapper.js.map +1 -1
  72. package/dist/src/mapper/MutationProcessorHelper.js +2 -2
  73. package/dist/src/mapper/MutationProcessorHelper.js.map +1 -1
  74. package/dist/src/mapper/Result.d.ts +4 -4
  75. package/dist/src/mapper/Result.d.ts.map +1 -1
  76. package/dist/src/mapper/Result.js +8 -8
  77. package/dist/src/mapper/Result.js.map +1 -1
  78. package/dist/src/mapper/delete/DeleteExecutor.d.ts.map +1 -1
  79. package/dist/src/mapper/delete/DeleteExecutor.js +5 -14
  80. package/dist/src/mapper/delete/DeleteExecutor.js.map +1 -1
  81. package/dist/src/mapper/insert/InsertBuilder.d.ts.map +1 -1
  82. package/dist/src/mapper/insert/InsertBuilder.js +6 -7
  83. package/dist/src/mapper/insert/InsertBuilder.js.map +1 -1
  84. package/dist/src/mapper/insert/Inserter.js +4 -4
  85. package/dist/src/mapper/insert/Inserter.js.map +1 -1
  86. package/dist/src/mapper/insert/SqlCreateInputProcessor.js +17 -17
  87. package/dist/src/mapper/insert/SqlCreateInputProcessor.js.map +1 -1
  88. package/dist/src/mapper/select/JoinBuilder.js +2 -2
  89. package/dist/src/mapper/select/JoinBuilder.js.map +1 -1
  90. package/dist/src/mapper/select/OrderByBuilder.js +2 -2
  91. package/dist/src/mapper/select/OrderByBuilder.js.map +1 -1
  92. package/dist/src/mapper/select/SelectBuilder.js +4 -4
  93. package/dist/src/mapper/select/SelectBuilder.js.map +1 -1
  94. package/dist/src/mapper/select/WhereBuilder.js +2 -2
  95. package/dist/src/mapper/select/WhereBuilder.js.map +1 -1
  96. package/dist/src/mapper/update/SqlUpdateInputProcessor.js +44 -44
  97. package/dist/src/mapper/update/SqlUpdateInputProcessor.js.map +1 -1
  98. package/dist/src/mapper/update/UpdateBuilder.d.ts.map +1 -1
  99. package/dist/src/mapper/update/UpdateBuilder.js +9 -10
  100. package/dist/src/mapper/update/UpdateBuilder.js.map +1 -1
  101. package/dist/src/mapper/update/Updater.js +3 -3
  102. package/dist/src/mapper/update/Updater.js.map +1 -1
  103. package/dist/src/resolvers/ExecutionContainerFactory.js +2 -2
  104. package/dist/src/resolvers/ExecutionContainerFactory.js.map +1 -1
  105. package/dist/src/resolvers/GraphQlQueryAstFactory.js +7 -7
  106. package/dist/src/resolvers/GraphQlQueryAstFactory.js.map +1 -1
  107. package/dist/src/resolvers/MutationResolver.d.ts +6 -2
  108. package/dist/src/resolvers/MutationResolver.d.ts.map +1 -1
  109. package/dist/src/resolvers/MutationResolver.js +27 -13
  110. package/dist/src/resolvers/MutationResolver.js.map +1 -1
  111. package/dist/src/resolvers/ReadHelpers.js +4 -4
  112. package/dist/src/resolvers/ReadHelpers.js.map +1 -1
  113. package/dist/src/resolvers/ReadResolver.js +3 -3
  114. package/dist/src/resolvers/ReadResolver.js.map +1 -1
  115. package/dist/src/resolvers/ValidationResolver.js +1 -1
  116. package/dist/src/resolvers/ValidationResolver.js.map +1 -1
  117. package/dist/src/schema/ColumnTypeResolver.js +1 -1
  118. package/dist/src/schema/ColumnTypeResolver.js.map +1 -1
  119. package/dist/src/schema/ConditionTypeProvider.js +2 -2
  120. package/dist/src/schema/ConditionTypeProvider.js.map +1 -1
  121. package/dist/src/schema/EntityTypeProvider.js +10 -10
  122. package/dist/src/schema/EntityTypeProvider.js.map +1 -1
  123. package/dist/src/schema/EnumsProvider.js +2 -2
  124. package/dist/src/schema/EnumsProvider.js.map +1 -1
  125. package/dist/src/schema/GraphQlSchemaBuilder.d.ts.map +1 -1
  126. package/dist/src/schema/GraphQlSchemaBuilder.js +16 -1
  127. package/dist/src/schema/GraphQlSchemaBuilder.js.map +1 -1
  128. package/dist/src/schema/MutationProvider.js +2 -2
  129. package/dist/src/schema/MutationProvider.js.map +1 -1
  130. package/dist/src/schema/OrderByTypeProvider.js +4 -4
  131. package/dist/src/schema/OrderByTypeProvider.js.map +1 -1
  132. package/dist/src/schema/ValidationQueriesProvider.js +1 -1
  133. package/dist/src/schema/ValidationQueriesProvider.js.map +1 -1
  134. package/dist/src/schema/WhereTypeProvider.js +10 -10
  135. package/dist/src/schema/WhereTypeProvider.js.map +1 -1
  136. package/dist/src/schema/mutations/CreateEntityRelationInputFieldVisitor.js +2 -2
  137. package/dist/src/schema/mutations/CreateEntityRelationInputFieldVisitor.js.map +1 -1
  138. package/dist/src/schema/mutations/CreateEntityRelationInputProvider.js +2 -2
  139. package/dist/src/schema/mutations/CreateEntityRelationInputProvider.js.map +1 -1
  140. package/dist/src/schema/mutations/EntityInputProvider.js +4 -4
  141. package/dist/src/schema/mutations/EntityInputProvider.js.map +1 -1
  142. package/dist/src/schema/mutations/UpdateEntityRelationInputFieldVisitor.js +7 -7
  143. package/dist/src/schema/mutations/UpdateEntityRelationInputFieldVisitor.js.map +1 -1
  144. package/dist/src/schema/mutations/UpdateEntityRelationInputProvider.js +2 -2
  145. package/dist/src/schema/mutations/UpdateEntityRelationInputProvider.js.map +1 -1
  146. package/dist/src/schema/utils.js +1 -1
  147. package/dist/src/schema/utils.js.map +1 -1
  148. package/dist/src/tsconfig.tsbuildinfo +1 -1
  149. package/dist/src/utils/uniqueWhereFields.js +1 -1
  150. package/dist/src/utils/uniqueWhereFields.js.map +1 -1
  151. package/dist/tests/cases/bugs/bug-filter-or.test.js +13 -13
  152. package/dist/tests/cases/bugs/bug-filter-or.test.js.map +1 -1
  153. package/dist/tests/cases/bugs/bug-update-by-nested-unique.test.js +8 -8
  154. package/dist/tests/cases/bugs/bug-update-by-nested-unique.test.js.map +1 -1
  155. package/dist/tests/cases/bugs/bug102.test.js +9 -9
  156. package/dist/tests/cases/bugs/bug102.test.js.map +1 -1
  157. package/dist/tests/cases/integration/graphQlDb/update/bug-freeze-connect-missing-one.test.d.ts +2 -0
  158. package/dist/tests/cases/integration/graphQlDb/update/bug-freeze-connect-missing-one.test.d.ts.map +1 -0
  159. package/dist/tests/cases/integration/graphQlDb/update/bug-freeze-connect-missing-one.test.js +60 -0
  160. package/dist/tests/cases/integration/graphQlDb/update/bug-freeze-connect-missing-one.test.js.map +1 -0
  161. package/dist/tests/cases/integration/graphQlDb/update/deferedConstraints.test.d.ts +2 -0
  162. package/dist/tests/cases/integration/graphQlDb/update/deferedConstraints.test.d.ts.map +1 -0
  163. package/dist/tests/cases/integration/graphQlDb/update/deferedConstraints.test.js +185 -0
  164. package/dist/tests/cases/integration/graphQlDb/update/deferedConstraints.test.js.map +1 -0
  165. package/dist/tests/cases/integration/graphQlDb/update/failedDelete.test.d.ts +2 -0
  166. package/dist/tests/cases/integration/graphQlDb/update/failedDelete.test.d.ts.map +1 -0
  167. package/dist/tests/cases/integration/graphQlDb/update/failedDelete.test.js +43 -0
  168. package/dist/tests/cases/integration/graphQlDb/update/failedDelete.test.js.map +1 -0
  169. package/dist/tests/cases/integration/graphQlDb/update/invalidInput.test.js +7 -7
  170. package/dist/tests/cases/integration/graphQlDb/update/invalidInput.test.js.map +1 -1
  171. package/dist/tests/cases/integration/graphQlDb/update/nullChecksNotNull.test.js +12 -12
  172. package/dist/tests/cases/integration/graphQlDb/update/nullChecksNotNull.test.js.map +1 -1
  173. package/dist/tests/cases/integration/graphQlDb/update/nullChecksNullable.test.js +12 -12
  174. package/dist/tests/cases/integration/graphQlDb/update/nullChecksNullable.test.js.map +1 -1
  175. package/dist/tests/cases/integration/graphQlDb/update/uniqueConstraint.test.d.ts +2 -0
  176. package/dist/tests/cases/integration/graphQlDb/update/uniqueConstraint.test.d.ts.map +1 -0
  177. package/dist/tests/cases/integration/graphQlDb/update/uniqueConstraint.test.js +38 -0
  178. package/dist/tests/cases/integration/graphQlDb/update/uniqueConstraint.test.js.map +1 -0
  179. package/dist/tests/cases/integration/graphQlRequests/delete/aclDelete.test.js +16 -16
  180. package/dist/tests/cases/integration/graphQlRequests/delete/aclDelete.test.js.map +1 -1
  181. package/dist/tests/cases/integration/graphQlRequests/delete/additionalDeleteFilter.test.js +16 -16
  182. package/dist/tests/cases/integration/graphQlRequests/delete/additionalDeleteFilter.test.js.map +1 -1
  183. package/dist/tests/cases/integration/graphQlRequests/delete/cascadeDelete.test.js +22 -22
  184. package/dist/tests/cases/integration/graphQlRequests/delete/cascadeDelete.test.js.map +1 -1
  185. package/dist/tests/cases/integration/graphQlRequests/delete/deleteById.test.js +20 -20
  186. package/dist/tests/cases/integration/graphQlRequests/delete/deleteById.test.js.map +1 -1
  187. package/dist/tests/cases/integration/graphQlRequests/delete/orphanRemoval.test.js +19 -19
  188. package/dist/tests/cases/integration/graphQlRequests/delete/orphanRemoval.test.js.map +1 -1
  189. package/dist/tests/cases/integration/graphQlRequests/delete/setNullOnDelete.test.js +18 -18
  190. package/dist/tests/cases/integration/graphQlRequests/delete/setNullOnDelete.test.js.map +1 -1
  191. package/dist/tests/cases/integration/graphQlRequests/insert/acl/setField.test.js +13 -13
  192. package/dist/tests/cases/integration/graphQlRequests/insert/acl/setField.test.js.map +1 -1
  193. package/dist/tests/cases/integration/graphQlRequests/insert/aclInsert.test.js +11 -11
  194. package/dist/tests/cases/integration/graphQlRequests/insert/aclInsert.test.js.map +1 -1
  195. package/dist/tests/cases/integration/graphQlRequests/insert/basicInsert.test.js +11 -11
  196. package/dist/tests/cases/integration/graphQlRequests/insert/basicInsert.test.js.map +1 -1
  197. package/dist/tests/cases/integration/graphQlRequests/insert/insertCustomId.test.js +12 -12
  198. package/dist/tests/cases/integration/graphQlRequests/insert/insertCustomId.test.js.map +1 -1
  199. package/dist/tests/cases/integration/graphQlRequests/insert/manyHasManyInverse/insertRelationCreate.test.js +21 -21
  200. package/dist/tests/cases/integration/graphQlRequests/insert/manyHasManyInverse/insertRelationCreate.test.js.map +1 -1
  201. package/dist/tests/cases/integration/graphQlRequests/insert/manyHasManyOwning/insertRelationCreate.test.js +21 -21
  202. package/dist/tests/cases/integration/graphQlRequests/insert/manyHasManyOwning/insertRelationCreate.test.js.map +1 -1
  203. package/dist/tests/cases/integration/graphQlRequests/insert/manyHasOne/insertRelationCreate.test.js +14 -14
  204. package/dist/tests/cases/integration/graphQlRequests/insert/manyHasOne/insertRelationCreate.test.js.map +1 -1
  205. package/dist/tests/cases/integration/graphQlRequests/insert/oneHasMany/insertRelationConnect.test.js +17 -17
  206. package/dist/tests/cases/integration/graphQlRequests/insert/oneHasMany/insertRelationConnect.test.js.map +1 -1
  207. package/dist/tests/cases/integration/graphQlRequests/insert/oneHasMany/insertRelationCreate.test.js +17 -17
  208. package/dist/tests/cases/integration/graphQlRequests/insert/oneHasMany/insertRelationCreate.test.js.map +1 -1
  209. package/dist/tests/cases/integration/graphQlRequests/insert/oneHasOneInverse/insertRelationCreate.test.js +14 -14
  210. package/dist/tests/cases/integration/graphQlRequests/insert/oneHasOneInverse/insertRelationCreate.test.js.map +1 -1
  211. package/dist/tests/cases/integration/graphQlRequests/insert/oneHasOneOwning/insertRelationCreate.test.js +14 -14
  212. package/dist/tests/cases/integration/graphQlRequests/insert/oneHasOneOwning/insertRelationCreate.test.js.map +1 -1
  213. package/dist/tests/cases/integration/graphQlRequests/insert/oneHasOneOwning/insertRelationEmpty.test.js +11 -11
  214. package/dist/tests/cases/integration/graphQlRequests/insert/oneHasOneOwning/insertRelationEmpty.test.js.map +1 -1
  215. package/dist/tests/cases/integration/graphQlRequests/insert/validation/toBeFixed.test.js +15 -15
  216. package/dist/tests/cases/integration/graphQlRequests/insert/validation/toBeFixed.test.js.map +1 -1
  217. package/dist/tests/cases/integration/graphQlRequests/query/acl/differentRowAndFieldPredicate.test.js +6 -6
  218. package/dist/tests/cases/integration/graphQlRequests/query/acl/differentRowAndFieldPredicate.test.js.map +1 -1
  219. package/dist/tests/cases/integration/graphQlRequests/query/acl/fieldRestrictedByLocale.test.js +38 -38
  220. package/dist/tests/cases/integration/graphQlRequests/query/acl/fieldRestrictedByLocale.test.js.map +1 -1
  221. package/dist/tests/cases/integration/graphQlRequests/query/acl/nestedPredicate.test.js +13 -13
  222. package/dist/tests/cases/integration/graphQlRequests/query/acl/nestedPredicate.test.js.map +1 -1
  223. package/dist/tests/cases/integration/graphQlRequests/query/acl/orPredicate.test.js +6 -6
  224. package/dist/tests/cases/integration/graphQlRequests/query/acl/orPredicate.test.js.map +1 -1
  225. package/dist/tests/cases/integration/graphQlRequests/query/acl/sameRowAndFieldPredicate.test.js +6 -6
  226. package/dist/tests/cases/integration/graphQlRequests/query/acl/sameRowAndFieldPredicate.test.js.map +1 -1
  227. package/dist/tests/cases/integration/graphQlRequests/query/filter/backReferencedFilter.test.js +15 -15
  228. package/dist/tests/cases/integration/graphQlRequests/query/filter/backReferencedFilter.test.js.map +1 -1
  229. package/dist/tests/cases/integration/graphQlRequests/query/filter/complexCondition.test.js +6 -6
  230. package/dist/tests/cases/integration/graphQlRequests/query/filter/complexCondition.test.js.map +1 -1
  231. package/dist/tests/cases/integration/graphQlRequests/query/filter/composedFilter.test.js +6 -6
  232. package/dist/tests/cases/integration/graphQlRequests/query/filter/composedFilter.test.js.map +1 -1
  233. package/dist/tests/cases/integration/graphQlRequests/query/filter/containsQuery.test.js +6 -6
  234. package/dist/tests/cases/integration/graphQlRequests/query/filter/containsQuery.test.js.map +1 -1
  235. package/dist/tests/cases/integration/graphQlRequests/query/filter/manyHasManyOwnerRelation.test.js +18 -18
  236. package/dist/tests/cases/integration/graphQlRequests/query/filter/manyHasManyOwnerRelation.test.js.map +1 -1
  237. package/dist/tests/cases/integration/graphQlRequests/query/filter/manyHasOneRelation.test.js +8 -8
  238. package/dist/tests/cases/integration/graphQlRequests/query/filter/manyHasOneRelation.test.js.map +1 -1
  239. package/dist/tests/cases/integration/graphQlRequests/query/filter/oneHasManyRelation.test.js +8 -8
  240. package/dist/tests/cases/integration/graphQlRequests/query/filter/oneHasManyRelation.test.js.map +1 -1
  241. package/dist/tests/cases/integration/graphQlRequests/query/formatting/dateFormat.test.js +7 -7
  242. package/dist/tests/cases/integration/graphQlRequests/query/formatting/dateFormat.test.js.map +1 -1
  243. package/dist/tests/cases/integration/graphQlRequests/query/graphqlFeatures/alias.test.js +13 -13
  244. package/dist/tests/cases/integration/graphQlRequests/query/graphqlFeatures/alias.test.js.map +1 -1
  245. package/dist/tests/cases/integration/graphQlRequests/query/graphqlFeatures/fragments.test.js +18 -18
  246. package/dist/tests/cases/integration/graphQlRequests/query/graphqlFeatures/fragments.test.js.map +1 -1
  247. package/dist/tests/cases/integration/graphQlRequests/query/misc/aliasedType.test.js +6 -6
  248. package/dist/tests/cases/integration/graphQlRequests/query/misc/aliasedType.test.js.map +1 -1
  249. package/dist/tests/cases/integration/graphQlRequests/query/misc/longAliasHash.test.js +6 -6
  250. package/dist/tests/cases/integration/graphQlRequests/query/misc/longAliasHash.test.js.map +1 -1
  251. package/dist/tests/cases/integration/graphQlRequests/query/misc/reducedHasMany.test.js +13 -13
  252. package/dist/tests/cases/integration/graphQlRequests/query/misc/reducedHasMany.test.js.map +1 -1
  253. package/dist/tests/cases/integration/graphQlRequests/query/misc/transaction.test.js +13 -13
  254. package/dist/tests/cases/integration/graphQlRequests/query/misc/transaction.test.js.map +1 -1
  255. package/dist/tests/cases/integration/graphQlRequests/query/pagination/hasManyLimit.test.js +39 -39
  256. package/dist/tests/cases/integration/graphQlRequests/query/pagination/hasManyLimit.test.js.map +1 -1
  257. package/dist/tests/cases/integration/graphQlRequests/query/pagination/paginate.test.js +14 -14
  258. package/dist/tests/cases/integration/graphQlRequests/query/pagination/paginate.test.js.map +1 -1
  259. package/dist/tests/cases/integration/graphQlRequests/query/pagination/paginateAliased.test.js +14 -14
  260. package/dist/tests/cases/integration/graphQlRequests/query/pagination/paginateAliased.test.js.map +1 -1
  261. package/dist/tests/cases/integration/graphQlRequests/query/pagination/simpleLimit.test.js +8 -8
  262. package/dist/tests/cases/integration/graphQlRequests/query/pagination/simpleLimit.test.js.map +1 -1
  263. package/dist/tests/cases/integration/graphQlRequests/query/relations/advanced.test.js +73 -73
  264. package/dist/tests/cases/integration/graphQlRequests/query/relations/advanced.test.js.map +1 -1
  265. package/dist/tests/cases/integration/graphQlRequests/query/relations/manyHasManyInverse.test.js +29 -29
  266. package/dist/tests/cases/integration/graphQlRequests/query/relations/manyHasManyInverse.test.js.map +1 -1
  267. package/dist/tests/cases/integration/graphQlRequests/query/relations/manyHasManyOwning.test.js +20 -20
  268. package/dist/tests/cases/integration/graphQlRequests/query/relations/manyHasManyOwning.test.js.map +1 -1
  269. package/dist/tests/cases/integration/graphQlRequests/query/relations/manyHasOne.test.js +34 -34
  270. package/dist/tests/cases/integration/graphQlRequests/query/relations/manyHasOne.test.js.map +1 -1
  271. package/dist/tests/cases/integration/graphQlRequests/query/relations/oneHasMany.test.js +65 -65
  272. package/dist/tests/cases/integration/graphQlRequests/query/relations/oneHasMany.test.js.map +1 -1
  273. package/dist/tests/cases/integration/graphQlRequests/query/relations/oneHasOneInverse.test.js +16 -16
  274. package/dist/tests/cases/integration/graphQlRequests/query/relations/oneHasOneInverse.test.js.map +1 -1
  275. package/dist/tests/cases/integration/graphQlRequests/query/relations/oneHasOneOwner.test.js +16 -16
  276. package/dist/tests/cases/integration/graphQlRequests/query/relations/oneHasOneOwner.test.js.map +1 -1
  277. package/dist/tests/cases/integration/graphQlRequests/query/sorting/byRelations.test.js +6 -6
  278. package/dist/tests/cases/integration/graphQlRequests/query/sorting/byRelations.test.js.map +1 -1
  279. package/dist/tests/cases/integration/graphQlRequests/query/sorting/defaultOrdering.test.js +28 -28
  280. package/dist/tests/cases/integration/graphQlRequests/query/sorting/defaultOrdering.test.js.map +1 -1
  281. package/dist/tests/cases/integration/graphQlRequests/query/sorting/randomSort.test.js +39 -39
  282. package/dist/tests/cases/integration/graphQlRequests/query/sorting/randomSort.test.js.map +1 -1
  283. package/dist/tests/cases/integration/graphQlRequests/query/sorting/sortedHasMany.test.js +17 -17
  284. package/dist/tests/cases/integration/graphQlRequests/query/sorting/sortedHasMany.test.js.map +1 -1
  285. package/dist/tests/cases/integration/graphQlRequests/query/unique/basicQueryById.test.js +8 -8
  286. package/dist/tests/cases/integration/graphQlRequests/query/unique/basicQueryById.test.js.map +1 -1
  287. package/dist/tests/cases/integration/graphQlRequests/query/unique/composedUnique.test.js +8 -8
  288. package/dist/tests/cases/integration/graphQlRequests/query/unique/composedUnique.test.js.map +1 -1
  289. package/dist/tests/cases/integration/graphQlRequests/query/unique/oneHasManyUnique.test.js +8 -8
  290. package/dist/tests/cases/integration/graphQlRequests/query/unique/oneHasManyUnique.test.js.map +1 -1
  291. package/dist/tests/cases/integration/graphQlRequests/query/unique/uniqueWithFilter.test.js +8 -8
  292. package/dist/tests/cases/integration/graphQlRequests/query/unique/uniqueWithFilter.test.js.map +1 -1
  293. package/dist/tests/cases/integration/graphQlRequests/query/view/view.test.js +10 -10
  294. package/dist/tests/cases/integration/graphQlRequests/query/view/view.test.js.map +1 -1
  295. package/dist/tests/cases/integration/graphQlRequests/update/acl/aclUpdate.test.js +40 -40
  296. package/dist/tests/cases/integration/graphQlRequests/update/acl/aclUpdate.test.js.map +1 -1
  297. package/dist/tests/cases/integration/graphQlRequests/update/additionalFilter.test.js +14 -14
  298. package/dist/tests/cases/integration/graphQlRequests/update/additionalFilter.test.js.map +1 -1
  299. package/dist/tests/cases/integration/graphQlRequests/update/basic/columnUpdate.test.js +14 -14
  300. package/dist/tests/cases/integration/graphQlRequests/update/basic/columnUpdate.test.js.map +1 -1
  301. package/dist/tests/cases/integration/graphQlRequests/update/manyHasManyInverse/connect.test.js +14 -14
  302. package/dist/tests/cases/integration/graphQlRequests/update/manyHasManyInverse/connect.test.js.map +1 -1
  303. package/dist/tests/cases/integration/graphQlRequests/update/manyHasManyInverse/create.test.js +13 -13
  304. package/dist/tests/cases/integration/graphQlRequests/update/manyHasManyInverse/create.test.js.map +1 -1
  305. package/dist/tests/cases/integration/graphQlRequests/update/manyHasManyInverse/delete.test.js +16 -16
  306. package/dist/tests/cases/integration/graphQlRequests/update/manyHasManyInverse/delete.test.js.map +1 -1
  307. package/dist/tests/cases/integration/graphQlRequests/update/manyHasManyInverse/disconnect.test.js +14 -14
  308. package/dist/tests/cases/integration/graphQlRequests/update/manyHasManyInverse/disconnect.test.js.map +1 -1
  309. package/dist/tests/cases/integration/graphQlRequests/update/manyHasManyInverse/update.test.js +16 -16
  310. package/dist/tests/cases/integration/graphQlRequests/update/manyHasManyInverse/update.test.js.map +1 -1
  311. package/dist/tests/cases/integration/graphQlRequests/update/manyHasManyInverse/upsert.test.js +32 -32
  312. package/dist/tests/cases/integration/graphQlRequests/update/manyHasManyInverse/upsert.test.js.map +1 -1
  313. package/dist/tests/cases/integration/graphQlRequests/update/manyHasManyOwning/connect.test.js +14 -14
  314. package/dist/tests/cases/integration/graphQlRequests/update/manyHasManyOwning/connect.test.js.map +1 -1
  315. package/dist/tests/cases/integration/graphQlRequests/update/manyHasManyOwning/create.test.js +13 -13
  316. package/dist/tests/cases/integration/graphQlRequests/update/manyHasManyOwning/create.test.js.map +1 -1
  317. package/dist/tests/cases/integration/graphQlRequests/update/manyHasManyOwning/delete.test.js +16 -16
  318. package/dist/tests/cases/integration/graphQlRequests/update/manyHasManyOwning/delete.test.js.map +1 -1
  319. package/dist/tests/cases/integration/graphQlRequests/update/manyHasManyOwning/disconnect.test.js +14 -14
  320. package/dist/tests/cases/integration/graphQlRequests/update/manyHasManyOwning/disconnect.test.js.map +1 -1
  321. package/dist/tests/cases/integration/graphQlRequests/update/manyHasManyOwning/update.test.js +16 -16
  322. package/dist/tests/cases/integration/graphQlRequests/update/manyHasManyOwning/update.test.js.map +1 -1
  323. package/dist/tests/cases/integration/graphQlRequests/update/manyHasManyOwning/upsert.test.js +32 -32
  324. package/dist/tests/cases/integration/graphQlRequests/update/manyHasManyOwning/upsert.test.js.map +1 -1
  325. package/dist/tests/cases/integration/graphQlRequests/update/manyHasOne/connect.test.js +14 -14
  326. package/dist/tests/cases/integration/graphQlRequests/update/manyHasOne/connect.test.js.map +1 -1
  327. package/dist/tests/cases/integration/graphQlRequests/update/manyHasOne/create.test.js +13 -13
  328. package/dist/tests/cases/integration/graphQlRequests/update/manyHasOne/create.test.js.map +1 -1
  329. package/dist/tests/cases/integration/graphQlRequests/update/manyHasOne/delete.test.js +41 -41
  330. package/dist/tests/cases/integration/graphQlRequests/update/manyHasOne/delete.test.js.map +1 -1
  331. package/dist/tests/cases/integration/graphQlRequests/update/manyHasOne/disconnect.test.js +10 -10
  332. package/dist/tests/cases/integration/graphQlRequests/update/manyHasOne/disconnect.test.js.map +1 -1
  333. package/dist/tests/cases/integration/graphQlRequests/update/manyHasOne/update.test.js +16 -16
  334. package/dist/tests/cases/integration/graphQlRequests/update/manyHasOne/update.test.js.map +1 -1
  335. package/dist/tests/cases/integration/graphQlRequests/update/manyHasOne/upsert.test.js +31 -31
  336. package/dist/tests/cases/integration/graphQlRequests/update/manyHasOne/upsert.test.js.map +1 -1
  337. package/dist/tests/cases/integration/graphQlRequests/update/oneHasMany/combination.test.js +18 -18
  338. package/dist/tests/cases/integration/graphQlRequests/update/oneHasMany/combination.test.js.map +1 -1
  339. package/dist/tests/cases/integration/graphQlRequests/update/oneHasMany/connect.test.js +14 -14
  340. package/dist/tests/cases/integration/graphQlRequests/update/oneHasMany/connect.test.js.map +1 -1
  341. package/dist/tests/cases/integration/graphQlRequests/update/oneHasMany/create.test.js +11 -11
  342. package/dist/tests/cases/integration/graphQlRequests/update/oneHasMany/create.test.js.map +1 -1
  343. package/dist/tests/cases/integration/graphQlRequests/update/oneHasMany/delete.test.js +15 -15
  344. package/dist/tests/cases/integration/graphQlRequests/update/oneHasMany/delete.test.js.map +1 -1
  345. package/dist/tests/cases/integration/graphQlRequests/update/oneHasMany/disconnect.test.js +14 -14
  346. package/dist/tests/cases/integration/graphQlRequests/update/oneHasMany/disconnect.test.js.map +1 -1
  347. package/dist/tests/cases/integration/graphQlRequests/update/oneHasMany/update.test.js +21 -21
  348. package/dist/tests/cases/integration/graphQlRequests/update/oneHasMany/update.test.js.map +1 -1
  349. package/dist/tests/cases/integration/graphQlRequests/update/oneHasMany/upsert.test.js +26 -26
  350. package/dist/tests/cases/integration/graphQlRequests/update/oneHasMany/upsert.test.js.map +1 -1
  351. package/dist/tests/cases/integration/graphQlRequests/update/oneHasOneInverse/connect.test.js +50 -50
  352. package/dist/tests/cases/integration/graphQlRequests/update/oneHasOneInverse/connect.test.js.map +1 -1
  353. package/dist/tests/cases/integration/graphQlRequests/update/oneHasOneInverse/create.test.js +29 -29
  354. package/dist/tests/cases/integration/graphQlRequests/update/oneHasOneInverse/create.test.js.map +1 -1
  355. package/dist/tests/cases/integration/graphQlRequests/update/oneHasOneInverse/delete.test.js +15 -15
  356. package/dist/tests/cases/integration/graphQlRequests/update/oneHasOneInverse/delete.test.js.map +1 -1
  357. package/dist/tests/cases/integration/graphQlRequests/update/oneHasOneInverse/disconnect.test.js +13 -13
  358. package/dist/tests/cases/integration/graphQlRequests/update/oneHasOneInverse/disconnect.test.js.map +1 -1
  359. package/dist/tests/cases/integration/graphQlRequests/update/oneHasOneInverse/update.test.js +13 -13
  360. package/dist/tests/cases/integration/graphQlRequests/update/oneHasOneInverse/update.test.js.map +1 -1
  361. package/dist/tests/cases/integration/graphQlRequests/update/oneHasOneInverse/upsert.test.js +26 -26
  362. package/dist/tests/cases/integration/graphQlRequests/update/oneHasOneInverse/upsert.test.js.map +1 -1
  363. package/dist/tests/cases/integration/graphQlRequests/update/oneHasOneOwning/connect.test.js +50 -50
  364. package/dist/tests/cases/integration/graphQlRequests/update/oneHasOneOwning/connect.test.js.map +1 -1
  365. package/dist/tests/cases/integration/graphQlRequests/update/oneHasOneOwning/create.test.js +13 -13
  366. package/dist/tests/cases/integration/graphQlRequests/update/oneHasOneOwning/create.test.js.map +1 -1
  367. package/dist/tests/cases/integration/graphQlRequests/update/oneHasOneOwning/delete.test.js +17 -17
  368. package/dist/tests/cases/integration/graphQlRequests/update/oneHasOneOwning/delete.test.js.map +1 -1
  369. package/dist/tests/cases/integration/graphQlRequests/update/oneHasOneOwning/update.test.js +16 -16
  370. package/dist/tests/cases/integration/graphQlRequests/update/oneHasOneOwning/update.test.js.map +1 -1
  371. package/dist/tests/cases/integration/graphQlRequests/update/oneHasOneOwning/upsert.test.js +31 -31
  372. package/dist/tests/cases/integration/graphQlRequests/update/oneHasOneOwning/upsert.test.js.map +1 -1
  373. package/dist/tests/cases/integration/graphQlRequests/update/queryPortal.test.js +26 -26
  374. package/dist/tests/cases/integration/graphQlRequests/update/queryPortal.test.js.map +1 -1
  375. package/dist/tests/cases/integration/graphQlRequests/update/transaction.test.js +40 -40
  376. package/dist/tests/cases/integration/graphQlRequests/update/transaction.test.js.map +1 -1
  377. package/dist/tests/cases/integration/graphQlRequests/update/validation/toBeFixed.test.js +10 -10
  378. package/dist/tests/cases/integration/graphQlRequests/update/validation/toBeFixed.test.js.map +1 -1
  379. package/dist/tests/cases/integration/graphQlRequests/upsert/basicUpsert.test.js +24 -24
  380. package/dist/tests/cases/integration/graphQlRequests/upsert/basicUpsert.test.js.map +1 -1
  381. package/dist/tests/cases/integration/graphQlRequests/validation/conditions.test.js +5 -5
  382. package/dist/tests/cases/integration/graphQlRequests/validation/conditions.test.js.map +1 -1
  383. package/dist/tests/cases/integration/graphQlRequests/validation/nestedValidation.test.js +9 -9
  384. package/dist/tests/cases/integration/graphQlRequests/validation/nestedValidation.test.js.map +1 -1
  385. package/dist/tests/cases/integration/graphQlRequests/validation/optionalAssert.test.js +11 -11
  386. package/dist/tests/cases/integration/graphQlRequests/validation/optionalAssert.test.js.map +1 -1
  387. package/dist/tests/cases/integration/graphQlRequests/validation/required.test.js +26 -26
  388. package/dist/tests/cases/integration/graphQlRequests/validation/required.test.js.map +1 -1
  389. package/dist/tests/cases/integration/graphQlRequests/validation/requiredWhen.test.js +18 -18
  390. package/dist/tests/cases/integration/graphQlRequests/validation/requiredWhen.test.js.map +1 -1
  391. package/dist/tests/cases/integration/graphQlRequests/validation/rules/andRule.test.js +4 -4
  392. package/dist/tests/cases/integration/graphQlRequests/validation/rules/andRule.test.js.map +1 -1
  393. package/dist/tests/cases/integration/graphQlRequests/validation/rules/lengthRangeRule.test.js +5 -5
  394. package/dist/tests/cases/integration/graphQlRequests/validation/rules/lengthRangeRule.test.js.map +1 -1
  395. package/dist/tests/cases/integration/graphQlRequests/validation/rules/maxLengthRule.test.js +4 -4
  396. package/dist/tests/cases/integration/graphQlRequests/validation/rules/maxLengthRule.test.js.map +1 -1
  397. package/dist/tests/cases/integration/graphQlRequests/validation/rules/minLength.test.js +4 -4
  398. package/dist/tests/cases/integration/graphQlRequests/validation/rules/minLength.test.js.map +1 -1
  399. package/dist/tests/cases/integration/graphQlRequests/validation/rules/notEmptyRule.test.js +6 -6
  400. package/dist/tests/cases/integration/graphQlRequests/validation/rules/notEmptyRule.test.js.map +1 -1
  401. package/dist/tests/cases/integration/graphQlRequests/validation/rules/notRule.test.js +4 -4
  402. package/dist/tests/cases/integration/graphQlRequests/validation/rules/notRule.test.js.map +1 -1
  403. package/dist/tests/cases/integration/graphQlRequests/validation/rules/orRule.test.js +5 -5
  404. package/dist/tests/cases/integration/graphQlRequests/validation/rules/orRule.test.js.map +1 -1
  405. package/dist/tests/cases/integration/graphQlRequests/validation/rules/patternRule.test.js +4 -4
  406. package/dist/tests/cases/integration/graphQlRequests/validation/rules/patternRule.test.js.map +1 -1
  407. package/dist/tests/cases/integration/graphQlRequests/validation/rules/rangeRule.test.js +5 -5
  408. package/dist/tests/cases/integration/graphQlRequests/validation/rules/rangeRule.test.js.map +1 -1
  409. package/dist/tests/cases/integration/graphQlRequests/validation/utils.js +4 -4
  410. package/dist/tests/cases/integration/graphQlRequests/validation/utils.js.map +1 -1
  411. package/dist/tests/cases/integration/graphQlSchema/graphQlSchemaBuilder.test.js +3 -3
  412. package/dist/tests/cases/integration/graphQlSchema/graphQlSchemaBuilder.test.js.map +1 -1
  413. package/dist/tests/cases/integration/graphQlSchema/schema-acl-allowed.gql +5 -1
  414. package/dist/tests/cases/integration/graphQlSchema/schema-acl-create-only.gql +5 -1
  415. package/dist/tests/cases/integration/graphQlSchema/schema-acl-restricted-create.gql +5 -1
  416. package/dist/tests/cases/integration/graphQlSchema/schema-acl-restricted-delete.gql +5 -1
  417. package/dist/tests/cases/integration/graphQlSchema/schema-acl-restricted-update.gql +5 -1
  418. package/dist/tests/cases/integration/graphQlSchema/schema-acl.gql +5 -1
  419. package/dist/tests/cases/integration/graphQlSchema/schema-aliased-type.gql +5 -1
  420. package/dist/tests/cases/integration/graphQlSchema/schema-basic.gql +5 -1
  421. package/dist/tests/cases/integration/graphQlSchema/schema-bug-66.gql +5 -1
  422. package/dist/tests/cases/integration/graphQlSchema/schema-custom-primary.gql +5 -1
  423. package/dist/tests/cases/integration/graphQlSchema/schema-has-many-reduction.gql +5 -1
  424. package/dist/tests/cases/integration/graphQlSchema/schema-new-builder.gql +5 -1
  425. package/dist/tests/cases/unit/aclVariablesFactory.test.d.ts +2 -0
  426. package/dist/tests/cases/unit/aclVariablesFactory.test.d.ts.map +1 -0
  427. package/dist/tests/cases/unit/aclVariablesFactory.test.js +86 -0
  428. package/dist/tests/cases/unit/aclVariablesFactory.test.js.map +1 -0
  429. package/dist/tests/cases/unit/inputPreValidator.test.js +20 -20
  430. package/dist/tests/cases/unit/inputPreValidator.test.js.map +1 -1
  431. package/dist/tests/cases/unit/inputValidation.test.js +7 -7
  432. package/dist/tests/cases/unit/inputValidation.test.js.map +1 -1
  433. package/dist/tests/cases/unit/orderbyHelper.test.js +1 -1
  434. package/dist/tests/cases/unit/orderbyHelper.test.js.map +1 -1
  435. package/dist/tests/cases/unit/permissionMerger.test.js +1 -1
  436. package/dist/tests/cases/unit/permissionMerger.test.js.map +1 -1
  437. package/dist/tests/cases/unit/predicatesInjector.test.js +1 -1
  438. package/dist/tests/cases/unit/predicatesInjector.test.js.map +1 -1
  439. package/dist/tests/cases/unit/variableInjector.test.js +1 -1
  440. package/dist/tests/cases/unit/variableInjector.test.js.map +1 -1
  441. package/dist/tests/src/test.js +6 -6
  442. package/dist/tests/src/test.js.map +1 -1
  443. package/dist/tests/src/testGraphql.js +1 -1
  444. package/dist/tests/src/testGraphql.js.map +1 -1
  445. package/dist/tests/tsconfig.tsbuildinfo +1 -1
  446. package/package.json +11 -11
  447. package/src/acl/PermissionFactory.ts +3 -0
  448. package/src/acl/VariableUtils.ts +34 -10
  449. package/src/bridges/system/index.ts +0 -1
  450. package/src/introspection/content-schema.types.ts +5 -0
  451. package/src/mapper/ColumnValue.ts +1 -1
  452. package/src/mapper/ErrorUtils.ts +64 -41
  453. package/src/mapper/Mapper.ts +5 -5
  454. package/src/mapper/Result.ts +7 -4
  455. package/src/mapper/delete/DeleteExecutor.ts +3 -10
  456. package/src/mapper/insert/InsertBuilder.ts +3 -3
  457. package/src/mapper/insert/Inserter.ts +2 -2
  458. package/src/mapper/update/UpdateBuilder.ts +2 -3
  459. package/src/mapper/update/Updater.ts +1 -1
  460. package/src/resolvers/ExecutionContainerFactory.ts +1 -1
  461. package/src/resolvers/MutationResolver.ts +18 -2
  462. package/src/schema/GraphQlSchemaBuilder.ts +15 -3
  463. package/tests/cases/integration/graphQlDb/update/bug-freeze-connect-missing-one.test.ts +46 -0
  464. package/tests/cases/integration/graphQlDb/update/deferedConstraints.test.ts +208 -0
  465. package/tests/cases/integration/graphQlDb/update/failedDelete.test.ts +47 -0
  466. package/tests/cases/integration/graphQlDb/update/uniqueConstraint.test.ts +40 -0
  467. package/tests/cases/integration/graphQlSchema/schema-acl-allowed.gql +5 -1
  468. package/tests/cases/integration/graphQlSchema/schema-acl-create-only.gql +5 -1
  469. package/tests/cases/integration/graphQlSchema/schema-acl-restricted-create.gql +5 -1
  470. package/tests/cases/integration/graphQlSchema/schema-acl-restricted-delete.gql +5 -1
  471. package/tests/cases/integration/graphQlSchema/schema-acl-restricted-update.gql +5 -1
  472. package/tests/cases/integration/graphQlSchema/schema-acl.gql +5 -1
  473. package/tests/cases/integration/graphQlSchema/schema-aliased-type.gql +5 -1
  474. package/tests/cases/integration/graphQlSchema/schema-basic.gql +5 -1
  475. package/tests/cases/integration/graphQlSchema/schema-bug-66.gql +5 -1
  476. package/tests/cases/integration/graphQlSchema/schema-custom-primary.gql +5 -1
  477. package/tests/cases/integration/graphQlSchema/schema-has-many-reduction.gql +5 -1
  478. package/tests/cases/integration/graphQlSchema/schema-new-builder.gql +5 -1
  479. package/tests/cases/unit/aclVariablesFactory.test.ts +73 -0
  480. package/dist/src/bridges/system/ContentEventApplier.d.ts +0 -50
  481. package/dist/src/bridges/system/ContentEventApplier.d.ts.map +0 -1
  482. package/dist/src/bridges/system/ContentEventApplier.js +0 -249
  483. package/dist/src/bridges/system/ContentEventApplier.js.map +0 -1
  484. package/src/bridges/system/ContentEventApplier.ts +0 -399
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@contember/engine-content-api",
3
- "version": "0.12.0-beta.1",
3
+ "version": "1.0.0-alpha.2",
4
4
  "license": "Apache-2.0",
5
5
  "main": "dist/src/index.js",
6
6
  "typings": "dist/src/index.d.ts",
@@ -9,24 +9,24 @@
9
9
  "test": "uvu dist/tests/cases/ \\.js$"
10
10
  },
11
11
  "dependencies": {
12
- "@contember/database": "^0.12.0-beta.1",
13
- "@contember/dic": "^0.12.0-beta.1",
14
- "@contember/engine-common": "^0.12.0-beta.1",
15
- "@contember/graphql-utils": "^0.12.0-beta.1",
16
- "@contember/schema": "^0.12.0-beta.1",
17
- "@contember/schema-utils": "^0.12.0-beta.1",
12
+ "@contember/database": "^1.0.0-alpha.2",
13
+ "@contember/dic": "^1.0.0-alpha.2",
14
+ "@contember/engine-common": "^1.0.0-alpha.2",
15
+ "@contember/graphql-utils": "^1.0.0-alpha.2",
16
+ "@contember/schema": "^1.0.0-alpha.2",
17
+ "@contember/schema-utils": "^1.0.0-alpha.2",
18
18
  "@graphql-tools/schema": "^7.1.5",
19
19
  "graphql-tag": "^2.12.5"
20
20
  },
21
21
  "devDependencies": {
22
- "@contember/database-tester": "^0.12.0-beta.1",
23
- "@contember/engine-api-tester": "^0.12.0-beta.1",
24
- "@contember/schema-definition": "^0.12.0-beta.1",
22
+ "@contember/database-tester": "^1.0.0-alpha.2",
23
+ "@contember/engine-api-tester": "^1.0.0-alpha.2",
24
+ "@contember/schema-definition": "^1.0.0-alpha.2",
25
25
  "@graphql-codegen/cli": "^1.15.2",
26
26
  "@graphql-codegen/typescript": "^1.15.2",
27
27
  "@graphql-codegen/typescript-operations": "^1.15.2",
28
28
  "@graphql-codegen/typescript-resolvers": "^1.15.2",
29
- "@types/node": "^15.12.5",
29
+ "@types/node": "^17.0.5",
30
30
  "graphql": "^15.4.0",
31
31
  "pg": "^8.5.0",
32
32
  "uvu": "^0.5.1"
@@ -106,6 +106,9 @@ export class PermissionFactory {
106
106
  private mergeEntityPermissions(left: Acl.EntityPermissions, right: Acl.EntityPermissions): Acl.EntityPermissions {
107
107
  let predicates: Acl.PredicateMap = {}
108
108
  const operations: Acl.EntityOperations = {}
109
+ if (left.operations.customPrimary || right.operations.customPrimary) {
110
+ operations.customPrimary = true
111
+ }
109
112
 
110
113
  const operationNames: (keyof Pick<Acl.EntityOperations, 'create' | 'read' | 'update'>)[] = [
111
114
  'create',
@@ -1,17 +1,41 @@
1
1
  import { Acl } from '@contember/schema'
2
+ import { getRoleVariables } from '@contember/schema-utils'
2
3
 
3
4
  type Memberships = readonly { role: string; variables: readonly { name: string; values: readonly string[] }[] }[]
4
5
 
5
- export const flattenVariables = (memberships: Memberships): Acl.VariablesMap => {
6
- return memberships.reduce(
7
- (acc, membership) => ({
8
- ...acc,
9
- ...membership.variables.reduce(
10
- (acc, { name, values }) => ({ ...acc, [prefixVariable(membership.role, name)]: values }),
11
- {},
12
- ),
13
- }),
14
- {},
6
+ export const createAclVariables = (
7
+ aclSchema: Acl.Schema,
8
+ identity: {
9
+ identityId: string
10
+ personId: string | null
11
+ memberships: Memberships
12
+ },
13
+ ): Acl.VariablesMap => {
14
+
15
+ const variablesEntries = identity.memberships.flatMap(
16
+ membership => {
17
+ const roleVariables = getRoleVariables(membership.role, aclSchema)
18
+ const membershipVariablesMap = Object.fromEntries(membership.variables.map(it => [it.name, it.values]))
19
+
20
+ return Object.entries(roleVariables).map(([name, def]) => {
21
+ const prefixed = prefixVariable(membership.role, name)
22
+
23
+ switch (def.type) {
24
+ case Acl.VariableType.entity:
25
+ return [prefixed, membershipVariablesMap[name] ?? []]
26
+ case Acl.VariableType.predefined:
27
+ switch (def.value) {
28
+ case 'identityID':
29
+ return [prefixed, [identity.identityId]]
30
+ case 'personID':
31
+ return [prefixed, identity.personId ? [identity.personId] : []]
32
+ }
33
+ }
34
+ })
35
+ },
15
36
  )
37
+
38
+ return Object.fromEntries(variablesEntries)
16
39
  }
40
+
17
41
  export const prefixVariable = (role: string, variableName: string) => `${role}__${variableName}`
@@ -1,2 +1 @@
1
- export * from './ContentEventApplier'
2
1
  export * from './EntitiesSelector'
@@ -141,6 +141,10 @@ export type _ValidatorArgument = {
141
141
  export type ResolverTypeWrapper<T> = Promise<T> | T
142
142
 
143
143
 
144
+ export type ResolverWithResolve<TResult, TParent, TContext, TArgs> = {
145
+ resolve: ResolverFn<TResult, TParent, TContext, TArgs>
146
+ }
147
+
144
148
  export type LegacyStitchingResolver<TResult, TParent, TContext, TArgs> = {
145
149
  fragment: string
146
150
  resolve: ResolverFn<TResult, TParent, TContext, TArgs>
@@ -153,6 +157,7 @@ export type NewStitchingResolver<TResult, TParent, TContext, TArgs> = {
153
157
  export type StitchingResolver<TResult, TParent, TContext, TArgs> = LegacyStitchingResolver<TResult, TParent, TContext, TArgs> | NewStitchingResolver<TResult, TParent, TContext, TArgs>
154
158
  export type Resolver<TResult, TParent = {}, TContext = {}, TArgs = {}> =
155
159
  | ResolverFn<TResult, TParent, TContext, TArgs>
160
+ | ResolverWithResolve<TResult, TParent, TContext, TArgs>
156
161
  | StitchingResolver<TResult, TParent, TContext, TArgs>
157
162
 
158
163
  export type ResolverFn<TResult, TParent, TContext, TArgs> = (
@@ -22,7 +22,7 @@ export const resolveGenericValue = <T>(value: Value.GenericValueLike<T>): Promis
22
22
  export const resolveRowData = async <E>(
23
23
  values: ColumnValue<E>[],
24
24
  ): Promise<ResolvedColumnValue<Exclude<E, undefined>>[]> => {
25
- const valuePromises = values.map(async it => ({ ...it, resolvedValue: await it.value }))
25
+ const valuePromises = values.map(async (it): Promise<ResolvedColumnValue<E | undefined>> => ({ ...it, resolvedValue: await it.value }))
26
26
  const settledValues = await Promise.allSettled(valuePromises)
27
27
  const failed = getRejections(settledValues)
28
28
  if (failed.length > 0) {
@@ -11,64 +11,87 @@ import {
11
11
  import * as Database from '@contember/database'
12
12
  import { UniqueWhereError } from '../inputProcessing'
13
13
  import { Model } from '@contember/schema'
14
- import { ResolvedColumnValue } from './ColumnValue'
15
- import { isOwningRelation, NamingHelper } from '@contember/schema-utils'
14
+ import { isOwningRelation, isRelation, NamingHelper } from '@contember/schema-utils'
16
15
  import RelationType = Model.RelationType
17
16
 
18
- export class EnrichedError {
19
- constructor(
20
- public readonly entity: Model.Entity,
21
- public readonly values: ResolvedColumnValue[] | null,
22
- public readonly originalError: any,
23
- ) {}
24
- }
25
17
 
26
- const findConstraint = (entity: Model.Entity, constraintName: string): Model.UniqueConstraint | null => {
27
- for (const constraint of Object.values(entity.unique)) {
28
- if (constraint.name === constraintName) {
29
- return constraint
18
+ const findUniqueConstraint = (schema: Model.Schema, constraintName: string): [Model.Entity, Model.UniqueConstraint] | [null, null] => {
19
+ for (const entity of Object.values(schema.entities)) {
20
+ for (const constraint of Object.values(entity.unique)) {
21
+ if (constraint.name === constraintName) {
22
+ return [entity, constraint]
23
+ }
30
24
  }
31
25
  }
32
- for (const field of Object.values(entity.fields)) {
33
- if (
34
- field.type === RelationType.OneHasOne &&
35
- isOwningRelation(field) &&
36
- NamingHelper.createUniqueConstraintName(entity.name, [field.name]) === constraintName
37
- ) {
38
- return { name: constraintName, fields: [field.name] }
26
+ for (const entity of Object.values(schema.entities)) {
27
+ for (const field of Object.values(entity.fields)) {
28
+ if (
29
+ field.type === RelationType.OneHasOne &&
30
+ isOwningRelation(field) &&
31
+ NamingHelper.createUniqueConstraintName(entity.name, [field.name]) === constraintName
32
+ ) {
33
+ return [entity, { name: constraintName, fields: [field.name] }]
34
+ }
39
35
  }
40
36
  }
41
- return null
37
+ return [null, null]
38
+ }
39
+
40
+ type RelationInfo = {
41
+ owningEntity: Model.Entity
42
+ owningRelation: Model.Relation
43
+ targetEntity: Model.Entity
42
44
  }
43
45
 
44
- export const convertError = (e: any): MutationResult => {
45
- let entity: Model.Entity | null = null
46
- let values: ResolvedColumnValue[] | null = null
47
- if (e instanceof EnrichedError) {
48
- entity = e.entity
49
- values = e.values
50
- e = e.originalError
46
+ const findForeignConstraint = (schema: Model.Schema, constraintName: string): RelationInfo | null => {
47
+ for (const owningEntity of Object.values(schema.entities)) {
48
+ for (const field of Object.values(owningEntity.fields)) {
49
+ if (!isRelation(field) || !isOwningRelation(field) || !('joiningColumn' in field)) {
50
+ continue
51
+ }
52
+ const targetEntity = schema.entities[field.target]
53
+ const fkName = NamingHelper.createForeignKeyName(
54
+ owningEntity.tableName,
55
+ field.joiningColumn.columnName,
56
+ targetEntity.tableName,
57
+ targetEntity.primaryColumn,
58
+ )
59
+ if (fkName === constraintName) {
60
+ return { owningEntity, targetEntity, owningRelation: field }
61
+ }
62
+ }
51
63
  }
64
+ return null
65
+ }
66
+
67
+ export const convertError = (schema: Model.Schema, e: any): MutationResult => {
68
+
52
69
  if (e instanceof Database.NotNullViolationError) {
53
70
  return new MutationConstraintViolationError([], ConstraintType.notNull, e.originalMessage, [
54
71
  MutationResultHint.sqlError,
55
72
  ])
56
73
  }
57
74
  if (e instanceof Database.ForeignKeyViolationError) {
58
- return new MutationConstraintViolationError([], ConstraintType.foreignKey, e.originalMessage, [
59
- MutationResultHint.sqlError,
60
- ])
75
+ const relationInfo = e.constraint ? findForeignConstraint(schema, e.constraint) : null
76
+ const violationDetail: string = 'detail' in e.previous ? e.previous.detail : ''
77
+ const matchResult = violationDetail.match(/^Key \(.+\)=\((.+)\) is still referenced from table/)
78
+ const message = relationInfo
79
+ ? `Cannot delete ${matchResult ? `row ${matchResult[1]}` : 'unknown row'}`
80
+ + ` of entity ${relationInfo.targetEntity.name},`
81
+ + ` because it is still referenced from ${relationInfo.owningEntity.name}::${relationInfo.owningRelation.name}.`
82
+ + ' This is possibly caused by ACL denial or by missing "on delete cascade"'
83
+ : e.originalMessage
84
+ return new MutationConstraintViolationError([], ConstraintType.foreignKey, message, [MutationResultHint.sqlError])
61
85
  }
62
86
  if (e instanceof Database.UniqueViolationError) {
63
- const constraint = entity && e.constraint ? findConstraint(entity, e.constraint) : null
64
- const valuesInConstraint = constraint
65
- ? constraint.fields.map(it => values?.find(v => v.fieldName === it)?.resolvedValue)
66
- : []
67
- const message = constraint
68
- ? `Value (${valuesInConstraint.map(it => JSON.stringify(it)).join(', ')})` +
69
- ` of unique constraint (${constraint.fields.join(', ')}) already exists`
87
+ const [entity, constraint] = e.constraint ? findUniqueConstraint(schema, e.constraint) : [null, null]
88
+ const violationDetail: string = 'detail' in e.previous ? e.previous.detail : ''
89
+ const matchResult = violationDetail.match(/^Key \(.+\)=\((.+)\) already exists\.$/)
90
+ const values = matchResult?.[1]
91
+ const message = constraint && entity
92
+ ? `${values ? `Value (${values})` : 'Unknown value'}` +
93
+ ` already exists in unique columns (${constraint.fields.join(', ')}) on entity ${entity.name}`
70
94
  : e.originalMessage
71
-
72
95
  const paths = constraint ? constraint.fields.map(it => [{ field: it }]) : []
73
96
  return new MutationConstraintViolationError(paths, ConstraintType.uniqueKey, message, [MutationResultHint.sqlError])
74
97
  }
@@ -92,10 +115,10 @@ export const convertError = (e: any): MutationResult => {
92
115
  throw e
93
116
  }
94
117
 
95
- export const tryMutation = async (cb: () => Promise<MutationResultList>): Promise<MutationResultList> => {
118
+ export const tryMutation = async (schema: Model.Schema, cb: () => Promise<MutationResultList>): Promise<MutationResultList> => {
96
119
  try {
97
120
  return await cb()
98
121
  } catch (e) {
99
- return [convertError(e)]
122
+ return [convertError(schema, e)]
100
123
  }
101
124
  }
@@ -163,7 +163,7 @@ export class Mapper {
163
163
  if (entity.view) {
164
164
  throw new ImplementationException()
165
165
  }
166
- return tryMutation(() =>
166
+ return tryMutation(this.schema, () =>
167
167
  this.inserter.insert(this, entity, data, id => {
168
168
  const where = { [entity.primary]: id }
169
169
  this.primaryKeyCache[this.hashWhere(entity.name, where)] = id
@@ -180,7 +180,7 @@ export class Mapper {
180
180
  if (entity.view) {
181
181
  throw new ImplementationException()
182
182
  }
183
- return tryMutation(async () => {
183
+ return tryMutation(this.schema, async () => {
184
184
  const primaryValue = await this.getPrimaryValue(entity, by)
185
185
  if (primaryValue === undefined) {
186
186
  return [new MutationEntryNotFoundError([], by)]
@@ -195,7 +195,7 @@ export class Mapper {
195
195
  predicateFields: string[],
196
196
  builderCb: (builder: UpdateBuilder) => void,
197
197
  ): Promise<MutationResultList> {
198
- return tryMutation(async () => {
198
+ return tryMutation(this.schema, async () => {
199
199
  const primaryValue = await this.getPrimaryValue(entity, by)
200
200
  if (primaryValue === undefined) {
201
201
  return [new MutationEntryNotFoundError([], by)]
@@ -214,7 +214,7 @@ export class Mapper {
214
214
  if (entity.view) {
215
215
  throw new ImplementationException()
216
216
  }
217
- return tryMutation(async () => {
217
+ return tryMutation(this.schema, async () => {
218
218
  const primaryValue = await this.getPrimaryValue(entity, by)
219
219
  if (primaryValue === undefined) {
220
220
  return await this.inserter.insert(this, entity, create, id => {
@@ -234,7 +234,7 @@ export class Mapper {
234
234
  if (entity.view) {
235
235
  throw new ImplementationException()
236
236
  }
237
- return tryMutation(() => this.deleteExecutor.execute(this, entity, by, filter))
237
+ return tryMutation(this.schema, () => this.deleteExecutor.execute(this, entity, by, filter))
238
238
  }
239
239
 
240
240
  public async connectJunction(
@@ -177,10 +177,12 @@ export class MutationEntryNotFoundError implements MutationResultInterface {
177
177
  // possibly denied by acl
178
178
  export class MutationNoResultError implements MutationResultInterface {
179
179
  result = MutationResultType.noResultError as const
180
- hints: MutationResultHint[] = []
181
- message = undefined
182
180
 
183
- constructor(public readonly paths: Path[]) {}
181
+ constructor(
182
+ public readonly paths: Path[],
183
+ public readonly message?: string,
184
+ public readonly hints: MutationResultHint[] = [],
185
+ ) {}
184
186
  }
185
187
 
186
188
  export const prependPath = (path: Path, results: MutationResultList): MutationResultList =>
@@ -207,6 +209,7 @@ export const flattenResult = (result: (MutationResultList | MutationResultList[]
207
209
  export type ResultListNotFlatten = MutationResultList | MutationResultList[]
208
210
 
209
211
  export const collectResults = async (
212
+ schema: Model.Schema,
210
213
  mainPromise: Promise<ResultListNotFlatten | undefined> | undefined,
211
214
  otherPromises: (Promise<ResultListNotFlatten | undefined> | undefined)[],
212
215
  ): Promise<MutationResultList> => {
@@ -215,7 +218,7 @@ export const collectResults = async (
215
218
  .filter((it): it is Promise<ResultListNotFlatten> => !!it)
216
219
  .map(it =>
217
220
  it //
218
- .catch(e => [convertError(e)])
221
+ .catch(e => [convertError(schema, e)])
219
222
  .then(value => ({ value, index: index++ })),
220
223
  )
221
224
  const results = await Promise.allSettled(allPromises)
@@ -10,6 +10,7 @@ import {
10
10
  MutationEntryNotFoundError,
11
11
  MutationNoResultError,
12
12
  MutationNothingToDo,
13
+ MutationResultHint,
13
14
  MutationResultList,
14
15
  NothingToDoReason,
15
16
  } from '../Result'
@@ -35,7 +36,6 @@ export class DeleteExecutor {
35
36
  filter?: Input.OptionalWhere,
36
37
  ): Promise<MutationResultList> {
37
38
  return mapper.mutex.execute(async () => {
38
- const db = mapper.db
39
39
  await mapper.constraintHelper.setFkConstraintsDeferred()
40
40
  const primaryValue = await mapper.getPrimaryValue(entity, by)
41
41
  if (!primaryValue) {
@@ -50,15 +50,8 @@ export class DeleteExecutor {
50
50
  return [new MutationNoResultError([])]
51
51
  }
52
52
 
53
- try {
54
- await mapper.constraintHelper.setFkConstraintsImmediate()
55
- return [new MutationDeleteOk([], entity, primaryValue)]
56
- } catch (e) {
57
- if (e instanceof ForeignKeyViolationError) {
58
- return [new MutationNoResultError([])]
59
- }
60
- throw e
61
- }
53
+ await mapper.constraintHelper.setFkConstraintsImmediate()
54
+ return [new MutationDeleteOk([], entity, primaryValue)]
62
55
  })
63
56
  }
64
57
 
@@ -5,7 +5,6 @@ import { getColumnName, getColumnType } from '@contember/schema-utils'
5
5
  import { ColumnValue, ResolvedColumnValue, resolveGenericValue, resolveRowData } from '../ColumnValue'
6
6
  import { ImplementationException } from '../../exception'
7
7
  import { AbortInsert } from './Inserter'
8
- import { EnrichedError } from '../ErrorUtils'
9
8
 
10
9
  export interface InsertResult {
11
10
  values: ResolvedColumnValue[]
@@ -49,9 +48,10 @@ export class InsertBuilder {
49
48
  try {
50
49
  const resolvedData = await this.getResolvedData()
51
50
  if (resolvedData.find(it => it.resolvedValue === AbortInsert)) {
51
+ this.resolver(null)
52
52
  return { aborted: true, executed: false, primaryValue: null, values: [] }
53
53
  }
54
- resolvedDataFinal = resolvedData as ResolvedColumnValue[]
54
+
55
55
  const insertData = resolvedData.reduce<QueryBuilder.ColumnExpressionMap>(
56
56
  (result, item) => ({ ...result, [item.columnName]: expr => expr.select(['root_', item.columnName]) }),
57
57
  {},
@@ -78,7 +78,7 @@ export class InsertBuilder {
78
78
  return { values: resolvedData as ResolvedColumnValue[], executed: true, primaryValue: result, aborted: false }
79
79
  } catch (e) {
80
80
  this.resolver(null)
81
- throw new EnrichedError(this.entity, resolvedDataFinal, e)
81
+ throw e
82
82
  }
83
83
  }
84
84
  }
@@ -55,7 +55,7 @@ export class Inserter {
55
55
  new MutationCreateOk([], entity, primary, data, values)
56
56
  const insertPromise = this.executeInsert(insertBuilder, mapper.db, okResultFactory)
57
57
 
58
- return await collectResults(insertPromise, Object.values(promises))
58
+ return await collectResults(this.schema, insertPromise, Object.values(promises))
59
59
  }
60
60
 
61
61
  private async executeInsert(
@@ -63,7 +63,7 @@ export class Inserter {
63
63
  db: Client,
64
64
  okResultFactory: (primary: Value.PrimaryValue, values: RowValues) => MutationCreateOk,
65
65
  ): Promise<MutationResultList> {
66
- return tryMutation(async () => {
66
+ return tryMutation(this.schema, async () => {
67
67
  const result = await insertBuilder.execute(db)
68
68
  if (result.aborted) {
69
69
  return [new MutationNothingToDo([], NothingToDoReason.aborted)]
@@ -5,7 +5,6 @@ import { Client, Operator, QueryBuilder, UpdateBuilder as DbUpdateBuilder, Value
5
5
  import { PathFactory, WhereBuilder } from '../select'
6
6
  import { ColumnValue, ResolvedColumnValue, resolveGenericValue, resolveRowData } from '../ColumnValue'
7
7
  import { AbortUpdate } from './Updater'
8
- import { EnrichedError } from '../ErrorUtils'
9
8
 
10
9
  export interface UpdateResult {
11
10
  values: ResolvedColumnValue[]
@@ -61,9 +60,9 @@ export class UpdateBuilder {
61
60
  return { values: [], affectedRows: null, executed: false, aborted: false }
62
61
  }
63
62
  if (resolvedData.find(it => it.resolvedValue === AbortUpdate)) {
63
+ this.resolver(null)
64
64
  return { values: [], affectedRows: null, executed: false, aborted: true }
65
65
  }
66
- resolvedDataFinal = resolvedData as ResolvedColumnValue[]
67
66
 
68
67
  const qb = DbUpdateBuilder.create()
69
68
  .with('newData_', qb => {
@@ -120,7 +119,7 @@ export class UpdateBuilder {
120
119
  return { values: resolvedData as ResolvedColumnValue[], affectedRows: result, executed: true, aborted: false }
121
120
  } catch (e) {
122
121
  this.resolver(null)
123
- throw new EnrichedError(this.entity, resolvedDataFinal, e)
122
+ throw e
124
123
  }
125
124
  }
126
125
  }
@@ -52,7 +52,7 @@ export class Updater {
52
52
  const okResultFactory = (values: RowValues) => new MutationUpdateOk([], entity, primaryValue, data, values)
53
53
  const mutationResultPromise = Updater.executeUpdate(updateBuilder, mapper.db, okResultFactory)
54
54
 
55
- return await collectResults(mutationResultPromise, Object.values(promises))
55
+ return await collectResults(this.schema, mutationResultPromise, Object.values(promises))
56
56
  }
57
57
 
58
58
  public async updateCb(
@@ -64,7 +64,7 @@ export class ExecutionContainerFactory {
64
64
  .addService('inputPreValidator', ({ entityRulesResolver, columnValueResolver, dataSelector }) =>
65
65
  new InputPreValidator(this.schema.model, entityRulesResolver, columnValueResolver, dataSelector))
66
66
  .addService('mutationResolver', ({ db, mapperFactory, inputPreValidator, queryAstFactory }) =>
67
- new MutationResolver(db, mapperFactory, this.setupSystemVariables, inputPreValidator, queryAstFactory))
67
+ new MutationResolver(this.schema.model, db, mapperFactory, this.setupSystemVariables, inputPreValidator, queryAstFactory))
68
68
  .addService('validationResolver', ({ inputPreValidator, db, mapperFactory }) =>
69
69
  new ValidationResolver(db, mapperFactory, inputPreValidator))
70
70
  .build()
@@ -8,7 +8,7 @@ import {
8
8
  MapperFactory,
9
9
  MutationResultHint,
10
10
  MutationResultList,
11
- MutationResultType,
11
+ MutationResultType, tryMutation,
12
12
  } from '../mapper'
13
13
  import { ValidationResolver } from './ValidationResolver'
14
14
  import { GraphQLResolveInfo } from 'graphql'
@@ -23,8 +23,11 @@ import { executeReadOperations } from './ReadHelpers'
23
23
 
24
24
  type WithoutNode<T extends { node: any }> = Pick<T, Exclude<keyof T, 'node'>>
25
25
 
26
+ type TransactionOptions = { deferForeignKeyConstraints?: boolean }
27
+
26
28
  export class MutationResolver {
27
29
  constructor(
30
+ private readonly schema: Model.Schema,
28
31
  private readonly db: Client,
29
32
  private readonly mapperFactory: MapperFactory,
30
33
  private readonly systemVariablesSetup: (db: Client) => Promise<void>,
@@ -32,7 +35,7 @@ export class MutationResolver {
32
35
  private readonly graphqlQueryAstFactory: GraphQlQueryAstFactory,
33
36
  ) {}
34
37
 
35
- public async resolveTransaction(info: GraphQLResolveInfo): Promise<Result.TransactionResult> {
38
+ public async resolveTransaction(info: GraphQLResolveInfo, options: TransactionOptions): Promise<Result.TransactionResult> {
36
39
  const queryAst = this.graphqlQueryAstFactory.create(info, (node, path) => {
37
40
  return (
38
41
  (path.length === 1 && !['ok', 'validation', 'errorMessage', 'errors'].includes(node.name.value)) ||
@@ -57,6 +60,9 @@ export class MutationResolver {
57
60
  }))
58
61
 
59
62
  return this.transaction(async (mapper, trx) => {
63
+ if (options?.deferForeignKeyConstraints) {
64
+ await mapper.constraintHelper.setFkConstraintsDeferred()
65
+ }
60
66
  const validationResult: Record<string, Result.MutationFieldResult> = {}
61
67
  const validationErrors: Result.ValidationError[] = []
62
68
  for (const field of queryAst.fields) {
@@ -181,6 +187,16 @@ export class MutationResolver {
181
187
  }
182
188
  trxResult[field.alias] = result
183
189
  }
190
+ if (options?.deferForeignKeyConstraints) {
191
+ const constraintsResult = await tryMutation(this.schema, async () => {
192
+ await mapper.constraintHelper.setFkConstraintsImmediate()
193
+ return []
194
+ })
195
+ const errorResponse = this.createErrorResponse(constraintsResult)
196
+ if (errorResponse) {
197
+ return { ...errorResponse, ...validationResult }
198
+ }
199
+ }
184
200
 
185
201
  return { ok: true, errors: [], validation: { valid: true, errors: [] }, ...trxResult }
186
202
  })
@@ -4,7 +4,7 @@ import {
4
4
  GraphQLNonNull,
5
5
  GraphQLObjectType,
6
6
  GraphQLSchema,
7
- GraphQLString,
7
+ GraphQLString, GraphQLInputObjectType,
8
8
  } from 'graphql'
9
9
  import { Model } from '@contember/schema'
10
10
  import { MutationProvider } from './MutationProvider'
@@ -59,6 +59,16 @@ export class GraphQlSchemaBuilder {
59
59
  })
60
60
  if (mutations.size > 0) {
61
61
  mutations.set('transaction', {
62
+ args: {
63
+ options: {
64
+ type: new GraphQLInputObjectType({
65
+ name: 'MutationTransactionOptions',
66
+ fields: {
67
+ deferForeignKeyConstraints: { type: GraphQLBoolean },
68
+ },
69
+ }),
70
+ },
71
+ },
62
72
  type: new GraphQLNonNull(
63
73
  new GraphQLObjectType({
64
74
  name: 'MutationTransaction',
@@ -76,9 +86,11 @@ export class GraphQlSchemaBuilder {
76
86
  },
77
87
  }),
78
88
  ),
79
- resolve: async (parent, args, context: Context, info) => {
89
+ resolve: async (parent, args: { options?: { deferForeignKeyConstraints?: boolean } }, context: Context, info) => {
80
90
  return context.timer(`GraphQL.mutation.${info.fieldName}`, () =>
81
- context.executionContainer.mutationResolver.resolveTransaction(info),
91
+ context.executionContainer.mutationResolver.resolveTransaction(info, {
92
+ deferForeignKeyConstraints: args.options?.deferForeignKeyConstraints ?? false,
93
+ }),
82
94
  )
83
95
  },
84
96
  })
@@ -0,0 +1,46 @@
1
+ import { test } from 'uvu'
2
+ import { SchemaDefinition as def } from '@contember/schema-definition'
3
+ import { GQL } from '../../../../src/tags'
4
+ import { executeDbTest } from '@contember/engine-api-tester'
5
+
6
+ namespace Model {
7
+ @def.Unique('url')
8
+ export class Url {
9
+ url = def.stringColumn().notNull()
10
+ redirect: def.OneHasOneDefinition = def.oneHasOne(Redirect, 'url').setNullOnDelete().removeOrphan()
11
+ }
12
+
13
+ export class Redirect {
14
+ url = def.oneHasOneInverse(Url, 'redirect').notNull()
15
+
16
+ internalUrl = def.manyHasOne(Url)
17
+ }
18
+ }
19
+ test('create redirect to non-existing target', async () => {
20
+ await executeDbTest({
21
+ schema: def.createModel(Model),
22
+ query: GQL`
23
+ mutation {
24
+ createRedirect(
25
+ data: {
26
+ internalUrl: {connect: {url: "abcd"}},
27
+ url: {create: {url: "xyz"}}
28
+ }
29
+ ) {
30
+ ok
31
+ errorMessage
32
+ }
33
+ }
34
+ `,
35
+ seed: [],
36
+ expectDatabase: {},
37
+ return: {
38
+ createRedirect: {
39
+ ok: false,
40
+ errorMessage: 'Execution has failed:\ninternalUrl: NotFoundOrDenied (for input {"url":"abcd"})',
41
+ },
42
+ },
43
+ })
44
+ })
45
+
46
+ test.run()