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

eventstore.akka.EsTransaction.scala Maven / Gradle / Ivy

package eventstore
package akka

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

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

private[eventstore] 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)
}

private[eventstore] final 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