@contember/engine-content-api 1.2.0-rc.4 → 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 (378) 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/update/SqlUpdateInputProcessor.d.ts +5 -0
  102. package/dist/src/mapper/update/SqlUpdateInputProcessor.d.ts.map +1 -1
  103. package/dist/src/mapper/update/SqlUpdateInputProcessor.js +52 -389
  104. package/dist/src/mapper/update/SqlUpdateInputProcessor.js.map +1 -1
  105. package/dist/src/mapper/update/UpdateBuilder.d.ts +7 -4
  106. package/dist/src/mapper/update/UpdateBuilder.d.ts.map +1 -1
  107. package/dist/src/mapper/update/UpdateBuilder.js +18 -12
  108. package/dist/src/mapper/update/UpdateBuilder.js.map +1 -1
  109. package/dist/src/mapper/update/UpdateBuilderFactory.d.ts +3 -1
  110. package/dist/src/mapper/update/UpdateBuilderFactory.d.ts.map +1 -1
  111. package/dist/src/mapper/update/UpdateBuilderFactory.js +3 -2
  112. package/dist/src/mapper/update/UpdateBuilderFactory.js.map +1 -1
  113. package/dist/src/mapper/update/Updater.d.ts +1 -4
  114. package/dist/src/mapper/update/Updater.d.ts.map +1 -1
  115. package/dist/src/mapper/update/Updater.js +11 -13
  116. package/dist/src/mapper/update/Updater.js.map +1 -1
  117. package/dist/src/resolvers/MutationResolver.js +1 -1
  118. package/dist/src/resolvers/MutationResolver.js.map +1 -1
  119. package/dist/src/schema/GraphQlSchemaBuilderFactory.d.ts +3 -0
  120. package/dist/src/schema/GraphQlSchemaBuilderFactory.d.ts.map +1 -1
  121. package/dist/src/schema/GraphQlSchemaBuilderFactory.js +4 -2
  122. package/dist/src/schema/GraphQlSchemaBuilderFactory.js.map +1 -1
  123. package/dist/src/schema/mutations/ConnectOrCreateRelationInputProvider.d.ts +15 -0
  124. package/dist/src/schema/mutations/ConnectOrCreateRelationInputProvider.d.ts.map +1 -0
  125. package/dist/src/schema/mutations/ConnectOrCreateRelationInputProvider.js +43 -0
  126. package/dist/src/schema/mutations/ConnectOrCreateRelationInputProvider.js.map +1 -0
  127. package/dist/src/schema/mutations/CreateEntityInputFieldVisitor.d.ts.map +1 -1
  128. package/dist/src/schema/mutations/CreateEntityInputFieldVisitor.js +2 -6
  129. package/dist/src/schema/mutations/CreateEntityInputFieldVisitor.js.map +1 -1
  130. package/dist/src/schema/mutations/CreateEntityRelationAllowedOperationsVisitor.d.ts.map +1 -1
  131. package/dist/src/schema/mutations/CreateEntityRelationAllowedOperationsVisitor.js +3 -0
  132. package/dist/src/schema/mutations/CreateEntityRelationAllowedOperationsVisitor.js.map +1 -1
  133. package/dist/src/schema/mutations/CreateEntityRelationInputFieldVisitor.d.ts +3 -1
  134. package/dist/src/schema/mutations/CreateEntityRelationInputFieldVisitor.d.ts.map +1 -1
  135. package/dist/src/schema/mutations/CreateEntityRelationInputFieldVisitor.js +15 -8
  136. package/dist/src/schema/mutations/CreateEntityRelationInputFieldVisitor.js.map +1 -1
  137. package/dist/src/schema/mutations/EntityInputProvider.d.ts.map +1 -1
  138. package/dist/src/schema/mutations/EntityInputProvider.js +0 -3
  139. package/dist/src/schema/mutations/EntityInputProvider.js.map +1 -1
  140. package/dist/src/schema/mutations/UpdateEntityInputFieldVisitor.d.ts.map +1 -1
  141. package/dist/src/schema/mutations/UpdateEntityInputFieldVisitor.js +2 -6
  142. package/dist/src/schema/mutations/UpdateEntityInputFieldVisitor.js.map +1 -1
  143. package/dist/src/schema/mutations/UpdateEntityRelationAllowedOperationsVisitor.d.ts.map +1 -1
  144. package/dist/src/schema/mutations/UpdateEntityRelationAllowedOperationsVisitor.js +3 -0
  145. package/dist/src/schema/mutations/UpdateEntityRelationAllowedOperationsVisitor.js.map +1 -1
  146. package/dist/src/schema/mutations/UpdateEntityRelationInputFieldVisitor.d.ts +3 -1
  147. package/dist/src/schema/mutations/UpdateEntityRelationInputFieldVisitor.d.ts.map +1 -1
  148. package/dist/src/schema/mutations/UpdateEntityRelationInputFieldVisitor.js +11 -22
  149. package/dist/src/schema/mutations/UpdateEntityRelationInputFieldVisitor.js.map +1 -1
  150. package/dist/src/tsconfig.tsbuildinfo +1 -1
  151. package/dist/tests/cases/integration/graphQlDb/update/deferedConstraints.test.js +2 -2
  152. package/dist/tests/cases/integration/graphQlDb/update/deferedConstraints.test.js.map +1 -1
  153. package/dist/tests/cases/integration/graphQlDb/update/failedDelete.test.js +1 -1
  154. package/dist/tests/cases/integration/graphQlDb/update/failedDelete.test.js.map +1 -1
  155. package/dist/tests/cases/integration/graphQlDb/update/nullChecksNotNull.test.js +1 -1
  156. package/dist/tests/cases/integration/graphQlDb/update/nullChecksNotNull.test.js.map +1 -1
  157. package/dist/tests/cases/integration/graphQlDb/update/nullChecksNullable.test.js +0 -3
  158. package/dist/tests/cases/integration/graphQlDb/update/nullChecksNullable.test.js.map +1 -1
  159. package/dist/tests/cases/integration/graphQlRequests/delete/aclDelete.test.js +13 -32
  160. package/dist/tests/cases/integration/graphQlRequests/delete/aclDelete.test.js.map +1 -1
  161. package/dist/tests/cases/integration/graphQlRequests/delete/additionalDeleteFilter.test.js +11 -30
  162. package/dist/tests/cases/integration/graphQlRequests/delete/additionalDeleteFilter.test.js.map +1 -1
  163. package/dist/tests/cases/integration/graphQlRequests/delete/cascadeDelete.test.js +62 -45
  164. package/dist/tests/cases/integration/graphQlRequests/delete/cascadeDelete.test.js.map +1 -1
  165. package/dist/tests/cases/integration/graphQlRequests/delete/deleteById.test.js +10 -11
  166. package/dist/tests/cases/integration/graphQlRequests/delete/deleteById.test.js.map +1 -1
  167. package/dist/tests/cases/integration/graphQlRequests/delete/orphanRemoval.test.js +29 -18
  168. package/dist/tests/cases/integration/graphQlRequests/delete/orphanRemoval.test.js.map +1 -1
  169. package/dist/tests/cases/integration/graphQlRequests/delete/restrictOnDelete.test.d.ts +2 -0
  170. package/dist/tests/cases/integration/graphQlRequests/delete/restrictOnDelete.test.d.ts.map +1 -0
  171. package/dist/tests/cases/integration/graphQlRequests/delete/restrictOnDelete.test.js +97 -0
  172. package/dist/tests/cases/integration/graphQlRequests/delete/restrictOnDelete.test.js.map +1 -0
  173. package/dist/tests/cases/integration/graphQlRequests/delete/setNullOnDelete.test.js +58 -22
  174. package/dist/tests/cases/integration/graphQlRequests/delete/setNullOnDelete.test.js.map +1 -1
  175. package/dist/tests/cases/integration/graphQlRequests/insert/manyHasManyInverse/create.test.d.ts +2 -0
  176. package/dist/tests/cases/integration/graphQlRequests/insert/manyHasManyInverse/create.test.d.ts.map +1 -0
  177. package/dist/tests/cases/integration/graphQlRequests/insert/manyHasManyInverse/{insertRelationCreate.test.js → create.test.js} +1 -1
  178. package/dist/tests/cases/integration/graphQlRequests/insert/manyHasManyInverse/create.test.js.map +1 -0
  179. package/dist/tests/cases/integration/graphQlRequests/insert/manyHasManyOwning/create.test.d.ts +2 -0
  180. package/dist/tests/cases/integration/graphQlRequests/insert/manyHasManyOwning/create.test.d.ts.map +1 -0
  181. package/dist/tests/cases/integration/graphQlRequests/insert/manyHasManyOwning/{insertRelationCreate.test.js → create.test.js} +1 -1
  182. package/dist/tests/cases/integration/graphQlRequests/insert/manyHasManyOwning/create.test.js.map +1 -0
  183. package/dist/tests/cases/integration/graphQlRequests/insert/manyHasOne/connectOrCreate.test.d.ts +2 -0
  184. package/dist/tests/cases/integration/graphQlRequests/insert/manyHasOne/connectOrCreate.test.d.ts.map +1 -0
  185. package/dist/tests/cases/integration/graphQlRequests/insert/manyHasOne/connectOrCreate.test.js +99 -0
  186. package/dist/tests/cases/integration/graphQlRequests/insert/manyHasOne/connectOrCreate.test.js.map +1 -0
  187. package/dist/tests/cases/integration/graphQlRequests/insert/manyHasOne/create.test.d.ts +2 -0
  188. package/dist/tests/cases/integration/graphQlRequests/insert/manyHasOne/create.test.d.ts.map +1 -0
  189. package/dist/tests/cases/integration/graphQlRequests/insert/manyHasOne/{insertRelationCreate.test.js → create.test.js} +1 -1
  190. package/dist/tests/cases/integration/graphQlRequests/insert/manyHasOne/create.test.js.map +1 -0
  191. package/dist/tests/cases/integration/graphQlRequests/insert/oneHasMany/connect.test.d.ts +2 -0
  192. package/dist/tests/cases/integration/graphQlRequests/insert/oneHasMany/connect.test.d.ts.map +1 -0
  193. package/dist/tests/cases/integration/graphQlRequests/insert/oneHasMany/{insertRelationConnect.test.js → connect.test.js} +1 -1
  194. package/dist/tests/cases/integration/graphQlRequests/insert/oneHasMany/connect.test.js.map +1 -0
  195. package/dist/tests/cases/integration/graphQlRequests/insert/oneHasMany/create.test.d.ts +2 -0
  196. package/dist/tests/cases/integration/graphQlRequests/insert/oneHasMany/create.test.d.ts.map +1 -0
  197. package/dist/tests/cases/integration/graphQlRequests/insert/oneHasMany/{insertRelationCreate.test.js → create.test.js} +1 -1
  198. package/dist/tests/cases/integration/graphQlRequests/insert/oneHasMany/create.test.js.map +1 -0
  199. package/dist/tests/cases/integration/graphQlRequests/insert/oneHasOneInverse/create.test.d.ts +2 -0
  200. package/dist/tests/cases/integration/graphQlRequests/insert/oneHasOneInverse/create.test.d.ts.map +1 -0
  201. package/dist/tests/cases/integration/graphQlRequests/insert/oneHasOneInverse/{insertRelationCreate.test.js → create.test.js} +1 -1
  202. package/dist/tests/cases/integration/graphQlRequests/insert/oneHasOneInverse/create.test.js.map +1 -0
  203. package/dist/tests/cases/integration/graphQlRequests/insert/oneHasOneOwning/create.test.d.ts +2 -0
  204. package/dist/tests/cases/integration/graphQlRequests/insert/oneHasOneOwning/create.test.d.ts.map +1 -0
  205. package/dist/tests/cases/integration/graphQlRequests/insert/oneHasOneOwning/{insertRelationCreate.test.js → create.test.js} +1 -1
  206. package/dist/tests/cases/integration/graphQlRequests/insert/oneHasOneOwning/create.test.js.map +1 -0
  207. package/dist/tests/cases/integration/graphQlRequests/insert/oneHasOneOwning/empty.test.d.ts +2 -0
  208. package/dist/tests/cases/integration/graphQlRequests/insert/oneHasOneOwning/empty.test.d.ts.map +1 -0
  209. package/dist/tests/cases/integration/graphQlRequests/insert/oneHasOneOwning/{insertRelationEmpty.test.js → empty.test.js} +1 -1
  210. package/dist/tests/cases/integration/graphQlRequests/insert/oneHasOneOwning/empty.test.js.map +1 -0
  211. package/dist/tests/cases/integration/graphQlRequests/update/manyHasManyInverse/delete.test.js +49 -11
  212. package/dist/tests/cases/integration/graphQlRequests/update/manyHasManyInverse/delete.test.js.map +1 -1
  213. package/dist/tests/cases/integration/graphQlRequests/update/manyHasManyOwning/delete.test.js +49 -11
  214. package/dist/tests/cases/integration/graphQlRequests/update/manyHasManyOwning/delete.test.js.map +1 -1
  215. package/dist/tests/cases/integration/graphQlRequests/update/manyHasOne/delete.test.js +83 -49
  216. package/dist/tests/cases/integration/graphQlRequests/update/manyHasOne/delete.test.js.map +1 -1
  217. package/dist/tests/cases/integration/graphQlRequests/update/oneHasMany/combination.test.js +10 -11
  218. package/dist/tests/cases/integration/graphQlRequests/update/oneHasMany/combination.test.js.map +1 -1
  219. package/dist/tests/cases/integration/graphQlRequests/update/oneHasMany/delete.test.js +49 -11
  220. package/dist/tests/cases/integration/graphQlRequests/update/oneHasMany/delete.test.js.map +1 -1
  221. package/dist/tests/cases/integration/graphQlRequests/update/oneHasOneInverse/connect.test.js +103 -0
  222. package/dist/tests/cases/integration/graphQlRequests/update/oneHasOneInverse/connect.test.js.map +1 -1
  223. package/dist/tests/cases/integration/graphQlRequests/update/oneHasOneInverse/create.test.js +20 -14
  224. package/dist/tests/cases/integration/graphQlRequests/update/oneHasOneInverse/create.test.js.map +1 -1
  225. package/dist/tests/cases/integration/graphQlRequests/update/oneHasOneInverse/delete.test.js +101 -11
  226. package/dist/tests/cases/integration/graphQlRequests/update/oneHasOneInverse/delete.test.js.map +1 -1
  227. package/dist/tests/cases/integration/graphQlRequests/update/oneHasOneInverse/disconnect.test.js +17 -11
  228. package/dist/tests/cases/integration/graphQlRequests/update/oneHasOneInverse/disconnect.test.js.map +1 -1
  229. package/dist/tests/cases/integration/graphQlRequests/update/oneHasOneInverse/schema.d.ts +1 -0
  230. package/dist/tests/cases/integration/graphQlRequests/update/oneHasOneInverse/schema.d.ts.map +1 -1
  231. package/dist/tests/cases/integration/graphQlRequests/update/oneHasOneInverse/schema.js +9 -1
  232. package/dist/tests/cases/integration/graphQlRequests/update/oneHasOneInverse/schema.js.map +1 -1
  233. package/dist/tests/cases/integration/graphQlRequests/update/oneHasOneInverse/upsert.test.js +8 -6
  234. package/dist/tests/cases/integration/graphQlRequests/update/oneHasOneInverse/upsert.test.js.map +1 -1
  235. package/dist/tests/cases/integration/graphQlRequests/update/oneHasOneOwning/connect.test.js +76 -0
  236. package/dist/tests/cases/integration/graphQlRequests/update/oneHasOneOwning/connect.test.js.map +1 -1
  237. package/dist/tests/cases/integration/graphQlRequests/update/oneHasOneOwning/connectOrCreate.test.d.ts +2 -0
  238. package/dist/tests/cases/integration/graphQlRequests/update/oneHasOneOwning/connectOrCreate.test.d.ts.map +1 -0
  239. package/dist/tests/cases/integration/graphQlRequests/update/oneHasOneOwning/connectOrCreate.test.js +53 -0
  240. package/dist/tests/cases/integration/graphQlRequests/update/oneHasOneOwning/connectOrCreate.test.js.map +1 -0
  241. package/dist/tests/cases/integration/graphQlRequests/update/oneHasOneOwning/create.test.js +80 -0
  242. package/dist/tests/cases/integration/graphQlRequests/update/oneHasOneOwning/create.test.js.map +1 -1
  243. package/dist/tests/cases/integration/graphQlRequests/update/oneHasOneOwning/delete.test.js +66 -25
  244. package/dist/tests/cases/integration/graphQlRequests/update/oneHasOneOwning/delete.test.js.map +1 -1
  245. package/dist/tests/cases/integration/graphQlRequests/update/oneHasOneOwning/schema.d.ts +1 -0
  246. package/dist/tests/cases/integration/graphQlRequests/update/oneHasOneOwning/schema.d.ts.map +1 -1
  247. package/dist/tests/cases/integration/graphQlRequests/update/oneHasOneOwning/schema.js +10 -2
  248. package/dist/tests/cases/integration/graphQlRequests/update/oneHasOneOwning/schema.js.map +1 -1
  249. package/dist/tests/cases/integration/graphQlSchema/schema-acl-allowed.gql +14 -1
  250. package/dist/tests/cases/integration/graphQlSchema/schema-acl-restricted-create.gql +5 -5
  251. package/dist/tests/cases/integration/graphQlSchema/schema-acl-restricted-delete.gql +14 -1
  252. package/dist/tests/cases/integration/graphQlSchema/schema-acl-restricted-update.gql +12 -0
  253. package/dist/tests/cases/integration/graphQlSchema/schema-basic.gql +40 -2
  254. package/dist/tests/cases/integration/graphQlSchema/schema-bug-66.gql +30 -3
  255. package/dist/tests/cases/integration/graphQlSchema/schema-custom-primary.gql +40 -2
  256. package/dist/tests/cases/integration/graphQlSchema/schema-has-many-reduction.gql +14 -1
  257. package/dist/tests/cases/integration/graphQlSchema/schema-new-builder.gql +40 -2
  258. package/dist/tests/src/test.d.ts +0 -1
  259. package/dist/tests/src/test.d.ts.map +1 -1
  260. package/dist/tests/src/test.js +1 -27
  261. package/dist/tests/src/test.js.map +1 -1
  262. package/dist/tests/src/testGraphql.js +1 -1
  263. package/dist/tests/src/testGraphql.js.map +1 -1
  264. package/dist/tests/tsconfig.tsbuildinfo +1 -1
  265. package/package.json +11 -11
  266. package/src/input-validation/preValidation/CreateInputPreValidationProcessor.ts +6 -0
  267. package/src/input-validation/preValidation/UpdateInputPreValidationProcessor.ts +6 -0
  268. package/src/inputProcessing/CreateInputProcessor.ts +8 -11
  269. package/src/inputProcessing/CreateInputVisitor.ts +11 -2
  270. package/src/inputProcessing/UniqueWhereExpander.ts +5 -1
  271. package/src/inputProcessing/UpdateInputProcessor.ts +18 -18
  272. package/src/inputProcessing/UpdateInputVisitor.ts +6 -2
  273. package/src/mapper/DataManipulationBuilder.ts +12 -0
  274. package/src/mapper/Mapper.ts +75 -47
  275. package/src/mapper/MapperContainer.ts +10 -6
  276. package/src/mapper/Result.ts +1 -1
  277. package/src/mapper/delete/DeleteExecutor.ts +221 -95
  278. package/src/mapper/delete/DeleteState.ts +80 -0
  279. package/src/mapper/delete/DeletedEntitiesStorage.ts +6 -0
  280. package/src/mapper/delete/helpers.ts +68 -0
  281. package/src/mapper/insert/InsertBuilder.ts +23 -12
  282. package/src/mapper/insert/InsertBuilderFactory.ts +3 -1
  283. package/src/mapper/insert/Inserter.ts +6 -10
  284. package/src/mapper/insert/SqlCreateInputProcessor.ts +61 -139
  285. package/src/mapper/relations/ManyHasManyInputProcessor.ts +108 -0
  286. package/src/mapper/relations/ManyHasOneInputProcessor.ts +158 -0
  287. package/src/mapper/relations/OneHasManyInputProcessor.ts +101 -0
  288. package/src/mapper/relations/OneHasOneInverseCreateInputProcessor.ts +99 -0
  289. package/src/mapper/relations/OneHasOneInverseUpdateInputProcessor.ts +164 -0
  290. package/src/mapper/relations/OneHasOneOwningCreateInputProcessor.ts +92 -0
  291. package/src/mapper/relations/OneHasOneOwningUpdateInputProcessor.ts +253 -0
  292. package/src/mapper/select/JoinBuilder.ts +4 -4
  293. package/src/mapper/select/WhereBuilder.ts +11 -11
  294. package/src/mapper/update/SqlUpdateInputProcessor.ts +55 -484
  295. package/src/mapper/update/UpdateBuilder.ts +22 -15
  296. package/src/mapper/update/UpdateBuilderFactory.ts +10 -1
  297. package/src/mapper/update/Updater.ts +10 -19
  298. package/src/resolvers/MutationResolver.ts +1 -1
  299. package/src/schema/GraphQlSchemaBuilderFactory.ts +7 -4
  300. package/src/schema/mutations/ConnectOrCreateRelationInputProvider.ts +54 -0
  301. package/src/schema/mutations/CreateEntityInputFieldVisitor.ts +2 -6
  302. package/src/schema/mutations/CreateEntityRelationAllowedOperationsVisitor.ts +3 -1
  303. package/src/schema/mutations/CreateEntityRelationInputFieldVisitor.ts +20 -15
  304. package/src/schema/mutations/EntityInputProvider.ts +0 -3
  305. package/src/schema/mutations/UpdateEntityInputFieldVisitor.ts +2 -6
  306. package/src/schema/mutations/UpdateEntityRelationAllowedOperationsVisitor.ts +3 -1
  307. package/src/schema/mutations/UpdateEntityRelationInputFieldVisitor.ts +52 -57
  308. package/tests/cases/integration/graphQlDb/update/deferedConstraints.test.ts +2 -2
  309. package/tests/cases/integration/graphQlDb/update/failedDelete.test.ts +1 -1
  310. package/tests/cases/integration/graphQlDb/update/nullChecksNotNull.test.ts +1 -1
  311. package/tests/cases/integration/graphQlDb/update/nullChecksNullable.test.ts +0 -3
  312. package/tests/cases/integration/graphQlRequests/delete/aclDelete.test.ts +15 -34
  313. package/tests/cases/integration/graphQlRequests/delete/additionalDeleteFilter.test.ts +12 -31
  314. package/tests/cases/integration/graphQlRequests/delete/cascadeDelete.test.ts +68 -46
  315. package/tests/cases/integration/graphQlRequests/delete/deleteById.test.ts +11 -12
  316. package/tests/cases/integration/graphQlRequests/delete/orphanRemoval.test.ts +30 -19
  317. package/tests/cases/integration/graphQlRequests/delete/restrictOnDelete.test.ts +102 -0
  318. package/tests/cases/integration/graphQlRequests/delete/setNullOnDelete.test.ts +63 -23
  319. package/tests/cases/integration/graphQlRequests/insert/manyHasManyInverse/{insertRelationCreate.test.ts → create.test.ts} +0 -0
  320. package/tests/cases/integration/graphQlRequests/insert/manyHasManyOwning/{insertRelationCreate.test.ts → create.test.ts} +0 -0
  321. package/tests/cases/integration/graphQlRequests/insert/manyHasOne/connectOrCreate.test.ts +106 -0
  322. package/tests/cases/integration/graphQlRequests/insert/manyHasOne/{insertRelationCreate.test.ts → create.test.ts} +0 -0
  323. package/tests/cases/integration/graphQlRequests/insert/oneHasMany/{insertRelationConnect.test.ts → connect.test.ts} +0 -0
  324. package/tests/cases/integration/graphQlRequests/insert/oneHasMany/{insertRelationCreate.test.ts → create.test.ts} +0 -0
  325. package/tests/cases/integration/graphQlRequests/insert/oneHasOneInverse/{insertRelationCreate.test.ts → create.test.ts} +0 -0
  326. package/tests/cases/integration/graphQlRequests/insert/oneHasOneOwning/{insertRelationCreate.test.ts → create.test.ts} +0 -0
  327. package/tests/cases/integration/graphQlRequests/insert/oneHasOneOwning/{insertRelationEmpty.test.ts → empty.test.ts} +0 -0
  328. package/tests/cases/integration/graphQlRequests/update/manyHasManyInverse/delete.test.ts +51 -12
  329. package/tests/cases/integration/graphQlRequests/update/manyHasManyOwning/delete.test.ts +51 -12
  330. package/tests/cases/integration/graphQlRequests/update/manyHasOne/delete.test.ts +86 -50
  331. package/tests/cases/integration/graphQlRequests/update/oneHasMany/combination.test.ts +11 -12
  332. package/tests/cases/integration/graphQlRequests/update/oneHasMany/delete.test.ts +51 -12
  333. package/tests/cases/integration/graphQlRequests/update/oneHasOneInverse/connect.test.ts +106 -1
  334. package/tests/cases/integration/graphQlRequests/update/oneHasOneInverse/create.test.ts +20 -14
  335. package/tests/cases/integration/graphQlRequests/update/oneHasOneInverse/delete.test.ts +106 -12
  336. package/tests/cases/integration/graphQlRequests/update/oneHasOneInverse/disconnect.test.ts +17 -11
  337. package/tests/cases/integration/graphQlRequests/update/oneHasOneInverse/schema.ts +13 -0
  338. package/tests/cases/integration/graphQlRequests/update/oneHasOneInverse/upsert.test.ts +8 -6
  339. package/tests/cases/integration/graphQlRequests/update/oneHasOneOwning/connect.test.ts +80 -1
  340. package/tests/cases/integration/graphQlRequests/update/oneHasOneOwning/connectOrCreate.test.ts +51 -0
  341. package/tests/cases/integration/graphQlRequests/update/oneHasOneOwning/create.test.ts +81 -1
  342. package/tests/cases/integration/graphQlRequests/update/oneHasOneOwning/delete.test.ts +69 -26
  343. package/tests/cases/integration/graphQlRequests/update/oneHasOneOwning/schema.ts +14 -1
  344. package/tests/cases/integration/graphQlSchema/schema-acl-allowed.gql +14 -1
  345. package/tests/cases/integration/graphQlSchema/schema-acl-restricted-create.gql +5 -5
  346. package/tests/cases/integration/graphQlSchema/schema-acl-restricted-delete.gql +14 -1
  347. package/tests/cases/integration/graphQlSchema/schema-acl-restricted-update.gql +12 -0
  348. package/tests/cases/integration/graphQlSchema/schema-basic.gql +40 -2
  349. package/tests/cases/integration/graphQlSchema/schema-bug-66.gql +30 -3
  350. package/tests/cases/integration/graphQlSchema/schema-custom-primary.gql +40 -2
  351. package/tests/cases/integration/graphQlSchema/schema-has-many-reduction.gql +14 -1
  352. package/tests/cases/integration/graphQlSchema/schema-new-builder.gql +40 -2
  353. package/tests/src/test.ts +0 -25
  354. package/tests/src/testGraphql.ts +1 -1
  355. package/dist/tests/cases/integration/graphQlRequests/insert/manyHasManyInverse/insertRelationCreate.test.d.ts +0 -2
  356. package/dist/tests/cases/integration/graphQlRequests/insert/manyHasManyInverse/insertRelationCreate.test.d.ts.map +0 -1
  357. package/dist/tests/cases/integration/graphQlRequests/insert/manyHasManyInverse/insertRelationCreate.test.js.map +0 -1
  358. package/dist/tests/cases/integration/graphQlRequests/insert/manyHasManyOwning/insertRelationCreate.test.d.ts +0 -2
  359. package/dist/tests/cases/integration/graphQlRequests/insert/manyHasManyOwning/insertRelationCreate.test.d.ts.map +0 -1
  360. package/dist/tests/cases/integration/graphQlRequests/insert/manyHasManyOwning/insertRelationCreate.test.js.map +0 -1
  361. package/dist/tests/cases/integration/graphQlRequests/insert/manyHasOne/insertRelationCreate.test.d.ts +0 -2
  362. package/dist/tests/cases/integration/graphQlRequests/insert/manyHasOne/insertRelationCreate.test.d.ts.map +0 -1
  363. package/dist/tests/cases/integration/graphQlRequests/insert/manyHasOne/insertRelationCreate.test.js.map +0 -1
  364. package/dist/tests/cases/integration/graphQlRequests/insert/oneHasMany/insertRelationConnect.test.d.ts +0 -2
  365. package/dist/tests/cases/integration/graphQlRequests/insert/oneHasMany/insertRelationConnect.test.d.ts.map +0 -1
  366. package/dist/tests/cases/integration/graphQlRequests/insert/oneHasMany/insertRelationConnect.test.js.map +0 -1
  367. package/dist/tests/cases/integration/graphQlRequests/insert/oneHasMany/insertRelationCreate.test.d.ts +0 -2
  368. package/dist/tests/cases/integration/graphQlRequests/insert/oneHasMany/insertRelationCreate.test.d.ts.map +0 -1
  369. package/dist/tests/cases/integration/graphQlRequests/insert/oneHasMany/insertRelationCreate.test.js.map +0 -1
  370. package/dist/tests/cases/integration/graphQlRequests/insert/oneHasOneInverse/insertRelationCreate.test.d.ts +0 -2
  371. package/dist/tests/cases/integration/graphQlRequests/insert/oneHasOneInverse/insertRelationCreate.test.d.ts.map +0 -1
  372. package/dist/tests/cases/integration/graphQlRequests/insert/oneHasOneInverse/insertRelationCreate.test.js.map +0 -1
  373. package/dist/tests/cases/integration/graphQlRequests/insert/oneHasOneOwning/insertRelationCreate.test.d.ts +0 -2
  374. package/dist/tests/cases/integration/graphQlRequests/insert/oneHasOneOwning/insertRelationCreate.test.d.ts.map +0 -1
  375. package/dist/tests/cases/integration/graphQlRequests/insert/oneHasOneOwning/insertRelationCreate.test.js.map +0 -1
  376. package/dist/tests/cases/integration/graphQlRequests/insert/oneHasOneOwning/insertRelationEmpty.test.d.ts +0 -2
  377. package/dist/tests/cases/integration/graphQlRequests/insert/oneHasOneOwning/insertRelationEmpty.test.d.ts.map +0 -1
  378. package/dist/tests/cases/integration/graphQlRequests/insert/oneHasOneOwning/insertRelationEmpty.test.js.map +0 -1
