From 568bba09ca2c43358eb0c60c59ed28273183190e Mon Sep 17 00:00:00 2001 From: do4gr Date: Wed, 27 Mar 2019 12:31:37 +0100 Subject: [PATCH 1/2] error during datamodel validation if Mongo defines onDelete argument --- .../migration/validation/DeployResults.scala | 8 +++++++ .../directives/RelationDirective.scala | 14 ++++++++++++- .../GeneralDataModelValidatorSpec.scala | 21 +++++++++++++++++++ 3 files changed, 42 insertions(+), 1 deletion(-) diff --git a/server/servers/deploy/src/main/scala/com/prisma/deploy/migration/validation/DeployResults.scala b/server/servers/deploy/src/main/scala/com/prisma/deploy/migration/validation/DeployResults.scala index 5d1c1b80fc..931e693bb4 100644 --- a/server/servers/deploy/src/main/scala/com/prisma/deploy/migration/validation/DeployResults.scala +++ b/server/servers/deploy/src/main/scala/com/prisma/deploy/migration/validation/DeployResults.scala @@ -52,6 +52,14 @@ object DeployErrors { ) } + def cascadeUsedWithMongo(relationField: RelationalPrismaField): DeployError = { + DeployError( + relationField.tpe.name, + relationField.name, + s"The Mongo connector currently does not support Cascading Deletes, but the field `${relationField.name}` defines cascade behaviour. Please remove the onDelete argument.}" + ) + } + def missingBackRelationField(tpe: PrismaType, relationField: RelationalPrismaField): DeployError = { DeployError( tpe.name, diff --git a/server/servers/deploy/src/main/scala/com/prisma/deploy/migration/validation/directives/RelationDirective.scala b/server/servers/deploy/src/main/scala/com/prisma/deploy/migration/validation/directives/RelationDirective.scala index d038cd459b..82c0db9861 100644 --- a/server/servers/deploy/src/main/scala/com/prisma/deploy/migration/validation/directives/RelationDirective.scala +++ b/server/servers/deploy/src/main/scala/com/prisma/deploy/migration/validation/directives/RelationDirective.scala @@ -41,7 +41,8 @@ object RelationDirective extends FieldDirective[RelationDirectiveData] { validateIfRequiredStrategyIsProvided(dataModel, capabilities) ++ validateBackRelationFields(dataModel, capabilities) ++ validateStrategyIsProvidedExactlyOnce(dataModel, capabilities) ++ - validateIfProvidedStrategiesAreSupported(dataModel, capabilities) + validateIfProvidedStrategiesAreSupported(dataModel, capabilities) ++ + validateIfOnDeleteIsUsedByMongo(dataModel, capabilities) } private def validateBackRelationFields(dataModel: PrismaSdl, capabilities: ConnectorCapabilities): Vector[DeployError] = { @@ -85,6 +86,17 @@ object RelationDirective extends FieldDirective[RelationDirectiveData] { } } + private def validateIfOnDeleteIsUsedByMongo(dataModel: PrismaSdl, capabilities: ConnectorCapabilities): Vector[DeployError] = { + for { + modelType <- dataModel.modelTypes + relationField <- modelType.relationFields + cascade = relationField.cascade + if capabilities.isMongo && (cascade == OnDelete.Cascade || cascade == OnDelete.SetNull) + } yield { + DeployErrors.cascadeUsedWithMongo(relationField) + } + } + private def validateIfProvidedStrategiesAreSupported(dataModel: PrismaSdl, capabilities: ConnectorCapabilities): Vector[DeployError] = { for { modelType <- dataModel.modelTypes diff --git a/server/servers/deploy/src/test/scala/com/prisma/deploy/migration/validation/GeneralDataModelValidatorSpec.scala b/server/servers/deploy/src/test/scala/com/prisma/deploy/migration/validation/GeneralDataModelValidatorSpec.scala index 5c9b7d4d13..c910f091c4 100644 --- a/server/servers/deploy/src/test/scala/com/prisma/deploy/migration/validation/GeneralDataModelValidatorSpec.scala +++ b/server/servers/deploy/src/test/scala/com/prisma/deploy/migration/validation/GeneralDataModelValidatorSpec.scala @@ -1,5 +1,6 @@ package com.prisma.deploy.migration.validation +import com.prisma.{IgnoreMySql, IgnorePostgres, IgnoreSQLite} import com.prisma.deploy.specutils.DeploySpecBase import com.prisma.gc_values.{EnumGCValue, StringGCValue} import com.prisma.shared.models.ConnectorCapability._ @@ -224,4 +225,24 @@ class GeneralDataModelValidatorSpec extends WordSpecLike with Matchers with Depl val enum = dataModel.enum_!("Status") enum.values should equal(Vector("A", "B")) } + + "fail if a Mongo is using onDelete" taggedAs (IgnoreSQLite, IgnorePostgres, IgnoreMySql) in { + val dataModelString = + """ + |type Test { + | id: ID! @id + | b: B @relation(name:"Test", onDelete: CASCADE) + |} + | + |type B { + | id: ID! @id + |} + """.stripMargin + val errors = validateThatMustError(dataModelString, Set(EmbeddedTypesCapability)) + val error1 = errors.head + error1.`type` should equal("Test") + error1.field should equal(Some("b")) + error1.description should include( + s"The Mongo connector currently does not support Cascading Deletes, but the field `b` defines cascade behaviour. Please remove the onDelete argument.") + } } From 453f1bf738ab4e43d64511537e0858dd4a23d4af Mon Sep 17 00:00:00 2001 From: do4gr Date: Wed, 27 Mar 2019 13:25:43 +0100 Subject: [PATCH 2/2] allow set null --- .../migration/validation/directives/RelationDirective.scala | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/server/servers/deploy/src/main/scala/com/prisma/deploy/migration/validation/directives/RelationDirective.scala b/server/servers/deploy/src/main/scala/com/prisma/deploy/migration/validation/directives/RelationDirective.scala index 82c0db9861..e610d0225f 100644 --- a/server/servers/deploy/src/main/scala/com/prisma/deploy/migration/validation/directives/RelationDirective.scala +++ b/server/servers/deploy/src/main/scala/com/prisma/deploy/migration/validation/directives/RelationDirective.scala @@ -91,7 +91,7 @@ object RelationDirective extends FieldDirective[RelationDirectiveData] { modelType <- dataModel.modelTypes relationField <- modelType.relationFields cascade = relationField.cascade - if capabilities.isMongo && (cascade == OnDelete.Cascade || cascade == OnDelete.SetNull) + if capabilities.isMongo && cascade == OnDelete.Cascade } yield { DeployErrors.cascadeUsedWithMongo(relationField) }