aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--juick-server/src/main/java/com/juick/server/EmailManager.java5
-rw-r--r--juick-server/src/main/java/com/juick/server/api/Messages.java15
-rw-r--r--juick-server/src/main/resources/Transparent.gifbin0 -> 42 bytes
-rw-r--r--juick-server/src/test/java/com/juick/server/tests/ServerTests.java10
4 files changed, 26 insertions, 4 deletions
diff --git a/juick-server/src/main/java/com/juick/server/EmailManager.java b/juick-server/src/main/java/com/juick/server/EmailManager.java
index 2bea7060..aaebaac8 100644
--- a/juick-server/src/main/java/com/juick/server/EmailManager.java
+++ b/juick-server/src/main/java/com/juick/server/EmailManager.java
@@ -93,12 +93,13 @@ public class EmailManager implements ApplicationListener<MessageEvent> {
", discussion or tag. Reply to this email directly or view it on Juick: %s.",
formatPost(msg), formatUrl(msg));
MimeBodyPart textBodyPart = new MimeBodyPart();
+ String hash = userService.getHashByUID(userService.getUserByEmail(email).getUid());
textBodyPart.setContent(plainText, "text/plain; charset=UTF-8");
String htmlText = String.format("%s<br /><br />--<br />You are receiving this because you are subscribed to this user" +
- ", discussion or tag. Reply to this email directly or <a href=\"%s\">view it</a> on Juick." +
+ ", discussion or tag. Reply to this email directly or <a href=\"%s\"><img src=\"https://api.juick.com/thread/mark_read/%d-%d.gif?hash=%s\" />view it</a> on Juick." +
"<br /><a href=\"https://juick.com/settings?hash=%s\">Configure or disable notifications</a>",
MessageUtils.formatHtml(msg), formatUrl(msg),
- userService.getHashByUID(userService.getUserByEmail(email).getUid()));
+ msg.getMid(), msg.getRid(), hash, hash);
MimeBodyPart htmlBodyPart = new MimeBodyPart();
htmlBodyPart.setContent(htmlText, "text/html; charset=UTF-8");
Multipart multipart = new MimeMultipart("alternative");
diff --git a/juick-server/src/main/java/com/juick/server/api/Messages.java b/juick-server/src/main/java/com/juick/server/api/Messages.java
index 45b8f69c..05ce504f 100644
--- a/juick-server/src/main/java/com/juick/server/api/Messages.java
+++ b/juick-server/src/main/java/com/juick/server/api/Messages.java
@@ -21,11 +21,13 @@ import com.juick.Message;
import com.juick.Status;
import com.juick.Tag;
import com.juick.User;
+import com.juick.server.util.HttpBadRequestException;
import com.juick.server.util.HttpForbiddenException;
import com.juick.server.util.UserUtils;
import com.juick.service.MessagesService;
import com.juick.service.TagService;
import com.juick.service.UserService;
+import org.apache.commons.io.IOUtils;
import org.springframework.http.HttpStatus;
import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity;
@@ -34,8 +36,10 @@ import org.springframework.web.bind.annotation.*;
import springfox.documentation.annotations.ApiIgnore;
import javax.inject.Inject;
+import java.io.IOException;
import java.util.Collections;
import java.util.List;
+import java.util.Objects;
/**
* @author ugnich
@@ -152,7 +156,16 @@ public class Messages {
}
return NOT_FOUND;
}
-
+ @GetMapping("/thread/mark_read/{mid}-{rid}.gif")
+ public byte[] markThreadRead(@PathVariable int mid, @PathVariable int rid) throws IOException {
+ User visitor = UserUtils.getCurrentUser();
+ if (visitor.getUid() > 0) {
+ messagesService.setLastReadComment(visitor, mid, rid);
+ return IOUtils.toByteArray(
+ Objects.requireNonNull(getClass().getClassLoader().getResource("Transparent.gif")));
+ }
+ throw new HttpBadRequestException();
+ }
@ApiIgnore
@RequestMapping("/messages/set_privacy")
@ResponseBody
diff --git a/juick-server/src/main/resources/Transparent.gif b/juick-server/src/main/resources/Transparent.gif
new file mode 100644
index 00000000..f191b280
--- /dev/null
+++ b/juick-server/src/main/resources/Transparent.gif
Binary files differ
diff --git a/juick-server/src/test/java/com/juick/server/tests/ServerTests.java b/juick-server/src/test/java/com/juick/server/tests/ServerTests.java
index 046e0e7d..71c42b6c 100644
--- a/juick-server/src/test/java/com/juick/server/tests/ServerTests.java
+++ b/juick-server/src/test/java/com/juick/server/tests/ServerTests.java
@@ -31,6 +31,7 @@ import com.juick.server.util.HttpUtils;
import com.juick.service.*;
import com.juick.util.DateFormattersHolder;
import com.juick.util.MessageUtils;
+import org.apache.commons.io.IOUtils;
import org.apache.commons.lang3.StringUtils;
import org.junit.After;
import org.junit.Assert;
@@ -754,7 +755,7 @@ public class ServerTests {
telegramBotManager.processUpdate("{\"message\":{\"chat\":{\"id\":1},\"text\":\"yo\",\"from\":{\"id\":1,\"username\":\"teleugnich\"}}}");
}
@Test
- public void lastReadTests() {
+ public void lastReadTests() throws Exception {
int mid = messagesService.createMessage(ugnich.getUid(), "to be watched", null, null);
subscriptionService.subscribeMessage(messagesService.getMessage(mid), ugnich);
messagesService.createReply(mid, 0, freefd, "new reply", null);
@@ -769,5 +770,12 @@ public class ServerTests {
assertThat(messagesService.getUnread(ugnich).size(), is(0));
messagesService.setLastReadComment(ugnich, mid, 0);
assertThat(lastRead.apply(ugnich, mid), is(1));
+ String ugnichHash = userService.getHashByUID(ugnich.getUid());
+ int freefdrid = messagesService.createReply(mid, 0, freefd, "again", null);
+ mockMvc.perform(get(String.format("/thread/mark_read/%d-%d.gif?hash=%s", mid, freefdrid, ugnichHash)))
+ .andExpect(status().isOk())
+ .andExpect(content().bytes(IOUtils.toByteArray(
+ Objects.requireNonNull(getClass().getClassLoader().getResource("Transparent.gif")))));
+ assertThat(lastRead.apply(ugnich, mid), is(freefdrid));
}
}