@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
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@contember/engine-content-api",
3
- "version": "1.2.0-rc.4",
3
+ "version": "1.3.0-alpha.1",
4
4
  "license": "Apache-2.0",
5
5
  "main": "dist/src/index.js",
6
6
  "typings": "dist/src/index.d.ts",
@@ -10,21 +10,21 @@
10
10
  "test": "vitest --no-threads"
11
11
  },
12
12
  "dependencies": {
13
- "@contember/database": "^1.2.0-rc.4",
14
- "@contember/dic": "^1.2.0-rc.4",
15
- "@contember/logger": "^1.2.0-rc.4",
16
- "@contember/graphql-utils": "^1.2.0-rc.4",
17
- "@contember/schema": "^1.2.0-rc.4",
18
- "@contember/schema-definition": "^1.2.0-rc.4",
19
- "@contember/schema-utils": "^1.2.0-rc.4",
13
+ "@contember/database": "^1.3.0-alpha.1",
14
+ "@contember/dic": "^1.3.0-alpha.1",
15
+ "@contember/logger": "^1.3.0-alpha.1",
16
+ "@contember/graphql-utils": "^1.3.0-alpha.1",
17
+ "@contember/schema": "^1.3.0-alpha.1",
18
+ "@contember/schema-definition": "^1.3.0-alpha.1",
19
+ "@contember/schema-utils": "^1.3.0-alpha.1",
20
20
  "@graphql-tools/schema": "^8.3.5",
21
21
  "fast-deep-equal": "^3.1.3",
22
22
  "graphql-tag": "^2.12.5"
23
23
  },
