Skip to content

Commit 9287ee4

Browse files
authored
Merge pull request #114 from KB-Hackerton/feature/76
Feature: d
2 parents a42aa53 + 8db3e96 commit 9287ee4

File tree

6 files changed

+55
-65
lines changed

6 files changed

+55
-65
lines changed

src/main/java/kb_hack/backend/domain/chat/controller/ChatController.java

Lines changed: 4 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -71,14 +71,10 @@ public ResponseEntity<?> getChatHistory(@PathVariable Long roomId,
7171
}
7272

7373

74+
//-------------------------------------------------------------------------------------------------------------------
7475

7576

76-
77-
78-
79-
80-
81-
77+
// 여기가 문제
8278
@Operation(
8379
summary = "채팅방 메시지 읽음 처리",
8480
description = "특정 채팅방의 모든 메시지를 읽음 처리합니다. 사용자는 해당 채팅방의 참여자여야 합니다."
@@ -92,13 +88,7 @@ public ResponseEntity<Void> markAsRead(@PathVariable Long roomId,
9288
}
9389

9490

95-
96-
97-
98-
99-
100-
101-
91+
//-----------------------------------------------------마지막 ----------------------------------------------------
10292

10393

10494
@Operation(
@@ -132,14 +122,7 @@ public ResponseEntity<?> getMyChatRooms(@AuthenticationPrincipal SecurityCustomU
132122
}
133123

134124

135-
136-
137-
138-
139-
140-
141-
142-
125+
//==================================================================================================================
143126

144127
@Operation(
145128
summary = "채팅방 나가기",

src/main/java/kb_hack/backend/domain/chat/mapper/ChatRoomMapper.java

Lines changed: 14 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -3,10 +3,7 @@
33
import java.util.List;
44
import java.util.Optional;
55

6-
import org.apache.ibatis.annotations.Insert;
7-
import org.apache.ibatis.annotations.Mapper;
8-
import org.apache.ibatis.annotations.Options;
9-
import org.apache.ibatis.annotations.Select;
6+
import org.apache.ibatis.annotations.*;
107

118
import kb_hack.backend.domain.chat.dto.response.ChatMessageHistoryDto;
129
import kb_hack.backend.domain.chat.dto.response.ChatMessageResponse;
@@ -27,12 +24,6 @@ INSERT INTO chat_room (sos_id, room_name, room_type, is_complete, owner_id)
2724
@Options(useGeneratedKeys = true, keyProperty = "chatRoomId", keyColumn = "chat_room_id")
2825
int save(ChatRoom newChatRoom);
2926

30-
// @Select("""
31-
// SELECT cm.chat_message_id, cm.chat_room_id, cm.sender_id, cm.content, cm.created_at
32-
// FROM chat_message cm
33-
// WHERE cm.chat_room_id = #{roomId}
34-
// ORDER BY cm.created_at ASC
35-
// """)
3627
List<ChatMessageResponse> getChatMessagesByRoomId(Long roomId);
3728

3829
@Insert("""
@@ -48,9 +39,22 @@ INSERT INTO chat_message (chat_room_id, sender_id, content)
4839
ChatMessage findMessageById(Long chatMessageId);
4940

5041

42+
int leaveChatRoom(Long roomId, Long memberId);
43+
44+
// 마지막 메시지 ID 가져오기
45+
@Select("""
46+
SELECT MAX(chat_message_id)
47+
FROM chat_message
48+
WHERE chat_room_id = #{roomId}
49+
""")
50+
Long findLastMessageId(Long roomId);
51+
52+
53+
5154
List<ChatRoom> findAllBySosId(Long sosId);
5255

5356

5457
int updateIsComplete(Long chatRoomId);
5558

59+
5660
}

src/main/java/kb_hack/backend/domain/chat/mapper/ChatRoomStateMapper.java

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,19 +2,30 @@
22

33
import java.util.List;
44

5+
6+
import org.apache.ibatis.annotations.*;
7+
58
import org.apache.ibatis.annotations.Delete;
69
import org.apache.ibatis.annotations.Insert;
710
import org.apache.ibatis.annotations.Mapper;
811
import org.apache.ibatis.annotations.Options;
912
import org.apache.ibatis.annotations.Select;
1013

14+
1115
import kb_hack.backend.domain.chat.entity.ChatRoom;
1216
import kb_hack.backend.domain.chat.entity.ChatRoomState;
1317
import kb_hack.backend.domain.member.domain.Member;
1418

1519
@Mapper
1620
public interface ChatRoomStateMapper {
1721

22+
@Update("""
23+
UPDATE chat_room_state
24+
SET last_read_message_id = #{lastMessageId}
25+
WHERE chat_room_id = #{roomId} AND member_id = #{memberId}
26+
""")
27+
int updateLastReadMessage(Long roomId, Long memberId, Long lastMessageId);
28+
1829
@Insert("""
1930
INSERT INTO chat_room_state (chat_room_id, member_id, last_read_message_id)
2031
VALUES (#{chatRoomId}, #{memberId}, #{lastReadMessageId})

src/main/java/kb_hack/backend/domain/chat/mapper/MemberDomainMapper.java

Lines changed: 0 additions & 4 deletions
This file was deleted.

src/main/java/kb_hack/backend/domain/chat/service/ChatService.java

Lines changed: 6 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -214,23 +214,14 @@ public List<ChatMessageHistoryDto> getChatHistory(Long roomId, Long memberId) {
214214

215215
@Transactional
216216
public void markMessagesAsRead(Long roomId, Long memberId) {
217-
System.out.println("⭐⭐⭐⭐⭐⭐⭐들어온 roomId = " + roomId);
218-
System.out.println("⭐⭐⭐⭐⭐⭐⭐들어온memberId = " + memberId);
219-
// 1. 해당 방의 모든 메시지를 가져온다.
220-
List<ChatMessageResponse> messages = chatRoomMapper.getChatMessagesByRoomId(roomId);
221-
System.out.println("⭐⭐⭐⭐⭐⭐⭐messages = " + messages);
222-
if (messages.isEmpty()) {
223-
return; // 읽을 메시지가 없으면 종료
217+
// 해당 방의 마지막 메시지 ID 조회
218+
Long lastMessageId = chatRoomMapper.findLastMessageId(roomId);
219+
if (lastMessageId == null) {
220+
return; // 메시지가 없으면 종료
224221
}
225222

226-
// 2. 마지막 메시지의 ID를 찾는다.
227-
Long lastMessageId = messages.get(messages.size() - 1).getChatMessageId();
228-
System.out.println("⭐⭐⭐⭐⭐⭐⭐lastMessageId = " + lastMessageId);
229-
230-
// 3. 해당 사용자의 읽음 상태를 마지막 메시지 ID로 업데이트한다.
231-
readStatusMapper.updateLastReadMessage(roomId, memberId, lastMessageId);
232-
233-
223+
// chat_room_state에 마지막 읽은 메시지 ID 업데이트
224+
chatRoomStateMapper.updateLastReadMessage(roomId, memberId, lastMessageId);
234225
}
235226

236227
public List<MyChatListResponse> getMyChatRooms(MemberVO memberVO) {

src/main/resources/kb_hack/backend/domain/chat/mapper/ChatRoomMapper.xml

Lines changed: 20 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -51,33 +51,38 @@
5151
ORDER BY
5252
cm.created_at ASC
5353
</select>
54+
5455
<select id="getChatMessagesByRoomId"
5556
resultType="kb_hack.backend.domain.chat.dto.response.ChatMessageResponse">
5657
SELECT
57-
cm.chat_message_id AS chatMessageId,
58-
cm.sender_id AS senderId,
59-
m.member_email AS senderEmail,
60-
0 AS isRead, -- ✅ 기본값
58+
cm.chat_message_id AS chatMessageId,
59+
cm.sender_id AS senderId,
60+
m.member_email AS senderEmail,
61+
CASE
62+
WHEN crs.last_read_message_id IS NULL
63+
OR cm.chat_message_id > crs.last_read_message_id
64+
THEN 0 ELSE 1
65+
END AS isRead,
6166
(
62-
SELECT COUNT(crs.member_id)
63-
FROM chat_room_state crs
64-
LEFT JOIN read_status rs
65-
ON crs.member_id = rs.member_id
66-
AND crs.chat_room_id = cm.chat_room_id
67-
AND rs.chat_message_id = cm.chat_message_id
68-
WHERE crs.chat_room_id = cm.chat_room_id
69-
AND crs.member_id != cm.sender_id
70-
AND (rs.is_read = 0 OR rs.read_status_id IS NULL)
67+
SELECT COUNT(*)
68+
FROM chat_message cm2
69+
WHERE cm2.chat_room_id = cm.chat_room_id
70+
AND cm2.chat_message_id > COALESCE(crs.last_read_message_id, 0)
71+
AND cm2.sender_id != #{memberId}
7172
) AS unreadCount,
72-
cm.content AS content,
73-
cm.created_at AS createdAt
73+
cm.content AS content,
74+
cm.created_at AS createdAt
7475
FROM chat_message cm
7576
JOIN member m ON cm.sender_id = m.member_id
77+
LEFT JOIN chat_room_state crs
78+
ON crs.chat_room_id = cm.chat_room_id
79+
AND crs.member_id = #{memberId}
7680
WHERE cm.chat_room_id = #{roomId}
7781
ORDER BY cm.created_at ASC;
7882
</select>
7983

8084

85+
8186
<select id="findMessageById" resultType="kb_hack.backend.domain.chat.entity.ChatMessage">
8287
SELECT *
8388
FROM chat_message

0 commit comments

Comments
 (0)