diff --git a/src/main/java/com/example/solidconnection/chat/controller/ChatController.java b/src/main/java/com/example/solidconnection/chat/controller/ChatController.java index 1c3b1a5d1..ddb1f9084 100644 --- a/src/main/java/com/example/solidconnection/chat/controller/ChatController.java +++ b/src/main/java/com/example/solidconnection/chat/controller/ChatController.java @@ -1,6 +1,7 @@ package com.example.solidconnection.chat.controller; import com.example.solidconnection.chat.dto.ChatMessageResponse; +import com.example.solidconnection.chat.dto.ChatParticipantResponse; import com.example.solidconnection.chat.dto.ChatRoomListResponse; import com.example.solidconnection.chat.service.ChatService; import com.example.solidconnection.common.dto.SliceResponse; @@ -41,6 +42,15 @@ public ResponseEntity> getChatMessages( return ResponseEntity.ok(response); } + @GetMapping("rooms/{room-id}/partner") + public ResponseEntity getChatPartner( + @AuthorizedUser long siteUserId, + @PathVariable("room-id") Long roomId + ) { + ChatParticipantResponse response = chatService.getChatPartner(siteUserId, roomId); + return ResponseEntity.ok(response); + } + @PutMapping("/rooms/{room-id}/read") public ResponseEntity markChatMessagesAsRead( @AuthorizedUser long siteUserId, diff --git a/src/main/java/com/example/solidconnection/chat/service/ChatService.java b/src/main/java/com/example/solidconnection/chat/service/ChatService.java index 4a9c02eed..874d71bd5 100644 --- a/src/main/java/com/example/solidconnection/chat/service/ChatService.java +++ b/src/main/java/com/example/solidconnection/chat/service/ChatService.java @@ -84,16 +84,6 @@ private ChatRoomResponse toChatRoomResponse(ChatRoom chatRoom, long siteUserId) return ChatRoomResponse.of(chatRoom.getId(), lastChatMessage, lastReceivedTime, partner, unReadCount); } - private ChatParticipant findPartner(ChatRoom chatRoom, long siteUserId) { - if (chatRoom.isGroup()) { - throw new CustomException(INVALID_CHAT_ROOM_STATE); - } - return chatRoom.getChatParticipants().stream() - .filter(participant -> participant.getSiteUserId() != siteUserId) - .findFirst() - .orElseThrow(() -> new CustomException(CHAT_PARTNER_NOT_FOUND)); - } - @Transactional(readOnly = true) public SliceResponse getChatMessages(long siteUserId, long roomId, Pageable pageable) { validateChatRoomParticipant(siteUserId, roomId); @@ -107,6 +97,26 @@ public SliceResponse getChatMessages(long siteUserId, long return SliceResponse.of(content, chatMessages); } + @Transactional(readOnly = true) + public ChatParticipantResponse getChatPartner(long siteUserId, Long roomId) { + ChatRoom chatRoom = chatRoomRepository.findById(roomId) + .orElseThrow(() -> new CustomException(INVALID_CHAT_ROOM_STATE)); + ChatParticipant partnerParticipant = findPartner(chatRoom, siteUserId); + SiteUser siteUser = siteUserRepository.findById(partnerParticipant.getSiteUserId()) + .orElseThrow(() -> new CustomException(USER_NOT_FOUND)); + return ChatParticipantResponse.of(siteUser.getId(), siteUser.getNickname(), siteUser.getProfileImageUrl()); + } + + private ChatParticipant findPartner(ChatRoom chatRoom, long siteUserId) { + if (chatRoom.isGroup()) { + throw new CustomException(INVALID_CHAT_ROOM_STATE); + } + return chatRoom.getChatParticipants().stream() + .filter(participant -> participant.getSiteUserId() != siteUserId) + .findFirst() + .orElseThrow(() -> new CustomException(CHAT_PARTNER_NOT_FOUND)); + } + public void validateChatRoomParticipant(long siteUserId, long roomId) { boolean isParticipant = chatParticipantRepository.existsByChatRoomIdAndSiteUserId(roomId, siteUserId); if (!isParticipant) { diff --git a/src/test/java/com/example/solidconnection/chat/service/ChatServiceTest.java b/src/test/java/com/example/solidconnection/chat/service/ChatServiceTest.java index 667a02d5e..9f3c1f017 100644 --- a/src/test/java/com/example/solidconnection/chat/service/ChatServiceTest.java +++ b/src/test/java/com/example/solidconnection/chat/service/ChatServiceTest.java @@ -14,6 +14,7 @@ import com.example.solidconnection.chat.dto.ChatMessageResponse; import com.example.solidconnection.chat.dto.ChatMessageSendRequest; import com.example.solidconnection.chat.dto.ChatMessageSendResponse; +import com.example.solidconnection.chat.dto.ChatParticipantResponse; import com.example.solidconnection.chat.dto.ChatRoomListResponse; import com.example.solidconnection.chat.fixture.ChatAttachmentFixture; import com.example.solidconnection.chat.fixture.ChatMessageFixture; @@ -309,6 +310,28 @@ void setUp() { } } + @Nested + class 채팅방_파트너_정보를_조회한다 { + + @Test + void 채팅방_파트너를_정상_조회한다() { + // given + ChatRoom chatRoom = chatRoomFixture.채팅방(false); + chatParticipantFixture.참여자(user.getId(), chatRoom); + chatParticipantFixture.참여자(mentor1.getId(), chatRoom); + + // when + ChatParticipantResponse response = chatService.getChatPartner(user.getId(), chatRoom.getId()); + + // then + assertAll( + () -> assertThat(response.partnerId()).isEqualTo(mentor1.getId()), + () -> assertThat(response.nickname()).isEqualTo(mentor1.getNickname()), + () -> assertThat(response.profileUrl()).isEqualTo(mentor1.getProfileImageUrl()) + ); + } + } + @Nested class 채팅_메시지_읽음을_처리한다 {