@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
@@ -10,9 +10,8 @@ import {
10
10
  import { CreateInputVisitor } from '../../inputProcessing'
11
11
  import { SqlCreateInputProcessor } from './SqlCreateInputProcessor'
12
12
  import { Mapper } from '../Mapper'
13
- import { Acl, Input, Model, Value } from '@contember/schema'
13
+ import { Input, Model, Value } from '@contember/schema'
14
14
  import { acceptEveryFieldVisitor, Providers } from '@contember/schema-utils'
15
- import { PredicateFactory } from '../../acl'
16
15
  import { InsertBuilderFactory } from './InsertBuilderFactory'
17
16
  import { Client } from '@contember/database'
18
17
  import { InsertBuilder } from './InsertBuilder'
@@ -22,7 +21,6 @@ import { rowDataToFieldValues } from '../ColumnValue'
22
21
  export class Inserter {
23
22
  constructor(
24
23
  private readonly schema: Model.Schema,
25
- private readonly predicateFactory: PredicateFactory,
26
24
  private readonly insertBuilderFactory: InsertBuilderFactory,
27
25
  private readonly providers: Providers,
28
26
  ) {}
@@ -31,15 +29,14 @@ export class Inserter {
31
29
  mapper: Mapper,
32
30
  entity: Model.Entity,
33
31
  data: Input.CreateDataInput,
34
- pushId: (id: string) => void,
32
+ insertIdCallback: (id: string) => void,
33
+ builderCb: (builder: InsertBuilder) => void,
35
34
  ): Promise<MutationResultList> {
36
- const where = this.predicateFactory.create(entity, Acl.Operation.create, Object.keys(data))
37
35
  const insertBuilder = this.insertBuilderFactory.create(entity)
38
36
  // eslint-disable-next-line promise/catch-or-return
39
- insertBuilder.insert.then(id => id && pushId(String(id)))
40
-
41
- insertBuilder.addWhere(where)
37
+ insertBuilder.insert.then(id => id && insertIdCallback(String(id)))
42
38
 
39
+ insertBuilder.addPredicates(Object.keys(data))
43
40
  const visitor = new CreateInputVisitor<MutationResultList>(
44
41
  new SqlCreateInputProcessor(insertBuilder, mapper, this.providers),
45
42
  this.schema,
@@ -50,6 +47,7 @@ export class Inserter {
50
47
  entity,
51
48
  visitor,
52
49
  )
50
+ builderCb(insertBuilder)
53
51
 
54
52
  const okResultFactory = (primary: Value.PrimaryValue, values: RowValues) =>
55
53
  new MutationCreateOk([], entity, primary, data, values)
@@ -77,5 +75,3 @@ export class Inserter {
77
75
  }
78
76
  }
79
77
 
80
- export const AbortInsert = Symbol('AbortInsert')
81
- export type AbortInsert = typeof AbortInsert
@@ -2,18 +2,30 @@ import { Input, Model, Value } from '@contember/schema'
2
2
  import { Mapper } from '../Mapper'
3
3
  import { InsertBuilder } from './InsertBuilder'
4
4
  import { Providers, resolveColumnValue } from '@contember/schema-utils'
5
- import { CreateInputProcessor } from '../../inputProcessing'
6
5
  import * as Context from '../../inputProcessing'
7
- import { getInsertPrimary, MutationEntryNotFoundError, MutationResultList } from '../Result'
6
+ import { CreateInputProcessor } from '../../inputProcessing'
7
+ import { MutationResultList } from '../Result'
8
8
  import { hasManyProcessor, hasOneProcessor } from '../MutationProcessorHelper'
9
- import { AbortInsert } from './Inserter'
9
+ import { OneHasOneInverseCreateInputProcessor } from '../relations/OneHasOneInverseCreateInputProcessor'
10
+ import { OneHasOneOwningCreateInputProcessor } from '../relations/OneHasOneOwningCreateInputProcessor'
11
+ import { ManyHasManyInputProcessor } from '../relations/ManyHasManyInputProcessor'
12
+ import { ManyHasOneInputProcessor } from '../relations/ManyHasOneInputProcessor'
13
+ import { OneHasManyInputProcessor } from '../relations/OneHasManyInputProcessor'
10
14
 
11
15
  export class SqlCreateInputProcessor implements CreateInputProcessor<MutationResultList> {
16
+
17
+ private oneHasOneInverseCreateInputProcessor = new OneHasOneInverseCreateInputProcessor(this.insertBuilder, this.mapper)
18
+ private oneHasOneOwningCreateInputProcessor = new OneHasOneOwningCreateInputProcessor(this.insertBuilder, this.mapper)
19
+ private oneHasManyCreateInputProcessor = new OneHasManyInputProcessor(this.mapper)
20
+ private manyHasOneCreateInputProcessor = new ManyHasOneInputProcessor(this.mapper)
21
+ private manyHasManyCreateInputProcessor = new ManyHasManyInputProcessor(this.mapper)
22
+
12
23
  constructor(
13
24
  private readonly insertBuilder: InsertBuilder,
14
25
  private readonly mapper: Mapper,
15
26
  private readonly providers: Providers,
16
- ) {}
27
+ ) {
28
+ }
17
29
 
18
30
  public async column(context: Model.ColumnContext & { input: Input.ColumnValue | undefined }): Promise<MutationResultList> {
19
31
  this.insertBuilder.addFieldValue(
@@ -26,71 +38,50 @@ export class SqlCreateInputProcessor implements CreateInputProcessor<MutationRes
26
38
  }
27
39
 
28
40
  manyHasManyInverse: CreateInputProcessor<MutationResultList>['manyHasManyInverse'] = {
29
- connect: hasManyProcessor(async (context): Promise<MutationResultList> => {
30
- const inversePrimary = await this.insertBuilder.insert
31
- if (!inversePrimary) {
41
+ connect: hasManyProcessor(async ctx => {
42
+ const primary = await this.insertBuilder.insert
43
+ if (!primary) {
32
44
  return []
33
45
  }
34
- const owningPrimary = await this.mapper.getPrimaryValue(context.targetEntity, context.input)
35
- if (!owningPrimary) {
36
- return [new MutationEntryNotFoundError([], context.input)]
37
- }
38
- return await this.mapper.connectJunction(
39
- context.targetEntity,
40
- context.targetRelation,
41
- owningPrimary,
42
- inversePrimary,
43
- )
46
+ return this.manyHasManyCreateInputProcessor.connect(ctx, primary)
44
47
  }),
45
- create: hasOneProcessor(async (context): Promise<MutationResultList> => {
46
- const inversePrimary = await this.insertBuilder.insert
47
- if (!inversePrimary) {
48
+ create: hasManyProcessor(async ctx => {
49
+ const primary = await this.insertBuilder.insert
50
+ if (!primary) {
48
51
  return []
49
52
  }
50
- const insertResult = await this.mapper.insert(context.targetEntity, context.input)
51
- const owningPrimary = getInsertPrimary(insertResult)
52
- if (owningPrimary) {
53
- const connectResult = await this.mapper.connectJunction(
54
- context.targetEntity,
55
- context.targetRelation,
56
- owningPrimary,
57
- inversePrimary,
58
- )
59
- return [...insertResult, ...connectResult]
53
+ return this.manyHasManyCreateInputProcessor.create(ctx, primary)
54
+ }),
55
+ connectOrCreate: hasManyProcessor(async ctx => {
56
+ const primary = await this.insertBuilder.insert
57
+ if (!primary) {
58
+ return []
60
59
  }
61
- return insertResult
60
+ return this.manyHasManyCreateInputProcessor.connectOrCreate(ctx, primary)
62
61
  }),
63
62
  }
64
63
 
65
64
  manyHasManyOwning: CreateInputProcessor<MutationResultList>['manyHasManyOwning'] = {
66
- connect: hasManyProcessor(async (context): Promise<MutationResultList> => {
65
+ connect: hasManyProcessor(async ctx => {
67
66
  const primary = await this.insertBuilder.insert
68
67
  if (!primary) {
69
68
  return []
70
69
  }
71
- const inversePrimary = await this.mapper.getPrimaryValue(context.targetEntity, context.input)
72
- if (!inversePrimary) {
73
- return [new MutationEntryNotFoundError([], context.input)]
74
- }
75
- return await this.mapper.connectJunction(context.entity, context.relation, primary, inversePrimary)
70
+ return this.manyHasManyCreateInputProcessor.connect(ctx, primary)
76
71
  }),
77
- create: hasManyProcessor(async (context): Promise<MutationResultList> => {
72
+ create: hasManyProcessor(async ctx => {
78
73
  const primary = await this.insertBuilder.insert
79
74
  if (!primary) {
80
75
  return []
81
76
  }
82
- const insertResult = await this.mapper.insert(context.targetEntity, context.input)
83
- const inversePrimary = getInsertPrimary(insertResult)
84
- if (inversePrimary) {
85
- const connectResult = await this.mapper.connectJunction(
86
- context.entity,
87
- context.relation,
88
- primary,
89
- inversePrimary,
90
- )
91
- return [...insertResult, ...connectResult]
77
+ return this.manyHasManyCreateInputProcessor.create(ctx, primary)
78
+ }),
79
+ connectOrCreate: hasManyProcessor(async ctx => {
80
+ const primary = await this.insertBuilder.insert
81
+ if (!primary) {
82
+ return []
92
83
  }
93
- return insertResult
84
+ return this.manyHasManyCreateInputProcessor.connectOrCreate(ctx, primary)
94
85
  }),
95
86
  }
96
87
 
@@ -99,118 +90,49 @@ export class SqlCreateInputProcessor implements CreateInputProcessor<MutationRes
99
90
  this.insertBuilder.addFieldValue(ctx.relation.name, null)
100
91
  return []
101
92
  },
102
- connect: hasOneProcessor(async (context): Promise<MutationResultList> => {
103
- const primaryValue = this.mapper.getPrimaryValue(context.targetEntity, context.input)
104
- this.insertBuilder.addFieldValue(context.relation.name, async () => {
105
- const value = await primaryValue
106
- if (!value) {
107
- return AbortInsert
108
- }
109
- return value
110
- })
111
- if (!(await primaryValue)) {
112
- return [new MutationEntryNotFoundError([], context.input)]
113
- }
114
- return []
115
- }),
116
- create: hasOneProcessor(async (context): Promise<MutationResultList> => {
117
- const insertPromise = this.mapper.insert(context.targetEntity, context.input)
118
- await this.insertBuilder.addFieldValue(context.relation.name, async () => {
119
- const insertResult = await insertPromise
120
- const primary = getInsertPrimary(insertResult)
121
- if (!primary) {
122
- return AbortInsert
123
- }
124
- return primary
125
- })
126
- return await insertPromise
127
- }),
93
+ connect: hasOneProcessor(ctx => this.manyHasOneCreateInputProcessor.connect(ctx, this.insertBuilder)),
94
+ create: hasOneProcessor(ctx => this.manyHasOneCreateInputProcessor.create(ctx, this.insertBuilder)),
95
+ connectOrCreate: hasOneProcessor(ctx => this.manyHasOneCreateInputProcessor.connectOrCreate(ctx, this.insertBuilder)),
128
96
  }
129
97
 
130
98
  oneHasMany: CreateInputProcessor<MutationResultList>['oneHasMany'] = {
131
- connect: hasManyProcessor(async (context): Promise<MutationResultList> => {
99
+ connect: hasManyProcessor(async ctx => {
100
+ const primary = await this.insertBuilder.insert
101
+ if (!primary) {
102
+ return []
103
+ }
104
+ return this.oneHasManyCreateInputProcessor.connect(ctx, primary)
105
+ }),
106
+ create: hasManyProcessor(async ctx => {
132
107
  const primary = await this.insertBuilder.insert
133
108
  if (!primary) {
134
109
  return []
135
110
  }
136
- return await this.mapper.update(context.targetEntity, context.input, {
137
- [context.targetRelation.name]: {
138
- connect: { [context.entity.primary]: primary },
139
- },
140
- })
111
+ return this.oneHasManyCreateInputProcessor.create(ctx, primary)
141
112
  }),
142
- create: hasManyProcessor(async (context): Promise<MutationResultList> => {
113
+ connectOrCreate: hasManyProcessor(async ctx => {
143
114
  const primary = await this.insertBuilder.insert
144
115
  if (!primary) {
145
116
  return []
146
117
  }
147
- return await this.mapper.insert(context.targetEntity, {
148
- ...context.input,
149
- [context.targetRelation.name]: {
150
- connect: { [context.entity.primary]: primary },
151
- },
152
- })
118
+ return this.oneHasManyCreateInputProcessor.connectOrCreate(ctx, primary)
153
119
  }),
154
120
  }
155
121
 
122
+
156
123
  oneHasOneOwning: CreateInputProcessor<MutationResultList>['oneHasOneOwning'] = {
157
124
  nothing: async ctx => {
158
125
  this.insertBuilder.addFieldValue(ctx.relation.name, null)
159
126
  return []
160
127
  },
161
- connect: hasOneProcessor(
162
- async (context: Model.OneHasOneOwningContext & { input: Input.UniqueWhere }): Promise<MutationResultList> => {
163
- const primaryValue = this.mapper.getPrimaryValue(context.targetEntity, context.input)
164
- this.insertBuilder.addFieldValue(context.relation.name, async () => {
165
- const value = await primaryValue
166
- if (!value) {
167
- return AbortInsert
168
- }
169
- return value
170
- })
171
- if (!(await primaryValue)) {
172
- return [new MutationEntryNotFoundError([], context.input)]
173
- }
174
- return []
175
- },
176
- ),
177
- create: hasOneProcessor(async (context): Promise<MutationResultList> => {
178
- const insertPromise = this.mapper.insert(context.targetEntity, context.input)
179
- await this.insertBuilder.addFieldValue(context.relation.name, async () => {
180
- const insertResult = await insertPromise
181
- const primary = getInsertPrimary(insertResult)
182
- if (!primary) {
183
- return AbortInsert
184
- }
185
- return primary
186
- })
187
- return await insertPromise
188
- }),
128
+ connect: hasOneProcessor(ctx => this.oneHasOneOwningCreateInputProcessor.connect(ctx)),
129
+ create: hasOneProcessor(ctx => this.oneHasOneOwningCreateInputProcessor.create(ctx)),
130
+ connectOrCreate: hasOneProcessor(ctx => this.oneHasOneOwningCreateInputProcessor.connectOrCreate(ctx)),
189
131
  }
190
132
 
191
133
  oneHasOneInverse: CreateInputProcessor<MutationResultList>['oneHasOneInverse'] = {
192
- connect: hasOneProcessor(async (context): Promise<MutationResultList> => {
193
- const value = await this.insertBuilder.insert
194
- if (!value) {
195
- return []
196
- }
197
- return await this.mapper.update(context.targetEntity, context.input, {
198
- [context.targetRelation.name]: {
199
- connect: { [context.entity.primary]: value },
200
- },
201
- })
202
- }),
203
- create: hasOneProcessor(async (context): Promise<MutationResultList> => {
204
- const primary = await this.insertBuilder.insert
205
- if (!primary) {
206
- return []
207
- }
208
- return await this.mapper.insert(context.targetEntity, {
209
- ...context.input,
210
- [context.targetRelation.name]: {
211
- connect: { [context.entity.primary]: primary },
212
- },
213
- })
214
- }),
134
+ connect: hasOneProcessor(ctx => this.oneHasOneInverseCreateInputProcessor.connect(ctx)),
135
+ create: hasOneProcessor(ctx => this.oneHasOneInverseCreateInputProcessor.create(ctx)),
136
+ connectOrCreate: hasOneProcessor(ctx => this.oneHasOneInverseCreateInputProcessor.connectOrCreate(ctx)),
215
137
  }
216
138
  }
@@ -0,0 +1,108 @@
1
+ import { UpdateInputProcessor } from '../../inputProcessing'
2
+ import { Input, Model } from '@contember/schema'
3
+ import { getInsertPrimary, MutationEntryNotFoundError, MutationResultList } from '../Result'
4
+ import { Mapper } from '../Mapper'
5
+
6
+ type RelationContext = Model.ManyHasManyOwningContext | Model.ManyHasManyInverseContext
7
+
8
+ export class ManyHasManyInputProcessor {
9
+ constructor(
10
+ private readonly mapper: Mapper,
11
+ ) {
12
+ }
13
+
14
+ public async connect(
15
+ { entity, targetEntity, relation, targetRelation, input }: RelationContext & { input: Input.UniqueWhere },
16
+ primary: Input.PrimaryValue,
17
+ ) {
18
+ const otherPrimary = await this.mapper.getPrimaryValue(targetEntity, input)
19
+ if (!otherPrimary) {
20
+ return [new MutationEntryNotFoundError([], input)]
21
+ }
22
+ return await this.mapper.connectJunction(entity, relation, primary, otherPrimary)
23
+ }
24
+
25
+ public async create(
26
+ { entity, targetEntity, relation, input }: RelationContext & { input: Input.CreateDataInput },
27
+ primary: Input.PrimaryValue,
28
+ ) {
29
+ const insertResult = await this.mapper.insert(targetEntity, input)
30
+ const insertPrimary = getInsertPrimary(insertResult)
31
+ if (!insertPrimary) {
32
+ return insertResult
33
+ }
34
+ return [
35
+ ...insertResult,
36
+ ...(await this.mapper.connectJunction(entity, relation, primary, insertPrimary)),
37
+ ]
38
+ }
39
+
40
+ public async connectOrCreate(
41
+ context: RelationContext & { input: Input.ConnectOrCreateInput },
42
+ primary: Input.PrimaryValue,
43
+ ): Promise<MutationResultList> {
44
+ let otherPrimary = await this.mapper.getPrimaryValue(context.targetEntity, context.input.connect)
45
+ if (!otherPrimary) {
46
+ const insertResult = await this.mapper.insert(context.targetEntity, context.input.create)
47
+ otherPrimary = getInsertPrimary(insertResult)
48
+ if (!otherPrimary) {
49
+ return insertResult
50
+ }
51
+ }
52
+ return await this.mapper.connectJunction(context.entity, context.relation, primary, otherPrimary)
53
+ }
54
+
55
+ public async update(
56
+ { entity, targetEntity, relation, input: { where, data } }: RelationContext & { input: UpdateInputProcessor.UpdateManyInput },
57
+ primary: Input.PrimaryValue,
58
+ ) {
59
+ const otherPrimary = await this.mapper.getPrimaryValue(targetEntity, where)
60
+ if (!otherPrimary) {
61
+ return [new MutationEntryNotFoundError([], where)]
62
+ }
63
+ return [
64
+ ...(await this.mapper.update(targetEntity, { [targetEntity.primary]: otherPrimary }, data)),
65
+ ...(await this.mapper.connectJunction(entity, relation, primary, otherPrimary)),
66
+ ]
67
+ }
68
+
69
+ public async upsert(
70
+ { entity, relation, targetEntity, input: { create, update, where } }: RelationContext & { input: UpdateInputProcessor.UpsertManyInput },
71
+ primary: Input.PrimaryValue,
72
+ ) {
73
+ const otherPrimary = await this.mapper.getPrimaryValue(targetEntity, where)
74
+ if (otherPrimary) {
75
+ const updateResult = await this.mapper.update(targetEntity, { [targetEntity.primary]: otherPrimary }, update)
76
+ const connectResult = await this.mapper.connectJunction(entity, relation, primary, otherPrimary)
77
+ return [...updateResult, ...connectResult]
78
+ } else {
79
+ const insertResult = await this.mapper.insert(targetEntity, create)
80
+
81
+ const primaryValue = getInsertPrimary(insertResult)
82
+ if (!primaryValue) {
83
+ return insertResult
84
+ }
85
+ const connectResult = await this.mapper.connectJunction(entity, relation, primary, primaryValue)
86
+ return [...insertResult, ...connectResult]
87
+ }
88
+ }
89
+
90
+ public async disconnect(
91
+ { entity, targetEntity, relation, input }: RelationContext & { input: Input.UniqueWhere },
92
+ primary: Input.PrimaryValue,
93
+ ) {
94
+ const otherPrimary = await this.mapper.getPrimaryValue(targetEntity, input)
95
+ if (!otherPrimary) {
96
+ return [new MutationEntryNotFoundError([], input)]
97
+ }
98
+
99
+ return await this.mapper.disconnectJunction(entity, relation, primary, otherPrimary)
100
+ }
101
+
102
+ public async delete(
103
+ { entity, targetEntity, relation, targetRelation, input }: RelationContext & { input: Input.UniqueWhere },
104
+ primary: Input.PrimaryValue,
105
+ ) {
106
+ return await this.mapper.delete(targetEntity, input)
107
+ }
108
+ }
@@ -0,0 +1,158 @@
1
+ import { UpdateInputProcessor } from '../../inputProcessing'
2
+ import { Input, Model } from '@contember/schema'
3
+ import {
4
+ ConstraintType,
5
+ getInsertPrimary,
6
+ MutationConstraintViolationError,
7
+ MutationEntryNotFoundError,
8
+ MutationNothingToDo,
9
+ MutationResultList,
10
+ NothingToDoReason,
11
+ } from '../Result'
12
+ import { Mapper } from '../Mapper'
13
+ import { AbortDataManipulation, DataManipulationBuilder } from '../DataManipulationBuilder'
14
+ import { UpdateBuilder } from '../update'
15
+
16
+ export class ManyHasOneInputProcessor {
17
+
18
+ constructor(
19
+ private readonly mapper: Mapper,
20
+ ) {
21
+ }
22
+
23
+ public async connect(
24
+ { targetEntity, relation, input }: Model.ManyHasOneContext & { input: Input.UniqueWhere },
25
+ builder: DataManipulationBuilder,
26
+ ) {
27
+ const result: MutationResultList = []
28
+ await builder.addFieldValue(relation.name, async () => {
29
+ const value = await this.mapper.getPrimaryValue(targetEntity, input)
30
+ if (!value) {
31
+ result.push(new MutationEntryNotFoundError([], input))
32
+ return AbortDataManipulation
33
+ }
34
+ return value
35
+ })
36
+ return result
37
+ }
38
+
39
+ public async create(
40
+ { relation, targetEntity, input }: Model.ManyHasOneContext & { input: Input.CreateDataInput },
41
+ builder: DataManipulationBuilder,
42
+ ) {
43
+ const result: MutationResultList = []
44
+ await builder.addFieldValue(relation.name, async () => {
45
+ const insertResult = await this.mapper.insert(targetEntity, input)
46
+ const value = getInsertPrimary(insertResult)
47
+ if (!value) {
48
+ result.push(...insertResult)
49
+ return AbortDataManipulation
50
+ }
51
+ return value
52
+ })
53
+ return result
54
+ }
55
+
56
+ public async connectOrCreate(
57
+ { input: { connect, create }, relation, targetEntity }: Model.ManyHasOneContext & { input: Input.ConnectOrCreateInput },
58
+ builder: DataManipulationBuilder,
59
+ ) {
60
+ const result: MutationResultList = []
61
+ await builder.addFieldValue(relation.name, async () => {
62
+ const value = await this.mapper.getPrimaryValue(targetEntity, connect)
63
+ if (value) {
64
+ return value
65
+ }
66
+ const insertPromise = this.mapper.insert(targetEntity, create)
67
+ const insertResult = await insertPromise
68
+ const primary = getInsertPrimary(insertResult)
69
+ if (!primary) {
70
+ result.push(...insertResult)
71
+ return AbortDataManipulation
72
+ }
73
+ return primary
74
+ })
75
+ return result
76
+ }
77
+
78
+ public async update(
79
+ { entity, relation, targetEntity, targetRelation, input }: Model.ManyHasOneContext & { input: Input.UpdateDataInput },
80
+ primary: Input.PrimaryValue,
81
+ ) {
82
+ const inversePrimary = await this.mapper.selectField(
83
+ entity,
84
+ { [entity.primary]: primary },
85
+ relation.name,
86
+ )
87
+ if (!inversePrimary) {
88
+ return [new MutationNothingToDo([], NothingToDoReason.emptyRelation)]
89
+ }
90
+ return await this.mapper.update(targetEntity, { [targetEntity.primary]: inversePrimary }, input)
91
+ }
92
+
93
+ public async upsert(
94
+ { entity, relation, targetEntity, input: { create, update } }: Model.ManyHasOneContext & { input: UpdateInputProcessor.UpsertInput },
95
+ builder: DataManipulationBuilder,
96
+ primary: Input.PrimaryValue,
97
+ ) {
98
+ const select = this.mapper.selectField(entity, { [entity.primary]: primary }, relation.name)
99
+
100
+ const result: MutationResultList = []
101
+ // addFieldValue has to be called immediately
102
+ await builder.addFieldValue(relation.name, async () => {
103
+ const primary = await select
104
+ if (primary) {
105
+ return undefined
106
+ }
107
+ const insertResult = await this.mapper.insert(targetEntity, create)
108
+ const insertPrimary = getInsertPrimary(insertResult)
109
+ if (insertPrimary) {
110
+ return insertPrimary
111
+ }
112
+ result.push(...insertResult)
113
+ return AbortDataManipulation
114
+ })
115
+
116
+ const inversePrimary = await select
117
+ if (inversePrimary) {
118
+ return await this.mapper.update(targetEntity, { [targetEntity.primary]: inversePrimary }, update)
119
+ } else {
120
+ return result
121
+ }
122
+ }
123
+
124
+ public async disconnect(
125
+ { entity, targetEntity, relation, targetRelation }: Model.ManyHasOneContext & { input: undefined },
126
+ builder: DataManipulationBuilder,
127
+ ) {
128
+ if (!relation.nullable) {
129
+ return [new MutationConstraintViolationError([], ConstraintType.notNull)]
130
+ }
131
+ builder.addFieldValue(relation.name, null)
132
+ return []
133
+ }
134
+
135
+ public async delete(
136
+ { entity, targetEntity, relation, targetRelation }: Model.ManyHasOneContext & { input: undefined },
137
+ builder: UpdateBuilder,
138
+ primary: Input.PrimaryValue,
139
+ ) {
140
+ if (!relation.nullable && relation.joiningColumn.onDelete !== Model.OnDelete.cascade) {
141
+ return [new MutationConstraintViolationError([], ConstraintType.notNull)]
142
+ }
143
+ if (relation.joiningColumn.onDelete === Model.OnDelete.restrict) {
144
+ // eslint-disable-next-line no-console
145
+ console.error(
146
+ '[DEPRECATED] You are deleting an entity over the relation where onDelete behaviour is set to restrict. This will fail in next version.',
147
+ )
148
+ builder.addFieldValue(relation.name, null)
149
+ }
150
+ const inversePrimary = await this.mapper.selectField(
151
+ entity,
152
+ { [entity.primary]: primary },
153
+ relation.name,
154
+ )
155
+ await builder.update
156
+ return await this.mapper.delete(targetEntity, { [targetEntity.primary]: inversePrimary })
157
+ }
158
+ }
@@ -0,0 +1,101 @@
1
+ import { UpdateInputProcessor } from '../../inputProcessing'
2
+ import { Input, Model } from '@contember/schema'
3
+ import { Mapper } from '../Mapper'
4
+ import { MutationResultType } from '../Result'
5
+
6
+ export class OneHasManyInputProcessor {
7
+ constructor(
8
+ private readonly mapper: Mapper,
9
+ ) {
10
+ }
11
+
12
+ public async connect(
13
+ { entity, targetEntity, targetRelation, input }: Model.OneHasManyContext & { input: Input.UniqueWhere },
14
+ primary: Input.PrimaryValue,
15
+ ) {
16
+ return await this.mapper.update(targetEntity, input, {
17
+ [targetRelation.name]: { connect: { [entity.primary]: primary } },
18
+ })
19
+ }
20
+
21
+ public async create(
22
+ { entity, targetEntity, targetRelation, input }: Model.OneHasManyContext & { input: Input.CreateDataInput },
23
+ primary: Input.PrimaryValue,
24
+ ) {
25
+ return await this.mapper.insert(targetEntity, {
26
+ ...input,
27
+ [targetRelation.name]: { connect: { [entity.primary]: primary } },
28
+ })
29
+ }
30
+
31
+ public async connectOrCreate(
32
+ { entity, targetRelation, targetEntity, input: { connect, create } }: Model.OneHasManyContext & { input: Input.ConnectOrCreateInput },
33
+ primary: Input.PrimaryValue,
34
+ ) {
35
+ const connectData = {
36
+ [targetRelation.name]: {
37
+ connect: { [entity.primary]: primary },
38
+ },
39
+ }
40
+ return await this.mapper.upsert(targetEntity, connect, connectData, {
41
+ ...create,
42
+ ...connectData,
43
+ })
44
+ }
45
+
46
+ public async update(
47
+ { entity, targetEntity, targetRelation, input: { data, where } }: Model.OneHasManyContext & { input: UpdateInputProcessor.UpdateManyInput },
48
+ primary: Input.PrimaryValue,
49
+ ) {
50
+ return await this.mapper.update(
51
+ targetEntity,
52
+ { ...where, [targetRelation.name]: { [entity.primary]: primary } },
53
+ {
54
+ ...data,
55
+ // [targetRelation.name]: {connect: thisPrimary}
56
+ },
57
+ )
58
+ }
59
+
60
+ public async upsert(
61
+ { entity, targetEntity, targetRelation, input: { create, update, where } }: Model.OneHasManyContext & { input: UpdateInputProcessor.UpsertManyInput },
62
+ primary: Input.PrimaryValue,
63
+ ) {
64
+ const result = await this.mapper.update(
65
+ targetEntity,
66
+ { ...where, [targetRelation.name]: { [entity.primary]: primary } },
67
+ {
68
+ ...update,
69
+ // [targetRelation.name]: {connect: thisPrimary}
70
+ },
71
+ )
72
+ if (result[0].result === MutationResultType.notFoundError) {
73
+ return await this.mapper.insert(targetEntity, {
74
+ ...create,
75
+ [targetRelation.name]: { connect: { [entity.primary]: primary } },
76
+ })
77
+ }
78
+ return result
79
+ }
80
+
81
+ public async disconnect(
82
+ { entity, targetEntity, relation, targetRelation, input }: Model.OneHasManyContext & { input: Input.UniqueWhere },
83
+ primary: Input.PrimaryValue,
84
+ ) {
85
+ return await this.mapper.update(
86
+ targetEntity,
87
+ { ...input, [targetRelation.name]: { [entity.primary]: primary } },
88
+ { [targetRelation.name]: { disconnect: true } },
89
+ )
90
+ }
91
+
92
+ public async delete(
93
+ { entity, targetEntity, relation, targetRelation, input }: Model.OneHasManyContext & { input: Input.UniqueWhere },
94
+ primary: Input.PrimaryValue,
95
+ ) {
96
+ return await this.mapper.delete(targetEntity, {
97
+ ...input,
98
+ [targetRelation.name]: { [entity.primary]: primary },
99
+ })
100
+ }
101
+ }