@RequestMapping(value = "signup", method = RequestMethod.POST)
  public String signup(
      HttpServletRequest request,
      @Valid @ModelAttribute SignupForm signupForm,
      BindingResult result,
      Errors errors,
      RedirectAttributes ra) {
    convertPasswordError(result);
    if (!errors.hasErrors()) {
      validateUniqueEmail(signupForm.getEmail(), errors);
    }

    if (errors.hasErrors()) {
      LOG.info("Errors in signup form");
      return SIGNUP_VIEW_NAME;
    }

    signUpService.signup(
        request,
        signupForm.getFirstName(),
        signupForm.getSurname(),
        signupForm.getEmail(),
        signupForm.getPassword());
    // see /WEB-INF/i18n/messages.properties and /WEB-INF/views/homeSignedIn.html
    MessageHelper.addInfoAttribute(ra, "signup.success");
    return "redirect:/signin";
  }
 @RequestMapping(value = "activate")
 public String activate(@RequestParam Long id, @RequestParam String key, RedirectAttributes ra) {
   LOG.info("New activation detected for id {} with key {}", id, key);
   if (signUpService.activate(id, key)) {
     MessageHelper.addInfoAttribute(ra, "activation.success");
   }
   return "redirect:/signin";
 }
  @Scheduled(fixedRate = 300000) // every 5 minutes
  public void scavengeUnusedPasswordResetRequests() {
    LOG.info("Scavenging password resets...");

    try {
      signUpService.removeExpiredPasswordResets();
    } catch (Throwable t) {
      LOG.error("Exception caught removing expired passwords", t);
    }
  }