package com.salesmanager.shop.store.controller.customer;
import com.salesmanager.core.business.exception.ConversionException;
import com.salesmanager.core.business.services.catalog.product.PricingService;
import com.salesmanager.core.business.services.shoppingcart.ShoppingCartCalculationService;
import com.salesmanager.core.business.services.shoppingcart.ShoppingCartService;
import com.salesmanager.core.business.utils.ajax.AjaxResponse;
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.core.model.shoppingcart.ShoppingCart;
import com.salesmanager.shop.constants.Constants;
import com.salesmanager.shop.model.customer.SecuredCustomer;
import com.salesmanager.shop.model.shoppingcart.ShoppingCartData;
import com.salesmanager.shop.populator.shoppingCart.ShoppingCartDataPopulator;
import com.salesmanager.shop.store.controller.AbstractController;
import com.salesmanager.shop.store.controller.customer.facade.CustomerFacade;
import com.salesmanager.shop.utils.ImageFilePath;
import org.apache.commons.lang3.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.security.authentication.AuthenticationManager;
import org.springframework.security.core.AuthenticationException;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.*;
import javax.inject.Inject;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
* Custom Spring Security authentication
* @author Carl Samson
*
*/
@Controller
@RequestMapping("/shop/customer")
public class CustomerLoginController extends AbstractController {
@Inject
private AuthenticationManager customerAuthenticationManager;
@Inject
private CustomerFacade customerFacade;
@Inject
private ShoppingCartService shoppingCartService;
@Inject
private ShoppingCartCalculationService shoppingCartCalculationService;
@Inject
private PricingService pricingService;
@Inject
@Qualifier("img")
private ImageFilePath imageUtils;
private static final Logger LOG = LoggerFactory.getLogger(CustomerLoginController.class);
private AjaxResponse logon(String userName, String password, String storeCode, HttpServletRequest request, HttpServletResponse response) throws Exception {
AjaxResponse jsonObject = new AjaxResponse();
try {
LOG.debug("Authenticating user " + userName);
//user goes to shop filter first so store and language are set
MerchantStore store = (MerchantStore)request.getAttribute(Constants.MERCHANT_STORE);
Language language = (Language)request.getAttribute("LANGUAGE");
//check if username is from the appropriate store
Customer customerModel = customerFacade.getCustomerByUserName(userName, store);
if(customerModel==null) {
jsonObject.setStatus(AjaxResponse.RESPONSE_STATUS_FAIURE);
return jsonObject;
}
if(!customerModel.getMerchantStore().getCode().equals(storeCode)) {
jsonObject.setStatus(AjaxResponse.RESPONSE_STATUS_FAIURE);
return jsonObject;
}
customerFacade.authenticate(customerModel, userName, password);
//set customer in the http session
super.setSessionAttribute(Constants.CUSTOMER, customerModel, request);
jsonObject.setStatus(AjaxResponse.RESPONSE_STATUS_SUCCESS);
jsonObject.addEntry(Constants.RESPONSE_KEY_USERNAME, customerModel.getNick());
LOG.info( "Fetching and merging Shopping Cart data" );
String sessionShoppingCartCode= (String)request.getSession().getAttribute( Constants.SHOPPING_CART );
if(!StringUtils.isBlank(sessionShoppingCartCode)) {
ShoppingCart shoppingCart = customerFacade.mergeCart( customerModel, sessionShoppingCartCode, store, language );
ShoppingCartData shoppingCartData=this.populateShoppingCartData(shoppingCart, store, language);
if(shoppingCartData !=null){
jsonObject.addEntry(Constants.SHOPPING_CART, shoppingCartData.getCode());
request.getSession().setAttribute(Constants.SHOPPING_CART, shoppingCartData.getCode());
//set cart in the cookie
Cookie c = new Cookie(Constants.COOKIE_NAME_CART, shoppingCartData.getCode());
c.setMaxAge(60 * 24 * 3600);
c.setPath(Constants.SLASH);
response.addCookie(c);
} else {
//DELETE COOKIE
Cookie c = new Cookie(Constants.COOKIE_NAME_CART, "");
c.setMaxAge(0);
c.setPath(Constants.SLASH);
response.addCookie(c);
}
} else {
ShoppingCart cartModel = shoppingCartService.getByCustomer(customerModel);
if(cartModel!=null) {
jsonObject.addEntry( Constants.SHOPPING_CART, cartModel.getShoppingCartCode());
request.getSession().setAttribute(Constants.SHOPPING_CART, cartModel.getShoppingCartCode());
Cookie c = new Cookie(Constants.COOKIE_NAME_CART, cartModel.getShoppingCartCode());
c.setMaxAge(60 * 24 * 3600);
c.setPath(Constants.SLASH);
response.addCookie(c);
}
}
StringBuilder cookieValue = new StringBuilder();
cookieValue.append(store.getCode()).append("_").append(customerModel.getNick());
//set username in the cookie
Cookie c = new Cookie(Constants.COOKIE_NAME_USER, cookieValue.toString());
c.setMaxAge(60 * 24 * 3600);
c.setPath(Constants.SLASH);
response.addCookie(c);
} catch (AuthenticationException ex) {
jsonObject.setStatus(AjaxResponse.RESPONSE_STATUS_FAIURE);
} catch(Exception e) {
jsonObject.setStatus(AjaxResponse.RESPONSE_STATUS_FAIURE);
}
return jsonObject;
}
//http://localhost:8080/sm-shop/shop/customer/authenticate.html?userName=shopizer&password=password&storeCode=DEFAULT
@RequestMapping(value="/authenticate.html", method=RequestMethod.GET)
public @ResponseBody String basicLogon(@RequestParam String userName, @RequestParam String password, @RequestParam String storeCode, HttpServletRequest request, HttpServletResponse response) throws Exception {
AjaxResponse jsonObject = this.logon(userName, password, storeCode, request, response);
return jsonObject.toJSONString();
}
/**
* Customer login entry point
* @param securedCustomer
* @param request
* @param response
* @return
* @throws Exception
*/
@RequestMapping(value="/logon.html", method=RequestMethod.POST)
public @ResponseBody String jsonLogon(@ModelAttribute SecuredCustomer securedCustomer, HttpServletRequest request, HttpServletResponse response) throws Exception {
AjaxResponse jsonObject = this.logon(securedCustomer.getUserName(), securedCustomer.getPassword(), securedCustomer.getStoreCode(), request, response);
return jsonObject.toJSONString();
}
private ShoppingCartData populateShoppingCartData(final ShoppingCart cartModel , final MerchantStore store, final Language language){
ShoppingCartDataPopulator shoppingCartDataPopulator = new ShoppingCartDataPopulator();
shoppingCartDataPopulator.setShoppingCartCalculationService( shoppingCartCalculationService );
shoppingCartDataPopulator.setPricingService( pricingService );
try
{
return shoppingCartDataPopulator.populate( cartModel , store, language);
}
catch ( ConversionException ce )
{
LOG.error( "Error in converting shopping cart to shopping cart data", ce );
}
return null;
}
}