package com.salesmanager.shop.admin.controller.products;
import com.salesmanager.core.business.services.catalog.product.ProductService;
import com.salesmanager.core.business.services.catalog.product.image.ProductImageService;
import com.salesmanager.core.business.utils.ajax.AjaxPageableResponse;
import com.salesmanager.core.business.utils.ajax.AjaxResponse;
import com.salesmanager.core.model.catalog.product.Product;
import com.salesmanager.core.model.catalog.product.image.ProductImage;
import com.salesmanager.core.model.merchant.MerchantStore;
import com.salesmanager.shop.admin.controller.ControllerConstants;
import com.salesmanager.shop.admin.model.content.ProductImages;
import com.salesmanager.shop.admin.model.web.Menu;
import com.salesmanager.shop.constants.Constants;
import com.salesmanager.shop.utils.ImageFilePath;
import com.salesmanager.shop.utils.LabelUtils;
import org.apache.commons.collections4.CollectionUtils;
import org.apache.commons.lang3.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpStatus;
import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity;
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.*;
import org.springframework.web.multipart.MultipartFile;
import javax.inject.Inject;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.validation.Valid;
import java.util.*;
@Controller
public class ProductImagesController {
private static final Logger LOGGER = LoggerFactory.getLogger(ProductImagesController.class);
@Inject
private ProductService productService;
@Inject
private ProductImageService productImageService;
@Inject
private LabelUtils messages;
@Inject
@Qualifier("img")
private ImageFilePath imageUtils;
@PreAuthorize("hasRole('PRODUCTS')")
@RequestMapping(value="/admin/products/images/list.html", method=RequestMethod.GET)
public String displayProductImages(@RequestParam("id") long productId, Model model, HttpServletRequest request, HttpServletResponse response) throws Exception {
setMenu(model,request);
MerchantStore store = (MerchantStore)request.getAttribute(Constants.ADMIN_STORE);
Product product = productService.getById(productId);
if(product==null) {
return "redirect:/admin/products/products.html";
}
if(product.getMerchantStore().getId().intValue()!=store.getId().intValue()) {
return "redirect:/admin/products/products.html";
}
model.addAttribute("product",product);
return ControllerConstants.Tiles.Product.productImages;
}
@PreAuthorize("hasRole('PRODUCTS')")
@RequestMapping(value="/admin/products/images/url/list.html", method=RequestMethod.GET)
public String displayProductImagesUrl(@RequestParam("id") long productId, Model model, HttpServletRequest request, HttpServletResponse response) throws Exception {
setMenu(model,request);
MerchantStore store = (MerchantStore)request.getAttribute(Constants.ADMIN_STORE);
Product product = productService.getById(productId);
if(product==null) {
return "redirect:/admin/products/products.html";
}
if(product.getMerchantStore().getId().intValue()!=store.getId().intValue()) {
return "redirect:/admin/products/products.html";
}
Map< String, String > mediaTypes = new HashMap<String, String>();
mediaTypes.put("0", "IMAGE");
mediaTypes.put("1", "VIDEO");
ProductImage productImage = new ProductImage();
model.addAttribute("productImage", productImage);
model.addAttribute("product",product);
model.addAttribute("mediaTypes",mediaTypes);
return ControllerConstants.Tiles.Product.productImagesUrl;
}
@SuppressWarnings({ "rawtypes", "unchecked" })
@PreAuthorize("hasRole('PRODUCTS')")
@RequestMapping(value="/admin/products/images/page.html", method=RequestMethod.POST)
public @ResponseBody ResponseEntity<String> pageProductImages(HttpServletRequest request, HttpServletResponse response) {
String sProductId = request.getParameter("productId");
AjaxResponse resp = new AjaxResponse();
final HttpHeaders httpHeaders= new HttpHeaders();
httpHeaders.setContentType(MediaType.APPLICATION_JSON_UTF8);
Long productId;
Product product = null;
try {
productId = Long.parseLong(sProductId);
} catch (Exception e) {
resp.setStatus(AjaxPageableResponse.RESPONSE_STATUS_FAIURE);
resp.setErrorString("Product id is not valid");
String returnString = resp.toJSONString();
return new ResponseEntity<String>(returnString,httpHeaders,HttpStatus.OK);
}
try {
product = productService.getById(productId);
MerchantStore store = (MerchantStore)request.getAttribute(Constants.ADMIN_STORE);
if(product.getMerchantStore().getId().intValue()!=store.getId().intValue()) {
resp.setStatus(AjaxPageableResponse.RESPONSE_STATUS_FAIURE);
resp.setErrorString("Merchant id is not valid");
String returnString = resp.toJSONString();
return new ResponseEntity<String>(returnString,httpHeaders,HttpStatus.OK);
}
Set<ProductImage> images = product.getImages();
if(images!=null) {
for(ProductImage image : images) {
String imagePath = imageUtils.buildProductImageUtils(store, product, image.getProductImage());
Map entry = new HashMap();
//entry.put("picture", new StringBuilder().append(request.getContextPath()).append(imagePath).toString());
entry.put("picture", imagePath);
entry.put("name", image.getProductImage());
entry.put("id",image.getId());
entry.put("defaultImageCheckmark", image.isDefaultImage() ? "/resources/img/admin/checkmark_checked.png" : "/resources/img/admin/checkmark_unchecked.png");
resp.addDataEntry(entry);
}
}
resp.setStatus(AjaxPageableResponse.RESPONSE_STATUS_SUCCESS);
} catch (Exception e) {
LOGGER.error("Error while paging products", e);
resp.setStatus(AjaxPageableResponse.RESPONSE_STATUS_FAIURE);
resp.setErrorMessage(e);
}
String returnString = resp.toJSONString();
return new ResponseEntity<String>(returnString,httpHeaders,HttpStatus.OK);
}
@SuppressWarnings({ "rawtypes", "unchecked" })
@PreAuthorize("hasRole('PRODUCTS')")
@RequestMapping(value="/admin/products/images/url/page.html", method=RequestMethod.POST)
public @ResponseBody ResponseEntity<String> pageProductImagesUrl(HttpServletRequest request, HttpServletResponse response) {
String sProductId = request.getParameter("productId");
AjaxResponse resp = new AjaxResponse();
final HttpHeaders httpHeaders= new HttpHeaders();
httpHeaders.setContentType(MediaType.APPLICATION_JSON_UTF8);
Long productId;
Product product = null;
try {
productId = Long.parseLong(sProductId);
} catch (Exception e) {
resp.setStatus(AjaxPageableResponse.RESPONSE_STATUS_FAIURE);
resp.setErrorString("Product id is not valid");
String returnString = resp.toJSONString();
return new ResponseEntity<String>(returnString,httpHeaders,HttpStatus.OK);
}
try {
product = productService.getById(productId);
MerchantStore store = (MerchantStore)request.getAttribute(Constants.ADMIN_STORE);
if(product.getMerchantStore().getId().intValue()!=store.getId().intValue()) {
resp.setStatus(AjaxPageableResponse.RESPONSE_STATUS_FAIURE);
resp.setErrorString("Merchant id is not valid");
String returnString = resp.toJSONString();
return new ResponseEntity<String>(returnString,httpHeaders,HttpStatus.OK);
}
Set<ProductImage> images = product.getImages();
if(images!=null) {
for(ProductImage image : images) {
if(!StringUtils.isBlank(image.getProductImageUrl())) {
Map entry = new HashMap();
entry.put("image", image.getProductImageUrl());
entry.put("url", image.getProductImageUrl());
entry.put("default", image.isDefaultImage());
entry.put("id",image.getId());
resp.addDataEntry(entry);
}
}
}
resp.setStatus(AjaxPageableResponse.RESPONSE_STATUS_SUCCESS);
} catch (Exception e) {
LOGGER.error("Error while paging products", e);
resp.setStatus(AjaxPageableResponse.RESPONSE_STATUS_FAIURE);
resp.setErrorMessage(e);
}
String returnString = resp.toJSONString();
return new ResponseEntity<String>(returnString,httpHeaders,HttpStatus.OK);
}
@PreAuthorize("hasRole('PRODUCTS')")
@RequestMapping(value="/admin/products/images/save.html", method=RequestMethod.POST)
public String saveProductImages(@ModelAttribute(value="productImages") @Valid final ProductImages productImages, final BindingResult bindingResult,final Model model, final HttpServletRequest request,Locale locale) throws Exception{
this.setMenu(model, request);
MerchantStore store = (MerchantStore)request.getAttribute(Constants.ADMIN_STORE);
Product product = productService.getById(productImages.getProductId());
model.addAttribute("product",product);
if(product==null) {
FieldError error = new FieldError("productImages","image",messages.getMessage("message.error", locale));
bindingResult.addError(error);
return ControllerConstants.Tiles.Product.productImages;
}
if(product.getMerchantStore().getId().intValue()!=store.getId().intValue()) {
FieldError error = new FieldError("productImages","image",messages.getMessage("message.error", locale));
bindingResult.addError(error);
}
if (bindingResult.hasErrors()) {
LOGGER.info( "Found {} Validation errors", bindingResult.getErrorCount());
return ControllerConstants.Tiles.Product.productImages;
}
final List<ProductImage> contentImagesList=new ArrayList<ProductImage>();
if(CollectionUtils.isNotEmpty( productImages.getFile() )){
LOGGER.info("Saving {} content images for merchant {}",productImages.getFile().size(),store.getId());
for(final MultipartFile multipartFile:productImages.getFile()){
if(!multipartFile.isEmpty()){
ProductImage productImage = new ProductImage();
productImage.setImage(multipartFile.getInputStream());
productImage.setProductImage(multipartFile.getOriginalFilename() );
productImage.setProduct(product);
productImage.setDefaultImage(false);//default image is uploaded in the product details
contentImagesList.add( productImage);
}
}
if(CollectionUtils.isNotEmpty( contentImagesList )){
productImageService.addProductImages(product, contentImagesList);
}
}
//reload
product = productService.getById(productImages.getProductId());
model.addAttribute("product",product);
model.addAttribute("success","success");
return ControllerConstants.Tiles.Product.productImages;
}
@PreAuthorize("hasRole('PRODUCTS')")
@RequestMapping(value="/admin/products/images/url/save.html", method=RequestMethod.POST)
public String saveProductImagesUrl(@ModelAttribute(value="productImage") @Valid final ProductImage productImage, final BindingResult bindingResult,final Model model, final HttpServletRequest request,Locale locale) throws Exception{
this.setMenu(model, request);
MerchantStore store = (MerchantStore)request.getAttribute(Constants.ADMIN_STORE);
Map< String, String > mediaTypes = new HashMap<String, String>();
mediaTypes.put("0", "IMAGE");
mediaTypes.put("1", "VIDEO");
model.addAttribute("productImage", productImage);
model.addAttribute("mediaTypes",mediaTypes);
Product product = productService.getById(productImage.getId());
model.addAttribute("product",product);
if(product==null) {
FieldError error = new FieldError("productImages","image",messages.getMessage("message.error", locale));
bindingResult.addError(error);
return ControllerConstants.Tiles.Product.productImagesUrl;
}
if(product.getMerchantStore().getId().intValue()!=store.getId().intValue()) {
FieldError error = new FieldError("productImages","image",messages.getMessage("message.error", locale));
bindingResult.addError(error);
}
model.addAttribute("product",product);
if (bindingResult.hasErrors()) {
LOGGER.info( "Found {} Validation errors", bindingResult.getErrorCount());
return ControllerConstants.Tiles.Product.productImagesUrl;
}
productImage.setProduct(product);
productImage.setId(null);
productImageService.saveOrUpdate(productImage);
model.addAttribute("product",product);
model.addAttribute("success","success");
return ControllerConstants.Tiles.Product.productImagesUrl;
}
@PreAuthorize("hasRole('PRODUCTS')")
@RequestMapping(value="/admin/products/images/remove.html", method=RequestMethod.POST)
public @ResponseBody ResponseEntity<String> deleteImage(HttpServletRequest request, HttpServletResponse response, Locale locale) {
String sImageId = request.getParameter("id");
MerchantStore store = (MerchantStore)request.getAttribute(Constants.ADMIN_STORE);
AjaxResponse resp = new AjaxResponse();
final HttpHeaders httpHeaders= new HttpHeaders();
httpHeaders.setContentType(MediaType.APPLICATION_JSON_UTF8);
try {
Long imageId = Long.parseLong(sImageId);
ProductImage productImage = productImageService.getById(imageId);
if(productImage==null) {
resp.setStatusMessage(messages.getMessage("message.unauthorized", locale));
resp.setStatus(AjaxResponse.RESPONSE_STATUS_FAIURE);
String returnString = resp.toJSONString();
return new ResponseEntity<String>(returnString,httpHeaders,HttpStatus.OK);
}
if(productImage.getProduct().getMerchantStore().getId().intValue()!=store.getId().intValue()) {
resp.setStatusMessage(messages.getMessage("message.unauthorized", locale));
resp.setStatus(AjaxResponse.RESPONSE_STATUS_FAIURE);
String returnString = resp.toJSONString();
return new ResponseEntity<String>(returnString,httpHeaders,HttpStatus.OK);
}
productImageService.removeProductImage(productImage);
resp.setStatus(AjaxResponse.RESPONSE_OPERATION_COMPLETED);
} catch (Exception e) {
LOGGER.error("Error while deleting product price", e);
resp.setStatus(AjaxResponse.RESPONSE_STATUS_FAIURE);
resp.setErrorMessage(e);
}
String returnString = resp.toJSONString();
return new ResponseEntity<String>(returnString,httpHeaders,HttpStatus.OK);
}
@PreAuthorize("hasRole('PRODUCTS')")
@RequestMapping(value="/admin/products/images/defaultImage.html", method=RequestMethod.POST)
public @ResponseBody ResponseEntity<String> setDefaultImage(final HttpServletRequest request,
final HttpServletResponse response,
final Locale locale) {
final String sImageId = request.getParameter("id");
final MerchantStore store = (MerchantStore)request.getAttribute(Constants.ADMIN_STORE);
final AjaxResponse resp = new AjaxResponse();
final HttpHeaders httpHeaders= new HttpHeaders();
httpHeaders.setContentType(MediaType.APPLICATION_JSON_UTF8);
try {
final Long imageId = Long.parseLong(sImageId);
final ProductImage productImage = productImageService.getById(imageId);
if (productImage == null) {
resp.setStatusMessage(messages.getMessage("message.unauthorized", locale));
resp.setStatus(AjaxResponse.RESPONSE_STATUS_FAIURE);
String returnString = resp.toJSONString();
return new ResponseEntity<String>(returnString,httpHeaders,HttpStatus.OK);
}
if (productImage.getProduct().getMerchantStore().getId().intValue() != store.getId().intValue()) {
resp.setStatusMessage(messages.getMessage("message.unauthorized", locale));
resp.setStatus(AjaxResponse.RESPONSE_STATUS_FAIURE);
String returnString = resp.toJSONString();
return new ResponseEntity<String>(returnString,httpHeaders,HttpStatus.OK);
}
productImage.setDefaultImage(true);
productImageService.saveOrUpdate(productImage);
final Set<ProductImage> images = productService.getById(productImage.getProduct().getId()).getImages();
for (final ProductImage image : images) {
if (image.getId() != productImage.getId()) {
image.setDefaultImage(false);
productImageService.saveOrUpdate(image);
}
}
resp.setStatus(AjaxResponse.RESPONSE_OPERATION_COMPLETED);
} catch (final Exception e) {
LOGGER.error("Error while set default image", e);
resp.setStatus(AjaxResponse.RESPONSE_STATUS_FAIURE);
resp.setErrorMessage(e);
}
String returnString = resp.toJSONString();
return new ResponseEntity<String>(returnString,httpHeaders,HttpStatus.OK);
}
private void setMenu(Model model, HttpServletRequest request) throws Exception {
//display menu
Map<String,String> activeMenus = new HashMap<String,String>();
activeMenus.put("catalogue", "catalogue");
activeMenus.put("catalogue-products", "catalogue-products");
@SuppressWarnings("unchecked")
Map<String, Menu> menus = (Map<String, Menu>)request.getAttribute("MENUMAP");
Menu currentMenu = (Menu)menus.get("catalogue");
model.addAttribute("currentMenu",currentMenu);
model.addAttribute("activeMenus",activeMenus);
//
}
}