Implement server state handling in ChatController and ChatService, add ServerStateMapper utility, and create/update server state unit tests.
This commit is contained in:
@@ -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) {
|
||||
|
||||
Reference in New Issue
Block a user