restructuring, working on password reset email

next steps:
- create reset url and add it to the translation fill map
- implement message translation
- implement otp validation and login
This commit is contained in:
2025-07-08 15:39:48 +02:00
parent 3e91565fb6
commit 7a5bb50ee2
24 changed files with 245 additions and 178 deletions

View File

@@ -4,17 +4,15 @@ package de.srsoftware.umbrella.message;
import static de.srsoftware.tools.PathHandler.CONTENT_TYPE;
import static de.srsoftware.umbrella.core.Constants.*;
import static de.srsoftware.umbrella.message.Constants.*;
import static de.srsoftware.umbrella.user.Constants.PASS;
import static java.lang.System.Logger.Level.*;
import de.srsoftware.configuration.Configuration;
import de.srsoftware.umbrella.core.UmbrellaException;
import de.srsoftware.umbrella.core.api.Translator;
import de.srsoftware.umbrella.core.model.UmbrellaUser;
import de.srsoftware.umbrella.message.model.CombinedMessage;
import de.srsoftware.umbrella.message.model.Envelope;
import de.srsoftware.umbrella.message.model.PostBox;
import de.srsoftware.umbrella.user.model.UmbrellaUser;
import de.srsoftware.umbrella.user.model.User;
import jakarta.activation.DataHandler;
import jakarta.mail.Message;
import jakarta.mail.MessagingException;
@@ -31,7 +29,7 @@ import java.util.function.Function;
public class MessageSystem implements PostBox {
public static final System.Logger LOG = System.getLogger(MessageSystem.class.getSimpleName());
private final Timer timer = new Timer();
private record Receiver(User user, de.srsoftware.umbrella.message.model.Message message){}
private record Receiver(UmbrellaUser user, de.srsoftware.umbrella.message.model.Message message){}
private class SubmissionTask extends TimerTask{
@@ -98,11 +96,11 @@ public class MessageSystem implements PostBox {
private synchronized void processMessages(Integer scheduledHour) {
LOG.log(INFO,"Running {0}…",scheduledHour == null ? "instantly" : "scheduled at "+scheduledHour);
var queue = new ArrayList<>(this.queue);
var dueRecipients = new ArrayList<User>();
List<User> recipients = queue.stream().map(Envelope::receivers).flatMap(Set::stream).filter(Objects::nonNull).distinct().toList();
var dueRecipients = new ArrayList<UmbrellaUser>();
List<UmbrellaUser> recipients = queue.stream().map(Envelope::receivers).flatMap(Set::stream).filter(Objects::nonNull).distinct().toList();
{ // for known users: get notification preferences, fallback to _immediately_ for unknown users
for (User recv : recipients) {
for (UmbrellaUser recv : recipients) {
if (recv instanceof UmbrellaUser uu) {
try {
if (!db.getSettings(uu).sendAt(scheduledHour)) continue;
@@ -156,17 +154,17 @@ public class MessageSystem implements PostBox {
}
private void send(CombinedMessage message, User receiver, Date date) throws MessagingException {
private void send(CombinedMessage message, UmbrellaUser receiver, Date date) throws MessagingException {
LOG.log(TRACE,"Sending combined message to {0}…",receiver);
session = session();
MimeMessage msg = new MimeMessage(session);
msg.addHeader(CONTENT_TYPE, "text/markdown; charset=UTF-8");
msg.addHeader("format", "flowed");
msg.addHeader("Content-Transfer-Encoding", "8bit");
msg.setFrom(message.sender().email());
msg.setFrom(message.sender().email().toString());
msg.setSubject(message.subject(), UTF8);
msg.setSentDate(date);
var toEmail = debugAddress != null ? debugAddress : receiver.email();
var toEmail = debugAddress != null ? debugAddress : receiver.email().toString();
msg.setRecipients(Message.RecipientType.TO, toEmail);
if (message.attachments().isEmpty()){