feat(usercreatorchat): openRoom 상대방 프로필을 반환한다

This commit is contained in:
2026-06-10 16:38:43 +09:00
parent e8d5e07104
commit 39025fc3f3
3 changed files with 62 additions and 0 deletions

View File

@@ -24,6 +24,8 @@ data class SendUserCreatorChatMessageResponse(
data class UserCreatorChatRoomOpenResponse( data class UserCreatorChatRoomOpenResponse(
val roomId: Long, val roomId: Long,
val opponentNickname: String,
val opponentProfileImageUrl: String,
val messages: List<UserCreatorChatMessageItemDto>, val messages: List<UserCreatorChatMessageItemDto>,
val hasMore: Boolean, val hasMore: Boolean,
val nextCursor: Long? val nextCursor: Long?

View File

@@ -73,9 +73,14 @@ class UserCreatorChatService(
fun openRoom(member: Member, roomId: Long, limit: Int = 20): UserCreatorChatRoomOpenResponse { fun openRoom(member: Member, roomId: Long, limit: Int = 20): UserCreatorChatRoomOpenResponse {
val room = findRoom(roomId) val room = findRoom(roomId)
requireParticipant(roomId, member.id!!) requireParticipant(roomId, member.id!!)
val opponent = participantRepository.findActiveOpponent(roomId, member.id!!)?.member
?: throw SodaException(messageKey = "chat.room.invalid_access")
val opponentProfilePath = opponent.profileImage ?: "profile/default-profile.png"
val page = getMessages(member, roomId, cursor = null, limit = limit) val page = getMessages(member, roomId, cursor = null, limit = limit)
return UserCreatorChatRoomOpenResponse( return UserCreatorChatRoomOpenResponse(
roomId = room.id!!, roomId = room.id!!,
opponentNickname = opponent.nickname,
opponentProfileImageUrl = "$cloudFrontHost/$opponentProfilePath",
messages = page.messages, messages = page.messages,
hasMore = page.hasMore, hasMore = page.hasMore,
nextCursor = page.nextCursor nextCursor = page.nextCursor

View File

@@ -81,6 +81,61 @@ class UserCreatorChatServiceTest {
Mockito.verify(participantRepository, Mockito.times(2)).save(Mockito.any(UserCreatorChatParticipant::class.java)) Mockito.verify(participantRepository, Mockito.times(2)).save(Mockito.any(UserCreatorChatParticipant::class.java))
} }
@Test
@DisplayName("방 입장 응답은 상대방 닉네임과 프로필 이미지 URL을 포함한다")
fun shouldOpenRoomWithOpponentProfileWhenOpponentHasProfileImage() {
val user = member(1L, "user")
val creator = member(2L, "creator").apply {
profileImage = "profile/creator.png"
}
val room = room(10L)
val userParticipant = participant(100L, room, user)
val creatorParticipant = participant(101L, room, creator)
Mockito.`when`(roomRepository.findByIdAndIsActiveTrue(10L)).thenReturn(room)
Mockito.`when`(participantRepository.findActiveByRoomIdAndMemberId(10L, 1L)).thenReturn(userParticipant)
Mockito.`when`(participantRepository.findActiveOpponent(10L, 1L)).thenReturn(creatorParticipant)
Mockito.`when`(
messageRepository.findByChatRoomAndIsActiveTrueOrderByIdDesc(
room,
PageRequest.of(0, 20)
)
).thenReturn(emptyList())
val response = service.openRoom(user, roomId = 10L)
assertEquals(10L, response.roomId)
assertEquals("creator", response.opponentNickname)
assertEquals("https://cdn.test/profile/creator.png", response.opponentProfileImageUrl)
assertEquals(emptyList<UserCreatorChatMessageItemDto>(), response.messages)
assertFalse(response.hasMore)
assertEquals(null, response.nextCursor)
Mockito.verify(participantRepository).findActiveOpponent(10L, 1L)
}
@Test
@DisplayName("상대방 프로필 이미지가 없으면 방 입장 응답은 기본 프로필 이미지 URL을 반환한다")
fun shouldOpenRoomWithDefaultOpponentProfileWhenOpponentProfileImageIsNull() {
val user = member(1L, "user")
val creator = member(2L, "creator")
val room = room(10L)
val userParticipant = participant(100L, room, user)
val creatorParticipant = participant(101L, room, creator)
Mockito.`when`(roomRepository.findByIdAndIsActiveTrue(10L)).thenReturn(room)
Mockito.`when`(participantRepository.findActiveByRoomIdAndMemberId(10L, 1L)).thenReturn(userParticipant)
Mockito.`when`(participantRepository.findActiveOpponent(10L, 1L)).thenReturn(creatorParticipant)
Mockito.`when`(
messageRepository.findByChatRoomAndIsActiveTrueOrderByIdDesc(
room,
PageRequest.of(0, 20)
)
).thenReturn(emptyList())
val response = service.openRoom(user, roomId = 10L)
assertEquals("creator", response.opponentNickname)
assertEquals("https://cdn.test/profile/default-profile.png", response.opponentProfileImageUrl)
}
@Test @Test
@DisplayName("상대방이 같은 방에 입장 중이면 텍스트 메시지를 실시간 전송하고 푸시를 보내지 않는다") @DisplayName("상대방이 같은 방에 입장 중이면 텍스트 메시지를 실시간 전송하고 푸시를 보내지 않는다")
fun shouldSendRealtimeMessageWithoutPushWhenOpponentIsPresent() { fun shouldSendRealtimeMessageWithoutPushWhenOpponentIsPresent() {