private def openShoppingCart()

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
    }