Skip to content

Commit e2bbff0

Browse files
committed
feature : 그룹 채팅방 목록 조회
1 parent 6076a54 commit e2bbff0

File tree

6 files changed

+88
-6
lines changed

6 files changed

+88
-6
lines changed

src/main/java/ita/tinybite/domain/chat/controller/ChatController.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
import ita.tinybite.domain.chat.service.ChatService;
88
import ita.tinybite.global.response.APIResponse;
99
import lombok.RequiredArgsConstructor;
10+
import lombok.extern.slf4j.Slf4j;
1011
import org.springframework.messaging.handler.annotation.MessageMapping;
1112
import org.springframework.messaging.simp.SimpMessageHeaderAccessor;
1213
import org.springframework.messaging.simp.SimpMessagingTemplate;
@@ -17,6 +18,7 @@
1718
import static ita.tinybite.global.response.APIResponse.*;
1819

1920

21+
@Slf4j
2022
@Controller
2123
@RequiredArgsConstructor
2224
public class ChatController {
@@ -42,6 +44,7 @@ public void sendMessage(ChatMessageReqDto req,
4244
// message 저장
4345
ChatMessage saved = chatService.saveMessage(message);
4446

47+
log.info("[chat log] send message: {}, [{}] - {}", saved.getSenderId(), saved.getMessageType(), saved.getContent());
4548
// subscribe 한 사용자에게 전송
4649
simpMessagingTemplate.convertAndSend("/subscribe/chat/room/" + saved.getChatRoomId(), ChatMessageResDto.of(saved, userId));
4750

src/main/java/ita/tinybite/domain/chat/controller/ChatRoomController.java

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package ita.tinybite.domain.chat.controller;
22

3+
import ita.tinybite.domain.chat.dto.res.GroupChatRoomResDto;
34
import ita.tinybite.domain.chat.dto.res.OneToOneChatRoomResDto;
45
import ita.tinybite.domain.chat.service.ChatRoomService;
56
import ita.tinybite.global.response.APIResponse;
@@ -10,6 +11,8 @@
1011

1112
import java.util.List;
1213

14+
import static ita.tinybite.global.response.APIResponse.success;
15+
1316
@RestController
1417
@RequestMapping("/api/v1/chatroom")
1518
@RequiredArgsConstructor
@@ -19,6 +22,11 @@ public class ChatRoomController {
1922

2023
@GetMapping("/one-to-one")
2124
public APIResponse<List<OneToOneChatRoomResDto>> getOneToOneChatRooms() {
22-
return APIResponse.success(chatRoomService.getOneToOneRooms());
25+
return success(chatRoomService.getOneToOneRooms());
26+
}
27+
28+
@GetMapping("/group")
29+
public APIResponse<List<GroupChatRoomResDto>> getGroupChatRooms() {
30+
return success(chatRoomService.getGroupRooms());
2331
}
2432
}
Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
package ita.tinybite.domain.chat.dto.res;
2+
3+
import ita.tinybite.domain.chat.entity.ChatRoom;
4+
import ita.tinybite.domain.chat.enums.ChatRoomType;
5+
import ita.tinybite.domain.party.enums.PartyStatus;
6+
import lombok.Builder;
7+
8+
@Builder
9+
public record GroupChatRoomResDto(
10+
Long chatRoomId,
11+
ChatRoomType roomType,
12+
String partyTitle,
13+
String partyImage,
14+
String recentTime,
15+
Integer currentParticipantCnt,
16+
PartyStatus partyStatus,
17+
String recentMessage,
18+
Long unreadMessageCnt
19+
) {
20+
21+
public static GroupChatRoomResDto of(ChatRoom chatRoom, String timeAgo, String recentMessage, Long unreadCnt) {
22+
return GroupChatRoomResDto.builder()
23+
.chatRoomId(chatRoom.getId())
24+
.roomType(chatRoom.getType())
25+
.partyTitle(chatRoom.getParty().getTitle())
26+
.partyImage(chatRoom.getParty().getThumbnailImage())
27+
.recentTime(timeAgo)
28+
.currentParticipantCnt(chatRoom.getParty().getCurrentParticipants())
29+
.partyStatus(chatRoom.getParty().getStatus())
30+
.recentMessage(recentMessage)
31+
.unreadMessageCnt(unreadCnt)
32+
.build();
33+
}
34+
}

src/main/java/ita/tinybite/domain/chat/entity/ChatRoomMember.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -47,4 +47,8 @@ public void leave() {
4747
this.isActive = false;
4848
this.leftAt = LocalDateTime.now();
4949
}
50+
51+
public void updateLastReadAt() {
52+
this.lastReadAt = LocalDateTime.now();
53+
}
5054
}

src/main/java/ita/tinybite/domain/chat/service/ChatRoomService.java

Lines changed: 29 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,17 @@
11
package ita.tinybite.domain.chat.service;
22

33
import ita.tinybite.domain.auth.service.SecurityProvider;
4+
import ita.tinybite.domain.chat.dto.res.GroupChatRoomResDto;
45
import ita.tinybite.domain.chat.dto.res.OneToOneChatRoomResDto;
56
import ita.tinybite.domain.chat.entity.ChatMessage;
67
import ita.tinybite.domain.chat.entity.ChatRoom;
78
import ita.tinybite.domain.chat.entity.ChatRoomMember;
89
import ita.tinybite.domain.chat.enums.ChatRoomType;
910
import ita.tinybite.domain.chat.repository.ChatMessageRepository;
1011
import ita.tinybite.domain.chat.repository.ChatRoomMemberRepository;
11-
import ita.tinybite.domain.chat.repository.ChatRoomRepository;
1212
import ita.tinybite.domain.party.entity.PartyParticipant;
1313
import ita.tinybite.domain.party.enums.ParticipantStatus;
1414
import ita.tinybite.domain.party.repository.PartyParticipantRepository;
15-
import ita.tinybite.domain.party.repository.PartyRepository;
1615
import ita.tinybite.domain.user.entity.User;
1716
import lombok.RequiredArgsConstructor;
1817
import org.springframework.data.domain.Limit;
@@ -23,6 +22,7 @@
2322
import java.util.List;
2423

2524
@Service
25+
@Transactional(readOnly = true)
2626
@RequiredArgsConstructor
2727
public class ChatRoomService {
2828

@@ -32,7 +32,6 @@ public class ChatRoomService {
3232
private final PartyParticipantRepository partyParticipantRepository;
3333

3434

35-
@Transactional(readOnly = true)
3635
public List<OneToOneChatRoomResDto> getOneToOneRooms() {
3736
User user = securityProvider.getCurrentUser();
3837

@@ -65,6 +64,33 @@ public List<OneToOneChatRoomResDto> getOneToOneRooms() {
6564
.toList();
6665
}
6766

67+
68+
public List<GroupChatRoomResDto> getGroupRooms() {
69+
User user = securityProvider.getCurrentUser();
70+
71+
// 유저가 참여 중인 chatRoom (이면서 그룹 채팅만)
72+
List<ChatRoom> chatRooms = chatRoomMemberRepository.findByUser(user).stream()
73+
.map(ChatRoomMember::getChatRoom)
74+
.filter(chatRoom -> chatRoom.getType().equals(ChatRoomType.GROUP)).toList();
75+
76+
return chatRooms.stream()
77+
.map(chatRoom -> {
78+
// chatRoom으로 가장 최신의 메시지 조회
79+
ChatMessage recentMessage = chatMessageRepository.findByChatRoomIdOrderByCreatedAtDesc(chatRoom.getId(), Limit.of(1));
80+
String timeAgo = getTimeAgo(chatRoom.getCreatedAt());
81+
82+
ChatRoomMember chatRoomMember = chatRoomMemberRepository.findByChatRoomAndUser(chatRoom, user).orElseThrow();
83+
84+
// 마지막으로 읽은 시점을 기점으로 몇 개의 메시지가 안 읽혔는지 확인
85+
long unreadCnt = chatMessageRepository.countByChatRoomIdAndCreatedAtAfterAndSenderIdNot(chatRoom.getId(), chatRoomMember.getLastReadAt(), user.getUserId());
86+
87+
return GroupChatRoomResDto.of(chatRoom, timeAgo, recentMessage.getContent(), unreadCnt);
88+
})
89+
.toList();
90+
}
91+
92+
93+
6894
private static String getTimeAgo(LocalDateTime then) {
6995
LocalDateTime now = LocalDateTime.now();
7096

src/main/java/ita/tinybite/domain/chat/service/ChatService.java

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
import ita.tinybite.domain.chat.enums.ChatRoomType;
1010
import ita.tinybite.domain.chat.enums.MessageType;
1111
import ita.tinybite.domain.chat.repository.ChatMessageRepository;
12+
import ita.tinybite.domain.chat.repository.ChatRoomMemberRepository;
1213
import ita.tinybite.domain.chat.repository.ChatRoomRepository;
1314
import ita.tinybite.domain.notification.service.facade.NotificationFacade;
1415
import ita.tinybite.domain.user.entity.User;
@@ -38,6 +39,7 @@ public class ChatService {
3839
private final ChatSubscribeRegistry registry;
3940
private final NotificationFacade notificationFacade;
4041
private final SecurityProvider securityProvider;
42+
private final ChatRoomMemberRepository chatRoomMemberRepository;
4143

4244
public ChatMessage saveMessage(ChatMessage message) {
4345
return chatMessageRepository.save(message);
@@ -97,16 +99,21 @@ public void sendNotification(ChatMessage message, Long chatRoomId) {
9799
}
98100

99101
public ChatMessageSliceResDto getChatMessage(Long roomId, int page, int size) {
100-
Long currentUserId = securityProvider.getCurrentUser().getUserId();
102+
User user = securityProvider.getCurrentUser();
101103

102104
Pageable pageable = PageRequest.of(page, size, Sort.by(Sort.Direction.DESC, "createdAt"));
103105
Slice<ChatMessage> messages = chatMessageRepository.findByChatRoomId(roomId, pageable);
104106

107+
ChatRoom chatRoom = chatRoomRepository.findById(roomId).orElseThrow();
108+
ChatRoomMember chatRoomMember = chatRoomMemberRepository.findByChatRoomAndUser(chatRoom, user).orElseThrow();
109+
110+
chatRoomMember.updateLastReadAt();
111+
105112
List<ChatMessageResDto> list = messages
106113
.getContent()
107114
.stream()
108115
.map(chatMessage ->
109-
ChatMessageResDto.of(chatMessage, currentUserId)
116+
ChatMessageResDto.of(chatMessage, user.getUserId())
110117
)
111118
.toList();
112119

0 commit comments

Comments
 (0)