package com.springone.myrestaurants.web; import java.util.ArrayList; import java.util.List; import com.springone.myrestaurants.domain.Recommendation; import com.springone.myrestaurants.domain.Restaurant; import com.springone.myrestaurants.domain.UserAccount; import org.springframework.ui.Model; import org.springframework.validation.BindingResult; import org.springframework.web.bind.annotation.ModelAttribute; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.stereotype.Controller; @RequestMapping("/recommendations") @Controller public class RecommendationController extends BaseApplicationController { @RequestMapping(value = "/{id}", method = RequestMethod.GET) public String show(@PathVariable("id") Long recommendationId, @ModelAttribute("currentUserAccountId") Long userId, Model model) { Recommendation foundRec = findRecommendation(userId, recommendationId); RecommendationFormBean bean = new RecommendationFormBean(); if (foundRec != null) { bean.setComments(foundRec.getComment()); bean.setRating(foundRec.getStars()); bean.setId(foundRec.getRelationshipId()); Restaurant r = foundRec.getRestaurant(); bean.setName(r.getName()); bean.setRestaurantId(r.getId()); } model.addAttribute("recommendation", bean); return "recommendations/show"; } private Recommendation findRecommendation(Long userId, Long recommendationId) { UserAccount account = this.userAccountRepository.findUserAccount(userId); Iterable<Recommendation> recs = account.getRecommendations(); Recommendation foundRec = null; for (Recommendation recommendation : recs) { if (recommendation.getRelationshipId().equals(recommendationId)) { foundRec = recommendation; } } return foundRec; } @RequestMapping(method = RequestMethod.GET) public String list(@RequestParam(value = "page", required = false) Integer page, @RequestParam(value = "size", required = false) Integer size, @ModelAttribute("currentUserAccountId") Long userId, Model model) { UserAccount account = this.userAccountRepository.findUserAccount(userId); Iterable<Recommendation> recs = account.getRecommendations(); //View expects a list with indexer access and properties that match those of the form bean. List<RecommendationFormBean> listRecs = new ArrayList<RecommendationFormBean>(); for (Recommendation recommendation : recs) { RecommendationFormBean rfb = new RecommendationFormBean(); final Restaurant restaurant = recommendation.getRestaurant(); rfb.setComments(recommendation.getComment()); rfb.setName(restaurant.getName()); rfb.setRating(recommendation.getStars()); rfb.setId(recommendation.getRelationshipId()); rfb.setRestaurantId(restaurant.getId()); listRecs.add(rfb); } model.addAttribute("recommendations", listRecs); return "recommendations/list"; } @RequestMapping(method = RequestMethod.POST) public String create(RecommendationFormBean recommendationFormBean, @ModelAttribute("currentUserAccountId") Long userId, BindingResult result, Model model) { if (result.hasErrors()) { model.addAttribute("recommendation", recommendationFormBean); return "recommendations/create"; } long restaurantId = recommendationFormBean.getRestaurantId(); Restaurant restaurant = this.restaurantRepository.findRestaurant(restaurantId); UserAccount account = this.userAccountRepository.findUserAccount(userId); Recommendation recommendation = account.rate(restaurant, recommendationFormBean.getRating(), recommendationFormBean.getComments()); model.addAttribute("recommendationId", recommendation.getRelationshipId()); return "redirect:/recommendations/" + recommendation.getRelationshipId(); } @RequestMapping(value = "/{restaurantId}/{userId}", params = "form", method = RequestMethod.GET) public String createForm(@PathVariable("restaurantId") Long restaurantId, @PathVariable("userId") Long userId, Model model) { RecommendationFormBean recBean = new RecommendationFormBean(); Restaurant restaurant = this.restaurantRepository.findRestaurant(restaurantId); recBean.setRestaurantId(restaurantId); recBean.setName(restaurant.getName()); model.addAttribute("recommendation", recBean); //currentUserId is part of the implicit model due to spring security //model.addAttribute("userId", userId.toString()); return "recommendations/create"; ///" + restaurantId + "/" + userId; } @RequestMapping(method = RequestMethod.PUT) public String update(RecommendationFormBean recommendationFormBean, @ModelAttribute("currentUserAccountId") Long userId, BindingResult result, Model model) { if (result.hasErrors()) { model.addAttribute("recommendation", recommendationFormBean); return "recommendations/update"; } Recommendation foundRec = findRecommendation(userId, recommendationFormBean.getId()); foundRec.rate(recommendationFormBean.getRating(), recommendationFormBean.getComments()); model.addAttribute("itemId", recommendationFormBean.getId()); return "redirect:/recommendations/" + recommendationFormBean.getId(); } @RequestMapping(value = "/{id}", params = "form", method = RequestMethod.GET) public String updateForm(@PathVariable("id") Long id, @ModelAttribute("currentUserAccountId") Long userId, Model model) { Recommendation foundRec = findRecommendation(userId, id); RecommendationFormBean recBean = new RecommendationFormBean(); if (foundRec != null) { recBean.setComments(foundRec.getComment()); recBean.setId(foundRec.getRelationshipId()); recBean.setRating(foundRec.getStars()); recBean.setName(foundRec.getRestaurant().getName()); recBean.setRestaurantId(foundRec.getRestaurant().getId()); } model.addAttribute("recommendation", recBean); model.addAttribute("itemId", recBean.getId()); return "recommendations/update"; } @RequestMapping(value = "/{id}", method = RequestMethod.DELETE) public String delete(@PathVariable("id") Long id, @RequestParam(value = "page", required = false) Integer page, @RequestParam(value = "size", required = false) Integer size, @ModelAttribute("currentUserAccountId") Long userId, Model model) { Recommendation foundRec = findRecommendation(userId, id); if (foundRec != null) { if (foundRec.hasPersistentState()) { foundRec.getPersistentState().delete(); } } model.addAttribute("page", (page == null) ? "1" : page.toString()); model.addAttribute("size", (size == null) ? "10" : size.toString()); return "redirect:/recommendations?page=" + ((page == null) ? "1" : page.toString()) + "&size=" + ((size == null) ? "10" : size.toString()); } }