feat(usercreatorchat): openRoom 상대방 프로필을 반환한다
This commit is contained in:
@@ -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?
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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() {
|
||||||
|
|||||||
Reference in New Issue
Block a user