diff --git a/src/backend/common-module/src/main/java/com/bbebig/commonmodule/kafka/dto/ChatMessageDto.java b/src/backend/common-module/src/main/java/com/bbebig/commonmodule/kafka/dto/ChatMessageDto.java index c3fe055c..8b0fb318 100644 --- a/src/backend/common-module/src/main/java/com/bbebig/commonmodule/kafka/dto/ChatMessageDto.java +++ b/src/backend/common-module/src/main/java/com/bbebig/commonmodule/kafka/dto/ChatMessageDto.java @@ -49,11 +49,9 @@ public class ChatMessageDto { private List targetMemberIds; // 메시지 대상자 목록 (DM일 경우) // CREATE 시 필요 - @PastOrPresent(message = "생성 시간은 현재 시간 이전이어야 합니다.") private LocalDateTime createdAt; // UPDATE 시 필요 - @PastOrPresent(message = "수정 시간은 현재 시간 이전이어야 합니다.") private LocalDateTime updatedAt; // @JsonCreator와 @JsonProperty를 사용한 생성자 diff --git a/src/backend/common-module/src/main/java/com/bbebig/commonmodule/redis/domain/MemberPresenceStatus.java b/src/backend/common-module/src/main/java/com/bbebig/commonmodule/redis/domain/MemberPresenceStatus.java index b969b8ad..8d81aad1 100644 --- a/src/backend/common-module/src/main/java/com/bbebig/commonmodule/redis/domain/MemberPresenceStatus.java +++ b/src/backend/common-module/src/main/java/com/bbebig/commonmodule/redis/domain/MemberPresenceStatus.java @@ -35,6 +35,15 @@ public void updateActualStatus(PresenceType actualStatus) { calculateGlobalStatus(); } + public boolean existsDevice(String sessionId) { + for (DeviceInfo deviceInfo : devices) { + if (deviceInfo.getSocketSessionId().equals(sessionId)) { + return true; + } + } + return false; + } + public void updateCustomStatus(PresenceType customStatus) { this.customStatus = customStatus; calculateGlobalStatus(); @@ -48,7 +57,7 @@ public void deleteDevice(String sessionId) { calculateGlobalStatus(); } - private void calculateGlobalStatus() { + public void calculateGlobalStatus() { if (devices == null || devices.isEmpty() || actualStatus == PresenceType.OFFLINE) { actualStatus = PresenceType.OFFLINE; globalStatus = PresenceType.OFFLINE; diff --git a/src/backend/state-server/src/main/java/com/bbebig/stateserver/service/ConnectionEventConsumerService.java b/src/backend/state-server/src/main/java/com/bbebig/stateserver/service/ConnectionEventConsumerService.java index 70adf273..42445169 100644 --- a/src/backend/state-server/src/main/java/com/bbebig/stateserver/service/ConnectionEventConsumerService.java +++ b/src/backend/state-server/src/main/java/com/bbebig/stateserver/service/ConnectionEventConsumerService.java @@ -98,20 +98,24 @@ private MemberPresenceStatus handleConnectionEvent(ConnectionEventDto connection memberPresenceStatus.updateLastActivityTime(LocalDateTime.now()); } - DeviceInfo deviceInfo = DeviceInfo.builder() - .platform(connectionEventDto.getPlatform()) - .socketSessionId(connectionEventDto.getSocketSessionId()) - .connectedServerIp(connectionEventDto.getConnectedServerIp()) - .lastActiveTime(LocalDateTime.now()) - .build(); - - // 안드로이드 기기인 경우, 로컬에 있던 정보가 있다면 현재 채널 정보를 업데이트 - if (deviceInfo.getPlatform().equals("ANDROID") && connectionEventDto.getCurrentChannelType() != null) { - deviceInfo.updateCurrent(connectionEventDto.getCurrentChannelType(), - connectionEventDto.getCurrentChannelId(), connectionEventDto.getCurrentServerId()); + if (!memberPresenceStatus.existsDevice(connectionEventDto.getSocketSessionId())) { + DeviceInfo deviceInfo = DeviceInfo.builder() + .platform(connectionEventDto.getPlatform()) + .socketSessionId(connectionEventDto.getSocketSessionId()) + .connectedServerIp(connectionEventDto.getConnectedServerIp()) + .lastActiveTime(LocalDateTime.now()) + .build(); + + // 안드로이드 기기인 경우, 로컬에 있던 정보가 있다면 현재 채널 정보를 업데이트 + if (deviceInfo.getPlatform().equals("ANDROID") && connectionEventDto.getCurrentChannelType() != null) { + deviceInfo.updateCurrent(connectionEventDto.getCurrentChannelType(), + connectionEventDto.getCurrentChannelId(), connectionEventDto.getCurrentServerId()); + } + + memberPresenceStatus.getDevices().add(deviceInfo); } - memberPresenceStatus.getDevices().add(deviceInfo); + memberPresenceStatus.calculateGlobalStatus(); memberRedisRepositoryImpl.saveMemberPresenceStatus(connectionEventDto.getMemberId(), memberPresenceStatus); @@ -135,6 +139,7 @@ private MemberPresenceStatus handleDisconnectionEvent(ConnectionEventDto connect memberRedisRepositoryImpl.saveMemberPresenceStatus(connectionEventDto.getMemberId(), memberPresenceStatus); } + memberPresenceStatus.calculateGlobalStatus(); memberRedisRepositoryImpl.saveMemberPresenceStatus(connectionEventDto.getMemberId(), memberPresenceStatus); return memberPresenceStatus; }