package io.kaif.web; import static java.util.stream.Collectors.*; import java.util.List; import java.util.Optional; import javax.servlet.http.Cookie; import javax.servlet.http.HttpServletResponse; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.servlet.ModelAndView; import io.kaif.flake.FlakeId; import io.kaif.model.account.Account; import io.kaif.model.account.AccountAccessToken; import io.kaif.model.account.AccountOnceToken; import io.kaif.model.article.Article; import io.kaif.model.article.ArticleList; import io.kaif.model.clientapp.ClientApp; import io.kaif.model.debate.Debate; import io.kaif.model.feed.FeedAsset; import io.kaif.model.feed.NewsFeed; import io.kaif.service.AccountService; import io.kaif.service.ArticleService; import io.kaif.service.ClientAppService; import io.kaif.service.FeedService; import io.kaif.service.VoteService; @Controller @RequestMapping("/account") public class AccountController { @Autowired private AccountService accountService; @Autowired private ArticleService articleService; @Autowired private FeedService feedService; @Autowired private VoteService voteService; @Autowired private ClientAppService clientAppService; @RequestMapping("/sign-up") public ModelAndView signUp() { return new ModelAndView("account/sign-up").addObject("accountNamePattern", Account.NAME_PATTERN); } @RequestMapping("/sign-in") public String signIn() { return "account/sign-in"; } @RequestMapping("/forget-password") public String forgetPassword() { return "account/forget-password"; } @RequestMapping("/reset-password") public ModelAndView resetPassword(@RequestParam("key") String key) { Optional<AccountOnceToken> token = accountService.findValidResetPasswordToken(key); return new ModelAndView("account/reset-password").addObject("valid", token.isPresent()); } @RequestMapping("/settings") public String settings() { return "account/account"; } @RequestMapping("/settings.part") public ModelAndView settingsPart(AccountAccessToken accountAccessToken) { Account account = accountService.findMe(accountAccessToken).orElse(null); return new ModelAndView("account/settings.part").addObject("account", account); } @RequestMapping("/client-app") public String clientApp() { return "account/account"; } @RequestMapping("/client-app.part") public ModelAndView clientAppPart(AccountAccessToken accountAccessToken) { List<ClientApp> clientApps = clientAppService.listGrantedApps(accountAccessToken); return new ModelAndView("account/client-app.part").addObject("clientApps", clientApps); } @RequestMapping("/news-feed") public String newsFeed() { return "account/account"; } @RequestMapping("/up-voted") public String upVoted() { return "account/account"; } @RequestMapping("/news-feed.part") public ModelAndView newsFeedPart(AccountAccessToken accountAccessToken, @RequestParam(value = "start", required = false) FlakeId startAssetId) { List<FeedAsset> feedAssets = feedService.listFeeds(accountAccessToken, startAssetId); List<Debate> debates = articleService.listDebatesByIdWithCache(feedAssets.stream() .filter(f -> f.getAssetType().isDebate()) .map(FeedAsset::getAssetId) .collect(toList())); List<Article> articles = articleService.listArticlesByDebatesWithCache(debates.stream() .map(Debate::getDebateId) .collect(toList())); return new ModelAndView("account/news-feed.part").addObject("newsFeed", new NewsFeed(feedAssets, debates, articles)).addObject("isFirstPage", startAssetId == null); } @RequestMapping("/up-voted.part") public ModelAndView upVotedPart(AccountAccessToken accountAccessToken, @RequestParam(value = "start", required = false) FlakeId startArticleId) { List<Article> articles = voteService.listUpVotedArticles(accountAccessToken, startArticleId); return new ModelAndView("account/up-voted.part").addObject("articleList", new ArticleList(articles)); } @RequestMapping("/activation") public ModelAndView activation(@RequestParam("key") String key, HttpServletResponse response) { boolean success = accountService.activate(key); if (success) { //see AccountSession.dart#detectForceLogout(); Cookie cookie = new Cookie("force-logout", "true"); cookie.setPath("/"); cookie.setSecure(true); response.addCookie(cookie); } return new ModelAndView("account/activation").addObject("success", success); } }