Implement server state handling in ChatController and ChatService, add ServerStateMapper utility, and create/update server state unit tests.

This commit is contained in:
2026-08-09 00:41:36 +02:00
parent b61b117f41
commit 65d0118e3d
6 changed files with 105 additions and 10 deletions
@@ -28,7 +28,7 @@ public class ChatController implements ChatApi {
@Override
public ResponseEntity<Void> updateServerStates(ServerStateDto serverStateDto) {
//TODO [Stijn] [2026-07-18]: Implement handling server state updates (push to listeners)
throw new UnsupportedOperationException("Not implemented");
chatService.updateServerState(serverStateDto);
return new ResponseEntity<>(HttpStatus.ACCEPTED);
}
}
@@ -0,0 +1,24 @@
package com.alttd.altitudeweb.controllers.chat;
import com.alttd.altitudeweb.model.ServerStateDto;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.SerializationFeature;
import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule;
import lombok.experimental.UtilityClass;
@UtilityClass
public class ServerStateMapper {
private static final ObjectMapper OBJECT_MAPPER = new ObjectMapper()
.registerModule(new JavaTimeModule())
.enable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS)
.disable(SerializationFeature.WRITE_DATE_TIMESTAMPS_AS_NANOSECONDS);
public static String toJson(ServerStateDto serverStateDto) {
try {
return OBJECT_MAPPER.writeValueAsString(serverStateDto);
} catch (JsonProcessingException e) {
throw new IllegalStateException("Failed to serialize ServerStateDto to JSON", e);
}
}
}
@@ -2,11 +2,14 @@ package com.alttd.altitudeweb.services.chat;
import com.alttd.altitudeweb.controllers.chat.ChatMessage;
import com.alttd.altitudeweb.controllers.chat.ChatMessageMapper;
import com.alttd.altitudeweb.controllers.chat.ServerStateMapper;
import com.alttd.altitudeweb.database.Databases;
import com.alttd.altitudeweb.database.chat.ChatLogMapper;
import com.alttd.altitudeweb.database.web_db.chat_session.ChatSession;
import com.alttd.altitudeweb.database.web_db.chat_session.ChatSessionMapper;
import com.alttd.altitudeweb.model.PermissionClaimDto;
import com.alttd.altitudeweb.model.ServerDto;
import com.alttd.altitudeweb.model.ServerStateDto;
import com.alttd.altitudeweb.services.chat.event_publisher.EventPublisher;
import com.alttd.altitudeweb.services.chat.event_publisher.EventUser;
import com.alttd.altitudeweb.services.chat.event_publisher.MessageForUser;
@@ -121,6 +124,20 @@ public class ChatService {
sendMessagesToListeners(chatMessageList);
}
public void updateServerState(ServerStateDto serverStateDto) {
sendToUsers("server-state", (eventUser) -> {
if (eventUser.hasPermission(PermissionClaimDto.HEAD_MOD)) {
return ServerStateMapper.toJson(serverStateDto);
}
List<ServerDto> filteredServers = serverStateDto.getServers().stream()
.filter(serverDto -> Arrays.asList(allowedServers).contains(serverDto.getName()))
.toList();
return ServerStateMapper.toJson(new ServerStateDto().servers(filteredServers));
});
}
private void sendMessagesToListeners(List<ChatMessage> chatMessageList) {
Map<ChatMessage, String> jsonCache = new HashMap<>();
for (ChatMessage message : chatMessageList) {