first try to generate messages from events

todo:

- add subject function to Event interface
- implement interface on derived event classes
- make events translatable

Signed-off-by: Stephan Richter <s.richter@srsoftware.de>
This commit is contained in:
2026-01-13 00:23:46 +01:00
parent 674a80ef09
commit ce5bff6a17
8 changed files with 63 additions and 32 deletions

View File

@@ -3,7 +3,7 @@ default: devel
build: image
podman run --name svelte-build \
--rm \
-v ../frontend:/home/svelte/frontend \
-v ../frontend:/home/svelte/frontend:U \
-ti svelte /opt/svelte-build
image:
podman build --build-arg UID=$$(id -u) --build-arg GID=$$(id -g) -t svelte .
@@ -11,6 +11,6 @@ image:
devel: image
-podman rm -f svelte
podman run --name svelte \
-v ../frontend:/home/svelte/frontend \
-v ../frontend:/home/svelte/frontend:U \
-p 5173:5173 \
-ti svelte /opt/svelte-init

View File

@@ -7,6 +7,7 @@ import static java.util.Optional.*;
import de.srsoftware.tools.Diff;
import de.srsoftware.tools.Mappable;
import de.srsoftware.umbrella.core.model.UmbrellaUser;
import java.util.Collection;
import java.util.HashMap;
import java.util.Map;
import java.util.Optional;
@@ -43,6 +44,8 @@ public abstract class Event<Payload extends Mappable> {
this.oldData = oldData;
}
public abstract Collection<UmbrellaUser> audience();
public abstract String describe();
private Map<String, Object> dropMarkdown(Map<String, Object> map) {
@@ -60,11 +63,13 @@ public abstract class Event<Payload extends Mappable> {
}
public String eventType(){
return eventType.toString();
public EventType eventType(){
return eventType;
}
public abstract boolean isIntendedFor(UmbrellaUser user);
public boolean isIntendedFor(UmbrellaUser user){
return audience().contains(user);
}
public UmbrellaUser initiator(){
return initiator;

View File

@@ -3,8 +3,12 @@ package de.srsoftware.umbrella.messagebus.events;
import static de.srsoftware.umbrella.core.Constants.PROJECT;
import de.srsoftware.umbrella.core.model.Member;
import de.srsoftware.umbrella.core.model.Project;
import de.srsoftware.umbrella.core.model.UmbrellaUser;
import java.util.Collection;
import java.util.List;
import java.util.Map;
@@ -18,15 +22,12 @@ public class ProjectEvent extends Event<Project>{
}
@Override
public String describe() {
return diff().orElse("[TODO: ProjectEvent.describe]");
public Collection<UmbrellaUser> audience() {
return payload().members().values().stream().map(Member::user).toList();
}
@Override
public boolean isIntendedFor(UmbrellaUser user) {
for (var member : payload().members().values()){
if (member.user().equals(user)) return true;
}
return false;
public String describe() {
return diff().orElse("[TODO: ProjectEvent.describe]");
}
}

View File

@@ -3,8 +3,12 @@ package de.srsoftware.umbrella.messagebus.events;
import static de.srsoftware.umbrella.core.Constants.TASK;
import de.srsoftware.umbrella.core.model.Member;
import de.srsoftware.umbrella.core.model.Task;
import de.srsoftware.umbrella.core.model.UmbrellaUser;
import java.util.Collection;
import java.util.List;
import java.util.Map;
@@ -18,15 +22,12 @@ public class TaskEvent extends Event<Task>{
}
@Override
public String describe() {
return diff().orElse("[TODO: TaskEvent.describe()]");
public Collection<UmbrellaUser> audience() {
return payload().members().values().stream().map(Member::user).toList();
}
@Override
public boolean isIntendedFor(UmbrellaUser user) {
for (var member : payload().members().values()){
if (member.user().equals(user)) return true;
}
return false;
public String describe() {
return diff().orElse("[TODO: TaskEvent.describe()]");
}
}

View File

@@ -3,8 +3,12 @@ package de.srsoftware.umbrella.messagebus.events;
import static de.srsoftware.umbrella.core.Constants.WIKI;
import de.srsoftware.umbrella.core.model.Member;
import de.srsoftware.umbrella.core.model.UmbrellaUser;
import de.srsoftware.umbrella.core.model.WikiPage;
import java.util.Collection;
import java.util.List;
import java.util.Map;
@@ -18,15 +22,12 @@ public class WikiEvent extends Event<WikiPage>{
}
@Override
public String describe() {
return diff().orElse("[TODO: WikiEvent.describe()]");
public Collection<UmbrellaUser> audience() {
return payload().members().values().stream().map(Member::user).toList();
}
@Override
public boolean isIntendedFor(UmbrellaUser user) {
for (var member : payload().members().values()){
if (member.user().equals(user)) return true;
}
return false;
public String describe() {
return diff().orElse("[TODO: WikiEvent.describe()]");
}
}

View File

@@ -153,6 +153,11 @@ public class WikiPage implements Mappable {
);
}
@Override
public String toString() {
return title;
}
public int version(){
return version;
}

View File

@@ -1,6 +1,7 @@
description = "Umbrella : Message subsystem"
dependencies{
implementation(project(":bus"))
implementation(project(":core"))
implementation("com.sun.mail:jakarta.mail:2.0.1")
implementation("org.bitbucket.b_c:jose4j:0.9.6")

View File

@@ -6,7 +6,9 @@ import static de.srsoftware.umbrella.core.ConnectionProvider.connect;
import static de.srsoftware.umbrella.core.Constants.*;
import static de.srsoftware.umbrella.core.exceptions.UmbrellaException.missingConfigException;
import static de.srsoftware.umbrella.message.Constants.*;
import static de.srsoftware.umbrella.messagebus.MessageBus.messageBus;
import static java.lang.System.Logger.Level.*;
import static java.text.MessageFormat.format;
import de.srsoftware.configuration.Configuration;
import de.srsoftware.umbrella.core.ModuleRegistry;
@@ -16,6 +18,8 @@ import de.srsoftware.umbrella.core.model.Envelope;
import de.srsoftware.umbrella.core.model.UmbrellaUser;
import de.srsoftware.umbrella.core.model.User;
import de.srsoftware.umbrella.message.model.CombinedMessage;
import de.srsoftware.umbrella.messagebus.EventListener;
import de.srsoftware.umbrella.messagebus.events.Event;
import jakarta.activation.DataHandler;
import jakarta.mail.Message;
import jakarta.mail.MessagingException;
@@ -29,7 +33,7 @@ import java.util.*;
import java.util.concurrent.CopyOnWriteArrayList;
import java.util.function.BiFunction;
public class MessageSystem implements PostBox {
public class MessageSystem implements PostBox, EventListener {
public static final System.Logger LOG = System.getLogger(MessageSystem.class.getSimpleName());
private final Timer timer = new Timer();
@@ -59,9 +63,6 @@ public class MessageSystem implements PostBox {
timer.schedule(this,date.getTime());
LOG.log(INFO,"Scheduled {0} at {1}",getClass().getSimpleName(),date.getTime());
}
}
private final String from,host,user,pass;
private final int port;
@@ -88,8 +89,26 @@ public class MessageSystem implements PostBox {
new SubmissionTask(16).schedule();
new SubmissionTask(18).schedule();
new SubmissionTask(20).schedule();
messageBus().register(this);
}
@Override
public void onEvent(Event<?> event) {
for (var user : event.audience()){
if (!"s.richter@srsoftware.de".equals(user.email().toString())) continue;
var verb = switch (event.eventType()){
case UPDATE -> "updated";
case CREATE -> "created";
case DELETE -> "deleted";
};
var title = format("{0} {1} {2} {3}",event.initiator().name(),verb,event.module(), event.payload());
var message = new de.srsoftware.umbrella.core.model.Message(event.initiator(),title,event.describe(),null,null);
var envelope = new Envelope(message,user);
send(envelope);
}
}
@Override
public void send(Envelope envelope) {
queue.add(envelope);
@@ -187,8 +206,6 @@ public class MessageSystem implements PostBox {
}
}
LOG.log(TRACE, "Message to {0} is ready…", receiver);
Transport.send(msg,user,pass);
LOG.log(DEBUG, "Sent message to {0}.", receiver);