캐릭터 챗봇 #338

Merged
klaus merged 119 commits from test into main 2025-09-10 06:08:47 +00:00
4 changed files with 33 additions and 4 deletions
Showing only changes of commit 2f55303d16 - Show all commits

View File

@ -29,7 +29,8 @@ data class CharacterCurationListItemResponse(
val id: Long, val id: Long,
val title: String, val title: String,
val isAdult: Boolean, val isAdult: Boolean,
val isActive: Boolean val isActive: Boolean,
val characterCount: Int
) )
// 관리자 큐레이션 상세 - 캐릭터 리스트 항목 응답 DTO // 관리자 큐레이션 상세 - 캐릭터 리스트 항목 응답 DTO

View File

@ -125,8 +125,22 @@ class CharacterCurationAdminService(
@Transactional(readOnly = true) @Transactional(readOnly = true)
fun listAll(): List<CharacterCurationListItemResponse> { fun listAll(): List<CharacterCurationListItemResponse> {
return curationRepository.findAllByOrderBySortOrderAsc() val curations = curationRepository.findByIsActiveTrueOrderBySortOrderAsc()
.map { CharacterCurationListItemResponse(it.id!!, it.title, it.isAdult, it.isActive) } if (curations.isEmpty()) return emptyList()
// DB 집계로 활성 캐릭터 수 카운트
val counts = mappingRepository.countActiveCharactersByCurations(curations)
val countByCurationId: Map<Long, Int> = counts.associate { it.curationId to it.count.toInt() }
return curations.map { curation ->
CharacterCurationListItemResponse(
id = curation.id!!,
title = curation.title,
isAdult = curation.isAdult,
isActive = curation.isActive,
characterCount = countByCurationId[curation.id!!] ?: 0
)
}
} }
@Transactional(readOnly = true) @Transactional(readOnly = true)

View File

@ -30,4 +30,19 @@ interface CharacterCurationMappingRepository : JpaRepository<CharacterCurationMa
fun findByCurationWithCharacterOrderBySortOrderAsc( fun findByCurationWithCharacterOrderBySortOrderAsc(
@Param("curation") curation: CharacterCuration @Param("curation") curation: CharacterCuration
): List<CharacterCurationMapping> ): List<CharacterCurationMapping>
interface CharacterCountPerCuration {
val curationId: Long
val count: Long
}
@Query(
"select m.curation.id as curationId, count(m.id) as count " +
"from CharacterCurationMapping m join m.chatCharacter ch " +
"where m.curation in :curations and ch.isActive = true " +
"group by m.curation.id"
)
fun countActiveCharactersByCurations(
@Param("curations") curations: List<CharacterCuration>
): List<CharacterCountPerCuration>
} }

View File

@ -8,7 +8,6 @@ import org.springframework.stereotype.Repository
@Repository @Repository
interface CharacterCurationRepository : JpaRepository<CharacterCuration, Long> { interface CharacterCurationRepository : JpaRepository<CharacterCuration, Long> {
fun findByIsActiveTrueOrderBySortOrderAsc(): List<CharacterCuration> fun findByIsActiveTrueOrderBySortOrderAsc(): List<CharacterCuration>
fun findAllByOrderBySortOrderAsc(): List<CharacterCuration>
@Query("SELECT MAX(c.sortOrder) FROM CharacterCuration c WHERE c.isActive = true") @Query("SELECT MAX(c.sortOrder) FROM CharacterCuration c WHERE c.isActive = true")
fun findMaxSortOrder(): Int? fun findMaxSortOrder(): Int?