Skip to content
This repository has been archived by the owner on Sep 2, 2022. It is now read-only.

Commit

Permalink
Merge pull request #2334 from graphcool/UpdatingRelations
Browse files Browse the repository at this point in the history
Add validations and extra warnings to deploy when updating relations
  • Loading branch information
sorenbs authored May 6, 2018
2 parents 202953b + 204e0ff commit 762da0c
Show file tree
Hide file tree
Showing 23 changed files with 872 additions and 80 deletions.
10 changes: 7 additions & 3 deletions server/.buildkite/pipeline.sh
Original file line number Diff line number Diff line change
Expand Up @@ -9,18 +9,25 @@ static=$(printf " - label: \":mysql: MySql API connector\"
- label: \":mysql: MySql deploy connector\"
command: cd server && ./.buildkite/scripts/test.sh deploy-connector-mysql mysql
- label: \":scala: integration-tests-mysql\"
command: cd server && ./.buildkite/scripts/test.sh integration-tests-mysql mysql
- label: \":postgres: Postgres API connector\"
command: cd server && ./.buildkite/scripts/test.sh api-connector-postgresql postgres
- label: \":postgres: Postgres deploy connector\"
command: cd server && ./.buildkite/scripts/test.sh deploy-connector-postgresql postgres
#- label: \":scala: integration-tests-postgres\"
# command: cd server && ./.buildkite/scripts/test.sh integration-tests-mysql postgres
# Libs are not specific to a connector, simply run with mysql
- label: \":scala: libs\"
command: cd server && ./.buildkite/scripts/test.sh libs mysql
- label: \":scala: subscriptions\"
command: cd server && ./.buildkite/scripts/test.sh subscriptions mysql
")

optional=""
Expand Down Expand Up @@ -67,9 +74,6 @@ do
- label: \":scala: workers [$connector]\"
command: cd server && ./.buildkite/scripts/test.sh workers $connector
- label: \":scala: integration-tests [$connector]\"
command: cd server && ./.buildkite/scripts/test.sh integrationTests $connector
")

done
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
package com.prisma.deploy.connector.mysql.database

import com.prisma.shared.models.RelationSide.RelationSide
import com.prisma.shared.models.{Field, Model}
import slick.jdbc.MySQLProfile.api._
import slick.jdbc.{PositionedParameters, SQLActionBuilder}
Expand All @@ -14,6 +15,10 @@ object MysqlDeployDatabaseQueryBuilder {
sql"select exists (select `id` from `#$projectId`.`#$relationTableName`)"
}

def existsDuplicateByRelationAndSide(projectId: String, relationTableName: String, relationSide: RelationSide): SQLActionBuilder = {
sql"select exists (select Count(*)from `#$projectId`.`#$relationTableName` Group by `#${relationSide.toString}` having Count(*) > 1)"
}

def existsNullByModelAndScalarField(projectId: String, modelName: String, fieldName: String) = {
sql"""SELECT EXISTS(Select `id` FROM `#$projectId`.`#$modelName`
WHERE `#$projectId`.`#$modelName`.#$fieldName IS NULL)"""
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ package com.prisma.deploy.connector.mysql.impls

import com.prisma.deploy.connector.ClientDbQueries
import com.prisma.deploy.connector.mysql.database.MysqlDeployDatabaseQueryBuilder
import com.prisma.shared.models.RelationSide.RelationSide
import com.prisma.shared.models.{Field, Model, Project}
import slick.dbio.Effect.Read
import slick.jdbc.MySQLProfile.api._
Expand All @@ -22,6 +23,11 @@ case class MysqlClientDbQueries(project: Project, clientDatabase: Database)(impl
clientDatabase.run(readOnlyBoolean(query)).map(_.head).recover { case _: java.sql.SQLSyntaxErrorException => false }
}

def existsDuplicateByRelationAndSide(relationId: String, relationSide: RelationSide): Future[Boolean] = {
val query = MysqlDeployDatabaseQueryBuilder.existsDuplicateByRelationAndSide(project.id, relationId, relationSide)
clientDatabase.run(readOnlyBoolean(query)).map(_.head).recover { case _: java.sql.SQLSyntaxErrorException => false }
}

def existsNullByModelAndField(model: Model, field: Field): Future[Boolean] = {
val query = field.isScalar match {
case true => MysqlDeployDatabaseQueryBuilder.existsNullByModelAndScalarField(project.id, model.name, field.name)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ package com.prisma.deploy.connector.postgresql
import com.prisma.config.DatabaseConfig
import com.prisma.deploy.connector._
import com.prisma.deploy.connector.postgresql.database.{InternalDatabaseSchema, PostgresDeployDatabaseMutationBuilder, TelemetryTable}
import com.prisma.deploy.connector.postgresql.impls.{ClientDbQueriesImpl, DeployMutactionExecutorImpl, MigrationPersistenceImpl, ProjectPersistenceImpl}
import com.prisma.deploy.connector.postgresql.impls.{PostgresClientDbQueries, PostgresDeployMutactionExecutor, MigrationPersistenceImpl, ProjectPersistenceImpl}
import com.prisma.shared.models.{Project, ProjectIdEncoder}
import org.joda.time.DateTime
import slick.dbio.Effect.Read
Expand All @@ -19,7 +19,7 @@ case class PostgresDeployConnector(dbConfig: DatabaseConfig)(implicit ec: Execut

override lazy val projectPersistence: ProjectPersistence = ProjectPersistenceImpl(internalDatabase)
override lazy val migrationPersistence: MigrationPersistence = MigrationPersistenceImpl(internalDatabase)
override lazy val deployMutactionExecutor: DeployMutactionExecutor = DeployMutactionExecutorImpl(internalDatabaseRoot)
override lazy val deployMutactionExecutor: DeployMutactionExecutor = PostgresDeployMutactionExecutor(internalDatabaseRoot)

override def createProjectDatabase(id: String): Future[Unit] = {
val action = PostgresDeployDatabaseMutationBuilder.createClientDatabaseForProject(projectId = id)
Expand All @@ -46,7 +46,7 @@ case class PostgresDeployConnector(dbConfig: DatabaseConfig)(implicit ec: Execut
internalDatabaseRoot.run(action)
}

override def clientDBQueries(project: Project): ClientDbQueries = ClientDbQueriesImpl(project, internalDatabaseRoot)
override def clientDBQueries(project: Project): ClientDbQueries = PostgresClientDbQueries(project, internalDatabaseRoot)
override def getOrCreateTelemetryInfo(): Future[TelemetryInfo] = internalDatabase.run(TelemetryTable.getOrCreateInfo())
override def updateTelemetryInfo(lastPinged: DateTime): Future[Unit] = internalDatabase.run(TelemetryTable.updateInfo(lastPinged)).map(_ => ())
override def projectIdEncoder: ProjectIdEncoder = ProjectIdEncoder('$')
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
package com.prisma.deploy.connector.postgresql.database

import com.prisma.shared.models.RelationSide.RelationSide
import com.prisma.shared.models.{Field, Model}
import slick.jdbc.PostgresProfile.api._
import slick.jdbc.{PositionedParameters, SQLActionBuilder}
Expand All @@ -14,6 +15,10 @@ object PostgresDeployDatabaseQueryBuilder {
sql"""select exists (select "id" from "#$projectId"."#$relationId")"""
}

def existsDuplicateByRelationAndSide(projectId: String, relationTableName: String, relationSide: RelationSide): SQLActionBuilder = {
sql"""select exists (select Count(*)from "#$projectId"."#$relationTableName" Group by "${relationSide.toString}" having Count(*) > 1)"""
}

def existsNullByModelAndScalarField(projectId: String, modelName: String, fieldName: String) = {
sql"""SELECT EXISTS(Select "id" FROM "#$projectId"."#$modelName"
WHERE "#$projectId"."#$modelName".#$fieldName IS NULL)"""
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ package com.prisma.deploy.connector.postgresql.impls

import com.prisma.deploy.connector.ClientDbQueries
import com.prisma.deploy.connector.postgresql.database.PostgresDeployDatabaseQueryBuilder
import com.prisma.shared.models.RelationSide.RelationSide
import com.prisma.shared.models.{Field, Model, Project}
import slick.dbio.Effect.Read
import slick.jdbc.PostgresProfile.api._
Expand All @@ -10,13 +11,18 @@ import slick.sql.SqlStreamingAction

import scala.concurrent.{ExecutionContext, Future}

case class ClientDbQueriesImpl(project: Project, clientDatabase: Database)(implicit ec: ExecutionContext) extends ClientDbQueries {
case class PostgresClientDbQueries(project: Project, clientDatabase: Database)(implicit ec: ExecutionContext) extends ClientDbQueries {

def existsByModel(modelName: String): Future[Boolean] = {
val query = PostgresDeployDatabaseQueryBuilder.existsByModel(project.id, modelName)
clientDatabase.run(readOnlyBoolean(query)).map(_.head).recover { case _: java.sql.SQLSyntaxErrorException => false }
}

def existsDuplicateByRelationAndSide(relationId: String, relationSide: RelationSide): Future[Boolean] = {
val query = PostgresDeployDatabaseQueryBuilder.existsDuplicateByRelationAndSide(project.id, relationId, relationSide)
clientDatabase.run(readOnlyBoolean(query)).map(_.head).recover { case _: java.sql.SQLSyntaxErrorException => false }
}

def existsByRelation(relationId: String): Future[Boolean] = {
val query = PostgresDeployDatabaseQueryBuilder.existsByRelation(project.id, relationId)
clientDatabase.run(readOnlyBoolean(query)).map(_.head).recover { case _: java.sql.SQLSyntaxErrorException => false }
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ import slick.jdbc.PostgresProfile.api._

import scala.concurrent.{ExecutionContext, Future}

case class DeployMutactionExecutorImpl(
case class PostgresDeployMutactionExecutor(
database: Database
)(implicit ec: ExecutionContext)
extends DeployMutactionExecutor {
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
package com.prisma.deploy.connector

import com.prisma.shared.models.RelationSide.RelationSide
import org.joda.time.DateTime
import com.prisma.shared.models.{Field, Model, Project, ProjectIdEncoder}

Expand Down Expand Up @@ -31,6 +32,7 @@ case class TelemetryInfo(id: String, lastPing: Option[DateTime])
trait ClientDbQueries {
def existsByModel(modelName: String): Future[Boolean]
def existsByRelation(relationId: String): Future[Boolean]
def existsDuplicateByRelationAndSide(relationId: String, side: RelationSide): Future[Boolean]
def existsNullByModelAndField(model: Model, field: Field): Future[Boolean]
def enumValueIsInUse(models: Vector[Model], enumName: String, value: String): Future[Boolean]
}
Loading

0 comments on commit 762da0c

Please sign in to comment.