package com.salesmanager.shop.admin.controller.products; import com.salesmanager.core.business.services.catalog.product.attribute.ProductOptionValueService; import com.salesmanager.core.business.services.content.ContentService; import com.salesmanager.core.business.services.reference.language.LanguageService; import com.salesmanager.core.business.utils.ajax.AjaxResponse; import com.salesmanager.core.model.catalog.product.attribute.ProductOptionValue; import com.salesmanager.core.model.catalog.product.attribute.ProductOptionValueDescription; import com.salesmanager.core.model.content.FileContentType; import com.salesmanager.core.model.content.InputContentFile; import com.salesmanager.core.model.merchant.MerchantStore; import com.salesmanager.core.model.reference.language.Language; 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.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.ObjectError; import org.springframework.web.bind.annotation.*; import javax.inject.Inject; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.validation.Valid; import java.io.InputStream; import java.util.*; @Controller public class OptionsValueController { @Inject LanguageService languageService; @Inject ProductOptionValueService productOptionValueService; @Inject LabelUtils messages; @Inject private ContentService contentService; @Inject @Qualifier("img") private ImageFilePath imageUtils; private static final Logger LOGGER = LoggerFactory.getLogger(OptionsValueController.class); @PreAuthorize("hasRole('PRODUCTS')") @RequestMapping(value="/admin/options/optionvalues.html", method=RequestMethod.GET) public String displayOptions(Model model, HttpServletRequest request, HttpServletResponse response) throws Exception { setMenu(model,request); //subsequent ajax call return "catalogue-optionsvalues-list"; } @PreAuthorize("hasRole('PRODUCTS')") @RequestMapping(value="/admin/options/editOptionValue.html", method=RequestMethod.GET) public String displayOptionEdit(@RequestParam("id") long optionId, HttpServletRequest request, HttpServletResponse response, Model model, Locale locale) throws Exception { return displayOption(optionId,request,response,model,locale); } @PreAuthorize("hasRole('PRODUCTS')") @RequestMapping(value="/admin/options/createOptionValue.html", method=RequestMethod.GET) public String displayOption(HttpServletRequest request, HttpServletResponse response, Model model, Locale locale) throws Exception { return displayOption(null,request,response,model,locale); } private String displayOption(Long optionId, HttpServletRequest request, HttpServletResponse response,Model model,Locale locale) throws Exception { this.setMenu(model, request); MerchantStore store = (MerchantStore)request.getAttribute(Constants.ADMIN_STORE); List<Language> languages = store.getLanguages(); Set<ProductOptionValueDescription> descriptions = new HashSet<ProductOptionValueDescription>(); ProductOptionValue option = new ProductOptionValue(); if(optionId!=null && optionId!=0) {//edit mode option = productOptionValueService.getById(store, optionId); if(option==null) { return "redirect:/admin/options/optionvalues.html"; } Set<ProductOptionValueDescription> optionDescriptions = option.getDescriptions(); for(Language l : languages) { ProductOptionValueDescription optionDescription = null; if(optionDescriptions!=null) { for(ProductOptionValueDescription description : optionDescriptions) { String code = description.getLanguage().getCode(); if(code.equals(l.getCode())) { optionDescription = description; } } } if(optionDescription==null) { optionDescription = new ProductOptionValueDescription(); optionDescription.setLanguage(l); } descriptions.add(optionDescription); } } else { for(Language l : languages) { ProductOptionValueDescription desc = new ProductOptionValueDescription(); desc.setLanguage(l); descriptions.add(desc); } option.setDescriptions(descriptions); } model.addAttribute("optionValue", option); return "catalogue-optionsvalues-details"; } @PreAuthorize("hasRole('PRODUCTS')") @RequestMapping(value="/admin/options/saveOptionValue.html", method=RequestMethod.POST) public String saveOption(@Valid @ModelAttribute("optionValue") ProductOptionValue optionValue, BindingResult result, Model model, HttpServletRequest request, Locale locale) throws Exception { //display menu setMenu(model,request); MerchantStore store = (MerchantStore)request.getAttribute(Constants.ADMIN_STORE); ProductOptionValue dbEntity = null; if(optionValue.getId() != null && optionValue.getId() >0) { //edit entry //get from DB dbEntity = productOptionValueService.getById(store,optionValue.getId()); if(dbEntity==null) { return "redirect:/admin/options/optionsvalues.html"; } } //validate if it contains an existing code ProductOptionValue byCode = productOptionValueService.getByCode(store, optionValue.getCode()); if(byCode!=null) { ObjectError error = new ObjectError("code",messages.getMessage("message.code.exist", locale)); result.addError(error); } Map<String,Language> langs = languageService.getLanguagesMap(); List<ProductOptionValueDescription> descriptions = optionValue.getDescriptionsList(); if(descriptions!=null && descriptions.size()>0) { Set<ProductOptionValueDescription> descs = new HashSet<ProductOptionValueDescription>(); //if(descs==null || descs.size()==0) { //} else { optionValue.setDescriptions(descs); for(ProductOptionValueDescription description : descriptions) { if(StringUtils.isBlank(description.getName())) { ObjectError error = new ObjectError("name",messages.getMessage("message.name.required", locale)); result.addError(error); } else { String code = description.getLanguage().getCode(); Language l = langs.get(code); description.setLanguage(l); description.setProductOptionValue(optionValue); descs.add(description); } } } else { ObjectError error = new ObjectError("name",messages.getMessage("message.name.required", locale)); result.addError(error); } optionValue.setMerchantStore(store); if (result.hasErrors()) { return "catalogue-optionsvalues-details"; } if(optionValue.getImage()!=null && !optionValue.getImage().isEmpty()) { String imageName = optionValue.getImage().getOriginalFilename(); InputStream inputStream = optionValue.getImage().getInputStream(); InputContentFile cmsContentImage = new InputContentFile(); cmsContentImage.setFileName(imageName); cmsContentImage.setMimeType( optionValue.getImage().getContentType() ); cmsContentImage.setFile( inputStream ); contentService.addOptionImage(store.getCode(), cmsContentImage); optionValue.setProductOptionValueImage(imageName); } productOptionValueService.saveOrUpdate(optionValue); model.addAttribute("success","success"); return "catalogue-optionsvalues-details"; } @SuppressWarnings("unchecked") @PreAuthorize("hasRole('PRODUCTS')") @RequestMapping(value="/admin/optionsvalues/paging.html", method=RequestMethod.POST) public @ResponseBody ResponseEntity<String> pageOptions(HttpServletRequest request, HttpServletResponse response) { String optionName = request.getParameter("name"); AjaxResponse resp = new AjaxResponse(); try { Language language = (Language)request.getAttribute("LANGUAGE"); MerchantStore store = (MerchantStore)request.getAttribute(Constants.ADMIN_STORE); List<ProductOptionValue> options = null; if(!StringUtils.isBlank(optionName)) { //productOptionValueService.getByName(store, optionName, language); } else { options = productOptionValueService.listByStore(store, language); } for(ProductOptionValue option : options) { @SuppressWarnings("rawtypes") Map entry = new HashMap(); entry.put("optionValueId", option.getId()); ProductOptionValueDescription description = option.getDescriptions().iterator().next(); entry.put("name", description.getName()); //entry.put("image", new StringBuilder().append(store.getCode()).append("/").append(FileContentType.PROPERTY.name()).append("/").append(option.getProductOptionValueImage()).toString()); entry.put("image", imageUtils.buildProductPropertyImageUtils(store, option.getProductOptionValueImage())); resp.addDataEntry(entry); } resp.setStatus(AjaxResponse.RESPONSE_STATUS_SUCCESS); } catch (Exception e) { LOGGER.error("Error while paging options", e); resp.setStatus(AjaxResponse.RESPONSE_STATUS_FAIURE); } String returnString = resp.toJSONString(); final HttpHeaders httpHeaders= new HttpHeaders(); httpHeaders.setContentType(MediaType.APPLICATION_JSON_UTF8); return new ResponseEntity<String>(returnString,httpHeaders,HttpStatus.OK); } @PreAuthorize("hasRole('PRODUCTS')") @RequestMapping(value="/admin/optionsvalues/remove.html", method=RequestMethod.POST) public @ResponseBody ResponseEntity<String> deleteOptionValue(HttpServletRequest request, HttpServletResponse response, Locale locale) { String sid = request.getParameter("optionValueId"); MerchantStore store = (MerchantStore)request.getAttribute(Constants.ADMIN_STORE); AjaxResponse resp = new AjaxResponse(); try { Long id = Long.parseLong(sid); ProductOptionValue entity = productOptionValueService.getById(store, id); if(entity==null || entity.getMerchantStore().getId().intValue()!=store.getId().intValue()) { resp.setStatusMessage(messages.getMessage("message.unauthorized", locale)); resp.setStatus(AjaxResponse.RESPONSE_STATUS_FAIURE); } else { productOptionValueService.delete(entity); resp.setStatus(AjaxResponse.RESPONSE_OPERATION_COMPLETED); } } catch (Exception e) { LOGGER.error("Error while deleting option", e); resp.setStatus(AjaxResponse.RESPONSE_STATUS_FAIURE); resp.setErrorMessage(e); } String returnString = resp.toJSONString(); final HttpHeaders httpHeaders= new HttpHeaders(); httpHeaders.setContentType(MediaType.APPLICATION_JSON_UTF8); return new ResponseEntity<String>(returnString,httpHeaders,HttpStatus.OK); } @PreAuthorize("hasRole('PRODUCTS')") @RequestMapping(value="/admin/optionsvalues/removeImage.html", method=RequestMethod.POST) public @ResponseBody ResponseEntity<String> removeImage(HttpServletRequest request, HttpServletResponse response, Locale locale) { String optionValueId = request.getParameter("optionId"); MerchantStore store = (MerchantStore)request.getAttribute(Constants.ADMIN_STORE); AjaxResponse resp = new AjaxResponse(); try { Long id = Long.parseLong(optionValueId); ProductOptionValue optionValue = productOptionValueService.getById(store, id); contentService.removeFile(store.getCode(), FileContentType.PROPERTY, optionValue.getProductOptionValueImage()); store.setStoreLogo(null); optionValue.setProductOptionValueImage(null); productOptionValueService.update(optionValue); } catch (Exception e) { LOGGER.error("Error while deleting product", e); resp.setStatus(AjaxResponse.RESPONSE_STATUS_FAIURE); resp.setErrorMessage(e); } String returnString = resp.toJSONString(); final HttpHeaders httpHeaders= new HttpHeaders(); httpHeaders.setContentType(MediaType.APPLICATION_JSON_UTF8); 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-options", "catalogue-options"); @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); // } }