fix(chat-banner): 관리자 배너 목록에 언어 표기를 추가한다

This commit is contained in:
2026-04-02 15:51:50 +09:00
parent ee14389786
commit d3b1f4bcd4
4 changed files with 53 additions and 3 deletions

View File

@@ -0,0 +1,10 @@
- [x] 배너 목록 조회 응답 생성 경로와 언어 정보 위치를 확인한다.
- [x] 배너 목록 응답의 연결 캐릭터 이름에 배너 등록 언어를 `(언어)` 형식으로 추가한다.
- [x] 변경 파일 기준으로 검증을 수행하고 결과를 기록한다.
## 검증 기록
### 1차 구현
- 무엇을: 관리자 배너 목록 조회 응답에서 연결 캐릭터 이름 뒤에 배너 등록 언어를 `(언어)` 형식으로 붙이도록 수정했다.
- 왜: 같은 이름과 같은 이미지의 배너라도 등록 언어가 다르면 관리자 페이지에서 즉시 구분할 수 있어야 하기 때문이다.
- 어떻게: `./gradlew test --tests "kr.co.vividnext.sodalive.admin.chat.AdminChatBannerControllerTest"` 실행으로 컨트롤러 테스트를 검증했고, 새 테스트에서 목록 조회 응답 이름이 `character-12 (일본어)`로 반환되는 것을 확인했다. 결과는 `BUILD SUCCESSFUL`이다.

View File

@@ -62,7 +62,13 @@ class AdminChatBannerController(
val banners = bannerService.getActiveBanners(pageable) val banners = bannerService.getActiveBanners(pageable)
val response = ChatCharacterBannerListPageResponse( val response = ChatCharacterBannerListPageResponse(
totalCount = banners.totalElements, 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) ApiResponse.ok(response)

View File

@@ -1,6 +1,7 @@
package kr.co.vividnext.sodalive.admin.chat.dto package kr.co.vividnext.sodalive.admin.chat.dto
import kr.co.vividnext.sodalive.chat.character.ChatCharacterBanner import kr.co.vividnext.sodalive.chat.character.ChatCharacterBanner
import kr.co.vividnext.sodalive.i18n.Lang
/** /**
* 캐릭터 배너 응답 DTO * 캐릭터 배너 응답 DTO
@@ -12,14 +13,30 @@ data class ChatCharacterBannerResponse(
val characterName: String val characterName: String
) { ) {
companion object { companion object {
fun from(banner: ChatCharacterBanner, imageHost: String): ChatCharacterBannerResponse { fun from(
banner: ChatCharacterBanner,
imageHost: String,
appendLanguageToCharacterName: Boolean = false
): ChatCharacterBannerResponse {
return ChatCharacterBannerResponse( return ChatCharacterBannerResponse(
id = banner.id!!, id = banner.id!!,
imagePath = "$imageHost/${banner.imagePath}", imagePath = "$imageHost/${banner.imagePath}",
characterId = banner.chatCharacter.id!!, 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 -> "일본어"
}
}
} }
} }

View File

@@ -14,6 +14,8 @@ import org.junit.jupiter.api.Assertions.assertEquals
import org.junit.jupiter.api.Assertions.assertTrue import org.junit.jupiter.api.Assertions.assertTrue
import org.junit.jupiter.api.Test import org.junit.jupiter.api.Test
import org.mockito.Mockito import org.mockito.Mockito
import org.springframework.data.domain.PageImpl
import org.springframework.data.domain.PageRequest
import org.springframework.mock.web.MockMultipartFile import org.springframework.mock.web.MockMultipartFile
import java.net.URL import java.net.URL
@@ -107,6 +109,21 @@ class AdminChatBannerControllerTest {
Mockito.verify(bannerService).registerBanner(2L, "", null) 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 { private fun createBanner(id: Long, lang: Lang, imagePath: String): ChatCharacterBanner {
val character = ChatCharacter( val character = ChatCharacter(
characterUUID = "character-$id", characterUUID = "character-$id",