@@ -0,0 +1,99 @@
1
+ import { InsertBuilder } from '../insert'
2
+ import { Mapper } from '../Mapper'
3
+ import {
4
+ ConstraintType,
5
+ MutationConstraintViolationError,
6
+ MutationEntryNotFoundError,
7
+ MutationResultList,
8
+ } from '../Result'
9
+ import { CheckedPrimary } from '../CheckedPrimary'
10
+ import { Input, Model } from '@contember/schema'
11
+
12
+ export class OneHasOneInverseCreateInputProcessor {
13
+ constructor(
14
+ private readonly insertBuilder: InsertBuilder,
15
+ private readonly mapper: Mapper,
16
+ ) {
17
+ }
18
+
19
+ public async connect(context: Model.OneHasOneInverseContext & { input: Input.UniqueWhere }) {
20
+ const { targetEntity, input } = context
21
+ const primary = await this.insertBuilder.insert
22
+ if (!primary) {
23
+ return []
24
+ }
25
+ const owner = await this.mapper.getPrimaryValue(targetEntity, input)
26
+ if (!owner) {
27
+ return [new MutationEntryNotFoundError([], input)]
28
+ }
29
+
30
+ return await this.connectInternal({ ...context, input: new CheckedPrimary(owner) }, primary)
31
+ }
32
+
33
+
34
+ public async create(
35
+ context: Model.OneHasOneInverseContext & { input: Input.CreateDataInput },
36
+ ) {
37
+ const primary = await this.insertBuilder.insert
38
+ if (!primary) {
39
+ return []
40
+ }
41
+ return await this.mapper.insert(context.targetEntity, context.input, builder => {
42
+ builder.addPredicates([context.targetRelation.name])
43
+ builder.addFieldValue(context.targetRelation.name, primary)
44
+ })
45
+ }
46
+
47
+ public async connectOrCreate(
48
+ { input, ...context }: Model.OneHasOneInverseContext & { input: Input.ConnectOrCreateInput },
49
+ ) {
50
+ const primary = await this.insertBuilder.insert
51
+ if (!primary) {
52
+ return []
53
+ }
54
+ const owner = await this.mapper.getPrimaryValue(context.targetEntity, input.connect)
55
+ if (owner) {
56
+ return await this.connectInternal({ ...context, input: new CheckedPrimary(owner) }, primary)
57
+ }
58
+
59
+ return await this.createInternal({ input: input.create, ...context }, primary)
60
+ }
61
+
62
+ private async connectInternal(
63
+ { entity, targetEntity, targetRelation, relation, input }: Model.OneHasOneInverseContext & { input: CheckedPrimary },
64
+ primary: Input.PrimaryValue,
65
+ ) {
66
+
67
+ const currentInverseSideOfOwner = await this.mapper.selectField(targetEntity, input, targetRelation.name)
68
+ const orphanResult: MutationResultList = []
69
+ if (currentInverseSideOfOwner) {
70
+ if (targetRelation.orphanRemoval) {
71
+ const orphanUnique = { [entity.primary]: currentInverseSideOfOwner }
72
+ const orphanDelete = await this.mapper.delete(entity, orphanUnique)
73
+ orphanResult.push(...orphanDelete)
74
+ } else if (!relation.nullable) {
75
+ return [new MutationConstraintViolationError([], ConstraintType.notNull)]
76
+ }
77
+ }
78
+
79
+ const connectResult = await this.mapper.updateInternal(targetEntity, input, update => {
80
+ update.addPredicates([targetRelation.name])
81
+ update.addFieldValue(targetRelation.name, primary)
82
+ })
83
+
84
+ return [
85
+ ...connectResult,
86
+ ...orphanResult,
87
+ ]
88
+ }
89
+
90
+ private async createInternal(
91
+ context: Model.OneHasOneInverseContext & { input: Input.CreateDataInput },
92
+ primary: Input.PrimaryValue,
93
+ ) {
94
+ return await this.mapper.insert(context.targetEntity, context.input, builder => {
95
+ builder.addPredicates([context.targetRelation.name])
96
+ builder.addFieldValue(context.targetRelation.name, primary)
97
+ })
98
+ }
99
+ }
@@ -0,0 +1,164 @@
1
+ import {
2
+ ConstraintType,
3
+ MutationConstraintViolationError,
4
+ MutationEntryNotFoundError,
5
+ MutationNothingToDo,
6
+ MutationResultList,
7
+ MutationResultType,
8
+ NothingToDoReason,
9
+ } from '../Result'
10
+ import { UpdateInputProcessor } from '../../inputProcessing'
11
+ import { Input, Model } from '@contember/schema'
12
+ import { Mapper } from '../Mapper'
13
+
14
+ export class OneHasOneInverseUpdateInputProcessor {
15
+ constructor(
16
+ private readonly primaryValue: Input.PrimaryValue,
17
+ private readonly mapper: Mapper,
18
+ ) {
19
+ }
20
+
21
+ public async connect({ input, ...ctx }: Model.OneHasOneInverseContext & { input: Input.UniqueWhere }) {
22
+ const newOwner = await this.mapper.getPrimaryValue(ctx.targetEntity, input)
23
+ if (!newOwner) {
24
+ return [new MutationEntryNotFoundError([], input)]
25
+ }
26
+ return await this.connectInternal(ctx, newOwner)
27
+ }
28
+
29
+ public async connectOrCreate(
30
+ { input, ...ctx }: Model.OneHasOneInverseContext & { input: Input.ConnectOrCreateInput },
31
+ ) {
32
+ const newOwner = await this.mapper.getPrimaryValue(ctx.targetEntity, input.connect)
33
+ if (newOwner) {
34
+ return await this.connectInternal(ctx, newOwner)
35
+ }
36
+ return await this.create({ ...ctx, input: input.create })
37
+ }
38
+
39
+
40
+ private async connectInternal(
41
+ { entity, targetEntity, targetRelation }: Model.OneHasOneInverseContext,
42
+ newOwner: Input.PrimaryValue,
43
+ ) {
44
+ const currentOwner = await this.mapper.getPrimaryValue(targetEntity, {
45
+ [targetRelation.name]: { [entity.primary]: this.primaryValue },
46
+ })
47
+ if (newOwner === currentOwner) {
48
+ return [new MutationNothingToDo([], NothingToDoReason.alreadyExists)]
49
+ }
50
+ const result: MutationResultList = []
51
+ if (currentOwner) {
52
+ if (!targetRelation.nullable) {
53
+ // todo cascade delete support?
54
+ return [new MutationConstraintViolationError([], ConstraintType.notNull)]
55
+ }
56
+ const disconnectFromCurrentOwner = await this.mapper.updateInternal(targetEntity, { [targetEntity.primary]: currentOwner }, builder => {
57
+ builder.addPredicates([targetRelation.name])
58
+ builder.addFieldValue(targetRelation.name, null)
59
+ })
60
+ result.push(...disconnectFromCurrentOwner)
61
+ }
62
+ const orphanedInverseSide = targetRelation.orphanRemoval
63
+ ? await this.mapper.selectField(targetEntity, { [targetEntity.primary]: newOwner }, targetRelation.name)
64
+ : null
65
+
66
+ const connectToNewOwner = await this.mapper.updateInternal(targetEntity, { [targetEntity.primary]: newOwner }, builder => {
67
+ builder.addPredicates([targetRelation.name])
68
+ builder.addFieldValue(targetRelation.name, this.primaryValue)
69
+ })
70
+ result.push(...connectToNewOwner)
71
+
72
+ if (orphanedInverseSide) {
73
+ const deleteOrphanedInverseSide = await this.mapper.delete(entity, { [entity.primary]: orphanedInverseSide })
74
+ result.push(...deleteOrphanedInverseSide)
75
+ }
76
+ return result
77
+ }
78
+
79
+ public async create({ entity, targetEntity, targetRelation, input }: Model.OneHasOneInverseContext & { input: Input.CreateDataInput }) {
80
+ const currentOwner = await this.mapper.getPrimaryValue(targetEntity, {
81
+ [targetRelation.name]: { [entity.primary]: this.primaryValue },
82
+ })
83
+ if (currentOwner && !targetRelation.nullable) {
84
+ // todo cascade delete support?
85
+ return [new MutationConstraintViolationError([], ConstraintType.notNull)]
86
+ }
87
+ const result: MutationResultList = []
88
+ if (currentOwner) {
89
+ const disconnectFromCurrentOwner = await this.mapper.updateInternal(targetEntity, { [targetEntity.primary]: currentOwner }, builder => {
90
+ builder.addPredicates([targetRelation.name])
91
+ builder.addFieldValue(targetRelation.name, null)
92
+ })
93
+ result.push(...disconnectFromCurrentOwner)
94
+ }
95
+
96
+ const connectToNewlyCreatedOwner = await this.mapper.insert(targetEntity, input, builder => {
97
+ builder.addFieldValue(targetRelation.name, this.primaryValue)
98
+ builder.addPredicates([targetRelation.name])
99
+ })
100
+ result.push(...connectToNewlyCreatedOwner)
101
+
102
+ return result
103
+ }
104
+
105
+ public async update({ entity, targetEntity, targetRelation, input }: Model.OneHasOneInverseContext & { input: Input.UpdateDataInput }) {
106
+ return await this.mapper.update(
107
+ targetEntity,
108
+ { [targetRelation.name]: { [entity.primary]: this.primaryValue } },
109
+ input,
110
+ )
111
+ }
112
+
113
+ public async upsert(context: Model.OneHasOneInverseContext & { input: UpdateInputProcessor.UpsertInput }) {
114
+ const { targetEntity, targetRelation, entity, input: { update, create } } = context
115
+ const result = await this.mapper.update(
116
+ targetEntity,
117
+ { [targetRelation.name]: { [entity.primary]: this.primaryValue } },
118
+ update,
119
+ )
120
+ if (result[0].result === MutationResultType.notFoundError) {
121
+ return await this.create({
122
+ ...context,
123
+ input: create,
124
+ })
125
+ }
126
+ return result
127
+ }
128
+
129
+ public async disconnect({ entity, targetEntity, relation, targetRelation }: Model.OneHasOneInverseContext & { input: undefined }) {
130
+ if (!relation.nullable && !targetRelation.orphanRemoval) {
131
+ return [new MutationConstraintViolationError([], ConstraintType.notNull)]
132
+ }
133
+ const currentOwner = await this.mapper.getPrimaryValue(targetEntity, {
134
+ [targetRelation.name]: { [entity.primary]: this.primaryValue },
135
+ })
136
+ if (!currentOwner) {
137
+ return [new MutationNothingToDo([], NothingToDoReason.emptyRelation)]
138
+ }
139
+ if (currentOwner && !targetRelation.nullable) {
140
+ return [new MutationConstraintViolationError([], ConstraintType.notNull)]
141
+ }
142
+
143
+ const result = await this.mapper.updateInternal(
144
+ targetEntity,
145
+ { [targetEntity.primary]: currentOwner },
146
+ builder => {
147
+ builder.addPredicates([targetRelation.name])
148
+ builder.addFieldValue(targetRelation.name, null)
149
+ },
150
+ )
151
+ if (targetRelation.orphanRemoval) {
152
+ result.push(...(await this.mapper.delete(entity, { [entity.primary]: this.primaryValue })))
153
+ }
154
+ return result
155
+ }
156
+
157
+ public async delete({ entity, targetEntity, relation, targetRelation }: Model.OneHasOneInverseContext & { input: undefined }) {
158
+ if (!relation.nullable && !targetRelation.orphanRemoval) {
159
+ return [new MutationConstraintViolationError([], ConstraintType.notNull)]
160
+ }
161
+ // orphan removal is handled in mapper.delete
162
+ return await this.mapper.delete(targetEntity, { [targetRelation.name]: { [entity.primary]: this.primaryValue } })
163
+ }
164
+ }
@@ -0,0 +1,92 @@
1
+ import {
2
+ ConstraintType,
3
+ getInsertPrimary,
4
+ MutationConstraintViolationError,
5
+ MutationEntryNotFoundError,
6
+ MutationResultList,
7
+ } from '../Result'
8
+ import { InsertBuilder } from '../insert'
9
+ import { Mapper } from '../Mapper'
10
+ import { Input, Model } from '@contember/schema'
11
+ import { AbortDataManipulation } from '../DataManipulationBuilder'
12
+
13
+ export class OneHasOneOwningCreateInputProcessor {
14
+ constructor(
15
+ private readonly insertBuilder: InsertBuilder,
16
+ private readonly mapper: Mapper,
17
+ ) {
18
+ }
19
+
20
+ public async connect(context: Model.OneHasOneOwningContext & { input: Input.UniqueWhere }) {
21
+ const { input, relation, targetEntity } = context
22
+ const result: MutationResultList = []
23
+ await this.insertBuilder.addFieldValue(relation.name, async () => {
24
+ const inverseSide = await this.mapper.getPrimaryValue(targetEntity, input)
25
+ if (!inverseSide) {
26
+ result.push(new MutationEntryNotFoundError([], input))
27
+ return AbortDataManipulation
28
+ }
29
+ return this.connectInternal({ ...context, input: inverseSide }, result)
30
+ })
31
+ return result
32
+ }
33
+
34
+ public async create(context: Model.OneHasOneOwningContext & { input: Input.CreateDataInput }) {
35
+ const result: MutationResultList = []
36
+ await this.insertBuilder.addFieldValue(context.relation.name, async () => {
37
+ return await this.createInternal(context, result)
38
+ })
39
+ return result
40
+ }
41
+
42
+ public async connectOrCreate({ input, ...context }: Model.OneHasOneOwningContext & { input: Input.ConnectOrCreateInput }) {
43
+ const result: MutationResultList = []
44
+ await this.insertBuilder.addFieldValue(context.relation.name, async () => {
45
+ const inverseSide = await this.mapper.getPrimaryValue(context.targetEntity, input.connect)
46
+ if (inverseSide) {
47
+ return await this.connectInternal({ ...context, input: inverseSide }, result)
48
+ }
49
+ return await this.createInternal({ ...context, input: input.create }, result)
50
+ })
51
+ return result
52
+ }
53
+
54
+ private async createInternal(
55
+ context: Model.OneHasOneOwningContext & { input: Input.CreateDataInput },
56
+ result: MutationResultList,
57
+ ) {
58
+ const insertResult = await this.mapper.insert(context.targetEntity, context.input)
59
+ result.push(...insertResult)
60
+ const primary = getInsertPrimary(insertResult)
61
+ if (!primary) {
62
+ return AbortDataManipulation
63
+ }
64
+ return primary
65
+ }
66
+
67
+ private async connectInternal(
68
+ { entity, relation, targetEntity, input }: Model.OneHasOneOwningContext & { input: Input.PrimaryValue },
69
+ result: MutationResultList,
70
+ ) {
71
+ const currentOwnerOfInverseSide = await this.mapper.getPrimaryValue(entity, {
72
+ [relation.name]: { [targetEntity.primary]: input },
73
+ })
74
+ if (!currentOwnerOfInverseSide) {
75
+ return input
76
+ }
77
+
78
+ if (!relation.nullable) {
79
+ result.push(new MutationConstraintViolationError([], ConstraintType.notNull))
80
+ return AbortDataManipulation
81
+ }
82
+
83
+ const currentOwnerUnique = { [entity.primary]: currentOwnerOfInverseSide }
84
+ const currentOwnerDisconnectResult = await this.mapper.updateInternal(entity, currentOwnerUnique, builder => {
85
+ builder.addPredicates([relation.name])
86
+ builder.addFieldValue(relation.name, null)
87
+ })
88
+ result.push(...currentOwnerDisconnectResult)
89
+
90
+ return input
91
+ }
92
+ }
@@ -0,0 +1,253 @@
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 { UpdateBuilder } from '../update/UpdateBuilder'
14
+ import { CheckedPrimary } from '../CheckedPrimary'
15
+ import { AbortDataManipulation } from '../DataManipulationBuilder'
16
+
17
+ export class OneHasOneOwningUpdateInputProcessor {
18
+ constructor(
19
+ private readonly primaryValue: Input.PrimaryValue,
20
+ private readonly mapper: Mapper,
21
+ private readonly updateBuilder: UpdateBuilder,
22
+ ) {
23
+ }
24
+
25
+ public async connect(context: Model.OneHasOneOwningContext & { input: Input.UniqueWhere }) {
26
+ const result: MutationResultList = []
27
+ let currentInverseSide: Input.PrimaryValue | undefined
28
+
29
+ const { entity, relation, targetEntity, targetRelation, input } = context
30
+ const newInverseSide = await this.updateBuilder.addFieldValue(relation.name, async () => {
31
+ const newInverseSide = await this.mapper.getPrimaryValue(targetEntity, input)
32
+ if (!newInverseSide) {
33
+ result.push(new MutationEntryNotFoundError([], input))
34
+ return AbortDataManipulation
35
+ }
36
+ currentInverseSide = await this.getCurrentInverseSide(targetRelation, relation, entity)
37
+ return await this.connectInternal(context, currentInverseSide, newInverseSide, result)
38
+ })
39
+
40
+ if (newInverseSide) {
41
+ result.push(...(await this.cleanupOrphan(relation, targetEntity, currentInverseSide)))
42
+ }
43
+
44
+ return result
45
+ }
46
+
47
+ public async create(context: Model.OneHasOneOwningContext & { input: Input.CreateDataInput }) {
48
+ const result: MutationResultList = []
49
+ let currentInverseSide: Input.PrimaryValue | undefined
50
+ const { entity, relation, targetEntity, targetRelation } = context
51
+ await this.updateBuilder.addFieldValue(relation.name, async () => {
52
+ currentInverseSide = await this.getCurrentInverseSide(targetRelation, relation, entity)
53
+ // orphan removal handled bellow
54
+ return await this.createInternal(context, currentInverseSide, result)
55
+ })
56
+
57
+ result.push(...(await this.cleanupOrphan(relation, targetEntity, currentInverseSide)))
58
+ return result
59
+ }
60
+
61
+ public async connectOrCreate({ input: { connect, create }, ...context }: Model.OneHasOneOwningContext & { input: Input.ConnectOrCreateInput }) {
62
+ const result: MutationResultList = []
63
+ let currentInverseSide: Input.PrimaryValue | undefined
64
+
65
+ const { relation, targetRelation, targetEntity, entity } = context
66
+ const newInverseSide = await this.updateBuilder.addFieldValue(relation.name, async () => {
67
+ const newInverseSide = await this.mapper.getPrimaryValue(targetEntity, connect)
68
+ currentInverseSide = await this.getCurrentInverseSide(targetRelation, relation, entity)
69
+ if (newInverseSide) {
70
+ return await this.connectInternal(context, currentInverseSide, newInverseSide, result)
71
+ }
72
+ return await this.createInternal({ ...context, input: create }, currentInverseSide, result)
73
+ })
74
+
75
+ if (newInverseSide) {
76
+ result.push(...(await this.cleanupOrphan(relation, targetEntity, currentInverseSide)))
77
+ }
78
+
79
+ return result
80
+ }
81
+
82
+ private async createInternal(
83
+ { targetEntity, targetRelation, relation, input }: Model.OneHasOneOwningContext & { input: Input.CreateDataInput },
84
+ currentInverseSide: Input.PrimaryValue | undefined,
85
+ result: MutationResultList,
86
+ ) {
87
+ if (targetRelation && !targetRelation.nullable && !relation.orphanRemoval && currentInverseSide) {
88
+ result.push(new MutationConstraintViolationError([], ConstraintType.notNull))
89
+ return AbortDataManipulation
90
+ }
91
+
92
+ const insertResult = await this.mapper.insert(targetEntity, input)
93
+ result.push(...insertResult)
94
+ const newInverseSide = getInsertPrimary(insertResult)
95
+ if (newInverseSide) {
96
+ return newInverseSide
97
+ }
98
+ return AbortDataManipulation
99
+ }
100
+
101
+ private async connectInternal(
102
+ { targetEntity, targetRelation, relation, entity }: Model.OneHasOneOwningContext,
103
+ currentInverseSide: Input.PrimaryValue | undefined,
104
+ newInverseSide: Input.PrimaryValue,
105
+ result: MutationResultList,
106
+ ) {
107
+
108
+ if (currentInverseSide === newInverseSide) {
109
+ result.push(new MutationNothingToDo([], NothingToDoReason.alreadyExists))
110
+ return undefined
111
+ }
112
+
113
+ const currentOwnerOfNewInverseSide = await this.mapper.getPrimaryValue(entity, {
114
+ [relation.name]: { [targetEntity.primary]: newInverseSide },
115
+ })
116
+
117
+ if (currentOwnerOfNewInverseSide === this.primaryValue) {
118
+ result.push(new MutationNothingToDo([], NothingToDoReason.alreadyExists))
119
+ return undefined
120
+ }
121
+
122
+ // orphan removal handled bellow
123
+ if (targetRelation && !targetRelation.nullable && !relation.orphanRemoval && currentInverseSide) {
124
+ result.push(new MutationConstraintViolationError([], ConstraintType.notNull))
125
+ return AbortDataManipulation
126
+ }
127
+
128
+ if (currentOwnerOfNewInverseSide) {
129
+ if (!relation.nullable) {
130
+ result.push(new MutationConstraintViolationError([], ConstraintType.notNull))
131
+ return AbortDataManipulation
132
+ }
133
+
134
+ const currentOwnerDisconnect = await this.mapper.updateInternal(
135
+ entity,
136
+ {
137
+ [entity.primary]: currentOwnerOfNewInverseSide,
138
+ },
139
+ builder => {
140
+ builder.addPredicates([relation.name])
141
+ builder.addFieldValue(relation.name, null)
142
+ },
143
+ )
144
+ result.push(...currentOwnerDisconnect)
145
+ }
146
+ return newInverseSide
147
+ }
148
+
149
+ private async getCurrentInverseSide(targetRelation: Model.OneHasOneInverseRelation | null, relation: Model.OneHasOneOwningRelation, entity: Model.Entity) {
150
+ if ((targetRelation && !targetRelation.nullable) || relation.orphanRemoval) {
151
+ return this.mapper.selectField(entity, { [entity.primary]: this.primaryValue }, relation.name)
152
+ }
153
+ return undefined
154
+ }
155
+
156
+ private async cleanupOrphan(relation: Model.OneHasOneOwningRelation, targetEntity: Model.Entity, currentInverseSide: Input.PrimaryValue | undefined) {
157
+ if (relation.orphanRemoval && currentInverseSide) {
158
+ await this.updateBuilder.update
159
+ return await this.mapper.delete(targetEntity, { [targetEntity.primary]: currentInverseSide })
160
+ }
161
+ return []
162
+ }
163
+
164
+ public async update({ entity, relation, targetEntity, input }: Model.OneHasOneOwningContext & { input: Input.UpdateDataInput }) {
165
+ const inversePrimary = await this.mapper.selectField(
166
+ entity,
167
+ { [entity.primary]: this.primaryValue },
168
+ relation.name,
169
+ )
170
+ if (!inversePrimary) {
171
+ return [new MutationNothingToDo([], NothingToDoReason.emptyRelation)]
172
+ }
173
+ return await this.mapper.update(targetEntity, { [targetEntity.primary]: inversePrimary }, input)
174
+ }
175
+
176
+ public async upsert({ entity, relation, targetEntity, input: { create, update } }: Model.OneHasOneOwningContext & { input: UpdateInputProcessor.UpsertInput }) {
177
+ const select = this.mapper.selectField(entity, { [entity.primary]: this.primaryValue }, relation.name)
178
+
179
+ const result: MutationResultList = []
180
+ //addColumnData has to be called synchronously
181
+ await this.updateBuilder.addFieldValue(relation.name, async () => {
182
+ const primary = await select
183
+ if (primary) {
184
+ return undefined
185
+ }
186
+ const insertResult = await this.mapper.insert(targetEntity, create)
187
+ const insertPrimary = getInsertPrimary(insertResult)
188
+ if (insertPrimary) {
189
+ return insertPrimary
190
+ }
191
+ result.push(...insertResult)
192
+ return AbortDataManipulation
193
+ })
194
+
195
+ const inversePrimary = await select
196
+ if (inversePrimary) {
197
+ return await this.mapper.update(targetEntity, { [targetEntity.primary]: inversePrimary }, update)
198
+ }
199
+ return result
200
+ }
201
+
202
+ public async disconnect({ entity, targetEntity, relation, targetRelation }: Model.OneHasOneOwningContext & { input: undefined }) {
203
+ if (!relation.nullable) {
204
+ return [new MutationConstraintViolationError([], ConstraintType.notNull)]
205
+ }
206
+ const result: MutationResultList = []
207
+
208
+ const currentInverseSide = (targetRelation && !targetRelation.nullable) || relation.orphanRemoval
209
+ ? this.mapper.selectField(entity, { [entity.primary]: this.primaryValue }, relation.name)
210
+ : Promise.resolve(undefined)
211
+
212
+ this.updateBuilder.addFieldValue(relation.name, async () => {
213
+ const inversePrimary = await currentInverseSide
214
+ if (inversePrimary && targetRelation && !targetRelation.nullable && !relation.orphanRemoval) {
215
+ result.push(new MutationConstraintViolationError([], ConstraintType.notNull))
216
+ return AbortDataManipulation
217
+ }
218
+ return null
219
+ })
220
+ if (relation.orphanRemoval) {
221
+ const inversePrimary = await currentInverseSide
222
+ if (inversePrimary) {
223
+ await this.updateBuilder.update
224
+ const deleteOrphanedInverseSide = await this.mapper.delete(targetEntity, { [targetEntity.primary]: inversePrimary })
225
+ result.push(...deleteOrphanedInverseSide)
226
+ }
227
+ }
228
+ return result
229
+ }
230
+
231
+ public async delete({ entity, targetEntity, relation, targetRelation }: Model.OneHasOneOwningContext & { input: undefined }) {
232
+ if (!relation.nullable && relation.joiningColumn.onDelete !== Model.OnDelete.cascade) {
233
+ return [new MutationConstraintViolationError([], ConstraintType.notNull)]
234
+ }
235
+ if (relation.joiningColumn.onDelete === Model.OnDelete.restrict) {
236
+ // eslint-disable-next-line no-console
237
+ console.error(
238
+ '[DEPRECATED] You are deleting an entity over the relation where onDelete behaviour is set to restrict. This will fail in next version.',
239
+ )
240
+ this.updateBuilder.addFieldValue(relation.name, null)
241
+ }
242
+ const targetPrimary = await this.mapper.selectField(
243
+ entity,
244
+ { [entity.primary]: this.primaryValue },
245
+ relation.name,
246
+ )
247
+ if (!targetPrimary) {
248
+ return [new MutationNothingToDo([], NothingToDoReason.emptyRelation)]
249
+ }
250
+ await this.updateBuilder.update
251
+ return await this.mapper.delete(targetEntity, new CheckedPrimary(targetPrimary))
252
+ }
253
+ }
@@ -8,12 +8,12 @@ import { SelectBuilder } from '@contember/database'
8
8
  export class JoinBuilder {
9
9
  constructor(private readonly schema: Model.Schema) {}
10
10
 
11
- join<Filled extends keyof SelectBuilder.Options>(
12
- qb: SelectBuilder<SelectBuilder.Result>,
11
+ join<R extends SelectBuilder.Result>(
12
+ qb: SelectBuilder<R>,
13
13
  path: Path,
14
14
  entity: Model.Entity,
15
15
  relationName: string,
16
- ) {
16
+ ): SelectBuilder<R> {
17
17
  const targetEntity = getTargetEntity(this.schema, entity, relationName)
18
18
  if (!targetEntity) {
19
19
  throw new Error(`JoinBuilder: target entity for relation ${entity.name}::${relationName} not found`)
@@ -21,7 +21,7 @@ export class JoinBuilder {
21
21
 
22
22
  const joins = acceptRelationTypeVisitor(this.schema, entity, relationName, new JoinVisitor(path))
23
23
 
24
- return joins.reduce<SelectBuilder<SelectBuilder.Result>>((qb, join) => {
24
+ return joins.reduce<SelectBuilder<R>>((qb, join) => {
25
25
  const targetAlias = join.targetAlias || path.alias
26
26
  if (qb.options.join.find(it => it.alias === targetAlias)) {
27
27
  return qb
@@ -23,13 +23,13 @@ export class WhereBuilder {
23
23
  private readonly useExistsInHasManyFilter: boolean,
24
24
  ) {}
25
25
 
26
- public build(
27
- qb: SelectBuilder<SelectBuilder.Result>,
26
+ public build<R extends SelectBuilder.Result>(
27
+ qb: SelectBuilder<R>,
28
28
  entity: Model.Entity,
29
29
  path: Path,
30
30
  where: Input.OptionalWhere,
31
31
  optimizationHints: WhereOptimizationHints = {},
32
- ) {
32
+ ): SelectBuilder<R> {
33
33
  const optimizedWhere = this.whereOptimizer.optimize(where, entity, optimizationHints)
34
34
  return this.buildInternal({
35
35
  entity,
@@ -41,13 +41,13 @@ export class WhereBuilder {
41
41
  }
42
42
 
43
43
 
44
- public buildAdvanced(
44
+ public buildAdvanced<R extends SelectBuilder.Result>(
45
45
  entity: Model.Entity,
46
46
  path: Path,
47
47
  where: Input.OptionalWhere,
48
- callback: (clauseCb: (clause: SqlConditionBuilder) => SqlConditionBuilder) => SelectBuilder<SelectBuilder.Result>,
48
+ callback: (clauseCb: (clause: SqlConditionBuilder) => SqlConditionBuilder) => SelectBuilder<R>,
49
49
  optimizationHints: WhereOptimizationHints = {},
50
- ) {
50
+ ): SelectBuilder<R> {
51
51
  const optimizedWhere = this.whereOptimizer.optimize(where, entity, optimizationHints)
52
52
  return this.buildInternal({
53
53
  entity,
@@ -58,11 +58,11 @@ export class WhereBuilder {
58
58
  })
59
59
  }
60
60
 
61
- private buildInternal({
61
+ private buildInternal<R extends SelectBuilder.Result>({
62
62
  callback,
63
63
  ...args
64
- }: { entity: Model.Entity; path: Path; where: Input.OptionalWhere; callback: (clauseCb: (clause: SqlConditionBuilder) => SqlConditionBuilder) => SelectBuilder<SelectBuilder.Result>; allowManyJoin: boolean },
65
- ) {
64
+ }: { entity: Model.Entity; path: Path; where: Input.OptionalWhere; callback: (clauseCb: (clause: SqlConditionBuilder) => SqlConditionBuilder) => SelectBuilder<R>; allowManyJoin: boolean },
65
+ ): SelectBuilder<R> {
66
66
  const joinList: WhereJoinDefinition[] = []
67
67
 
68
68
  const qbWithWhere = callback(clause => this.buildRecursive({
@@ -70,8 +70,8 @@ export class WhereBuilder {
70
70
  joinList: joinList,
71
71
  ...args,
72
72
  }))
73
- return joinList.reduce<SelectBuilder<SelectBuilder.Result>>(
74
- (qb, { path, entity, relationName }) => this.joinBuilder.join(qb, path, entity, relationName),
73
+ return joinList.reduce<SelectBuilder<R>>(
74
+ (qb, { path, entity, relationName }) => this.joinBuilder.join<R>(qb, path, entity, relationName),
75
75
  qbWithWhere,
76
76
  )
77
77
  }