@contember/engine-content-api 1.2.0-rc.3 → 1.3.0-alpha.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/src/input-validation/preValidation/CreateInputPreValidationProcessor.d.ts.map +1 -1
- package/dist/src/input-validation/preValidation/CreateInputPreValidationProcessor.js +6 -0
- package/dist/src/input-validation/preValidation/CreateInputPreValidationProcessor.js.map +1 -1
- package/dist/src/input-validation/preValidation/UpdateInputPreValidationProcessor.d.ts.map +1 -1
- package/dist/src/input-validation/preValidation/UpdateInputPreValidationProcessor.js +6 -0
- package/dist/src/input-validation/preValidation/UpdateInputPreValidationProcessor.js.map +1 -1
- package/dist/src/inputProcessing/CreateInputProcessor.d.ts +27 -9
- package/dist/src/inputProcessing/CreateInputProcessor.d.ts.map +1 -1
- package/dist/src/inputProcessing/CreateInputVisitor.d.ts.map +1 -1
- package/dist/src/inputProcessing/CreateInputVisitor.js +10 -2
- package/dist/src/inputProcessing/CreateInputVisitor.js.map +1 -1
- package/dist/src/inputProcessing/UniqueWhereExpander.d.ts +2 -1
- package/dist/src/inputProcessing/UniqueWhereExpander.d.ts.map +1 -1
- package/dist/src/inputProcessing/UniqueWhereExpander.js +4 -0
- package/dist/src/inputProcessing/UniqueWhereExpander.js.map +1 -1
- package/dist/src/inputProcessing/UpdateInputProcessor.d.ts +41 -16
- package/dist/src/inputProcessing/UpdateInputProcessor.d.ts.map +1 -1
- package/dist/src/inputProcessing/UpdateInputVisitor.d.ts.map +1 -1
- package/dist/src/inputProcessing/UpdateInputVisitor.js +7 -2
- package/dist/src/inputProcessing/UpdateInputVisitor.js.map +1 -1
- package/dist/src/mapper/DataManipulationBuilder.d.ts +7 -0
- package/dist/src/mapper/DataManipulationBuilder.d.ts.map +1 -0
- package/dist/src/mapper/DataManipulationBuilder.js +5 -0
- package/dist/src/mapper/DataManipulationBuilder.js.map +1 -0
- package/dist/src/mapper/Mapper.d.ts +9 -14
- package/dist/src/mapper/Mapper.d.ts.map +1 -1
- package/dist/src/mapper/Mapper.js +48 -15
- 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 +3 -3
- package/dist/src/mapper/MapperContainer.js.map +1 -1
- package/dist/src/mapper/Result.d.ts +2 -2
- package/dist/src/mapper/Result.d.ts.map +1 -1
- package/dist/src/mapper/Result.js.map +1 -1
- package/dist/src/mapper/delete/DeleteExecutor.d.ts +12 -5
- package/dist/src/mapper/delete/DeleteExecutor.d.ts.map +1 -1
- package/dist/src/mapper/delete/DeleteExecutor.js +143 -77
- package/dist/src/mapper/delete/DeleteExecutor.js.map +1 -1
- package/dist/src/mapper/delete/DeleteState.d.ts +22 -0
- package/dist/src/mapper/delete/DeleteState.d.ts.map +1 -0
- package/dist/src/mapper/delete/DeleteState.js +68 -0
- package/dist/src/mapper/delete/DeleteState.js.map +1 -0
- package/dist/src/mapper/delete/DeletedEntitiesStorage.d.ts +1 -0
- package/dist/src/mapper/delete/DeletedEntitiesStorage.d.ts.map +1 -1
- package/dist/src/mapper/delete/DeletedEntitiesStorage.js +5 -0
- package/dist/src/mapper/delete/DeletedEntitiesStorage.js.map +1 -1
- package/dist/src/mapper/delete/helpers.d.ts +11 -0
- package/dist/src/mapper/delete/helpers.d.ts.map +1 -0
- package/dist/src/mapper/delete/helpers.js +49 -0
- package/dist/src/mapper/delete/helpers.js.map +1 -0
- package/dist/src/mapper/insert/InsertBuilder.d.ts +8 -5
- package/dist/src/mapper/insert/InsertBuilder.d.ts.map +1 -1
- package/dist/src/mapper/insert/InsertBuilder.js +16 -9
- package/dist/src/mapper/insert/InsertBuilder.js.map +1 -1
- package/dist/src/mapper/insert/InsertBuilderFactory.d.ts +3 -1
- package/dist/src/mapper/insert/InsertBuilderFactory.d.ts.map +1 -1
- package/dist/src/mapper/insert/InsertBuilderFactory.js +3 -2
- package/dist/src/mapper/insert/InsertBuilderFactory.js.map +1 -1
- package/dist/src/mapper/insert/Inserter.d.ts +3 -6
- package/dist/src/mapper/insert/Inserter.d.ts.map +1 -1
- package/dist/src/mapper/insert/Inserter.js +6 -9
- package/dist/src/mapper/insert/Inserter.js.map +1 -1
- package/dist/src/mapper/insert/SqlCreateInputProcessor.d.ts +5 -0
- package/dist/src/mapper/insert/SqlCreateInputProcessor.d.ts.map +1 -1
- package/dist/src/mapper/insert/SqlCreateInputProcessor.js +54 -120
- package/dist/src/mapper/insert/SqlCreateInputProcessor.js.map +1 -1
- package/dist/src/mapper/relations/ManyHasManyInputProcessor.d.ts +32 -0
- package/dist/src/mapper/relations/ManyHasManyInputProcessor.d.ts.map +1 -0
- package/dist/src/mapper/relations/ManyHasManyInputProcessor.js +77 -0
- package/dist/src/mapper/relations/ManyHasManyInputProcessor.js.map +1 -0
- package/dist/src/mapper/relations/ManyHasOneInputProcessor.d.ts +32 -0
- package/dist/src/mapper/relations/ManyHasOneInputProcessor.d.ts.map +1 -0
- package/dist/src/mapper/relations/ManyHasOneInputProcessor.js +108 -0
- package/dist/src/mapper/relations/ManyHasOneInputProcessor.js.map +1 -0
- package/dist/src/mapper/relations/OneHasManyInputProcessor.d.ts +29 -0
- package/dist/src/mapper/relations/OneHasManyInputProcessor.d.ts.map +1 -0
- package/dist/src/mapper/relations/OneHasManyInputProcessor.js +61 -0
- package/dist/src/mapper/relations/OneHasManyInputProcessor.js.map +1 -0
- package/dist/src/mapper/relations/OneHasOneInverseCreateInputProcessor.d.ts +21 -0
- package/dist/src/mapper/relations/OneHasOneInverseCreateInputProcessor.d.ts.map +1 -0
- package/dist/src/mapper/relations/OneHasOneInverseCreateInputProcessor.js +74 -0
- package/dist/src/mapper/relations/OneHasOneInverseCreateInputProcessor.js.map +1 -0
- package/dist/src/mapper/relations/OneHasOneInverseUpdateInputProcessor.d.ts +32 -0
- package/dist/src/mapper/relations/OneHasOneInverseUpdateInputProcessor.d.ts.map +1 -0
- package/dist/src/mapper/relations/OneHasOneInverseUpdateInputProcessor.js +125 -0
- package/dist/src/mapper/relations/OneHasOneInverseUpdateInputProcessor.js.map +1 -0
- package/dist/src/mapper/relations/OneHasOneOwningCreateInputProcessor.d.ts +21 -0
- package/dist/src/mapper/relations/OneHasOneOwningCreateInputProcessor.d.ts.map +1 -0
- package/dist/src/mapper/relations/OneHasOneOwningCreateInputProcessor.js +72 -0
- package/dist/src/mapper/relations/OneHasOneOwningCreateInputProcessor.js.map +1 -0
- package/dist/src/mapper/relations/OneHasOneOwningUpdateInputProcessor.d.ts +37 -0
- package/dist/src/mapper/relations/OneHasOneOwningUpdateInputProcessor.d.ts.map +1 -0
- package/dist/src/mapper/relations/OneHasOneOwningUpdateInputProcessor.js +193 -0
- package/dist/src/mapper/relations/OneHasOneOwningUpdateInputProcessor.js.map +1 -0
- package/dist/src/mapper/select/JoinBuilder.d.ts +1 -1
- package/dist/src/mapper/select/JoinBuilder.d.ts.map +1 -1
- package/dist/src/mapper/select/JoinBuilder.js.map +1 -1
- package/dist/src/mapper/select/WhereBuilder.d.ts +2 -2
- package/dist/src/mapper/select/WhereBuilder.d.ts.map +1 -1
- package/dist/src/mapper/select/WhereBuilder.js.map +1 -1
- package/dist/src/mapper/select/optimizer/WhereOptimizer.d.ts.map +1 -1
- package/dist/src/mapper/select/optimizer/WhereOptimizer.js +3 -1
- package/dist/src/mapper/select/optimizer/WhereOptimizer.js.map +1 -1
- package/dist/src/mapper/select/optimizer/WhereReplacer.d.ts +3 -1
- package/dist/src/mapper/select/optimizer/WhereReplacer.d.ts.map +1 -1
- package/dist/src/mapper/select/optimizer/WhereReplacer.js +42 -18
- package/dist/src/mapper/select/optimizer/WhereReplacer.js.map +1 -1
- package/dist/src/mapper/update/SqlUpdateInputProcessor.d.ts +5 -0
- package/dist/src/mapper/update/SqlUpdateInputProcessor.d.ts.map +1 -1
- package/dist/src/mapper/update/SqlUpdateInputProcessor.js +52 -389
- package/dist/src/mapper/update/SqlUpdateInputProcessor.js.map +1 -1
- package/dist/src/mapper/update/UpdateBuilder.d.ts +7 -4
- package/dist/src/mapper/update/UpdateBuilder.d.ts.map +1 -1
- package/dist/src/mapper/update/UpdateBuilder.js +18 -12
- package/dist/src/mapper/update/UpdateBuilder.js.map +1 -1
- package/dist/src/mapper/update/UpdateBuilderFactory.d.ts +3 -1
- package/dist/src/mapper/update/UpdateBuilderFactory.d.ts.map +1 -1
- package/dist/src/mapper/update/UpdateBuilderFactory.js +3 -2
- package/dist/src/mapper/update/UpdateBuilderFactory.js.map +1 -1
- package/dist/src/mapper/update/Updater.d.ts +1 -4
- package/dist/src/mapper/update/Updater.d.ts.map +1 -1
- package/dist/src/mapper/update/Updater.js +11 -13
- package/dist/src/mapper/update/Updater.js.map +1 -1
- package/dist/src/resolvers/MutationResolver.js +1 -1
- package/dist/src/resolvers/MutationResolver.js.map +1 -1
- package/dist/src/schema/GraphQlSchemaBuilderFactory.d.ts +3 -0
- package/dist/src/schema/GraphQlSchemaBuilderFactory.d.ts.map +1 -1
- package/dist/src/schema/GraphQlSchemaBuilderFactory.js +4 -2
- package/dist/src/schema/GraphQlSchemaBuilderFactory.js.map +1 -1
- package/dist/src/schema/mutations/ConnectOrCreateRelationInputProvider.d.ts +15 -0
- package/dist/src/schema/mutations/ConnectOrCreateRelationInputProvider.d.ts.map +1 -0
- package/dist/src/schema/mutations/ConnectOrCreateRelationInputProvider.js +43 -0
- package/dist/src/schema/mutations/ConnectOrCreateRelationInputProvider.js.map +1 -0
- package/dist/src/schema/mutations/CreateEntityInputFieldVisitor.d.ts.map +1 -1
- package/dist/src/schema/mutations/CreateEntityInputFieldVisitor.js +2 -6
- package/dist/src/schema/mutations/CreateEntityInputFieldVisitor.js.map +1 -1
- package/dist/src/schema/mutations/CreateEntityRelationAllowedOperationsVisitor.d.ts.map +1 -1
- package/dist/src/schema/mutations/CreateEntityRelationAllowedOperationsVisitor.js +3 -0
- package/dist/src/schema/mutations/CreateEntityRelationAllowedOperationsVisitor.js.map +1 -1
- package/dist/src/schema/mutations/CreateEntityRelationInputFieldVisitor.d.ts +3 -1
- package/dist/src/schema/mutations/CreateEntityRelationInputFieldVisitor.d.ts.map +1 -1
- package/dist/src/schema/mutations/CreateEntityRelationInputFieldVisitor.js +15 -8
- package/dist/src/schema/mutations/CreateEntityRelationInputFieldVisitor.js.map +1 -1
- package/dist/src/schema/mutations/EntityInputProvider.d.ts.map +1 -1
- package/dist/src/schema/mutations/EntityInputProvider.js +0 -3
- package/dist/src/schema/mutations/EntityInputProvider.js.map +1 -1
- package/dist/src/schema/mutations/UpdateEntityInputFieldVisitor.d.ts.map +1 -1
- package/dist/src/schema/mutations/UpdateEntityInputFieldVisitor.js +2 -6
- package/dist/src/schema/mutations/UpdateEntityInputFieldVisitor.js.map +1 -1
- package/dist/src/schema/mutations/UpdateEntityRelationAllowedOperationsVisitor.d.ts.map +1 -1
- package/dist/src/schema/mutations/UpdateEntityRelationAllowedOperationsVisitor.js +3 -0
- package/dist/src/schema/mutations/UpdateEntityRelationAllowedOperationsVisitor.js.map +1 -1
- package/dist/src/schema/mutations/UpdateEntityRelationInputFieldVisitor.d.ts +3 -1
- package/dist/src/schema/mutations/UpdateEntityRelationInputFieldVisitor.d.ts.map +1 -1
- package/dist/src/schema/mutations/UpdateEntityRelationInputFieldVisitor.js +11 -22
- package/dist/src/schema/mutations/UpdateEntityRelationInputFieldVisitor.js.map +1 -1
- package/dist/src/tsconfig.tsbuildinfo +1 -1
- package/dist/tests/cases/integration/graphQlDb/update/deferedConstraints.test.js +2 -2
- package/dist/tests/cases/integration/graphQlDb/update/deferedConstraints.test.js.map +1 -1
- package/dist/tests/cases/integration/graphQlDb/update/failedDelete.test.js +1 -1
- package/dist/tests/cases/integration/graphQlDb/update/failedDelete.test.js.map +1 -1
- package/dist/tests/cases/integration/graphQlDb/update/nullChecksNotNull.test.js +1 -1
- package/dist/tests/cases/integration/graphQlDb/update/nullChecksNotNull.test.js.map +1 -1
- package/dist/tests/cases/integration/graphQlDb/update/nullChecksNullable.test.js +0 -3
- package/dist/tests/cases/integration/graphQlDb/update/nullChecksNullable.test.js.map +1 -1
- package/dist/tests/cases/integration/graphQlRequests/delete/aclDelete.test.js +13 -32
- package/dist/tests/cases/integration/graphQlRequests/delete/aclDelete.test.js.map +1 -1
- package/dist/tests/cases/integration/graphQlRequests/delete/additionalDeleteFilter.test.js +11 -30
- package/dist/tests/cases/integration/graphQlRequests/delete/additionalDeleteFilter.test.js.map +1 -1
- package/dist/tests/cases/integration/graphQlRequests/delete/cascadeDelete.test.js +62 -45
- package/dist/tests/cases/integration/graphQlRequests/delete/cascadeDelete.test.js.map +1 -1
- package/dist/tests/cases/integration/graphQlRequests/delete/deleteById.test.js +10 -11
- package/dist/tests/cases/integration/graphQlRequests/delete/deleteById.test.js.map +1 -1
- package/dist/tests/cases/integration/graphQlRequests/delete/orphanRemoval.test.js +29 -18
- package/dist/tests/cases/integration/graphQlRequests/delete/orphanRemoval.test.js.map +1 -1
- package/dist/tests/cases/integration/graphQlRequests/delete/restrictOnDelete.test.d.ts +2 -0
- package/dist/tests/cases/integration/graphQlRequests/delete/restrictOnDelete.test.d.ts.map +1 -0
- package/dist/tests/cases/integration/graphQlRequests/delete/restrictOnDelete.test.js +97 -0
- package/dist/tests/cases/integration/graphQlRequests/delete/restrictOnDelete.test.js.map +1 -0
- package/dist/tests/cases/integration/graphQlRequests/delete/setNullOnDelete.test.js +58 -22
- package/dist/tests/cases/integration/graphQlRequests/delete/setNullOnDelete.test.js.map +1 -1
- package/dist/tests/cases/integration/graphQlRequests/insert/manyHasManyInverse/create.test.d.ts +2 -0
- package/dist/tests/cases/integration/graphQlRequests/insert/manyHasManyInverse/create.test.d.ts.map +1 -0
- package/dist/tests/cases/integration/graphQlRequests/insert/manyHasManyInverse/{insertRelationCreate.test.js → create.test.js} +1 -1
- package/dist/tests/cases/integration/graphQlRequests/insert/manyHasManyInverse/create.test.js.map +1 -0
- package/dist/tests/cases/integration/graphQlRequests/insert/manyHasManyOwning/create.test.d.ts +2 -0
- package/dist/tests/cases/integration/graphQlRequests/insert/manyHasManyOwning/create.test.d.ts.map +1 -0
- package/dist/tests/cases/integration/graphQlRequests/insert/manyHasManyOwning/{insertRelationCreate.test.js → create.test.js} +1 -1
- package/dist/tests/cases/integration/graphQlRequests/insert/manyHasManyOwning/create.test.js.map +1 -0
- package/dist/tests/cases/integration/graphQlRequests/insert/manyHasOne/connectOrCreate.test.d.ts +2 -0
- package/dist/tests/cases/integration/graphQlRequests/insert/manyHasOne/connectOrCreate.test.d.ts.map +1 -0
- package/dist/tests/cases/integration/graphQlRequests/insert/manyHasOne/connectOrCreate.test.js +99 -0
- package/dist/tests/cases/integration/graphQlRequests/insert/manyHasOne/connectOrCreate.test.js.map +1 -0
- package/dist/tests/cases/integration/graphQlRequests/insert/manyHasOne/create.test.d.ts +2 -0
- package/dist/tests/cases/integration/graphQlRequests/insert/manyHasOne/create.test.d.ts.map +1 -0
- package/dist/tests/cases/integration/graphQlRequests/insert/manyHasOne/{insertRelationCreate.test.js → create.test.js} +1 -1
- package/dist/tests/cases/integration/graphQlRequests/insert/manyHasOne/create.test.js.map +1 -0
- package/dist/tests/cases/integration/graphQlRequests/insert/oneHasMany/connect.test.d.ts +2 -0
- package/dist/tests/cases/integration/graphQlRequests/insert/oneHasMany/connect.test.d.ts.map +1 -0
- package/dist/tests/cases/integration/graphQlRequests/insert/oneHasMany/{insertRelationConnect.test.js → connect.test.js} +1 -1
- package/dist/tests/cases/integration/graphQlRequests/insert/oneHasMany/connect.test.js.map +1 -0
- package/dist/tests/cases/integration/graphQlRequests/insert/oneHasMany/create.test.d.ts +2 -0
- package/dist/tests/cases/integration/graphQlRequests/insert/oneHasMany/create.test.d.ts.map +1 -0
- package/dist/tests/cases/integration/graphQlRequests/insert/oneHasMany/{insertRelationCreate.test.js → create.test.js} +1 -1
- package/dist/tests/cases/integration/graphQlRequests/insert/oneHasMany/create.test.js.map +1 -0
- package/dist/tests/cases/integration/graphQlRequests/insert/oneHasOneInverse/create.test.d.ts +2 -0
- package/dist/tests/cases/integration/graphQlRequests/insert/oneHasOneInverse/create.test.d.ts.map +1 -0
- package/dist/tests/cases/integration/graphQlRequests/insert/oneHasOneInverse/{insertRelationCreate.test.js → create.test.js} +1 -1
- package/dist/tests/cases/integration/graphQlRequests/insert/oneHasOneInverse/create.test.js.map +1 -0
- package/dist/tests/cases/integration/graphQlRequests/insert/oneHasOneOwning/create.test.d.ts +2 -0
- package/dist/tests/cases/integration/graphQlRequests/insert/oneHasOneOwning/create.test.d.ts.map +1 -0
- package/dist/tests/cases/integration/graphQlRequests/insert/oneHasOneOwning/{insertRelationCreate.test.js → create.test.js} +1 -1
- package/dist/tests/cases/integration/graphQlRequests/insert/oneHasOneOwning/create.test.js.map +1 -0
- package/dist/tests/cases/integration/graphQlRequests/insert/oneHasOneOwning/empty.test.d.ts +2 -0
- package/dist/tests/cases/integration/graphQlRequests/insert/oneHasOneOwning/empty.test.d.ts.map +1 -0
- package/dist/tests/cases/integration/graphQlRequests/insert/oneHasOneOwning/{insertRelationEmpty.test.js → empty.test.js} +1 -1
- package/dist/tests/cases/integration/graphQlRequests/insert/oneHasOneOwning/empty.test.js.map +1 -0
- package/dist/tests/cases/integration/graphQlRequests/update/manyHasManyInverse/delete.test.js +49 -11
- 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 +49 -11
- 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 +83 -49
- 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 +10 -11
- 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 +49 -11
- package/dist/tests/cases/integration/graphQlRequests/update/oneHasMany/delete.test.js.map +1 -1
- package/dist/tests/cases/integration/graphQlRequests/update/oneHasOneInverse/connect.test.js +103 -0
- package/dist/tests/cases/integration/graphQlRequests/update/oneHasOneInverse/connect.test.js.map +1 -1
- package/dist/tests/cases/integration/graphQlRequests/update/oneHasOneInverse/create.test.js +20 -14
- package/dist/tests/cases/integration/graphQlRequests/update/oneHasOneInverse/create.test.js.map +1 -1
- package/dist/tests/cases/integration/graphQlRequests/update/oneHasOneInverse/delete.test.js +101 -11
- package/dist/tests/cases/integration/graphQlRequests/update/oneHasOneInverse/delete.test.js.map +1 -1
- package/dist/tests/cases/integration/graphQlRequests/update/oneHasOneInverse/disconnect.test.js +17 -11
- package/dist/tests/cases/integration/graphQlRequests/update/oneHasOneInverse/disconnect.test.js.map +1 -1
- package/dist/tests/cases/integration/graphQlRequests/update/oneHasOneInverse/schema.d.ts +1 -0
- package/dist/tests/cases/integration/graphQlRequests/update/oneHasOneInverse/schema.d.ts.map +1 -1
- package/dist/tests/cases/integration/graphQlRequests/update/oneHasOneInverse/schema.js +9 -1
- package/dist/tests/cases/integration/graphQlRequests/update/oneHasOneInverse/schema.js.map +1 -1
- package/dist/tests/cases/integration/graphQlRequests/update/oneHasOneInverse/upsert.test.js +8 -6
- package/dist/tests/cases/integration/graphQlRequests/update/oneHasOneInverse/upsert.test.js.map +1 -1
- package/dist/tests/cases/integration/graphQlRequests/update/oneHasOneOwning/connect.test.js +76 -0
- package/dist/tests/cases/integration/graphQlRequests/update/oneHasOneOwning/connect.test.js.map +1 -1
- package/dist/tests/cases/integration/graphQlRequests/update/oneHasOneOwning/connectOrCreate.test.d.ts +2 -0
- package/dist/tests/cases/integration/graphQlRequests/update/oneHasOneOwning/connectOrCreate.test.d.ts.map +1 -0
- package/dist/tests/cases/integration/graphQlRequests/update/oneHasOneOwning/connectOrCreate.test.js +53 -0
- package/dist/tests/cases/integration/graphQlRequests/update/oneHasOneOwning/connectOrCreate.test.js.map +1 -0
- package/dist/tests/cases/integration/graphQlRequests/update/oneHasOneOwning/create.test.js +80 -0
- package/dist/tests/cases/integration/graphQlRequests/update/oneHasOneOwning/create.test.js.map +1 -1
- package/dist/tests/cases/integration/graphQlRequests/update/oneHasOneOwning/delete.test.js +66 -25
- package/dist/tests/cases/integration/graphQlRequests/update/oneHasOneOwning/delete.test.js.map +1 -1
- package/dist/tests/cases/integration/graphQlRequests/update/oneHasOneOwning/schema.d.ts +1 -0
- package/dist/tests/cases/integration/graphQlRequests/update/oneHasOneOwning/schema.d.ts.map +1 -1
- package/dist/tests/cases/integration/graphQlRequests/update/oneHasOneOwning/schema.js +10 -2
- package/dist/tests/cases/integration/graphQlRequests/update/oneHasOneOwning/schema.js.map +1 -1
- package/dist/tests/cases/integration/graphQlSchema/schema-acl-allowed.gql +14 -1
- package/dist/tests/cases/integration/graphQlSchema/schema-acl-restricted-create.gql +5 -5
- package/dist/tests/cases/integration/graphQlSchema/schema-acl-restricted-delete.gql +14 -1
- package/dist/tests/cases/integration/graphQlSchema/schema-acl-restricted-update.gql +12 -0
- package/dist/tests/cases/integration/graphQlSchema/schema-basic.gql +40 -2
- package/dist/tests/cases/integration/graphQlSchema/schema-bug-66.gql +30 -3
- package/dist/tests/cases/integration/graphQlSchema/schema-custom-primary.gql +40 -2
- package/dist/tests/cases/integration/graphQlSchema/schema-has-many-reduction.gql +14 -1
- package/dist/tests/cases/integration/graphQlSchema/schema-new-builder.gql +40 -2
- package/dist/tests/cases/unit/whereOptimizer.test.js +114 -13
- package/dist/tests/cases/unit/whereOptimizer.test.js.map +1 -1
- package/dist/tests/src/test.d.ts +0 -1
- package/dist/tests/src/test.d.ts.map +1 -1
- package/dist/tests/src/test.js +1 -27
- package/dist/tests/src/test.js.map +1 -1
- package/dist/tests/src/testGraphql.js +1 -1
- package/dist/tests/src/testGraphql.js.map +1 -1
- package/dist/tests/tsconfig.tsbuildinfo +1 -1
- package/package.json +11 -11
- package/src/input-validation/preValidation/CreateInputPreValidationProcessor.ts +6 -0
- package/src/input-validation/preValidation/UpdateInputPreValidationProcessor.ts +6 -0
- package/src/inputProcessing/CreateInputProcessor.ts +8 -11
- package/src/inputProcessing/CreateInputVisitor.ts +11 -2
- package/src/inputProcessing/UniqueWhereExpander.ts +5 -1
- package/src/inputProcessing/UpdateInputProcessor.ts +18 -18
- package/src/inputProcessing/UpdateInputVisitor.ts +6 -2
- package/src/mapper/DataManipulationBuilder.ts +12 -0
- package/src/mapper/Mapper.ts +75 -47
- package/src/mapper/MapperContainer.ts +10 -6
- package/src/mapper/Result.ts +1 -1
- package/src/mapper/delete/DeleteExecutor.ts +221 -95
- package/src/mapper/delete/DeleteState.ts +80 -0
- package/src/mapper/delete/DeletedEntitiesStorage.ts +6 -0
- package/src/mapper/delete/helpers.ts +68 -0
- package/src/mapper/insert/InsertBuilder.ts +23 -12
- package/src/mapper/insert/InsertBuilderFactory.ts +3 -1
- package/src/mapper/insert/Inserter.ts +6 -10
- package/src/mapper/insert/SqlCreateInputProcessor.ts +61 -139
- package/src/mapper/relations/ManyHasManyInputProcessor.ts +108 -0
- package/src/mapper/relations/ManyHasOneInputProcessor.ts +158 -0
- package/src/mapper/relations/OneHasManyInputProcessor.ts +101 -0
- package/src/mapper/relations/OneHasOneInverseCreateInputProcessor.ts +99 -0
- package/src/mapper/relations/OneHasOneInverseUpdateInputProcessor.ts +164 -0
- package/src/mapper/relations/OneHasOneOwningCreateInputProcessor.ts +92 -0
- package/src/mapper/relations/OneHasOneOwningUpdateInputProcessor.ts +253 -0
- package/src/mapper/select/JoinBuilder.ts +4 -4
- package/src/mapper/select/WhereBuilder.ts +11 -11
- package/src/mapper/select/optimizer/WhereOptimizer.ts +3 -1
- package/src/mapper/select/optimizer/WhereReplacer.ts +45 -18
- package/src/mapper/update/SqlUpdateInputProcessor.ts +55 -484
- package/src/mapper/update/UpdateBuilder.ts +22 -15
- package/src/mapper/update/UpdateBuilderFactory.ts +10 -1
- package/src/mapper/update/Updater.ts +10 -19
- package/src/resolvers/MutationResolver.ts +1 -1
- package/src/schema/GraphQlSchemaBuilderFactory.ts +7 -4
- package/src/schema/mutations/ConnectOrCreateRelationInputProvider.ts +54 -0
- package/src/schema/mutations/CreateEntityInputFieldVisitor.ts +2 -6
- package/src/schema/mutations/CreateEntityRelationAllowedOperationsVisitor.ts +3 -1
- package/src/schema/mutations/CreateEntityRelationInputFieldVisitor.ts +20 -15
- package/src/schema/mutations/EntityInputProvider.ts +0 -3
- package/src/schema/mutations/UpdateEntityInputFieldVisitor.ts +2 -6
- package/src/schema/mutations/UpdateEntityRelationAllowedOperationsVisitor.ts +3 -1
- package/src/schema/mutations/UpdateEntityRelationInputFieldVisitor.ts +52 -57
- package/tests/cases/integration/graphQlDb/update/deferedConstraints.test.ts +2 -2
- package/tests/cases/integration/graphQlDb/update/failedDelete.test.ts +1 -1
- package/tests/cases/integration/graphQlDb/update/nullChecksNotNull.test.ts +1 -1
- package/tests/cases/integration/graphQlDb/update/nullChecksNullable.test.ts +0 -3
- package/tests/cases/integration/graphQlRequests/delete/aclDelete.test.ts +15 -34
- package/tests/cases/integration/graphQlRequests/delete/additionalDeleteFilter.test.ts +12 -31
- package/tests/cases/integration/graphQlRequests/delete/cascadeDelete.test.ts +68 -46
- package/tests/cases/integration/graphQlRequests/delete/deleteById.test.ts +11 -12
- package/tests/cases/integration/graphQlRequests/delete/orphanRemoval.test.ts +30 -19
- package/tests/cases/integration/graphQlRequests/delete/restrictOnDelete.test.ts +102 -0
- package/tests/cases/integration/graphQlRequests/delete/setNullOnDelete.test.ts +63 -23
- package/tests/cases/integration/graphQlRequests/insert/manyHasManyInverse/{insertRelationCreate.test.ts → create.test.ts} +0 -0
- package/tests/cases/integration/graphQlRequests/insert/manyHasManyOwning/{insertRelationCreate.test.ts → create.test.ts} +0 -0
- package/tests/cases/integration/graphQlRequests/insert/manyHasOne/connectOrCreate.test.ts +106 -0
- package/tests/cases/integration/graphQlRequests/insert/manyHasOne/{insertRelationCreate.test.ts → create.test.ts} +0 -0
- package/tests/cases/integration/graphQlRequests/insert/oneHasMany/{insertRelationConnect.test.ts → connect.test.ts} +0 -0
- package/tests/cases/integration/graphQlRequests/insert/oneHasMany/{insertRelationCreate.test.ts → create.test.ts} +0 -0
- package/tests/cases/integration/graphQlRequests/insert/oneHasOneInverse/{insertRelationCreate.test.ts → create.test.ts} +0 -0
- package/tests/cases/integration/graphQlRequests/insert/oneHasOneOwning/{insertRelationCreate.test.ts → create.test.ts} +0 -0
- package/tests/cases/integration/graphQlRequests/insert/oneHasOneOwning/{insertRelationEmpty.test.ts → empty.test.ts} +0 -0
- package/tests/cases/integration/graphQlRequests/update/manyHasManyInverse/delete.test.ts +51 -12
- package/tests/cases/integration/graphQlRequests/update/manyHasManyOwning/delete.test.ts +51 -12
- package/tests/cases/integration/graphQlRequests/update/manyHasOne/delete.test.ts +86 -50
- package/tests/cases/integration/graphQlRequests/update/oneHasMany/combination.test.ts +11 -12
- package/tests/cases/integration/graphQlRequests/update/oneHasMany/delete.test.ts +51 -12
- package/tests/cases/integration/graphQlRequests/update/oneHasOneInverse/connect.test.ts +106 -1
- package/tests/cases/integration/graphQlRequests/update/oneHasOneInverse/create.test.ts +20 -14
- package/tests/cases/integration/graphQlRequests/update/oneHasOneInverse/delete.test.ts +106 -12
- package/tests/cases/integration/graphQlRequests/update/oneHasOneInverse/disconnect.test.ts +17 -11
- package/tests/cases/integration/graphQlRequests/update/oneHasOneInverse/schema.ts +13 -0
- package/tests/cases/integration/graphQlRequests/update/oneHasOneInverse/upsert.test.ts +8 -6
- package/tests/cases/integration/graphQlRequests/update/oneHasOneOwning/connect.test.ts +80 -1
- package/tests/cases/integration/graphQlRequests/update/oneHasOneOwning/connectOrCreate.test.ts +51 -0
- package/tests/cases/integration/graphQlRequests/update/oneHasOneOwning/create.test.ts +81 -1
- package/tests/cases/integration/graphQlRequests/update/oneHasOneOwning/delete.test.ts +69 -26
- package/tests/cases/integration/graphQlRequests/update/oneHasOneOwning/schema.ts +14 -1
- package/tests/cases/integration/graphQlSchema/schema-acl-allowed.gql +14 -1
- package/tests/cases/integration/graphQlSchema/schema-acl-restricted-create.gql +5 -5
- package/tests/cases/integration/graphQlSchema/schema-acl-restricted-delete.gql +14 -1
- package/tests/cases/integration/graphQlSchema/schema-acl-restricted-update.gql +12 -0
- package/tests/cases/integration/graphQlSchema/schema-basic.gql +40 -2
- package/tests/cases/integration/graphQlSchema/schema-bug-66.gql +30 -3
- package/tests/cases/integration/graphQlSchema/schema-custom-primary.gql +40 -2
- package/tests/cases/integration/graphQlSchema/schema-has-many-reduction.gql +14 -1
- package/tests/cases/integration/graphQlSchema/schema-new-builder.gql +40 -2
- package/tests/cases/unit/whereOptimizer.test.ts +120 -13
- package/tests/src/test.ts +0 -25
- package/tests/src/testGraphql.ts +1 -1
- package/dist/tests/cases/integration/graphQlRequests/insert/manyHasManyInverse/insertRelationCreate.test.d.ts +0 -2
- package/dist/tests/cases/integration/graphQlRequests/insert/manyHasManyInverse/insertRelationCreate.test.d.ts.map +0 -1
- package/dist/tests/cases/integration/graphQlRequests/insert/manyHasManyInverse/insertRelationCreate.test.js.map +0 -1
- package/dist/tests/cases/integration/graphQlRequests/insert/manyHasManyOwning/insertRelationCreate.test.d.ts +0 -2
- package/dist/tests/cases/integration/graphQlRequests/insert/manyHasManyOwning/insertRelationCreate.test.d.ts.map +0 -1
- package/dist/tests/cases/integration/graphQlRequests/insert/manyHasManyOwning/insertRelationCreate.test.js.map +0 -1
- package/dist/tests/cases/integration/graphQlRequests/insert/manyHasOne/insertRelationCreate.test.d.ts +0 -2
- package/dist/tests/cases/integration/graphQlRequests/insert/manyHasOne/insertRelationCreate.test.d.ts.map +0 -1
- package/dist/tests/cases/integration/graphQlRequests/insert/manyHasOne/insertRelationCreate.test.js.map +0 -1
- package/dist/tests/cases/integration/graphQlRequests/insert/oneHasMany/insertRelationConnect.test.d.ts +0 -2
- package/dist/tests/cases/integration/graphQlRequests/insert/oneHasMany/insertRelationConnect.test.d.ts.map +0 -1
- package/dist/tests/cases/integration/graphQlRequests/insert/oneHasMany/insertRelationConnect.test.js.map +0 -1
- package/dist/tests/cases/integration/graphQlRequests/insert/oneHasMany/insertRelationCreate.test.d.ts +0 -2
- package/dist/tests/cases/integration/graphQlRequests/insert/oneHasMany/insertRelationCreate.test.d.ts.map +0 -1
- package/dist/tests/cases/integration/graphQlRequests/insert/oneHasMany/insertRelationCreate.test.js.map +0 -1
- package/dist/tests/cases/integration/graphQlRequests/insert/oneHasOneInverse/insertRelationCreate.test.d.ts +0 -2
- package/dist/tests/cases/integration/graphQlRequests/insert/oneHasOneInverse/insertRelationCreate.test.d.ts.map +0 -1
- package/dist/tests/cases/integration/graphQlRequests/insert/oneHasOneInverse/insertRelationCreate.test.js.map +0 -1
- package/dist/tests/cases/integration/graphQlRequests/insert/oneHasOneOwning/insertRelationCreate.test.d.ts +0 -2
- package/dist/tests/cases/integration/graphQlRequests/insert/oneHasOneOwning/insertRelationCreate.test.d.ts.map +0 -1
- package/dist/tests/cases/integration/graphQlRequests/insert/oneHasOneOwning/insertRelationCreate.test.js.map +0 -1
- package/dist/tests/cases/integration/graphQlRequests/insert/oneHasOneOwning/insertRelationEmpty.test.d.ts +0 -2
- package/dist/tests/cases/integration/graphQlRequests/insert/oneHasOneOwning/insertRelationEmpty.test.d.ts.map +0 -1
- package/dist/tests/cases/integration/graphQlRequests/insert/oneHasOneOwning/insertRelationEmpty.test.js.map +0 -1
|
@@ -1,10 +1,11 @@
|
|
|
1
1
|
import { tuple } from '../../utils'
|
|
2
|
-
import { Input, Model, Value } from '@contember/schema'
|
|
2
|
+
import { Acl, Input, Model, Value } from '@contember/schema'
|
|
3
3
|
import { acceptEveryFieldVisitor, getColumnName, getColumnType } from '@contember/schema-utils'
|
|
4
4
|
import { Client, Operator, QueryBuilder, UpdateBuilder as DbUpdateBuilder, Value as DbValue } from '@contember/database'
|
|
5
5
|
import { PathFactory, WhereBuilder } from '../select'
|
|
6
6
|
import { ColumnValue, ResolvedColumnValue, resolveGenericValue, resolveRowData } from '../ColumnValue'
|
|
7
|
-
import {
|
|
7
|
+
import { PredicateFactory } from '../../acl'
|
|
8
|
+
import { AbortDataManipulation, DataManipulationBuilder } from '../DataManipulationBuilder'
|
|
8
9
|
|
|
9
10
|
export interface UpdateResult {
|
|
10
11
|
values: ResolvedColumnValue[]
|
|
@@ -13,16 +14,16 @@ export interface UpdateResult {
|
|
|
13
14
|
affectedRows: number | null
|
|
14
15
|
}
|
|
15
16
|
|
|
16
|
-
export class UpdateBuilder {
|
|
17
|
+
export class UpdateBuilder implements DataManipulationBuilder {
|
|
17
18
|
private resolver: (value: number | null) => void = () => {
|
|
18
19
|
throw new Error('UpdateBuilder: Resolver called too soon')
|
|
19
20
|
}
|
|
20
21
|
public readonly update: Promise<number | null> = new Promise(resolve => (this.resolver = resolve))
|
|
21
22
|
|
|
22
|
-
private rowData: ColumnValue<
|
|
23
|
+
private rowData: Map<string, ColumnValue<AbortDataManipulation>> = new Map()
|
|
23
24
|
|
|
24
|
-
private newWhere: Input.OptionalWhere = {}
|
|
25
|
-
private oldWhere: Input.OptionalWhere = {}
|
|
25
|
+
private newWhere: { and: Input.OptionalWhere[] } = { and: [] }
|
|
26
|
+
private oldWhere: { and: Input.OptionalWhere[] } = { and: [] }
|
|
26
27
|
|
|
27
28
|
constructor(
|
|
28
29
|
private readonly schema: Model.Schema,
|
|
@@ -30,36 +31,42 @@ export class UpdateBuilder {
|
|
|
30
31
|
private readonly whereBuilder: WhereBuilder,
|
|
31
32
|
private readonly uniqueWhere: Input.Where,
|
|
32
33
|
private readonly pathFactory: PathFactory,
|
|
34
|
+
private readonly predicateFactory: PredicateFactory,
|
|
33
35
|
) {}
|
|
34
36
|
|
|
35
|
-
public
|
|
37
|
+
public addFieldValue(
|
|
36
38
|
fieldName: string,
|
|
37
|
-
value: Value.GenericValueLike<Value.AtomicValue<
|
|
38
|
-
): Promise<Value.AtomicValue<
|
|
39
|
+
value: Value.GenericValueLike<Value.AtomicValue<AbortDataManipulation | undefined>>,
|
|
40
|
+
): Promise<Value.AtomicValue<AbortDataManipulation | undefined>> {
|
|
39
41
|
const columnName = getColumnName(this.schema, this.entity, fieldName)
|
|
40
42
|
const columnType = getColumnType(this.schema, this.entity, fieldName)
|
|
41
43
|
const resolvedValue = resolveGenericValue(value)
|
|
42
|
-
this.rowData.
|
|
44
|
+
this.rowData.set(columnName, { columnName, value: resolvedValue, columnType, fieldName })
|
|
43
45
|
return resolvedValue
|
|
44
46
|
}
|
|
45
47
|
|
|
46
48
|
public addNewWhere(where: Input.OptionalWhere): void {
|
|
47
|
-
this.newWhere
|
|
49
|
+
this.newWhere.and.push(where)
|
|
48
50
|
}
|
|
49
51
|
|
|
50
52
|
public addOldWhere(where: Input.OptionalWhere): void {
|
|
51
|
-
this.oldWhere
|
|
53
|
+
this.oldWhere.and.push(where)
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
public addPredicates(fields: string[]): void {
|
|
57
|
+
const predicate = this.predicateFactory.create(this.entity, Acl.Operation.update, fields)
|
|
58
|
+
this.addNewWhere(predicate)
|
|
59
|
+
this.addOldWhere(predicate)
|
|
52
60
|
}
|
|
53
61
|
|
|
54
62
|
public async execute(db: Client): Promise<UpdateResult> {
|
|
55
|
-
let resolvedDataFinal: ResolvedColumnValue[] | null = null
|
|
56
63
|
try {
|
|
57
|
-
const resolvedData = await resolveRowData<
|
|
64
|
+
const resolvedData = await resolveRowData<AbortDataManipulation>([...this.rowData.values()])
|
|
58
65
|
if (Object.keys(resolvedData).length === 0) {
|
|
59
66
|
this.resolver(null)
|
|
60
67
|
return { values: [], affectedRows: null, executed: false, aborted: false }
|
|
61
68
|
}
|
|
62
|
-
if (resolvedData.find(it => it.resolvedValue ===
|
|
69
|
+
if (resolvedData.find(it => it.resolvedValue === AbortDataManipulation)) {
|
|
63
70
|
this.resolver(null)
|
|
64
71
|
return { values: [], affectedRows: null, executed: false, aborted: true }
|
|
65
72
|
}
|
|
@@ -1,15 +1,24 @@
|
|
|
1
1
|
import { PathFactory, WhereBuilder } from '../select'
|
|
2
2
|
import { Input, Model } from '@contember/schema'
|
|
3
3
|
import { UpdateBuilder } from './UpdateBuilder'
|
|
4
|
+
import { PredicateFactory } from '../../acl'
|
|
4
5
|
|
|
5
6
|
export class UpdateBuilderFactory {
|
|
6
7
|
constructor(
|
|
7
8
|
private readonly schema: Model.Schema,
|
|
8
9
|
private readonly whereBuilder: WhereBuilder,
|
|
9
10
|
private readonly pathFactory: PathFactory,
|
|
11
|
+
private readonly predicateFactory: PredicateFactory,
|
|
10
12
|
) {}
|
|
11
13
|
|
|
12
14
|
public create(entity: Model.Entity, uniqueWhere: Input.Where): UpdateBuilder {
|
|
13
|
-
return new UpdateBuilder(
|
|
15
|
+
return new UpdateBuilder(
|
|
16
|
+
this.schema,
|
|
17
|
+
entity,
|
|
18
|
+
this.whereBuilder,
|
|
19
|
+
uniqueWhere,
|
|
20
|
+
this.pathFactory,
|
|
21
|
+
this.predicateFactory,
|
|
22
|
+
)
|
|
14
23
|
}
|
|
15
24
|
}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { SqlUpdateInputProcessor } from './SqlUpdateInputProcessor'
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
2
|
+
import { UpdateInputVisitor } from '../../inputProcessing'
|
|
3
|
+
import { Input, Model } from '@contember/schema'
|
|
4
4
|
import { PredicateFactory } from '../../acl'
|
|
5
5
|
import { UpdateBuilderFactory } from './UpdateBuilderFactory'
|
|
6
6
|
import { Mapper } from '../Mapper'
|
|
@@ -8,7 +8,6 @@ import { acceptEveryFieldVisitor } from '@contember/schema-utils'
|
|
|
8
8
|
import { Client } from '@contember/database'
|
|
9
9
|
import {
|
|
10
10
|
collectResults,
|
|
11
|
-
MutationEntryNotFoundError,
|
|
12
11
|
MutationNoResultError,
|
|
13
12
|
MutationNothingToDo,
|
|
14
13
|
MutationResultList,
|
|
@@ -39,9 +38,8 @@ export class Updater {
|
|
|
39
38
|
})
|
|
40
39
|
|
|
41
40
|
const predicateFields = Object.keys(data)
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
if (filter) {
|
|
41
|
+
updateBuilder.addPredicates(predicateFields)
|
|
42
|
+
if (filter && Object.keys(filter).length > 0) {
|
|
45
43
|
updateBuilder.addOldWhere(filter)
|
|
46
44
|
}
|
|
47
45
|
|
|
@@ -51,21 +49,23 @@ export class Updater {
|
|
|
51
49
|
|
|
52
50
|
const okResultFactory = (values: RowValues) => new MutationUpdateOk([], entity, primaryValue, data, values)
|
|
53
51
|
const mutationResultPromise = Updater.executeUpdate(updateBuilder, mapper.db, okResultFactory)
|
|
54
|
-
|
|
55
|
-
|
|
52
|
+
const otherPromises = Object.values(promises)
|
|
53
|
+
if (otherPromises.length === 0) {
|
|
54
|
+
return await mutationResultPromise
|
|
55
|
+
} else {
|
|
56
|
+
return await collectResults(this.schema, mutationResultPromise, otherPromises)
|
|
57
|
+
}
|
|
56
58
|
}
|
|
57
59
|
|
|
58
60
|
public async updateCb(
|
|
59
61
|
mapper: Mapper,
|
|
60
62
|
entity: Model.Entity,
|
|
61
63
|
primaryValue: Input.PrimaryValue,
|
|
62
|
-
predicateFields: string[],
|
|
63
64
|
builderCb: (builder: UpdateBuilder) => void,
|
|
64
65
|
): Promise<MutationResultList> {
|
|
65
66
|
const updateBuilder = this.updateBuilderFactory.create(entity, {
|
|
66
67
|
[entity.primary]: { eq: primaryValue },
|
|
67
68
|
})
|
|
68
|
-
this.applyPredicates(entity, predicateFields, updateBuilder)
|
|
69
69
|
|
|
70
70
|
const okResultFactory = (values: RowValues) => new MutationUpdateOk([], entity, primaryValue, {}, values)
|
|
71
71
|
builderCb(updateBuilder)
|
|
@@ -73,12 +73,6 @@ export class Updater {
|
|
|
73
73
|
return Updater.executeUpdate(updateBuilder, mapper.db, okResultFactory)
|
|
74
74
|
}
|
|
75
75
|
|
|
76
|
-
private applyPredicates(entity: Model.Entity, predicateFields: string[], updateBuilder: UpdateBuilder): void {
|
|
77
|
-
const predicateWhere = this.predicateFactory.create(entity, Acl.Operation.update, predicateFields)
|
|
78
|
-
updateBuilder.addOldWhere(predicateWhere)
|
|
79
|
-
updateBuilder.addNewWhere(predicateWhere)
|
|
80
|
-
}
|
|
81
|
-
|
|
82
76
|
private static async executeUpdate(
|
|
83
77
|
updateBuilder: UpdateBuilder,
|
|
84
78
|
db: Client,
|
|
@@ -97,6 +91,3 @@ export class Updater {
|
|
|
97
91
|
return [okResultFactory(rowDataToFieldValues(result.values))]
|
|
98
92
|
}
|
|
99
93
|
}
|
|
100
|
-
|
|
101
|
-
export const AbortUpdate = Symbol('AbortUpdate')
|
|
102
|
-
export type AbortUpdate = typeof AbortUpdate
|
|
@@ -432,7 +432,7 @@ export class MutationResolver {
|
|
|
432
432
|
|
|
433
433
|
const result = await mapper.delete(entity, queryAst.args.by, queryAst.args.filter)
|
|
434
434
|
if (
|
|
435
|
-
result.length
|
|
435
|
+
result.length >= 1 &&
|
|
436
436
|
(result[0].result === MutationResultType.ok || result[0].result === MutationResultType.nothingToDo)
|
|
437
437
|
) {
|
|
438
438
|
return { ok: true, errors: [], ...nodes }
|
|
@@ -28,6 +28,7 @@ import { PaginatedFieldConfigFactory } from './PaginatedFieldConfigFactory'
|
|
|
28
28
|
import { PaginatedHasManyFieldProvider } from '../extensions/paginatedHasMany/PaginatedHasManyFieldProvider'
|
|
29
29
|
import { PaginatedHasManyFieldProviderVisitor } from '../extensions/paginatedHasMany/PaginatedHasManyFieldProviderVisitor'
|
|
30
30
|
import { Builder } from '@contember/dic'
|
|
31
|
+
import { ConnectOrCreateRelationInputProvider } from './mutations/ConnectOrCreateRelationInputProvider'
|
|
31
32
|
|
|
32
33
|
export class GraphQlSchemaBuilderFactory {
|
|
33
34
|
constructor() {}
|
|
@@ -72,8 +73,10 @@ export class GraphQlSchemaBuilderFactory {
|
|
|
72
73
|
new Accessor<EntityInputProvider<EntityInputType.create>>())
|
|
73
74
|
.addService('createEntityRelationAllowedOperationsVisitor', ({ authorizator }) =>
|
|
74
75
|
new CreateEntityRelationAllowedOperationsVisitor(authorizator))
|
|
75
|
-
.addService('
|
|
76
|
-
|
|
76
|
+
.addService('connectOrCreateRelationInputProvider', ({ schema, whereTypeProvider, createEntityInputProviderAccessor }) =>
|
|
77
|
+
new ConnectOrCreateRelationInputProvider(schema, whereTypeProvider, createEntityInputProviderAccessor))
|
|
78
|
+
.addService('createEntityRelationInputFieldVisitor', ({ schema, whereTypeProvider, createEntityInputProviderAccessor, createEntityRelationAllowedOperationsVisitor, connectOrCreateRelationInputProvider }) =>
|
|
79
|
+
new CreateEntityRelationInputFieldVisitor(schema, whereTypeProvider, createEntityInputProviderAccessor, createEntityRelationAllowedOperationsVisitor, connectOrCreateRelationInputProvider))
|
|
77
80
|
.addService('createEntityRelationInputProvider', ({ schema, createEntityRelationInputFieldVisitor }) =>
|
|
78
81
|
new CreateEntityRelationInputProvider(schema, createEntityRelationInputFieldVisitor))
|
|
79
82
|
.addService('createEntityInputFieldVisitor', ({ schema, authorizator, columnTypeResolver, createEntityRelationInputProvider }) =>
|
|
@@ -84,8 +87,8 @@ export class GraphQlSchemaBuilderFactory {
|
|
|
84
87
|
new Accessor<EntityInputProvider<EntityInputType.update>>())
|
|
85
88
|
.addService('updateEntityRelationAllowedOperationsVisitor', ({ authorizator }) =>
|
|
86
89
|
new UpdateEntityRelationAllowedOperationsVisitor(authorizator))
|
|
87
|
-
.addService('updateEntityRelationInputFieldVisitor', ({ schema, authorizator, whereTypeProvider, updateEntityInputProviderAccessor, createEntityInputProvider, updateEntityRelationAllowedOperationsVisitor }) =>
|
|
88
|
-
new UpdateEntityRelationInputFieldVisitor(schema, authorizator, whereTypeProvider, updateEntityInputProviderAccessor, createEntityInputProvider, updateEntityRelationAllowedOperationsVisitor))
|
|
90
|
+
.addService('updateEntityRelationInputFieldVisitor', ({ schema, authorizator, whereTypeProvider, updateEntityInputProviderAccessor, createEntityInputProvider, updateEntityRelationAllowedOperationsVisitor, connectOrCreateRelationInputProvider }) =>
|
|
91
|
+
new UpdateEntityRelationInputFieldVisitor(schema, authorizator, whereTypeProvider, updateEntityInputProviderAccessor, createEntityInputProvider, updateEntityRelationAllowedOperationsVisitor, connectOrCreateRelationInputProvider))
|
|
89
92
|
.addService('updateEntityRelationInputProvider', ({ schema, updateEntityRelationInputFieldVisitor }) =>
|
|
90
93
|
new UpdateEntityRelationInputProvider(schema, updateEntityRelationInputFieldVisitor))
|
|
91
94
|
.addService('updateEntityInputFieldVisitor', ({ authorizator, columnTypeResolver, updateEntityRelationInputProvider }) =>
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
import { Accessor, Interface, singletonFactory } from '../../utils'
|
|
2
|
+
import { GraphQLInputObjectType } from 'graphql'
|
|
3
|
+
import { GqlTypeName } from '../utils'
|
|
4
|
+
import { WhereTypeProvider } from '../WhereTypeProvider'
|
|
5
|
+
import { EntityInputProvider, EntityInputType } from './EntityInputProvider'
|
|
6
|
+
import { Model } from '@contember/schema'
|
|
7
|
+
import { acceptFieldVisitor } from '@contember/schema-utils'
|
|
8
|
+
import { ImplementationException } from '../../exception'
|
|
9
|
+
|
|
10
|
+
type Args = {
|
|
11
|
+
entityName: string
|
|
12
|
+
relationName: string
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
export class ConnectOrCreateRelationInputProvider {
|
|
16
|
+
private inputs = singletonFactory<GraphQLInputObjectType, Args>(id => this.createInput(id.entityName, id.relationName))
|
|
17
|
+
|
|
18
|
+
constructor(
|
|
19
|
+
private readonly schema: Model.Schema,
|
|
20
|
+
private readonly whereTypeBuilder: WhereTypeProvider,
|
|
21
|
+
private readonly createEntityInputProviderAccessor: Accessor<Interface<EntityInputProvider<EntityInputType.create>>>,
|
|
22
|
+
) {
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
|
|
26
|
+
getInput(entityName: string, relationName: string) {
|
|
27
|
+
return this.inputs({ entityName, relationName })
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
private createInput(entityName: string, relationName: string) {
|
|
31
|
+
return acceptFieldVisitor<GraphQLInputObjectType>(this.schema, entityName, relationName, {
|
|
32
|
+
visitColumn() {
|
|
33
|
+
throw new ImplementationException()
|
|
34
|
+
},
|
|
35
|
+
visitRelation: ({ entity, targetEntity, targetRelation, relation }) => {
|
|
36
|
+
const uniqueWhere = this.whereTypeBuilder.getEntityUniqueWhereType(targetEntity.name)
|
|
37
|
+
const targetName = targetRelation ? targetRelation.name : undefined
|
|
38
|
+
const createInput = this.createEntityInputProviderAccessor.get().getInput(targetEntity.name, targetName)
|
|
39
|
+
if (!uniqueWhere || !createInput) {
|
|
40
|
+
throw new ImplementationException()
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
return new GraphQLInputObjectType({
|
|
44
|
+
name: GqlTypeName`${entity.name}ConnectOrCreate${relation.name}RelationInput`,
|
|
45
|
+
fields: () => ({
|
|
46
|
+
connect: { type: uniqueWhere },
|
|
47
|
+
create: { type: createInput },
|
|
48
|
+
}),
|
|
49
|
+
})
|
|
50
|
+
},
|
|
51
|
+
})
|
|
52
|
+
|
|
53
|
+
}
|
|
54
|
+
}
|
|
@@ -23,9 +23,7 @@ export class CreateEntityInputFieldVisitor implements
|
|
|
23
23
|
return undefined
|
|
24
24
|
}
|
|
25
25
|
const type = this.columnTypeResolver.getType(column)
|
|
26
|
-
return {
|
|
27
|
-
type,
|
|
28
|
-
}
|
|
26
|
+
return { type }
|
|
29
27
|
}
|
|
30
28
|
|
|
31
29
|
public visitHasOne({ entity, relation }: Model.AnyHasOneRelationContext): GraphQLInputFieldConfig | undefined {
|
|
@@ -33,9 +31,7 @@ export class CreateEntityInputFieldVisitor implements
|
|
|
33
31
|
if (type === undefined) {
|
|
34
32
|
return undefined
|
|
35
33
|
}
|
|
36
|
-
return {
|
|
37
|
-
type,
|
|
38
|
-
}
|
|
34
|
+
return { type }
|
|
39
35
|
}
|
|
40
36
|
|
|
41
37
|
public visitHasMany({ entity, relation }: Model.AnyHasManyRelationContext): GraphQLInputFieldConfig | undefined {
|
|
@@ -58,10 +58,12 @@ export class CreateEntityRelationAllowedOperationsVisitor implements
|
|
|
58
58
|
if (canReadTargetEntity && canCreateOwning) {
|
|
59
59
|
result.push(Input.CreateRelationOperation.connect)
|
|
60
60
|
}
|
|
61
|
-
|
|
62
61
|
if (canCreateTargetEntity && canCreateOwning) {
|
|
63
62
|
result.push(Input.CreateRelationOperation.create)
|
|
64
63
|
}
|
|
64
|
+
if (canReadTargetEntity && canCreateTargetEntity && canCreateOwning) {
|
|
65
|
+
result.push(Input.CreateRelationOperation.connectOrCreate)
|
|
66
|
+
}
|
|
65
67
|
|
|
66
68
|
return result
|
|
67
69
|
}
|
|
@@ -7,6 +7,7 @@ import { EntityInputProvider, EntityInputType } from './EntityInputProvider'
|
|
|
7
7
|
import { CreateEntityRelationAllowedOperationsVisitor } from './CreateEntityRelationAllowedOperationsVisitor'
|
|
8
8
|
import { acceptFieldVisitor } from '@contember/schema-utils'
|
|
9
9
|
import { ImplementationException } from '../../exception'
|
|
10
|
+
import { ConnectOrCreateRelationInputProvider } from './ConnectOrCreateRelationInputProvider'
|
|
10
11
|
|
|
11
12
|
export class CreateEntityRelationInputFieldVisitor implements
|
|
12
13
|
Model.ColumnVisitor<never>,
|
|
@@ -15,10 +16,9 @@ export class CreateEntityRelationInputFieldVisitor implements
|
|
|
15
16
|
constructor(
|
|
16
17
|
private readonly schema: Model.Schema,
|
|
17
18
|
private readonly whereTypeBuilder: WhereTypeProvider,
|
|
18
|
-
private readonly createEntityInputProviderAccessor: Accessor<
|
|
19
|
-
Interface<EntityInputProvider<EntityInputType.create>>
|
|
20
|
-
>,
|
|
19
|
+
private readonly createEntityInputProviderAccessor: Accessor<Interface<EntityInputProvider<EntityInputType.create>>>,
|
|
21
20
|
private readonly createEntityRelationAllowedOperationsVisitor: CreateEntityRelationAllowedOperationsVisitor,
|
|
21
|
+
private readonly connectOrCreateRelationInputProvider: ConnectOrCreateRelationInputProvider,
|
|
22
22
|
) {}
|
|
23
23
|
|
|
24
24
|
public visitColumn(): never {
|
|
@@ -46,12 +46,10 @@ export class CreateEntityRelationInputFieldVisitor implements
|
|
|
46
46
|
this.createEntityRelationAllowedOperationsVisitor,
|
|
47
47
|
)
|
|
48
48
|
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
type: uniqueWhere,
|
|
54
|
-
}
|
|
49
|
+
const uniqueWhere = this.whereTypeBuilder.getEntityUniqueWhereType(targetEntity.name)
|
|
50
|
+
if (allowedOperations.includes(Input.CreateRelationOperation.connect) && uniqueWhere) {
|
|
51
|
+
fields[Input.CreateRelationOperation.connect] = {
|
|
52
|
+
type: uniqueWhere,
|
|
55
53
|
}
|
|
56
54
|
}
|
|
57
55
|
|
|
@@ -61,18 +59,25 @@ export class CreateEntityRelationInputFieldVisitor implements
|
|
|
61
59
|
type: createInput,
|
|
62
60
|
}
|
|
63
61
|
}
|
|
62
|
+
if (allowedOperations.includes(Input.CreateRelationOperation.connectOrCreate) && uniqueWhere !== undefined && createInput !== undefined) {
|
|
63
|
+
const connectOrCreateInput = this.connectOrCreateRelationInputProvider.getInput(entity.name, relation.name)
|
|
64
|
+
if (connectOrCreateInput) {
|
|
65
|
+
fields[Input.CreateRelationOperation.connectOrCreate] = {
|
|
66
|
+
type: connectOrCreateInput,
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
}
|
|
64
70
|
if (Object.keys(fields).length === 0) {
|
|
65
71
|
return undefined
|
|
66
72
|
}
|
|
67
73
|
return new GraphQLInputObjectType({
|
|
68
74
|
name: GqlTypeName`${entity.name}Create${relation.name}EntityRelationInput`,
|
|
69
|
-
fields: () =>
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
alias: { type: GraphQLString },
|
|
75
|
+
fields: () => withAliasField
|
|
76
|
+
? {
|
|
77
|
+
...fields,
|
|
78
|
+
alias: { type: GraphQLString },
|
|
74
79
|
}
|
|
75
|
-
|
|
80
|
+
: fields,
|
|
76
81
|
})
|
|
77
82
|
}
|
|
78
83
|
}
|
|
@@ -38,9 +38,6 @@ export class EntityInputProvider<Operation extends EntityInputType> {
|
|
|
38
38
|
}
|
|
39
39
|
const entityName = entity.name
|
|
40
40
|
const withoutSuffix = withoutRelation ? GqlTypeName`Without${withoutRelation}` : ''
|
|
41
|
-
if (entity.view) {
|
|
42
|
-
return undefined
|
|
43
|
-
}
|
|
44
41
|
const operation: Acl.Operation = (() => {
|
|
45
42
|
switch (this.operation) {
|
|
46
43
|
case EntityInputType.create:
|
|
@@ -22,9 +22,7 @@ export class UpdateEntityInputFieldVisitor implements
|
|
|
22
22
|
return undefined
|
|
23
23
|
}
|
|
24
24
|
const type = this.columnTypeResolver.getType(column)
|
|
25
|
-
return {
|
|
26
|
-
type,
|
|
27
|
-
}
|
|
25
|
+
return { type }
|
|
28
26
|
}
|
|
29
27
|
|
|
30
28
|
public visitHasOne({ entity, relation }: Model.AnyHasOneRelationContext) {
|
|
@@ -32,9 +30,7 @@ export class UpdateEntityInputFieldVisitor implements
|
|
|
32
30
|
if (type === undefined) {
|
|
33
31
|
return undefined
|
|
34
32
|
}
|
|
35
|
-
return {
|
|
36
|
-
type,
|
|
37
|
-
}
|
|
33
|
+
return { type }
|
|
38
34
|
}
|
|
39
35
|
|
|
40
36
|
public visitHasMany({ entity, relation }: Model.AnyHasManyRelationContext) {
|
|
@@ -72,7 +72,6 @@ export class UpdateEntityRelationAllowedOperationsVisitor implements
|
|
|
72
72
|
result.push(Input.UpdateRelationOperation.connect)
|
|
73
73
|
result.push(Input.UpdateRelationOperation.disconnect)
|
|
74
74
|
}
|
|
75
|
-
|
|
76
75
|
if (canCreateTargetEntity && canUpdateOwningRelation) {
|
|
77
76
|
result.push(Input.UpdateRelationOperation.create)
|
|
78
77
|
}
|
|
@@ -85,6 +84,9 @@ export class UpdateEntityRelationAllowedOperationsVisitor implements
|
|
|
85
84
|
if (canDeleteTargetEntity && canUpdateOwningRelation) {
|
|
86
85
|
result.push(Input.UpdateRelationOperation.delete)
|
|
87
86
|
}
|
|
87
|
+
if (canReadTargetEntity && canUpdateOwningRelation && canCreateTargetEntity) {
|
|
88
|
+
result.push(Input.UpdateRelationOperation.connectOrCreate)
|
|
89
|
+
}
|
|
88
90
|
|
|
89
91
|
return result
|
|
90
92
|
}
|
|
@@ -14,9 +14,9 @@ import { acceptFieldVisitor } from '@contember/schema-utils'
|
|
|
14
14
|
import { UpdateEntityRelationAllowedOperationsVisitor } from './UpdateEntityRelationAllowedOperationsVisitor'
|
|
15
15
|
import { Authorizator } from '../../acl'
|
|
16
16
|
import { ImplementationException } from '../../exception'
|
|
17
|
+
import { ConnectOrCreateRelationInputProvider } from './ConnectOrCreateRelationInputProvider'
|
|
17
18
|
|
|
18
|
-
export class UpdateEntityRelationInputFieldVisitor implements
|
|
19
|
-
Model.ColumnVisitor<never>,
|
|
19
|
+
export class UpdateEntityRelationInputFieldVisitor implements Model.ColumnVisitor<never>,
|
|
20
20
|
Model.RelationByGenericTypeVisitor<GraphQLInputObjectType | undefined> {
|
|
21
21
|
|
|
22
22
|
constructor(
|
|
@@ -26,7 +26,9 @@ export class UpdateEntityRelationInputFieldVisitor implements
|
|
|
26
26
|
private readonly updateEntityInputProviderAccessor: Accessor<EntityInputProvider<EntityInputType.update>>,
|
|
27
27
|
private readonly createEntityInputProvider: EntityInputProvider<EntityInputType.create>,
|
|
28
28
|
private readonly updateEntityRelationAllowedOperationsVisitor: UpdateEntityRelationAllowedOperationsVisitor,
|
|
29
|
-
|
|
29
|
+
private readonly connectOrCreateRelationInputProvider: ConnectOrCreateRelationInputProvider,
|
|
30
|
+
) {
|
|
31
|
+
}
|
|
30
32
|
|
|
31
33
|
public visitColumn(): never {
|
|
32
34
|
throw new Error('UpdateEntityRelationInputFieldVisitor: Not applicable for a column')
|
|
@@ -36,39 +38,39 @@ export class UpdateEntityRelationInputFieldVisitor implements
|
|
|
36
38
|
const withoutRelation = targetRelation ? targetRelation.name : undefined
|
|
37
39
|
|
|
38
40
|
const whereInput = this.createWhereInput(targetEntity)
|
|
41
|
+
|
|
39
42
|
const createInputType = this.createEntityInputProvider.getInput(targetEntity.name, withoutRelation)
|
|
40
|
-
const createInput = createInputType
|
|
41
|
-
|
|
42
|
-
type: createInputType,
|
|
43
|
-
}
|
|
44
|
-
: undefined
|
|
43
|
+
const createInput = createInputType ? { type: createInputType } : undefined
|
|
44
|
+
|
|
45
45
|
const updateInputType = this.updateEntityInputProviderAccessor.get().getInput(targetEntity.name, withoutRelation)
|
|
46
|
-
const updateInput = updateInputType
|
|
46
|
+
const updateInput = updateInputType ? { type: updateInputType } : undefined
|
|
47
|
+
|
|
48
|
+
const upsertInput = updateInput && createInput
|
|
47
49
|
? {
|
|
48
|
-
type:
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
? {
|
|
54
|
-
type: new GraphQLInputObjectType({
|
|
55
|
-
name: GqlTypeName`${entity.name}Upsert${relation.name}RelationInput`,
|
|
56
|
-
fields: () => ({
|
|
57
|
-
update: updateInput,
|
|
58
|
-
create: createInput,
|
|
59
|
-
}),
|
|
50
|
+
type: new GraphQLInputObjectType({
|
|
51
|
+
name: GqlTypeName`${entity.name}Upsert${relation.name}RelationInput`,
|
|
52
|
+
fields: () => ({
|
|
53
|
+
update: updateInput,
|
|
54
|
+
create: createInput,
|
|
60
55
|
}),
|
|
61
|
-
|
|
62
|
-
|
|
56
|
+
}),
|
|
57
|
+
}
|
|
58
|
+
: undefined
|
|
59
|
+
|
|
63
60
|
const booleanInput = {
|
|
64
61
|
type: GraphQLBoolean,
|
|
65
62
|
}
|
|
66
63
|
|
|
64
|
+
const connectOrCreateInput = createInput && whereInput
|
|
65
|
+
? { type: this.connectOrCreateRelationInputProvider.getInput(entity.name, relation.name) }
|
|
66
|
+
: undefined
|
|
67
|
+
|
|
67
68
|
const fields = {
|
|
69
|
+
[Input.UpdateRelationOperation.connect]: whereInput,
|
|
68
70
|
[Input.UpdateRelationOperation.create]: createInput,
|
|
71
|
+
[Input.UpdateRelationOperation.connectOrCreate]: connectOrCreateInput,
|
|
69
72
|
[Input.UpdateRelationOperation.update]: updateInput,
|
|
70
73
|
[Input.UpdateRelationOperation.upsert]: upsertInput,
|
|
71
|
-
[Input.UpdateRelationOperation.connect]: whereInput,
|
|
72
74
|
[Input.UpdateRelationOperation.disconnect]: booleanInput,
|
|
73
75
|
[Input.UpdateRelationOperation.delete]: booleanInput,
|
|
74
76
|
}
|
|
@@ -88,45 +90,37 @@ export class UpdateEntityRelationInputFieldVisitor implements
|
|
|
88
90
|
const withoutRelation = targetRelation ? targetRelation.name : undefined
|
|
89
91
|
|
|
90
92
|
const whereInput = this.createWhereInput(targetEntity)
|
|
93
|
+
|
|
91
94
|
const createInputType = this.createEntityInputProvider.getInput(targetEntity.name, withoutRelation)
|
|
92
|
-
const createInput = createInputType
|
|
93
|
-
|
|
94
|
-
type: createInputType,
|
|
95
|
-
}
|
|
96
|
-
: undefined
|
|
95
|
+
const createInput = createInputType ? { type: createInputType } : undefined
|
|
96
|
+
|
|
97
97
|
const updateInputType = this.updateEntityInputProviderAccessor.get().getInput(targetEntity.name, withoutRelation)
|
|
98
|
-
const updateInput = updateInputType
|
|
98
|
+
const updateInput = updateInputType ? { type: updateInputType } : undefined
|
|
99
|
+
|
|
100
|
+
const updateSpecifiedInput = updateInput && whereInput
|
|
99
101
|
? {
|
|
100
|
-
type:
|
|
101
|
-
|
|
102
|
+
type: new GraphQLInputObjectType({
|
|
103
|
+
name: GqlTypeName`${entity.name}Update${relation.name}RelationInput`,
|
|
104
|
+
fields: () => ({
|
|
105
|
+
by: whereInput,
|
|
106
|
+
data: updateInput,
|
|
107
|
+
}),
|
|
108
|
+
}),
|
|
109
|
+
}
|
|
102
110
|
: undefined
|
|
103
111
|
|
|
104
|
-
const
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
}),
|
|
113
|
-
}),
|
|
114
|
-
}
|
|
115
|
-
: undefined
|
|
116
|
-
|
|
117
|
-
const upsertInput =
|
|
118
|
-
updateInput && createInput && whereInput
|
|
119
|
-
? {
|
|
120
|
-
type: new GraphQLInputObjectType({
|
|
121
|
-
name: GqlTypeName`${entity.name}Upsert${relation.name}RelationInput`,
|
|
122
|
-
fields: () => ({
|
|
123
|
-
by: whereInput,
|
|
124
|
-
update: updateInput,
|
|
125
|
-
create: createInput,
|
|
126
|
-
}),
|
|
112
|
+
const upsertInput = updateInput && createInput && whereInput
|
|
113
|
+
? {
|
|
114
|
+
type: new GraphQLInputObjectType({
|
|
115
|
+
name: GqlTypeName`${entity.name}Upsert${relation.name}RelationInput`,
|
|
116
|
+
fields: () => ({
|
|
117
|
+
by: whereInput,
|
|
118
|
+
update: updateInput,
|
|
119
|
+
create: createInput,
|
|
127
120
|
}),
|
|
128
|
-
|
|
129
|
-
|
|
121
|
+
}),
|
|
122
|
+
}
|
|
123
|
+
: undefined
|
|
130
124
|
|
|
131
125
|
const fields = {
|
|
132
126
|
[Input.UpdateRelationOperation.create]: createInput,
|
|
@@ -136,6 +130,7 @@ export class UpdateEntityRelationInputFieldVisitor implements
|
|
|
136
130
|
[Input.UpdateRelationOperation.disconnect]: whereInput,
|
|
137
131
|
[Input.UpdateRelationOperation.delete]: whereInput,
|
|
138
132
|
}
|
|
133
|
+
|
|
139
134
|
const filteredFields = this.filterAllowedOperations(entity, relation, fields)
|
|
140
135
|
if (Object.keys(filteredFields).length === 0) {
|
|
141
136
|
return undefined
|
|
@@ -60,10 +60,10 @@ test('delete without deferring constraints', async () => {
|
|
|
60
60
|
return: {
|
|
61
61
|
transaction: {
|
|
62
62
|
ok: false,
|
|
63
|
-
errorMessage: 'Execution has failed:\nupdatePost.attachments.0: ForeignKeyConstraintViolation (Cannot delete
|
|
63
|
+
errorMessage: 'Execution has failed:\nupdatePost.attachments.0: ForeignKeyConstraintViolation (Cannot delete 123e4567-e89b-12d3-a456-000000000002 row(s) of entity Attachment, because it is still referenced from 123e4567-e89b-12d3-a456-000000000003 row(s) of entity Reference in relation attachment. OnDelete behaviour of this relation is set to "restrict". You might consider changing it to "setNull" or "cascade".)',
|
|
64
64
|
updatePost: {
|
|
65
65
|
ok: false,
|
|
66
|
-
errorMessage: 'Execution has failed:\nattachments.0: ForeignKeyConstraintViolation (Cannot delete
|
|
66
|
+
errorMessage: 'Execution has failed:\nattachments.0: ForeignKeyConstraintViolation (Cannot delete 123e4567-e89b-12d3-a456-000000000002 row(s) of entity Attachment, because it is still referenced from 123e4567-e89b-12d3-a456-000000000003 row(s) of entity Reference in relation attachment. OnDelete behaviour of this relation is set to "restrict". You might consider changing it to "setNull" or "cascade".)',
|
|
67
67
|
},
|
|
68
68
|
},
|
|
69
69
|
},
|
|
@@ -37,7 +37,7 @@ test('fails when deleting entity without proper cascade', async () => {
|
|
|
37
37
|
}`,
|
|
38
38
|
return: {
|
|
39
39
|
deletePost: {
|
|
40
|
-
errorMessage: 'Execution has failed:\nunknown field: ForeignKeyConstraintViolation (Cannot delete
|
|
40
|
+
errorMessage: 'Execution has failed:\nunknown field: ForeignKeyConstraintViolation (Cannot delete 123e4567-e89b-12d3-a456-000000000001 row(s) of entity Post, because it is still referenced from 123e4567-e89b-12d3-a456-000000000002 row(s) of entity PostLocales in relation post. OnDelete behaviour of this relation is set to "restrict". You might consider changing it to "setNull" or "cascade".)',
|
|
41
41
|
node: null,
|
|
42
42
|
},
|
|
43
43
|
},
|