24
24
  "devDependencies": {
25
- "@contember/database-tester": "^1.2.0-rc.4",
26
- "@contember/engine-api-tester": "^1.2.0-rc.4",
27
- "@contember/schema-definition": "^1.2.0-rc.4",
25
+ "@contember/database-tester": "^1.3.0-alpha.1",
26
+ "@contember/engine-api-tester": "^1.3.0-alpha.1",
27
+ "@contember/schema-definition": "^1.3.0-alpha.1",
28
28
  "@graphql-codegen/cli": "^2.6.2",
29
29
  "@graphql-codegen/typescript": "^2.5.1",
30
30
  "@graphql-codegen/typescript-operations": "^2.4.2",
@@ -17,29 +17,35 @@ export class CreateInputPreValidationProcessor implements CreateInputProcessor<R
17
17
  manyHasManyInverse: CreateInputProcessor.HasManyRelationProcessor<Model.ManyHasManyInverseContext, Result> = {
18
18
  connect: NoResult,
19
19
  create: context => this.validateCreate(context),
20
+ connectOrCreate: context => this.validateCreate({ ...context, input: context.input.create }),
20
21
  }
21
22
 
22
23
  manyHasManyOwning: CreateInputProcessor.HasManyRelationProcessor<Model.ManyHasManyOwningContext, Result> = {
23
24
  connect: NoResult,
24
25
  create: context => this.validateCreate(context),
26
+ connectOrCreate: context => this.validateCreate({ ...context, input: context.input.create }),
25
27
  }
26
28
 
27
29
  manyHasOne: CreateInputProcessor.HasOneRelationProcessor<Model.ManyHasOneContext, Result> = {
28
30
  connect: NoResult,
29
31
  create: context => this.validateCreate(context),
32
+ connectOrCreate: context => this.validateCreate({ ...context, input: context.input.create }),
30
33
  }
31
34
 
32
35
  oneHasMany: CreateInputProcessor.HasManyRelationProcessor<Model.OneHasManyContext, Result> = {
33
36
  connect: NoResult,
34
37
  create: context => this.validateCreate(context),
38
+ connectOrCreate: context => this.validateCreate({ ...context, input: context.input.create }),
35
39
  }
36
40
  oneHasOneInverse: CreateInputProcessor.HasOneRelationProcessor<Model.OneHasOneInverseContext, Result> = {
37
41
  connect: NoResult,
38
42
  create: context => this.validateCreate(context),
43
+ connectOrCreate: context => this.validateCreate({ ...context, input: context.input.create }),
39
44
  }
40
45
  oneHasOneOwning: CreateInputProcessor.HasOneRelationProcessor<Model.OneHasOneOwningContext, Result> = {
41
46
  connect: NoResult,
42
47
  create: context => this.validateCreate(context),
48
+ connectOrCreate: context => this.validateCreate({ ...context, input: context.input.create }),
43
49
  }
44
50
 
45
51
  async validateCreate(context: {
@@ -23,6 +23,7 @@ export class UpdateInputPreValidationProcessor implements UpdateInputProcessor<R
23
23
  create: ctx => this.processCreate(ctx),
24
24
  update: ctx => this.processUpdate({ ...ctx, input: ctx.input.data }),
25
25
  upsert: ctx => this.processUpsert(ctx),
26
+ connectOrCreate: ctx => this.processCreate({ ...ctx, input: ctx.input.create }),
26
27
  connect: NoResult,
27
28
  disconnect: NoResult,
28
29
  ['delete']: NoResult,
@@ -31,6 +32,7 @@ export class UpdateInputPreValidationProcessor implements UpdateInputProcessor<R
31
32
  create: ctx => this.processCreate(ctx),
32
33
  update: ctx => this.processUpdate({ ...ctx, input: ctx.input.data }),
33
34
  upsert: ctx => this.processUpsert(ctx),
35
+ connectOrCreate: ctx => this.processCreate({ ...ctx, input: ctx.input.create }),
34
36
  connect: NoResult,
35
37
  disconnect: NoResult,
36
38
  ['delete']: NoResult,
@@ -39,6 +41,7 @@ export class UpdateInputPreValidationProcessor implements UpdateInputProcessor<R
39
41
  create: ctx => this.processCreate(ctx),
40
42
  update: ctx => this.processUpdate(ctx),
41
43
  upsert: ctx => this.processUpsert(ctx),
44
+ connectOrCreate: ctx => this.processCreate({ ...ctx, input: ctx.input.create }),
42
45
  connect: NoResult,
43
46
  disconnect: NoResult,
44
47
  ['delete']: NoResult,
@@ -47,6 +50,7 @@ export class UpdateInputPreValidationProcessor implements UpdateInputProcessor<R
47
50
  create: ctx => this.processCreate(ctx),
48
51
  update: ctx => this.processUpdate({ ...ctx, input: ctx.input.data }),
49
52
  upsert: ctx => this.processUpsert(ctx),
53
+ connectOrCreate: ctx => this.processCreate({ ...ctx, input: ctx.input.create }),
50
54
  connect: NoResult,
51
55
  disconnect: NoResult,
52
56
  ['delete']: NoResult,
@@ -55,6 +59,7 @@ export class UpdateInputPreValidationProcessor implements UpdateInputProcessor<R
55
59
  create: ctx => this.processCreate(ctx),
56
60
  update: ctx => this.processUpdate(ctx),
57
61
  upsert: ctx => this.processUpsert(ctx),
62
+ connectOrCreate: ctx => this.processCreate({ ...ctx, input: ctx.input.create }),
58
63
  connect: NoResult,
59
64
  disconnect: NoResult,
60
65
  ['delete']: NoResult,
@@ -64,6 +69,7 @@ export class UpdateInputPreValidationProcessor implements UpdateInputProcessor<R
64
69
  create: ctx => this.processCreate(ctx),
65
70
  update: ctx => this.processUpdate(ctx),
66
71
  upsert: ctx => this.processUpsert(ctx),
72
+ connectOrCreate: ctx => this.processCreate({ ...ctx, input: ctx.input.create }),
67
73
  connect: NoResult,
68
74
  disconnect: NoResult,
69
75
  ['delete']: NoResult,
@@ -1,7 +1,7 @@
1
1
  import { Input, Model } from '@contember/schema'
2
2
 
3
3
  interface CreateInputProcessor<Result = void> {
4
- column(context: CreateInputProcessor.ContextWithInput<Model.ColumnContext, Input.ColumnValue | undefined>): Promise<Result>
4
+ column(context: Model.ColumnContext & { input: Input.ColumnValue | undefined }): Promise<Result>
5
5
 
6
6
  manyHasManyInverse: CreateInputProcessor.HasManyRelationProcessor<Model.ManyHasManyInverseContext, Result>
7
7
  manyHasManyOwning: CreateInputProcessor.HasManyRelationProcessor<Model.ManyHasManyOwningContext, Result>
@@ -14,21 +14,18 @@ interface CreateInputProcessor<Result = void> {
14
14
  }
15
15
 
16
16
  namespace CreateInputProcessor {
17
- export type ContextWithInput<Context, Input> = Context & { input: Input }
18
17
 
19
18
  export interface HasOneRelationProcessor<Context, Result> {
20
- nothing?: (context: ContextWithInput<Context, undefined>) => Promise<Result>
21
- connect: (context: ContextWithInput<Context, Input.UniqueWhere>) => Promise<Result>
22
- create: (context: ContextWithInput<Context, Input.CreateDataInput>) => Promise<Result>
19
+ nothing?: (context: Context & { input: undefined }) => Promise<Result>
20
+ connect: (context: Context & { input: Input.UniqueWhere }) => Promise<Result>
21
+ create: (context: Context & { input: Input.CreateDataInput }) => Promise<Result>
22
+ connectOrCreate: (context: Context & { input: Input.ConnectOrCreateInput }) => Promise<Result>
23
23
  }
24
24
 
25
25
  export interface HasManyRelationProcessor<Context, Result> {
26
- connect: (
27
- context: ContextWithInput<Context, Input.UniqueWhere> & { index: number; alias?: string },
28
- ) => Promise<Result>
29
- create: (
30
- context: ContextWithInput<Context, Input.CreateDataInput> & { index: number; alias?: string },
31
- ) => Promise<Result>
26
+ connect: (context: Context & { input: Input.UniqueWhere } & { index: number; alias?: string }) => Promise<Result>
27
+ create: (context: Context & { input: Input.CreateDataInput } & { index: number; alias?: string }) => Promise<Result>
28
+ connectOrCreate: (context: Context & { input: Input.ConnectOrCreateInput } & { index: number; alias?: string }) => Promise<Result>
32
29
  }
33
30
  }
34
31
 
@@ -89,6 +89,9 @@ export class CreateInputVisitor<Result> implements
89
89
  if (isIt<Input.CreateRelationInput>(input, 'create')) {
90
90
  return processor.create({ ...context, input: input.create })
91
91
  }
92
+ if (isIt<Input.ConnectOrCreateRelationInput>(input, 'connectOrCreate')) {
93
+ return processor.connectOrCreate({ ...context, input: input.connectOrCreate })
94
+ }
92
95
  throw new ImplementationException()
93
96
  }
94
97
 
@@ -113,6 +116,9 @@ export class CreateInputVisitor<Result> implements
113
116
  if (isIt<Input.CreateRelationInput>(element, 'create')) {
114
117
  result = processor.create({ ...context, input: element.create, index: i++, alias })
115
118
  }
119
+ if (isIt<Input.ConnectOrCreateRelationInput>(element, 'connectOrCreate')) {
120
+ result = processor.connectOrCreate({ ...context, input: element.connectOrCreate, index: i++, alias })
121
+ }
116
122
  if (result !== undefined) {
117
123
  results.push(await result)
118
124
  }
@@ -122,9 +128,12 @@ export class CreateInputVisitor<Result> implements
122
128
 
123
129
  private verifyOperations(input: object) {
124
130
  const keys = Object.keys(input).filter(it => it !== 'alias')
125
- if (keys.length !== 1 || !['create', 'connect'].includes(keys[0])) {
131
+ const ops = Object.values(Input.CreateRelationOperation) as string[]
132
+ if (keys.length !== 1 || !ops.includes(keys[0])) {
126
133
  const found = keys.length === 0 ? 'none' : keys.join(', ')
127
- throw new UserError(`Expected either "create" or "connect". ${found} found.`)
134
+ throw new UserError(
135
+ `Expected exactly one of: ${ops.join(', ')}. ${found} found.`,
136
+ )
128
137
  }
129
138
  }
130
139
  }
@@ -2,13 +2,17 @@ import { Input, Model, Writable } from '@contember/schema'
2
2
  import { getTargetEntity } from '@contember/schema-utils'
3
3
  import { UserError } from '../exception'
4
4
  import { getFieldsForUniqueWhere } from '../utils'
5
+ import { CheckedPrimary } from '../mapper/CheckedPrimary'
5
6
 
6
7
  type ExtendedUniqueWhere = Input.UniqueWhere<Input.PrimaryValue[]>
7
8
 
8
9
  export class UniqueWhereExpander {
9
10
  constructor(private readonly schema: Model.Schema) {}
10
11
 
11
- expand(entity: Model.Entity, where: ExtendedUniqueWhere, path: string[] = []): Input.Where {
12
+ expand(entity: Model.Entity, where: ExtendedUniqueWhere | CheckedPrimary, path: string[] = []): Input.Where {
13
+ if (where instanceof CheckedPrimary) {
14
+ return { [entity.primary]: { eq: where.primaryValue } }
15
+ }
12
16
  const isFilled = (field: string) => where[field] !== undefined && where[field] !== null
13
17
 
14
18
  const isUnique = (() => {
@@ -1,7 +1,8 @@
1
1
  import { Input, Model } from '@contember/schema'
2
2
 
3
+
3
4
  interface UpdateInputProcessor<Result = void> {
4
- column(context: UpdateInputProcessor.ContextWithInput<Model.ColumnContext, Input.ColumnValue | undefined>): Promise<Result>
5
+ column(context: Model.ColumnContext & { input: Input.ColumnValue | undefined }): Promise<Result>
5
6
 
6
7
  manyHasManyInverse: UpdateInputProcessor.HasManyRelationInputProcessor<Model.ManyHasManyInverseContext, Result>
7
8
 
@@ -17,7 +18,6 @@ interface UpdateInputProcessor<Result = void> {
17
18
  }
18
19
 
19
20
  namespace UpdateInputProcessor {
20
- export type ContextWithInput<Context, Input> = Context & { input: Input }
21
21
  export type UpsertInput = { update: Input.UpdateDataInput; create: Input.CreateDataInput }
22
22
  export type UpdateManyInput = { where: Input.UniqueWhere; data: Input.UpdateDataInput }
23
23
  export type UpsertManyInput = {
@@ -27,35 +27,35 @@ namespace UpdateInputProcessor {
27
27
  }
28
28
 
29
29
  export interface HasOneRelationInputProcessor<Context, Result> {
30
- connect(context: ContextWithInput<Context, Input.UniqueWhere>): Promise<Result>
30
+ connect(context: Context & { input: Input.UniqueWhere }): Promise<Result>
31
+
32
+ create(context: Context & { input: Input.CreateDataInput }): Promise<Result>
31
33
 
32
- create(context: ContextWithInput<Context, Input.CreateDataInput>): Promise<Result>
34
+ connectOrCreate(context: Context & { input: Input.ConnectOrCreateInput }): Promise<Result>
33
35
 
34
- update(context: ContextWithInput<Context, Input.UpdateDataInput>): Promise<Result>
36
+ update(context: Context & { input: Input.UpdateDataInput }): Promise<Result>
35
37
 
36
- upsert(context: ContextWithInput<Context, UpsertInput>): Promise<Result>
38
+ upsert(context: Context & { input: UpdateInputProcessor.UpsertInput }): Promise<Result>
37
39
 
38
- disconnect(context: ContextWithInput<Context, undefined>): Promise<Result>
40
+ disconnect(context: Context & { input: undefined }): Promise<Result>
39
41
 
40
- delete(context: ContextWithInput<Context, undefined>): Promise<Result>
42
+ delete(context: Context & { input: undefined }): Promise<Result>
41
43
  }
42
44
 
43
45
  export interface HasManyRelationInputProcessor<Context, Result> {
44
- connect(context: ContextWithInput<Context, Input.UniqueWhere> & { index: number; alias?: string }): Promise<Result>
46
+ connect(context: Context & { input: Input.UniqueWhere; index: number; alias?: string }): Promise<Result>
47
+
48
+ create(context: Context & { input: Input.CreateDataInput; index: number; alias?: string }): Promise<Result>
45
49
 
46
- create(
47
- context: ContextWithInput<Context, Input.CreateDataInput> & { index: number; alias?: string },
48
- ): Promise<Result>
50
+ connectOrCreate(context: Context & { input: Input.ConnectOrCreateInput; index: number; alias?: string }): Promise<Result>
49
51
 
50
- update(context: ContextWithInput<Context, UpdateManyInput> & { index: number; alias?: string }): Promise<Result>
52
+ update(context: Context & { input: UpdateInputProcessor.UpdateManyInput; index: number; alias?: string }): Promise<Result>
51
53
 
52
- upsert(context: ContextWithInput<Context, UpsertManyInput> & { index: number; alias?: string }): Promise<Result>
54
+ upsert(context: Context & { input: UpdateInputProcessor.UpsertManyInput; index: number; alias?: string }): Promise<Result>
53
55
 
54
- disconnect(
55
- context: ContextWithInput<Context, Input.UniqueWhere> & { index: number; alias?: string },
56
- ): Promise<Result>
56
+ disconnect(context: Context & { input: Input.UniqueWhere; index: number; alias?: string }): Promise<Result>
57
57
 
58
- delete(context: ContextWithInput<Context, Input.UniqueWhere> & { index: number; alias?: string }): Promise<Result>
58
+ delete(context: Context & { input: Input.UniqueWhere; index: number; alias?: string }): Promise<Result>
59
59
  }
60
60
  }
61
61
 
@@ -85,6 +85,9 @@ export class UpdateInputVisitor<Result> implements
85
85
  if (isIt<Input.CreateRelationInput>(input, 'create')) {
86
86
  return processor.create({ ...context, input: input.create })
87
87
  }
88
+ if (isIt<Input.ConnectOrCreateRelationInput>(input, 'connectOrCreate')) {
89
+ return processor.connectOrCreate({ ...context, input: input.connectOrCreate })
90
+ }
88
91
  if (isIt<Input.DeleteRelationInput>(input, 'delete')) {
89
92
  return processor.delete({ ...context, input: undefined })
90
93
  }
@@ -153,10 +156,11 @@ export class UpdateInputVisitor<Result> implements
153
156
 
154
157
  private verifyOperations(input: object) {
155
158
  const keys = Object.keys(input).filter(it => it !== 'alias')
156
- if (keys.length !== 1 || !['create', 'connect', 'delete', 'disconnect', 'update', 'upsert'].includes(keys[0])) {
159
+ const ops = Object.values(Input.UpdateRelationOperation) as string[]
160
+ if (keys.length !== 1 || !ops.includes(keys[0])) {
157
161
  const found = keys.length === 0 ? 'none' : keys.join(', ')
158
162
  throw new UserError(
159
- `Expected exactly one of: "create", "connect", "delete", "disconnect", "update" or "upsert". ${found} found.`,
163
+ `Expected exactly one of: ${ops.join(', ')}. ${found} found.`,
160
164
  )
161
165
  }
162
166
  }
@@ -0,0 +1,12 @@
1
+ import { Value } from '@contember/schema'
2
+
3
+ export interface DataManipulationBuilder {
4
+ addFieldValue(
5
+ fieldName: string,
6
+ value: Value.GenericValueLike<Value.AtomicValue<AbortDataManipulation | undefined>>,
7
+ ): Promise<Value.AtomicValue<AbortDataManipulation | undefined>>
8
+ }
9
+
10
+
11
+ export const AbortDataManipulation = Symbol('AbortDataManipulation')
12
+ export type AbortDataManipulation = typeof AbortDataManipulation
@@ -1,24 +1,27 @@
1
1
  import { Input, Model } from '@contember/schema'
2
- import { getColumnName } from '@contember/schema-utils'
3
- import { SelectGroupedObjects, SelectHydrator, SelectIndexedResultObjects, SelectResultObject } from './select'
4
- import { PathFactory } from './select'
2
+ import { acceptFieldVisitor, getColumnName } from '@contember/schema-utils'
3
+ import {
4
+ OrderByHelper,
5
+ PathFactory,
6
+ SelectBuilderFactory,
7
+ SelectGroupedObjects,
8
+ SelectHydrator,
9
+ SelectIndexedResultObjects,
10
+ SelectResultObject,
11
+ WhereBuilder,
12
+ } from './select'
5
13
  import * as database from '@contember/database'
6
- import { Client, SelectBuilder } from '@contember/database'
7
- import { SelectBuilderFactory } from './select'
14
+ import { Client, ConstraintHelper, SelectBuilder } from '@contember/database'
8
15
  import { PredicatesInjector } from '../acl'
9
- import { WhereBuilder } from './select'
10
16
  import { JunctionTableManager } from './JunctionTableManager'
11
17
  import { DeletedEntitiesStorage, DeleteExecutor } from './delete'
12
18
  import { MutationEntryNotFoundError, MutationResultList } from './Result'
13
- import { Updater } from './update'
14
- import { Inserter } from './insert'
19
+ import { UpdateBuilder, Updater } from './update'
20
+ import { InsertBuilder, Inserter } from './insert'
15
21
  import { tryMutation } from './ErrorUtils'
16
- import { OrderByHelper } from './select'
17
- import { ObjectNode, UniqueWhereExpander } from '../inputProcessing'
18
- import { UpdateBuilder } from './update'
22
+ import { ObjectNode, UniqueWhereExpander } from '../inputProcessing'
19
23
  import { Mutex } from '../utils'
20
24
  import { CheckedPrimary } from './CheckedPrimary'
21
- import { ConstraintHelper } from '@contember/database'
22
25
  import { ImplementationException } from '../exception'
23
26
 
24
27
  export class Mapper {
@@ -43,7 +46,7 @@ export class Mapper {
43
46
  this.constraintHelper = new ConstraintHelper(db)
44
47
  }
45
48
 
46
- public async selectField(entity: Model.Entity, where: Input.UniqueWhere, fieldName: string) {
49
+ public async selectField(entity: Model.Entity, where: Input.UniqueWhere | CheckedPrimary, fieldName: string) {
47
50
  const columnName = getColumnName(this.schema, entity, fieldName)
48
51
 
49
52
  const qb = SelectBuilder.create() //
@@ -163,15 +166,20 @@ export class Mapper {
163
166
  return Object.fromEntries(result)
164
167
  }
165
168
 
166
- public async insert(entity: Model.Entity, data: Input.CreateDataInput): Promise<MutationResultList> {
169
+ public async insert(
170
+ entity: Model.Entity,
171
+ data: Input.CreateDataInput,
172
+ builderCb: (builder: InsertBuilder) => void = () => {},
173
+ ): Promise<MutationResultList> {
167
174
  if (entity.view) {
168
175
  throw new ImplementationException()
169
176
  }
177
+ const pushId = (id: string) => {
178
+ const where = { [entity.primary]: id }
179
+ this.primaryKeyCache[this.hashWhere(entity.name, where)] = id
180
+ }
170
181
  return tryMutation(this.schema, () =>
171
- this.inserter.insert(this, entity, data, id => {
172
- const where = { [entity.primary]: id }
173
- this.primaryKeyCache[this.hashWhere(entity.name, where)] = id
174
- }),
182
+ this.inserter.insert(this, entity, data, pushId, builderCb),
175
183
  )
176
184
  }
177
185
 
@@ -195,19 +203,20 @@ export class Mapper {
195
203
 
196
204
  public async updateInternal(
197
205
  entity: Model.Entity,
198
- by: Input.UniqueWhere,
199
- predicateFields: string[],
206
+ by: Input.UniqueWhere | CheckedPrimary,
200
207
  builderCb: (builder: UpdateBuilder) => void,
201
208
  ): Promise<MutationResultList> {
209
+ if (entity.view) {
210
+ throw new ImplementationException()
211
+ }
202
212
  return tryMutation(this.schema, async () => {
203
213
  const primaryValue = await this.getPrimaryValue(entity, by)
204
214
  if (primaryValue === undefined) {
205
- return [new MutationEntryNotFoundError([], by)]
215
+ return [new MutationEntryNotFoundError([], by as Input.UniqueWhere)]
206
216
  }
207
- return await this.updater.updateCb(this, entity, primaryValue, predicateFields, builderCb)
217
+ return await this.updater.updateCb(this, entity, primaryValue, builderCb)
208
218
  })
209
219
  }
210
-
211
220
  public async upsert(
212
221
  entity: Model.Entity,
213
222
  by: Input.UniqueWhere,
@@ -221,10 +230,11 @@ export class Mapper {
221
230
  return tryMutation(this.schema, async () => {
222
231
  const primaryValue = await this.getPrimaryValue(entity, by)
223
232
  if (primaryValue === undefined) {
224
- return await this.inserter.insert(this, entity, create, id => {
233
+ const pushIdCallback = (id: string) => {
225
234
  const where = { [entity.primary]: id }
226
235
  this.primaryKeyCache[this.hashWhere(entity.name, where)] = id
227
- })
236
+ }
237
+ return await this.inserter.insert(this, entity, create, pushIdCallback, () => {})
228
238
  }
229
239
  return await this.updater.update(this, entity, primaryValue, update, filter)
230
240
  })
@@ -242,33 +252,51 @@ export class Mapper {
242
252
  }
243
253
 
244
254
  public async connectJunction(
245
- owningEntity: Model.Entity,
246
- relation: Model.ManyHasManyOwningRelation,
247
- owningPrimary: Input.PrimaryValue,
248
- inversePrimary: Input.PrimaryValue,
255
+ entity: Model.Entity,
256
+ relation: Model.ManyHasManyOwningRelation | Model.ManyHasManyInverseRelation,
257
+ thisPrimary: Input.PrimaryValue,
258
+ otherPrimary: Input.PrimaryValue,
249
259
  ): Promise<MutationResultList> {
250
- return await this.junctionTableManager.connectJunction(
251
- this.db,
252
- owningEntity,
253
- relation,
254
- owningPrimary,
255
- inversePrimary,
256
- )
260
+ const err = () => {
261
+ throw new ImplementationException()
262
+ }
263
+ return await acceptFieldVisitor(this.schema, entity, relation, {
264
+ visitManyHasManyOwning: ({ entity, relation }) => {
265
+ return this.junctionTableManager.connectJunction(this.db, entity, relation, thisPrimary, otherPrimary)
266
+ },
267
+ visitManyHasManyInverse: ({ targetEntity, targetRelation }) => {
268
+ return this.junctionTableManager.connectJunction(this.db, targetEntity, targetRelation, otherPrimary, thisPrimary)
269
+ },
270
+ visitColumn: err,
271
+ visitOneHasMany: err,
272
+ visitOneHasOneInverse: err,
273
+ visitOneHasOneOwning: err,
274
+ visitManyHasOne: err,
275
+ })
257
276
  }
258
277
 
259
278
  public async disconnectJunction(
260
- owningEntity: Model.Entity,
261
- relation: Model.ManyHasManyOwningRelation,
262
- owningPrimary: Input.PrimaryValue,
263
- inversePrimary: Input.PrimaryValue,
279
+ entity: Model.Entity,
280
+ relation: Model.ManyHasManyOwningRelation | Model.ManyHasManyInverseRelation,
281
+ thisPrimary: Input.PrimaryValue,
282
+ otherPrimary: Input.PrimaryValue,
264
283
  ): Promise<MutationResultList> {
265
- return await this.junctionTableManager.disconnectJunction(
266
- this.db,
267
- owningEntity,
268
- relation,
269
- owningPrimary,
270
- inversePrimary,
271
- )
284
+ const err = () => {
285
+ throw new ImplementationException()
286
+ }
287
+ return await acceptFieldVisitor(this.schema, entity, relation, {
288
+ visitManyHasManyOwning: ({ entity, relation }) => {
289
+ return this.junctionTableManager.disconnectJunction(this.db, entity, relation, thisPrimary, otherPrimary)
290
+ },
291
+ visitManyHasManyInverse: ({ targetEntity, targetRelation }) => {
292
+ return this.junctionTableManager.disconnectJunction(this.db, targetEntity, targetRelation, otherPrimary, thisPrimary)
293
+ },
294
+ visitColumn: err,
295
+ visitOneHasMany: err,
296
+ visitOneHasOneInverse: err,
297
+ visitOneHasOneOwning: err,
298
+ visitManyHasOne: err,
299
+ })
272
300
  }
273
301
 
274
302
  public async getPrimaryValue(
@@ -102,10 +102,15 @@ export const createMapperContainer = ({ permissions, schema, identityVariables,
102
102
  )
103
103
  }
104
104
  })())
105
- .addService('insertBuilderFactory', ({ whereBuilder, pathFactory }) =>
106
- new InsertBuilderFactory(schema.model, whereBuilder, pathFactory))
107
- .addService('updateBuilderFactory', ({ whereBuilder, pathFactory }) =>
108
- new UpdateBuilderFactory(schema.model, whereBuilder, pathFactory))
105
+ .addService(
106
+ 'insertBuilderFactory',
107
+ ({ whereBuilder, pathFactory, predicateFactory }) =>
108
+ new InsertBuilderFactory(schema.model, whereBuilder, pathFactory, predicateFactory),
109
+ )
110
+ .addService(
111
+ 'updateBuilderFactory',
112
+ ({ whereBuilder, pathFactory, predicateFactory }) =>
113
+ new UpdateBuilderFactory(schema.model, whereBuilder, pathFactory, predicateFactory))
109
114
  .addService('connectJunctionHandler', () =>
110
115
  new JunctionConnectHandler())
111
116
  .addService('disconnectJunctionHandler', ({}) =>
@@ -116,8 +121,7 @@ export const createMapperContainer = ({ permissions, schema, identityVariables,
116
121
  new DeleteExecutor(schema.model, predicateFactory, whereBuilder, updateBuilderFactory, pathFactory))
117
122
  .addService('updater', ({ predicateFactory, updateBuilderFactory }) =>
118
123
  new Updater(schema.model, predicateFactory, updateBuilderFactory))
119
- .addService('inserter', ({ predicateFactory, insertBuilderFactory, providers }) =>
120
- new Inserter(schema.model, predicateFactory, insertBuilderFactory, providers))
124
+ .addService('inserter', ({ insertBuilderFactory, providers }) => new Inserter(schema.model, insertBuilderFactory, providers))
121
125
  .addService('mapperFactory', ({ predicatesInjector, selectBuilderFactory, uniqueWhereExpander, whereBuilder, junctionTableManager, deleteExecutor, updater, inserter, pathFactory }) => {
122
126
  return (db: Client) =>
123
127
  new Mapper(
@@ -170,7 +170,7 @@ export class MutationEntryNotFoundError implements MutationResultInterface {
170
170
  hints: MutationResultHint[] = []
171
171
  message: string
172
172
 
173
- constructor(public readonly paths: Path[], public readonly where: Input.UniqueWhere) {
173
+ constructor(public readonly paths: Path[], public readonly where: Input.UniqueWhere | Input.Where) {
174
174
  this.message = 'for input ' + JSON.stringify(where)
175
175
  }
176
176
  }