package cart; import common.contexts.UserContext; import common.controllers.ControllerDependency; import common.controllers.SunriseController; import io.sphere.sdk.carts.Cart; import io.sphere.sdk.carts.CartDraft; import io.sphere.sdk.carts.commands.CartCreateCommand; import io.sphere.sdk.carts.commands.CartUpdateCommand; import io.sphere.sdk.carts.commands.updateactions.SetShippingAddress; import io.sphere.sdk.carts.queries.CartByIdGet; import io.sphere.sdk.models.Address; import play.libs.F; import play.mvc.Http; import java.util.Optional; public abstract class CartController extends SunriseController { public CartController(final ControllerDependency controllerDependency) { super(controllerDependency); } protected F.Promise<Cart> getOrCreateCart(final UserContext userContext, final Http.Session session) { return Optional.ofNullable(session(CartSessionKeys.CART_ID)) .map(cartId -> sphere().execute(CartByIdGet.of(cartId))) .orElseGet(() -> sphere().execute(CartCreateCommand.of(CartDraft.of(userContext.currency()).withCountry(userContext.country()))) .flatMap(cart -> { //required to show the taxes final Address address = Address.of(userContext.country()); return sphere().execute(CartUpdateCommand.of(cart, SetShippingAddress.of(address))); })) .map(cart -> { CartSessionUtils.overwriteCartSessionData(cart, session); return cart; }); } }