MyAccountController.java

package org.xandercat.pmdb.controller;

import java.security.Principal;

import javax.validation.Valid;

import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.springframework.beans.factory.annotation.Autowired;
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.xandercat.pmdb.dto.PmdbUser;
import org.xandercat.pmdb.form.useradmin.UserForm;
import org.xandercat.pmdb.service.UserService;
import org.xandercat.pmdb.util.Alerts;
import org.xandercat.pmdb.util.ViewUtil;
import org.xandercat.pmdb.util.format.FormatUtil;

/**
 * Controller for user updating their own account.
 * 
 * @author Scott Arnold
 */
@Controller
public class MyAccountController {

	private static final Logger LOGGER = LogManager.getLogger(MyAccountController.class);
	
	@Autowired
	UserService userService;
	
	@ModelAttribute("viewTab")
	public String getViewTab() {
		return ViewUtil.TAB_MY_ACCOUNT;
	}
	
	/**
	 * Page for editing user details.
	 * 
	 * @param model      model
	 * @param principal  principal
	 * 
	 * @return page for editing user details
	 */
	@RequestMapping("/myaccount")
	public String editUser(Model model, Principal principal) {
		PmdbUser user = userService.getUser(principal.getName()).get();
		boolean administrator = userService.isAdministrator(principal.getName());
		UserForm userForm = new UserForm(user, administrator);
		model.addAttribute("userForm", userForm);
		return "myaccount/edituser";
	}
	
	/**
	 * Processing editing of user details.
	 * 
	 * @param model      model
	 * @param principal  principal
	 * @param userForm   form for user details
	 * @param result     binding result
	 * 
	 * @return page for editing user details
	 */
	@RequestMapping("/myaccount/editUserSubmit")
	public String editUserSubmit(Model model, Principal principal,
			@ModelAttribute("userForm") @Valid UserForm userForm,
			BindingResult result) {
		if (result.hasErrors()) {
			return "myaccount/edituser";
		}
		try {
			String newPassword = FormatUtil.isBlank(userForm.getPasswordPair().getFirst())? null : userForm.getPasswordPair().getFirst().trim();
			userService.saveMyAccountUser(userForm.toUser(), newPassword, principal.getName());
			Alerts.setMessage(model, "Account information saved.");
		} catch (Exception e) {
			LOGGER.error("Unexpected error when updating user.", e);
			Alerts.setErrorMessage(model, "An unexpected error occurred while attempting to save account information.");
		}
		return editUser(model, principal);		
	}

}