Skip to content

Instantly share code, notes, and snippets.

@khannedy
Created July 8, 2017 11:38
Show Gist options
  • Save khannedy/63690fdd4ecc1b354a69fb761f68eeb2 to your computer and use it in GitHub Desktop.
Save khannedy/63690fdd4ecc1b354a69fb761f68eeb2 to your computer and use it in GitHub Desktop.
package com.idspring.commandpattern.service.command.impl;
import com.idspring.commandpattern.entity.Cart;
import com.idspring.commandpattern.entity.CartItem;
import com.idspring.commandpattern.entity.Product;
import com.idspring.commandpattern.model.service.AddProductToCartRequest;
import com.idspring.commandpattern.repository.CartRepository;
import com.idspring.commandpattern.repository.ProductRepository;
import com.idspring.commandpattern.service.AbstractCommand;
import com.idspring.commandpattern.service.command.AddProductToCartCommand;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import reactor.core.publisher.Mono;
/**
* @author Eko Kurniawan Khannedy
* @since 30/06/17
*/
@Component
public class AddProductToCartCommandImpl extends AbstractCommand<Cart, AddProductToCartRequest>
implements AddProductToCartCommand {
@Autowired
private ProductRepository productRepository;
@Autowired
private CartRepository cartRepository;
@Override
public Mono<Cart> doExecute(AddProductToCartRequest request) {
return Mono.zip(
objects -> addOrUpdateProductInCart((Cart) objects[0], (Product) objects[1], request.getQuantity()),
cartRepository.findById(request.getCartId()),
productRepository.findById(request.getProductId())
).flatMap(cart -> cartRepository.save(cart));
}
private Cart addOrUpdateProductInCart(Cart cart, Product product, Integer quantity) {
if (isCartContainProduct(cart, product)) {
incrementProductQuantity(cart, product, quantity);
} else {
addNewProductToCart(cart, product, quantity);
}
return cart;
}
private boolean isCartContainProduct(Cart cart, Product product) {
return cart.getItems().stream()
.anyMatch(cartItem -> cartItem.getId().equals(product.getId()));
}
private void incrementProductQuantity(Cart cart, Product product, Integer quantity) {
cart.getItems().stream()
.filter(cartItem -> cartItem.getId().equals(product.getId()))
.forEach(cartItem -> cartItem.setQuantity(cartItem.getQuantity() + quantity));
}
private void addNewProductToCart(Cart cart, Product product, Integer quantity) {
CartItem item = CartItem.builder()
.id(product.getId())
.name(product.getName())
.price(product.getPrice())
.quantity(quantity)
.build();
cart.getItems().add(item);
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment