@contember/engine-content-api 1.1.2 → 1.2.0-alpha.11

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 (352) hide show
  1. package/dist/src/acl/EvaluatedPredicateReplacer.d.ts +9 -0
  2. package/dist/src/acl/EvaluatedPredicateReplacer.d.ts.map +1 -0
  3. package/dist/src/acl/EvaluatedPredicateReplacer.js +31 -0
  4. package/dist/src/acl/EvaluatedPredicateReplacer.js.map +1 -0
  5. package/dist/src/acl/PermissionFactory.d.ts.map +1 -1
  6. package/dist/src/acl/PermissionFactory.js +15 -11
  7. package/dist/src/acl/PermissionFactory.js.map +1 -1
  8. package/dist/src/acl/PredicateFactory.d.ts +4 -2
  9. package/dist/src/acl/PredicateFactory.d.ts.map +1 -1
  10. package/dist/src/acl/PredicateFactory.js +17 -6
  11. package/dist/src/acl/PredicateFactory.js.map +1 -1
  12. package/dist/src/acl/PredicatesInjector.d.ts +1 -1
  13. package/dist/src/acl/PredicatesInjector.d.ts.map +1 -1
  14. package/dist/src/acl/PredicatesInjector.js +16 -19
  15. package/dist/src/acl/PredicatesInjector.js.map +1 -1
  16. package/dist/src/acl/VariableInjector.d.ts +0 -1
  17. package/dist/src/acl/VariableInjector.d.ts.map +1 -1
  18. package/dist/src/acl/VariableInjector.js +4 -14
  19. package/dist/src/acl/VariableInjector.js.map +1 -1
  20. package/dist/src/acl/VariableUtils.d.ts +2 -13
  21. package/dist/src/acl/VariableUtils.d.ts.map +1 -1
  22. package/dist/src/acl/VariableUtils.js +5 -16
  23. package/dist/src/acl/VariableUtils.js.map +1 -1
  24. package/dist/src/extensions/hasManyToHasOneReducer/HasManyToHasOneReducerExecutionHandler.d.ts +0 -1
  25. package/dist/src/extensions/hasManyToHasOneReducer/HasManyToHasOneReducerExecutionHandler.d.ts.map +1 -1
  26. package/dist/src/extensions/hasManyToHasOneReducer/HasManyToHasOneReducerExecutionHandler.js +14 -15
  27. package/dist/src/extensions/hasManyToHasOneReducer/HasManyToHasOneReducerExecutionHandler.js.map +1 -1
  28. package/dist/src/extensions/hasManyToHasOneReducer/HasManyToHasOneRelationReducerVisitor.d.ts +1 -1
  29. package/dist/src/extensions/hasManyToHasOneReducer/HasManyToHasOneRelationReducerVisitor.d.ts.map +1 -1
  30. package/dist/src/extensions/hasManyToHasOneReducer/HasManyToHasOneRelationReducerVisitor.js +1 -1
  31. package/dist/src/extensions/hasManyToHasOneReducer/HasManyToHasOneRelationReducerVisitor.js.map +1 -1
  32. package/dist/src/extensions/paginatedHasMany/PaginatedHasManyCountVisitor.d.ts +5 -4
  33. package/dist/src/extensions/paginatedHasMany/PaginatedHasManyCountVisitor.d.ts.map +1 -1
  34. package/dist/src/extensions/paginatedHasMany/PaginatedHasManyCountVisitor.js +29 -20
  35. package/dist/src/extensions/paginatedHasMany/PaginatedHasManyCountVisitor.js.map +1 -1
  36. package/dist/src/extensions/paginatedHasMany/PaginatedHasManyExecutionHandler.d.ts.map +1 -1
  37. package/dist/src/extensions/paginatedHasMany/PaginatedHasManyExecutionHandler.js +2 -2
  38. package/dist/src/extensions/paginatedHasMany/PaginatedHasManyExecutionHandler.js.map +1 -1
  39. package/dist/src/extensions/paginatedHasMany/PaginatedHasManyFieldProviderVisitor.d.ts +3 -3
  40. package/dist/src/extensions/paginatedHasMany/PaginatedHasManyFieldProviderVisitor.d.ts.map +1 -1
  41. package/dist/src/extensions/paginatedHasMany/PaginatedHasManyFieldProviderVisitor.js +3 -3
  42. package/dist/src/extensions/paginatedHasMany/PaginatedHasManyFieldProviderVisitor.js.map +1 -1
  43. package/dist/src/extensions/paginatedHasMany/PaginatedHasManyNodesVisitor.d.ts +5 -4
  44. package/dist/src/extensions/paginatedHasMany/PaginatedHasManyNodesVisitor.d.ts.map +1 -1
  45. package/dist/src/extensions/paginatedHasMany/PaginatedHasManyNodesVisitor.js +29 -20
  46. package/dist/src/extensions/paginatedHasMany/PaginatedHasManyNodesVisitor.js.map +1 -1
  47. package/dist/src/input-validation/ColumnValueResolver.d.ts +4 -3
  48. package/dist/src/input-validation/ColumnValueResolver.d.ts.map +1 -1
  49. package/dist/src/input-validation/ColumnValueResolver.js.map +1 -1
  50. package/dist/src/input-validation/EntityRulesResolver.js +4 -4
  51. package/dist/src/input-validation/EntityRulesResolver.js.map +1 -1
  52. package/dist/src/input-validation/QueryAstFactory.js +1 -1
  53. package/dist/src/input-validation/QueryAstFactory.js.map +1 -1
  54. package/dist/src/input-validation/ValidationContext.d.ts +2 -2
  55. package/dist/src/input-validation/ValidationContext.d.ts.map +1 -1
  56. package/dist/src/input-validation/ValidationContext.js.map +1 -1
  57. package/dist/src/input-validation/ValidationDataSelector.d.ts.map +1 -1
  58. package/dist/src/input-validation/ValidationDataSelector.js +1 -1
  59. package/dist/src/input-validation/ValidationDataSelector.js.map +1 -1
  60. package/dist/src/input-validation/preValidation/CreateInputPreValidationProcessor.d.ts +7 -8
  61. package/dist/src/input-validation/preValidation/CreateInputPreValidationProcessor.d.ts.map +1 -1
  62. package/dist/src/input-validation/preValidation/CreateInputPreValidationProcessor.js.map +1 -1
  63. package/dist/src/input-validation/preValidation/InputPreValidator.js +4 -4
  64. package/dist/src/input-validation/preValidation/InputPreValidator.js.map +1 -1
  65. package/dist/src/input-validation/preValidation/UpdateInputPreValidationProcessor.d.ts +7 -8
  66. package/dist/src/input-validation/preValidation/UpdateInputPreValidationProcessor.d.ts.map +1 -1
  67. package/dist/src/input-validation/preValidation/UpdateInputPreValidationProcessor.js.map +1 -1
  68. package/dist/src/inputProcessing/CreateInputProcessor.d.ts +8 -9
  69. package/dist/src/inputProcessing/CreateInputProcessor.d.ts.map +1 -1
  70. package/dist/src/inputProcessing/CreateInputVisitor.d.ts +7 -7
  71. package/dist/src/inputProcessing/CreateInputVisitor.d.ts.map +1 -1
  72. package/dist/src/inputProcessing/CreateInputVisitor.js +15 -46
  73. package/dist/src/inputProcessing/CreateInputVisitor.js.map +1 -1
  74. package/dist/src/inputProcessing/UpdateInputProcessor.d.ts +8 -9
  75. package/dist/src/inputProcessing/UpdateInputProcessor.d.ts.map +1 -1
  76. package/dist/src/inputProcessing/UpdateInputVisitor.d.ts +7 -7
  77. package/dist/src/inputProcessing/UpdateInputVisitor.d.ts.map +1 -1
  78. package/dist/src/inputProcessing/UpdateInputVisitor.js +13 -28
  79. package/dist/src/inputProcessing/UpdateInputVisitor.js.map +1 -1
  80. package/dist/src/inputProcessing/index.d.ts +0 -1
  81. package/dist/src/inputProcessing/index.d.ts.map +1 -1
  82. package/dist/src/inputProcessing/index.js +0 -1
  83. package/dist/src/inputProcessing/index.js.map +1 -1
  84. package/dist/src/introspection/IntrospectionSchemaFactory.js +7 -7
  85. package/dist/src/introspection/IntrospectionSchemaFactory.js.map +1 -1
  86. package/dist/src/introspection/content-schema.types.d.ts +19 -223
  87. package/dist/src/introspection/content-schema.types.d.ts.map +1 -1
  88. package/dist/src/introspection/content-schema.types.js +2 -2
  89. package/dist/src/introspection/content-schema.types.js.map +1 -1
  90. package/dist/src/mapper/Mapper.d.ts +6 -6
  91. package/dist/src/mapper/Mapper.d.ts.map +1 -1
  92. package/dist/src/mapper/Mapper.js +28 -23
  93. package/dist/src/mapper/Mapper.js.map +1 -1
  94. package/dist/src/mapper/MapperContainer.d.ts.map +1 -1
  95. package/dist/src/mapper/MapperContainer.js +7 -4
  96. package/dist/src/mapper/MapperContainer.js.map +1 -1
  97. package/dist/src/mapper/delete/DeleteExecutor.js +3 -3
  98. package/dist/src/mapper/delete/DeleteExecutor.js.map +1 -1
  99. package/dist/src/mapper/insert/SqlCreateInputProcessor.d.ts +4 -2
  100. package/dist/src/mapper/insert/SqlCreateInputProcessor.d.ts.map +1 -1
  101. package/dist/src/mapper/insert/SqlCreateInputProcessor.js.map +1 -1
  102. package/dist/src/mapper/select/JoinVisitor.d.ts +6 -6
  103. package/dist/src/mapper/select/JoinVisitor.d.ts.map +1 -1
  104. package/dist/src/mapper/select/JoinVisitor.js +6 -6
  105. package/dist/src/mapper/select/JoinVisitor.js.map +1 -1
  106. package/dist/src/mapper/select/RelationFetcher.d.ts +32 -5
  107. package/dist/src/mapper/select/RelationFetcher.d.ts.map +1 -1
  108. package/dist/src/mapper/select/RelationFetcher.js +37 -15
  109. package/dist/src/mapper/select/RelationFetcher.js.map +1 -1
  110. package/dist/src/mapper/select/SelectBuilder.d.ts +2 -1
  111. package/dist/src/mapper/select/SelectBuilder.d.ts.map +1 -1
  112. package/dist/src/mapper/select/SelectBuilder.js +4 -2
  113. package/dist/src/mapper/select/SelectBuilder.js.map +1 -1
  114. package/dist/src/mapper/select/SelectBuilderFactory.d.ts +2 -1
  115. package/dist/src/mapper/select/SelectBuilderFactory.d.ts.map +1 -1
  116. package/dist/src/mapper/select/SelectExecutionHandler.d.ts +1 -0
  117. package/dist/src/mapper/select/SelectExecutionHandler.d.ts.map +1 -1
  118. package/dist/src/mapper/select/WhereBuilder.d.ts +6 -3
  119. package/dist/src/mapper/select/WhereBuilder.d.ts.map +1 -1
  120. package/dist/src/mapper/select/WhereBuilder.js +31 -24
  121. package/dist/src/mapper/select/WhereBuilder.js.map +1 -1
  122. package/dist/src/mapper/select/handlers/FieldsVisitor.d.ts +9 -8
  123. package/dist/src/mapper/select/handlers/FieldsVisitor.d.ts.map +1 -1
  124. package/dist/src/mapper/select/handlers/FieldsVisitor.js +45 -24
  125. package/dist/src/mapper/select/handlers/FieldsVisitor.js.map +1 -1
  126. package/dist/src/mapper/select/handlers/FieldsVisitorFactory.d.ts.map +1 -1
  127. package/dist/src/mapper/select/handlers/FieldsVisitorFactory.js +1 -1
  128. package/dist/src/mapper/select/handlers/FieldsVisitorFactory.js.map +1 -1
  129. package/dist/src/mapper/select/optimizer/ConditionOptimizer.d.ts +5 -0
  130. package/dist/src/mapper/select/optimizer/ConditionOptimizer.d.ts.map +1 -0
  131. package/dist/src/mapper/select/optimizer/ConditionOptimizer.js +39 -0
  132. package/dist/src/mapper/select/optimizer/ConditionOptimizer.js.map +1 -0
  133. package/dist/src/mapper/select/optimizer/WhereOptimizer.d.ts +15 -0
  134. package/dist/src/mapper/select/optimizer/WhereOptimizer.d.ts.map +1 -0
  135. package/dist/src/mapper/select/optimizer/WhereOptimizer.js +118 -0
  136. package/dist/src/mapper/select/optimizer/WhereOptimizer.js.map +1 -0
  137. package/dist/src/mapper/select/optimizer/WhereReplacer.d.ts +6 -0
  138. package/dist/src/mapper/select/optimizer/WhereReplacer.d.ts.map +1 -0
  139. package/dist/src/mapper/select/optimizer/WhereReplacer.js +28 -0
  140. package/dist/src/mapper/select/optimizer/WhereReplacer.js.map +1 -0
  141. package/dist/src/mapper/select/optimizer/helpers.d.ts +10 -0
  142. package/dist/src/mapper/select/optimizer/helpers.d.ts.map +1 -0
  143. package/dist/src/mapper/select/optimizer/helpers.js +72 -0
  144. package/dist/src/mapper/select/optimizer/helpers.js.map +1 -0
  145. package/dist/src/mapper/update/SqlUpdateInputProcessor.d.ts +2 -3
  146. package/dist/src/mapper/update/SqlUpdateInputProcessor.d.ts.map +1 -1
  147. package/dist/src/mapper/update/SqlUpdateInputProcessor.js.map +1 -1
  148. package/dist/src/mapper/update/UpdateBuilder.js +3 -3
  149. package/dist/src/mapper/update/UpdateBuilder.js.map +1 -1
  150. package/dist/src/resolvers/GraphQlQueryAstFactory.js +2 -2
  151. package/dist/src/resolvers/GraphQlQueryAstFactory.js.map +1 -1
  152. package/dist/src/resolvers/MutationResolver.js +15 -15
  153. package/dist/src/resolvers/MutationResolver.js.map +1 -1
  154. package/dist/src/resolvers/ReadHelpers.js +10 -10
  155. package/dist/src/resolvers/ReadHelpers.js.map +1 -1
  156. package/dist/src/resolvers/ReadResolver.js +2 -2
  157. package/dist/src/resolvers/ReadResolver.js.map +1 -1
  158. package/dist/src/schema/FieldAccessVisitor.d.ts +2 -2
  159. package/dist/src/schema/FieldAccessVisitor.d.ts.map +1 -1
  160. package/dist/src/schema/FieldAccessVisitor.js +2 -2
  161. package/dist/src/schema/FieldAccessVisitor.js.map +1 -1
  162. package/dist/src/schema/MutationProvider.js +4 -4
  163. package/dist/src/schema/MutationProvider.js.map +1 -1
  164. package/dist/src/schema/OrderByTypeProvider.js +1 -1
  165. package/dist/src/schema/OrderByTypeProvider.js.map +1 -1
  166. package/dist/src/schema/QueryProvider.js +3 -3
  167. package/dist/src/schema/QueryProvider.js.map +1 -1
  168. package/dist/src/schema/ResultSchemaTypeProvider.d.ts +2 -2
  169. package/dist/src/schema/ResultSchemaTypeProvider.d.ts.map +1 -1
  170. package/dist/src/schema/WhereTypeProvider.js +4 -4
  171. package/dist/src/schema/WhereTypeProvider.js.map +1 -1
  172. package/dist/src/schema/entities/FieldArgsVisitor.d.ts +7 -7
  173. package/dist/src/schema/entities/FieldArgsVisitor.d.ts.map +1 -1
  174. package/dist/src/schema/entities/FieldArgsVisitor.js +3 -3
  175. package/dist/src/schema/entities/FieldArgsVisitor.js.map +1 -1
  176. package/dist/src/schema/entities/FieldTypeVisitor.d.ts +3 -3
  177. package/dist/src/schema/entities/FieldTypeVisitor.d.ts.map +1 -1
  178. package/dist/src/schema/entities/FieldTypeVisitor.js +3 -3
  179. package/dist/src/schema/entities/FieldTypeVisitor.js.map +1 -1
  180. package/dist/src/schema/mutations/CreateEntityInputFieldVisitor.d.ts +3 -3
  181. package/dist/src/schema/mutations/CreateEntityInputFieldVisitor.d.ts.map +1 -1
  182. package/dist/src/schema/mutations/CreateEntityInputFieldVisitor.js +3 -3
  183. package/dist/src/schema/mutations/CreateEntityInputFieldVisitor.js.map +1 -1
  184. package/dist/src/schema/mutations/CreateEntityRelationAllowedOperationsVisitor.d.ts +6 -6
  185. package/dist/src/schema/mutations/CreateEntityRelationAllowedOperationsVisitor.d.ts.map +1 -1
  186. package/dist/src/schema/mutations/CreateEntityRelationAllowedOperationsVisitor.js +6 -6
  187. package/dist/src/schema/mutations/CreateEntityRelationAllowedOperationsVisitor.js.map +1 -1
  188. package/dist/src/schema/mutations/CreateEntityRelationInputFieldVisitor.d.ts +3 -3
  189. package/dist/src/schema/mutations/CreateEntityRelationInputFieldVisitor.d.ts.map +1 -1
  190. package/dist/src/schema/mutations/CreateEntityRelationInputFieldVisitor.js +5 -5
  191. package/dist/src/schema/mutations/CreateEntityRelationInputFieldVisitor.js.map +1 -1
  192. package/dist/src/schema/mutations/UpdateEntityInputFieldVisitor.d.ts +10 -4
  193. package/dist/src/schema/mutations/UpdateEntityInputFieldVisitor.d.ts.map +1 -1
  194. package/dist/src/schema/mutations/UpdateEntityInputFieldVisitor.js +3 -3
  195. package/dist/src/schema/mutations/UpdateEntityInputFieldVisitor.js.map +1 -1
  196. package/dist/src/schema/mutations/UpdateEntityRelationAllowedOperationsVisitor.d.ts +6 -6
  197. package/dist/src/schema/mutations/UpdateEntityRelationAllowedOperationsVisitor.d.ts.map +1 -1
  198. package/dist/src/schema/mutations/UpdateEntityRelationAllowedOperationsVisitor.js +6 -6
  199. package/dist/src/schema/mutations/UpdateEntityRelationAllowedOperationsVisitor.js.map +1 -1
  200. package/dist/src/schema/mutations/UpdateEntityRelationInputFieldVisitor.d.ts +2 -2
  201. package/dist/src/schema/mutations/UpdateEntityRelationInputFieldVisitor.d.ts.map +1 -1
  202. package/dist/src/schema/mutations/UpdateEntityRelationInputFieldVisitor.js +2 -2
  203. package/dist/src/schema/mutations/UpdateEntityRelationInputFieldVisitor.js.map +1 -1
  204. package/dist/src/tsconfig.tsbuildinfo +1 -1
  205. package/dist/src/utils/object.d.ts.map +1 -1
  206. package/dist/src/utils/object.js +3 -4
  207. package/dist/src/utils/object.js.map +1 -1
  208. package/dist/src/utils/uniqueWhereFields.js +3 -3
  209. package/dist/src/utils/uniqueWhereFields.js.map +1 -1
  210. package/dist/tests/cases/integration/graphQlRequests/delete/aclDelete.test.js +1 -1
  211. package/dist/tests/cases/integration/graphQlRequests/delete/aclDelete.test.js.map +1 -1
  212. package/dist/tests/cases/integration/graphQlRequests/insert/acl/setField.test.js +2 -2
  213. package/dist/tests/cases/integration/graphQlRequests/insert/acl/setField.test.js.map +1 -1
  214. package/dist/tests/cases/integration/graphQlRequests/insert/aclInsert.test.js +1 -1
  215. package/dist/tests/cases/integration/graphQlRequests/insert/aclInsert.test.js.map +1 -1
  216. package/dist/tests/cases/integration/graphQlRequests/query/acl/fieldRestrictedByLocale.test.js +7 -6
  217. package/dist/tests/cases/integration/graphQlRequests/query/acl/fieldRestrictedByLocale.test.js.map +1 -1
  218. package/dist/tests/cases/integration/graphQlRequests/query/acl/nestedPredicate.test.js +1 -1
  219. package/dist/tests/cases/integration/graphQlRequests/query/acl/nestedPredicate.test.js.map +1 -1
  220. package/dist/tests/cases/integration/graphQlRequests/query/acl/predicateElimination.test.d.ts +2 -0
  221. package/dist/tests/cases/integration/graphQlRequests/query/acl/predicateElimination.test.d.ts.map +1 -0
  222. package/dist/tests/cases/integration/graphQlRequests/query/acl/predicateElimination.test.js +137 -0
  223. package/dist/tests/cases/integration/graphQlRequests/query/acl/predicateElimination.test.js.map +1 -0
  224. package/dist/tests/cases/integration/graphQlRequests/query/filter/complexCondition.test.js +1 -1
  225. package/dist/tests/cases/integration/graphQlRequests/query/filter/composedFilter.test.js +1 -1
  226. package/dist/tests/cases/integration/graphQlRequests/query/filter/composedFilter.test.js.map +1 -1
  227. package/dist/tests/cases/integration/graphQlRequests/query/relations/manyHasManyInverse.test.js +73 -0
  228. package/dist/tests/cases/integration/graphQlRequests/query/relations/manyHasManyInverse.test.js.map +1 -1
  229. package/dist/tests/cases/integration/graphQlRequests/query/relations/manyHasManyOwning.test.js +73 -0
  230. package/dist/tests/cases/integration/graphQlRequests/query/relations/manyHasManyOwning.test.js.map +1 -1
  231. package/dist/tests/cases/integration/graphQlRequests/update/acl/aclUpdate.test.js +6 -6
  232. package/dist/tests/cases/integration/graphQlRequests/update/acl/aclUpdate.test.js.map +1 -1
  233. package/dist/tests/cases/integration/graphQlSchema/graphQlSchemaBuilder.test.js +6 -3
  234. package/dist/tests/cases/integration/graphQlSchema/graphQlSchemaBuilder.test.js.map +1 -1
  235. package/dist/tests/cases/integration/graphQlSchema/model.js.map +1 -1
  236. package/dist/tests/cases/unit/aclVariablesFactory.test.js +7 -33
  237. package/dist/tests/cases/unit/aclVariablesFactory.test.js.map +1 -1
  238. package/dist/tests/cases/unit/conditionOptimizer.test.d.ts +2 -0
  239. package/dist/tests/cases/unit/conditionOptimizer.test.d.ts.map +1 -0
  240. package/dist/tests/cases/unit/conditionOptimizer.test.js +118 -0
  241. package/dist/tests/cases/unit/conditionOptimizer.test.js.map +1 -0
  242. package/dist/tests/cases/unit/orderbyHelper.test.js +1 -0
  243. package/dist/tests/cases/unit/orderbyHelper.test.js.map +1 -1
  244. package/dist/tests/cases/unit/permissionMerger.test.js +2 -0
  245. package/dist/tests/cases/unit/permissionMerger.test.js.map +1 -1
  246. package/dist/tests/cases/unit/predicatesFactory.test.d.ts +2 -0
  247. package/dist/tests/cases/unit/predicatesFactory.test.d.ts.map +1 -0
  248. package/dist/tests/cases/unit/predicatesFactory.test.js +109 -0
  249. package/dist/tests/cases/unit/predicatesFactory.test.js.map +1 -0
  250. package/dist/tests/cases/unit/predicatesInjector.test.js +88 -14
  251. package/dist/tests/cases/unit/predicatesInjector.test.js.map +1 -1
  252. package/dist/tests/cases/unit/variableInjector.test.js +4 -3
  253. package/dist/tests/cases/unit/variableInjector.test.js.map +1 -1
  254. package/dist/tests/cases/unit/whereOptimizer.test.d.ts +2 -0
  255. package/dist/tests/cases/unit/whereOptimizer.test.d.ts.map +1 -0
  256. package/dist/tests/cases/unit/whereOptimizer.test.js +265 -0
  257. package/dist/tests/cases/unit/whereOptimizer.test.js.map +1 -0
  258. package/dist/tests/src/testGraphql.d.ts.map +1 -1
  259. package/dist/tests/src/testGraphql.js +10 -2
  260. package/dist/tests/src/testGraphql.js.map +1 -1
  261. package/dist/tests/tsconfig.tsbuildinfo +1 -1
  262. package/graphql.codegen.yml +0 -3
  263. package/package.json +16 -16
  264. package/src/acl/EvaluatedPredicateReplacer.ts +32 -0
  265. package/src/acl/PermissionFactory.ts +18 -13
  266. package/src/acl/PredicateFactory.ts +32 -8
  267. package/src/acl/PredicatesInjector.ts +25 -17
  268. package/src/acl/VariableInjector.ts +2 -15
  269. package/src/acl/VariableUtils.ts +7 -23
  270. package/src/extensions/hasManyToHasOneReducer/HasManyToHasOneReducerExecutionHandler.ts +17 -24
  271. package/src/extensions/hasManyToHasOneReducer/HasManyToHasOneRelationReducerVisitor.ts +1 -6
  272. package/src/extensions/paginatedHasMany/PaginatedHasManyCountVisitor.ts +26 -46
  273. package/src/extensions/paginatedHasMany/PaginatedHasManyExecutionHandler.ts +6 -3
  274. package/src/extensions/paginatedHasMany/PaginatedHasManyFieldProviderVisitor.ts +4 -22
  275. package/src/extensions/paginatedHasMany/PaginatedHasManyNodesVisitor.ts +26 -49
  276. package/src/input-validation/ColumnValueResolver.ts +2 -3
  277. package/src/input-validation/EntityRulesResolver.ts +4 -4
  278. package/src/input-validation/QueryAstFactory.ts +1 -1
  279. package/src/input-validation/ValidationContext.ts +2 -2
  280. package/src/input-validation/ValidationDataSelector.ts +2 -2
  281. package/src/input-validation/preValidation/CreateInputPreValidationProcessor.ts +7 -8
  282. package/src/input-validation/preValidation/InputPreValidator.ts +4 -4
  283. package/src/input-validation/preValidation/UpdateInputPreValidationProcessor.ts +7 -8
  284. package/src/inputProcessing/CreateInputProcessor.ts +8 -9
  285. package/src/inputProcessing/CreateInputVisitor.ts +27 -89
  286. package/src/inputProcessing/UpdateInputProcessor.ts +8 -9
  287. package/src/inputProcessing/UpdateInputVisitor.ts +25 -71
  288. package/src/inputProcessing/index.ts +0 -1
  289. package/src/introspection/IntrospectionSchemaFactory.ts +7 -7
  290. package/src/introspection/content-schema.types.ts +19 -286
  291. package/src/mapper/Mapper.ts +37 -30
  292. package/src/mapper/MapperContainer.ts +10 -5
  293. package/src/mapper/delete/DeleteExecutor.ts +3 -3
  294. package/src/mapper/insert/SqlCreateInputProcessor.ts +3 -3
  295. package/src/mapper/select/JoinVisitor.ts +6 -33
  296. package/src/mapper/select/RelationFetcher.ts +101 -41
  297. package/src/mapper/select/SelectBuilder.ts +3 -1
  298. package/src/mapper/select/SelectBuilderFactory.ts +2 -1
  299. package/src/mapper/select/SelectExecutionHandler.ts +1 -0
  300. package/src/mapper/select/WhereBuilder.ts +46 -32
  301. package/src/mapper/select/handlers/FieldsVisitor.ts +47 -57
  302. package/src/mapper/select/handlers/FieldsVisitorFactory.ts +1 -0
  303. package/src/mapper/select/optimizer/ConditionOptimizer.ts +41 -0
  304. package/src/mapper/select/optimizer/WhereOptimizer.ts +138 -0
  305. package/src/mapper/select/optimizer/WhereReplacer.ts +27 -0
  306. package/src/mapper/select/optimizer/helpers.ts +58 -0
  307. package/src/mapper/update/SqlUpdateInputProcessor.ts +1 -1
  308. package/src/mapper/update/UpdateBuilder.ts +3 -3
  309. package/src/resolvers/GraphQlQueryAstFactory.ts +3 -3
  310. package/src/resolvers/MutationResolver.ts +1 -1
  311. package/src/resolvers/ReadHelpers.ts +3 -3
  312. package/src/resolvers/ReadResolver.ts +2 -2
  313. package/src/schema/FieldAccessVisitor.ts +2 -2
  314. package/src/schema/OrderByTypeProvider.ts +1 -1
  315. package/src/schema/WhereTypeProvider.ts +4 -4
  316. package/src/schema/entities/FieldArgsVisitor.ts +3 -3
  317. package/src/schema/entities/FieldTypeVisitor.ts +3 -3
  318. package/src/schema/mutations/CreateEntityInputFieldVisitor.ts +3 -6
  319. package/src/schema/mutations/CreateEntityRelationAllowedOperationsVisitor.ts +6 -20
  320. package/src/schema/mutations/CreateEntityRelationInputFieldVisitor.ts +5 -18
  321. package/src/schema/mutations/UpdateEntityInputFieldVisitor.ts +3 -6
  322. package/src/schema/mutations/UpdateEntityRelationAllowedOperationsVisitor.ts +6 -20
  323. package/src/schema/mutations/UpdateEntityRelationInputFieldVisitor.ts +2 -12
  324. package/src/utils/object.ts +6 -6
  325. package/src/utils/uniqueWhereFields.ts +3 -3
  326. package/tests/cases/integration/graphQlRequests/delete/aclDelete.test.ts +2 -2
  327. package/tests/cases/integration/graphQlRequests/insert/acl/setField.test.ts +3 -3
  328. package/tests/cases/integration/graphQlRequests/insert/aclInsert.test.ts +2 -2
  329. package/tests/cases/integration/graphQlRequests/query/acl/fieldRestrictedByLocale.test.ts +7 -6
  330. package/tests/cases/integration/graphQlRequests/query/acl/nestedPredicate.test.ts +1 -1
  331. package/tests/cases/integration/graphQlRequests/query/acl/predicateElimination.test.ts +130 -0
  332. package/tests/cases/integration/graphQlRequests/query/filter/complexCondition.test.ts +1 -1
  333. package/tests/cases/integration/graphQlRequests/query/filter/composedFilter.test.ts +1 -1
  334. package/tests/cases/integration/graphQlRequests/query/relations/manyHasManyInverse.test.ts +74 -0
  335. package/tests/cases/integration/graphQlRequests/query/relations/manyHasManyOwning.test.ts +77 -0
  336. package/tests/cases/integration/graphQlRequests/update/acl/aclUpdate.test.ts +7 -7
  337. package/tests/cases/integration/graphQlSchema/graphQlSchemaBuilder.test.ts +5 -5
  338. package/tests/cases/unit/aclVariablesFactory.test.ts +8 -35
  339. package/tests/cases/unit/conditionOptimizer.test.ts +135 -0
  340. package/tests/cases/unit/orderbyHelper.test.ts +1 -0
  341. package/tests/cases/unit/permissionMerger.test.ts +2 -0
  342. package/tests/cases/unit/predicatesFactory.test.ts +103 -0
  343. package/tests/cases/unit/predicatesInjector.test.ts +78 -16
  344. package/tests/cases/unit/variableInjector.test.ts +6 -5
  345. package/tests/cases/unit/whereOptimizer.test.ts +289 -0
  346. package/tests/src/testGraphql.ts +9 -2
  347. package/dist/src/inputProcessing/InputContext.d.ts +0 -43
  348. package/dist/src/inputProcessing/InputContext.d.ts.map +0 -1
  349. package/dist/src/inputProcessing/InputContext.js +0 -3
  350. package/dist/src/inputProcessing/InputContext.js.map +0 -1
  351. package/jasmine.json +0 -7
  352. package/src/inputProcessing/InputContext.ts +0 -49
