package com.juick.www.controllers; import com.juick.User; import com.juick.service.MessagesService; import com.juick.service.UserService; import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.math.NumberUtils; import org.springframework.stereotype.Controller; import org.springframework.ui.Model; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestParam; import javax.inject.Inject; import java.util.regex.Pattern; /** * Created by aalexeev on 11/21/16. */ @Controller public class ShowMessageController { private static final Pattern USER_NAME_PATTERN = Pattern.compile("[a-zA-Z-_\\d]{2,16}"); private static final Pattern POST_NUMBER_PATTERN = Pattern.compile("-?\\d+"); @Inject private UserService userService; @Inject private MessagesService messagesService; @RequestMapping("/{anything}") public String parseAnything( @PathVariable String anything, @RequestParam(required = false, defaultValue = "0") int before, @RequestParam(required = false) String tag, Model model) { if (StringUtils.isNotEmpty(tag)) { StringBuilder builder = new StringBuilder(); builder.append("redirect:/").append(anything).append("/tag/").append(tag); if (before > 0) builder.append("?before=").append(before); return builder.toString(); } if (before == 0) { boolean isPostNumber = POST_NUMBER_PATTERN.matcher(anything).matches(); int messageId = isPostNumber ? NumberUtils.toInt(anything) : 0; if (isPostNumber && anything.equals(Integer.toString(messageId))) { if (messageId > 0) { com.juick.User author = messagesService.getMessageAuthor(messageId); if (author != null) return "redirect:/" + author.getName() + "/" + anything; } else if (messageId == 0) return "forward:/divideByZero.html"; model.addAttribute("messageId", anything); return "postNotFound"; } } return showUserMessages(anything, null, before, model); } @RequestMapping("/{userName}/tag/{tagName}") public String showUserMessagesByTag( @PathVariable String userName, @PathVariable String tagName, @RequestParam(required = false, defaultValue = "0") int before, Model model) { return showUserMessages(userName, tagName, before, model); } private String showUserMessages( String userName, String tagName, int before, Model model) { // Check validity of user name before quering from database if (!USER_NAME_PATTERN.matcher(userName).matches()) { model.addAttribute("userName", userName); return "userNotFound"; } User user = userService.getUserByName(userName); if (user == null) { model.addAttribute("userName", userName); return "userNotFound"; } return "index"; } @RequestMapping("/{userName}/friends") public String getFriends( @PathVariable String userName, Model model) { // Check validity of user name before quering from database if (!USER_NAME_PATTERN.matcher(userName).matches()) { model.addAttribute("userName", userName); return "userNotFound"; } User user = userService.getUserByName(userName); if (user == null) { model.addAttribute("userName", userName); return "userNotFound"; } return "index"; } @RequestMapping("/{userName}/readers") public String getReaders( @PathVariable String userName, Model model) { // Check validity of user name before quering from database if (!USER_NAME_PATTERN.matcher(userName).matches()) { model.addAttribute("userName", userName); return "userNotFound"; } User user = userService.getUserByName(userName); if (user == null) { model.addAttribute("userName", userName); return "userNotFound"; } return "index"; } @RequestMapping("/{userName}/tags") public String geTags( @PathVariable String userName, Model model) { // Check validity of user name before quering from database if (!USER_NAME_PATTERN.matcher(userName).matches()) { model.addAttribute("userName", userName); return "userNotFound"; } User user = userService.getUserByName(userName); if (user == null) { model.addAttribute("userName", userName); return "userNotFound"; } return "index"; } @RequestMapping("/{userName}/{postNumber}") public String checkShowPost( @PathVariable String userName, @PathVariable String postNumber, Model model) { // Check validity of post number before quering from database if (!POST_NUMBER_PATTERN.matcher(postNumber).matches()) { model.addAttribute("messageId", postNumber); return "postNotFound"; } // Check validity of user name before quering from database if (!USER_NAME_PATTERN.matcher(userName).matches()) { model.addAttribute("userName", userName); return "userNotFound"; } User user = userService.getUserByName(userName); if (user == null) { model.addAttribute("userName", userName); return "userNotFound"; } return "index"; } }