aboutsummaryrefslogtreecommitdiff
path: root/src/main/scala/xyz/driver/pdsuicommon/synchronization/db/SlickDbAction.scala
diff options
context:
space:
mode:
authorkseniya <ktomskih@datamonsters.co>2017-09-20 17:58:19 +0700
committerkseniya <ktomskih@datamonsters.co>2017-09-20 17:58:19 +0700
commitd82c93fef0fc0bb937220334f73c264fbb1082f2 (patch)
tree44e957d95b0d5a9c9edcbd84e9e005bc89d95264 /src/main/scala/xyz/driver/pdsuicommon/synchronization/db/SlickDbAction.scala
parentb9f3ab180253c346664f4f38b418dc96f54bdc31 (diff)
downloadrest-query-d82c93fef0fc0bb937220334f73c264fbb1082f2.tar.gz
rest-query-d82c93fef0fc0bb937220334f73c264fbb1082f2.tar.bz2
rest-query-d82c93fef0fc0bb937220334f73c264fbb1082f2.zip
Common code for synchronizers
Diffstat (limited to 'src/main/scala/xyz/driver/pdsuicommon/synchronization/db/SlickDbAction.scala')
-rw-r--r--src/main/scala/xyz/driver/pdsuicommon/synchronization/db/SlickDbAction.scala70
1 files changed, 70 insertions, 0 deletions
diff --git a/src/main/scala/xyz/driver/pdsuicommon/synchronization/db/SlickDbAction.scala b/src/main/scala/xyz/driver/pdsuicommon/synchronization/db/SlickDbAction.scala
new file mode 100644
index 0000000..57cc3d4
--- /dev/null
+++ b/src/main/scala/xyz/driver/pdsuicommon/synchronization/db/SlickDbAction.scala
@@ -0,0 +1,70 @@
+package xyz.driver.pdsuicommon.synchronization.db
+
+import slick.dbio.DBIO
+import xyz.driver.pdsuicommon.logging._
+import xyz.driver.pdsuicommon.synchronization.utils.{FakeIdGen, FakeIdMap}
+
+import scala.concurrent.ExecutionContext
+import scalaz.Monad
+
+trait SlickDbAction[+T] {
+ def entity: T
+}
+
+object SlickDbAction {
+
+ final case class Create[T](entity: T) extends SlickDbAction[T]
+ final case class Update[T](entity: T) extends SlickDbAction[T]
+ final case class Delete[T](entity: T) extends SlickDbAction[T]
+
+ // Use it only inside of a transaction!
+ def unsafeRun[T](actions: List[SlickDbAction[T]], dataSource: SlickDataSource[T])(
+ implicit core: FakeIdGen[T],
+ executionContext: ExecutionContext,
+ dbioMonad: Monad[DBIO]): DBIO[FakeIdMap[T]] = {
+ unsafeRun(DBIO.successful(FakeIdMap.empty))(actions, dataSource)
+ }
+
+ // Use it only inside of a transaction!
+ def unsafeRun[T](initial: DBIO[FakeIdMap[T]])(actions: List[SlickDbAction[T]], dataSource: SlickDataSource[T])(
+ implicit core: FakeIdGen[T],
+ executionContext: ExecutionContext,
+ dbioMonad: Monad[DBIO]): DBIO[FakeIdMap[T]] = {
+ // TODO Squash Updates and Delete to one operation, when bugs in repositories will be fixed
+ actions.foldLeft(initial) {
+ case (previousActions, Create(x)) =>
+ for {
+ r <- previousActions
+ newArm <- dataSource.create(x)
+ } yield {
+ r + (core(newArm) -> newArm)
+ }
+
+ case (previousActions, Update(x)) =>
+ for {
+ r <- previousActions
+ updatedArm <- dataSource.update(x).getOrElse(x)
+ } yield {
+ r - core(updatedArm) + (core(updatedArm) -> updatedArm)
+ }
+
+ case (previousActions, Delete(_)) if dataSource.isDictionary =>
+ previousActions // We don't delete entities from dictionaries
+
+ case (previousActions, Delete(x)) =>
+ for {
+ r <- previousActions
+ _ <- dataSource.delete(x).run
+ } yield {
+ r - core(x)
+ }
+ }
+ }
+
+ implicit def toPhiString[T](input: SlickDbAction[T])(implicit inner: T => PhiString): PhiString = input match {
+ case Create(x) => phi"Create($x)"
+ case Update(x) => phi"Update($x)"
+ case Delete(x) => phi"Delete($x)"
+ }
+
+}