package com.salesmanager.admin.controller.configurations;
import com.salesmanager.admin.constants.Constants;
import com.salesmanager.admin.controller.ControllerConstants;
import com.salesmanager.admin.controller.pages.AbstractAdminController;
import com.salesmanager.admin.data.ConfigListWrapper;
import com.salesmanager.admin.data.Menu;
import com.salesmanager.core.business.modules.email.EmailConfig;
import com.salesmanager.core.business.services.system.EmailService;
import com.salesmanager.core.business.services.system.MerchantConfigurationService;
import com.salesmanager.core.model.merchant.MerchantStore;
import com.salesmanager.core.model.system.MerchantConfiguration;
import com.salesmanager.core.model.system.MerchantConfigurationType;
import org.apache.commons.lang3.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.core.env.Environment;
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.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Locale;
import java.util.Map;
import javax.inject.Inject;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
* Created by umesh on 3/21/17.
*/
@Controller
public class ConfigurationController extends AbstractAdminController {
private static final Logger LOGGER = LoggerFactory.getLogger(ConfigurationController.class);
@Inject
private MerchantConfigurationService merchantConfigurationService;
@Inject
private EmailService emailService;
@Inject
Environment env;
@PreAuthorize("hasRole('AUTH')")
@RequestMapping(value="/admin/configuration/accounts.html", method= RequestMethod.GET)
public String displayAccountsConfguration(Model model, HttpServletRequest request, HttpServletResponse response) throws Exception {
Map<String,String> activeMenus = new HashMap<String,String>();
activeMenus.put("configuration", "configuration");
activeMenus.put("accounts-conf", "accounts-conf");
setMenu(model, (Map<String, Menu>) request.getAttribute("MENUMAP"), "configuration", activeMenus);
List<MerchantConfiguration> configs = new ArrayList<MerchantConfiguration>();
MerchantStore store = (MerchantStore)request.getAttribute(Constants.ADMIN_STORE);
MerchantConfiguration merchantFBConfiguration = merchantConfigurationService.getMerchantConfiguration(Constants.KEY_FACEBOOK_PAGE_URL,store);
if(null == merchantFBConfiguration)
{
merchantFBConfiguration = new MerchantConfiguration();
merchantFBConfiguration.setKey(Constants.KEY_FACEBOOK_PAGE_URL);
merchantFBConfiguration.setMerchantConfigurationType(MerchantConfigurationType.CONFIG);
}
configs.add(merchantFBConfiguration);
MerchantConfiguration merchantGoogleAnalyticsConfiguration = merchantConfigurationService.getMerchantConfiguration(Constants.KEY_GOOGLE_ANALYTICS_URL,store);
if(null == merchantGoogleAnalyticsConfiguration)
{
merchantGoogleAnalyticsConfiguration = new MerchantConfiguration();
merchantGoogleAnalyticsConfiguration.setKey(Constants.KEY_GOOGLE_ANALYTICS_URL);
merchantGoogleAnalyticsConfiguration.setMerchantConfigurationType(MerchantConfigurationType.CONFIG);
}
configs.add(merchantGoogleAnalyticsConfiguration);
MerchantConfiguration merchantInstagramConfiguration = merchantConfigurationService.getMerchantConfiguration(Constants.KEY_INSTAGRAM_URL,store);
if(null == merchantInstagramConfiguration)
{
merchantInstagramConfiguration = new MerchantConfiguration();
merchantInstagramConfiguration.setKey(Constants.KEY_INSTAGRAM_URL);
merchantInstagramConfiguration.setMerchantConfigurationType(MerchantConfigurationType.CONFIG);
}
configs.add(merchantInstagramConfiguration);
MerchantConfiguration merchantPinterestConfiguration = merchantConfigurationService.getMerchantConfiguration(Constants.KEY_PINTEREST_PAGE_URL,store);
if(null == merchantPinterestConfiguration)
{
merchantPinterestConfiguration = new MerchantConfiguration();
merchantPinterestConfiguration.setKey(Constants.KEY_PINTEREST_PAGE_URL);
merchantPinterestConfiguration.setMerchantConfigurationType(MerchantConfigurationType.CONFIG);
}
configs.add(merchantPinterestConfiguration);
MerchantConfiguration twitterConfiguration = merchantConfigurationService.getMerchantConfiguration(Constants.KEY_TWITTER_HANDLE,store);
if(null == twitterConfiguration)
{
twitterConfiguration = new MerchantConfiguration();
twitterConfiguration.setKey(Constants.KEY_TWITTER_HANDLE);
twitterConfiguration.setMerchantConfigurationType(MerchantConfigurationType.CONFIG);
}
configs.add(twitterConfiguration);
ConfigListWrapper configWrapper = new ConfigListWrapper();
configWrapper.setMerchantConfigs(configs);
model.addAttribute("configuration",configWrapper);
return ControllerConstants.Tiles.Configuration.accounts;
}
@PreAuthorize("hasRole('AUTH')")
@RequestMapping(value="/admin/configuration/saveConfiguration.html", method=RequestMethod.POST)
public String saveConfigurations(@ModelAttribute("configuration") ConfigListWrapper configWrapper, BindingResult result, Model model, HttpServletRequest request, Locale locale) throws Exception
{
Map<String,String> activeMenus = new HashMap<String,String>();
activeMenus.put("configuration", "configuration");
activeMenus.put("accounts-conf", "accounts-conf");
setMenu(model, (Map<String, Menu>) request.getAttribute("MENUMAP"), "configuration", activeMenus);
List<MerchantConfiguration> configs = configWrapper.getMerchantConfigs();
MerchantStore store = (MerchantStore)request.getAttribute(Constants.ADMIN_STORE);
for(MerchantConfiguration mConfigs : configs)
{
mConfigs.setMerchantStore(store);
if(!StringUtils.isBlank(mConfigs.getValue())) {
mConfigs.setMerchantConfigurationType(MerchantConfigurationType.CONFIG);
merchantConfigurationService.saveOrUpdate(mConfigs);
} else {//remove if submited blank and exists
MerchantConfiguration config = merchantConfigurationService.getMerchantConfiguration(mConfigs.getKey(), store);
if(config!=null) {
merchantConfigurationService.delete(config);
}
}
}
model.addAttribute("success","success");
model.addAttribute("configuration",configWrapper);
return ControllerConstants.Tiles.Configuration.accounts;
}
@PreAuthorize("hasRole('AUTH')")
@RequestMapping(value="/admin/configuration/email.html", method=RequestMethod.GET)
public String displayEmailSettings(Model model, HttpServletRequest request, HttpServletResponse response) throws Exception {
Map<String,String> activeMenus = new HashMap<String,String>();
activeMenus.put("configuration", "configuration");
activeMenus.put("email-conf", "email-conf");
setMenu(model, (Map<String, Menu>) request.getAttribute("MENUMAP"), "configuration", activeMenus);
MerchantStore store = (MerchantStore)request.getAttribute(Constants.ADMIN_STORE);
EmailConfig emailConfig = emailService.getEmailConfiguration(store);
if(emailConfig == null){
emailConfig = new EmailConfig();
//TODO: Need to check below properties. When there are no record available in MerchantConfguration table with EMAIL_CONFIG key,
// instead of showing blank fields in setup screen, show default configured values from email.properties
emailConfig.setProtocol(env.getProperty("mailSender.protocol"));
emailConfig.setHost(env.getProperty("mailSender.host"));
emailConfig.setPort(env.getProperty("mailSender.port}"));
emailConfig.setUsername(env.getProperty("mailSender.username"));
emailConfig.setPassword(env.getProperty("mailSender.password"));
emailConfig.setSmtpAuth(Boolean.parseBoolean(env.getProperty("mailSender.mail.smtp.auth")));
emailConfig.setStarttls(Boolean.parseBoolean(env.getProperty("mail.smtp.starttls.enable")));
}
model.addAttribute("configuration", emailConfig);
return ControllerConstants.Tiles.Configuration.email;
}
@PreAuthorize("hasRole('AUTH')")
@RequestMapping(value="/admin/configuration/saveEmailConfiguration.html", method=RequestMethod.POST)
public String saveEmailSettings(@ModelAttribute("configuration") EmailConfig config, BindingResult result, Model model, HttpServletRequest request, Locale locale) throws Exception {
Map<String,String> activeMenus = new HashMap<String,String>();
activeMenus.put("configuration", "configuration");
activeMenus.put("email-conf", "email-conf");
setMenu(model, (Map<String, Menu>) request.getAttribute("MENUMAP"), "configuration", activeMenus);
MerchantStore store = (MerchantStore)request.getAttribute(Constants.ADMIN_STORE);
EmailConfig emailConfig = emailService.getEmailConfiguration(store);
if(emailConfig == null){
emailConfig = new EmailConfig();
}
// populte EmailConfig model from UI values
emailConfig.setProtocol(config.getProtocol());
emailConfig.setHost(config.getHost());
emailConfig.setPort(config.getPort());
emailConfig.setUsername(config.getUsername());
emailConfig.setPassword(config.getPassword());
emailConfig.setSmtpAuth(config.isSmtpAuth());
emailConfig.setStarttls(config.isStarttls());
emailService.saveEmailConfiguration(emailConfig, store);
model.addAttribute("configuration", emailConfig);
model.addAttribute("success","success");
return ControllerConstants.Tiles.Configuration.email;
}
}