package com.salesmanager.shop.store.services.category; import com.salesmanager.core.business.services.catalog.category.CategoryService; import com.salesmanager.core.business.services.catalog.product.ProductService; import com.salesmanager.core.business.services.merchant.MerchantStoreService; import com.salesmanager.core.business.services.reference.language.LanguageService; import com.salesmanager.core.model.catalog.category.Category; 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.category.PersistableCategory; import com.salesmanager.shop.model.catalog.category.ReadableCategory; import com.salesmanager.shop.populator.catalog.ReadableCategoryPopulator; import com.salesmanager.shop.store.controller.category.facade.CategoryFacade; import org.apache.commons.lang3.StringUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.http.HttpStatus; import org.springframework.stereotype.Controller; 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.util.Map; /** * Rest services for category management * @author Carl Samson * */ @Controller @RequestMapping("/services") public class ShoppingCategoryRESTController { @Inject private LanguageService languageService; @Inject private MerchantStoreService merchantStoreService; @Inject private CategoryService categoryService; @Inject private ProductService productService; @Inject private CategoryFacade categoryFacade; private static final Logger LOGGER = LoggerFactory.getLogger(ShoppingCategoryRESTController.class); @RequestMapping( value="/public/{store}/category/{id}", method=RequestMethod.GET) @ResponseBody public ReadableCategory getCategory(@PathVariable final String store, @PathVariable Long id, HttpServletRequest request, HttpServletResponse response) { try { /** default routine **/ MerchantStore merchantStore = (MerchantStore)request.getAttribute(Constants.MERCHANT_STORE); if(merchantStore!=null) { if(!merchantStore.getCode().equals(store)) { merchantStore = null; } } if(merchantStore== null) { merchantStore = merchantStoreService.getByCode(store); } if(merchantStore==null) { LOGGER.error("Merchant store is null for code " + store); response.sendError(503, "Merchant store is null for code " + store); return null; } Language language = merchantStore.getDefaultLanguage(); Map<String,Language> langs = languageService.getLanguagesMap(); if(!StringUtils.isBlank(request.getParameter(Constants.LANG))) { String lang = request.getParameter(Constants.LANG); if(lang!=null) { language = langs.get(language); } } if(language==null) { language = merchantStore.getDefaultLanguage(); } /** end default routine **/ Category dbCategory = categoryService.getByLanguage(id, language); if(dbCategory==null) { response.sendError(503, "Invalid category id"); return null; } if(dbCategory.getMerchantStore().getId().intValue()!=merchantStore.getId().intValue()){ response.sendError(503, "Invalid category id"); return null; } ReadableCategoryPopulator populator = new ReadableCategoryPopulator(); //TODO count products by category ReadableCategory category = populator.populate(dbCategory, new ReadableCategory(), merchantStore, merchantStore.getDefaultLanguage()); return category; } catch (Exception e) { LOGGER.error("Error while saving category",e); try { response.sendError(503, "Error while saving category " + e.getMessage()); } catch (Exception ignore) { } return null; } } /** * Create new category for a given MerchantStore */ @RequestMapping( value="/private/{store}/category", method=RequestMethod.POST) @ResponseStatus(HttpStatus.CREATED) @ResponseBody public PersistableCategory createCategory(@PathVariable final String store, @Valid @RequestBody PersistableCategory category, HttpServletRequest request, HttpServletResponse response) { try { MerchantStore merchantStore = (MerchantStore)request.getAttribute(Constants.MERCHANT_STORE); if(merchantStore!=null) { if(!merchantStore.getCode().equals(store)) { merchantStore = null; } } if(merchantStore== null) { merchantStore = merchantStoreService.getByCode(store); } if(merchantStore==null) { LOGGER.error("Merchant store is null for code " + store); response.sendError(503, "Merchant store is null for code " + store); return null; } categoryFacade.saveCategory(merchantStore, category); category.setId(category.getId()); return category; } catch (Exception e) { LOGGER.error("Error while saving category",e); try { response.sendError(503, "Error while saving category " + e.getMessage()); } catch (Exception ignore) { } return null; } } /** * Deletes a category for a given MerchantStore */ @RequestMapping( value="/private/{store}/category/{id}", method=RequestMethod.DELETE) @ResponseStatus(HttpStatus.NO_CONTENT) public void deleteCategory(@PathVariable final String store, @PathVariable Long id, HttpServletRequest request, HttpServletResponse response) throws Exception { Category category = categoryService.getById(id); if(category != null && category.getMerchantStore().getCode().equalsIgnoreCase(store)){ categoryService.delete(category); }else{ response.sendError(404, "No Category found for ID : " + id); } } }