aboutsummaryrefslogtreecommitdiff
path: root/juick-spring-www/src/main/java/com/juick
diff options
context:
space:
mode:
authorGravatar Vitaly Takmazov2016-12-09 16:14:27 +0300
committerGravatar Vitaly Takmazov2016-12-09 16:14:27 +0300
commit559ae343aa72db04e12b94acfa0bec30ed9a11f1 (patch)
tree5832b97c6a6a4b565de15a474bae86059763d6bb /juick-spring-www/src/main/java/com/juick
parent22d30c3b50fe0ea4c18c45a4450fb1a8b1f1b1b8 (diff)
juick-spring-www: merge some work from develop branch, port some templates to Thymeleaf
Diffstat (limited to 'juick-spring-www/src/main/java/com/juick')
-rw-r--r--juick-spring-www/src/main/java/com/juick/www/controllers/HelpController.java58
-rw-r--r--juick-spring-www/src/main/java/com/juick/www/controllers/IndexController.java117
-rw-r--r--juick-spring-www/src/main/java/com/juick/www/controllers/SettingsController.java66
-rw-r--r--juick-spring-www/src/main/java/com/juick/www/controllers/TagController.java86
-rw-r--r--juick-spring-www/src/main/java/com/juick/www/helpers/QueryString.java14
-rw-r--r--juick-spring-www/src/main/java/com/juick/www/helpers/QueryStringResolver.java31
-rw-r--r--juick-spring-www/src/main/java/com/juick/www/util/EncodeUtils.java10
7 files changed, 362 insertions, 20 deletions
diff --git a/juick-spring-www/src/main/java/com/juick/www/controllers/HelpController.java b/juick-spring-www/src/main/java/com/juick/www/controllers/HelpController.java
index dad3ff9f..49e24c8c 100644
--- a/juick-spring-www/src/main/java/com/juick/www/controllers/HelpController.java
+++ b/juick-spring-www/src/main/java/com/juick/www/controllers/HelpController.java
@@ -1,12 +1,68 @@
package com.juick.www.controllers;
+import com.juick.User;
+import com.juick.server.util.HttpNotFoundException;
+import com.juick.service.UserService;
+import com.juick.util.UserUtils;
+import org.springframework.core.io.ClassPathResource;
import org.springframework.stereotype.Controller;
+import org.springframework.ui.ModelMap;
+import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
+import javax.inject.Inject;
+import java.io.IOException;
+import java.net.URISyntaxException;
+import java.nio.file.Files;
+import java.nio.file.Paths;
+import java.security.Principal;
+import java.util.Optional;
+import java.util.stream.Collectors;
+
/**
* Created by aalexeev on 11/21/16.
*/
@Controller
-@RequestMapping("/help")
public class HelpController {
+ @Inject
+ UserService userService;
+
+ @RequestMapping({"/help", "/help/{lang}", "/help/{lang}/{page}"})
+ protected String doGetHelp(
+ Principal principal,
+ @PathVariable("lang") Optional<String> lang,
+ @PathVariable("page") Optional<String> page,
+ ModelMap model) throws IOException, URISyntaxException {
+ String name = UserUtils.getUsername(principal, null);
+ User visitor = userService.getUserByName(name);
+
+ lang.ifPresent(l -> {
+ if (l.length() != 2 || !l.matches("^[a-z]+$")) {
+ throw new HttpNotFoundException();
+ }
+ });
+ if (!lang.isPresent()) {
+ lang = Optional.of("ru");
+ }
+
+ page.ifPresent(p -> {
+ if (!p.matches("^[a-zA-Z0-9\\-]*$") || p.equals("navigation") || p.equals("index")) {
+ throw new HttpNotFoundException();
+ }
+ });
+ if (!page.isPresent()) {
+ page = Optional.of("index");
+ }
+
+ String filePath = "help/" + lang.get() + "/" + page.get();
+ String navigationPath = "help/" + lang.get() + "/navigation";
+
+ model.addAttribute("title", "Помощь");
+ model.addAttribute("visitor", visitor);
+ model.addAttribute("help_nav", Files.readAllLines(Paths.get(new ClassPathResource(navigationPath).getURI()))
+ .stream().collect(Collectors.joining()));
+ model.addAttribute("help_data", Files.readAllLines(Paths.get(new ClassPathResource(filePath).getURI()))
+ .stream().collect(Collectors.joining()));
+ return "views/help";
+ }
}
diff --git a/juick-spring-www/src/main/java/com/juick/www/controllers/IndexController.java b/juick-spring-www/src/main/java/com/juick/www/controllers/IndexController.java
index 2973bf30..91efd8aa 100644
--- a/juick-spring-www/src/main/java/com/juick/www/controllers/IndexController.java
+++ b/juick-spring-www/src/main/java/com/juick/www/controllers/IndexController.java
@@ -1,9 +1,26 @@
package com.juick.www.controllers;
+import com.juick.Message;
+import com.juick.User;
+import com.juick.service.MessagesService;
+import com.juick.service.TagService;
+import com.juick.service.UserService;
+import com.juick.util.UserUtils;
+import com.juick.www.util.EncodeUtils;
+import org.apache.commons.lang3.StringEscapeUtils;
+import org.apache.commons.lang3.StringUtils;
import org.springframework.stereotype.Controller;
-import org.springframework.ui.Model;
-import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.RequestParam;
+import org.springframework.ui.ModelMap;
+import org.springframework.web.bind.annotation.*;
+
+import javax.inject.Inject;
+import java.io.IOException;
+import java.net.URLEncoder;
+import java.security.Principal;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Optional;
+import java.util.stream.Collectors;
/**
* Created by aalexeev on 11/21/16.
@@ -11,14 +28,94 @@ import org.springframework.web.bind.annotation.RequestParam;
@Controller
public class IndexController {
- @RequestMapping("/")
- public String index(
- java.security.Principal userPrincipal,
- @RequestParam(required = false, defaultValue = "0") int before,
- Model model) {
+ @Inject
+ UserService userService;
+ @Inject
+ MessagesService messagesService;
+ @Inject
+ TagService tagService;
+
+ @RequestMapping(value = "/", method = RequestMethod.GET)
+ protected String doGet(
+ Principal principal,
+ @CookieValue("ref") Optional<String> ref,
+ @RequestHeader("Referer") Optional<String> referer,
+ @RequestParam("show") Optional<String> paramShow,
+ @RequestParam("tag") Optional<String> paramTagStr,
+ @RequestParam(value = "before", required = false) Integer paramBefore,
+ @RequestParam(value = "search", required = false) String paramSearch,
+ ModelMap model) throws IOException {
+
+ if (paramTagStr.isPresent()) {
+ return "redirect:/tag/" + URLEncoder.encode(paramTagStr.get(), "UTF-8");
+ }
+
+ if (StringUtils.isNotEmpty(paramSearch) && paramSearch.length() > 64) {
+ paramSearch = "";
+ }
+
+ String name = UserUtils.getUsername(principal, null);
+ User visitor = userService.getUserByName(name);
- model.addAttribute("currentUser", userPrincipal);
+ String title;
+ if (visitor.getUid() > 0) {
+ title = "Популярные";
+ } else {
+ title = "Микроблоги Juick: популярные записи";
+ }
+ List<Integer> mids = new ArrayList<>();
- return "index";
+ if (StringUtils.isNotEmpty(paramSearch)) {
+ title = "Поиск: " + StringEscapeUtils.escapeHtml4(paramSearch);
+ mids = messagesService.getSearch(EncodeUtils.encodeSphinx(paramSearch),
+ paramBefore);
+ } else if (!paramShow.isPresent()) {
+ mids = messagesService.getPopular(visitor.getUid(), paramBefore);
+ } else if (paramShow.get().equals("top")) {
+ return "redirect:/";
+ } else if (paramShow.get().equals("my") && visitor.getUid() > 0) {
+ title = "Моя лента";
+ mids = messagesService.getMyFeed(visitor.getUid(), paramBefore);
+ } else if (paramShow.get().equals("private") && visitor.getUid() > 0) {
+ title = "Приватные";
+ mids = messagesService.getPrivate(visitor.getUid(), paramBefore);
+ } else if (paramShow.get().equals("discuss") && visitor.getUid() > 0) {
+ title = "Обсуждения";
+ mids = messagesService.getDiscussions(visitor.getUid(), paramBefore);
+ } else if (paramShow.get().equals("recommended") && visitor.getUid() > 0) {
+ title = "Рекомендации";
+ mids = messagesService.getRecommended(visitor.getUid(), paramBefore);
+ } else if (paramShow.get().equals("photos")) {
+ title = "Фотографии";
+ mids = messagesService.getPhotos(visitor.getUid(), paramBefore);
+ } else if (paramShow.get().equals("all")) {
+ title = "Все сообщения";
+ mids = messagesService.getAll(visitor.getUid(), paramBefore);
+ }
+ model.addAttribute("title", title);
+ model.addAttribute("visitor", visitor);
+ model.addAttribute("tags", tagService.getPopularTags());
+ model.addAttribute("showAdv", true);
+ List<Message> msgs = messagesService.getMessages(mids);
+ List<Integer> blUIDs = userService.checkBL(visitor.getUid(),
+ msgs.stream().map(m -> m.getUser().getUid()).collect(Collectors.toList()));
+ model.addAttribute("msgs",
+ msgs.stream().map(msg -> {
+ msg.ReadOnly |= blUIDs.contains(msg.getUser().getUid());
+ return msg;
+ }).collect(Collectors.toList())
+ );
+ if (mids.size() >= 20) {
+ String nextpage = "?before=" + mids.get(mids.size() - 1);
+ if (paramShow.isPresent()) {
+ nextpage += "&show=" + paramShow.get();
+ }
+ if (StringUtils.isNotEmpty(paramSearch)) {
+ nextpage += "&search=" + paramSearch;
+ }
+ model.addAttribute("nextpage", nextpage);
+ }
+ //model.addAttribute("isModerator", userService.getModerators().contains(visitor.getUid()));
+ return "blog/index";
}
}
diff --git a/juick-spring-www/src/main/java/com/juick/www/controllers/SettingsController.java b/juick-spring-www/src/main/java/com/juick/www/controllers/SettingsController.java
index eef41c38..a038389f 100644
--- a/juick-spring-www/src/main/java/com/juick/www/controllers/SettingsController.java
+++ b/juick-spring-www/src/main/java/com/juick/www/controllers/SettingsController.java
@@ -1,16 +1,76 @@
package com.juick.www.controllers;
+import com.juick.User;
+import com.juick.service.*;
+import com.juick.util.UserUtils;
+import org.apache.commons.lang3.StringUtils;
import org.springframework.stereotype.Controller;
+import org.springframework.ui.ModelMap;
import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestParam;
+
+import javax.inject.Inject;
+import javax.servlet.ServletException;
+import java.io.IOException;
+import java.security.Principal;
+import java.util.Arrays;
+import java.util.List;
+import java.util.stream.Collectors;
+import java.util.stream.IntStream;
/**
* Created by aalexeev on 11/21/16.
*/
@Controller
public class SettingsController {
+ @Inject
+ UserService userService;
+ @Inject
+ TagService tagService;
+ @Inject
+ CrosspostService crosspostService;
+ @Inject
+ SubscriptionService subscriptionService;
+ @Inject
+ EmailService emailService;
- @RequestMapping("/settings")
- public String showSettings() {
- return "index";
+ @RequestMapping("settings")
+ public String showSettings(
+ Principal principal,
+ @RequestParam(required = false) String page,
+ @RequestParam(required = false) String code,
+ ModelMap context
+ ) throws ServletException, IOException {
+ String name = UserUtils.getUsername(principal, null);
+ User visitor = userService.getUserByName(name);
+ if (visitor.getUid() == 0) {
+ return "redirect:/login";
+ }
+ List<String> pages = Arrays.asList("main", "password", "about", "auth-email", "privacy");
+ if (StringUtils.isEmpty(page) || !pages.contains(page)) {
+ page = "main";
+ }
+ context.put("title", "Настройки");
+ context.put("visitor", visitor);
+ context.put("tags", tagService.getPopularTags());
+ context.put("auths", userService.getAuthCodes(visitor));
+ context.put("eopts", userService.getEmailOpts(visitor));
+ context.put("ehash", userService.getEmailHash(visitor));
+ context.put("emails", userService.getEmails(visitor));
+ context.put("jids", userService.getAllJIDs(visitor));
+ List<String> hours = IntStream.rangeClosed(0, 23).boxed()
+ .map(i -> StringUtils.leftPad(String.format("%d", i), 2, "0")).collect(Collectors.toList());
+ context.put("hours", hours);
+ context.put("fbstatus", crosspostService.getFbCrossPostStatus(visitor.getUid()));
+ context.put("twitter_name", crosspostService.getTwitterName(visitor.getUid()));
+ context.put("telegram_name", crosspostService.getTelegramName(visitor.getUid()));
+ context.put("notify_options", subscriptionService.getNotifyOptions(visitor));
+ context.put("userinfo", userService.getUserInfo(visitor));
+ if (page.equals("auth-email")) {
+ String response = emailService.verifyAddressByCode(visitor.getUid(), code) ?
+ "OK!" : "Sorry, code unknown.";
+ context.put("result", response);
+ }
+ return String.format("views/settings_%s", page);
}
}
diff --git a/juick-spring-www/src/main/java/com/juick/www/controllers/TagController.java b/juick-spring-www/src/main/java/com/juick/www/controllers/TagController.java
index 5c3b6287..0961f683 100644
--- a/juick-spring-www/src/main/java/com/juick/www/controllers/TagController.java
+++ b/juick-spring-www/src/main/java/com/juick/www/controllers/TagController.java
@@ -1,14 +1,28 @@
package com.juick.www.controllers;
+import com.juick.Message;
+import com.juick.User;
+import com.juick.server.util.HttpNotFoundException;
+import com.juick.service.AdsService;
import com.juick.service.MessagesService;
import com.juick.service.TagService;
+import com.juick.service.UserService;
+import com.juick.util.UserUtils;
+import com.juick.www.helpers.QueryString;
+import org.apache.commons.lang3.StringEscapeUtils;
import org.springframework.stereotype.Controller;
-import org.springframework.ui.Model;
+import org.springframework.ui.ModelMap;
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.io.UnsupportedEncodingException;
+import java.net.URLEncoder;
+import java.security.Principal;
+import java.util.List;
+import java.util.Optional;
+import java.util.stream.Collectors;
/**
* Created by aalexeev on 11/21/16.
@@ -19,15 +33,75 @@ public class TagController {
private TagService tagService;
@Inject
private MessagesService messagesService;
+ @Inject
+ private AdsService adsService;
+ @Inject
+ private UserService userService;
@RequestMapping("/tag/{tagName}")
- public String showTags(
- @PathVariable String tagName,
- @RequestParam(required = false, defaultValue = "0") int before,
- Model model) {
+ protected String doGet(
+ Principal principal,
+ @PathVariable("tagName") String paramTagStr,
+ @RequestParam(value = "before", required = false, defaultValue = "0") Integer paramBefore,
+ @QueryString Optional<String> queryString,
+ ModelMap model) throws UnsupportedEncodingException {
+ String name = UserUtils.getUsername(principal, null);
+ User visitor = userService.getUserByName(name);
+
+ com.juick.Tag paramTag = tagService.getTag(paramTagStr, false);
+ if (paramTag == null) {
+ throw new HttpNotFoundException();
+ } else if (paramTag.SynonymID > 0 && paramTag.TID != paramTag.SynonymID) {
+ com.juick.Tag synTag = tagService.getTag(paramTag.SynonymID);
+ String url = "/tag/" + URLEncoder.encode(synTag.getName(), "UTF-8");
+ if (queryString.isPresent()) {
+ url += "?" + queryString.get();
+ }
+ return "redirect:" + url;
+ } else if (!paramTag.getName().equals(paramTagStr)) {
+ String url = "/tag/" + URLEncoder.encode(paramTag.getName(), "UTF-8");
+ if (queryString.isPresent()) {
+ url += "?" + queryString.get();
+ }
+ return "redirect:" + url;
+ }
+
+ int visitor_uid = visitor != null ? visitor.getUid() : 0;
- return "index";
+ String title = "*" + StringEscapeUtils.escapeHtml4(paramTag.getName());
+ List<Integer> mids = messagesService.getTag(paramTag.TID, visitor_uid, paramBefore, (visitor == null) ? 40 : 20);
+ model.addAttribute("title", title);
+ if (tagService.getTagNoIndex(paramTag.TID)) {
+ model.addAttribute("headers", "<meta name=\"robots\" content=\"noindex,nofollow\"/>");
+ } else if (paramBefore > 0 || mids.size() < 5) {
+ model.addAttribute("headers", "<meta name=\"robots\" content=\"noindex\"/>");
+ }
+ if (mids.size() > 0) {
+ int vuid = visitor != null ? visitor.getUid() : 0;
+ int ad_mid = adsService.getAdMid(vuid);
+ if (ad_mid > 0 && mids.indexOf(ad_mid) == -1) {
+ mids.add(0, ad_mid);
+ adsService.logAdMid(vuid, ad_mid);
+ } else {
+ ad_mid = 0;
+ }
+ }
+ model.addAttribute("visitor", visitor);
+ List<Message> msgs = messagesService.getMessages(mids);
+ List<Integer> blUIDs = userService.checkBL(visitor_uid,
+ msgs.stream().map(m -> m.getUser().getUid()).collect(Collectors.toList()));
+ model.addAttribute("msgs",
+ msgs.stream().map(msg -> {
+ msg.ReadOnly |= blUIDs.contains(msg.getUser().getUid());
+ return msg;
+ }).collect(Collectors.toList())
+ );
+ if (mids.size() >= 20) {
+ String nextpage = "/tag/" + URLEncoder.encode(paramTag.getName(), "UTF-8") + "?before=" + mids.get(mids.size() - 1);
+ model.addAttribute("nextpage", nextpage);
+ }
+ return "blog/index";
}
@RequestMapping("/tag")
diff --git a/juick-spring-www/src/main/java/com/juick/www/helpers/QueryString.java b/juick-spring-www/src/main/java/com/juick/www/helpers/QueryString.java
new file mode 100644
index 00000000..0eb6c76f
--- /dev/null
+++ b/juick-spring-www/src/main/java/com/juick/www/helpers/QueryString.java
@@ -0,0 +1,14 @@
+package com.juick.www.helpers;
+
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+
+/**
+ * Created by vt on 22/03/16.
+ */
+@Retention(RetentionPolicy.RUNTIME)
+@Target(ElementType.PARAMETER)
+public @interface QueryString {
+} \ No newline at end of file
diff --git a/juick-spring-www/src/main/java/com/juick/www/helpers/QueryStringResolver.java b/juick-spring-www/src/main/java/com/juick/www/helpers/QueryStringResolver.java
new file mode 100644
index 00000000..812c4497
--- /dev/null
+++ b/juick-spring-www/src/main/java/com/juick/www/helpers/QueryStringResolver.java
@@ -0,0 +1,31 @@
+package com.juick.www.helpers;
+
+import org.springframework.core.MethodParameter;
+import org.springframework.web.bind.support.WebDataBinderFactory;
+import org.springframework.web.context.request.NativeWebRequest;
+import org.springframework.web.method.support.HandlerMethodArgumentResolver;
+import org.springframework.web.method.support.ModelAndViewContainer;
+
+import javax.servlet.http.HttpServletRequest;
+import java.lang.annotation.Annotation;
+import java.util.Optional;
+
+public class QueryStringResolver implements HandlerMethodArgumentResolver {
+ @Override
+ public boolean supportsParameter(MethodParameter parameter) {
+ Annotation[] parameterAnnotations = parameter.getParameterAnnotations();
+ for (Annotation parameterAnnotation : parameterAnnotations) {
+ if (QueryString.class.isInstance(parameterAnnotation)) {
+ return true;
+ }
+ }
+
+ return false;
+ }
+
+ @Override
+ public Object resolveArgument(MethodParameter parameter, ModelAndViewContainer mavContainer, NativeWebRequest webRequest, WebDataBinderFactory binderFactory) throws Exception {
+ HttpServletRequest request = webRequest.getNativeRequest(HttpServletRequest.class);
+ return Optional.ofNullable(request.getQueryString());
+ }
+} \ No newline at end of file
diff --git a/juick-spring-www/src/main/java/com/juick/www/util/EncodeUtils.java b/juick-spring-www/src/main/java/com/juick/www/util/EncodeUtils.java
new file mode 100644
index 00000000..a444ec4d
--- /dev/null
+++ b/juick-spring-www/src/main/java/com/juick/www/util/EncodeUtils.java
@@ -0,0 +1,10 @@
+package com.juick.www.util;
+
+/**
+ * Created by vitalyster on 09.12.2016.
+ */
+public class EncodeUtils {
+ public static String encodeSphinx(String str) {
+ return str.replaceAll("@", "\\\\@");
+ }
+}