@contember/engine-content-api 1.2.0-rc.3 → 1.3.0-alpha.1

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 (390) hide show
  1. package/dist/src/input-validation/preValidation/CreateInputPreValidationProcessor.d.ts.map +1 -1
  2. package/dist/src/input-validation/preValidation/CreateInputPreValidationProcessor.js +6 -0
  3. package/dist/src/input-validation/preValidation/CreateInputPreValidationProcessor.js.map +1 -1
  4. package/dist/src/input-validation/preValidation/UpdateInputPreValidationProcessor.d.ts.map +1 -1
  5. package/dist/src/input-validation/preValidation/UpdateInputPreValidationProcessor.js +6 -0
  6. package/dist/src/input-validation/preValidation/UpdateInputPreValidationProcessor.js.map +1 -1
  7. package/dist/src/inputProcessing/CreateInputProcessor.d.ts +27 -9
  8. package/dist/src/inputProcessing/CreateInputProcessor.d.ts.map +1 -1
  9. package/dist/src/inputProcessing/CreateInputVisitor.d.ts.map +1 -1
  10. package/dist/src/inputProcessing/CreateInputVisitor.js +10 -2
  11. package/dist/src/inputProcessing/CreateInputVisitor.js.map +1 -1
  12. package/dist/src/inputProcessing/UniqueWhereExpander.d.ts +2 -1
  13. package/dist/src/inputProcessing/UniqueWhereExpander.d.ts.map +1 -1
  14. package/dist/src/inputProcessing/UniqueWhereExpander.js +4 -0
  15. package/dist/src/inputProcessing/UniqueWhereExpander.js.map +1 -1
  16. package/dist/src/inputProcessing/UpdateInputProcessor.d.ts +41 -16
  17. package/dist/src/inputProcessing/UpdateInputProcessor.d.ts.map +1 -1
  18. package/dist/src/inputProcessing/UpdateInputVisitor.d.ts.map +1 -1
  19. package/dist/src/inputProcessing/UpdateInputVisitor.js +7 -2
  20. package/dist/src/inputProcessing/UpdateInputVisitor.js.map +1 -1
  21. package/dist/src/mapper/DataManipulationBuilder.d.ts +7 -0
  22. package/dist/src/mapper/DataManipulationBuilder.d.ts.map +1 -0
  23. package/dist/src/mapper/DataManipulationBuilder.js +5 -0
  24. package/dist/src/mapper/DataManipulationBuilder.js.map +1 -0
  25. package/dist/src/mapper/Mapper.d.ts +9 -14
  26. package/dist/src/mapper/Mapper.d.ts.map +1 -1
  27. package/dist/src/mapper/Mapper.js +48 -15
  28. package/dist/src/mapper/Mapper.js.map +1 -1
  29. package/dist/src/mapper/MapperContainer.d.ts.map +1 -1
  30. package/dist/src/mapper/MapperContainer.js +3 -3
  31. package/dist/src/mapper/MapperContainer.js.map +1 -1
  32. package/dist/src/mapper/Result.d.ts +2 -2
  33. package/dist/src/mapper/Result.d.ts.map +1 -1
  34. package/dist/src/mapper/Result.js.map +1 -1
  35. package/dist/src/mapper/delete/DeleteExecutor.d.ts +12 -5
  36. package/dist/src/mapper/delete/DeleteExecutor.d.ts.map +1 -1
  37. package/dist/src/mapper/delete/DeleteExecutor.js +143 -77
  38. package/dist/src/mapper/delete/DeleteExecutor.js.map +1 -1
  39. package/dist/src/mapper/delete/DeleteState.d.ts +22 -0
  40. package/dist/src/mapper/delete/DeleteState.d.ts.map +1 -0
  41. package/dist/src/mapper/delete/DeleteState.js +68 -0
  42. package/dist/src/mapper/delete/DeleteState.js.map +1 -0
  43. package/dist/src/mapper/delete/DeletedEntitiesStorage.d.ts +1 -0
  44. package/dist/src/mapper/delete/DeletedEntitiesStorage.d.ts.map +1 -1
  45. package/dist/src/mapper/delete/DeletedEntitiesStorage.js +5 -0
  46. package/dist/src/mapper/delete/DeletedEntitiesStorage.js.map +1 -1
  47. package/dist/src/mapper/delete/helpers.d.ts +11 -0
  48. package/dist/src/mapper/delete/helpers.d.ts.map +1 -0
  49. package/dist/src/mapper/delete/helpers.js +49 -0
  50. package/dist/src/mapper/delete/helpers.js.map +1 -0
  51. package/dist/src/mapper/insert/InsertBuilder.d.ts +8 -5
  52. package/dist/src/mapper/insert/InsertBuilder.d.ts.map +1 -1
  53. package/dist/src/mapper/insert/InsertBuilder.js +16 -9
  54. package/dist/src/mapper/insert/InsertBuilder.js.map +1 -1
  55. package/dist/src/mapper/insert/InsertBuilderFactory.d.ts +3 -1
  56. package/dist/src/mapper/insert/InsertBuilderFactory.d.ts.map +1 -1
  57. package/dist/src/mapper/insert/InsertBuilderFactory.js +3 -2
  58. package/dist/src/mapper/insert/InsertBuilderFactory.js.map +1 -1
  59. package/dist/src/mapper/insert/Inserter.d.ts +3 -6
  60. package/dist/src/mapper/insert/Inserter.d.ts.map +1 -1
  61. package/dist/src/mapper/insert/Inserter.js +6 -9
  62. package/dist/src/mapper/insert/Inserter.js.map +1 -1
  63. package/dist/src/mapper/insert/SqlCreateInputProcessor.d.ts +5 -0
  64. package/dist/src/mapper/insert/SqlCreateInputProcessor.d.ts.map +1 -1
  65. package/dist/src/mapper/insert/SqlCreateInputProcessor.js +54 -120
  66. package/dist/src/mapper/insert/SqlCreateInputProcessor.js.map +1 -1
  67. package/dist/src/mapper/relations/ManyHasManyInputProcessor.d.ts +32 -0
  68. package/dist/src/mapper/relations/ManyHasManyInputProcessor.d.ts.map +1 -0
  69. package/dist/src/mapper/relations/ManyHasManyInputProcessor.js +77 -0
  70. package/dist/src/mapper/relations/ManyHasManyInputProcessor.js.map +1 -0
  71. package/dist/src/mapper/relations/ManyHasOneInputProcessor.d.ts +32 -0
  72. package/dist/src/mapper/relations/ManyHasOneInputProcessor.d.ts.map +1 -0
  73. package/dist/src/mapper/relations/ManyHasOneInputProcessor.js +108 -0
  74. package/dist/src/mapper/relations/ManyHasOneInputProcessor.js.map +1 -0
  75. package/dist/src/mapper/relations/OneHasManyInputProcessor.d.ts +29 -0
  76. package/dist/src/mapper/relations/OneHasManyInputProcessor.d.ts.map +1 -0
  77. package/dist/src/mapper/relations/OneHasManyInputProcessor.js +61 -0
  78. package/dist/src/mapper/relations/OneHasManyInputProcessor.js.map +1 -0
  79. package/dist/src/mapper/relations/OneHasOneInverseCreateInputProcessor.d.ts +21 -0
  80. package/dist/src/mapper/relations/OneHasOneInverseCreateInputProcessor.d.ts.map +1 -0
  81. package/dist/src/mapper/relations/OneHasOneInverseCreateInputProcessor.js +74 -0
  82. package/dist/src/mapper/relations/OneHasOneInverseCreateInputProcessor.js.map +1 -0
  83. package/dist/src/mapper/relations/OneHasOneInverseUpdateInputProcessor.d.ts +32 -0
  84. package/dist/src/mapper/relations/OneHasOneInverseUpdateInputProcessor.d.ts.map +1 -0
  85. package/dist/src/mapper/relations/OneHasOneInverseUpdateInputProcessor.js +125 -0
  86. package/dist/src/mapper/relations/OneHasOneInverseUpdateInputProcessor.js.map +1 -0
  87. package/dist/src/mapper/relations/OneHasOneOwningCreateInputProcessor.d.ts +21 -0
  88. package/dist/src/mapper/relations/OneHasOneOwningCreateInputProcessor.d.ts.map +1 -0
  89. package/dist/src/mapper/relations/OneHasOneOwningCreateInputProcessor.js +72 -0
  90. package/dist/src/mapper/relations/OneHasOneOwningCreateInputProcessor.js.map +1 -0
  91. package/dist/src/mapper/relations/OneHasOneOwningUpdateInputProcessor.d.ts +37 -0
  92. package/dist/src/mapper/relations/OneHasOneOwningUpdateInputProcessor.d.ts.map +1 -0
  93. package/dist/src/mapper/relations/OneHasOneOwningUpdateInputProcessor.js +193 -0
  94. package/dist/src/mapper/relations/OneHasOneOwningUpdateInputProcessor.js.map +1 -0
  95. package/dist/src/mapper/select/JoinBuilder.d.ts +1 -1
  96. package/dist/src/mapper/select/JoinBuilder.d.ts.map +1 -1
  97. package/dist/src/mapper/select/JoinBuilder.js.map +1 -1
  98. package/dist/src/mapper/select/WhereBuilder.d.ts +2 -2
  99. package/dist/src/mapper/select/WhereBuilder.d.ts.map +1 -1
  100. package/dist/src/mapper/select/WhereBuilder.js.map +1 -1
  101. package/dist/src/mapper/select/optimizer/WhereOptimizer.d.ts.map +1 -1
  102. package/dist/src/mapper/select/optimizer/WhereOptimizer.js +3 -1
  103. package/dist/src/mapper/select/optimizer/WhereOptimizer.js.map +1 -1
  104. package/dist/src/mapper/select/optimizer/WhereReplacer.d.ts +3 -1
  105. package/dist/src/mapper/select/optimizer/WhereReplacer.d.ts.map +1 -1
  106. package/dist/src/mapper/select/optimizer/WhereReplacer.js +42 -18
  107. package/dist/src/mapper/select/optimizer/WhereReplacer.js.map +1 -1
  108. package/dist/src/mapper/update/SqlUpdateInputProcessor.d.ts +5 -0
  109. package/dist/src/mapper/update/SqlUpdateInputProcessor.d.ts.map +1 -1
  110. package/dist/src/mapper/update/SqlUpdateInputProcessor.js +52 -389
  111. package/dist/src/mapper/update/SqlUpdateInputProcessor.js.map +1 -1
  112. package/dist/src/mapper/update/UpdateBuilder.d.ts +7 -4
  113. package/dist/src/mapper/update/UpdateBuilder.d.ts.map +1 -1
  114. package/dist/src/mapper/update/UpdateBuilder.js +18 -12
  115. package/dist/src/mapper/update/UpdateBuilder.js.map +1 -1
  116. package/dist/src/mapper/update/UpdateBuilderFactory.d.ts +3 -1
  117. package/dist/src/mapper/update/UpdateBuilderFactory.d.ts.map +1 -1
  118. package/dist/src/mapper/update/UpdateBuilderFactory.js +3 -2
  119. package/dist/src/mapper/update/UpdateBuilderFactory.js.map +1 -1
  120. package/dist/src/mapper/update/Updater.d.ts +1 -4
  121. package/dist/src/mapper/update/Updater.d.ts.map +1 -1
  122. package/dist/src/mapper/update/Updater.js +11 -13
  123. package/dist/src/mapper/update/Updater.js.map +1 -1
  124. package/dist/src/resolvers/MutationResolver.js +1 -1
  125. package/dist/src/resolvers/MutationResolver.js.map +1 -1
  126. package/dist/src/schema/GraphQlSchemaBuilderFactory.d.ts +3 -0
  127. package/dist/src/schema/GraphQlSchemaBuilderFactory.d.ts.map +1 -1
  128. package/dist/src/schema/GraphQlSchemaBuilderFactory.js +4 -2
  129. package/dist/src/schema/GraphQlSchemaBuilderFactory.js.map +1 -1
  130. package/dist/src/schema/mutations/ConnectOrCreateRelationInputProvider.d.ts +15 -0
  131. package/dist/src/schema/mutations/ConnectOrCreateRelationInputProvider.d.ts.map +1 -0
  132. package/dist/src/schema/mutations/ConnectOrCreateRelationInputProvider.js +43 -0
  133. package/dist/src/schema/mutations/ConnectOrCreateRelationInputProvider.js.map +1 -0
  134. package/dist/src/schema/mutations/CreateEntityInputFieldVisitor.d.ts.map +1 -1
  135. package/dist/src/schema/mutations/CreateEntityInputFieldVisitor.js +2 -6
  136. package/dist/src/schema/mutations/CreateEntityInputFieldVisitor.js.map +1 -1
  137. package/dist/src/schema/mutations/CreateEntityRelationAllowedOperationsVisitor.d.ts.map +1 -1
  138. package/dist/src/schema/mutations/CreateEntityRelationAllowedOperationsVisitor.js +3 -0
  139. package/dist/src/schema/mutations/CreateEntityRelationAllowedOperationsVisitor.js.map +1 -1
  140. package/dist/src/schema/mutations/CreateEntityRelationInputFieldVisitor.d.ts +3 -1
  141. package/dist/src/schema/mutations/CreateEntityRelationInputFieldVisitor.d.ts.map +1 -1
  142. package/dist/src/schema/mutations/CreateEntityRelationInputFieldVisitor.js +15 -8
  143. package/dist/src/schema/mutations/CreateEntityRelationInputFieldVisitor.js.map +1 -1
  144. package/dist/src/schema/mutations/EntityInputProvider.d.ts.map +1 -1
  145. package/dist/src/schema/mutations/EntityInputProvider.js +0 -3
  146. package/dist/src/schema/mutations/EntityInputProvider.js.map +1 -1
  147. package/dist/src/schema/mutations/UpdateEntityInputFieldVisitor.d.ts.map +1 -1
  148. package/dist/src/schema/mutations/UpdateEntityInputFieldVisitor.js +2 -6
  149. package/dist/src/schema/mutations/UpdateEntityInputFieldVisitor.js.map +1 -1
  150. package/dist/src/schema/mutations/UpdateEntityRelationAllowedOperationsVisitor.d.ts.map +1 -1
  151. package/dist/src/schema/mutations/UpdateEntityRelationAllowedOperationsVisitor.js +3 -0
  152. package/dist/src/schema/mutations/UpdateEntityRelationAllowedOperationsVisitor.js.map +1 -1
  153. package/dist/src/schema/mutations/UpdateEntityRelationInputFieldVisitor.d.ts +3 -1
  154. package/dist/src/schema/mutations/UpdateEntityRelationInputFieldVisitor.d.ts.map +1 -1
  155. package/dist/src/schema/mutations/UpdateEntityRelationInputFieldVisitor.js +11 -22
  156. package/dist/src/schema/mutations/UpdateEntityRelationInputFieldVisitor.js.map +1 -1
  157. package/dist/src/tsconfig.tsbuildinfo +1 -1
  158. package/dist/tests/cases/integration/graphQlDb/update/deferedConstraints.test.js +2 -2
  159. package/dist/tests/cases/integration/graphQlDb/update/deferedConstraints.test.js.map +1 -1
  160. package/dist/tests/cases/integration/graphQlDb/update/failedDelete.test.js +1 -1
  161. package/dist/tests/cases/integration/graphQlDb/update/failedDelete.test.js.map +1 -1
  162. package/dist/tests/cases/integration/graphQlDb/update/nullChecksNotNull.test.js +1 -1
  163. package/dist/tests/cases/integration/graphQlDb/update/nullChecksNotNull.test.js.map +1 -1
  164. package/dist/tests/cases/integration/graphQlDb/update/nullChecksNullable.test.js +0 -3
  165. package/dist/tests/cases/integration/graphQlDb/update/nullChecksNullable.test.js.map +1 -1
  166. package/dist/tests/cases/integration/graphQlRequests/delete/aclDelete.test.js +13 -32
  167. package/dist/tests/cases/integration/graphQlRequests/delete/aclDelete.test.js.map +1 -1
  168. package/dist/tests/cases/integration/graphQlRequests/delete/additionalDeleteFilter.test.js +11 -30
  169. package/dist/tests/cases/integration/graphQlRequests/delete/additionalDeleteFilter.test.js.map +1 -1
  170. package/dist/tests/cases/integration/graphQlRequests/delete/cascadeDelete.test.js +62 -45
  171. package/dist/tests/cases/integration/graphQlRequests/delete/cascadeDelete.test.js.map +1 -1
  172. package/dist/tests/cases/integration/graphQlRequests/delete/deleteById.test.js +10 -11
  173. package/dist/tests/cases/integration/graphQlRequests/delete/deleteById.test.js.map +1 -1
  174. package/dist/tests/cases/integration/graphQlRequests/delete/orphanRemoval.test.js +29 -18
  175. package/dist/tests/cases/integration/graphQlRequests/delete/orphanRemoval.test.js.map +1 -1
  176. package/dist/tests/cases/integration/graphQlRequests/delete/restrictOnDelete.test.d.ts +2 -0
  177. package/dist/tests/cases/integration/graphQlRequests/delete/restrictOnDelete.test.d.ts.map +1 -0
  178. package/dist/tests/cases/integration/graphQlRequests/delete/restrictOnDelete.test.js +97 -0
  179. package/dist/tests/cases/integration/graphQlRequests/delete/restrictOnDelete.test.js.map +1 -0
  180. package/dist/tests/cases/integration/graphQlRequests/delete/setNullOnDelete.test.js +58 -22
  181. package/dist/tests/cases/integration/graphQlRequests/delete/setNullOnDelete.test.js.map +1 -1
  182. package/dist/tests/cases/integration/graphQlRequests/insert/manyHasManyInverse/create.test.d.ts +2 -0
  183. package/dist/tests/cases/integration/graphQlRequests/insert/manyHasManyInverse/create.test.d.ts.map +1 -0
  184. package/dist/tests/cases/integration/graphQlRequests/insert/manyHasManyInverse/{insertRelationCreate.test.js → create.test.js} +1 -1
  185. package/dist/tests/cases/integration/graphQlRequests/insert/manyHasManyInverse/create.test.js.map +1 -0
  186. package/dist/tests/cases/integration/graphQlRequests/insert/manyHasManyOwning/create.test.d.ts +2 -0
  187. package/dist/tests/cases/integration/graphQlRequests/insert/manyHasManyOwning/create.test.d.ts.map +1 -0
  188. package/dist/tests/cases/integration/graphQlRequests/insert/manyHasManyOwning/{insertRelationCreate.test.js → create.test.js} +1 -1
  189. package/dist/tests/cases/integration/graphQlRequests/insert/manyHasManyOwning/create.test.js.map +1 -0
  190. package/dist/tests/cases/integration/graphQlRequests/insert/manyHasOne/connectOrCreate.test.d.ts +2 -0
  191. package/dist/tests/cases/integration/graphQlRequests/insert/manyHasOne/connectOrCreate.test.d.ts.map +1 -0
  192. package/dist/tests/cases/integration/graphQlRequests/insert/manyHasOne/connectOrCreate.test.js +99 -0
  193. package/dist/tests/cases/integration/graphQlRequests/insert/manyHasOne/connectOrCreate.test.js.map +1 -0
  194. package/dist/tests/cases/integration/graphQlRequests/insert/manyHasOne/create.test.d.ts +2 -0
  195. package/dist/tests/cases/integration/graphQlRequests/insert/manyHasOne/create.test.d.ts.map +1 -0
  196. package/dist/tests/cases/integration/graphQlRequests/insert/manyHasOne/{insertRelationCreate.test.js → create.test.js} +1 -1
  197. package/dist/tests/cases/integration/graphQlRequests/insert/manyHasOne/create.test.js.map +1 -0
  198. package/dist/tests/cases/integration/graphQlRequests/insert/oneHasMany/connect.test.d.ts +2 -0
  199. package/dist/tests/cases/integration/graphQlRequests/insert/oneHasMany/connect.test.d.ts.map +1 -0
  200. package/dist/tests/cases/integration/graphQlRequests/insert/oneHasMany/{insertRelationConnect.test.js → connect.test.js} +1 -1
  201. package/dist/tests/cases/integration/graphQlRequests/insert/oneHasMany/connect.test.js.map +1 -0
  202. package/dist/tests/cases/integration/graphQlRequests/insert/oneHasMany/create.test.d.ts +2 -0
  203. package/dist/tests/cases/integration/graphQlRequests/insert/oneHasMany/create.test.d.ts.map +1 -0
  204. package/dist/tests/cases/integration/graphQlRequests/insert/oneHasMany/{insertRelationCreate.test.js → create.test.js} +1 -1
  205. package/dist/tests/cases/integration/graphQlRequests/insert/oneHasMany/create.test.js.map +1 -0
  206. package/dist/tests/cases/integration/graphQlRequests/insert/oneHasOneInverse/create.test.d.ts +2 -0
  207. package/dist/tests/cases/integration/graphQlRequests/insert/oneHasOneInverse/create.test.d.ts.map +1 -0
  208. package/dist/tests/cases/integration/graphQlRequests/insert/oneHasOneInverse/{insertRelationCreate.test.js → create.test.js} +1 -1
  209. package/dist/tests/cases/integration/graphQlRequests/insert/oneHasOneInverse/create.test.js.map +1 -0
  210. package/dist/tests/cases/integration/graphQlRequests/insert/oneHasOneOwning/create.test.d.ts +2 -0
  211. package/dist/tests/cases/integration/graphQlRequests/insert/oneHasOneOwning/create.test.d.ts.map +1 -0
  212. package/dist/tests/cases/integration/graphQlRequests/insert/oneHasOneOwning/{insertRelationCreate.test.js → create.test.js} +1 -1
  213. package/dist/tests/cases/integration/graphQlRequests/insert/oneHasOneOwning/create.test.js.map +1 -0
  214. package/dist/tests/cases/integration/graphQlRequests/insert/oneHasOneOwning/empty.test.d.ts +2 -0
  215. package/dist/tests/cases/integration/graphQlRequests/insert/oneHasOneOwning/empty.test.d.ts.map +1 -0
  216. package/dist/tests/cases/integration/graphQlRequests/insert/oneHasOneOwning/{insertRelationEmpty.test.js → empty.test.js} +1 -1
  217. package/dist/tests/cases/integration/graphQlRequests/insert/oneHasOneOwning/empty.test.js.map +1 -0
  218. package/dist/tests/cases/integration/graphQlRequests/update/manyHasManyInverse/delete.test.js +49 -11
  219. package/dist/tests/cases/integration/graphQlRequests/update/manyHasManyInverse/delete.test.js.map +1 -1
  220. package/dist/tests/cases/integration/graphQlRequests/update/manyHasManyOwning/delete.test.js +49 -11
  221. package/dist/tests/cases/integration/graphQlRequests/update/manyHasManyOwning/delete.test.js.map +1 -1
  222. package/dist/tests/cases/integration/graphQlRequests/update/manyHasOne/delete.test.js +83 -49
  223. package/dist/tests/cases/integration/graphQlRequests/update/manyHasOne/delete.test.js.map +1 -1
  224. package/dist/tests/cases/integration/graphQlRequests/update/oneHasMany/combination.test.js +10 -11
  225. package/dist/tests/cases/integration/graphQlRequests/update/oneHasMany/combination.test.js.map +1 -1
  226. package/dist/tests/cases/integration/graphQlRequests/update/oneHasMany/delete.test.js +49 -11
  227. package/dist/tests/cases/integration/graphQlRequests/update/oneHasMany/delete.test.js.map +1 -1
  228. package/dist/tests/cases/integration/graphQlRequests/update/oneHasOneInverse/connect.test.js +103 -0
  229. package/dist/tests/cases/integration/graphQlRequests/update/oneHasOneInverse/connect.test.js.map +1 -1
  230. package/dist/tests/cases/integration/graphQlRequests/update/oneHasOneInverse/create.test.js +20 -14
  231. package/dist/tests/cases/integration/graphQlRequests/update/oneHasOneInverse/create.test.js.map +1 -1
  232. package/dist/tests/cases/integration/graphQlRequests/update/oneHasOneInverse/delete.test.js +101 -11
  233. package/dist/tests/cases/integration/graphQlRequests/update/oneHasOneInverse/delete.test.js.map +1 -1
  234. package/dist/tests/cases/integration/graphQlRequests/update/oneHasOneInverse/disconnect.test.js +17 -11
  235. package/dist/tests/cases/integration/graphQlRequests/update/oneHasOneInverse/disconnect.test.js.map +1 -1
  236. package/dist/tests/cases/integration/graphQlRequests/update/oneHasOneInverse/schema.d.ts +1 -0
  237. package/dist/tests/cases/integration/graphQlRequests/update/oneHasOneInverse/schema.d.ts.map +1 -1
  238. package/dist/tests/cases/integration/graphQlRequests/update/oneHasOneInverse/schema.js +9 -1
  239. package/dist/tests/cases/integration/graphQlRequests/update/oneHasOneInverse/schema.js.map +1 -1
  240. package/dist/tests/cases/integration/graphQlRequests/update/oneHasOneInverse/upsert.test.js +8 -6
  241. package/dist/tests/cases/integration/graphQlRequests/update/oneHasOneInverse/upsert.test.js.map +1 -1
  242. package/dist/tests/cases/integration/graphQlRequests/update/oneHasOneOwning/connect.test.js +76 -0
  243. package/dist/tests/cases/integration/graphQlRequests/update/oneHasOneOwning/connect.test.js.map +1 -1
  244. package/dist/tests/cases/integration/graphQlRequests/update/oneHasOneOwning/connectOrCreate.test.d.ts +2 -0
  245. package/dist/tests/cases/integration/graphQlRequests/update/oneHasOneOwning/connectOrCreate.test.d.ts.map +1 -0
  246. package/dist/tests/cases/integration/graphQlRequests/update/oneHasOneOwning/connectOrCreate.test.js +53 -0
  247. package/dist/tests/cases/integration/graphQlRequests/update/oneHasOneOwning/connectOrCreate.test.js.map +1 -0
  248. package/dist/tests/cases/integration/graphQlRequests/update/oneHasOneOwning/create.test.js +80 -0
  249. package/dist/tests/cases/integration/graphQlRequests/update/oneHasOneOwning/create.test.js.map +1 -1
  250. package/dist/tests/cases/integration/graphQlRequests/update/oneHasOneOwning/delete.test.js +66 -25
  251. package/dist/tests/cases/integration/graphQlRequests/update/oneHasOneOwning/delete.test.js.map +1 -1
  252. package/dist/tests/cases/integration/graphQlRequests/update/oneHasOneOwning/schema.d.ts +1 -0
  253. package/dist/tests/cases/integration/graphQlRequests/update/oneHasOneOwning/schema.d.ts.map +1 -1
  254. package/dist/tests/cases/integration/graphQlRequests/update/oneHasOneOwning/schema.js +10 -2
  255. package/dist/tests/cases/integration/graphQlRequests/update/oneHasOneOwning/schema.js.map +1 -1
  256. package/dist/tests/cases/integration/graphQlSchema/schema-acl-allowed.gql +14 -1
  257. package/dist/tests/cases/integration/graphQlSchema/schema-acl-restricted-create.gql +5 -5
  258. package/dist/tests/cases/integration/graphQlSchema/schema-acl-restricted-delete.gql +14 -1
  259. package/dist/tests/cases/integration/graphQlSchema/schema-acl-restricted-update.gql +12 -0
  260. package/dist/tests/cases/integration/graphQlSchema/schema-basic.gql +40 -2
  261. package/dist/tests/cases/integration/graphQlSchema/schema-bug-66.gql +30 -3
  262. package/dist/tests/cases/integration/graphQlSchema/schema-custom-primary.gql +40 -2
  263. package/dist/tests/cases/integration/graphQlSchema/schema-has-many-reduction.gql +14 -1
  264. package/dist/tests/cases/integration/graphQlSchema/schema-new-builder.gql +40 -2
  265. package/dist/tests/cases/unit/whereOptimizer.test.js +114 -13
  266. package/dist/tests/cases/unit/whereOptimizer.test.js.map +1 -1
  267. package/dist/tests/src/test.d.ts +0 -1
  268. package/dist/tests/src/test.d.ts.map +1 -1
  269. package/dist/tests/src/test.js +1 -27
  270. package/dist/tests/src/test.js.map +1 -1
  271. package/dist/tests/src/testGraphql.js +1 -1
  272. package/dist/tests/src/testGraphql.js.map +1 -1
  273. package/dist/tests/tsconfig.tsbuildinfo +1 -1
  274. package/package.json +11 -11
  275. package/src/input-validation/preValidation/CreateInputPreValidationProcessor.ts +6 -0
  276. package/src/input-validation/preValidation/UpdateInputPreValidationProcessor.ts +6 -0
  277. package/src/inputProcessing/CreateInputProcessor.ts +8 -11
  278. package/src/inputProcessing/CreateInputVisitor.ts +11 -2
  279. package/src/inputProcessing/UniqueWhereExpander.ts +5 -1
  280. package/src/inputProcessing/UpdateInputProcessor.ts +18 -18
  281. package/src/inputProcessing/UpdateInputVisitor.ts +6 -2
  282. package/src/mapper/DataManipulationBuilder.ts +12 -0
  283. package/src/mapper/Mapper.ts +75 -47
  284. package/src/mapper/MapperContainer.ts +10 -6
  285. package/src/mapper/Result.ts +1 -1
  286. package/src/mapper/delete/DeleteExecutor.ts +221 -95
  287. package/src/mapper/delete/DeleteState.ts +80 -0
  288. package/src/mapper/delete/DeletedEntitiesStorage.ts +6 -0
  289. package/src/mapper/delete/helpers.ts +68 -0
  290. package/src/mapper/insert/InsertBuilder.ts +23 -12
  291. package/src/mapper/insert/InsertBuilderFactory.ts +3 -1
  292. package/src/mapper/insert/Inserter.ts +6 -10
  293. package/src/mapper/insert/SqlCreateInputProcessor.ts +61 -139
  294. package/src/mapper/relations/ManyHasManyInputProcessor.ts +108 -0
  295. package/src/mapper/relations/ManyHasOneInputProcessor.ts +158 -0
  296. package/src/mapper/relations/OneHasManyInputProcessor.ts +101 -0
  297. package/src/mapper/relations/OneHasOneInverseCreateInputProcessor.ts +99 -0
  298. package/src/mapper/relations/OneHasOneInverseUpdateInputProcessor.ts +164 -0
  299. package/src/mapper/relations/OneHasOneOwningCreateInputProcessor.ts +92 -0
  300. package/src/mapper/relations/OneHasOneOwningUpdateInputProcessor.ts +253 -0
  301. package/src/mapper/select/JoinBuilder.ts +4 -4
  302. package/src/mapper/select/WhereBuilder.ts +11 -11
  303. package/src/mapper/select/optimizer/WhereOptimizer.ts +3 -1
  304. package/src/mapper/select/optimizer/WhereReplacer.ts +45 -18
  305. package/src/mapper/update/SqlUpdateInputProcessor.ts +55 -484
  306. package/src/mapper/update/UpdateBuilder.ts +22 -15
  307. package/src/mapper/update/UpdateBuilderFactory.ts +10 -1
  308. package/src/mapper/update/Updater.ts +10 -19
  309. package/src/resolvers/MutationResolver.ts +1 -1
  310. package/src/schema/GraphQlSchemaBuilderFactory.ts +7 -4
  311. package/src/schema/mutations/ConnectOrCreateRelationInputProvider.ts +54 -0
  312. package/src/schema/mutations/CreateEntityInputFieldVisitor.ts +2 -6
  313. package/src/schema/mutations/CreateEntityRelationAllowedOperationsVisitor.ts +3 -1
  314. package/src/schema/mutations/CreateEntityRelationInputFieldVisitor.ts +20 -15
  315. package/src/schema/mutations/EntityInputProvider.ts +0 -3
  316. package/src/schema/mutations/UpdateEntityInputFieldVisitor.ts +2 -6
  317. package/src/schema/mutations/UpdateEntityRelationAllowedOperationsVisitor.ts +3 -1
  318. package/src/schema/mutations/UpdateEntityRelationInputFieldVisitor.ts +52 -57
  319. package/tests/cases/integration/graphQlDb/update/deferedConstraints.test.ts +2 -2
  320. package/tests/cases/integration/graphQlDb/update/failedDelete.test.ts +1 -1
  321. package/tests/cases/integration/graphQlDb/update/nullChecksNotNull.test.ts +1 -1
  322. package/tests/cases/integration/graphQlDb/update/nullChecksNullable.test.ts +0 -3
  323. package/tests/cases/integration/graphQlRequests/delete/aclDelete.test.ts +15 -34
  324. package/tests/cases/integration/graphQlRequests/delete/additionalDeleteFilter.test.ts +12 -31
  325. package/tests/cases/integration/graphQlRequests/delete/cascadeDelete.test.ts +68 -46
  326. package/tests/cases/integration/graphQlRequests/delete/deleteById.test.ts +11 -12
  327. package/tests/cases/integration/graphQlRequests/delete/orphanRemoval.test.ts +30 -19
  328. package/tests/cases/integration/graphQlRequests/delete/restrictOnDelete.test.ts +102 -0
  329. package/tests/cases/integration/graphQlRequests/delete/setNullOnDelete.test.ts +63 -23
  330. package/tests/cases/integration/graphQlRequests/insert/manyHasManyInverse/{insertRelationCreate.test.ts → create.test.ts} +0 -0
  331. package/tests/cases/integration/graphQlRequests/insert/manyHasManyOwning/{insertRelationCreate.test.ts → create.test.ts} +0 -0
  332. package/tests/cases/integration/graphQlRequests/insert/manyHasOne/connectOrCreate.test.ts +106 -0
  333. package/tests/cases/integration/graphQlRequests/insert/manyHasOne/{insertRelationCreate.test.ts → create.test.ts} +0 -0
  334. package/tests/cases/integration/graphQlRequests/insert/oneHasMany/{insertRelationConnect.test.ts → connect.test.ts} +0 -0
  335. package/tests/cases/integration/graphQlRequests/insert/oneHasMany/{insertRelationCreate.test.ts → create.test.ts} +0 -0
  336. package/tests/cases/integration/graphQlRequests/insert/oneHasOneInverse/{insertRelationCreate.test.ts → create.test.ts} +0 -0
  337. package/tests/cases/integration/graphQlRequests/insert/oneHasOneOwning/{insertRelationCreate.test.ts → create.test.ts} +0 -0
  338. package/tests/cases/integration/graphQlRequests/insert/oneHasOneOwning/{insertRelationEmpty.test.ts → empty.test.ts} +0 -0
  339. package/tests/cases/integration/graphQlRequests/update/manyHasManyInverse/delete.test.ts +51 -12
  340. package/tests/cases/integration/graphQlRequests/update/manyHasManyOwning/delete.test.ts +51 -12
  341. package/tests/cases/integration/graphQlRequests/update/manyHasOne/delete.test.ts +86 -50
  342. package/tests/cases/integration/graphQlRequests/update/oneHasMany/combination.test.ts +11 -12
  343. package/tests/cases/integration/graphQlRequests/update/oneHasMany/delete.test.ts +51 -12
  344. package/tests/cases/integration/graphQlRequests/update/oneHasOneInverse/connect.test.ts +106 -1
  345. package/tests/cases/integration/graphQlRequests/update/oneHasOneInverse/create.test.ts +20 -14
  346. package/tests/cases/integration/graphQlRequests/update/oneHasOneInverse/delete.test.ts +106 -12
  347. package/tests/cases/integration/graphQlRequests/update/oneHasOneInverse/disconnect.test.ts +17 -11
  348. package/tests/cases/integration/graphQlRequests/update/oneHasOneInverse/schema.ts +13 -0
  349. package/tests/cases/integration/graphQlRequests/update/oneHasOneInverse/upsert.test.ts +8 -6
  350. package/tests/cases/integration/graphQlRequests/update/oneHasOneOwning/connect.test.ts +80 -1
  351. package/tests/cases/integration/graphQlRequests/update/oneHasOneOwning/connectOrCreate.test.ts +51 -0
  352. package/tests/cases/integration/graphQlRequests/update/oneHasOneOwning/create.test.ts +81 -1
  353. package/tests/cases/integration/graphQlRequests/update/oneHasOneOwning/delete.test.ts +69 -26
  354. package/tests/cases/integration/graphQlRequests/update/oneHasOneOwning/schema.ts +14 -1
  355. package/tests/cases/integration/graphQlSchema/schema-acl-allowed.gql +14 -1
  356. package/tests/cases/integration/graphQlSchema/schema-acl-restricted-create.gql +5 -5
  357. package/tests/cases/integration/graphQlSchema/schema-acl-restricted-delete.gql +14 -1
  358. package/tests/cases/integration/graphQlSchema/schema-acl-restricted-update.gql +12 -0
  359. package/tests/cases/integration/graphQlSchema/schema-basic.gql +40 -2
  360. package/tests/cases/integration/graphQlSchema/schema-bug-66.gql +30 -3
  361. package/tests/cases/integration/graphQlSchema/schema-custom-primary.gql +40 -2
  362. package/tests/cases/integration/graphQlSchema/schema-has-many-reduction.gql +14 -1
  363. package/tests/cases/integration/graphQlSchema/schema-new-builder.gql +40 -2
  364. package/tests/cases/unit/whereOptimizer.test.ts +120 -13
  365. package/tests/src/test.ts +0 -25
  366. package/tests/src/testGraphql.ts +1 -1
  367. package/dist/tests/cases/integration/graphQlRequests/insert/manyHasManyInverse/insertRelationCreate.test.d.ts +0 -2
  368. package/dist/tests/cases/integration/graphQlRequests/insert/manyHasManyInverse/insertRelationCreate.test.d.ts.map +0 -1
  369. package/dist/tests/cases/integration/graphQlRequests/insert/manyHasManyInverse/insertRelationCreate.test.js.map +0 -1
  370. package/dist/tests/cases/integration/graphQlRequests/insert/manyHasManyOwning/insertRelationCreate.test.d.ts +0 -2
  371. package/dist/tests/cases/integration/graphQlRequests/insert/manyHasManyOwning/insertRelationCreate.test.d.ts.map +0 -1
  372. package/dist/tests/cases/integration/graphQlRequests/insert/manyHasManyOwning/insertRelationCreate.test.js.map +0 -1
  373. package/dist/tests/cases/integration/graphQlRequests/insert/manyHasOne/insertRelationCreate.test.d.ts +0 -2
  374. package/dist/tests/cases/integration/graphQlRequests/insert/manyHasOne/insertRelationCreate.test.d.ts.map +0 -1
  375. package/dist/tests/cases/integration/graphQlRequests/insert/manyHasOne/insertRelationCreate.test.js.map +0 -1
  376. package/dist/tests/cases/integration/graphQlRequests/insert/oneHasMany/insertRelationConnect.test.d.ts +0 -2
  377. package/dist/tests/cases/integration/graphQlRequests/insert/oneHasMany/insertRelationConnect.test.d.ts.map +0 -1
  378. package/dist/tests/cases/integration/graphQlRequests/insert/oneHasMany/insertRelationConnect.test.js.map +0 -1
  379. package/dist/tests/cases/integration/graphQlRequests/insert/oneHasMany/insertRelationCreate.test.d.ts +0 -2
  380. package/dist/tests/cases/integration/graphQlRequests/insert/oneHasMany/insertRelationCreate.test.d.ts.map +0 -1
  381. package/dist/tests/cases/integration/graphQlRequests/insert/oneHasMany/insertRelationCreate.test.js.map +0 -1
  382. package/dist/tests/cases/integration/graphQlRequests/insert/oneHasOneInverse/insertRelationCreate.test.d.ts +0 -2
  383. package/dist/tests/cases/integration/graphQlRequests/insert/oneHasOneInverse/insertRelationCreate.test.d.ts.map +0 -1
  384. package/dist/tests/cases/integration/graphQlRequests/insert/oneHasOneInverse/insertRelationCreate.test.js.map +0 -1
  385. package/dist/tests/cases/integration/graphQlRequests/insert/oneHasOneOwning/insertRelationCreate.test.d.ts +0 -2
  386. package/dist/tests/cases/integration/graphQlRequests/insert/oneHasOneOwning/insertRelationCreate.test.d.ts.map +0 -1
  387. package/dist/tests/cases/integration/graphQlRequests/insert/oneHasOneOwning/insertRelationCreate.test.js.map +0 -1
  388. package/dist/tests/cases/integration/graphQlRequests/insert/oneHasOneOwning/insertRelationEmpty.test.d.ts +0 -2
  389. package/dist/tests/cases/integration/graphQlRequests/insert/oneHasOneOwning/insertRelationEmpty.test.d.ts.map +0 -1
  390. package/dist/tests/cases/integration/graphQlRequests/insert/oneHasOneOwning/insertRelationEmpty.test.js.map +0 -1
