@contember/engine-content-api 1.2.0-alpha.8 → 1.2.0-beta.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.
- package/dist/src/acl/EvaluatedPredicateReplacer.d.ts +2 -3
- package/dist/src/acl/EvaluatedPredicateReplacer.d.ts.map +1 -1
- package/dist/src/acl/EvaluatedPredicateReplacer.js +5 -14
- package/dist/src/acl/EvaluatedPredicateReplacer.js.map +1 -1
- package/dist/src/acl/PermissionFactory.d.ts.map +1 -1
- package/dist/src/acl/PermissionFactory.js +15 -11
- package/dist/src/acl/PermissionFactory.js.map +1 -1
- package/dist/src/acl/PredicateFactory.d.ts +9 -3
- package/dist/src/acl/PredicateFactory.d.ts.map +1 -1
- package/dist/src/acl/PredicateFactory.js +47 -36
- package/dist/src/acl/PredicateFactory.js.map +1 -1
- package/dist/src/acl/PredicatesInjector.d.ts +1 -1
- package/dist/src/acl/PredicatesInjector.d.ts.map +1 -1
- package/dist/src/acl/PredicatesInjector.js +13 -18
- package/dist/src/acl/PredicatesInjector.js.map +1 -1
- package/dist/src/extensions/hasManyToHasOneReducer/HasManyToHasOneReducerExecutionHandler.d.ts +0 -1
- package/dist/src/extensions/hasManyToHasOneReducer/HasManyToHasOneReducerExecutionHandler.d.ts.map +1 -1
- package/dist/src/extensions/hasManyToHasOneReducer/HasManyToHasOneReducerExecutionHandler.js +26 -23
- package/dist/src/extensions/hasManyToHasOneReducer/HasManyToHasOneReducerExecutionHandler.js.map +1 -1
- package/dist/src/extensions/hasManyToHasOneReducer/HasManyToHasOneRelationReducerVisitor.d.ts +1 -1
- package/dist/src/extensions/hasManyToHasOneReducer/HasManyToHasOneRelationReducerVisitor.d.ts.map +1 -1
- package/dist/src/extensions/hasManyToHasOneReducer/HasManyToHasOneRelationReducerVisitor.js +1 -1
- package/dist/src/extensions/hasManyToHasOneReducer/HasManyToHasOneRelationReducerVisitor.js.map +1 -1
- package/dist/src/extensions/paginatedHasMany/PaginatedHasManyCountVisitor.d.ts +5 -4
- package/dist/src/extensions/paginatedHasMany/PaginatedHasManyCountVisitor.d.ts.map +1 -1
- package/dist/src/extensions/paginatedHasMany/PaginatedHasManyCountVisitor.js +11 -14
- package/dist/src/extensions/paginatedHasMany/PaginatedHasManyCountVisitor.js.map +1 -1
- package/dist/src/extensions/paginatedHasMany/PaginatedHasManyExecutionHandler.d.ts.map +1 -1
- package/dist/src/extensions/paginatedHasMany/PaginatedHasManyExecutionHandler.js +18 -14
- package/dist/src/extensions/paginatedHasMany/PaginatedHasManyExecutionHandler.js.map +1 -1
- package/dist/src/extensions/paginatedHasMany/PaginatedHasManyFieldProviderVisitor.d.ts +3 -3
- package/dist/src/extensions/paginatedHasMany/PaginatedHasManyFieldProviderVisitor.d.ts.map +1 -1
- package/dist/src/extensions/paginatedHasMany/PaginatedHasManyFieldProviderVisitor.js +3 -3
- package/dist/src/extensions/paginatedHasMany/PaginatedHasManyFieldProviderVisitor.js.map +1 -1
- package/dist/src/extensions/paginatedHasMany/PaginatedHasManyNodesVisitor.d.ts +5 -4
- package/dist/src/extensions/paginatedHasMany/PaginatedHasManyNodesVisitor.d.ts.map +1 -1
- package/dist/src/extensions/paginatedHasMany/PaginatedHasManyNodesVisitor.js +11 -15
- package/dist/src/extensions/paginatedHasMany/PaginatedHasManyNodesVisitor.js.map +1 -1
- package/dist/src/input-validation/ColumnValueResolver.d.ts +4 -3
- package/dist/src/input-validation/ColumnValueResolver.d.ts.map +1 -1
- package/dist/src/input-validation/ColumnValueResolver.js.map +1 -1
- package/dist/src/input-validation/EntityRulesResolver.js +4 -4
- package/dist/src/input-validation/EntityRulesResolver.js.map +1 -1
- package/dist/src/input-validation/QueryAstFactory.js +1 -1
- package/dist/src/input-validation/QueryAstFactory.js.map +1 -1
- package/dist/src/input-validation/ValidationDataSelector.js +1 -1
- package/dist/src/input-validation/ValidationDataSelector.js.map +1 -1
- package/dist/src/input-validation/preValidation/CreateInputPreValidationProcessor.d.ts +7 -8
- package/dist/src/input-validation/preValidation/CreateInputPreValidationProcessor.d.ts.map +1 -1
- package/dist/src/input-validation/preValidation/CreateInputPreValidationProcessor.js.map +1 -1
- package/dist/src/input-validation/preValidation/InputPreValidator.js +4 -4
- package/dist/src/input-validation/preValidation/InputPreValidator.js.map +1 -1
- package/dist/src/input-validation/preValidation/UpdateInputPreValidationProcessor.d.ts +7 -8
- package/dist/src/input-validation/preValidation/UpdateInputPreValidationProcessor.d.ts.map +1 -1
- package/dist/src/input-validation/preValidation/UpdateInputPreValidationProcessor.js.map +1 -1
- package/dist/src/inputProcessing/CreateInputProcessor.d.ts +8 -9
- package/dist/src/inputProcessing/CreateInputProcessor.d.ts.map +1 -1
- package/dist/src/inputProcessing/CreateInputVisitor.d.ts +7 -7
- package/dist/src/inputProcessing/CreateInputVisitor.d.ts.map +1 -1
- package/dist/src/inputProcessing/CreateInputVisitor.js +15 -46
- package/dist/src/inputProcessing/CreateInputVisitor.js.map +1 -1
- package/dist/src/inputProcessing/UpdateInputProcessor.d.ts +8 -9
- package/dist/src/inputProcessing/UpdateInputProcessor.d.ts.map +1 -1
- package/dist/src/inputProcessing/UpdateInputVisitor.d.ts +7 -7
- package/dist/src/inputProcessing/UpdateInputVisitor.d.ts.map +1 -1
- package/dist/src/inputProcessing/UpdateInputVisitor.js +13 -28
- package/dist/src/inputProcessing/UpdateInputVisitor.js.map +1 -1
- package/dist/src/inputProcessing/index.d.ts +0 -1
- package/dist/src/inputProcessing/index.d.ts.map +1 -1
- package/dist/src/inputProcessing/index.js +0 -1
- package/dist/src/inputProcessing/index.js.map +1 -1
- package/dist/src/introspection/IntrospectionSchemaFactory.js +7 -7
- package/dist/src/introspection/IntrospectionSchemaFactory.js.map +1 -1
- package/dist/src/mapper/ErrorUtils.d.ts.map +1 -1
- package/dist/src/mapper/ErrorUtils.js +2 -2
- package/dist/src/mapper/ErrorUtils.js.map +1 -1
- package/dist/src/mapper/JunctionTableManager.js.map +1 -1
- package/dist/src/mapper/Mapper.d.ts +6 -6
- package/dist/src/mapper/Mapper.d.ts.map +1 -1
- package/dist/src/mapper/Mapper.js +26 -21
- package/dist/src/mapper/Mapper.js.map +1 -1
- package/dist/src/mapper/MapperContainer.d.ts.map +1 -1
- package/dist/src/mapper/MapperContainer.js +4 -4
- package/dist/src/mapper/MapperContainer.js.map +1 -1
- package/dist/src/mapper/Result.d.ts.map +1 -1
- package/dist/src/mapper/Result.js +2 -4
- package/dist/src/mapper/Result.js.map +1 -1
- package/dist/src/mapper/delete/DeleteExecutor.js +6 -6
- package/dist/src/mapper/delete/DeleteExecutor.js.map +1 -1
- package/dist/src/mapper/insert/InsertBuilder.d.ts +1 -1
- package/dist/src/mapper/insert/InsertBuilder.d.ts.map +1 -1
- package/dist/src/mapper/insert/InsertBuilder.js.map +1 -1
- package/dist/src/mapper/insert/SqlCreateInputProcessor.d.ts +4 -2
- package/dist/src/mapper/insert/SqlCreateInputProcessor.d.ts.map +1 -1
- package/dist/src/mapper/insert/SqlCreateInputProcessor.js.map +1 -1
- package/dist/src/mapper/select/JoinVisitor.d.ts +6 -6
- package/dist/src/mapper/select/JoinVisitor.d.ts.map +1 -1
- package/dist/src/mapper/select/JoinVisitor.js +6 -6
- package/dist/src/mapper/select/JoinVisitor.js.map +1 -1
- package/dist/src/mapper/select/Path.d.ts +1 -0
- package/dist/src/mapper/select/Path.d.ts.map +1 -1
- package/dist/src/mapper/select/Path.js +4 -1
- package/dist/src/mapper/select/Path.js.map +1 -1
- package/dist/src/mapper/select/RelationFetcher.d.ts +11 -19
- package/dist/src/mapper/select/RelationFetcher.d.ts.map +1 -1
- package/dist/src/mapper/select/RelationFetcher.js +34 -25
- package/dist/src/mapper/select/RelationFetcher.js.map +1 -1
- package/dist/src/mapper/select/SelectBuilder.d.ts +4 -1
- package/dist/src/mapper/select/SelectBuilder.d.ts.map +1 -1
- package/dist/src/mapper/select/SelectBuilder.js +52 -12
- package/dist/src/mapper/select/SelectBuilder.js.map +1 -1
- package/dist/src/mapper/select/SelectBuilderFactory.d.ts +2 -1
- package/dist/src/mapper/select/SelectBuilderFactory.d.ts.map +1 -1
- package/dist/src/mapper/select/SelectExecutionHandler.d.ts +16 -4
- package/dist/src/mapper/select/SelectExecutionHandler.d.ts.map +1 -1
- package/dist/src/mapper/select/SelectHydrator.d.ts +3 -2
- package/dist/src/mapper/select/SelectHydrator.d.ts.map +1 -1
- package/dist/src/mapper/select/SelectHydrator.js +6 -9
- package/dist/src/mapper/select/SelectHydrator.js.map +1 -1
- package/dist/src/mapper/select/WhereBuilder.d.ts +8 -4
- package/dist/src/mapper/select/WhereBuilder.d.ts.map +1 -1
- package/dist/src/mapper/select/WhereBuilder.js +137 -35
- package/dist/src/mapper/select/WhereBuilder.js.map +1 -1
- package/dist/src/mapper/select/handlers/FieldsVisitor.d.ts +10 -8
- package/dist/src/mapper/select/handlers/FieldsVisitor.d.ts.map +1 -1
- package/dist/src/mapper/select/handlers/FieldsVisitor.js +129 -94
- package/dist/src/mapper/select/handlers/FieldsVisitor.js.map +1 -1
- package/dist/src/mapper/select/handlers/FieldsVisitorFactory.d.ts.map +1 -1
- package/dist/src/mapper/select/handlers/FieldsVisitorFactory.js +1 -1
- package/dist/src/mapper/select/handlers/FieldsVisitorFactory.js.map +1 -1
- package/dist/src/mapper/select/handlers/MetaHandler.d.ts.map +1 -1
- package/dist/src/mapper/select/handlers/MetaHandler.js +6 -11
- package/dist/src/mapper/select/handlers/MetaHandler.js.map +1 -1
- package/dist/src/mapper/select/optimizer/ConditionOptimizer.d.ts.map +1 -1
- package/dist/src/mapper/select/optimizer/ConditionOptimizer.js +6 -0
- package/dist/src/mapper/select/optimizer/ConditionOptimizer.js.map +1 -1
- package/dist/src/mapper/select/optimizer/WhereOptimizer.d.ts +9 -1
- package/dist/src/mapper/select/optimizer/WhereOptimizer.d.ts.map +1 -1
- package/dist/src/mapper/select/optimizer/WhereOptimizer.js +127 -13
- package/dist/src/mapper/select/optimizer/WhereOptimizer.js.map +1 -1
- package/dist/src/mapper/select/optimizer/WhereReplacer.d.ts +3 -0
- package/dist/src/mapper/select/optimizer/WhereReplacer.d.ts.map +1 -0
- package/dist/src/mapper/select/optimizer/WhereReplacer.js +46 -0
- package/dist/src/mapper/select/optimizer/WhereReplacer.js.map +1 -0
- package/dist/src/mapper/select/optimizer/helpers.d.ts +1 -1
- package/dist/src/mapper/select/optimizer/helpers.d.ts.map +1 -1
- package/dist/src/mapper/select/optimizer/helpers.js +8 -1
- package/dist/src/mapper/select/optimizer/helpers.js.map +1 -1
- package/dist/src/mapper/update/SqlUpdateInputProcessor.d.ts +2 -3
- package/dist/src/mapper/update/SqlUpdateInputProcessor.d.ts.map +1 -1
- package/dist/src/mapper/update/SqlUpdateInputProcessor.js +3 -4
- package/dist/src/mapper/update/SqlUpdateInputProcessor.js.map +1 -1
- package/dist/src/mapper/update/UpdateBuilder.js +3 -3
- package/dist/src/mapper/update/UpdateBuilder.js.map +1 -1
- package/dist/src/resolvers/ExecutionContainerFactory.d.ts +1 -1
- package/dist/src/resolvers/ExecutionContainerFactory.d.ts.map +1 -1
- package/dist/src/resolvers/GraphQlQueryAstFactory.d.ts +1 -2
- package/dist/src/resolvers/GraphQlQueryAstFactory.d.ts.map +1 -1
- package/dist/src/resolvers/GraphQlQueryAstFactory.js +2 -2
- package/dist/src/resolvers/GraphQlQueryAstFactory.js.map +1 -1
- package/dist/src/resolvers/MutationResolver.d.ts.map +1 -1
- package/dist/src/resolvers/MutationResolver.js +13 -2
- package/dist/src/resolvers/MutationResolver.js.map +1 -1
- package/dist/src/resolvers/ReadHelpers.js +3 -3
- package/dist/src/resolvers/ReadHelpers.js.map +1 -1
- package/dist/src/resolvers/ReadResolver.js +2 -2
- package/dist/src/resolvers/ReadResolver.js.map +1 -1
- package/dist/src/schema/EnumsProvider.d.ts.map +1 -1
- package/dist/src/schema/EnumsProvider.js +1 -2
- package/dist/src/schema/EnumsProvider.js.map +1 -1
- package/dist/src/schema/FieldAccessVisitor.d.ts +2 -2
- package/dist/src/schema/FieldAccessVisitor.d.ts.map +1 -1
- package/dist/src/schema/FieldAccessVisitor.js +2 -2
- package/dist/src/schema/FieldAccessVisitor.js.map +1 -1
- package/dist/src/schema/OrderByTypeProvider.d.ts +1 -1
- package/dist/src/schema/OrderByTypeProvider.d.ts.map +1 -1
- package/dist/src/schema/OrderByTypeProvider.js +2 -2
- package/dist/src/schema/OrderByTypeProvider.js.map +1 -1
- package/dist/src/schema/WhereTypeProvider.d.ts +1 -2
- package/dist/src/schema/WhereTypeProvider.d.ts.map +1 -1
- package/dist/src/schema/WhereTypeProvider.js +4 -4
- package/dist/src/schema/WhereTypeProvider.js.map +1 -1
- package/dist/src/schema/entities/FieldArgsVisitor.d.ts +4 -5
- package/dist/src/schema/entities/FieldArgsVisitor.d.ts.map +1 -1
- package/dist/src/schema/entities/FieldArgsVisitor.js +3 -3
- package/dist/src/schema/entities/FieldArgsVisitor.js.map +1 -1
- package/dist/src/schema/entities/FieldTypeVisitor.d.ts +3 -3
- package/dist/src/schema/entities/FieldTypeVisitor.d.ts.map +1 -1
- package/dist/src/schema/entities/FieldTypeVisitor.js +3 -3
- package/dist/src/schema/entities/FieldTypeVisitor.js.map +1 -1
- package/dist/src/schema/mutations/CreateEntityInputFieldVisitor.d.ts +3 -3
- package/dist/src/schema/mutations/CreateEntityInputFieldVisitor.d.ts.map +1 -1
- package/dist/src/schema/mutations/CreateEntityInputFieldVisitor.js +3 -3
- package/dist/src/schema/mutations/CreateEntityInputFieldVisitor.js.map +1 -1
- package/dist/src/schema/mutations/CreateEntityRelationAllowedOperationsVisitor.d.ts +6 -6
- package/dist/src/schema/mutations/CreateEntityRelationAllowedOperationsVisitor.d.ts.map +1 -1
- package/dist/src/schema/mutations/CreateEntityRelationAllowedOperationsVisitor.js +6 -6
- package/dist/src/schema/mutations/CreateEntityRelationAllowedOperationsVisitor.js.map +1 -1
- package/dist/src/schema/mutations/CreateEntityRelationInputFieldVisitor.d.ts +3 -3
- package/dist/src/schema/mutations/CreateEntityRelationInputFieldVisitor.d.ts.map +1 -1
- package/dist/src/schema/mutations/CreateEntityRelationInputFieldVisitor.js +5 -5
- package/dist/src/schema/mutations/CreateEntityRelationInputFieldVisitor.js.map +1 -1
- package/dist/src/schema/mutations/UpdateEntityInputFieldVisitor.d.ts +10 -4
- package/dist/src/schema/mutations/UpdateEntityInputFieldVisitor.d.ts.map +1 -1
- package/dist/src/schema/mutations/UpdateEntityInputFieldVisitor.js +3 -3
- package/dist/src/schema/mutations/UpdateEntityInputFieldVisitor.js.map +1 -1
- package/dist/src/schema/mutations/UpdateEntityRelationAllowedOperationsVisitor.d.ts +6 -6
- package/dist/src/schema/mutations/UpdateEntityRelationAllowedOperationsVisitor.d.ts.map +1 -1
- package/dist/src/schema/mutations/UpdateEntityRelationAllowedOperationsVisitor.js +6 -6
- package/dist/src/schema/mutations/UpdateEntityRelationAllowedOperationsVisitor.js.map +1 -1
- package/dist/src/schema/mutations/UpdateEntityRelationInputFieldVisitor.d.ts +2 -2
- package/dist/src/schema/mutations/UpdateEntityRelationInputFieldVisitor.d.ts.map +1 -1
- package/dist/src/schema/mutations/UpdateEntityRelationInputFieldVisitor.js +2 -2
- package/dist/src/schema/mutations/UpdateEntityRelationInputFieldVisitor.js.map +1 -1
- package/dist/src/schema/utils.d.ts +1 -1
- package/dist/src/schema/utils.d.ts.map +1 -1
- package/dist/src/tsconfig.tsbuildinfo +1 -1
- package/dist/src/utils/object.d.ts.map +1 -1
- package/dist/src/utils/object.js +3 -4
- package/dist/src/utils/object.js.map +1 -1
- package/dist/src/utils/uniqueWhereFields.js +3 -3
- package/dist/src/utils/uniqueWhereFields.js.map +1 -1
- package/dist/tests/cases/bugs/bug102.test.js +6 -6
- package/dist/tests/cases/bugs/bug102.test.js.map +1 -1
- package/dist/tests/cases/integration/graphQlRequests/delete/aclDelete.test.js +5 -5
- package/dist/tests/cases/integration/graphQlRequests/delete/aclDelete.test.js.map +1 -1
- package/dist/tests/cases/integration/graphQlRequests/delete/additionalDeleteFilter.test.js +5 -5
- package/dist/tests/cases/integration/graphQlRequests/delete/additionalDeleteFilter.test.js.map +1 -1
- package/dist/tests/cases/integration/graphQlRequests/delete/cascadeDelete.test.js +5 -5
- package/dist/tests/cases/integration/graphQlRequests/delete/cascadeDelete.test.js.map +1 -1
- package/dist/tests/cases/integration/graphQlRequests/delete/deleteById.test.js +5 -5
- package/dist/tests/cases/integration/graphQlRequests/delete/deleteById.test.js.map +1 -1
- package/dist/tests/cases/integration/graphQlRequests/delete/orphanRemoval.test.js +5 -5
- package/dist/tests/cases/integration/graphQlRequests/delete/orphanRemoval.test.js.map +1 -1
- package/dist/tests/cases/integration/graphQlRequests/delete/setNullOnDelete.test.js +5 -5
- package/dist/tests/cases/integration/graphQlRequests/delete/setNullOnDelete.test.js.map +1 -1
- package/dist/tests/cases/integration/graphQlRequests/query/acl/differentRowAndFieldPredicate.test.js +51 -4
- package/dist/tests/cases/integration/graphQlRequests/query/acl/differentRowAndFieldPredicate.test.js.map +1 -1
- package/dist/tests/cases/integration/graphQlRequests/query/acl/fieldRestrictedByLocale.test.js +26 -25
- package/dist/tests/cases/integration/graphQlRequests/query/acl/fieldRestrictedByLocale.test.js.map +1 -1
- package/dist/tests/cases/integration/graphQlRequests/query/acl/nestedPredicate.test.js +9 -6
- package/dist/tests/cases/integration/graphQlRequests/query/acl/nestedPredicate.test.js.map +1 -1
- package/dist/tests/cases/integration/graphQlRequests/query/acl/rowPredicateSubset.test.d.ts +2 -0
- package/dist/tests/cases/integration/graphQlRequests/query/acl/rowPredicateSubset.test.d.ts.map +1 -0
- package/dist/tests/cases/integration/graphQlRequests/query/acl/rowPredicateSubset.test.js +109 -0
- package/dist/tests/cases/integration/graphQlRequests/query/acl/rowPredicateSubset.test.js.map +1 -0
- package/dist/tests/cases/integration/graphQlRequests/query/filter/manyHasManyOwnerRelation.test.js +17 -15
- package/dist/tests/cases/integration/graphQlRequests/query/filter/manyHasManyOwnerRelation.test.js.map +1 -1
- package/dist/tests/cases/integration/graphQlRequests/query/filter/oneHasManyRelation.test.js +4 -5
- package/dist/tests/cases/integration/graphQlRequests/query/filter/oneHasManyRelation.test.js.map +1 -1
- package/dist/tests/cases/integration/graphQlRequests/query/graphqlFeatures/alias.test.js +9 -13
- package/dist/tests/cases/integration/graphQlRequests/query/graphqlFeatures/alias.test.js.map +1 -1
- package/dist/tests/cases/integration/graphQlRequests/query/unique/oneHasManyUnique.test.js +5 -3
- package/dist/tests/cases/integration/graphQlRequests/query/unique/oneHasManyUnique.test.js.map +1 -1
- package/dist/tests/cases/integration/graphQlRequests/update/manyHasManyInverse/delete.test.js +5 -5
- package/dist/tests/cases/integration/graphQlRequests/update/manyHasManyInverse/delete.test.js.map +1 -1
- package/dist/tests/cases/integration/graphQlRequests/update/manyHasManyOwning/delete.test.js +5 -5
- package/dist/tests/cases/integration/graphQlRequests/update/manyHasManyOwning/delete.test.js.map +1 -1
- package/dist/tests/cases/integration/graphQlRequests/update/manyHasOne/delete.test.js +10 -10
- package/dist/tests/cases/integration/graphQlRequests/update/manyHasOne/delete.test.js.map +1 -1
- package/dist/tests/cases/integration/graphQlRequests/update/oneHasMany/combination.test.js +5 -5
- package/dist/tests/cases/integration/graphQlRequests/update/oneHasMany/combination.test.js.map +1 -1
- package/dist/tests/cases/integration/graphQlRequests/update/oneHasMany/delete.test.js +5 -5
- package/dist/tests/cases/integration/graphQlRequests/update/oneHasMany/delete.test.js.map +1 -1
- package/dist/tests/cases/integration/graphQlRequests/update/oneHasOneInverse/delete.test.js +5 -5
- package/dist/tests/cases/integration/graphQlRequests/update/oneHasOneInverse/delete.test.js.map +1 -1
- package/dist/tests/cases/integration/graphQlSchema/graphQlSchemaBuilder.test.js +4 -4
- package/dist/tests/cases/integration/graphQlSchema/graphQlSchemaBuilder.test.js.map +1 -1
- package/dist/tests/cases/integration/graphQlSchema/model.js.map +1 -1
- package/dist/tests/cases/unit/conditionOptimizer.test.js +5 -0
- package/dist/tests/cases/unit/conditionOptimizer.test.js.map +1 -1
- package/dist/tests/cases/unit/permissionMerger.test.js +2 -0
- package/dist/tests/cases/unit/permissionMerger.test.js.map +1 -1
- package/dist/tests/cases/unit/predicatesFactory.test.js +7 -1
- package/dist/tests/cases/unit/predicatesFactory.test.js.map +1 -1
- package/dist/tests/cases/unit/predicatesInjector.test.js +105 -0
- package/dist/tests/cases/unit/predicatesInjector.test.js.map +1 -1
- package/dist/tests/cases/unit/whereBuilder.test.d.ts +2 -0
- package/dist/tests/cases/unit/whereBuilder.test.d.ts.map +1 -0
- package/dist/tests/cases/unit/whereBuilder.test.js +131 -0
- package/dist/tests/cases/unit/whereBuilder.test.js.map +1 -0
- package/dist/tests/cases/unit/whereOptimizer.test.js +187 -0
- package/dist/tests/cases/unit/whereOptimizer.test.js.map +1 -1
- package/dist/tests/src/test.js +2 -2
- package/dist/tests/src/test.js.map +1 -1
- package/dist/tests/src/testGraphql.d.ts.map +1 -1
- package/dist/tests/src/testGraphql.js +9 -5
- package/dist/tests/src/testGraphql.js.map +1 -1
- package/dist/tests/tsconfig.tsbuildinfo +1 -1
- package/package.json +13 -11
- package/src/acl/EvaluatedPredicateReplacer.ts +9 -15
- package/src/acl/PermissionFactory.ts +18 -13
- package/src/acl/PredicateFactory.ts +64 -40
- package/src/acl/PredicatesInjector.ts +18 -17
- package/src/extensions/hasManyToHasOneReducer/HasManyToHasOneReducerExecutionHandler.ts +21 -28
- package/src/extensions/hasManyToHasOneReducer/HasManyToHasOneRelationReducerVisitor.ts +1 -6
- package/src/extensions/paginatedHasMany/PaginatedHasManyCountVisitor.ts +10 -28
- package/src/extensions/paginatedHasMany/PaginatedHasManyExecutionHandler.ts +11 -8
- package/src/extensions/paginatedHasMany/PaginatedHasManyFieldProviderVisitor.ts +4 -22
- package/src/extensions/paginatedHasMany/PaginatedHasManyNodesVisitor.ts +10 -29
- package/src/input-validation/ColumnValueResolver.ts +2 -3
- package/src/input-validation/EntityRulesResolver.ts +4 -4
- package/src/input-validation/QueryAstFactory.ts +1 -1
- package/src/input-validation/ValidationDataSelector.ts +1 -1
- package/src/input-validation/preValidation/CreateInputPreValidationProcessor.ts +7 -8
- package/src/input-validation/preValidation/InputPreValidator.ts +4 -4
- package/src/input-validation/preValidation/UpdateInputPreValidationProcessor.ts +7 -8
- package/src/inputProcessing/CreateInputProcessor.ts +8 -9
- package/src/inputProcessing/CreateInputVisitor.ts +27 -89
- package/src/inputProcessing/UpdateInputProcessor.ts +8 -9
- package/src/inputProcessing/UpdateInputVisitor.ts +25 -71
- package/src/inputProcessing/index.ts +0 -1
- package/src/introspection/IntrospectionSchemaFactory.ts +7 -7
- package/src/mapper/ErrorUtils.ts +2 -2
- package/src/mapper/JunctionTableManager.ts +3 -3
- package/src/mapper/Mapper.ts +34 -31
- package/src/mapper/MapperContainer.ts +7 -5
- package/src/mapper/Result.ts +2 -4
- package/src/mapper/delete/DeleteExecutor.ts +6 -6
- package/src/mapper/insert/InsertBuilder.ts +2 -2
- package/src/mapper/insert/SqlCreateInputProcessor.ts +3 -3
- package/src/mapper/select/JoinVisitor.ts +6 -33
- package/src/mapper/select/Path.ts +4 -1
- package/src/mapper/select/RelationFetcher.ts +49 -50
- package/src/mapper/select/SelectBuilder.ts +71 -13
- package/src/mapper/select/SelectBuilderFactory.ts +2 -1
- package/src/mapper/select/SelectExecutionHandler.ts +16 -8
- package/src/mapper/select/SelectHydrator.ts +15 -11
- package/src/mapper/select/WhereBuilder.ts +168 -61
- package/src/mapper/select/handlers/FieldsVisitor.ts +80 -111
- package/src/mapper/select/handlers/FieldsVisitorFactory.ts +1 -0
- package/src/mapper/select/handlers/MetaHandler.ts +6 -17
- package/src/mapper/select/optimizer/ConditionOptimizer.ts +6 -0
- package/src/mapper/select/optimizer/WhereOptimizer.ts +148 -21
- package/src/mapper/select/optimizer/WhereReplacer.ts +39 -0
- package/src/mapper/select/optimizer/helpers.ts +7 -3
- package/src/mapper/update/SqlUpdateInputProcessor.ts +4 -10
- package/src/mapper/update/UpdateBuilder.ts +3 -3
- package/src/resolvers/ExecutionContainerFactory.ts +1 -1
- package/src/resolvers/GraphQlQueryAstFactory.ts +5 -4
- package/src/resolvers/MutationResolver.ts +14 -4
- package/src/resolvers/ReadHelpers.ts +3 -3
- package/src/resolvers/ReadResolver.ts +2 -2
- package/src/schema/EnumsProvider.ts +2 -4
- package/src/schema/FieldAccessVisitor.ts +2 -2
- package/src/schema/OrderByTypeProvider.ts +10 -3
- package/src/schema/WhereTypeProvider.ts +5 -6
- package/src/schema/entities/FieldArgsVisitor.ts +4 -5
- package/src/schema/entities/FieldTypeVisitor.ts +3 -3
- package/src/schema/mutations/CreateEntityInputFieldVisitor.ts +3 -6
- package/src/schema/mutations/CreateEntityRelationAllowedOperationsVisitor.ts +6 -20
- package/src/schema/mutations/CreateEntityRelationInputFieldVisitor.ts +6 -20
- package/src/schema/mutations/UpdateEntityInputFieldVisitor.ts +3 -6
- package/src/schema/mutations/UpdateEntityRelationAllowedOperationsVisitor.ts +6 -20
- package/src/schema/mutations/UpdateEntityRelationInputFieldVisitor.ts +9 -14
- package/src/schema/utils.ts +1 -1
- package/src/tsconfig.json +6 -6
- package/src/utils/object.ts +6 -6
- package/src/utils/uniqueWhereFields.ts +3 -3
- package/tests/cases/bugs/bug102.test.ts +6 -6
- package/tests/cases/integration/graphQlRequests/delete/aclDelete.test.ts +5 -5
- package/tests/cases/integration/graphQlRequests/delete/additionalDeleteFilter.test.ts +5 -5
- package/tests/cases/integration/graphQlRequests/delete/cascadeDelete.test.ts +5 -5
- package/tests/cases/integration/graphQlRequests/delete/deleteById.test.ts +5 -5
- package/tests/cases/integration/graphQlRequests/delete/orphanRemoval.test.ts +5 -5
- package/tests/cases/integration/graphQlRequests/delete/setNullOnDelete.test.ts +5 -5
- package/tests/cases/integration/graphQlRequests/query/acl/differentRowAndFieldPredicate.test.ts +54 -4
- package/tests/cases/integration/graphQlRequests/query/acl/fieldRestrictedByLocale.test.ts +26 -25
- package/tests/cases/integration/graphQlRequests/query/acl/nestedPredicate.test.ts +9 -6
- package/tests/cases/integration/graphQlRequests/query/acl/rowPredicateSubset.test.ts +104 -0
- package/tests/cases/integration/graphQlRequests/query/filter/manyHasManyOwnerRelation.test.ts +17 -15
- package/tests/cases/integration/graphQlRequests/query/filter/oneHasManyRelation.test.ts +4 -5
- package/tests/cases/integration/graphQlRequests/query/graphqlFeatures/alias.test.ts +9 -13
- package/tests/cases/integration/graphQlRequests/query/unique/oneHasManyUnique.test.ts +5 -3
- package/tests/cases/integration/graphQlRequests/update/manyHasManyInverse/delete.test.ts +5 -5
- package/tests/cases/integration/graphQlRequests/update/manyHasManyOwning/delete.test.ts +5 -5
- package/tests/cases/integration/graphQlRequests/update/manyHasOne/delete.test.ts +10 -10
- package/tests/cases/integration/graphQlRequests/update/oneHasMany/combination.test.ts +5 -5
- package/tests/cases/integration/graphQlRequests/update/oneHasMany/delete.test.ts +5 -5
- package/tests/cases/integration/graphQlRequests/update/oneHasOneInverse/delete.test.ts +5 -5
- package/tests/cases/integration/graphQlSchema/graphQlSchemaBuilder.test.ts +2 -3
- package/tests/cases/unit/conditionOptimizer.test.ts +6 -0
- package/tests/cases/unit/permissionMerger.test.ts +2 -0
- package/tests/cases/unit/predicatesFactory.test.ts +8 -2
- package/tests/cases/unit/predicatesInjector.test.ts +97 -2
- package/tests/cases/unit/whereBuilder.test.ts +148 -0
- package/tests/cases/unit/whereOptimizer.test.ts +215 -0
- package/tests/src/test.ts +2 -2
- package/tests/src/testGraphql.ts +9 -5
- package/dist/src/inputProcessing/InputContext.d.ts +0 -43
- package/dist/src/inputProcessing/InputContext.d.ts.map +0 -1
- package/dist/src/inputProcessing/InputContext.js +0 -3
- package/dist/src/inputProcessing/InputContext.js.map +0 -1
- package/src/inputProcessing/InputContext.ts +0 -49
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@contember/engine-content-api",
|
|
3
|
-
"version": "
|
|
3
|
+
"version": "1.2.0-beta.1",
|
|
4
4
|
"license": "Apache-2.0",
|
|
5
5
|
"main": "dist/src/index.js",
|
|
6
6
|
"typings": "dist/src/index.d.ts",
|
|
@@ -10,24 +10,26 @@
|
|
|
10
10
|
"test": "vitest --no-threads"
|
|
11
11
|
},
|
|
12
12
|
"dependencies": {
|
|
13
|
-
"@contember/database": "^
|
|
14
|
-
"@contember/dic": "^
|
|
15
|
-
"@contember/
|
|
16
|
-
"@contember/graphql-utils": "^
|
|
17
|
-
"@contember/schema": "^
|
|
18
|
-
"@contember/schema-
|
|
13
|
+
"@contember/database": "^1.2.0-beta.1",
|
|
14
|
+
"@contember/dic": "^1.2.0-beta.1",
|
|
15
|
+
"@contember/logger": "^1.2.0-beta.1",
|
|
16
|
+
"@contember/graphql-utils": "^1.2.0-beta.1",
|
|
17
|
+
"@contember/schema": "^1.2.0-beta.1",
|
|
18
|
+
"@contember/schema-definition": "^1.2.0-beta.1",
|
|
19
|
+
"@contember/schema-utils": "^1.2.0-beta.1",
|
|
19
20
|
"@graphql-tools/schema": "^8.3.5",
|
|
21
|
+
"fast-deep-equal": "^3.1.3",
|
|
20
22
|
"graphql-tag": "^2.12.5"
|
|
21
23
|
},
|
|
22
24
|
"devDependencies": {
|
|
23
|
-
"@contember/database-tester": "^
|
|
24
|
-
"@contember/engine-api-tester": "^
|
|
25
|
-
"@contember/schema-definition": "^
|
|
25
|
+
"@contember/database-tester": "^1.2.0-beta.1",
|
|
26
|
+
"@contember/engine-api-tester": "^1.2.0-beta.1",
|
|
27
|
+
"@contember/schema-definition": "^1.2.0-beta.1",
|
|
26
28
|
"@graphql-codegen/cli": "^2.6.2",
|
|
27
29
|
"@graphql-codegen/typescript": "^2.5.1",
|
|
28
30
|
"@graphql-codegen/typescript-operations": "^2.4.2",
|
|
29
31
|
"@graphql-codegen/typescript-resolvers": "^2.6.6",
|
|
30
|
-
"@types/node": "^
|
|
32
|
+
"@types/node": "^18",
|
|
31
33
|
"graphql": "^16.5.0",
|
|
32
34
|
"pg": "^8.5.0"
|
|
33
35
|
},
|
|
@@ -1,32 +1,25 @@
|
|
|
1
1
|
import { Input, Model, Writable } from '@contember/schema'
|
|
2
|
-
import
|
|
2
|
+
import { replaceWhere } from '../mapper/select/optimizer/WhereReplacer'
|
|
3
3
|
|
|
4
4
|
export class EvaluatedPredicateReplacer {
|
|
5
5
|
constructor(
|
|
6
|
-
private readonly evaluatedPredicate: Input.
|
|
6
|
+
private readonly evaluatedPredicate: Input.OptionalWhere,
|
|
7
7
|
private readonly sourceEntity: Model.Entity,
|
|
8
8
|
private readonly relation: Model.AnyRelation,
|
|
9
9
|
) {
|
|
10
10
|
}
|
|
11
11
|
|
|
12
|
-
public replace(where: Input.
|
|
13
|
-
|
|
14
|
-
}
|
|
15
|
-
|
|
16
|
-
private replaceInternal(where: Input.Where, onRelation: boolean): Input.Where {
|
|
17
|
-
if (onRelation && deepEqual(where, this.evaluatedPredicate)) {
|
|
18
|
-
return { [this.sourceEntity.primary]: { always: true } }
|
|
19
|
-
}
|
|
20
|
-
const result: Writable<Input.Where> = {}
|
|
12
|
+
public replace(where: Input.OptionalWhere): Input.OptionalWhere {
|
|
13
|
+
const result: Writable<Input.OptionalWhere> = {}
|
|
21
14
|
for (const [key, value] of Object.entries(where)) {
|
|
22
15
|
if (key === 'not') {
|
|
23
|
-
result['not'] = this.
|
|
16
|
+
result['not'] = this.replace(value as Input.OptionalWhere)
|
|
24
17
|
|
|
25
18
|
} else if (key === 'and' || key === 'or') {
|
|
26
|
-
result[key] = (value as Input.Where[]).map(it => this.
|
|
19
|
+
result[key] = (value as Input.Where[]).map(it => this.replace(it))
|
|
27
20
|
|
|
28
|
-
} else if (key === this.relation.name
|
|
29
|
-
result[key] =
|
|
21
|
+
} else if (key === this.relation.name) {
|
|
22
|
+
result[key] = replaceWhere(value as Input.Where, this.evaluatedPredicate, { [this.sourceEntity.primary]: { always: true } })
|
|
30
23
|
|
|
31
24
|
} else {
|
|
32
25
|
result[key] = value
|
|
@@ -35,4 +28,5 @@ export class EvaluatedPredicateReplacer {
|
|
|
35
28
|
}
|
|
36
29
|
return result
|
|
37
30
|
}
|
|
31
|
+
|
|
38
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):
|
|
49
|
-
|
|
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
|
|
52
|
-
const
|
|
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
|
-
|
|
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
|
-
|
|
78
|
+
entityPredicates,
|
|
78
79
|
idPermissions,
|
|
79
|
-
|
|
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
|
-
|
|
87
|
+
entityPredicates[predicate] = predicateDefinition
|
|
87
88
|
}
|
|
88
89
|
fieldPermissions[entity.primary] = idPermissions
|
|
89
|
-
entityPredicates[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,11 +1,14 @@
|
|
|
1
1
|
import { Acl, Input, Model } from '@contember/schema'
|
|
2
2
|
import { VariableInjector } from './VariableInjector'
|
|
3
|
-
import { isOwningRelation } from '@contember/schema-utils'
|
|
4
|
-
import { ImplementationException } from '../exception'
|
|
5
3
|
import { EvaluatedPredicateReplacer } from './EvaluatedPredicateReplacer'
|
|
6
4
|
|
|
7
5
|
const getRowLevelPredicatePseudoField = (entity: Model.Entity) => entity.primary
|
|
8
6
|
|
|
7
|
+
export interface FieldRequiredPredicate {
|
|
8
|
+
predicate: Acl.Predicate
|
|
9
|
+
isSameAsPrimary: boolean
|
|
10
|
+
}
|
|
11
|
+
|
|
9
12
|
export class PredicateFactory {
|
|
10
13
|
constructor(
|
|
11
14
|
private readonly permissions: Acl.Permissions,
|
|
@@ -13,6 +16,24 @@ export class PredicateFactory {
|
|
|
13
16
|
private readonly variableInjector: VariableInjector,
|
|
14
17
|
) {}
|
|
15
18
|
|
|
19
|
+
public getFieldPredicate(
|
|
20
|
+
entity: Model.Entity,
|
|
21
|
+
operation: Acl.Operation.update | Acl.Operation.read | Acl.Operation.create,
|
|
22
|
+
fieldName: string,
|
|
23
|
+
): FieldRequiredPredicate {
|
|
24
|
+
const permissions = this.permissions[entity.name]?.operations?.[operation]
|
|
25
|
+
const predicate = permissions?.[fieldName] ?? false
|
|
26
|
+
const rowLevelField = getRowLevelPredicatePseudoField(entity)
|
|
27
|
+
|
|
28
|
+
const primaryPredicate = permissions?.[rowLevelField] ?? false
|
|
29
|
+
const isSameAsPrimary = predicate === primaryPredicate
|
|
30
|
+
|
|
31
|
+
return {
|
|
32
|
+
isSameAsPrimary,
|
|
33
|
+
predicate,
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
|
|
16
37
|
public shouldApplyCellLevelPredicate(
|
|
17
38
|
entity: Model.Entity,
|
|
18
39
|
operation: Acl.Operation.read,
|
|
@@ -23,14 +44,28 @@ export class PredicateFactory {
|
|
|
23
44
|
return permissions?.[fieldName] !== permissions?.[rowLevelField]
|
|
24
45
|
}
|
|
25
46
|
|
|
26
|
-
public
|
|
47
|
+
public createDeletePredicate(entity: Model.Entity) {
|
|
48
|
+
const neverCondition: Input.Where = { [entity.primary]: { never: true } }
|
|
49
|
+
const entityPermissions = this.permissions[entity.name]
|
|
50
|
+
if (!entityPermissions) {
|
|
51
|
+
return neverCondition
|
|
52
|
+
}
|
|
53
|
+
const deletePredicate = entityPermissions.operations.delete
|
|
54
|
+
if (deletePredicate === undefined || deletePredicate === false) {
|
|
55
|
+
return neverCondition
|
|
56
|
+
}
|
|
57
|
+
if (deletePredicate === true) {
|
|
58
|
+
return {}
|
|
59
|
+
}
|
|
60
|
+
return this.buildPredicates(entity, [deletePredicate])
|
|
61
|
+
}
|
|
62
|
+
|
|
27
63
|
public create(
|
|
28
64
|
entity: Model.Entity,
|
|
29
65
|
operation: Acl.Operation.update | Acl.Operation.read | Acl.Operation.create,
|
|
30
|
-
fieldNames
|
|
31
|
-
|
|
32
|
-
): Input.
|
|
33
|
-
public create(entity: Model.Entity, operation: Acl.Operation, fieldNames?: string[], overRelation?: Model.AnyRelation): Input.Where {
|
|
66
|
+
fieldNames: string[] = [getRowLevelPredicatePseudoField(entity)],
|
|
67
|
+
relationContext?: Model.AnyRelationContext,
|
|
68
|
+
): Input.OptionalWhere {
|
|
34
69
|
const entityPermissions: Acl.EntityPermissions = this.permissions[entity.name]
|
|
35
70
|
const neverCondition: Input.Where = { [entity.primary]: { never: true } }
|
|
36
71
|
|
|
@@ -38,31 +73,24 @@ export class PredicateFactory {
|
|
|
38
73
|
return neverCondition
|
|
39
74
|
}
|
|
40
75
|
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
} else {
|
|
52
|
-
if (fieldNames === undefined) {
|
|
53
|
-
fieldNames = [getRowLevelPredicatePseudoField(entity)]
|
|
54
|
-
}
|
|
55
|
-
const fieldPermissions = entityPermissions.operations[operation]
|
|
56
|
-
if (fieldPermissions === undefined) {
|
|
57
|
-
return neverCondition
|
|
58
|
-
}
|
|
59
|
-
const operationPredicates = this.getRequiredPredicates(fieldNames, fieldPermissions)
|
|
60
|
-
if (operationPredicates === false) {
|
|
61
|
-
return neverCondition
|
|
62
|
-
}
|
|
63
|
-
predicates = operationPredicates
|
|
76
|
+
if (fieldNames === undefined) {
|
|
77
|
+
fieldNames = [getRowLevelPredicatePseudoField(entity)]
|
|
78
|
+
}
|
|
79
|
+
const fieldPermissions = entityPermissions.operations[operation]
|
|
80
|
+
if (fieldPermissions === undefined) {
|
|
81
|
+
return neverCondition
|
|
82
|
+
}
|
|
83
|
+
const operationPredicates = this.getRequiredPredicates(fieldNames, fieldPermissions)
|
|
84
|
+
if (operationPredicates === false) {
|
|
85
|
+
return neverCondition
|
|
64
86
|
}
|
|
65
87
|
|
|
88
|
+
return this.buildPredicates(entity, operationPredicates, relationContext)
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
public buildPredicates(entity: Model.Entity, predicates: Acl.PredicateReference[], relationContext?: Model.AnyRelationContext): Input.OptionalWhere {
|
|
92
|
+
const entityPermissions: Acl.EntityPermissions = this.permissions[entity.name] ?? {}
|
|
93
|
+
|
|
66
94
|
const predicatesWhere: Input.Where[] = predicates.reduce(
|
|
67
95
|
(result: Input.Where[], name: Acl.PredicateReference): Input.Where[] => {
|
|
68
96
|
if (!entityPermissions.predicates[name]) {
|
|
@@ -77,7 +105,8 @@ export class PredicateFactory {
|
|
|
77
105
|
return {}
|
|
78
106
|
}
|
|
79
107
|
const where: Input.Where = predicatesWhere.length === 1 ? predicatesWhere[0] : { and: predicatesWhere }
|
|
80
|
-
return this.optimizePredicates(where,
|
|
108
|
+
return this.optimizePredicates(where, relationContext)
|
|
109
|
+
|
|
81
110
|
}
|
|
82
111
|
|
|
83
112
|
private getRequiredPredicates(
|
|
@@ -100,21 +129,16 @@ export class PredicateFactory {
|
|
|
100
129
|
return predicates
|
|
101
130
|
}
|
|
102
131
|
|
|
103
|
-
|
|
104
|
-
if (!
|
|
132
|
+
public optimizePredicates(where: Input.OptionalWhere, relationContext?: Model.AnyRelationContext) {
|
|
133
|
+
if (!relationContext || !relationContext.targetRelation) {
|
|
105
134
|
return where
|
|
106
135
|
}
|
|
107
|
-
const
|
|
108
|
-
if (!otherSide) {
|
|
109
|
-
throw new ImplementationException()
|
|
110
|
-
}
|
|
111
|
-
const sourceEntity = this.model.entities[overRelation.target]
|
|
112
|
-
const sourcePredicate = this.create(sourceEntity, Acl.Operation.read, [otherSide])
|
|
136
|
+
const sourcePredicate = this.create(relationContext.entity, Acl.Operation.read, [relationContext.relation.name])
|
|
113
137
|
if (Object.keys(sourcePredicate).length === 0) {
|
|
114
138
|
return where
|
|
115
139
|
}
|
|
116
140
|
|
|
117
|
-
const replacer = new EvaluatedPredicateReplacer(sourcePredicate,
|
|
141
|
+
const replacer = new EvaluatedPredicateReplacer(sourcePredicate, relationContext.entity, relationContext.targetRelation)
|
|
118
142
|
return replacer.replace(where)
|
|
119
143
|
}
|
|
120
144
|
}
|
|
@@ -5,18 +5,19 @@ 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,
|
|
8
|
+
public inject(entity: Model.Entity, where: Input.OptionalWhere, relationContext?: Model.AnyRelationContext): Input.OptionalWhere {
|
|
9
9
|
const restrictedWhere = this.injectToWhere(where, entity, true)
|
|
10
|
-
return this.createWhere(entity, undefined, restrictedWhere,
|
|
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
|
-
|
|
17
|
+
relationContext?: Model.AnyRelationContext,
|
|
18
18
|
): Input.OptionalWhere {
|
|
19
|
-
const predicatesWhere
|
|
19
|
+
const predicatesWhere = this.predicateFactory.create(entity, Acl.Operation.read, fieldNames, relationContext)
|
|
20
|
+
where = this.predicateFactory.optimizePredicates(where, relationContext)
|
|
20
21
|
|
|
21
22
|
const and = [where, predicatesWhere].filter(it => Object.keys(it).length > 0)
|
|
22
23
|
if (and.length === 0) {
|
|
@@ -28,16 +29,21 @@ export class PredicatesInjector {
|
|
|
28
29
|
return { and: and }
|
|
29
30
|
}
|
|
30
31
|
|
|
31
|
-
private injectToWhere(
|
|
32
|
+
private injectToWhere(
|
|
33
|
+
where: Input.OptionalWhere,
|
|
34
|
+
entity: Model.Entity,
|
|
35
|
+
isRoot: boolean,
|
|
36
|
+
relationContext?: Model.AnyRelationContext,
|
|
37
|
+
): Input.OptionalWhere {
|
|
32
38
|
const resultWhere: Writable<Input.OptionalWhere> = {}
|
|
33
39
|
if (where.and) {
|
|
34
|
-
resultWhere.and = where.and.filter((it): it is Input.Where => !!it).map(it => this.injectToWhere(it, entity, isRoot))
|
|
40
|
+
resultWhere.and = where.and.filter((it): it is Input.Where => !!it).map(it => this.injectToWhere(it, entity, isRoot, relationContext))
|
|
35
41
|
}
|
|
36
42
|
if (where.or) {
|
|
37
|
-
resultWhere.or = where.or.filter((it): it is Input.Where => !!it).map(it => this.injectToWhere(it, entity, isRoot))
|
|
43
|
+
resultWhere.or = where.or.filter((it): it is Input.Where => !!it).map(it => this.injectToWhere(it, entity, isRoot, relationContext))
|
|
38
44
|
}
|
|
39
45
|
if (where.not) {
|
|
40
|
-
resultWhere.not = this.injectToWhere(where.not, entity, isRoot)
|
|
46
|
+
resultWhere.not = this.injectToWhere(where.not, entity, isRoot, relationContext)
|
|
41
47
|
}
|
|
42
48
|
|
|
43
49
|
const fields = Object.keys(where).filter(it => !['and', 'or', 'not'].includes(it))
|
|
@@ -46,21 +52,16 @@ export class PredicatesInjector {
|
|
|
46
52
|
return resultWhere
|
|
47
53
|
}
|
|
48
54
|
for (let field of fields) {
|
|
49
|
-
|
|
50
|
-
visitColumn: () =>
|
|
51
|
-
visitRelation: (
|
|
55
|
+
resultWhere[field] = acceptFieldVisitor(this.schema, entity, field, {
|
|
56
|
+
visitColumn: () => where[field],
|
|
57
|
+
visitRelation: context => this.injectToWhere(where[field] as Input.Where, context.targetEntity, false, context),
|
|
52
58
|
})
|
|
53
|
-
if (targetEntity) {
|
|
54
|
-
resultWhere[field] = this.injectToWhere(where[field] as Input.Where, targetEntity, false)
|
|
55
|
-
} else {
|
|
56
|
-
resultWhere[field] = where[field]
|
|
57
|
-
}
|
|
58
59
|
}
|
|
59
60
|
const fieldsForPredicate = !isRoot
|
|
60
61
|
? fields
|
|
61
62
|
: fields.filter(it => this.predicateFactory.shouldApplyCellLevelPredicate(entity, Acl.Operation.read, it))
|
|
62
63
|
|
|
63
|
-
return this.createWhere(entity, fieldsForPredicate, resultWhere)
|
|
64
|
+
return this.createWhere(entity, fieldsForPredicate, resultWhere, relationContext)
|
|
64
65
|
}
|
|
65
66
|
|
|
66
67
|
}
|
|
@@ -15,10 +15,22 @@ export class HasManyToHasOneReducerExecutionHandler implements SelectExecutionHa
|
|
|
15
15
|
if (!objectNode) {
|
|
16
16
|
throw new Error()
|
|
17
17
|
}
|
|
18
|
-
addData(
|
|
19
|
-
entity.primary,
|
|
20
|
-
async (ids: Input.PrimaryValue[]) => {
|
|
21
|
-
|
|
18
|
+
addData({
|
|
19
|
+
field: entity.primary,
|
|
20
|
+
dataProvider: async (ids: Input.PrimaryValue[]) => {
|
|
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.
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
}
|
|
39
|
-
|
|
40
|
-
private getRelationTarget(
|
|
41
|
-
entity: Model.Entity,
|
|
42
|
-
relationName: string,
|
|
43
|
-
): [Model.Entity, Model.AnyRelation & 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.AnyRelation & 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]
|
|
46
|
+
return context.mapper.selectAssoc(targetEntity, newObjectNode, [
|
|
47
|
+
...context.relationPath,
|
|
48
|
+
relationContext,
|
|
49
|
+
], targetRelation.name)
|
|
58
50
|
},
|
|
51
|
+
defaultValue: null,
|
|
59
52
|
})
|
|
60
53
|
}
|
|
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
|
}
|
|
@@ -11,58 +11,40 @@ 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
19
|
{
|
|
24
20
|
mapper: this.mapper,
|
|
25
21
|
filter: this.objectNode.args.filter,
|
|
26
|
-
|
|
27
|
-
|
|
22
|
+
relationContext,
|
|
23
|
+
relationPath: this.relationPath,
|
|
28
24
|
ids: this.ids,
|
|
29
25
|
},
|
|
30
26
|
)
|
|
31
27
|
}
|
|
32
28
|
|
|
33
|
-
async visitManyHasManyOwning(
|
|
34
|
-
entity: Model.Entity,
|
|
35
|
-
relation: Model.ManyHasManyOwningRelation,
|
|
36
|
-
targetEntity: Model.Entity,
|
|
37
|
-
targetRelation: Model.ManyHasManyInverseRelation | null,
|
|
38
|
-
): Promise<GroupedCounts> {
|
|
29
|
+
async visitManyHasManyOwning(relationContext: Model.ManyHasManyOwningContext): Promise<GroupedCounts> {
|
|
39
30
|
return await this.relationFetcher.countManyHasManyGroups(
|
|
40
31
|
{
|
|
41
32
|
mapper: this.mapper,
|
|
42
33
|
filter: this.objectNode.args.filter,
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
targetRelation,
|
|
46
|
-
directionFrom: 'owning',
|
|
34
|
+
relationContext,
|
|
35
|
+
relationPath: this.relationPath,
|
|
47
36
|
ids: this.ids,
|
|
48
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> {
|
|
41
|
+
async visitManyHasManyInverse(relationContext: Model.ManyHasManyInverseContext): Promise<GroupedCounts> {
|
|
58
42
|
return await this.relationFetcher.countManyHasManyGroups(
|
|
59
43
|
{
|
|
60
44
|
mapper: this.mapper,
|
|
61
45
|
filter: this.objectNode.args.filter,
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
targetRelation,
|
|
65
|
-
directionFrom: 'inverse',
|
|
46
|
+
relationContext,
|
|
47
|
+
relationPath: this.relationPath,
|
|
66
48
|
ids: this.ids,
|
|
67
49
|
},
|
|
68
50
|
)
|
|
@@ -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(
|
|
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>,
|
|
@@ -17,15 +20,15 @@ export class PaginatedHasManyExecutionHandler implements SelectExecutionHandler<
|
|
|
17
20
|
throw new Error()
|
|
18
21
|
}
|
|
19
22
|
const pagination = createPaginationHelper(objectNode)
|
|
20
|
-
addData(
|
|
21
|
-
context.entity.primary,
|
|
22
|
-
async ids => {
|
|
23
|
+
addData({
|
|
24
|
+
field: context.entity.primary,
|
|
25
|
+
dataProvider: async ids => {
|
|
23
26
|
const counts = pagination.requiresTotalCount
|
|
24
27
|
? await acceptFieldVisitor(
|
|
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>()
|
|
@@ -43,7 +46,7 @@ export class PaginatedHasManyExecutionHandler implements SelectExecutionHandler<
|
|
|
43
46
|
}
|
|
44
47
|
return Object.fromEntries(result)
|
|
45
48
|
},
|
|
46
|
-
pagination.createResponse(0, []),
|
|
47
|
-
)
|
|
49
|
+
defaultValue: pagination.createResponse(0, []),
|
|
50
|
+
})
|
|
48
51
|
}
|
|
49
52
|
}
|
|
@@ -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),
|