From de1a9eb114e13e941f939bac8cc92b53cf698497 Mon Sep 17 00:00:00 2001 From: Klaus Date: Mon, 14 Sep 2026 14:50:44 +0900 Subject: [PATCH] =?UTF-8?q?feat(user-creator-chat):=20DM=20=EC=83=9D?= =?UTF-8?q?=EC=84=B1=20=EC=88=98=EC=8B=A0=EC=9E=90=20=ED=95=84=EB=93=9C?= =?UTF-8?q?=EB=A5=BC=20=EC=9D=BC=EB=B0=98=ED=99=94=ED=95=9C=EB=8B=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/UserCreatorChatController.kt | 2 +- .../dto/UserCreatorChatDtos.kt | 14 +++++- .../UserCreatorChatControllerMappingTest.kt | 43 +++++++++++++++++++ 3 files changed, 56 insertions(+), 3 deletions(-) diff --git a/src/main/kotlin/kr/co/vividnext/sodalive/v2/usercreatorchat/controller/UserCreatorChatController.kt b/src/main/kotlin/kr/co/vividnext/sodalive/v2/usercreatorchat/controller/UserCreatorChatController.kt index 02248ca4..3a7b5744 100644 --- a/src/main/kotlin/kr/co/vividnext/sodalive/v2/usercreatorchat/controller/UserCreatorChatController.kt +++ b/src/main/kotlin/kr/co/vividnext/sodalive/v2/usercreatorchat/controller/UserCreatorChatController.kt @@ -28,7 +28,7 @@ class UserCreatorChatController( @RequestBody request: CreateUserCreatorChatRoomRequest ) = run { if (member == null) throw SodaException(messageKey = "common.error.bad_credentials") - ApiResponse.ok(service.createOrGetRoom(member, request.creatorId)) + ApiResponse.ok(service.createOrGetRoom(member, request.recipientMemberId())) } @GetMapping("/{roomId}/open") diff --git a/src/main/kotlin/kr/co/vividnext/sodalive/v2/usercreatorchat/dto/UserCreatorChatDtos.kt b/src/main/kotlin/kr/co/vividnext/sodalive/v2/usercreatorchat/dto/UserCreatorChatDtos.kt index 3e8b8dbc..99f64a5b 100644 --- a/src/main/kotlin/kr/co/vividnext/sodalive/v2/usercreatorchat/dto/UserCreatorChatDtos.kt +++ b/src/main/kotlin/kr/co/vividnext/sodalive/v2/usercreatorchat/dto/UserCreatorChatDtos.kt @@ -1,8 +1,18 @@ package kr.co.vividnext.sodalive.v2.usercreatorchat.dto +import kr.co.vividnext.sodalive.common.SodaException + data class CreateUserCreatorChatRoomRequest( - val creatorId: Long -) + val recipientId: Long? = null, + val creatorId: Long? = null +) { + fun recipientMemberId(): Long { + if (recipientId != null && creatorId != null && recipientId != creatorId) { + throw SodaException(messageKey = "common.error.invalid_request") + } + return recipientId ?: creatorId ?: throw SodaException(messageKey = "common.error.invalid_request") + } +} data class CreateUserCreatorChatRoomResponse( val roomId: Long diff --git a/src/test/kotlin/kr/co/vividnext/sodalive/v2/usercreatorchat/UserCreatorChatControllerMappingTest.kt b/src/test/kotlin/kr/co/vividnext/sodalive/v2/usercreatorchat/UserCreatorChatControllerMappingTest.kt index 8b1e63e7..57758669 100644 --- a/src/test/kotlin/kr/co/vividnext/sodalive/v2/usercreatorchat/UserCreatorChatControllerMappingTest.kt +++ b/src/test/kotlin/kr/co/vividnext/sodalive/v2/usercreatorchat/UserCreatorChatControllerMappingTest.kt @@ -1,7 +1,13 @@ package kr.co.vividnext.sodalive.v2.usercreatorchat +import kr.co.vividnext.sodalive.common.SodaException +import kr.co.vividnext.sodalive.member.Member import kr.co.vividnext.sodalive.v2.usercreatorchat.controller.UserCreatorChatController +import kr.co.vividnext.sodalive.v2.usercreatorchat.dto.CreateUserCreatorChatRoomRequest +import kr.co.vividnext.sodalive.v2.usercreatorchat.dto.CreateUserCreatorChatRoomResponse import kr.co.vividnext.sodalive.v2.usercreatorchat.service.UserCreatorChatService +import org.junit.jupiter.api.Assertions.assertEquals +import org.junit.jupiter.api.Assertions.assertThrows import org.junit.jupiter.api.Test import org.mockito.Mockito import org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get @@ -23,4 +29,41 @@ class UserCreatorChatControllerMappingTest { mockMvc.perform(post("/api/v2/user-creator-chat/rooms/10/messages/text")) .andExpect(status().isNotFound) } + + @Test + fun shouldCreateRoomWithRecipientId() { + val service = Mockito.mock(UserCreatorChatService::class.java) + val controller = UserCreatorChatController(service) + val member = Member(email = "creator@test.com", password = "pw", nickname = "creator").apply { id = 10L } + Mockito.`when`(service.createOrGetRoom(member, 20L)) + .thenReturn(CreateUserCreatorChatRoomResponse(roomId = 30L)) + + val response = controller.createOrGetRoom( + member, + CreateUserCreatorChatRoomRequest(recipientId = 20L, creatorId = null) + ) + + Mockito.verify(service).createOrGetRoom(member, 20L) + assertEquals(30L, response.data!!.roomId) + } + + @Test + fun shouldCreateRoomWithLegacyCreatorId() { + val request = CreateUserCreatorChatRoomRequest(recipientId = null, creatorId = 20L) + + assertEquals(20L, request.recipientMemberId()) + } + + @Test + fun shouldRejectMissingOrConflictingRecipientIds() { + val missing = assertThrows(SodaException::class.java) { + CreateUserCreatorChatRoomRequest(recipientId = null, creatorId = null).recipientMemberId() + } + assertEquals("common.error.invalid_request", missing.messageKey) + + val conflict = assertThrows(SodaException::class.java) { + CreateUserCreatorChatRoomRequest(recipientId = 20L, creatorId = 21L).recipientMemberId() + } + assertEquals("common.error.invalid_request", conflict.messageKey) + } }