From 3ab17252a7d9f6c5834d85d050a19fa41be0c07d Mon Sep 17 00:00:00 2001
From: Vitaly Takmazov
Date: Thu, 19 Dec 2019 13:21:40 +0300
Subject: Send Update activites on message updates
---
.../java/com/juick/server/ActivityPubManager.java | 26 ++++++++++--
src/main/java/com/juick/server/api/Post.java | 13 +++++-
.../juick/server/api/activity/model/Context.java | 1 +
.../api/activity/model/activities/Update.java | 23 +++++++++++
.../juick/service/activities/ActivityListener.java | 3 ++
.../com/juick/service/activities/UpdateEvent.java | 47 ++++++++++++++++++++++
6 files changed, 108 insertions(+), 5 deletions(-)
create mode 100644 src/main/java/com/juick/server/api/activity/model/activities/Update.java
create mode 100644 src/main/java/com/juick/service/activities/UpdateEvent.java
(limited to 'src/main/java/com/juick')
diff --git a/src/main/java/com/juick/server/ActivityPubManager.java b/src/main/java/com/juick/server/ActivityPubManager.java
index 7c66809e..18470b16 100644
--- a/src/main/java/com/juick/server/ActivityPubManager.java
+++ b/src/main/java/com/juick/server/ActivityPubManager.java
@@ -23,10 +23,7 @@ import com.juick.User;
import com.juick.formatters.PlainTextFormatter;
import com.juick.server.api.SystemActivity.ActivityType;
import com.juick.server.api.activity.model.Context;
-import com.juick.server.api.activity.model.activities.Accept;
-import com.juick.server.api.activity.model.activities.Announce;
-import com.juick.server.api.activity.model.activities.Create;
-import com.juick.server.api.activity.model.activities.Delete;
+import com.juick.server.api.activity.model.activities.*;
import com.juick.server.api.activity.model.objects.Hashtag;
import com.juick.server.api.activity.model.objects.Image;
import com.juick.server.api.activity.model.objects.Mention;
@@ -183,6 +180,27 @@ public class ActivityPubManager implements ActivityListener, NotificationListene
}
}
+ @Override
+ public void processUpdateEvent(UpdateEvent event) {
+ String objectUri = event.getMessageUri();
+ User user = event.getUser();
+ String userUri = personUri(user);
+ Person me = (Person) signatureManager.getContext(URI.create(userUri)).get();
+ socialService.getFollowers(user).forEach(acct -> {
+ Person follower = (Person) signatureManager.getContext(URI.create(acct)).get();
+ Update update = new Update();
+ update.setId(objectUri + "#update");
+ update.setActor(me.getId());
+ update.setObject(objectUri);
+ try {
+ logger.info("Update to follower {}", follower.getId());
+ signatureManager.post(me, follower, update);
+ } catch (IOException e) {
+ logger.warn("activitypub exception", e);
+ }
+ });
+ }
+
@Override
public void processSystemEvent(SystemEvent systemEvent) {
ActivityType type = systemEvent.getActivity().getType();
diff --git a/src/main/java/com/juick/server/api/Post.java b/src/main/java/com/juick/server/api/Post.java
index 72a9c383..37b40b2d 100644
--- a/src/main/java/com/juick/server/api/Post.java
+++ b/src/main/java/com/juick/server/api/Post.java
@@ -22,6 +22,7 @@ import com.juick.Reaction;
import com.juick.Status;
import com.juick.User;
import com.juick.model.CommandResult;
+import com.juick.server.ActivityPubManager;
import com.juick.server.CommandsManager;
import com.juick.server.util.HttpBadRequestException;
import com.juick.server.util.HttpForbiddenException;
@@ -29,11 +30,13 @@ import com.juick.server.util.HttpNotFoundException;
import com.juick.server.util.HttpUtils;
import com.juick.service.MessagesService;
import com.juick.service.UserService;
+import com.juick.service.activities.UpdateEvent;
import com.juick.service.security.annotation.Visitor;
import org.apache.commons.lang3.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Value;
+import org.springframework.context.ApplicationEventPublisher;
import org.springframework.http.HttpStatus;
import org.springframework.http.MediaType;
import org.springframework.web.bind.annotation.*;
@@ -61,6 +64,10 @@ public class Post {
private String tmpDir;
@Inject
CommandsManager commandsManager;
+ @Inject
+ ApplicationEventPublisher applicationEventPublisher;
+ @Inject
+ ActivityPubManager activityPubManager;
@RequestMapping(value = "/api/post", method = RequestMethod.POST, produces = MediaType.APPLICATION_JSON_VALUE)
@ResponseStatus(value = HttpStatus.OK)
@@ -217,7 +224,11 @@ public class Post {
User author = rid == 0 ? messagesService.getMessageAuthor(mid) : messagesService.getReply(mid, rid).getUser();
if (visitor.equals(author)) {
if (messagesService.updateMessage(mid, rid, body)) {
- Message result = rid == 0 ? messagesService.getMessage(mid).orElseThrow(IllegalStateException::new) : messagesService.getReply(mid, rid);
+ Message result = rid == 0 ?
+ messagesService.getMessage(mid).orElseThrow(IllegalStateException::new)
+ : messagesService.getReply(mid, rid);
+ applicationEventPublisher.publishEvent(
+ new UpdateEvent(this, author, activityPubManager.messageUri(mid, rid)));
return CommandResult.build(result, "Message updated", StringUtils.EMPTY);
}
throw new HttpBadRequestException();
diff --git a/src/main/java/com/juick/server/api/activity/model/Context.java b/src/main/java/com/juick/server/api/activity/model/Context.java
index 04cddb11..14b65e25 100644
--- a/src/main/java/com/juick/server/api/activity/model/Context.java
+++ b/src/main/java/com/juick/server/api/activity/model/Context.java
@@ -33,6 +33,7 @@ import java.util.List;
@JsonTypeInfo(use = JsonTypeInfo.Id.NAME, property="type")
@JsonSubTypes({
@JsonSubTypes.Type(value = Create.class, name = "Create"),
+ @JsonSubTypes.Type(value = Update.class, name = "Update"),
@JsonSubTypes.Type(value = Delete.class, name = "Delete"),
@JsonSubTypes.Type(value = Follow.class, name = "Follow"),
@JsonSubTypes.Type(value = Accept.class, name = "Accept"),
diff --git a/src/main/java/com/juick/server/api/activity/model/activities/Update.java b/src/main/java/com/juick/server/api/activity/model/activities/Update.java
new file mode 100644
index 00000000..17dfc105
--- /dev/null
+++ b/src/main/java/com/juick/server/api/activity/model/activities/Update.java
@@ -0,0 +1,23 @@
+/*
+ * Copyright (C) 2008-2019, Juick
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as
+ * published by the Free Software Foundation, either version 3 of the
+ * License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see .
+ */
+
+package com.juick.server.api.activity.model.activities;
+
+import com.juick.server.api.activity.model.Activity;
+
+public class Update extends Activity {
+}
diff --git a/src/main/java/com/juick/service/activities/ActivityListener.java b/src/main/java/com/juick/service/activities/ActivityListener.java
index d32585bb..81190ef2 100644
--- a/src/main/java/com/juick/service/activities/ActivityListener.java
+++ b/src/main/java/com/juick/service/activities/ActivityListener.java
@@ -39,4 +39,7 @@ public interface ActivityListener {
@Async
@EventListener
void undoAnnounceEvent(UndoAnnounceEvent event);
+ @Async
+ @EventListener
+ void processUpdateEvent(UpdateEvent event);
}
diff --git a/src/main/java/com/juick/service/activities/UpdateEvent.java b/src/main/java/com/juick/service/activities/UpdateEvent.java
new file mode 100644
index 00000000..0d02e80b
--- /dev/null
+++ b/src/main/java/com/juick/service/activities/UpdateEvent.java
@@ -0,0 +1,47 @@
+/*
+ * Copyright (C) 2008-2019, Juick
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as
+ * published by the Free Software Foundation, either version 3 of the
+ * License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see .
+ */
+
+package com.juick.service.activities;
+
+import com.juick.User;
+import org.springframework.context.ApplicationEvent;
+
+public class UpdateEvent extends ApplicationEvent {
+ private final User actor;
+ private final String messageUri;
+ /**
+ * Create a new {@code ApplicationEvent}.
+ *
+ * @param source the object on which the event initially occurred or with
+ * which the event is associated (never {@code null})
+ * @param actor the event author
+ * @param messageUri the object's id
+ */
+ public UpdateEvent(Object source, User actor, String messageUri) {
+ super(source);
+ this.actor = actor;
+ this.messageUri = messageUri;
+ }
+
+ public User getUser() {
+ return actor;
+ }
+
+ public String getMessageUri() {
+ return messageUri;
+ }
+}
--
cgit v1.2.3