package ik.am.jpetstore.app.order; import java.util.ArrayList; import java.util.Collections; import java.util.List; import ik.am.jpetstore.domain.model.Account; import ik.am.jpetstore.domain.model.Cart; import ik.am.jpetstore.domain.model.Order; import ik.am.jpetstore.domain.model.UserDetails; import ik.am.jpetstore.domain.service.order.OrderService; import javax.inject.Inject; import org.dozer.Mapper; import org.springframework.security.core.context.SecurityContextHolder; import org.springframework.stereotype.Controller; import org.springframework.ui.Model; import org.springframework.web.bind.annotation.ModelAttribute; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.SessionAttributes; import org.springframework.web.bind.support.SessionStatus; import org.springframework.web.servlet.mvc.support.RedirectAttributes; @Controller @RequestMapping("order") @SessionAttributes("scopedTarget.cart") public class OrderController { private static final List<String> CARD_TYPE_LIST; @Inject protected OrderHelper orderHelper; @Inject protected OrderService orderService; @Inject protected Mapper beanMapper; @Inject protected Cart cart; static { List<String> cardList = new ArrayList<String>(); cardList.add("Visa"); cardList.add("MasterCard"); cardList.add("American Express"); CARD_TYPE_LIST = Collections.unmodifiableList(cardList); } @ModelAttribute public OrderForm setUpForm() { return new OrderForm(); } @ModelAttribute("creditCardTypes") public List<String> getCardTypeList() { return CARD_TYPE_LIST; } @RequestMapping("newOrderForm") public String newOrderForm(OrderForm orderForm, Model model) { UserDetails userDetails = (UserDetails) SecurityContextHolder .getContext().getAuthentication().getPrincipal(); Account account = userDetails.getAccount(); Order order = new Order(); order.initOrder(account, cart); beanMapper.map(order, orderForm); model.addAttribute(order); return "order/NewOrderForm"; } @RequestMapping(value = "newOrder") public String confirmOrder(OrderForm orderForm, Order order) { return "order/ConfirmOrder"; } @RequestMapping(value = "newOrder", params = "shippingAddressRequired=true") public String shippingForm(OrderForm orderForm, Order order) { return "order/ShippingForm"; } @RequestMapping(value = "newOrder", params = "confirmed") public String newOrder(OrderForm orderForm, SessionStatus status, RedirectAttributes attributes) { Order order = orderHelper.newOrder(orderForm, cart); attributes.addAttribute("orderId", order.getOrderId()); attributes.addFlashAttribute("message", "Thank you, your order has been submitted."); status.setComplete(); return "redirect:/order/viewOrder"; } @RequestMapping("viewOrder") public String viewOrder(@RequestParam("orderId") int orderId, Model model) { Order order = orderService.getOrder(orderId); UserDetails userDetails = (UserDetails) SecurityContextHolder .getContext().getAuthentication().getPrincipal(); Account account = userDetails.getAccount(); if (account.getUsername().equals(order.getUsername())) { model.addAttribute(order); return "order/ViewOrder"; } else { // TODO model.addAttribute("You may only view your own orders."); return "common/Error"; } } @RequestMapping("listOrders") public String listOrders(Model model) { UserDetails userDetails = (UserDetails) SecurityContextHolder .getContext().getAuthentication().getPrincipal(); String username = userDetails.getUsername(); List<Order> orderList = orderService.getOrdersByUsername(username); model.addAttribute("orderList", orderList); return "order/ListOrders"; } }