/**
* Most of the code in the Qalingo project is copyrighted Hoteia and licensed
* under the Apache License Version 2.0 (release version 0.8.0)
* http://www.apache.org/licenses/LICENSE-2.0
*
* Copyright (c) Hoteia, 2012-2014
* http://www.hoteia.com - http://twitter.com/hoteia - contact@hoteia.com
*
*/
package org.hoteia.qalingo.core.web.mvc.controller.user;
import java.util.ArrayList;
import java.util.List;
import java.util.Locale;
import javax.servlet.http.HttpServletRequest;
import javax.validation.Valid;
import org.apache.commons.lang.StringUtils;
import org.hoteia.qalingo.core.ModelConstants;
import org.hoteia.qalingo.core.RequestConstants;
import org.hoteia.qalingo.core.domain.User;
import org.hoteia.qalingo.core.domain.enumtype.BoUrls;
import org.hoteia.qalingo.core.i18n.enumtype.ScopeWebMessage;
import org.hoteia.qalingo.core.web.mvc.controller.AbstractBackofficeQalingoController;
import org.hoteia.qalingo.core.web.mvc.form.UserForm;
import org.hoteia.qalingo.core.web.resolver.RequestData;
import org.hoteia.qalingo.core.web.servlet.ModelAndViewThemeDevice;
import org.hoteia.qalingo.core.web.servlet.view.RedirectView;
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 org.springframework.web.servlet.ModelAndView;
/**
* User details
*/
@Controller("userPersonalController")
public class UserPersonalController extends AbstractBackofficeQalingoController {
@RequestMapping(value = BoUrls.PERSONAL_DETAILS_URL, method = RequestMethod.GET)
public ModelAndView personalDetails(final HttpServletRequest request, final Model model) throws Exception {
ModelAndViewThemeDevice modelAndView = new ModelAndViewThemeDevice(getCurrentVelocityPath(request), BoUrls.PERSONAL_DETAILS.getVelocityPage());
final RequestData requestData = requestUtil.getRequestData(request);
final User currentUser = requestData.getUser();
// User is already set by the abstract
Object[] params = {currentUser.getLastname() + " " + currentUser.getFirstname() + " (" + currentUser.getLogin() + ")"};
overrideDefaultMainContentTitle(request, modelAndView, BoUrls.PERSONAL_DETAILS.getKey(), params);
List<String> excludedPatterns = new ArrayList<String>();
excludedPatterns.add(BoUrls.PERSONAL_DETAILS_URL);
excludedPatterns.add(BoUrls.PERSONAL_EDIT_URL);
String lastUrl = requestUtil.getLastRequestUrl(request, excludedPatterns, backofficeUrlService.generateUrl(BoUrls.HOME, requestData));
model.addAttribute(ModelConstants.URL_BACK, lastUrl);
return modelAndView;
}
@RequestMapping(value = BoUrls.PERSONAL_EDIT_URL, method = RequestMethod.GET)
public ModelAndView displayPersonalEdit(final HttpServletRequest request, final Model model, @ModelAttribute(ModelConstants.USER_FORM) UserForm userForm) throws Exception {
ModelAndViewThemeDevice modelAndView = new ModelAndViewThemeDevice(getCurrentVelocityPath(request), BoUrls.PERSONAL_EDIT.getVelocityPage());
final RequestData requestData = requestUtil.getRequestData(request);
final User currentUser = requestData.getUser();
// User is already set by the abstract
Object[] params = {currentUser.getLastname() + " " + currentUser.getFirstname() + " (" + currentUser.getLogin() + ")"};
overrideDefaultMainContentTitle(request, modelAndView, BoUrls.PERSONAL_EDIT.getKey(), params);
model.addAttribute(ModelConstants.URL_BACK, backofficeUrlService.generateUrl(BoUrls.PERSONAL_DETAILS, requestData, currentUser));
return modelAndView;
}
@RequestMapping(value = BoUrls.PERSONAL_EDIT_URL, method = RequestMethod.POST)
public ModelAndView submitPersonalEdit(final HttpServletRequest request, @Valid @ModelAttribute(ModelConstants.USER_FORM) UserForm userForm,
BindingResult result, final Model model) throws Exception {
if (result.hasErrors()) {
return displayPersonalEdit(request, model, userForm);
}
final String newEmail = userForm.getEmail();
final User currentUser = requestUtil.getCurrentUser(request);
final User checkUser = userService.getUserActivedByLoginOrEmail(newEmail);
if(checkUser != null
&& !currentUser.getEmail().equalsIgnoreCase(newEmail)) {
final String forgottenPasswordUrl = backofficeUrlService.generateUrl(BoUrls.FORGOTTEN_PASSWORD, requestUtil.getRequestData(request));
final Object[] objects = {forgottenPasswordUrl};
result.rejectValue("email", "fo.user.error_form_create_account_account_already_exist", objects,"This email user account already exist! Go on this <a href=\"${0}\" alt=\"\">page</a> to get a new password.");
}
// Update the user
webBackofficeService.createOrUpdatePersonalUser(checkUser, userForm);
requestUtil.updateCurrentUser(request, userService.getUserActivedByLoginOrEmail(newEmail));
final String urlRedirect = backofficeUrlService.generateRedirectUrl(BoUrls.PERSONAL_DETAILS, requestUtil.getRequestData(request));
return new ModelAndView(new RedirectView(urlRedirect));
}
@RequestMapping(value = BoUrls.USER_NEW_ACCOUNT_VALIDATION_URL, method = RequestMethod.GET)
public ModelAndView newAccountValidation(final HttpServletRequest request, final Model model) throws Exception {
final RequestData requestData = requestUtil.getRequestData(request);
final Locale locale = requestData.getLocale();
String token = request.getParameter(RequestConstants.REQUEST_PARAMETER_NEW_ACCOUNT_VALIDATION_TOKEN);
if (StringUtils.isEmpty(token)) {
// ADD ERROR MESSAGE
String errorMessage = getSpecificMessage(ScopeWebMessage.CUSTOMER, "error_form_new_account_validation_token_is_wrong", locale);
addSessionErrorMessage(request, errorMessage);
}
String email = request.getParameter(RequestConstants.REQUEST_PARAMETER_NEW_CUSTOMER_VALIDATION_EMAIL);
final User user = userService.getUserActivedByLoginOrEmail(email);
if (user == null) {
// ADD ERROR MESSAGE
String errorMessage = getSpecificMessage(ScopeWebMessage.CUSTOMER, "error_form_new_account_validation_email_or_login_are_wrong", locale);
addSessionErrorMessage(request, errorMessage);
}
// Save user as active
webBackofficeService.validateNewUser(requestData, user);
// ADD SUCCESS MESSAGE
String successMessage = getSpecificMessage(ScopeWebMessage.USER, "form_new_account_validation_success_message", locale);
addSessionSuccessMessage(request, successMessage);
final String urlRedirect = backofficeUrlService.generateRedirectUrl(BoUrls.PERSONAL_DETAILS, requestData);
return new ModelAndView(new RedirectView(urlRedirect));
}
/**
*
*/
@ModelAttribute(ModelConstants.USER_FORM)
protected UserForm initUserForm(final HttpServletRequest request, final Model model) throws Exception {
final RequestData requestData = requestUtil.getRequestData(request);
final User currentUser = requestData.getUser();
return backofficeFormFactory.buildUserForm(requestData, currentUser);
}
}