package controllers;
import controllers.actions.FormHandler;
import controllers.actions.CartNotEmpty;
import forms.cartForm.ListCart;
import io.sphere.client.shop.model.*;
import forms.cartForm.AddToCart;
import forms.cartForm.RemoveFromCart;
import forms.cartForm.UpdateCart;
import play.data.Form;
import play.mvc.Content;
import play.mvc.Result;
import play.mvc.With;
import sphere.ShopController;
import views.html.carts;
import views.html.products;
import static play.data.Form.form;
import static utils.ControllerHelper.*;
public class Carts extends ShopController {
final static Form<AddToCart> addToCartForm = form(AddToCart.class);
final static Form<UpdateCart> updateCartForm = form(UpdateCart.class);
final static Form<RemoveFromCart> removeFromCartForm = form(RemoveFromCart.class);
public static Result get() {
return ok(ListCart.getJson(getCurrentCart()));
}
@With(CartNotEmpty.class)
public static Result show() {
return ok(carts.render(getCurrentCart()));
}
@With(FormHandler.class)
public static Result add() {
// Case missing or invalid form data, display errors
Form<AddToCart> form = addToCartForm.bindFromRequest();
if (form.hasErrors()) {
displayErrors("add-to-cart", form);
return redirect(routes.Categories.home("", 1));
}
// Case invalid product, return not found
AddToCart addToCart = form.get();
Product product = sphere().products().byId(addToCart.productId).fetch().orNull();
if (product == null) {
addToCart.displayInvalidProductError();
return notFound();
}
// Case invalid variant, return not found
Variant variant = product.getVariants().byId(addToCart.variantId).orNull();
if (variant == null) {
addToCart.displayInvalidProductError();
return notFound();
}
// Case valid, add product to cart
int variantId = getMatchedSizeVariant(product, variant, addToCart.size);
setCurrentCart(sphere().currentCart().addLineItem(addToCart.productId, variantId, addToCart.quantity));
addToCart.displaySuccessMessage();
return ok(products.render(product, variant, getDefaultCategory(product)));
}
@With(FormHandler.class)
public static Result update() {
// Case missing or invalid form data, display errors
Form<UpdateCart> form = updateCartForm.bindFromRequest();
if (form.hasErrors()) {
displayErrors("update-cart", form);
return badRequest(showPage());
}
// Case valid, update quantity
UpdateCart updateCart = form.get();
CartUpdate cartUpdate = new CartUpdate()
.setLineItemQuantity(updateCart.lineItemId, updateCart.quantity);
setCurrentCart(sphere().currentCart().update(cartUpdate));
updateCart.displaySuccessMessage();
return ok(showPage());
}
@With(FormHandler.class)
public static Result remove() {
// Case missing or invalid form data, display errors
Form<RemoveFromCart> form = removeFromCartForm.bindFromRequest();
if (form.hasErrors()) {
displayErrors("remove-from-cart", form);
return badRequest(showPage());
}
// Case valid, remove item
RemoveFromCart removeFromCart = form.get();
setCurrentCart(sphere().currentCart().removeLineItem(removeFromCart.lineItemId));
removeFromCart.displaySuccessMessage();
return ok(showPage());
}
protected static Content showPage() {
return carts.render(getCurrentCart());
}
protected static int getMatchedSizeVariant(Product product, Variant variant, String size) {
// When size not defined return selected variant ID
if (size == null) return variant.getId();
// Otherwise fetch all variants
VariantList variants = product.getVariants();
// Filter them by selected color, if any
if (variant.hasAttribute("color")) {
variants = variants.byAttributes(variant.getAttribute("color"));
}
// And filter them by selected size, return matching variant ID
Attribute sizeAttr = new Attribute("size", size);
return variants.byAttributes(sizeAttr).first().or(variant).getId();
}
}