@@ -10,9 +10,6 @@ generates:
10
10
  plugins:
11
11
  - "typescript"
12
12
  - "typescript-operations"
13
- - "typescript-resolvers"
14
- require:
15
- - "ts-node/register"
16
13
  hooks:
17
14
  afterAllFileWrite:
18
15
  - eslint --fix
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@contember/engine-content-api",
3
- "version": "1.1.2",
3
+ "version": "1.2.0-alpha.11",
4
4
  "license": "Apache-2.0",
5
5
  "main": "dist/src/index.js",
6
6
  "typings": "dist/src/index.d.ts",
@@ -10,25 +10,25 @@
10
10
  "test": "vitest --no-threads"
11
11
  },
12
12
  "dependencies": {
13
- "@contember/database": "^1.1.2",
14
- "@contember/dic": "^1.1.2",
15
- "@contember/engine-common": "^1.1.2",
16
- "@contember/graphql-utils": "^1.1.2",
17
- "@contember/schema": "^1.1.2",
18
- "@contember/schema-utils": "^1.1.2",
13
+ "@contember/database": "^1.2.0-alpha.11",
14
+ "@contember/dic": "^1.2.0-alpha.11",
15
+ "@contember/engine-common": "^1.2.0-alpha.11",
16
+ "@contember/graphql-utils": "^1.2.0-alpha.11",
17
+ "@contember/schema": "^1.2.0-alpha.11",
18
+ "@contember/schema-utils": "^1.2.0-alpha.11",
19
19
  "@graphql-tools/schema": "^8.3.5",
20
20
  "graphql-tag": "^2.12.5"
21
21
  },
