From d3b1f4bcd4aeaafe0bb16dccd804a41a31f3afe0 Mon Sep 17 00:00:00 2001 From: Klaus Date: Thu, 2 Apr 2026 15:51:50 +0900 Subject: [PATCH] =?UTF-8?q?fix(chat-banner):=20=EA=B4=80=EB=A6=AC=EC=9E=90?= =?UTF-8?q?=20=EB=B0=B0=EB=84=88=20=EB=AA=A9=EB=A1=9D=EC=97=90=20=EC=96=B8?= =?UTF-8?q?=EC=96=B4=20=ED=91=9C=EA=B8=B0=EB=A5=BC=20=EC=B6=94=EA=B0=80?= =?UTF-8?q?=ED=95=9C=EB=8B=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...20260402_관리자채팅배너목록언어표기추가.md | 10 +++++++++ .../admin/chat/AdminChatBannerController.kt | 8 ++++++- .../chat/dto/ChatCharacterBannerResponse.kt | 21 +++++++++++++++++-- .../chat/AdminChatBannerControllerTest.kt | 17 +++++++++++++++ 4 files changed, 53 insertions(+), 3 deletions(-) create mode 100644 docs/20260402_관리자채팅배너목록언어표기추가.md diff --git a/docs/20260402_관리자채팅배너목록언어표기추가.md b/docs/20260402_관리자채팅배너목록언어표기추가.md new file mode 100644 index 00000000..0f3c1af2 --- /dev/null +++ b/docs/20260402_관리자채팅배너목록언어표기추가.md @@ -0,0 +1,10 @@ +- [x] 배너 목록 조회 응답 생성 경로와 언어 정보 위치를 확인한다. +- [x] 배너 목록 응답의 연결 캐릭터 이름에 배너 등록 언어를 `(언어)` 형식으로 추가한다. +- [x] 변경 파일 기준으로 검증을 수행하고 결과를 기록한다. + +## 검증 기록 + +### 1차 구현 +- 무엇을: 관리자 배너 목록 조회 응답에서 연결 캐릭터 이름 뒤에 배너 등록 언어를 `(언어)` 형식으로 붙이도록 수정했다. +- 왜: 같은 이름과 같은 이미지의 배너라도 등록 언어가 다르면 관리자 페이지에서 즉시 구분할 수 있어야 하기 때문이다. +- 어떻게: `./gradlew test --tests "kr.co.vividnext.sodalive.admin.chat.AdminChatBannerControllerTest"` 실행으로 컨트롤러 테스트를 검증했고, 새 테스트에서 목록 조회 응답 이름이 `character-12 (일본어)`로 반환되는 것을 확인했다. 결과는 `BUILD SUCCESSFUL`이다. diff --git a/src/main/kotlin/kr/co/vividnext/sodalive/admin/chat/AdminChatBannerController.kt b/src/main/kotlin/kr/co/vividnext/sodalive/admin/chat/AdminChatBannerController.kt index 1c70040e..cc2e4b58 100644 --- a/src/main/kotlin/kr/co/vividnext/sodalive/admin/chat/AdminChatBannerController.kt +++ b/src/main/kotlin/kr/co/vividnext/sodalive/admin/chat/AdminChatBannerController.kt @@ -62,7 +62,13 @@ class AdminChatBannerController( val banners = bannerService.getActiveBanners(pageable) val response = ChatCharacterBannerListPageResponse( totalCount = banners.totalElements, - content = banners.content.map { ChatCharacterBannerResponse.from(it, imageHost) } + content = banners.content.map { + ChatCharacterBannerResponse.from( + banner = it, + imageHost = imageHost, + appendLanguageToCharacterName = true + ) + } ) ApiResponse.ok(response) diff --git a/src/main/kotlin/kr/co/vividnext/sodalive/admin/chat/dto/ChatCharacterBannerResponse.kt b/src/main/kotlin/kr/co/vividnext/sodalive/admin/chat/dto/ChatCharacterBannerResponse.kt index 25ebcc7e..a114e9a9 100644 --- a/src/main/kotlin/kr/co/vividnext/sodalive/admin/chat/dto/ChatCharacterBannerResponse.kt +++ b/src/main/kotlin/kr/co/vividnext/sodalive/admin/chat/dto/ChatCharacterBannerResponse.kt @@ -1,6 +1,7 @@ package kr.co.vividnext.sodalive.admin.chat.dto import kr.co.vividnext.sodalive.chat.character.ChatCharacterBanner +import kr.co.vividnext.sodalive.i18n.Lang /** * 캐릭터 배너 응답 DTO @@ -12,14 +13,30 @@ data class ChatCharacterBannerResponse( val characterName: String ) { companion object { - fun from(banner: ChatCharacterBanner, imageHost: String): ChatCharacterBannerResponse { + fun from( + banner: ChatCharacterBanner, + imageHost: String, + appendLanguageToCharacterName: Boolean = false + ): ChatCharacterBannerResponse { return ChatCharacterBannerResponse( id = banner.id!!, imagePath = "$imageHost/${banner.imagePath}", characterId = banner.chatCharacter.id!!, - characterName = banner.chatCharacter.name + characterName = if (appendLanguageToCharacterName) { + "${banner.chatCharacter.name} (${getLanguageLabel(banner.lang)})" + } else { + banner.chatCharacter.name + } ) } + + private fun getLanguageLabel(lang: Lang): String { + return when (lang) { + Lang.KO -> "한국어" + Lang.EN -> "영어" + Lang.JA -> "일본어" + } + } } } diff --git a/src/test/kotlin/kr/co/vividnext/sodalive/admin/chat/AdminChatBannerControllerTest.kt b/src/test/kotlin/kr/co/vividnext/sodalive/admin/chat/AdminChatBannerControllerTest.kt index cbe64582..19a37eea 100644 --- a/src/test/kotlin/kr/co/vividnext/sodalive/admin/chat/AdminChatBannerControllerTest.kt +++ b/src/test/kotlin/kr/co/vividnext/sodalive/admin/chat/AdminChatBannerControllerTest.kt @@ -14,6 +14,8 @@ import org.junit.jupiter.api.Assertions.assertEquals import org.junit.jupiter.api.Assertions.assertTrue import org.junit.jupiter.api.Test import org.mockito.Mockito +import org.springframework.data.domain.PageImpl +import org.springframework.data.domain.PageRequest import org.springframework.mock.web.MockMultipartFile import java.net.URL @@ -107,6 +109,21 @@ class AdminChatBannerControllerTest { Mockito.verify(bannerService).registerBanner(2L, "", null) } + @Test + fun shouldAppendBannerLanguageToCharacterNameInBannerList() { + val pageable = PageRequest.of(0, 20) + val japaneseBanner = createBanner(id = 12L, lang = Lang.JA, imagePath = "banner/jp.png") + + Mockito.`when`(adminCharacterService.createDefaultPageRequest(0, 20)).thenReturn(pageable) + Mockito.`when`(bannerService.getActiveBanners(pageable)) + .thenReturn(PageImpl(listOf(japaneseBanner), pageable, 1)) + + val response = controller.getBannerList(page = 0, size = 20) + + assertTrue(response.success) + assertEquals("character-12 (일본어)", response.data?.content?.first()?.characterName) + } + private fun createBanner(id: Long, lang: Lang, imagePath: String): ChatCharacterBanner { val character = ChatCharacter( characterUUID = "character-$id",