package cart; import common.contexts.UserContext; import common.controllers.ControllerDependency; import io.sphere.sdk.carts.Cart; import io.sphere.sdk.carts.commands.CartUpdateCommand; import io.sphere.sdk.carts.commands.updateactions.AddLineItem; import play.data.Form; import play.libs.F; import play.mvc.Result; import javax.inject.Inject; import static org.apache.commons.lang3.ObjectUtils.firstNonNull; /** * Adds a line item to a cart. Redirects to the product detail page in the success case. */ public class LineItemAddController extends CartController { @Inject public LineItemAddController(final ControllerDependency controllerDependency) { super(controllerDependency); } public F.Promise<Result> process(final String language) { final UserContext userContext = userContext(language); final Form<ProductVariantToCartFormData> form = getFilledForm(); if (form.hasErrors()) { return F.Promise.pure(badRequest(form.errorsAsJson())); } else { final ProductVariantToCartFormData data = form.get(); final F.Promise<Cart> cartPromise = getOrCreateCart(userContext, session()); return cartPromise.flatMap(cart -> { final Long itemCount = firstNonNull(data.getAmount(), 1L); final AddLineItem action = AddLineItem.of(data.getProductId(), data.getVariantId(), itemCount); return sphere().execute(CartUpdateCommand.of(cart, action)) .map(cartWithLineItem -> { CartSessionUtils.overwriteCartSessionData(cartWithLineItem, session()); return redirect(reverseRouter().product(language, data.getProductSlug(), data.getSku())); }); }); } } private Form<ProductVariantToCartFormData> getFilledForm() { return Form.form(ProductVariantToCartFormData.class).bindFromRequest(); } public static class ProductVariantToCartFormData { private String productId; private String productSlug; private String sku; private Long amount; private Integer variantId; public ProductVariantToCartFormData() { } public String getProductId() { return productId; } public void setProductId(final String productId) { this.productId = productId; } public Long getAmount() { return amount; } public void setAmount(final Long amount) { this.amount = amount; } public Integer getVariantId() { return variantId; } public void setVariantId(final Integer variantId) { this.variantId = variantId; } public String getSku() { return sku; } public void setSku(final String sku) { this.sku = sku; } public String getProductSlug() { return productSlug; } public void setProductSlug(final String productSlug) { this.productSlug = productSlug; } } }