app/models/MatrixDeleteData.scala (69 lines of code) (raw):
package models
import play.api.Logger
import slick.jdbc.PostgresProfile.api._
import play.api.libs.functional.syntax._
import play.api.libs.json._
import slick.lifted.TableQuery
import scala.concurrent.Future
import scala.util.{Failure, Success, Try}
import scala.concurrent.ExecutionContext.Implicits.global
case class MatrixDeleteDataDAO(id: Option[Int], projectEntry:Int, item: String) extends PlutoModel {
val logger = Logger(getClass)
def save(implicit db:slick.jdbc.PostgresProfile#Backend#Database):Future[Try[MatrixDeleteDataDAO]] = id match {
case None=>
val insertQuery = TableQuery[MatrixDeleteData] returning TableQuery[MatrixDeleteData].map(_.id) into ((item,id)=>item.copy(id=Some(id)))
db.run(
(insertQuery+=this).asTry
).map({
case Success(insertResult)=>Success(insertResult)
case Failure(error)=>
logger.error(s"Inserting record failed due to: $error")
Failure(error)
})
case Some(realEntityId)=>
db.run(
TableQuery[MatrixDeleteData].filter(_.id===realEntityId).update(this).asTry
).map({
case Success(rowsAffected)=>Success(this)
case Failure(error)=>
logger.error(s"Updating record failed due to: $error")
Failure(error)
})
}
}
object MatrixDeleteDataDAO extends ((Option[Int], Int, String)=>MatrixDeleteDataDAO) {
private val logger = Logger(getClass)
def getOrCreate(projectId: Int, item: String)(implicit db: slick.jdbc.PostgresProfile#Backend#Database): Future[Try[MatrixDeleteDataDAO]] =
db.run(
TableQuery[MatrixDeleteData].filter(_.projectEntry === projectId).filter(_.item === item).result
).map(_.headOption).flatMap({
case Some(entry) => Future(Success(entry))
val updateJob = MatrixDeleteDataDAO(entry.id, projectId, item)
updateJob.save
case None =>
val newJob = MatrixDeleteDataDAO(None, projectId, item)
newJob.save
})
def itemsForProject(projectId: Int)(implicit db:slick.jdbc.PostgresProfile#Backend#Database) =
db.run(
TableQuery[MatrixDeleteData].filter(_.projectEntry === projectId).sortBy(_.item.asc).result.asTry
)
}
class MatrixDeleteData(tag: Tag) extends Table[MatrixDeleteDataDAO](tag, "MatrixDeleteData") {
def id=column[Int]("id",O.PrimaryKey,O.AutoInc)
def projectEntry = column[Int]("k_project_entry")
def item = column[String]("s_item")
def * = (id.?, projectEntry, item) <> (MatrixDeleteDataDAO.tupled, MatrixDeleteDataDAO.unapply)
}
trait MatrixDeleteDataSerializer {
implicit val defaultsWrites:Writes[MatrixDeleteDataDAO] = (
(JsPath \ "id").writeNullable[Int] and
(JsPath \ "projectEntry").write[Int] and
(JsPath \ "item").write[String]
)(unlift(MatrixDeleteDataDAO.unapply))
implicit val defaultsReads:Reads[MatrixDeleteDataDAO] = (
(JsPath \ "id").readNullable[Int] and
(JsPath \ "projectEntry").read[Int] and
(JsPath \ "item").read[String]
)(MatrixDeleteDataDAO.apply _)
}