/**
* Balero CMS Project: Proyecto 100% Mexicano de código libre.
* Página Oficial: http://www.balerocms.com
*
* @author Anibal Gomez <anibalgomez@icloud.com>
* @copyright Copyright (C) 2015 Neblina Software. Derechos reservados.
* @license Licencia BSD; vea LICENSE.txt
*/
package com.neblina.balero.web.authorized.user;
import com.neblina.balero.domain.User;
import com.neblina.balero.service.PropertyService;
import com.neblina.balero.service.UserService;
import com.neblina.balero.service.repository.*;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.access.annotation.Secured;
import org.springframework.security.core.Authentication;
import org.springframework.security.core.context.SecurityContextHolder;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.validation.BindingResult;
import org.springframework.web.bind.annotation.*;
import javax.validation.Valid;
import java.util.Base64;
import java.util.Locale;
@Controller
@RequestMapping("/user")
public class UserController {
private static final Logger log = LogManager.getLogger(UserController.class.getName());
@Autowired
private UserService userService;
@Autowired
private BlogRepository blogRepository;
@Autowired
private SettingRepository settingRepository;
@Autowired
private PageRepository pageRepository;
@Autowired
private PropertyService propertyService;
@RequestMapping(value = "/register", method = RequestMethod.GET)
public String registerForm(Model model,
Locale locale,
@ModelAttribute(value="user") @Valid User user, BindingResult bindingResultUser) {
if(bindingResultUser.hasErrors()) {
//model.addAttribute("user", user);
}
String lang = locale.getLanguage();
model.addAttribute("settings", settingRepository.findOneByCode(locale.getLanguage()));
model.addAttribute("pages", pageRepository.findAllByCode(lang));
model.addAttribute("properties", propertyService.findOneById(1L));
return propertyService.getTemplate() + "/register";
}
@RequestMapping(value = "/register", method = RequestMethod.POST)
public String register(Model model,
Locale locale,
@RequestParam(value = "username") String username,
@RequestParam(value = "password") String password,
@RequestParam(value = "passwordVerify") String passwordVerify,
@RequestParam(value = "firstName") String firstName,
@RequestParam(value = "lastName") String lastName,
@RequestParam(value = "email") String email,
@ModelAttribute(value="user") @Valid User user, BindingResult bindingResultUser) {
log.debug("Creating user... " + username);
model.addAttribute("properties", propertyService.findOneById(1L));
if(!password.equals(passwordVerify)) {
bindingResultUser.rejectValue("passwordVerify", "error.passwordVerify", "Do not match.");
}
if(username.contains("admin")) {
bindingResultUser.rejectValue("username", "error.username", "You can't use this username.");
}
if(bindingResultUser.hasErrors()) {
model.addAttribute("settings", settingRepository.findOneByCode(locale.getLanguage()));
return propertyService.getTemplate() + "/register";
}
User usr = userService.findOneByUsername(username);
if(usr != null) {
log.debug("Username value: " + usr.getUsername());
}
if(usr == null) {
log.debug("Username NOT found");
User usr2 = userService.findOneByEmail(email);
if(usr2 != null) { // email found
log.debug("Email already exists. Register with this email.");
userService.deleteUserEmail(usr2.getId()); // Clean
userService.createUserAccount(username, password, passwordVerify, firstName, lastName, usr2.getEmail(), true, "ROLE_USER", "user"); // Add
} else {
userService.createUserAccount(username, password, passwordVerify, firstName, lastName, email, true, "ROLE_USER", "user");
}
}
return "redirect:/login";
}
@Secured("ROLE_USER")
@RequestMapping(value = {"", "/", "/dashboard"} )
public String dashboardUser(Model model) {
String username = userService.getMyUsername();
model.addAttribute("users", userService.findOneByUsername(username));
model.addAttribute("posts", blogRepository.findAllByAuthor(username));
model.addAttribute("url", "user");
return "authorized/dashboard";
}
@Secured("ROLE_USER")
@RequestMapping("/profile")
public String profileGet(Model model) {
Authentication auth = SecurityContextHolder.getContext().getAuthentication();
String username = auth.getName(); //get logged in username
log.debug("Username: " + username);
User user = userService.findOneByUsername(username);
model.addAttribute("user", user);
return "authorized/profile";
}
@Secured("ROLE_USER")
@RequestMapping(value = "/profile", method = RequestMethod.POST)
public String profilePost(Model model,
@RequestParam("firstName") String firstName,
@RequestParam("lastName") String lastName,
@RequestParam("email") String email) {
log.debug("POST /user/profile");
String username = userService.getMyUsername();
model.addAttribute("success", 1);
User user = userService.findOneByUsername(username);
model.addAttribute("user", user);
model.addAttribute("url", "user");
userService.saveUserProfile(firstName, lastName, email);
return "authorized/profile";
}
@Secured("ROLE_USER")
@RequestMapping(value = "/password", method = RequestMethod.POST)
public String passwordPost(Model model,
@RequestParam("newPassword") String newPassword) {
log.debug("POST /user/password");
String username = userService.getMyUsername();
model.addAttribute("success", 1);
User user = userService.findOneByUsername(username);
model.addAttribute("user", user);
model.addAttribute("url", "user");
userService.changeUserPassword(newPassword);
return "authorized/profile";
}
@RequestMapping(value = "/subscribe", method = RequestMethod.GET)
public String unsubscribeUserGET(@RequestParam("unsubscribe") String email) {
log.debug("GET Request -> /subscribe?unsubscribe=" + email);
Base64.Decoder decoder = Base64.getDecoder();
userService.cancelSubscribedStatusByEmail(new String(decoder.decode(email)));
return "subscribe";
}
@RequestMapping(value = "/subscribe", method = RequestMethod.POST)
public String addUserToMailList(@RequestParam("firstname") String firstname,
@RequestParam("email") String email) {
log.debug("POST Request -> /user/subscribe {}");
try {
userService.createUserAccount("temp", "temp",
"temp", firstname, "temp", email, true, "ROLE_USER", "user");
} catch (Exception e) {
log.debug("Error: " + e.getMessage());
}
return "subscribe";
}
}