Skip to content

Commit f01eba8

Browse files
authored
Merge pull request #158 from Dugout-Developers/fix/#157
[FIX] 채팅 읽지 않은 메세지 개수 조회 기능 수정
2 parents 9aa1f5c + a2f539e commit f01eba8

File tree

6 files changed

+53
-18
lines changed

6 files changed

+53
-18
lines changed

src/main/java/com/back/catchmate/domain/chat/controller/ChatController.java

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package com.back.catchmate.domain.chat.controller;
22

33
import com.back.catchmate.domain.chat.dto.ChatRequest.ChatMessageRequest;
4+
import com.back.catchmate.domain.chat.dto.ChatRequest.ReadChatMessageRequest;
45
import com.back.catchmate.domain.chat.dto.ChatResponse.PagedChatMessageInfo;
56
import com.back.catchmate.domain.chat.service.ChatService;
67
import com.back.catchmate.global.jwt.JwtValidation;
@@ -13,10 +14,10 @@
1314
import org.springframework.data.domain.Sort;
1415
import org.springframework.messaging.handler.annotation.DestinationVariable;
1516
import org.springframework.messaging.handler.annotation.MessageMapping;
17+
import org.springframework.messaging.handler.annotation.Payload;
1618
import org.springframework.messaging.handler.annotation.SendTo;
1719
import org.springframework.web.bind.annotation.GetMapping;
1820
import org.springframework.web.bind.annotation.PathVariable;
19-
import org.springframework.web.bind.annotation.RequestBody;
2021
import org.springframework.web.bind.annotation.RequestMapping;
2122
import org.springframework.web.bind.annotation.RequestParam;
2223
import org.springframework.web.bind.annotation.RestController;
@@ -30,13 +31,18 @@
3031
public class ChatController {
3132
private final ChatService chatService;
3233

33-
@MessageMapping("/chat.{chatRoomId}")
3434
@SendTo("/topic/chat.{chatRoomId}")
35+
@MessageMapping("/chat.{chatRoomId}")
3536
public void sendMessage(@DestinationVariable Long chatRoomId,
36-
@RequestBody ChatMessageRequest request) throws IOException, FirebaseMessagingException {
37+
@Payload ChatMessageRequest request) throws IOException, FirebaseMessagingException {
3738
chatService.sendChatMessage(chatRoomId, request);
3839
}
3940

41+
@MessageMapping("/chat/read")
42+
public void updateLastReadTime(@Payload ReadChatMessageRequest request) {
43+
chatService.updateLastReadTime(request);
44+
}
45+
4046
@GetMapping("/{chatRoomId}")
4147
@Operation(summary = "특정 채팅방의 채팅 내역 조회 API", description = "특정 채팅방의 채팅 내역 조회 API 입니다.")
4248
public PagedChatMessageInfo findChatMessageList(@JwtValidation Long userId,

src/main/java/com/back/catchmate/domain/chat/dto/ChatRequest.java

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,8 @@
55
import lombok.Getter;
66
import lombok.NoArgsConstructor;
77

8+
import java.time.LocalDateTime;
9+
810
public abstract class ChatRequest {
911
@Getter
1012
@Builder
@@ -19,4 +21,23 @@ public enum MessageType {
1921
private Long senderId; // 보낸 사람
2022
private String content; // 메시지 내용
2123
}
24+
25+
@Getter
26+
@Builder
27+
@NoArgsConstructor
28+
@AllArgsConstructor
29+
public static class ReadChatMessageRequest {
30+
private Long chatRoomId; // 보낸 사람
31+
private Long userId; // 메시지 내용
32+
}
33+
34+
@Getter
35+
@Builder
36+
@NoArgsConstructor
37+
@AllArgsConstructor
38+
public static class LastChatMessageUpdateRequest {
39+
private Long chatRoomId; // 채팅방 ID
40+
private String content; // 마지막 메시지 내용
41+
private LocalDateTime sendTime; // 메시지 전송 시간
42+
}
2243
}

src/main/java/com/back/catchmate/domain/chat/service/ChatRoomServiceImpl.java

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -63,9 +63,6 @@ public PagedChatRoomInfo getChatRoomList(Long userId, Pageable pageable) {
6363
userChatRoomList.isLast());
6464
}
6565

66-
67-
@Override
68-
@Transactional(readOnly = true)
6966
public long getUnreadMessageCount(Long userId, Long chatRoomId) {
7067
// 사용자의 마지막 읽은 시간 조회
7168
UserChatRoom userChatRoom = userChatRoomRepository.findByUserIdAndChatRoomIdAndDeletedAtIsNull(userId, chatRoomId)
@@ -126,7 +123,6 @@ public StateResponse leaveChatRoom(Long userId, Long chatRoomId) {
126123

127124
enroll.delete();
128125

129-
130126
// 퇴장 메시지 보내기
131127
String content = user.getNickName() + " 님이 채팅을 떠났어요"; // 퇴장 메시지 내용
132128
chatService.sendEnterLeaveMessage(chatRoom.getId(), content, user.getId(), MessageType.LEAVE);

src/main/java/com/back/catchmate/domain/chat/service/ChatService.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package com.back.catchmate.domain.chat.service;
22

3+
import com.back.catchmate.domain.chat.dto.ChatRequest;
34
import com.back.catchmate.domain.chat.dto.ChatRequest.ChatMessageRequest;
45
import com.back.catchmate.domain.chat.dto.ChatResponse.PagedChatMessageInfo;
56
import com.google.firebase.messaging.FirebaseMessagingException;
@@ -10,6 +11,8 @@
1011
public interface ChatService {
1112
void sendChatMessage(Long chatRoomId, ChatMessageRequest request) throws IOException, FirebaseMessagingException;
1213

14+
void updateLastReadTime(ChatRequest.ReadChatMessageRequest request);
15+
1316
void sendEnterLeaveMessage(Long chatRoomId, String content, Long senderId, ChatMessageRequest.MessageType messageType);
1417

1518
PagedChatMessageInfo getChatMessageList(Long userId, Long roomId, Pageable pageable);

src/main/java/com/back/catchmate/domain/chat/service/ChatServiceImpl.java

Lines changed: 19 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package com.back.catchmate.domain.chat.service;
22

33
import com.back.catchmate.domain.chat.converter.ChatMessageConverter;
4+
import com.back.catchmate.domain.chat.dto.ChatRequest;
45
import com.back.catchmate.domain.chat.dto.ChatRequest.ChatMessageRequest;
56
import com.back.catchmate.domain.chat.dto.ChatResponse.PagedChatMessageInfo;
67
import com.back.catchmate.domain.chat.entity.ChatMessage;
@@ -23,7 +24,6 @@
2324
import org.springframework.stereotype.Service;
2425
import org.springframework.transaction.annotation.Transactional;
2526

26-
import java.io.IOException;
2727
import java.time.LocalDate;
2828
import java.time.LocalDateTime;
2929

@@ -44,7 +44,7 @@ public class ChatServiceImpl implements ChatService {
4444
// 메시지를 특정 채팅방으로 전송
4545
@Override
4646
@Transactional
47-
public void sendChatMessage(Long chatRoomId, ChatMessageRequest request) throws IOException, FirebaseMessagingException {
47+
public void sendChatMessage(Long chatRoomId, ChatMessageRequest request) throws FirebaseMessagingException {
4848
User user = userRepository.findById(request.getSenderId())
4949
.orElseThrow(() -> new BaseException(ErrorCode.USER_NOT_FOUND));
5050

@@ -58,14 +58,21 @@ public void sendChatMessage(Long chatRoomId, ChatMessageRequest request) throws
5858
chatMessageRepository.insert(dateMessage);
5959
}
6060

61+
// 채팅 메시지 저장 및 전송
6162
ChatMessage chatMessage = chatMessageConverter.toChatMessage(chatRoomId, request.getContent(), request.getSenderId(), MessageType.TALK);
6263
chatMessageRepository.insert(chatMessage);
64+
messagingTemplate.convertAndSend(destination, chatMessage);
6365

66+
// 채팅방 정보 업데이트
6467
ChatRoom chatRoom = chatRoomRepository.findById(chatRoomId)
6568
.orElseThrow(() -> new BaseException(ErrorCode.CHATROOM_NOT_FOUND));
6669
chatRoom.updateLastMessageContent(request.getContent());
6770
chatRoom.updateLastMessageTime();
6871

72+
// 채팅방 목록 실시간 업데이트
73+
ChatRequest.LastChatMessageUpdateRequest lastMessageUpdate = new ChatRequest.LastChatMessageUpdateRequest(chatRoomId, request.getContent(), LocalDateTime.now());
74+
messagingTemplate.convertAndSend("/topic/chatList", lastMessageUpdate);
75+
6976
// 채팅방에 참여한 사용자 수 확인
7077
if (chatRoom.getParticipantCount() > 1) {
7178
// 자신을 제외한 채팅방에 FCM 알림 전송
@@ -74,7 +81,6 @@ public void sendChatMessage(Long chatRoomId, ChatMessageRequest request) throws
7481
}
7582

7683
log.info("Sending message to: {}", destination);
77-
messagingTemplate.convertAndSend(destination, request);
7884
}
7985

8086
private boolean isNewDateMessageNeeded(Long chatRoomId, LocalDateTime newMessageTime) {
@@ -89,6 +95,16 @@ private boolean isNewDateMessageNeeded(Long chatRoomId, LocalDateTime newMessage
8995
}
9096
}
9197

98+
@Override
99+
@Transactional
100+
public void updateLastReadTime(ChatRequest.ReadChatMessageRequest request) {
101+
UserChatRoom userChatRoom = userChatRoomRepository.findByUserIdAndChatRoomIdAndDeletedAtIsNull(request.getUserId(), request.getChatRoomId())
102+
.orElseThrow(() -> new BaseException(ErrorCode.USER_CHATROOM_NOT_FOUND));
103+
104+
userChatRoom.updateLastReadTime();
105+
userChatRoomRepository.save(userChatRoom);
106+
}
107+
92108
@Override
93109
@Transactional
94110
public void sendEnterLeaveMessage(Long chatRoomId, String content, Long senderId, MessageType messageType) {

src/main/java/com/back/catchmate/domain/notification/service/FCMService.java

Lines changed: 1 addition & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -154,7 +154,7 @@ public void sendMessageByToken(String targetToken, String title, String body, Lo
154154

155155
// 특정 채팅방의 모든 사용자에게 FCM 메시지 전송
156156
@Async("asyncTask")
157-
public void sendMessagesByTokens(Long chatRoomId, String title, String body, String senderToken) throws IOException, FirebaseMessagingException {
157+
public void sendMessagesByTokens(Long chatRoomId, String title, String body, String senderToken) throws FirebaseMessagingException {
158158
List<String> targetTokenList = userChatRoomRepository.findByChatRoomIdAndDeletedAtIsNull(chatRoomId)
159159
.stream()
160160
.map(userChatRoom -> userChatRoom.getUser().getFcmToken()) // User 엔티티에서 FCM 토큰 가져오기
@@ -174,13 +174,6 @@ public void sendMessagesByTokens(Long chatRoomId, String title, String body, Str
174174
// FCM에 메시지 전송
175175
BatchResponse response = FirebaseMessaging.getInstance().sendEachForMulticast(message);
176176

177-
// 전송 결과 확인
178-
// if (response.getFailureCount() > 0) {
179-
// log.error("일부 메시지 전송에 실패했습니다. 성공한 메시지 수: {}, 실패한 메시지 수: {}",
180-
// response.getSuccessCount(), response.getFailureCount());
181-
// throw new BaseException(ErrorCode.FCM_TOKEN_SEND_BAD_REQUEST);
182-
// }
183-
184177
log.info("FCM 응답: {}개의 메시지가 성공적으로 전송되었습니다.", response.getSuccessCount());
185178
}
186179
}

0 commit comments

Comments
 (0)