Skip to content

Commit

Permalink
Merge pull request prisma#4266 from prisma/CascadingDeleteValidationF…
Browse files Browse the repository at this point in the history
…orMongo

Mongo Cascading Delete Validation
  • Loading branch information
do4gr authored Mar 27, 2019
2 parents 3a9926f + 453f1bf commit a1d0f84
Show file tree
Hide file tree
Showing 3 changed files with 42 additions and 1 deletion.
Original file line number Diff line number Diff line change
Expand Up @@ -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,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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] = {
Expand Down Expand Up @@ -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
} yield {
DeployErrors.cascadeUsedWithMongo(relationField)
}
}

private def validateIfProvidedStrategiesAreSupported(dataModel: PrismaSdl, capabilities: ConnectorCapabilities): Vector[DeployError] = {
for {
modelType <- dataModel.modelTypes
Expand Down
Original file line number Diff line number Diff line change
@@ -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._
Expand Down Expand Up @@ -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.")
}
}

0 comments on commit a1d0f84

Please sign in to comment.