@@ -1,10 +1,11 @@
1
1
  import { tuple } from '../../utils'
2
- import { Input, Model, Value } from '@contember/schema'
2
+ import { Acl, Input, Model, Value } from '@contember/schema'
3
3
  import { acceptEveryFieldVisitor, getColumnName, getColumnType } from '@contember/schema-utils'
4
4
  import { Client, Operator, QueryBuilder, UpdateBuilder as DbUpdateBuilder, Value as DbValue } from '@contember/database'
5
5
  import { PathFactory, WhereBuilder } from '../select'
6
6
  import { ColumnValue, ResolvedColumnValue, resolveGenericValue, resolveRowData } from '../ColumnValue'
7
- import { AbortUpdate } from './Updater'
7
+ import { PredicateFactory } from '../../acl'
8
+ import { AbortDataManipulation, DataManipulationBuilder } from '../DataManipulationBuilder'
8
9
 
9
10
  export interface UpdateResult {
10
11
  values: ResolvedColumnValue[]
@@ -13,16 +14,16 @@ export interface UpdateResult {
13
14
  affectedRows: number | null
14
15
  }
15
16
 
16
- export class UpdateBuilder {
17
+ export class UpdateBuilder implements DataManipulationBuilder {
17
18
  private resolver: (value: number | null) => void = () => {
18
19
  throw new Error('UpdateBuilder: Resolver called too soon')
19
20
  }
20
21
  public readonly update: Promise<number | null> = new Promise(resolve => (this.resolver = resolve))
21
22
 
22
- private rowData: ColumnValue<AbortUpdate>[] = []
23
+ private rowData: Map<string, ColumnValue<AbortDataManipulation>> = new Map()
23
24
 
24
- private newWhere: Input.OptionalWhere = {}
25
- private oldWhere: Input.OptionalWhere = {}
25
+ private newWhere: { and: Input.OptionalWhere[] } = { and: [] }
26
+ private oldWhere: { and: Input.OptionalWhere[] } = { and: [] }
26
27
 
27
28
  constructor(
28
29
  private readonly schema: Model.Schema,
@@ -30,36 +31,42 @@ export class UpdateBuilder {
30
31
  private readonly whereBuilder: WhereBuilder,
31
32
  private readonly uniqueWhere: Input.Where,
32
33
  private readonly pathFactory: PathFactory,
34
+ private readonly predicateFactory: PredicateFactory,
33
35
  ) {}
34
36
 
35
- public async addFieldValue(
37
+ public addFieldValue(
36
38
  fieldName: string,
37
- value: Value.GenericValueLike<Value.AtomicValue<AbortUpdate | undefined>>,
38
- ): Promise<Value.AtomicValue<AbortUpdate | undefined>> {
39
+ value: Value.GenericValueLike<Value.AtomicValue<AbortDataManipulation | undefined>>,
40
+ ): Promise<Value.AtomicValue<AbortDataManipulation | undefined>> {
39
41
  const columnName = getColumnName(this.schema, this.entity, fieldName)
40
42
  const columnType = getColumnType(this.schema, this.entity, fieldName)
41
43
  const resolvedValue = resolveGenericValue(value)
42
- this.rowData.push({ columnName, value: resolvedValue, columnType, fieldName })
44
+ this.rowData.set(columnName, { columnName, value: resolvedValue, columnType, fieldName })
43
45
  return resolvedValue
44
46
  }
45
47
 
46
48
  public addNewWhere(where: Input.OptionalWhere): void {
47
- this.newWhere = { and: [where, this.newWhere] }
49
+ this.newWhere.and.push(where)
48
50
  }
49
51
 
50
52
  public addOldWhere(where: Input.OptionalWhere): void {
51
- this.oldWhere = { and: [where, this.oldWhere] }
53
+ this.oldWhere.and.push(where)
54
+ }
55
+
56
+ public addPredicates(fields: string[]): void {
57
+ const predicate = this.predicateFactory.create(this.entity, Acl.Operation.update, fields)
58
+ this.addNewWhere(predicate)
59
+ this.addOldWhere(predicate)
52
60
  }
53
61
 
54
62
  public async execute(db: Client): Promise<UpdateResult> {
55
- let resolvedDataFinal: ResolvedColumnValue[] | null = null
56
63
  try {
57
- const resolvedData = await resolveRowData<AbortUpdate>(this.rowData)
64
+ const resolvedData = await resolveRowData<AbortDataManipulation>([...this.rowData.values()])
58
65
  if (Object.keys(resolvedData).length === 0) {
59
66
  this.resolver(null)
60
67
  return { values: [], affectedRows: null, executed: false, aborted: false }
61
68
  }
62
- if (resolvedData.find(it => it.resolvedValue === AbortUpdate)) {
69
+ if (resolvedData.find(it => it.resolvedValue === AbortDataManipulation)) {
63
70
  this.resolver(null)
64
71
  return { values: [], affectedRows: null, executed: false, aborted: true }
65
72
  }
@@ -1,15 +1,24 @@
1
1
  import { PathFactory, WhereBuilder } from '../select'
2
2
  import { Input, Model } from '@contember/schema'
3
3
  import { UpdateBuilder } from './UpdateBuilder'
4
+ import { PredicateFactory } from '../../acl'
4
5
 
5
6
  export class UpdateBuilderFactory {
6
7
  constructor(
7
8
  private readonly schema: Model.Schema,
8
9
  private readonly whereBuilder: WhereBuilder,
9
10
  private readonly pathFactory: PathFactory,
11
+ private readonly predicateFactory: PredicateFactory,
10
12
  ) {}
11
13
 
12
14
  public create(entity: Model.Entity, uniqueWhere: Input.Where): UpdateBuilder {
13
- return new UpdateBuilder(this.schema, entity, this.whereBuilder, uniqueWhere, this.pathFactory)
15
+ return new UpdateBuilder(
16
+ this.schema,
17
+ entity,
18
+ this.whereBuilder,
19
+ uniqueWhere,
20
+ this.pathFactory,
21
+ this.predicateFactory,
22
+ )
14
23
  }
15
24
  }
@@ -1,6 +1,6 @@
1
1
  import { SqlUpdateInputProcessor } from './SqlUpdateInputProcessor'
2
- import { UniqueWhereExpander, UpdateInputVisitor } from '../../inputProcessing'
3
- import { Acl, Input, Model } from '@contember/schema'
2
+ import { UpdateInputVisitor } from '../../inputProcessing'
3
+ import { Input, Model } from '@contember/schema'
4
4
  import { PredicateFactory } from '../../acl'
5
5
  import { UpdateBuilderFactory } from './UpdateBuilderFactory'
6
6
  import { Mapper } from '../Mapper'
@@ -8,7 +8,6 @@ import { acceptEveryFieldVisitor } from '@contember/schema-utils'
8
8
  import { Client } from '@contember/database'
9
9
  import {
10
10
  collectResults,
11
- MutationEntryNotFoundError,
12
11
  MutationNoResultError,
13
12
  MutationNothingToDo,
14
13
  MutationResultList,
@@ -39,9 +38,8 @@ export class Updater {
39
38
  })
40
39
 
41
40
  const predicateFields = Object.keys(data)
42
- this.applyPredicates(entity, predicateFields, updateBuilder)
43
-
44
- if (filter) {
41
+ updateBuilder.addPredicates(predicateFields)
42
+ if (filter && Object.keys(filter).length > 0) {
45
43
  updateBuilder.addOldWhere(filter)
46
44
  }
47
45
 
@@ -51,21 +49,23 @@ export class Updater {
51
49
 
52
50
  const okResultFactory = (values: RowValues) => new MutationUpdateOk([], entity, primaryValue, data, values)
53
51
  const mutationResultPromise = Updater.executeUpdate(updateBuilder, mapper.db, okResultFactory)
54
-
55
- return await collectResults(this.schema, mutationResultPromise, Object.values(promises))
52
+ const otherPromises = Object.values(promises)
53
+ if (otherPromises.length === 0) {
54
+ return await mutationResultPromise
55
+ } else {
56
+ return await collectResults(this.schema, mutationResultPromise, otherPromises)
57
+ }
56
58
  }
57
59
 
58
60
  public async updateCb(
59
61
  mapper: Mapper,
60
62
  entity: Model.Entity,
61
63
  primaryValue: Input.PrimaryValue,
62
- predicateFields: string[],
63
64
  builderCb: (builder: UpdateBuilder) => void,
64
65
  ): Promise<MutationResultList> {
65
66
  const updateBuilder = this.updateBuilderFactory.create(entity, {
66
67
  [entity.primary]: { eq: primaryValue },
67
68
  })
68
- this.applyPredicates(entity, predicateFields, updateBuilder)
69
69
 
70
70
  const okResultFactory = (values: RowValues) => new MutationUpdateOk([], entity, primaryValue, {}, values)
71
71
  builderCb(updateBuilder)
@@ -73,12 +73,6 @@ export class Updater {
73
73
  return Updater.executeUpdate(updateBuilder, mapper.db, okResultFactory)
74
74
  }
75
75
 
76
- private applyPredicates(entity: Model.Entity, predicateFields: string[], updateBuilder: UpdateBuilder): void {
77
- const predicateWhere = this.predicateFactory.create(entity, Acl.Operation.update, predicateFields)
78
- updateBuilder.addOldWhere(predicateWhere)
79
- updateBuilder.addNewWhere(predicateWhere)
80
- }
81
-
82
76
  private static async executeUpdate(
83
77
  updateBuilder: UpdateBuilder,
84
78
  db: Client,
@@ -97,6 +91,3 @@ export class Updater {
97
91
  return [okResultFactory(rowDataToFieldValues(result.values))]
98
92
  }
99
93
  }
100
-
101
- export const AbortUpdate = Symbol('AbortUpdate')
102
- export type AbortUpdate = typeof AbortUpdate
@@ -432,7 +432,7 @@ export class MutationResolver {
432
432
 
433
433
  const result = await mapper.delete(entity, queryAst.args.by, queryAst.args.filter)
434
434
  if (
435
- result.length === 1 &&
435
+ result.length >= 1 &&
436
436
  (result[0].result === MutationResultType.ok || result[0].result === MutationResultType.nothingToDo)
437
437
  ) {
438
438
  return { ok: true, errors: [], ...nodes }
@@ -28,6 +28,7 @@ import { PaginatedFieldConfigFactory } from './PaginatedFieldConfigFactory'
28
28
  import { PaginatedHasManyFieldProvider } from '../extensions/paginatedHasMany/PaginatedHasManyFieldProvider'
29
29
  import { PaginatedHasManyFieldProviderVisitor } from '../extensions/paginatedHasMany/PaginatedHasManyFieldProviderVisitor'
30
30
  import { Builder } from '@contember/dic'
31
+ import { ConnectOrCreateRelationInputProvider } from './mutations/ConnectOrCreateRelationInputProvider'
31
32
 
32
33
  export class GraphQlSchemaBuilderFactory {
33
34
  constructor() {}
@@ -72,8 +73,10 @@ export class GraphQlSchemaBuilderFactory {
72
73
  new Accessor<EntityInputProvider<EntityInputType.create>>())
73
74
  .addService('createEntityRelationAllowedOperationsVisitor', ({ authorizator }) =>
74
75
  new CreateEntityRelationAllowedOperationsVisitor(authorizator))
75
- .addService('createEntityRelationInputFieldVisitor', ({ schema, whereTypeProvider, createEntityInputProviderAccessor, createEntityRelationAllowedOperationsVisitor }) =>
76
- new CreateEntityRelationInputFieldVisitor(schema, whereTypeProvider, createEntityInputProviderAccessor, createEntityRelationAllowedOperationsVisitor))
76
+ .addService('connectOrCreateRelationInputProvider', ({ schema, whereTypeProvider, createEntityInputProviderAccessor }) =>
77
+ new ConnectOrCreateRelationInputProvider(schema, whereTypeProvider, createEntityInputProviderAccessor))
78
+ .addService('createEntityRelationInputFieldVisitor', ({ schema, whereTypeProvider, createEntityInputProviderAccessor, createEntityRelationAllowedOperationsVisitor, connectOrCreateRelationInputProvider }) =>
79
+ new CreateEntityRelationInputFieldVisitor(schema, whereTypeProvider, createEntityInputProviderAccessor, createEntityRelationAllowedOperationsVisitor, connectOrCreateRelationInputProvider))
77
80
  .addService('createEntityRelationInputProvider', ({ schema, createEntityRelationInputFieldVisitor }) =>
78
81
  new CreateEntityRelationInputProvider(schema, createEntityRelationInputFieldVisitor))
79
82
  .addService('createEntityInputFieldVisitor', ({ schema, authorizator, columnTypeResolver, createEntityRelationInputProvider }) =>
@@ -84,8 +87,8 @@ export class GraphQlSchemaBuilderFactory {
84
87
  new Accessor<EntityInputProvider<EntityInputType.update>>())
85
88
  .addService('updateEntityRelationAllowedOperationsVisitor', ({ authorizator }) =>
86
89
  new UpdateEntityRelationAllowedOperationsVisitor(authorizator))
87
- .addService('updateEntityRelationInputFieldVisitor', ({ schema, authorizator, whereTypeProvider, updateEntityInputProviderAccessor, createEntityInputProvider, updateEntityRelationAllowedOperationsVisitor }) =>
88
- new UpdateEntityRelationInputFieldVisitor(schema, authorizator, whereTypeProvider, updateEntityInputProviderAccessor, createEntityInputProvider, updateEntityRelationAllowedOperationsVisitor))
90
+ .addService('updateEntityRelationInputFieldVisitor', ({ schema, authorizator, whereTypeProvider, updateEntityInputProviderAccessor, createEntityInputProvider, updateEntityRelationAllowedOperationsVisitor, connectOrCreateRelationInputProvider }) =>
91
+ new UpdateEntityRelationInputFieldVisitor(schema, authorizator, whereTypeProvider, updateEntityInputProviderAccessor, createEntityInputProvider, updateEntityRelationAllowedOperationsVisitor, connectOrCreateRelationInputProvider))
89
92
  .addService('updateEntityRelationInputProvider', ({ schema, updateEntityRelationInputFieldVisitor }) =>
90
93
  new UpdateEntityRelationInputProvider(schema, updateEntityRelationInputFieldVisitor))
91
94
  .addService('updateEntityInputFieldVisitor', ({ authorizator, columnTypeResolver, updateEntityRelationInputProvider }) =>
@@ -0,0 +1,54 @@
1
+ import { Accessor, Interface, singletonFactory } from '../../utils'
2
+ import { GraphQLInputObjectType } from 'graphql'
3
+ import { GqlTypeName } from '../utils'
4
+ import { WhereTypeProvider } from '../WhereTypeProvider'
5
+ import { EntityInputProvider, EntityInputType } from './EntityInputProvider'
6
+ import { Model } from '@contember/schema'
7
+ import { acceptFieldVisitor } from '@contember/schema-utils'
8
+ import { ImplementationException } from '../../exception'
9
+
10
+ type Args = {
11
+ entityName: string
12
+ relationName: string
13
+ }
14
+
15
+ export class ConnectOrCreateRelationInputProvider {
16
+ private inputs = singletonFactory<GraphQLInputObjectType, Args>(id => this.createInput(id.entityName, id.relationName))
17
+
18
+ constructor(
19
+ private readonly schema: Model.Schema,
20
+ private readonly whereTypeBuilder: WhereTypeProvider,
21
+ private readonly createEntityInputProviderAccessor: Accessor<Interface<EntityInputProvider<EntityInputType.create>>>,
22
+ ) {
23
+ }
24
+
25
+
26
+ getInput(entityName: string, relationName: string) {
27
+ return this.inputs({ entityName, relationName })
28
+ }
29
+
30
+ private createInput(entityName: string, relationName: string) {
31
+ return acceptFieldVisitor<GraphQLInputObjectType>(this.schema, entityName, relationName, {
32
+ visitColumn() {
33
+ throw new ImplementationException()
34
+ },
35
+ visitRelation: ({ entity, targetEntity, targetRelation, relation }) => {
36
+ const uniqueWhere = this.whereTypeBuilder.getEntityUniqueWhereType(targetEntity.name)
37
+ const targetName = targetRelation ? targetRelation.name : undefined
38
+ const createInput = this.createEntityInputProviderAccessor.get().getInput(targetEntity.name, targetName)
39
+ if (!uniqueWhere || !createInput) {
40
+ throw new ImplementationException()
41
+ }
42
+
43
+ return new GraphQLInputObjectType({
44
+ name: GqlTypeName`${entity.name}ConnectOrCreate${relation.name}RelationInput`,
45
+ fields: () => ({
46
+ connect: { type: uniqueWhere },
47
+ create: { type: createInput },
48
+ }),
49
+ })
50
+ },
51
+ })
52
+
53
+ }
54
+ }
@@ -23,9 +23,7 @@ export class CreateEntityInputFieldVisitor implements
23
23
  return undefined
24
24
  }
25
25
  const type = this.columnTypeResolver.getType(column)
26
- return {
27
- type,
28
- }
26
+ return { type }
29
27
  }
30
28
 
31
29
  public visitHasOne({ entity, relation }: Model.AnyHasOneRelationContext): GraphQLInputFieldConfig | undefined {
@@ -33,9 +31,7 @@ export class CreateEntityInputFieldVisitor implements
33
31
  if (type === undefined) {
34
32
  return undefined
35
33
  }
36
- return {
37
- type,
38
- }
34
+ return { type }
39
35
  }
40
36
 
41
37
  public visitHasMany({ entity, relation }: Model.AnyHasManyRelationContext): GraphQLInputFieldConfig | undefined {
@@ -58,10 +58,12 @@ export class CreateEntityRelationAllowedOperationsVisitor implements
58
58
  if (canReadTargetEntity && canCreateOwning) {
59
59
  result.push(Input.CreateRelationOperation.connect)
60
60
  }
61
-
62
61
  if (canCreateTargetEntity && canCreateOwning) {
63
62
  result.push(Input.CreateRelationOperation.create)
64
63
  }
64
+ if (canReadTargetEntity && canCreateTargetEntity && canCreateOwning) {
65
+ result.push(Input.CreateRelationOperation.connectOrCreate)
66
+ }
65
67
 
66
68
  return result
67
69
  }
@@ -7,6 +7,7 @@ import { EntityInputProvider, EntityInputType } from './EntityInputProvider'
7
7
  import { CreateEntityRelationAllowedOperationsVisitor } from './CreateEntityRelationAllowedOperationsVisitor'
8
8
  import { acceptFieldVisitor } from '@contember/schema-utils'
9
9
  import { ImplementationException } from '../../exception'
10
+ import { ConnectOrCreateRelationInputProvider } from './ConnectOrCreateRelationInputProvider'
10
11
 
11
12
  export class CreateEntityRelationInputFieldVisitor implements
12
13
  Model.ColumnVisitor<never>,
@@ -15,10 +16,9 @@ export class CreateEntityRelationInputFieldVisitor implements
15
16
  constructor(
16
17
  private readonly schema: Model.Schema,
17
18
  private readonly whereTypeBuilder: WhereTypeProvider,
18
- private readonly createEntityInputProviderAccessor: Accessor<
19
- Interface<EntityInputProvider<EntityInputType.create>>
20
- >,
19
+ private readonly createEntityInputProviderAccessor: Accessor<Interface<EntityInputProvider<EntityInputType.create>>>,
21
20
  private readonly createEntityRelationAllowedOperationsVisitor: CreateEntityRelationAllowedOperationsVisitor,
21
+ private readonly connectOrCreateRelationInputProvider: ConnectOrCreateRelationInputProvider,
22
22
  ) {}
23
23
 
24
24
  public visitColumn(): never {
@@ -46,12 +46,10 @@ export class CreateEntityRelationInputFieldVisitor implements
46
46
  this.createEntityRelationAllowedOperationsVisitor,
47
47
  )
48
48
 
49
- if (allowedOperations.includes(Input.CreateRelationOperation.connect)) {
50
- const uniqueWhere = this.whereTypeBuilder.getEntityUniqueWhereType(targetEntity.name)
51
- if (uniqueWhere) {
52
- fields[Input.CreateRelationOperation.connect] = {
53
- type: uniqueWhere,
54
- }
49
+ const uniqueWhere = this.whereTypeBuilder.getEntityUniqueWhereType(targetEntity.name)
50
+ if (allowedOperations.includes(Input.CreateRelationOperation.connect) && uniqueWhere) {
51
+ fields[Input.CreateRelationOperation.connect] = {
52
+ type: uniqueWhere,
55
53
  }
56
54
  }
57
55
 
@@ -61,18 +59,25 @@ export class CreateEntityRelationInputFieldVisitor implements
61
59
  type: createInput,
62
60
  }
63
61
  }
62
+ if (allowedOperations.includes(Input.CreateRelationOperation.connectOrCreate) && uniqueWhere !== undefined && createInput !== undefined) {
63
+ const connectOrCreateInput = this.connectOrCreateRelationInputProvider.getInput(entity.name, relation.name)
64
+ if (connectOrCreateInput) {
65
+ fields[Input.CreateRelationOperation.connectOrCreate] = {
66
+ type: connectOrCreateInput,
67
+ }
68
+ }
69
+ }
64
70
  if (Object.keys(fields).length === 0) {
65
71
  return undefined
66
72
  }
67
73
  return new GraphQLInputObjectType({
68
74
  name: GqlTypeName`${entity.name}Create${relation.name}EntityRelationInput`,
69
- fields: () =>
70
- withAliasField
71
- ? {
72
- ...fields,
73
- alias: { type: GraphQLString },
75
+ fields: () => withAliasField
76
+ ? {
77
+ ...fields,
78
+ alias: { type: GraphQLString },
74
79
  }
75
- : fields,
80
+ : fields,
76
81
  })
77
82
  }
78
83
  }
@@ -38,9 +38,6 @@ export class EntityInputProvider<Operation extends EntityInputType> {
38
38
  }
39
39
  const entityName = entity.name
40
40
  const withoutSuffix = withoutRelation ? GqlTypeName`Without${withoutRelation}` : ''
41
- if (entity.view) {
42
- return undefined
43
- }
44
41
  const operation: Acl.Operation = (() => {
45
42
  switch (this.operation) {
46
43
  case EntityInputType.create:
@@ -22,9 +22,7 @@ export class UpdateEntityInputFieldVisitor implements
22
22
  return undefined
23
23
  }
24
24
  const type = this.columnTypeResolver.getType(column)
25
- return {
26
- type,
27
- }
25
+ return { type }
28
26
  }
29
27
 
30
28
  public visitHasOne({ entity, relation }: Model.AnyHasOneRelationContext) {
@@ -32,9 +30,7 @@ export class UpdateEntityInputFieldVisitor implements
32
30
  if (type === undefined) {
33
31
  return undefined
34
32
  }
35
- return {
36
- type,
37
- }
33
+ return { type }
38
34
  }
39
35
 
40
36
  public visitHasMany({ entity, relation }: Model.AnyHasManyRelationContext) {
@@ -72,7 +72,6 @@ export class UpdateEntityRelationAllowedOperationsVisitor implements
72
72
  result.push(Input.UpdateRelationOperation.connect)
73
73
  result.push(Input.UpdateRelationOperation.disconnect)
74
74
  }
75
-
76
75
  if (canCreateTargetEntity && canUpdateOwningRelation) {
77
76
  result.push(Input.UpdateRelationOperation.create)
78
77
  }
@@ -85,6 +84,9 @@ export class UpdateEntityRelationAllowedOperationsVisitor implements
85
84
  if (canDeleteTargetEntity && canUpdateOwningRelation) {
86
85
  result.push(Input.UpdateRelationOperation.delete)
87
86
  }
87
+ if (canReadTargetEntity && canUpdateOwningRelation && canCreateTargetEntity) {
88
+ result.push(Input.UpdateRelationOperation.connectOrCreate)
89
+ }
88
90
 
89
91
  return result
90
92
  }
@@ -14,9 +14,9 @@ import { acceptFieldVisitor } from '@contember/schema-utils'
14
14
  import { UpdateEntityRelationAllowedOperationsVisitor } from './UpdateEntityRelationAllowedOperationsVisitor'
15
15
  import { Authorizator } from '../../acl'
16
16
  import { ImplementationException } from '../../exception'
17
+ import { ConnectOrCreateRelationInputProvider } from './ConnectOrCreateRelationInputProvider'
17
18
 
18
- export class UpdateEntityRelationInputFieldVisitor implements
19
- Model.ColumnVisitor<never>,
19
+ export class UpdateEntityRelationInputFieldVisitor implements Model.ColumnVisitor<never>,
20
20
  Model.RelationByGenericTypeVisitor<GraphQLInputObjectType | undefined> {
21
21
 
22
22
  constructor(
@@ -26,7 +26,9 @@ export class UpdateEntityRelationInputFieldVisitor implements
26
26
  private readonly updateEntityInputProviderAccessor: Accessor<EntityInputProvider<EntityInputType.update>>,
27
27
  private readonly createEntityInputProvider: EntityInputProvider<EntityInputType.create>,
28
28
  private readonly updateEntityRelationAllowedOperationsVisitor: UpdateEntityRelationAllowedOperationsVisitor,
29
- ) {}
29
+ private readonly connectOrCreateRelationInputProvider: ConnectOrCreateRelationInputProvider,
30
+ ) {
31
+ }
30
32
 
31
33
  public visitColumn(): never {
32
34
  throw new Error('UpdateEntityRelationInputFieldVisitor: Not applicable for a column')
@@ -36,39 +38,39 @@ export class UpdateEntityRelationInputFieldVisitor implements
36
38
  const withoutRelation = targetRelation ? targetRelation.name : undefined
37
39
 
38
40
  const whereInput = this.createWhereInput(targetEntity)
41
+
39
42
  const createInputType = this.createEntityInputProvider.getInput(targetEntity.name, withoutRelation)
40
- const createInput = createInputType
41
- ? {
42
- type: createInputType,
43
- }
44
- : undefined
43
+ const createInput = createInputType ? { type: createInputType } : undefined
44
+
45
45
  const updateInputType = this.updateEntityInputProviderAccessor.get().getInput(targetEntity.name, withoutRelation)
46
- const updateInput = updateInputType
46
+ const updateInput = updateInputType ? { type: updateInputType } : undefined
47
+
48
+ const upsertInput = updateInput && createInput
47
49
  ? {
48
- type: updateInputType,
49
- }
50
- : undefined
51
- const upsertInput =
52
- updateInput && createInput
53
- ? {
54
- type: new GraphQLInputObjectType({
55
- name: GqlTypeName`${entity.name}Upsert${relation.name}RelationInput`,
56
- fields: () => ({
57
- update: updateInput,
58
- create: createInput,
59
- }),
50
+ type: new GraphQLInputObjectType({
51
+ name: GqlTypeName`${entity.name}Upsert${relation.name}RelationInput`,
52
+ fields: () => ({
53
+ update: updateInput,
54
+ create: createInput,
60
55
  }),
61
- }
62
- : undefined
56
+ }),
57
+ }
58
+ : undefined
59
+
63
60
  const booleanInput = {
64
61
  type: GraphQLBoolean,
65
62
  }
66
63
 
64
+ const connectOrCreateInput = createInput && whereInput
65
+ ? { type: this.connectOrCreateRelationInputProvider.getInput(entity.name, relation.name) }
66
+ : undefined
67
+
67
68
  const fields = {
69
+ [Input.UpdateRelationOperation.connect]: whereInput,
68
70
  [Input.UpdateRelationOperation.create]: createInput,
71
+ [Input.UpdateRelationOperation.connectOrCreate]: connectOrCreateInput,
69
72
  [Input.UpdateRelationOperation.update]: updateInput,
70
73
  [Input.UpdateRelationOperation.upsert]: upsertInput,
71
- [Input.UpdateRelationOperation.connect]: whereInput,
72
74
  [Input.UpdateRelationOperation.disconnect]: booleanInput,
73
75
  [Input.UpdateRelationOperation.delete]: booleanInput,
74
76
  }
@@ -88,45 +90,37 @@ export class UpdateEntityRelationInputFieldVisitor implements
88
90
  const withoutRelation = targetRelation ? targetRelation.name : undefined
89
91
 
90
92
  const whereInput = this.createWhereInput(targetEntity)
93
+
91
94
  const createInputType = this.createEntityInputProvider.getInput(targetEntity.name, withoutRelation)
92
- const createInput = createInputType
93
- ? {
94
- type: createInputType,
95
- }
96
- : undefined
95
+ const createInput = createInputType ? { type: createInputType } : undefined
96
+
97
97
  const updateInputType = this.updateEntityInputProviderAccessor.get().getInput(targetEntity.name, withoutRelation)
98
- const updateInput = updateInputType
98
+ const updateInput = updateInputType ? { type: updateInputType } : undefined
99
+
100
+ const updateSpecifiedInput = updateInput && whereInput
99
101
  ? {
100
- type: updateInputType,
101
- }
102
+ type: new GraphQLInputObjectType({
103
+ name: GqlTypeName`${entity.name}Update${relation.name}RelationInput`,
104
+ fields: () => ({
105
+ by: whereInput,
106
+ data: updateInput,
107
+ }),
108
+ }),
109
+ }
102
110
  : undefined
103
111
 
104
- const updateSpecifiedInput =
105
- updateInput && whereInput
106
- ? {
107
- type: new GraphQLInputObjectType({
108
- name: GqlTypeName`${entity.name}Update${relation.name}RelationInput`,
109
- fields: () => ({
110
- by: whereInput,
111
- data: updateInput,
112
- }),
113
- }),
114
- }
115
- : undefined
116
-
117
- const upsertInput =
118
- updateInput && createInput && whereInput
119
- ? {
120
- type: new GraphQLInputObjectType({
121
- name: GqlTypeName`${entity.name}Upsert${relation.name}RelationInput`,
122
- fields: () => ({
123
- by: whereInput,
124
- update: updateInput,
125
- create: createInput,
126
- }),
112
+ const upsertInput = updateInput && createInput && whereInput
113
+ ? {
114
+ type: new GraphQLInputObjectType({
115
+ name: GqlTypeName`${entity.name}Upsert${relation.name}RelationInput`,
116
+ fields: () => ({
117
+ by: whereInput,
118
+ update: updateInput,
119
+ create: createInput,
127
120
  }),
128
- }
129
- : undefined
121
+ }),
122
+ }
123
+ : undefined
130
124
 
131
125
  const fields = {
132
126
  [Input.UpdateRelationOperation.create]: createInput,
@@ -136,6 +130,7 @@ export class UpdateEntityRelationInputFieldVisitor implements
136
130
  [Input.UpdateRelationOperation.disconnect]: whereInput,
137
131
  [Input.UpdateRelationOperation.delete]: whereInput,
138
132
  }
133
+
139
134
  const filteredFields = this.filterAllowedOperations(entity, relation, fields)
140
135
  if (Object.keys(filteredFields).length === 0) {
141
136
  return undefined
@@ -60,10 +60,10 @@ test('delete without deferring constraints', async () => {
60
60
  return: {
61
61
  transaction: {
62
62
  ok: false,
63
- errorMessage: 'Execution has failed:\nupdatePost.attachments.0: ForeignKeyConstraintViolation (Cannot delete row 123e4567-e89b-12d3-a456-000000000002 of entity Attachment, because it is still referenced from Reference::attachment. This is possibly caused by ACL denial or by missing "on delete cascade")',
63
+ errorMessage: 'Execution has failed:\nupdatePost.attachments.0: ForeignKeyConstraintViolation (Cannot delete 123e4567-e89b-12d3-a456-000000000002 row(s) of entity Attachment, because it is still referenced from 123e4567-e89b-12d3-a456-000000000003 row(s) of entity Reference in relation attachment. OnDelete behaviour of this relation is set to "restrict". You might consider changing it to "setNull" or "cascade".)',
64
64
  updatePost: {
65
65
  ok: false,
66
- errorMessage: 'Execution has failed:\nattachments.0: ForeignKeyConstraintViolation (Cannot delete row 123e4567-e89b-12d3-a456-000000000002 of entity Attachment, because it is still referenced from Reference::attachment. This is possibly caused by ACL denial or by missing "on delete cascade")',
66
+ errorMessage: 'Execution has failed:\nattachments.0: ForeignKeyConstraintViolation (Cannot delete 123e4567-e89b-12d3-a456-000000000002 row(s) of entity Attachment, because it is still referenced from 123e4567-e89b-12d3-a456-000000000003 row(s) of entity Reference in relation attachment. OnDelete behaviour of this relation is set to "restrict". You might consider changing it to "setNull" or "cascade".)',
67
67
  },
68
68
  },
69
69
  },
@@ -37,7 +37,7 @@ test('fails when deleting entity without proper cascade', async () => {
37
37
  }`,
38
38
  return: {
39
39
  deletePost: {
40
- errorMessage: 'Execution has failed:\nunknown field: ForeignKeyConstraintViolation (Cannot delete row 123e4567-e89b-12d3-a456-000000000001 of entity Post, because it is still referenced from PostLocales::post. This is possibly caused by ACL denial or by missing "on delete cascade")',
40
+ errorMessage: 'Execution has failed:\nunknown field: ForeignKeyConstraintViolation (Cannot delete 123e4567-e89b-12d3-a456-000000000001 row(s) of entity Post, because it is still referenced from 123e4567-e89b-12d3-a456-000000000002 row(s) of entity PostLocales in relation post. OnDelete behaviour of this relation is set to "restrict". You might consider changing it to "setNull" or "cascade".)',
41
41
  node: null,
42
42
  },
43
43
  },
@@ -69,7 +69,7 @@ test('update site & try to create contact page which however exists', async () =
69
69
  ok: false,
70
70
  errors: [
71
71
  {
72
- type: 'UniqueConstraintViolation',
72
+ type: 'NotNullConstraintViolation',
73
73
  },
74
74
  ],
75
75
  },
@@ -68,9 +68,6 @@ test('update site & try to create contact page which however exists', async () =
68
68
  {
69
69
  type: 'NotNullConstraintViolation',
70
70
  },
71
- {
72
- type: 'UniqueConstraintViolation',
73
- },
74
71
  ],
75
72
  },
76
73
  },