From eb2d093b02364e1d327b4d09937bf2eed6af6c69 Mon Sep 17 00:00:00 2001 From: Klaus Date: Thu, 18 Sep 2025 19:29:34 +0900 Subject: [PATCH] =?UTF-8?q?feat(admin-character-list):=20=EC=BA=90?= =?UTF-8?q?=EB=A6=AD=ED=84=B0=20=EA=B2=80=EC=83=89=EC=97=90=20=ED=8E=98?= =?UTF-8?q?=EC=9D=B4=EC=A7=95=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../character/AdminChatCharacterController.kt | 16 +++++++++---- .../service/AdminChatCharacterService.kt | 16 ------------- .../repository/ChatCharacterRepository.kt | 23 ------------------- 3 files changed, 12 insertions(+), 43 deletions(-) diff --git a/src/main/kotlin/kr/co/vividnext/sodalive/admin/chat/character/AdminChatCharacterController.kt b/src/main/kotlin/kr/co/vividnext/sodalive/admin/chat/character/AdminChatCharacterController.kt index 38db366..dfa8c3a 100644 --- a/src/main/kotlin/kr/co/vividnext/sodalive/admin/chat/character/AdminChatCharacterController.kt +++ b/src/main/kotlin/kr/co/vividnext/sodalive/admin/chat/character/AdminChatCharacterController.kt @@ -3,6 +3,7 @@ package kr.co.vividnext.sodalive.admin.chat.character import com.amazonaws.services.s3.model.ObjectMetadata import com.fasterxml.jackson.databind.ObjectMapper import kr.co.vividnext.sodalive.admin.chat.character.dto.ChatCharacterRegisterRequest +import kr.co.vividnext.sodalive.admin.chat.character.dto.ChatCharacterSearchListPageResponse import kr.co.vividnext.sodalive.admin.chat.character.dto.ChatCharacterUpdateRequest import kr.co.vividnext.sodalive.admin.chat.character.dto.ExternalApiResponse import kr.co.vividnext.sodalive.admin.chat.character.service.AdminChatCharacterService @@ -73,14 +74,21 @@ class AdminChatCharacterController( /** * 캐릭터 검색(관리자) * - 이름/설명/MBTI/태그 기준 부분 검색, 활성 캐릭터만 대상 - * - 페이징 제거: 전체 목록 반환 + * - 페이징 지원: page, size 파라미터 사용 */ @GetMapping("/search") fun searchCharacters( - @RequestParam("searchTerm") searchTerm: String + @RequestParam("searchTerm") searchTerm: String, + @RequestParam(defaultValue = "0") page: Int, + @RequestParam(defaultValue = "20") size: Int ) = run { - val list = adminService.searchCharactersAll(searchTerm, imageHost) - ApiResponse.ok(list) + val pageable = adminService.createDefaultPageRequest(page, size) + val resultPage = adminService.searchCharacters(searchTerm, pageable, imageHost) + val response = ChatCharacterSearchListPageResponse( + totalCount = resultPage.totalElements, + content = resultPage.content + ) + ApiResponse.ok(response) } /** diff --git a/src/main/kotlin/kr/co/vividnext/sodalive/admin/chat/character/service/AdminChatCharacterService.kt b/src/main/kotlin/kr/co/vividnext/sodalive/admin/chat/character/service/AdminChatCharacterService.kt index 851f345..775673d 100644 --- a/src/main/kotlin/kr/co/vividnext/sodalive/admin/chat/character/service/AdminChatCharacterService.kt +++ b/src/main/kotlin/kr/co/vividnext/sodalive/admin/chat/character/service/AdminChatCharacterService.kt @@ -76,20 +76,4 @@ class AdminChatCharacterService( val characters = chatCharacterRepository.searchCharacters(searchTerm, pageable) return characters.map { ChatCharacterSearchResponse.from(it, imageHost) } } - - /** - * 캐릭터 검색 (이름, 설명, MBTI, 태그 기반) - 무페이징 - * - * @param searchTerm 검색어 - * @param imageHost 이미지 호스트 URL - * @return 검색된 캐릭터 목록 (전체) - */ - @Transactional(readOnly = true) - fun searchCharactersAll( - searchTerm: String, - imageHost: String = "" - ): List { - val characters = chatCharacterRepository.searchCharactersNoPaging(searchTerm) - return characters.map { ChatCharacterSearchResponse.from(it, imageHost) } - } } diff --git a/src/main/kotlin/kr/co/vividnext/sodalive/chat/character/repository/ChatCharacterRepository.kt b/src/main/kotlin/kr/co/vividnext/sodalive/chat/character/repository/ChatCharacterRepository.kt index 2269123..eb9bc4d 100644 --- a/src/main/kotlin/kr/co/vividnext/sodalive/chat/character/repository/ChatCharacterRepository.kt +++ b/src/main/kotlin/kr/co/vividnext/sodalive/chat/character/repository/ChatCharacterRepository.kt @@ -12,7 +12,6 @@ import org.springframework.stereotype.Repository interface ChatCharacterRepository : JpaRepository { fun findByName(name: String): ChatCharacter? fun findByIsActiveTrue(pageable: Pageable): Page - fun findByOriginalWorkIdAndIsActiveTrueOrderByCreatedAtDesc(originalWorkId: Long): List fun findByOriginalWorkIdAndIsActiveTrue(originalWorkId: Long, pageable: Pageable): Page /** @@ -54,28 +53,6 @@ interface ChatCharacterRepository : JpaRepository { pageable: Pageable ): Page - /** - * 이름, 설명, MBTI, 태그로 캐릭터 검색 - 무페이징 전체 목록 - */ - @Query( - """ - SELECT DISTINCT c FROM ChatCharacter c - LEFT JOIN c.tagMappings tm - LEFT JOIN tm.tag t - WHERE c.isActive = true AND - ( - LOWER(c.name) LIKE LOWER(CONCAT('%', :searchTerm, '%')) OR - LOWER(c.description) LIKE LOWER(CONCAT('%', :searchTerm, '%')) OR - (c.mbti IS NOT NULL AND LOWER(c.mbti) LIKE LOWER(CONCAT('%', :searchTerm, '%'))) OR - (t.tag IS NOT NULL AND LOWER(t.tag) LIKE LOWER(CONCAT('%', :searchTerm, '%'))) - ) - ORDER BY c.createdAt DESC - """ - ) - fun searchCharactersNoPaging( - @Param("searchTerm") searchTerm: String - ): List - /** * 특정 캐릭터와 태그를 공유하는 다른 캐릭터를 무작위로 조회 (현재 캐릭터 제외) */