All Downloads are FREE. Search and download functionalities are using the official Maven repository.

eventstore.EsTransaction.scala Maven / Gradle / Ivy

The newest version!
package eventstore

import akka.actor.ActorRef
import akka.pattern.ask
import akka.util.Timeout
import scala.concurrent.{ ExecutionContext, Future }

trait EsTransaction {
  def transactionId: Long
  def write(events: List[EventData]): Future[Unit]
  def commit(): Future[Unit]
}

object EsTransaction {
  implicit def executionContext: ExecutionContext = ExecutionContext.Implicits.global

  def start(actor: ActorRef)(implicit timeout: Timeout): Future[EsTransaction] = {
    import TransactionActor.{ TransactionId, GetTransactionId }
    val future = actor ? GetTransactionId
    future.mapTo[TransactionId].map(x => continue(x.value, actor))
  }

  def continue(transactionId: Long, actor: ActorRef)(implicit timeout: Timeout): EsTransaction =
    EsTransactionForActor(transactionId, actor)
}

case class EsTransactionForActor(transactionId: Long, actor: ActorRef)(implicit timeout: Timeout) extends EsTransaction {

  import TransactionActor._
  import EsTransaction.executionContext

  def write(events: List[EventData]): Future[Unit] = {
    val future = actor ? Write(events)
    future.map(_ => ())
  }

  def commit(): Future[Unit] = {
    val future = actor ? Commit
    future.map(_ => ())
  }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy