package org.fuzzydb.samples.mvc;
import javax.validation.Valid;
import org.fuzzydb.samples.mvc.message.Message;
import org.fuzzydb.samples.mvc.message.MessageType;
import org.fuzzydb.samples.repositories.UserRepository;
import org.fuzzydb.samples.security.SignInUtils;
import org.fuzzydb.samples.security.WhirlwindUserDetails;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.dao.DuplicateKeyException;
import org.springframework.social.connect.Connection;
import org.springframework.social.connect.web.ProviderSignInUtils;
import org.springframework.stereotype.Controller;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.StringUtils;
import org.springframework.validation.Errors;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.context.request.WebRequest;
@Controller
public class UserDetailsController {
@Autowired
private UserRepository userRepo;
@RequestMapping(value="/signup", method=RequestMethod.GET)
public SignupForm signupForm(WebRequest request) {
Connection<?> connection = ProviderSignInUtils.getConnection(request);
if (connection != null) {
request.setAttribute("message", new Message(MessageType.INFO, "Your " + StringUtils.capitalize(connection.getKey().getProviderId()) + " identity is not associated with an account. If you're new, please sign up."), WebRequest.SCOPE_REQUEST);
return SignupForm.fromProviderUser(connection.fetchUserProfile());
} else {
return new SignupForm();
}
}
@RequestMapping(value="/signup", method=RequestMethod.POST)
public String doSignup(@Valid SignupForm form, Errors result, WebRequest request) {
if (result.hasErrors()) {
return "signup";
}
WhirlwindUserDetails userDetails = WhirlwindUserDetails.createEnabledUser(form.getEmail(), form.getPassword());
if (exists(form)) {
result.rejectValue("email", "accounts.emailAlreadyRegistered");
}
if (result.hasErrors()) {
return "signup";
}
try {
SignInUtils.signin(userDetails.getUsername());
ProviderSignInUtils.handlePostSignUp(userDetails.getUsername(), request);
saveUser(userDetails);
return "redirect:/";
} catch (DuplicateKeyException e) {
result.rejectValue("email", "accounts.emailAlreadyRegistered");
return "signup";
}
}
@Transactional(readOnly=true)
private boolean exists(SignupForm form) {
return userRepo.exists(form.getEmail());
}
@Transactional
private void saveUser(WhirlwindUserDetails userDetails) {
userRepo.save(userDetails);
}
}