feat(admin-curation): 리스트 정합성 개선 및 활성 캐릭터 수 DB 집계 적용
- 비활성(삭제) 큐레이션을 목록에서 제외: findByIsActiveTrueOrderBySortOrderAsc 사용 - 리스트 항목에 characterCount 추가 및 DB GROUP BY + COUNT로 직접 집계 - CharacterCurationMappingRepository: 집계용 프로젝션(CharacterCountPerCuration)과 countActiveCharactersByCurations 쿼리 추가 - CharacterCurationAdminService: listAll에서 집계 결과를 활용해 characterCount 매핑 (대량 엔티티 로딩 제거) - CharacterCurationRepository: findMaxSortOrder 쿼리로 신규 등록 정렬 순서 계산에 활용 - 컨트롤러: 캐릭터 리스트 응답 DTO(CharacterCurationCharacterItemResponse) 사용, 이미지 URL은 CloudFront host + imagePath로 조립
This commit is contained in:
parent
3a9128a894
commit
2f55303d16
|
@ -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
|
||||||
|
|
|
@ -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)
|
||||||
|
|
|
@ -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>
|
||||||
}
|
}
|
||||||
|
|
|
@ -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?
|
||||||
|
|
Loading…
Reference in New Issue