Verschiebung nach anderem RePo - nun pro Projekt getrennt

This commit is contained in:
2026-04-01 10:41:19 +02:00
commit 7b9eda1d62
1048 changed files with 93351 additions and 0 deletions

View File

@@ -0,0 +1,113 @@
package de.oaa.xxx.social;
import de.oaa.xxx.mail.Email;
import de.oaa.xxx.mail.MailService;
import de.oaa.xxx.mail.MailTemplateService;
import org.springframework.beans.factory.annotation.Value;
import de.oaa.xxx.social.entity.MessageCause;
import de.oaa.xxx.social.entity.MessageEntity;
import de.oaa.xxx.social.entity.NotificationPreferenceEntity;
import de.oaa.xxx.social.repository.MessageRepository;
import de.oaa.xxx.social.repository.NotificationPreferenceRepository;
import de.oaa.xxx.user.UserRepository;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Service;
import java.time.LocalDateTime;
import java.util.Map;
import java.util.UUID;
@Service
public class SystemMessageService {
private static final Logger LOGGER = LoggerFactory.getLogger(SystemMessageService.class);
private final MessageRepository messageRepository;
private final NotificationPreferenceRepository preferenceRepository;
private final UserRepository userRepository;
private final SseService sseService;
private final MailService mailService;
private final MailTemplateService mailTemplateService;
@Value("${app.base-url:http://localhost:8080}")
private String baseUrl;
public SystemMessageService(MessageRepository messageRepository,
NotificationPreferenceRepository preferenceRepository,
UserRepository userRepository,
SseService sseService,
MailService mailService,
MailTemplateService mailTemplateService) {
this.messageRepository = messageRepository;
this.preferenceRepository = preferenceRepository;
this.userRepository = userRepository;
this.sseService = sseService;
this.mailService = mailService;
this.mailTemplateService = mailTemplateService;
}
/**
* Sendet eine Systemnachricht unter Berücksichtigung der Benachrichtigungseinstellungen des Empfängers.
*/
public void send(UUID senderId, UUID receiverId, String text, String targetUrl, MessageCause cause) {
if (senderId == null || receiverId == null) return;
NotificationPreferenceEntity pref = preferenceRepository
.findByUserIdAndCause(receiverId, cause)
.orElseGet(() -> NotificationPreferenceEntity.defaultFor(receiverId, cause));
// FRIENDREQUEST und INVITATION sind immer nur in-app, kein E-Mail
boolean sendInApp = cause == MessageCause.FRIENDREQUEST || cause == MessageCause.INVITATION || pref.isInApp();
if (sendInApp) {
MessageEntity msg = new MessageEntity();
msg.setMessageId(UUID.randomUUID());
msg.setSenderId(senderId);
msg.setReceiverId(receiverId);
msg.setText(text);
msg.setSentAt(LocalDateTime.now());
msg.setSystemMessage(true);
msg.setMessageCause(cause);
if (targetUrl != null) msg.setTargetUrl(targetUrl);
messageRepository.save(msg);
long unread = messageRepository.countByReceiverIdAndSystemMessageAndReadAtIsNull(receiverId, true);
sseService.push(receiverId, "NOTIFICATION", Map.of("unreadCount", unread, "text", text));
}
if (pref.isEmail() && cause != MessageCause.INVITATION) {
userRepository.findById(receiverId).ifPresent(user -> {
try {
Email email = new Email();
email.setEmailAdresse(user.getEmail());
email.setTitel(causeTitel(cause));
email.setText(mailTemplateService.buildNotificationMail(user.getName(), text, targetUrl, baseUrl));
mailService.send(email);
} catch (Exception e) {
LOGGER.error("E-Mail-Benachrichtigung fehlgeschlagen für userId={}: {}", receiverId, e.getMessage());
}
});
}
}
/**
* Benachrichtigt den Empfänger per SSE, dass sich seine Einladungsliste geändert hat,
* ohne eine In-App-Nachricht oder E-Mail zu erstellen.
*/
public void pushInvitationUpdate(UUID receiverId) {
if (receiverId == null) return;
sseService.push(receiverId, "INVITATION", java.util.Map.of());
}
private String causeTitel(MessageCause cause) {
return switch (cause) {
case INVITATION -> "XXX The Game Neue Einladung";
case GAME_STATE -> "XXX The Game Spielstatus-Änderung";
case EMERGENCY -> "XXX The Game ⚠️ Notfall";
case FRIENDREQUEST -> "XXX The Game Neue Freundschaftsanfrage";
case SUPPORT -> "xXx Sphere Nachricht vom Support";
};
}
}