in pekko-sample-persistence-scala/src/main/scala/sample/persistence/ShoppingCart.scala [133:183]
private def openShoppingCart(cartId: String, state: State, command: Command): Effect[Event, State] =
command match {
case AddItem(itemId, quantity, replyTo) =>
if (state.hasItem(itemId)) {
replyTo ! StatusReply.Error(s"Item '$itemId' was already added to this shopping cart")
Effect.none
} else if (quantity <= 0) {
replyTo ! StatusReply.Error("Quantity must be greater than zero")
Effect.none
} else {
Effect
.persist(ItemAdded(cartId, itemId, quantity))
.thenRun(updatedCart => replyTo ! StatusReply.Success(updatedCart.toSummary))
}
case RemoveItem(itemId, replyTo) =>
if (state.hasItem(itemId)) {
Effect.persist(ItemRemoved(cartId, itemId)).thenRun(updatedCart =>
replyTo ! StatusReply.Success(updatedCart.toSummary))
} else {
replyTo ! StatusReply.Success(state.toSummary) // removing an item is idempotent
Effect.none
}
case AdjustItemQuantity(itemId, quantity, replyTo) =>
if (quantity <= 0) {
replyTo ! StatusReply.Error("Quantity must be greater than zero")
Effect.none
} else if (state.hasItem(itemId)) {
Effect
.persist(ItemQuantityAdjusted(cartId, itemId, quantity))
.thenRun(updatedCart => replyTo ! StatusReply.Success(updatedCart.toSummary))
} else {
replyTo ! StatusReply.Error(s"Cannot adjust quantity for item '$itemId'. Item not present on cart")
Effect.none
}
case Checkout(replyTo) =>
if (state.isEmpty) {
replyTo ! StatusReply.Error("Cannot checkout an empty shopping cart")
Effect.none
} else {
Effect
.persist(CheckedOut(cartId, Instant.now()))
.thenRun(updatedCart => replyTo ! StatusReply.Success(updatedCart.toSummary))
}
case Get(replyTo) =>
replyTo ! state.toSummary
Effect.none
}