package org.podcastpedia.web.user;
import net.tanesha.recaptcha.ReCaptchaImpl;
import net.tanesha.recaptcha.ReCaptchaResponse;
import org.apache.log4j.Logger;
import org.podcastpedia.common.domain.User;
import org.podcastpedia.core.searching.SearchData;
import org.podcastpedia.core.user.UserEmailNotificationService;
import org.podcastpedia.core.user.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpStatus;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.ui.ModelMap;
import org.springframework.validation.BindingResult;
import org.springframework.web.HttpSessionRequiredException;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.bind.support.SessionStatus;
import javax.servlet.ServletRequest;
import java.util.UUID;
@Controller
@RequestMapping("users/registration")
public class RegistrationController {
protected static Logger LOG = Logger.getLogger(RegistrationController.class);
@Autowired
UserService userService;
@Autowired
private UserRegistrationFormValidator userRegistrationFormValidator;
@Autowired
private UserEmailNotificationService userEmailNotificationService;
@Autowired
private ReCaptchaImpl reCaptcha;
/**
* Add an empty searchData object to the model
*/
@ModelAttribute
public void addDataToModel(ModelMap model){
SearchData dataForSearchBar = new SearchData();
dataForSearchBar.setSearchMode("natural");
dataForSearchBar.setCurrentPage(1);
dataForSearchBar.setQueryText(null);
dataForSearchBar.setNumberResultsPerPage(10);
model.put("advancedSearchData", dataForSearchBar);
}
@RequestMapping(method=RequestMethod.GET)
public String prepareUserRegistrationForm(
@ModelAttribute("user") User user,
Model model){
LOG.debug("------ prepareUserRegistrationForm : Received request to show user registration form -----");
user = new User();
model.addAttribute("user", user);
return "user_registration_def";
}
@RequestMapping(method=RequestMethod.POST)
public String prepareUserRegistrationRequest(
@ModelAttribute("userRegistration") User user,
BindingResult result,
Model model,
@RequestParam("recaptcha_challenge_field") String challangeField,
@RequestParam("recaptcha_response_field") String responseField,
ServletRequest servletRequest, SessionStatus sessionStatus
){
LOG.debug("------ processContactForm : form is being validated and processed -----");
userRegistrationFormValidator.validate(user, result);
String remoteAddress = servletRequest.getRemoteAddr();
ReCaptchaResponse reCaptchaResponse = this.reCaptcha.checkAnswer(
remoteAddress, challangeField, responseField);
model.addAttribute("user", user);
//if(!result.hasErrors()){
if(!result.hasErrors() && reCaptchaResponse.isValid()){
user.setRegistrationToken(UUID.randomUUID().toString());
userService.submitUserForRegistration(user);
userEmailNotificationService.sendRegistrationEmailConfirmation(user);
userEmailNotificationService.sendUserRegistrationNotificationToAdmin(user);
sessionStatus.setComplete();
String queryString="?email=" + user.getUsername() + "&displayName=" + user.getDisplayName();
return "redirect:/users/registration/confirm-email" + queryString;
//return "user_registration_sent_email_def";
} else {
if (!reCaptchaResponse.isValid()) {
result.rejectValue("invalidRecaptcha", "invalid.captcha");
model.addAttribute("invalidRecaptcha", true);
}
return "login_def";
}
}
@RequestMapping(value = "confirm-email", method=RequestMethod.GET)
public String requestEmailConfirmationPage(
@RequestParam(value="email", required=false) String email,
@RequestParam(value="displayName", required=false) String displayName,
@ModelAttribute("user") User user,
Model model){
LOG.debug("------ display page asking the user to confirm the email -----");
model.addAttribute("email", email);
model.addAttribute("displayName", displayName);
return "user_registration_sent_email_def";
}
@RequestMapping(value = "confirmed", method=RequestMethod.GET)
public String emailConfirmated(
@RequestParam(value="user", required=true) String username,
@RequestParam(value="token", required=true) String registrationToken
){
LOG.debug("------ received confirmation email -----");
userService.enableUserAfterRegistration(username, registrationToken);
return "redirect:/login/custom_login?isConfirmedEmail=true";
}
@ExceptionHandler(HttpSessionRequiredException.class)
@ResponseStatus(value = HttpStatus.UNAUTHORIZED)
public String handleSessionExpired() {
return "login_def";
}
}