From 9d35952949277e3ff514ba871448218763d21b1c Mon Sep 17 00:00:00 2001 From: Stephan Richter Date: Sat, 10 Jan 2026 22:19:29 +0100 Subject: [PATCH] implemented event-based page-refresh for wiki pages --- .../umbrella/messagebus/events/WikiEvent.java | 35 +++++++++++++++++++ .../srsoftware/umbrella/core/Constants.java | 1 + frontend/src/routes/wiki/View.svelte | 27 ++++++++++---- wiki/build.gradle.kts | 1 + .../srsoftware/umbrella/wiki/WikiModule.java | 8 ++++- 5 files changed, 65 insertions(+), 7 deletions(-) create mode 100644 bus/src/main/java/de/srsoftware/umbrella/messagebus/events/WikiEvent.java diff --git a/bus/src/main/java/de/srsoftware/umbrella/messagebus/events/WikiEvent.java b/bus/src/main/java/de/srsoftware/umbrella/messagebus/events/WikiEvent.java new file mode 100644 index 0000000..20d7adb --- /dev/null +++ b/bus/src/main/java/de/srsoftware/umbrella/messagebus/events/WikiEvent.java @@ -0,0 +1,35 @@ +/* © SRSoftware 2025 */ +package de.srsoftware.umbrella.messagebus.events; + +import de.srsoftware.umbrella.core.model.Task; +import de.srsoftware.umbrella.core.model.UmbrellaUser; +import de.srsoftware.umbrella.core.model.WikiPage; + +import java.util.Map; + +import static de.srsoftware.umbrella.core.Constants.TASK; +import static de.srsoftware.umbrella.core.Constants.WIKI; + + +public class WikiEvent extends Event{ + public WikiEvent(UmbrellaUser initiator, WikiPage page, EventType type){ + super(initiator, WIKI, page, type); + } + + public WikiEvent(UmbrellaUser initiator, WikiPage page, Map oldData){ + super(initiator, WIKI, page, oldData); + } + + @Override + public String describe() { + return diff().orElse("[TODO: WikiEvent.describe()]"); + } + + @Override + public boolean isIntendedFor(UmbrellaUser user) { + for (var member : payload().members().values()){ + if (member.user().equals(user)) return true; + } + return false; + } +} diff --git a/core/src/main/java/de/srsoftware/umbrella/core/Constants.java b/core/src/main/java/de/srsoftware/umbrella/core/Constants.java index 6804d29..1ba584e 100644 --- a/core/src/main/java/de/srsoftware/umbrella/core/Constants.java +++ b/core/src/main/java/de/srsoftware/umbrella/core/Constants.java @@ -160,4 +160,5 @@ public class Constants { public static final String VERSION = "version"; public static final String VERSIONS = "versions"; + public static final String WIKI = "wiki"; } diff --git a/frontend/src/routes/wiki/View.svelte b/frontend/src/routes/wiki/View.svelte index 56dbeee..09c51fe 100644 --- a/frontend/src/routes/wiki/View.svelte +++ b/frontend/src/routes/wiki/View.svelte @@ -1,7 +1,7 @@ {#if page && page.versions}
diff --git a/wiki/build.gradle.kts b/wiki/build.gradle.kts index bc92fdf..fccd08a 100644 --- a/wiki/build.gradle.kts +++ b/wiki/build.gradle.kts @@ -1,5 +1,6 @@ description = "Umbrella : Wiki" dependencies{ + implementation(project(":bus")) implementation(project(":core")) } \ No newline at end of file diff --git a/wiki/src/main/java/de/srsoftware/umbrella/wiki/WikiModule.java b/wiki/src/main/java/de/srsoftware/umbrella/wiki/WikiModule.java index b0a6f5b..17217a1 100644 --- a/wiki/src/main/java/de/srsoftware/umbrella/wiki/WikiModule.java +++ b/wiki/src/main/java/de/srsoftware/umbrella/wiki/WikiModule.java @@ -11,6 +11,7 @@ import static de.srsoftware.umbrella.core.exceptions.UmbrellaException.*; import static de.srsoftware.umbrella.core.model.Permission.EDIT; import static de.srsoftware.umbrella.core.model.Permission.READ_ONLY; import static de.srsoftware.umbrella.wiki.Constants.*; +import static de.srsoftware.umbrella.messagebus.MessageBus.messageBus; import com.sun.net.httpserver.HttpExchange; import de.srsoftware.configuration.Configuration; @@ -20,6 +21,8 @@ import de.srsoftware.umbrella.core.BaseHandler; import de.srsoftware.umbrella.core.api.WikiService; import de.srsoftware.umbrella.core.exceptions.UmbrellaException; import de.srsoftware.umbrella.core.model.*; +import de.srsoftware.umbrella.messagebus.events.WikiEvent; + import java.io.IOException; import java.util.Arrays; import java.util.Optional; @@ -190,10 +193,13 @@ public class WikiModule extends BaseHandler implements WikiService { private boolean patchPage(Path path, UmbrellaUser user, HttpExchange ex) throws IOException { var id = path.pop(); var page = loadPage(id, null); + var old = page.toMap(); var member = page.members().get(user.id()); if (member == null || member.permission() != EDIT) throw forbidden("You are not allowed to edit {0}!",id); var json = json(ex); - return sendContent(ex,wikiDb.save(page.patch(json, userService()))); + page = wikiDb.save(page.patch(json, userService())); + messageBus().dispatch(new WikiEvent(user,page,old)); + return sendContent(ex,page); } private boolean postNewPage(String title, UmbrellaUser user, HttpExchange ex) throws IOException {