캐릭터 챗봇 #338
| @@ -1,7 +1,6 @@ | |||||||
| package kr.co.vividnext.sodalive.admin.chat.character.dto | package kr.co.vividnext.sodalive.admin.chat.character.dto | ||||||
|  |  | ||||||
| import kr.co.vividnext.sodalive.chat.character.ChatCharacter | import kr.co.vividnext.sodalive.chat.character.ChatCharacter | ||||||
| import org.springframework.data.domain.Page |  | ||||||
|  |  | ||||||
| /** | /** | ||||||
|  * 캐릭터 검색 결과 응답 DTO |  * 캐릭터 검색 결과 응답 DTO | ||||||
| @@ -27,9 +26,5 @@ data class ChatCharacterSearchResponse( | |||||||
|                 tags = tags |                 tags = tags | ||||||
|             ) |             ) | ||||||
|         } |         } | ||||||
|  |  | ||||||
|         fun fromPage(characters: Page<ChatCharacter>, imageHost: String): Page<ChatCharacterSearchResponse> { |  | ||||||
|             return characters.map { from(it, imageHost) } |  | ||||||
|         } |  | ||||||
|     } |     } | ||||||
| } | } | ||||||
|   | |||||||
| @@ -1,7 +1,6 @@ | |||||||
| 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 org.springframework.data.domain.Page |  | ||||||
|  |  | ||||||
| /** | /** | ||||||
|  * 캐릭터 배너 응답 DTO |  * 캐릭터 배너 응답 DTO | ||||||
| @@ -21,10 +20,6 @@ data class ChatCharacterBannerResponse( | |||||||
|                 characterName = banner.chatCharacter.name |                 characterName = banner.chatCharacter.name | ||||||
|             ) |             ) | ||||||
|         } |         } | ||||||
|  |  | ||||||
|         fun fromPage(banners: Page<ChatCharacterBanner>, imageHost: String): Page<ChatCharacterBannerResponse> { |  | ||||||
|             return banners.map { from(it, imageHost) } |  | ||||||
|         } |  | ||||||
|     } |     } | ||||||
| } | } | ||||||
|  |  | ||||||
|   | |||||||
| @@ -1,43 +1,13 @@ | |||||||
| package kr.co.vividnext.sodalive.chat.character.repository | package kr.co.vividnext.sodalive.chat.character.repository | ||||||
|  |  | ||||||
| import kr.co.vividnext.sodalive.chat.character.ChatCharacter |  | ||||||
| import kr.co.vividnext.sodalive.chat.character.ChatCharacterBanner | import kr.co.vividnext.sodalive.chat.character.ChatCharacterBanner | ||||||
| import org.springframework.data.domain.Page | import org.springframework.data.domain.Page | ||||||
| import org.springframework.data.domain.Pageable | import org.springframework.data.domain.Pageable | ||||||
| import org.springframework.data.jpa.repository.JpaRepository | import org.springframework.data.jpa.repository.JpaRepository | ||||||
| import org.springframework.data.jpa.repository.Query |  | ||||||
| import org.springframework.data.repository.query.Param |  | ||||||
| import org.springframework.stereotype.Repository | import org.springframework.stereotype.Repository | ||||||
|  |  | ||||||
| @Repository | @Repository | ||||||
| interface ChatCharacterBannerRepository : JpaRepository<ChatCharacterBanner, Long> { | interface ChatCharacterBannerRepository : JpaRepository<ChatCharacterBanner, Long> { | ||||||
|     // 활성화된 배너 목록 조회 |     // 활성화된 배너 목록 조회 | ||||||
|     fun findByIsActiveTrue(pageable: Pageable): Page<ChatCharacterBanner> |     fun findByActiveTrue(pageable: Pageable): Page<ChatCharacterBanner> | ||||||
|  |  | ||||||
|     // 특정 캐릭터의 활성화된 배너 목록 조회 |  | ||||||
|     fun findByChatCharacterAndIsActiveTrue(chatCharacter: ChatCharacter): List<ChatCharacterBanner> |  | ||||||
|  |  | ||||||
|     // 특정 캐릭터 ID의 활성화된 배너 목록 조회 |  | ||||||
|     fun findByChatCharacter_IdAndIsActiveTrue(characterId: Long): List<ChatCharacterBanner> |  | ||||||
|  |  | ||||||
|     // 이름, 설명, MBTI, 태그로 캐릭터 검색 (배너 포함) |  | ||||||
|     @Query( |  | ||||||
|         """ |  | ||||||
|         SELECT DISTINCT b FROM ChatCharacterBanner b |  | ||||||
|         JOIN FETCH b.chatCharacter c |  | ||||||
|         LEFT JOIN c.tagMappings tm |  | ||||||
|         LEFT JOIN tm.tag t |  | ||||||
|         WHERE b.isActive = true AND 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, '%'))) |  | ||||||
|         ) |  | ||||||
|         """ |  | ||||||
|     ) |  | ||||||
|     fun searchBannersByCharacterAttributes( |  | ||||||
|         @Param("searchTerm") searchTerm: String, |  | ||||||
|         pageable: Pageable |  | ||||||
|     ): Page<ChatCharacterBanner> |  | ||||||
| } | } | ||||||
|   | |||||||
| @@ -18,7 +18,7 @@ class ChatCharacterBannerService( | |||||||
|      * 활성화된 모든 배너 조회 |      * 활성화된 모든 배너 조회 | ||||||
|      */ |      */ | ||||||
|     fun getActiveBanners(pageable: Pageable): Page<ChatCharacterBanner> { |     fun getActiveBanners(pageable: Pageable): Page<ChatCharacterBanner> { | ||||||
|         return bannerRepository.findByIsActiveTrue(pageable) |         return bannerRepository.findByActiveTrue(pageable) | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     /** |     /** | ||||||
| @@ -29,20 +29,6 @@ class ChatCharacterBannerService( | |||||||
|             .orElseThrow { SodaException("배너를 찾을 수 없습니다: $bannerId") } |             .orElseThrow { SodaException("배너를 찾을 수 없습니다: $bannerId") } | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     /** |  | ||||||
|      * 특정 캐릭터의 활성화된 배너 목록 조회 |  | ||||||
|      */ |  | ||||||
|     fun getActiveBannersByCharacterId(characterId: Long): List<ChatCharacterBanner> { |  | ||||||
|         return bannerRepository.findByChatCharacter_IdAndIsActiveTrue(characterId) |  | ||||||
|     } |  | ||||||
|  |  | ||||||
|     /** |  | ||||||
|      * 이름, 설명, MBTI, 태그로 캐릭터 검색 (배너 포함) |  | ||||||
|      */ |  | ||||||
|     fun searchBannersByCharacterAttributes(searchTerm: String, pageable: Pageable): Page<ChatCharacterBanner> { |  | ||||||
|         return bannerRepository.searchBannersByCharacterAttributes(searchTerm, pageable) |  | ||||||
|     } |  | ||||||
|  |  | ||||||
|     /** |     /** | ||||||
|      * 배너 등록 |      * 배너 등록 | ||||||
|      */ |      */ | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user