package io.pivotal.web.controller;
import java.math.BigDecimal;
import java.util.Date;
import java.util.Map;
import javax.servlet.http.HttpServletRequest;
import io.pivotal.web.domain.Account;
import io.pivotal.web.domain.AuthenticationRequest;
import io.pivotal.web.service.MarketSummaryService;
import io.pivotal.web.service.UserService;
import io.pivotal.web.service.MarketService;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.security.authentication.AnonymousAuthenticationToken;
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.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.client.HttpServerErrorException;
import org.springframework.web.servlet.ModelAndView;
@Controller
public class UserController {
private static final Logger logger = LoggerFactory
.getLogger(UserController.class);
@Autowired
private UserService accountService;
@Autowired
private MarketService marketService;
@Autowired
private MarketSummaryService summaryService;
@RequestMapping(value = "/", method = RequestMethod.GET)
public String showHome(Model model) {
if (!model.containsAttribute("login")) {
model.addAttribute("login", new AuthenticationRequest());
}
model.addAttribute("marketSummary", summaryService.getMarketSummary());
//check if user is logged in!
Authentication authentication = SecurityContextHolder.getContext().getAuthentication();
if (!(authentication instanceof AnonymousAuthenticationToken)) {
String currentUserName = authentication.getName();
logger.debug("User logged in: " + currentUserName);
try {
model.addAttribute("portfolio",marketService.getPortfolio(currentUserName));
} catch (HttpServerErrorException e) {
model.addAttribute("portfolioRetrievalError",e.getMessage());
}
model.addAttribute("account",accountService.getAccount(currentUserName));
}
return "index";
}
//TODO: never gets called?
@RequestMapping(value = "/login", method = RequestMethod.POST)
//@RequestMapping(value = "/login")
public String login(Model model, @ModelAttribute(value="login") AuthenticationRequest login) {
logger.info("Logging in, user: " + login.getUsername());
//need to add account object to session?
//CustomDetails userDetails = (CustomDetails)SecurityContextHolder.getContext().getAuthentication().getPrincipal();
logger.debug("Principal: " + SecurityContextHolder.getContext().
getAuthentication().getPrincipal());
Map<String,Object> params = accountService.login(login);
model.addAllAttributes(params);
//logger.info("got user details, token: " + userDetails.getToken());
return "index";
}
@RequestMapping(value = "/login", method = RequestMethod.GET)
public String getLogin(Model model, @ModelAttribute(value="login") AuthenticationRequest login) {
logger.info("Logging in GET, user: " + login.getUsername());
return "index";
}
@RequestMapping(value="/logout", method = RequestMethod.POST)
public String postLogout(Model model, @ModelAttribute(value="login") AuthenticationRequest login) {
logger.info("Logout, user: " + login.getUsername());
logger.info(model.asMap().toString());
return "index";
}
@RequestMapping(value = "/registration", method = RequestMethod.GET)
public String registration(Model model) {
Account account = new Account();
account.setBalance(new BigDecimal(100000));
model.addAttribute("account", account);
return "registration";
}
@RequestMapping(value = "/registration", method = RequestMethod.POST)
public String register(Model model, @ModelAttribute(value="account") Account account) {
logger.info("register: user:" + account.getUserid());
//need to set some stuff on account...
account.setOpenbalance(account.getBalance());
account.setCreationdate(new Date());
AuthenticationRequest login = new AuthenticationRequest();
login.setUsername(account.getUserid());
model.addAttribute("login", login);
model.addAttribute("marketSummary", summaryService.getMarketSummary());
accountService.createAccount(account);
return "index";
}
@ExceptionHandler({ Exception.class })
public ModelAndView error(HttpServletRequest req, Exception exception) {
logger.debug("Handling error: " + exception);
logger.warn("Exception:", exception);
ModelAndView model = new ModelAndView();
model.addObject("errorCode", exception.getMessage());
model.addObject("errorMessage", exception);
model.setViewName("error");
return model;
}
}