22
22
  "devDependencies": {
23
- "@contember/database-tester": "^1.1.2",
24
- "@contember/engine-api-tester": "^1.1.2",
25
- "@contember/schema-definition": "^1.1.2",
26
- "@graphql-codegen/cli": "^1.15.2",
27
- "@graphql-codegen/typescript": "^1.15.2",
28
- "@graphql-codegen/typescript-operations": "^1.15.2",
29
- "@graphql-codegen/typescript-resolvers": "^1.15.2",
30
- "@types/node": "^17.0.5",
31
- "graphql": "^15.4.0",
23
+ "@contember/database-tester": "^1.2.0-alpha.11",
24
+ "@contember/engine-api-tester": "^1.2.0-alpha.11",
25
+ "@contember/schema-definition": "^1.2.0-alpha.11",
26
+ "@graphql-codegen/cli": "^2.6.2",
27
+ "@graphql-codegen/typescript": "^2.5.1",
28
+ "@graphql-codegen/typescript-operations": "^2.4.2",
29
+ "@graphql-codegen/typescript-resolvers": "^2.6.6",
30
+ "@types/node": "^18",
31
+ "graphql": "^16.5.0",
32
32
  "pg": "^8.5.0"
33
33
  },
34
34
  "peerDependencies": {
@@ -0,0 +1,32 @@
1
+ import { Input, Model, Writable } from '@contember/schema'
2
+ import { replaceWhere } from '../mapper/select/optimizer/WhereReplacer'
3
+
4
+ export class EvaluatedPredicateReplacer {
5
+ constructor(
6
+ private readonly evaluatedPredicate: Input.Where,
7
+ private readonly sourceEntity: Model.Entity,
8
+ private readonly relation: Model.AnyRelation,
9
+ ) {
10
+ }
11
+
12
+ public replace(where: Input.Where): Input.Where {
13
+ const result: Writable<Input.Where> = {}
14
+ for (const [key, value] of Object.entries(where)) {
15
+ if (key === 'not') {
16
+ result['not'] = this.replace(value as Input.Where)
17
+
18
+ } else if (key === 'and' || key === 'or') {
19
+ result[key] = (value as Input.Where[]).map(it => this.replace(it))
20
+
21
+ } else if (key === this.relation.name) {
22
+ result[key] = replaceWhere(value as Input.Where, this.evaluatedPredicate, { [this.sourceEntity.primary]: { always: true } })
23
+
24
+ } else {
25
+ result[key] = value
26
+ }
27
+
28
+ }
29
+ return result
30
+ }
31
+
32
+ }
@@ -17,7 +17,7 @@ export class PermissionFactory {
17
17
  }
18
18
  result = this.mergePermissions(result, rolePermissions)
19
19
  }
