package com.salesmanager.shop.admin.controller.products; import com.salesmanager.core.business.services.catalog.category.CategoryService; import com.salesmanager.core.business.services.catalog.product.ProductService; import com.salesmanager.core.business.utils.ajax.AjaxPageableResponse; import com.salesmanager.core.business.utils.ajax.AjaxResponse; import com.salesmanager.core.model.catalog.category.Category; import com.salesmanager.core.model.catalog.product.Product; import com.salesmanager.core.model.catalog.product.ProductCriteria; import com.salesmanager.core.model.catalog.product.ProductList; import com.salesmanager.core.model.catalog.product.description.ProductDescription; 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.LabelUtils; import org.apache.commons.lang3.StringUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; 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.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; import org.springframework.web.bind.annotation.ResponseBody; import javax.inject.Inject; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.util.*; @Controller public class ProductsController { @Inject CategoryService categoryService; @Inject ProductService productService; @Inject LabelUtils messages; private static final Logger LOGGER = LoggerFactory.getLogger(ProductsController.class); @PreAuthorize("hasRole('PRODUCTS')") @RequestMapping(value="/admin/products/products.html", method=RequestMethod.GET) public String displayProducts(Model model, HttpServletRequest request, HttpServletResponse response) throws Exception { setMenu(model,request); Language language = (Language)request.getAttribute("LANGUAGE"); MerchantStore store = (MerchantStore)request.getAttribute(Constants.ADMIN_STORE); List<Category> categories = categoryService.listByStore(store, language); model.addAttribute("categories", categories); return "admin-products"; } @SuppressWarnings({ "rawtypes", "unchecked" }) @PreAuthorize("hasRole('PRODUCTS')") @RequestMapping(value="/admin/products/paging.html", method=RequestMethod.POST) public @ResponseBody ResponseEntity<String> pageProducts(HttpServletRequest request, HttpServletResponse response) { //TODO what if ROOT String categoryId = request.getParameter("categoryId"); String sku = request.getParameter("sku"); String available = request.getParameter("available"); String searchTerm = request.getParameter("searchTerm"); String name = request.getParameter("name"); AjaxPageableResponse resp = new AjaxPageableResponse(); try { int startRow = Integer.parseInt(request.getParameter("_startRow")); int endRow = Integer.parseInt(request.getParameter("_endRow")); Language language = (Language)request.getAttribute("LANGUAGE"); MerchantStore store = (MerchantStore)request.getAttribute(Constants.ADMIN_STORE); ProductCriteria criteria = new ProductCriteria(); criteria.setStartIndex(startRow); criteria.setMaxCount(endRow); if(!StringUtils.isBlank(categoryId) && !categoryId.equals("-1")) { //get other filters Long lcategoryId = 0L; try { lcategoryId = Long.parseLong(categoryId); } catch (Exception e) { LOGGER.error("Product page cannot parse categoryId " + categoryId ); resp.setStatus(AjaxResponse.RESPONSE_STATUS_FAIURE); String returnString = resp.toJSONString(); return new ResponseEntity<String>(returnString,HttpStatus.BAD_REQUEST); } if(lcategoryId>0) { Category category = categoryService.getById(lcategoryId); if(category==null || category.getMerchantStore().getId()!=store.getId()) { resp.setStatus(AjaxResponse.RESPONSE_STATUS_FAIURE); String returnString = resp.toJSONString(); return new ResponseEntity<String>(returnString,HttpStatus.BAD_REQUEST); } //get all sub categories StringBuilder lineage = new StringBuilder(); lineage.append(category.getLineage()).append(category.getId()).append("/"); List<Category> categories = categoryService.listByLineage(store, lineage.toString()); List<Long> categoryIds = new ArrayList<Long>(); for(Category cat : categories) { categoryIds.add(cat.getId()); } categoryIds.add(category.getId()); criteria.setCategoryIds(categoryIds); } } if(!StringUtils.isBlank(sku)) { criteria.setCode(sku); } if(!StringUtils.isBlank(name)) { criteria.setProductName(name); } if(!StringUtils.isBlank(available)) { if(available.equals("true")) { criteria.setAvailable(new Boolean(true)); } else { criteria.setAvailable(new Boolean(false)); } } ProductList productList = productService.listByStore(store, language, criteria); resp.setEndRow(productList.getTotalCount()); resp.setStartRow(startRow); List<Product> plist = productList.getProducts(); if(plist!=null) { for(Product product : plist) { Map entry = new HashMap(); entry.put("productId", product.getId()); ProductDescription description = product.getDescriptions().iterator().next(); entry.put("name", description.getName()); entry.put("sku", product.getSku()); entry.put("available", product.isAvailable()); 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,HttpStatus.OK); } @PreAuthorize("hasRole('PRODUCTS')") @RequestMapping(value="/admin/products/remove.html", method=RequestMethod.POST) public @ResponseBody ResponseEntity<String> deleteProduct(HttpServletRequest request, HttpServletResponse response, Locale locale) { String sid = request.getParameter("productId"); MerchantStore store = (MerchantStore)request.getAttribute(Constants.ADMIN_STORE); AjaxResponse resp = new AjaxResponse(); try { Long id = Long.parseLong(sid); Product product = productService.getById(id); if(product==null || product.getMerchantStore().getId()!=store.getId()) { resp.setStatusMessage(messages.getMessage("message.unauthorized", locale)); resp.setStatus(AjaxResponse.RESPONSE_STATUS_FAIURE); } else { productService.delete(product); resp.setStatus(AjaxResponse.RESPONSE_OPERATION_COMPLETED); } } 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-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); // } }