@contember/engine-content-api 1.2.0-alpha.1 → 1.2.0-alpha.12
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 +9 -0
- package/dist/src/acl/EvaluatedPredicateReplacer.d.ts.map +1 -0
- package/dist/src/acl/EvaluatedPredicateReplacer.js +31 -0
- package/dist/src/acl/EvaluatedPredicateReplacer.js.map +1 -0
- 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 +4 -2
- package/dist/src/acl/PredicateFactory.d.ts.map +1 -1
- package/dist/src/acl/PredicateFactory.js +17 -6
- 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 +16 -19
- package/dist/src/acl/PredicatesInjector.js.map +1 -1
- package/dist/src/acl/VariableInjector.d.ts +0 -1
- package/dist/src/acl/VariableInjector.d.ts.map +1 -1
- package/dist/src/acl/VariableInjector.js +4 -14
- package/dist/src/acl/VariableInjector.js.map +1 -1
- package/dist/src/acl/VariableUtils.d.ts +2 -13
- package/dist/src/acl/VariableUtils.d.ts.map +1 -1
- package/dist/src/acl/VariableUtils.js +5 -16
- package/dist/src/acl/VariableUtils.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 +14 -15
- 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 +29 -20
- 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 +2 -2
- 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 +29 -20
- 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 +7 -7
- 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/ValidationContext.d.ts +2 -2
- package/dist/src/input-validation/ValidationContext.d.ts.map +1 -1
- package/dist/src/input-validation/ValidationContext.js.map +1 -1
- package/dist/src/input-validation/ValidationDataSelector.d.ts.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/introspection/content-schema.types.d.ts +19 -223
- package/dist/src/introspection/content-schema.types.d.ts.map +1 -1
- package/dist/src/introspection/content-schema.types.js +2 -2
- package/dist/src/introspection/content-schema.types.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 +28 -23
- 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 +7 -4
- package/dist/src/mapper/MapperContainer.js.map +1 -1
- package/dist/src/mapper/delete/DeleteExecutor.js +3 -3
- package/dist/src/mapper/delete/DeleteExecutor.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/RelationFetcher.d.ts +32 -5
- package/dist/src/mapper/select/RelationFetcher.d.ts.map +1 -1
- package/dist/src/mapper/select/RelationFetcher.js +37 -15
- package/dist/src/mapper/select/RelationFetcher.js.map +1 -1
- package/dist/src/mapper/select/SelectBuilder.d.ts +2 -1
- package/dist/src/mapper/select/SelectBuilder.d.ts.map +1 -1
- package/dist/src/mapper/select/SelectBuilder.js +4 -2
- 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 +1 -0
- package/dist/src/mapper/select/SelectExecutionHandler.d.ts.map +1 -1
- package/dist/src/mapper/select/WhereBuilder.d.ts +8 -3
- package/dist/src/mapper/select/WhereBuilder.d.ts.map +1 -1
- package/dist/src/mapper/select/WhereBuilder.js +71 -25
- package/dist/src/mapper/select/WhereBuilder.js.map +1 -1
- package/dist/src/mapper/select/handlers/FieldsVisitor.d.ts +9 -8
- package/dist/src/mapper/select/handlers/FieldsVisitor.d.ts.map +1 -1
- package/dist/src/mapper/select/handlers/FieldsVisitor.js +45 -24
- 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/optimizer/ConditionOptimizer.d.ts +5 -0
- package/dist/src/mapper/select/optimizer/ConditionOptimizer.d.ts.map +1 -0
- package/dist/src/mapper/select/optimizer/ConditionOptimizer.js +39 -0
- package/dist/src/mapper/select/optimizer/ConditionOptimizer.js.map +1 -0
- package/dist/src/mapper/select/optimizer/WhereOptimizer.d.ts +15 -0
- package/dist/src/mapper/select/optimizer/WhereOptimizer.d.ts.map +1 -0
- package/dist/src/mapper/select/optimizer/WhereOptimizer.js +118 -0
- package/dist/src/mapper/select/optimizer/WhereOptimizer.js.map +1 -0
- package/dist/src/mapper/select/optimizer/WhereReplacer.d.ts +6 -0
- package/dist/src/mapper/select/optimizer/WhereReplacer.d.ts.map +1 -0
- package/dist/src/mapper/select/optimizer/WhereReplacer.js +28 -0
- package/dist/src/mapper/select/optimizer/WhereReplacer.js.map +1 -0
- package/dist/src/mapper/select/optimizer/helpers.d.ts +10 -0
- package/dist/src/mapper/select/optimizer/helpers.d.ts.map +1 -0
- package/dist/src/mapper/select/optimizer/helpers.js +72 -0
- package/dist/src/mapper/select/optimizer/helpers.js.map +1 -0
- 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.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/GraphQlQueryAstFactory.js +2 -2
- package/dist/src/resolvers/GraphQlQueryAstFactory.js.map +1 -1
- package/dist/src/resolvers/MutationResolver.js +15 -15
- package/dist/src/resolvers/MutationResolver.js.map +1 -1
- package/dist/src/resolvers/ReadHelpers.js +10 -10
- 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/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/MutationProvider.js +4 -4
- package/dist/src/schema/MutationProvider.js.map +1 -1
- package/dist/src/schema/OrderByTypeProvider.js +1 -1
- package/dist/src/schema/OrderByTypeProvider.js.map +1 -1
- package/dist/src/schema/QueryProvider.js +3 -3
- package/dist/src/schema/QueryProvider.js.map +1 -1
- package/dist/src/schema/ResultSchemaTypeProvider.d.ts +2 -2
- package/dist/src/schema/ResultSchemaTypeProvider.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 +7 -7
- 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/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/integration/graphQlDb/insert/insertSequence.test.d.ts +2 -0
- package/dist/tests/cases/integration/graphQlDb/insert/insertSequence.test.d.ts.map +1 -0
- package/dist/tests/cases/integration/graphQlDb/insert/insertSequence.test.js +38 -0
- package/dist/tests/cases/integration/graphQlDb/insert/insertSequence.test.js.map +1 -0
- package/dist/tests/cases/integration/graphQlRequests/delete/aclDelete.test.js +1 -1
- package/dist/tests/cases/integration/graphQlRequests/delete/aclDelete.test.js.map +1 -1
- package/dist/tests/cases/integration/graphQlRequests/insert/acl/setField.test.js +2 -2
- package/dist/tests/cases/integration/graphQlRequests/insert/acl/setField.test.js.map +1 -1
- package/dist/tests/cases/integration/graphQlRequests/insert/aclInsert.test.js +1 -1
- package/dist/tests/cases/integration/graphQlRequests/insert/aclInsert.test.js.map +1 -1
- package/dist/tests/cases/integration/graphQlRequests/query/acl/fieldRestrictedByLocale.test.js +7 -6
- 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 +1 -1
- package/dist/tests/cases/integration/graphQlRequests/query/acl/nestedPredicate.test.js.map +1 -1
- package/dist/tests/cases/integration/graphQlRequests/query/acl/predicateElimination.test.d.ts +2 -0
- package/dist/tests/cases/integration/graphQlRequests/query/acl/predicateElimination.test.d.ts.map +1 -0
- package/dist/tests/cases/integration/graphQlRequests/query/acl/predicateElimination.test.js +137 -0
- package/dist/tests/cases/integration/graphQlRequests/query/acl/predicateElimination.test.js.map +1 -0
- package/dist/tests/cases/integration/graphQlRequests/query/filter/complexCondition.test.js +1 -1
- package/dist/tests/cases/integration/graphQlRequests/query/filter/composedFilter.test.js +1 -1
- package/dist/tests/cases/integration/graphQlRequests/query/filter/composedFilter.test.js.map +1 -1
- package/dist/tests/cases/integration/graphQlRequests/query/relations/manyHasManyInverse.test.js +73 -0
- package/dist/tests/cases/integration/graphQlRequests/query/relations/manyHasManyInverse.test.js.map +1 -1
- package/dist/tests/cases/integration/graphQlRequests/query/relations/manyHasManyOwning.test.js +73 -0
- package/dist/tests/cases/integration/graphQlRequests/query/relations/manyHasManyOwning.test.js.map +1 -1
- package/dist/tests/cases/integration/graphQlRequests/update/acl/aclUpdate.test.js +6 -6
- package/dist/tests/cases/integration/graphQlRequests/update/acl/aclUpdate.test.js.map +1 -1
- package/dist/tests/cases/integration/graphQlSchema/graphQlSchemaBuilder.test.js +6 -3
- 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/aclVariablesFactory.test.js +7 -33
- package/dist/tests/cases/unit/aclVariablesFactory.test.js.map +1 -1
- package/dist/tests/cases/unit/conditionOptimizer.test.d.ts +2 -0
- package/dist/tests/cases/unit/conditionOptimizer.test.d.ts.map +1 -0
- package/dist/tests/cases/unit/conditionOptimizer.test.js +118 -0
- package/dist/tests/cases/unit/conditionOptimizer.test.js.map +1 -0
- package/dist/tests/cases/unit/orderbyHelper.test.js +1 -0
- package/dist/tests/cases/unit/orderbyHelper.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.d.ts +2 -0
- package/dist/tests/cases/unit/predicatesFactory.test.d.ts.map +1 -0
- package/dist/tests/cases/unit/predicatesFactory.test.js +109 -0
- package/dist/tests/cases/unit/predicatesFactory.test.js.map +1 -0
- package/dist/tests/cases/unit/predicatesInjector.test.js +88 -14
- package/dist/tests/cases/unit/predicatesInjector.test.js.map +1 -1
- package/dist/tests/cases/unit/variableInjector.test.js +4 -3
- package/dist/tests/cases/unit/variableInjector.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 +75 -0
- package/dist/tests/cases/unit/whereBuilder.test.js.map +1 -0
- package/dist/tests/cases/unit/whereOptimizer.test.d.ts +2 -0
- package/dist/tests/cases/unit/whereOptimizer.test.d.ts.map +1 -0
- package/dist/tests/cases/unit/whereOptimizer.test.js +265 -0
- package/dist/tests/cases/unit/whereOptimizer.test.js.map +1 -0
- package/dist/tests/src/testGraphql.d.ts.map +1 -1
- package/dist/tests/src/testGraphql.js +10 -2
- package/dist/tests/src/testGraphql.js.map +1 -1
- package/dist/tests/tsconfig.tsbuildinfo +1 -1
- package/graphql.codegen.yml +0 -3
- package/package.json +16 -16
- package/src/acl/EvaluatedPredicateReplacer.ts +32 -0
- package/src/acl/PermissionFactory.ts +18 -13
- package/src/acl/PredicateFactory.ts +32 -8
- package/src/acl/PredicatesInjector.ts +25 -17
- package/src/acl/VariableInjector.ts +2 -15
- package/src/acl/VariableUtils.ts +7 -23
- package/src/extensions/hasManyToHasOneReducer/HasManyToHasOneReducerExecutionHandler.ts +17 -24
- package/src/extensions/hasManyToHasOneReducer/HasManyToHasOneRelationReducerVisitor.ts +1 -6
- package/src/extensions/paginatedHasMany/PaginatedHasManyCountVisitor.ts +26 -46
- package/src/extensions/paginatedHasMany/PaginatedHasManyExecutionHandler.ts +6 -3
- package/src/extensions/paginatedHasMany/PaginatedHasManyFieldProviderVisitor.ts +4 -22
- package/src/extensions/paginatedHasMany/PaginatedHasManyNodesVisitor.ts +26 -49
- package/src/input-validation/ColumnValueResolver.ts +2 -3
- package/src/input-validation/EntityRulesResolver.ts +7 -7
- package/src/input-validation/QueryAstFactory.ts +1 -1
- package/src/input-validation/ValidationContext.ts +2 -2
- package/src/input-validation/ValidationDataSelector.ts +2 -2
- 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/introspection/content-schema.types.ts +19 -286
- package/src/mapper/Mapper.ts +37 -30
- package/src/mapper/MapperContainer.ts +10 -5
- package/src/mapper/delete/DeleteExecutor.ts +3 -3
- package/src/mapper/insert/SqlCreateInputProcessor.ts +3 -3
- package/src/mapper/select/JoinVisitor.ts +6 -33
- package/src/mapper/select/RelationFetcher.ts +101 -41
- package/src/mapper/select/SelectBuilder.ts +3 -1
- package/src/mapper/select/SelectBuilderFactory.ts +2 -1
- package/src/mapper/select/SelectExecutionHandler.ts +1 -0
- package/src/mapper/select/WhereBuilder.ts +95 -34
- package/src/mapper/select/handlers/FieldsVisitor.ts +47 -57
- package/src/mapper/select/handlers/FieldsVisitorFactory.ts +1 -0
- package/src/mapper/select/optimizer/ConditionOptimizer.ts +41 -0
- package/src/mapper/select/optimizer/WhereOptimizer.ts +138 -0
- package/src/mapper/select/optimizer/WhereReplacer.ts +27 -0
- package/src/mapper/select/optimizer/helpers.ts +58 -0
- package/src/mapper/update/SqlUpdateInputProcessor.ts +1 -1
- package/src/mapper/update/UpdateBuilder.ts +3 -3
- package/src/resolvers/GraphQlQueryAstFactory.ts +3 -3
- package/src/resolvers/MutationResolver.ts +1 -1
- package/src/resolvers/ReadHelpers.ts +3 -3
- package/src/resolvers/ReadResolver.ts +2 -2
- package/src/schema/FieldAccessVisitor.ts +2 -2
- package/src/schema/OrderByTypeProvider.ts +1 -1
- package/src/schema/WhereTypeProvider.ts +4 -4
- package/src/schema/entities/FieldArgsVisitor.ts +3 -3
- 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 +5 -18
- package/src/schema/mutations/UpdateEntityInputFieldVisitor.ts +3 -6
- package/src/schema/mutations/UpdateEntityRelationAllowedOperationsVisitor.ts +6 -20
- package/src/schema/mutations/UpdateEntityRelationInputFieldVisitor.ts +2 -12
- package/src/utils/object.ts +6 -6
- package/src/utils/uniqueWhereFields.ts +3 -3
- package/tests/cases/integration/graphQlDb/insert/insertSequence.test.ts +34 -0
- package/tests/cases/integration/graphQlRequests/delete/aclDelete.test.ts +2 -2
- package/tests/cases/integration/graphQlRequests/insert/acl/setField.test.ts +3 -3
- package/tests/cases/integration/graphQlRequests/insert/aclInsert.test.ts +2 -2
- package/tests/cases/integration/graphQlRequests/query/acl/fieldRestrictedByLocale.test.ts +7 -6
- package/tests/cases/integration/graphQlRequests/query/acl/nestedPredicate.test.ts +1 -1
- package/tests/cases/integration/graphQlRequests/query/acl/predicateElimination.test.ts +130 -0
- package/tests/cases/integration/graphQlRequests/query/filter/complexCondition.test.ts +1 -1
- package/tests/cases/integration/graphQlRequests/query/filter/composedFilter.test.ts +1 -1
- package/tests/cases/integration/graphQlRequests/query/relations/manyHasManyInverse.test.ts +74 -0
- package/tests/cases/integration/graphQlRequests/query/relations/manyHasManyOwning.test.ts +77 -0
- package/tests/cases/integration/graphQlRequests/update/acl/aclUpdate.test.ts +7 -7
- package/tests/cases/integration/graphQlSchema/graphQlSchemaBuilder.test.ts +5 -5
- package/tests/cases/unit/aclVariablesFactory.test.ts +8 -35
- package/tests/cases/unit/conditionOptimizer.test.ts +135 -0
- package/tests/cases/unit/orderbyHelper.test.ts +1 -0
- package/tests/cases/unit/permissionMerger.test.ts +2 -0
- package/tests/cases/unit/predicatesFactory.test.ts +103 -0
- package/tests/cases/unit/predicatesInjector.test.ts +78 -16
- package/tests/cases/unit/variableInjector.test.ts +6 -5
- package/tests/cases/unit/whereBuilder.test.ts +84 -0
- package/tests/cases/unit/whereOptimizer.test.ts +289 -0
- package/tests/src/testGraphql.ts +9 -2
- 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/graphql.codegen.yml
CHANGED
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@contember/engine-content-api",
|
|
3
|
-
"version": "1.2.0-alpha.
|
|
3
|
+
"version": "1.2.0-alpha.12",
|
|
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.2.0-alpha.
|
|
14
|
-
"@contember/dic": "^1.2.0-alpha.
|
|
15
|
-
"@contember/engine-common": "^1.2.0-alpha.
|
|
16
|
-
"@contember/graphql-utils": "^1.2.0-alpha.
|
|
17
|
-
"@contember/schema": "^1.2.0-alpha.
|
|
18
|
-
"@contember/schema-utils": "^1.2.0-alpha.
|
|
13
|
+
"@contember/database": "^1.2.0-alpha.12",
|
|
14
|
+
"@contember/dic": "^1.2.0-alpha.12",
|
|
15
|
+
"@contember/engine-common": "^1.2.0-alpha.12",
|
|
16
|
+
"@contember/graphql-utils": "^1.2.0-alpha.12",
|
|
17
|
+
"@contember/schema": "^1.2.0-alpha.12",
|
|
18
|
+
"@contember/schema-utils": "^1.2.0-alpha.12",
|
|
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.2.0-alpha.
|
|
24
|
-
"@contember/engine-api-tester": "^1.2.0-alpha.
|
|
25
|
-
"@contember/schema-definition": "^1.2.0-alpha.
|
|
26
|
-
"@graphql-codegen/cli": "^
|
|
27
|
-
"@graphql-codegen/typescript": "^
|
|
28
|
-
"@graphql-codegen/typescript-operations": "^
|
|
29
|
-
"@graphql-codegen/typescript-resolvers": "^
|
|
30
|
-
"@types/node": "^
|
|
31
|
-
"graphql": "^
|
|
23
|
+
"@contember/database-tester": "^1.2.0-alpha.12",
|
|
24
|
+
"@contember/engine-api-tester": "^1.2.0-alpha.12",
|
|
25
|
+
"@contember/schema-definition": "^1.2.0-alpha.12",
|
|
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):
|
|
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,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(
|
|
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(
|
|
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(
|
|
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
|
-
|
|
72
|
-
|
|
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(
|
|
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
|
-
|
|
47
|
-
visitColumn: () =>
|
|
48
|
-
visitRelation: (
|
|
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
|
-
|
|
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.
|
|
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.
|
|
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
|
}
|
package/src/acl/VariableUtils.ts
CHANGED
|
@@ -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
|
-
|
|
9
|
-
identityId: string
|
|
10
|
-
personId: string | null
|
|
11
|
-
memberships: Memberships
|
|
12
|
-
},
|
|
7
|
+
memberships: readonly ParsedMembership[],
|
|
13
8
|
): Acl.VariablesMap => {
|
|
14
9
|
|
|
15
|
-
const variablesEntries =
|
|
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.
|
|
13
|
+
const membershipVariablesMap = Object.fromEntries(membership.variables.map(it => [it.name, it.condition]))
|
|
19
14
|
|
|
20
|
-
return Object.
|
|
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
|
-
|
|
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.
|
|
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,
|
|
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
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
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
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
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
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
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(
|
|
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),
|