20
- this.makePrimaryPredicatesUnionOfAllFields(result)
20
+ result = this.makePrimaryPredicatesUnionOfAllFields(result)
21
21
 
22
22
  return result
23
23
  }
@@ -45,18 +45,20 @@ export class PermissionFactory {
45
45
  }))
46
46
  }
47
47
 
48
- private makePrimaryPredicatesUnionOfAllFields(permissions: Acl.Permissions): void {
49
- for (let entityName in permissions) {
48
+ private makePrimaryPredicatesUnionOfAllFields(permissions: Acl.Permissions): Acl.Permissions {
49
+ return mapObject(permissions, (permission, entityName): Acl.EntityPermissions => {
50
50
  const entity = getEntity(this.schema, entityName)
51
- const entityPermissions: Acl.EntityPermissions = permissions[entityName]
52
- const entityPredicates: Writable<Acl.PredicateMap> = entityPermissions.predicates
51
+ const entityPredicates: Writable<Acl.PredicateMap> = { ...permission.predicates }
52
+ const entityOperations: Writable<Acl.EntityOperations> = { ...permission.operations }
53
53
 
54
54
  const operationNames = ['read', 'create', 'update'] as const
55
55
  for (let operation of operationNames) {
56
- const fieldPermissions: Writable<Acl.FieldPermissions> | undefined = entityPermissions.operations[operation]
57
- if (fieldPermissions === undefined) {
56
+ if (!entityOperations[operation]) {
58
57
  continue
59
58
  }
59
+ const fieldPermissions: Writable<Acl.FieldPermissions> = { ...entityOperations[operation] }
60
+ entityOperations[operation] = fieldPermissions
61
+
60
62
  if (Object.values(fieldPermissions).some(it => it === true)) {
61
63
  fieldPermissions[entity.primary] = true
62
64
  }
@@ -70,25 +72,28 @@ export class PermissionFactory {
70
72
  .filter((value, index, array): value is string => array.indexOf(value) === index)
71
73
 
72
74
  let idPermissions: Acl.Predicate = fieldPermissions[entity.primary] || false
73
- const predicates = { ...entityPermissions.predicates }
74
75
 
75
76
  for (let predicateReference of predicateReferences) {
76
77
  const [predicateDefinition, predicate] = this.mergePredicates(
77
- predicates,
78
+ entityPredicates,
78
79
  idPermissions,
79
- predicates,
80
+ entityPredicates,
80
81
  predicateReference,
81
82
  )
82
83
  if (typeof predicate !== 'string' || predicateDefinition === undefined) {
83
84
  throw new Error('should not happen')
84
85
  }
85
86
  idPermissions = predicate
86
- predicates[predicate] = predicateDefinition
87
+ entityPredicates[predicate] = predicateDefinition
87
88
  }
88
89
  fieldPermissions[entity.primary] = idPermissions
89
- entityPredicates[idPermissions as Acl.PredicateReference] = predicates[idPermissions as Acl.PredicateReference]
90
+ entityPredicates[idPermissions as Acl.PredicateReference] = entityPredicates[idPermissions as Acl.PredicateReference]
90
91
  }
91
- }
92
+ return {
93
+ operations: entityOperations,
94
+ predicates: entityPredicates,
95
+ }
96
+ })
92
97
  }
93
98
 
94
99
  private mergePermissions(left: Acl.Permissions, right: Acl.Permissions): Acl.Permissions {
@@ -1,10 +1,15 @@
1
1
  import { Acl, Input, Model } from '@contember/schema'
2
2
  import { VariableInjector } from './VariableInjector'
3
+ import { EvaluatedPredicateReplacer } from './EvaluatedPredicateReplacer'
3
4
 
4
5
  const getRowLevelPredicatePseudoField = (entity: Model.Entity) => entity.primary
5
6
 
6
7
  export class PredicateFactory {
7
- constructor(private readonly permissions: Acl.Permissions, private readonly variableInjector: VariableInjector) {}
8
+ constructor(
9
+ private readonly permissions: Acl.Permissions,
10
+ private readonly model: Model.Schema,
11
+ private readonly variableInjector: VariableInjector,
12
+ ) {}
8
13
 
9
14
  public shouldApplyCellLevelPredicate(
10
15
  entity: Model.Entity,
@@ -16,13 +21,22 @@ export class PredicateFactory {
16
21
  return permissions?.[fieldName] !== permissions?.[rowLevelField]
17
22
  }
18
23
 
19
- public create(entity: Model.Entity, operation: Acl.Operation.delete): Input.Where
24
+ public create(
25
+ entity: Model.Entity,
26
+ operation: Acl.Operation.delete,
27
+ ): Input.Where
20
28
  public create(
21
29
  entity: Model.Entity,
22
30
  operation: Acl.Operation.update | Acl.Operation.read | Acl.Operation.create,
23
31
  fieldNames?: string[],
32
+ relationContext?: Model.AnyRelationContext,
24
33
  ): Input.Where
25
- public create(entity: Model.Entity, operation: Acl.Operation, fieldNames?: string[]): Input.Where {
34
+ public create(
35
+ entity: Model.Entity,
36
+ operation: Acl.Operation,
37
+ fieldNames?: string[],
38
+ relationContext?: Model.AnyRelationContext,
39
+ ): Input.Where {
26
40
  const entityPermissions: Acl.EntityPermissions = this.permissions[entity.name]
27
41
  const neverCondition: Input.Where = { [entity.primary]: { never: true } }
28
42
 
@@ -68,11 +82,8 @@ export class PredicateFactory {
68
82
  if (predicatesWhere.length === 0) {
69
83
  return {}
70
84
  }
71
- if (predicatesWhere.length === 1) {
72
- return predicatesWhere[0]
73
- }
74
-
75
- return { and: predicatesWhere }
85
+ const where: Input.Where = predicatesWhere.length === 1 ? predicatesWhere[0] : { and: predicatesWhere }
86
+ return this.optimizePredicates(where, relationContext)
76
87
  }
77
88
 
78
89
  private getRequiredPredicates(
@@ -94,4 +105,17 @@ export class PredicateFactory {
94
105
  }
95
106
  return predicates
96
107
  }
108
+
109
+ private optimizePredicates(where: Input.Where, relationContext?: Model.AnyRelationContext) {
110
+ if (!relationContext || !relationContext.targetRelation) {
111
+ return where
112
+ }
113
+ const sourcePredicate = this.create(relationContext.entity, Acl.Operation.read, [relationContext.relation.name])
114
+ if (Object.keys(sourcePredicate).length === 0) {
115
+ return where
116
+ }
117
+
118
+ const replacer = new EvaluatedPredicateReplacer(sourcePredicate, relationContext.entity, relationContext.targetRelation)
119
+ return replacer.replace(where)
120
+ }
97
121
  }
@@ -5,17 +5,18 @@ import { PredicateFactory } from './PredicateFactory'
5
5
  export class PredicatesInjector {
6
6
  constructor(private readonly schema: Model.Schema, private readonly predicateFactory: PredicateFactory) {}
7
7
 
8
- public inject(entity: Model.Entity, where: Input.OptionalWhere): Input.OptionalWhere {
9
- const restrictedWhere = this.injectToWhere(where, entity)
10
- return this.createWhere(entity, undefined, restrictedWhere)
8
+ public inject(entity: Model.Entity, where: Input.OptionalWhere, relationContext?: Model.AnyRelationContext): Input.OptionalWhere {
9
+ const restrictedWhere = this.injectToWhere(where, entity, true)
10
+ return this.createWhere(entity, undefined, restrictedWhere, relationContext)
11
11
  }
12
12
 
13
13
  private createWhere(
14
14
  entity: Model.Entity,
15
15
  fieldNames: string[] | undefined,
16
16
  where: Input.OptionalWhere,
17
+ relationContext?: Model.AnyRelationContext,
17
18
  ): Input.OptionalWhere {
18
- const predicatesWhere: Input.Where = this.predicateFactory.create(entity, Acl.Operation.read, fieldNames)
19
+ const predicatesWhere: Input.Where = this.predicateFactory.create(entity, Acl.Operation.read, fieldNames, relationContext)
19
20
 
20
21
  const and = [where, predicatesWhere].filter(it => Object.keys(it).length > 0)
21
22
  if (and.length === 0) {
@@ -27,32 +28,39 @@ export class PredicatesInjector {
27
28
  return { and: and }
28
29
  }
29
30
 
30
- private injectToWhere(where: Input.OptionalWhere, entity: Model.Entity): Input.OptionalWhere {
31
+ private injectToWhere(
32
+ where: Input.OptionalWhere,
33
+ entity: Model.Entity,
34
+ isRoot: boolean,
35
+ relationContext?: Model.AnyRelationContext,
36
+ ): Input.OptionalWhere {
31
37
  const resultWhere: Writable<Input.OptionalWhere> = {}
32
38
  if (where.and) {
33
- resultWhere.and = where.and.filter((it): it is Input.Where => !!it).map(it => this.injectToWhere(it, entity))
39
+ resultWhere.and = where.and.filter((it): it is Input.Where => !!it).map(it => this.injectToWhere(it, entity, isRoot, relationContext))
34
40
  }
35
41
  if (where.or) {
36
- resultWhere.or = where.or.filter((it): it is Input.Where => !!it).map(it => this.injectToWhere(it, entity))
42
+ resultWhere.or = where.or.filter((it): it is Input.Where => !!it).map(it => this.injectToWhere(it, entity, isRoot, relationContext))
37
43
  }
38
44
  if (where.not) {
39
- resultWhere.not = this.injectToWhere(where.not, entity)
45
+ resultWhere.not = this.injectToWhere(where.not, entity, isRoot, relationContext)
40
46
  }
47
+
41
48
  const fields = Object.keys(where).filter(it => !['and', 'or', 'not'].includes(it))
49
+
42
50
  if (fields.length === 0) {
43
51
  return resultWhere
44
52
  }
45
53
  for (let field of fields) {
46
- const targetEntity = acceptFieldVisitor(this.schema, entity, field, {
47
- visitColumn: () => null,
48
- visitRelation: (_a, _b, targetEntity) => targetEntity,
54
+ resultWhere[field] = acceptFieldVisitor(this.schema, entity, field, {
55
+ visitColumn: () => where[field],
56
+ visitRelation: context => this.injectToWhere(where[field] as Input.Where, context.targetEntity, false, context),
49
57
  })
50
- if (targetEntity) {
51
- resultWhere[field] = this.injectToWhere(where[field] as Input.Where, targetEntity)
52
- } else {
53
- resultWhere[field] = where[field]
54
- }
55
58
  }
56
- return this.createWhere(entity, fields, resultWhere)
59
+ const fieldsForPredicate = !isRoot
60
+ ? fields
61
+ : fields.filter(it => this.predicateFactory.shouldApplyCellLevelPredicate(entity, Acl.Operation.read, it))
62
+
63
+ return this.createWhere(entity, fieldsForPredicate, resultWhere, relationContext)
57
64
  }
65
+
58
66
  }
@@ -10,29 +10,16 @@ export class VariableInjector {
10
10
  return predicateDefinitionProcessor.process(entity, where, {
11
11
  handleColumn: ({ value }) => {
12
12
  if (typeof value === 'string') {
13
- return this.createCondition(this.variables[value] || undefined)
13
+ return this.variables[value] ?? { never: true }
14
14
  }
15
15
  return value as Input.Condition
16
16
  },
17
17
  handleRelation: ({ value, targetEntity }) => {
18
18
  if (typeof value === 'string') {
19
- return { [targetEntity.primary]: this.createCondition(this.variables[value] || undefined) }
19
+ return { [targetEntity.primary]: this.variables[value] ?? { never: true } }
20
20
  }
21
21
  return value
22
22
  },
23
23
  })
24
24
  }
25
-
26
- private createCondition(variable: Acl.VariableValue | undefined): Input.Condition {
27
- if (variable === undefined) {
28
- return { never: true }
29
- }
30
- if (Array.isArray(variable)) {
31
- return { in: variable }
32
- }
33
- if (typeof variable === 'string' || typeof variable === 'number') {
34
- return { eq: variable }
35
- }
36
- throw new Error('not implemented')
37
- }
38
25
  }
@@ -1,36 +1,20 @@
1
- import { Acl } from '@contember/schema'
2
- import { getRoleVariables } from '@contember/schema-utils'
1
+ import { Acl, Input } from '@contember/schema'
2
+ import { getRoleVariables, ParsedMembership } from '@contember/schema-utils'
3
3
 
4
- type Memberships = readonly { role: string; variables: readonly { name: string; values: readonly string[] }[] }[]
5
4
 
6
5
  export const createAclVariables = (
7
6
  aclSchema: Acl.Schema,
8
- identity: {
9
- identityId: string
10
- personId: string | null
11
- memberships: Memberships
12
- },
7
+ memberships: readonly ParsedMembership[],
13
8
  ): Acl.VariablesMap => {
14
9
 
15
- const variablesEntries = identity.memberships.flatMap(
10
+ const variablesEntries = memberships.flatMap(
16
11
  membership => {
17
12
  const roleVariables = getRoleVariables(membership.role, aclSchema)
18
- const membershipVariablesMap = Object.fromEntries(membership.variables.map(it => [it.name, it.values]))
13
+ const membershipVariablesMap = Object.fromEntries(membership.variables.map(it => [it.name, it.condition]))
19
14
 
20
- return Object.entries(roleVariables).map(([name, def]) => {
15
+ return Object.keys(roleVariables).map((name): [string, Input.Condition] => {
21
16
  const prefixed = prefixVariable(membership.role, name)
22
-
23
- switch (def.type) {
24
- case Acl.VariableType.entity:
25
- return [prefixed, membershipVariablesMap[name] ?? []]
26
- case Acl.VariableType.predefined:
27
- switch (def.value) {
28
- case 'identityID':
29
- return [prefixed, [identity.identityId]]
30
- case 'personID':
31
- return [prefixed, identity.personId ? [identity.personId] : []]
32
- }
33
- }
17
+ return [prefixed, membershipVariablesMap[name] ?? { never: true }]
34
18
  })
35
19
  },
36
20
  )
@@ -18,7 +18,19 @@ export class HasManyToHasOneReducerExecutionHandler implements SelectExecutionHa
18
18
  addData(
19
19
  entity.primary,
20
20
  async (ids: Input.PrimaryValue[]) => {
21
- const [targetEntity, targetRelation] = this.getRelationTarget(entity, objectNode.extensions.relationName)
21
+
22
+ const relationContext = acceptFieldVisitor(this.schema, entity, objectNode.extensions.relationName, {
23
+ visitRelation: context => context,
24
+ visitColumn: (): never => {
25
+ throw new ImplementationException('HasManyToHasOneReducerExecutionHandler: Not applicable for a column')
26
+ },
27
+ })
28
+
29
+ const { targetEntity, targetRelation } = relationContext
30
+ if (!targetRelation || !isIt<Model.JoiningColumnRelation>(targetRelation, 'joiningColumn')) {
31
+ throw new Error('HasManyToHasOneReducerExecutionHandler: only applicable for relations with joiningColumn')
32
+ }
33
+
22
34
  const uniqueWhere = this.uniqueWhereExpander.expand(targetEntity, {
23
35
  ...objectNode.args.by,
24
36
  [targetRelation.name]: { [entity.primary]: ids },
@@ -31,31 +43,12 @@ export class HasManyToHasOneReducerExecutionHandler implements SelectExecutionHa
31
43
  }
32
44
  const newObjectNode = objectNode.withArgs<Input.ListQueryInput>({ filter: whereWithParentId })
33
45
 
34
- return context.mapper.select(targetEntity, newObjectNode, targetRelation.name)
46
+ return context.mapper.selectAssoc(targetEntity, newObjectNode, [
47
+ ...context.relationPath,
48
+ relationContext,
49
+ ], targetRelation.name)
35
50
  },
36
51
  null,
37
52
  )
38
53
  }
39
-
40
- private getRelationTarget(
41
- entity: Model.Entity,
42
- relationName: string,
43
- ): [Model.Entity, Model.Relation & Model.JoiningColumnRelation] {
44
- return acceptFieldVisitor(this.schema, entity, relationName, {
45
- visitColumn: (): never => {
46
- throw new ImplementationException('HasManyToHasOneReducerExecutionHandler: Not applicable for a column')
47
- },
48
- visitRelation: (
49
- entity,
50
- relation,
51
- targetEntity,
52
- targetRelation,
53
- ): [Model.Entity, Model.Relation & Model.JoiningColumnRelation] => {
54
- if (!targetRelation || !isIt<Model.JoiningColumnRelation>(targetRelation, 'joiningColumn')) {
55
- throw new Error('HasManyToHasOneReducerExecutionHandler: only applicable for relations with joiningColumn')
56
- }
57
- return [targetEntity, targetRelation]
58
- },
59
- })
60
- }
61
54
  }
@@ -48,12 +48,7 @@ export class HasManyToHasOneRelationReducerFieldVisitor implements
48
48
  return {}
49
49
  }
50
50
 
51
- public visitOneHasMany(
52
- entity: Model.Entity,
53
- relation: Model.AnyRelation,
54
- targetEntity: Model.Entity,
55
- targetRelation: Model.AnyRelation | null,
56
- ) {
51
+ public visitOneHasMany({ entity, targetEntity, targetRelation, relation }: Model.OneHasManyContext) {
57
52
  if (!targetRelation) {
58
53
  return {}
59
54
  }
@@ -1,5 +1,5 @@
1
1
  import { Input, Model } from '@contember/schema'
2
- import { GroupedCounts, JoiningColumns, Mapper, RelationFetcher } from '../../mapper'
2
+ import { GroupedCounts, Mapper, RelationFetcher } from '../../mapper'
3
3
  import { ObjectNode } from '../../inputProcessing'
4
4
 
5
5
  export class PaginatedHasManyCountVisitor implements
@@ -11,62 +11,42 @@ export class PaginatedHasManyCountVisitor implements
11
11
  private readonly objectNode: ObjectNode<Input.PaginationQueryInput>,
12
12
  private readonly relationFetcher: RelationFetcher,
13
13
  private readonly mapper: Mapper,
14
+ private readonly relationPath: Model.AnyRelationContext[],
14
15
  ) {}
15
16
 
16
- async visitOneHasMany(
17
- entity: Model.Entity,
18
- relation: Model.OneHasManyRelation,
19
- targetEntity: Model.Entity,
20
- targetRelation: Model.ManyHasOneRelation,
21
- ): Promise<GroupedCounts> {
17
+ async visitOneHasMany(relationContext: Model.OneHasManyContext): Promise<GroupedCounts> {
22
18
  return await this.relationFetcher.countOneHasManyGroups(
23
- this.mapper,
24
- this.objectNode.args.filter,
25
- targetEntity,
26
- targetRelation,
27
- this.ids,
19
+ {
20
+ mapper: this.mapper,
21
+ filter: this.objectNode.args.filter,
22
+ relationContext,
23
+ relationPath: this.relationPath,
24
+ ids: this.ids,
25
+ },
28
26
  )
29
27
  }
30
28
 
31
- async visitManyHasManyOwning(
32
- entity: Model.Entity,
33
- relation: Model.ManyHasManyOwningRelation,
34
- targetEntity: Model.Entity,
35
- targetRelation: Model.ManyHasManyInverseRelation | null,
36
- ): Promise<GroupedCounts> {
37
- const joiningTable = relation.joiningTable
38
- const columns: JoiningColumns = {
39
- sourceColumn: joiningTable.joiningColumn,
40
- targetColumn: joiningTable.inverseJoiningColumn,
41
- }
29
+ async visitManyHasManyOwning(relationContext: Model.ManyHasManyOwningContext): Promise<GroupedCounts> {
42
30
  return await this.relationFetcher.countManyHasManyGroups(
43
- this.mapper,
44
- this.objectNode.args.filter,
45
- targetEntity,
46
- relation,
47
- this.ids,
48
- columns,
31
+ {
32
+ mapper: this.mapper,
33
+ filter: this.objectNode.args.filter,
34
+ relationContext,
35
+ relationPath: this.relationPath,
36
+ ids: this.ids,
37
+ },
49
38
  )
50
39
  }
51
40
 
52
- async visitManyHasManyInverse(
53
- entity: Model.Entity,
54
- relation: Model.ManyHasManyInverseRelation,
55
- targetEntity: Model.Entity,
56
- targetRelation: Model.ManyHasManyOwningRelation,
57
- ): Promise<GroupedCounts> {
58
- const joiningTable = targetRelation.joiningTable
59
- const columns: JoiningColumns = {
60
- targetColumn: joiningTable.joiningColumn,
61
- sourceColumn: joiningTable.inverseJoiningColumn,
62
- }
41
+ async visitManyHasManyInverse(relationContext: Model.ManyHasManyInverseContext): Promise<GroupedCounts> {
63
42
  return await this.relationFetcher.countManyHasManyGroups(
64
- this.mapper,
65
- this.objectNode.args.filter,
66
- targetEntity,
67
- targetRelation,
68
- this.ids,
69
- columns,
43
+ {
44
+ mapper: this.mapper,
45
+ filter: this.objectNode.args.filter,
46
+ relationContext,
47
+ relationPath: this.relationPath,
48
+ ids: this.ids,
49
+ },
70
50
  )
71
51
  }
72
52
 
@@ -7,7 +7,10 @@ import { PaginatedHasManyCountVisitor } from './PaginatedHasManyCountVisitor'
7
7
  import { PaginatedHasManyNodesVisitor } from './PaginatedHasManyNodesVisitor'
8
8
 
9
9
  export class PaginatedHasManyExecutionHandler implements SelectExecutionHandler<Input.PaginationQueryInput, PaginatedHasManyFieldProviderExtension> {
10
- constructor(private readonly schema: Model.Schema, private readonly relationFetcher: RelationFetcher) {}
10
+ constructor(
11
+ private readonly schema: Model.Schema,
12
+ private readonly relationFetcher: RelationFetcher,
13
+ ) {}
11
14
 
12
15
  process(
13
16
  context: SelectExecutionHandlerContext<Input.PaginationQueryInput, PaginatedHasManyFieldProviderExtension>,
@@ -25,7 +28,7 @@ export class PaginatedHasManyExecutionHandler implements SelectExecutionHandler<
25
28
  this.schema,
26
29
  entity,
27
30
  objectNode.extensions.relationName,
28
- new PaginatedHasManyCountVisitor(ids, objectNode, this.relationFetcher, mapper),
31
+ new PaginatedHasManyCountVisitor(ids, objectNode, this.relationFetcher, mapper, context.relationPath),
29
32
  )
30
33
  : {}
31
34
 
@@ -34,7 +37,7 @@ export class PaginatedHasManyExecutionHandler implements SelectExecutionHandler<
34
37
  this.schema,
35
38
  entity,
36
39
  objectNode.extensions.relationName,
37
- new PaginatedHasManyNodesVisitor(ids, pagination.nodeField, this.relationFetcher, mapper),
40
+ new PaginatedHasManyNodesVisitor(ids, pagination.nodeField, this.relationFetcher, mapper, context.relationPath),
38
41
  )
39
42
  : undefined
40
43
  const result = new Map<Input.PrimaryValue, any>()
@@ -11,37 +11,19 @@ export class PaginatedHasManyFieldProviderVisitor implements
11
11
 
12
12
  constructor(private readonly paginatedFieldFactory: PaginatedFieldConfigFactory) {}
13
13
 
14
- visitOneHasMany(
15
- entity: Model.Entity,
16
- relation: Model.OneHasManyRelation,
17
- targetEntity: Model.Entity,
18
- targetRelation: Model.ManyHasOneRelation,
19
- ): FieldMap<PaginatedHasManyFieldProviderExtension> {
14
+ visitOneHasMany({ targetEntity, relation }: Model.OneHasManyContext) {
20
15
  return this.createField(targetEntity, relation)
21
16
  }
22
17
 
23
- visitManyHasManyOwning(
24
- entity: Model.Entity,
25
- relation: Model.ManyHasManyOwningRelation,
26
- targetEntity: Model.Entity,
27
- targetRelation: Model.ManyHasManyInverseRelation | null,
28
- ): FieldMap<PaginatedHasManyFieldProviderExtension> {
18
+ visitManyHasManyOwning({ targetEntity, relation }: Model.ManyHasManyOwningContext) {
29
19
  return this.createField(targetEntity, relation)
30
20
  }
31
21
 
32
- visitManyHasManyInverse(
33
- entity: Model.Entity,
34
- relation: Model.ManyHasManyInverseRelation,
35
- targetEntity: Model.Entity,
36
- targetRelation: Model.ManyHasManyOwningRelation,
37
- ): FieldMap<PaginatedHasManyFieldProviderExtension> {
22
+ visitManyHasManyInverse({ targetEntity, relation }: Model.ManyHasManyInverseContext) {
38
23
  return this.createField(targetEntity, relation)
39
24
  }
40
25
 
41
- private createField(
42
- entity: Model.Entity,
43
- relation: Model.Relation,
44
- ): FieldMap<PaginatedHasManyFieldProviderExtension> {
26
+ private createField(entity: Model.Entity, relation: Model.Relation): FieldMap<PaginatedHasManyFieldProviderExtension> {
45
27
  return {
46
28
  [`paginate${capitalizeFirstLetter(relation.name)}`]: {
47
29
  ...this.paginatedFieldFactory.createFieldConfig(entity),