package com.yummynoodlebar.web.controller; import com.yummynoodlebar.core.services.OrderService; import com.yummynoodlebar.events.orders.CreateOrderEvent; import com.yummynoodlebar.events.orders.OrderCreatedEvent; import com.yummynoodlebar.events.orders.OrderDetails; import com.yummynoodlebar.web.domain.Basket; import com.yummynoodlebar.web.domain.CustomerInfo; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; import org.springframework.validation.BindingResult; import org.springframework.web.bind.annotation.ModelAttribute; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; import org.springframework.web.servlet.mvc.support.RedirectAttributes; import javax.validation.Valid; import java.util.UUID; @Controller @RequestMapping("/checkout") public class CheckoutController { private static final Logger LOG = LoggerFactory .getLogger(BasketCommandController.class); @Autowired private Basket basket; @Autowired private OrderService orderService; @RequestMapping(method = RequestMethod.GET) public String checkout() { return "/checkout"; } @RequestMapping(method = RequestMethod.POST) public String doCheckout(@Valid @ModelAttribute("customerInfo") CustomerInfo customer, BindingResult result, RedirectAttributes redirectAttrs) { if (result.hasErrors()) { // errors in the form // show the checkout form again return "/checkout"; } LOG.debug("No errors, continue with processing for Customer {}:", customer.getName()); OrderDetails order = basket .createOrderDetailsWithCustomerInfo(customer); OrderCreatedEvent event = orderService .createOrder(new CreateOrderEvent(order)); UUID key = event.getNewOrderKey(); redirectAttrs.addFlashAttribute("message", "Your order has been accepted!"); basket.clear(); LOG.debug("Basket now has {} items", basket.getSize()); return "redirect:/order/" + key.toString(); } // {!begin customerInfo} @ModelAttribute("customerInfo") private CustomerInfo getCustomerInfo() { return new CustomerInfo(); } // {!end customerInfo} @ModelAttribute("basket") public Basket getBasket() { return basket; } public void setBasket(Basket basket) { this.basket = basket; } }