package com.salesmanager.shop.store.controller.customer; import com.salesmanager.core.business.services.catalog.product.PricingService; import com.salesmanager.core.business.services.catalog.product.ProductService; import com.salesmanager.core.business.services.catalog.product.review.ProductReviewService; import com.salesmanager.core.business.services.customer.CustomerService; import com.salesmanager.core.business.services.reference.language.LanguageService; import com.salesmanager.core.model.catalog.product.Product; import com.salesmanager.core.model.catalog.product.review.ProductReview; import com.salesmanager.core.model.customer.Customer; import com.salesmanager.core.model.merchant.MerchantStore; import com.salesmanager.core.model.reference.language.Language; import com.salesmanager.shop.constants.Constants; import com.salesmanager.shop.model.catalog.product.PersistableProductReview; import com.salesmanager.shop.model.catalog.product.ReadableProduct; import com.salesmanager.shop.model.catalog.product.ReadableProductReview; import com.salesmanager.shop.populator.catalog.PersistableProductReviewPopulator; import com.salesmanager.shop.populator.catalog.ReadableProductPopulator; import com.salesmanager.shop.populator.catalog.ReadableProductReviewPopulator; import com.salesmanager.shop.store.controller.AbstractController; import com.salesmanager.shop.store.controller.ControllerConstants; import com.salesmanager.shop.store.controller.customer.facade.CustomerFacade; import com.salesmanager.shop.utils.DateUtil; import com.salesmanager.shop.utils.ImageFilePath; import com.salesmanager.shop.utils.LabelUtils; import org.apache.commons.lang3.StringUtils; import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.security.access.prepost.PreAuthorize; import org.springframework.stereotype.Controller; import org.springframework.ui.Model; import org.springframework.validation.BindingResult; import org.springframework.validation.FieldError; 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.bind.annotation.RequestParam; import javax.inject.Inject; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.util.Date; import java.util.List; import java.util.Locale; /** * Entry point for logged in customers * @author Carl Samson * */ @Controller @RequestMapping(Constants.SHOP_URI + "/customer") public class CustomerProductReviewController extends AbstractController { @Inject private ProductService productService; @Inject private LanguageService languageService; @Inject private PricingService pricingService; @Inject private ProductReviewService productReviewService; @Inject private CustomerService customerService; @Inject private CustomerFacade customerFacade; @Inject private LabelUtils messages; @Inject @Qualifier("img") private ImageFilePath imageUtils; @PreAuthorize("hasRole('AUTH_CUSTOMER')") @RequestMapping(value="/review.html", method=RequestMethod.GET) public String displayProductReview(@RequestParam Long productId, Model model, HttpServletRequest request, HttpServletResponse response) throws Exception { MerchantStore store = getSessionAttribute(Constants.MERCHANT_STORE, request); Language language = super.getLanguage(request); //get product Product product = productService.getById(productId); if(product==null) { return "redirect:" + Constants.SHOP_URI; } if(product.getMerchantStore().getId().intValue()!=store.getId().intValue()) { return "redirect:" + Constants.SHOP_URI; } //create readable product ReadableProduct readableProduct = new ReadableProduct(); ReadableProductPopulator readableProductPopulator = new ReadableProductPopulator(); readableProductPopulator.setPricingService(pricingService); readableProductPopulator.setimageUtils(imageUtils); readableProductPopulator.populate(product, readableProduct, store, language); model.addAttribute("product", readableProduct); Customer customer = customerFacade.getCustomerByUserName(request.getRemoteUser(), store); List<ProductReview> reviews = productReviewService.getByProduct(product, language); for(ProductReview r : reviews) { if(r.getCustomer().getId().longValue()==customer.getId().longValue()) { ReadableProductReviewPopulator reviewPopulator = new ReadableProductReviewPopulator(); ReadableProductReview rev = new ReadableProductReview(); reviewPopulator.populate(r, rev, store, language); model.addAttribute("customerReview", rev); break; } } ProductReview review = new ProductReview(); review.setCustomer(customer); review.setProduct(product); ReadableProductReview productReview = new ReadableProductReview(); ReadableProductReviewPopulator reviewPopulator = new ReadableProductReviewPopulator(); reviewPopulator.populate(review, productReview, store, language); model.addAttribute("review", productReview); model.addAttribute("reviews", reviews); /** template **/ StringBuilder template = new StringBuilder().append(ControllerConstants.Tiles.Customer.review).append(".").append(store.getStoreTemplate()); return template.toString(); } @PreAuthorize("hasRole('AUTH_CUSTOMER')") @RequestMapping(value="/review/submit.html", method=RequestMethod.POST) public String submitProductReview(@ModelAttribute("review") PersistableProductReview review, BindingResult bindingResult, Model model, HttpServletRequest request, HttpServletResponse response, Locale locale) throws Exception { MerchantStore store = getSessionAttribute(Constants.MERCHANT_STORE, request); Language language = getLanguage(request); Customer customer = customerFacade.getCustomerByUserName(request.getRemoteUser(), store); if(customer==null) { return "redirect:" + Constants.SHOP_URI; } Product product = productService.getById(review.getProductId()); if(product==null) { return "redirect:" + Constants.SHOP_URI; } if(StringUtils.isBlank(review.getDescription())) { FieldError error = new FieldError("description","description",messages.getMessage("NotEmpty.review.description", locale)); bindingResult.addError(error); } ReadableProduct readableProduct = new ReadableProduct(); ReadableProductPopulator readableProductPopulator = new ReadableProductPopulator(); readableProductPopulator.setPricingService(pricingService); readableProductPopulator.setimageUtils(imageUtils); readableProductPopulator.populate(product, readableProduct, store, language); model.addAttribute("product", readableProduct); /** template **/ StringBuilder template = new StringBuilder().append(ControllerConstants.Tiles.Customer.review).append(".").append(store.getStoreTemplate()); if ( bindingResult.hasErrors() ) { return template.toString(); } //check if customer has already evaluated the product List<ProductReview> reviews = productReviewService.getByProduct(product); for(ProductReview r : reviews) { if(r.getCustomer().getId().longValue()==customer.getId().longValue()) { ReadableProductReviewPopulator reviewPopulator = new ReadableProductReviewPopulator(); ReadableProductReview rev = new ReadableProductReview(); reviewPopulator.populate(r, rev, store, language); model.addAttribute("customerReview", rev); return template.toString(); } } PersistableProductReviewPopulator populator = new PersistableProductReviewPopulator(); populator.setCustomerService(customerService); populator.setLanguageService(languageService); populator.setProductService(productService); review.setDate(DateUtil.formatDate(new Date())); review.setCustomerId(customer.getId()); ProductReview productReview = populator.populate(review, store, language); productReviewService.create(productReview); model.addAttribute("review", review); model.addAttribute("success", "success"); ReadableProductReviewPopulator reviewPopulator = new ReadableProductReviewPopulator(); ReadableProductReview rev = new ReadableProductReview(); reviewPopulator.populate(productReview, rev, store, language); model.addAttribute("customerReview", rev); return template.toString(); } }