From c9e90974bdcc58398f776318f957d18cf493b0e6 Mon Sep 17 00:00:00 2001
From: Klaus <klaus@vividnext.co.kr>
Date: Fri, 27 Dec 2024 23:19:21 +0900
Subject: [PATCH] =?UTF-8?q?=EC=98=A4=EB=94=94=EC=85=98=20=EC=83=81?=
 =?UTF-8?q?=EC=84=B8=20-=20=EC=98=A4=EB=94=94=EC=85=98=20=EB=8D=B0?=
 =?UTF-8?q?=EC=9D=B4=ED=84=B0=EC=99=80=20=EC=98=A4=EB=94=94=EC=85=98=20?=
 =?UTF-8?q?=EB=B0=B0=EC=97=AD=20=EB=A6=AC=EC=8A=A4=ED=8A=B8=20=EB=8D=B0?=
 =?UTF-8?q?=EC=9D=B4=ED=84=B0=20=ED=98=B8=EC=B6=9C=EC=9D=84=20=EB=B6=84?=
 =?UTF-8?q?=EB=A6=AC?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 .../admin/audition/AdminAuditionRepository.kt | 26 +++----------------
 .../admin/audition/AdminAuditionService.kt    | 14 +++++++++-
 .../audition/GetAuditionDetailResponse.kt     | 14 +++++++---
 .../role/AdminAuditionRoleRepository.kt       | 20 ++++++++++++++
 4 files changed, 48 insertions(+), 26 deletions(-)

diff --git a/src/main/kotlin/kr/co/vividnext/sodalive/admin/audition/AdminAuditionRepository.kt b/src/main/kotlin/kr/co/vividnext/sodalive/admin/audition/AdminAuditionRepository.kt
index 7bf3b17..a457e59 100644
--- a/src/main/kotlin/kr/co/vividnext/sodalive/admin/audition/AdminAuditionRepository.kt
+++ b/src/main/kotlin/kr/co/vividnext/sodalive/admin/audition/AdminAuditionRepository.kt
@@ -1,6 +1,5 @@
 package kr.co.vividnext.sodalive.admin.audition
 
-import com.querydsl.core.group.GroupBy.list
 import com.querydsl.core.types.dsl.CaseBuilder
 import com.querydsl.core.types.dsl.DateTimePath
 import com.querydsl.core.types.dsl.Expressions
@@ -8,7 +7,6 @@ import com.querydsl.core.types.dsl.StringTemplate
 import com.querydsl.jpa.impl.JPAQueryFactory
 import kr.co.vividnext.sodalive.audition.Audition
 import kr.co.vividnext.sodalive.audition.QAudition.audition
-import kr.co.vividnext.sodalive.audition.QAuditionRole.auditionRole
 import org.springframework.beans.factory.annotation.Value
 import org.springframework.data.jpa.repository.JpaRepository
 import org.springframework.stereotype.Repository
@@ -20,7 +18,7 @@ interface AdminAuditionRepository : JpaRepository<Audition, Long>, AdminAudition
 interface AdminAuditionQueryRepository {
     fun getAuditionList(offset: Long, limit: Long): List<GetAuditionListItem>
     fun getAuditionListCount(): Int
-    fun getAuditionDetail(auditionId: Long): GetAuditionDetailResponse
+    fun getAuditionDetail(auditionId: Long): GetAuditionDetailRawData
 }
 
 class AdminAuditionQueryRepositoryImpl(
@@ -62,35 +60,19 @@ class AdminAuditionQueryRepositoryImpl(
             .size
     }
 
-    override fun getAuditionDetail(auditionId: Long): GetAuditionDetailResponse {
+    override fun getAuditionDetail(auditionId: Long): GetAuditionDetailRawData {
         return queryFactory
             .select(
-                QGetAuditionDetailResponse(
+                QGetAuditionDetailRawData(
                     audition.id,
                     audition.title,
                     audition.imagePath.prepend("/").prepend(coverImageHost),
                     audition.information,
-                    audition.originalWorkUrl.coalesce(""),
-                    list(
-                        QGetAuditionDetailRole(
-                            auditionRole.id,
-                            auditionRole.name,
-                            auditionRole.imagePath.prepend("/").prepend(coverImageHost),
-                            auditionRole.status
-                        )
-                    )
+                    audition.originalWorkUrl.coalesce("")
                 )
             )
             .from(audition)
-            .leftJoin(auditionRole).on(auditionRole.audition.id.eq(audition.id))
             .where(audition.id.eq(auditionId))
-            .groupBy(
-                audition.id,
-                audition.title,
-                audition.imagePath,
-                audition.information,
-                audition.originalWorkUrl
-            )
             .fetchFirst()
     }
 
diff --git a/src/main/kotlin/kr/co/vividnext/sodalive/admin/audition/AdminAuditionService.kt b/src/main/kotlin/kr/co/vividnext/sodalive/admin/audition/AdminAuditionService.kt
index 6358a23..774b5b8 100644
--- a/src/main/kotlin/kr/co/vividnext/sodalive/admin/audition/AdminAuditionService.kt
+++ b/src/main/kotlin/kr/co/vividnext/sodalive/admin/audition/AdminAuditionService.kt
@@ -1,6 +1,7 @@
 package kr.co.vividnext.sodalive.admin.audition
 
 import com.fasterxml.jackson.databind.ObjectMapper
+import kr.co.vividnext.sodalive.admin.audition.role.AdminAuditionRoleRepository
 import kr.co.vividnext.sodalive.audition.AuditionStatus
 import kr.co.vividnext.sodalive.aws.s3.S3Uploader
 import kr.co.vividnext.sodalive.common.SodaException
@@ -19,6 +20,7 @@ class AdminAuditionService(
     private val s3Uploader: S3Uploader,
     private val objectMapper: ObjectMapper,
     private val repository: AdminAuditionRepository,
+    private val roleRepository: AdminAuditionRoleRepository,
 
     @Value("\${cloud.aws.s3.bucket}")
     private val bucket: String
@@ -101,6 +103,16 @@ class AdminAuditionService(
     }
 
     fun getAuditionDetail(auditionId: Long): GetAuditionDetailResponse {
-        return repository.getAuditionDetail(auditionId = auditionId)
+        val auditionDetail = repository.getAuditionDetail(auditionId = auditionId)
+        val roleList = roleRepository.getAuditionRoleListByAuditionId(auditionId = auditionId)
+
+        return GetAuditionDetailResponse(
+            id = auditionDetail.id,
+            title = auditionDetail.title,
+            imageUrl = auditionDetail.imageUrl,
+            information = auditionDetail.information,
+            originalWorkUrl = auditionDetail.originalWorkUrl,
+            roleList = roleList
+        )
     }
 }
diff --git a/src/main/kotlin/kr/co/vividnext/sodalive/admin/audition/GetAuditionDetailResponse.kt b/src/main/kotlin/kr/co/vividnext/sodalive/admin/audition/GetAuditionDetailResponse.kt
index 9ac5a2b..0071dd2 100644
--- a/src/main/kotlin/kr/co/vividnext/sodalive/admin/audition/GetAuditionDetailResponse.kt
+++ b/src/main/kotlin/kr/co/vividnext/sodalive/admin/audition/GetAuditionDetailResponse.kt
@@ -3,16 +3,24 @@ package kr.co.vividnext.sodalive.admin.audition
 import com.querydsl.core.annotations.QueryProjection
 import kr.co.vividnext.sodalive.audition.AuditionStatus
 
-data class GetAuditionDetailResponse @QueryProjection constructor(
+data class GetAuditionDetailRawData @QueryProjection constructor(
+    val id: Long,
+    val title: String,
+    val imageUrl: String,
+    val information: String,
+    val originalWorkUrl: String
+)
+
+data class GetAuditionDetailResponse(
     val id: Long,
     val title: String,
     val imageUrl: String,
     val information: String,
     val originalWorkUrl: String,
-    val roleList: List<GetAuditionDetailRole> = emptyList()
+    val roleList: List<GetAuditionRoleListData>
 )
 
-data class GetAuditionDetailRole @QueryProjection constructor(
+data class GetAuditionRoleListData @QueryProjection constructor(
     val id: Long,
     val name: String,
     val imageUrl: String,
diff --git a/src/main/kotlin/kr/co/vividnext/sodalive/admin/audition/role/AdminAuditionRoleRepository.kt b/src/main/kotlin/kr/co/vividnext/sodalive/admin/audition/role/AdminAuditionRoleRepository.kt
index c4fdbac..0c71c7f 100644
--- a/src/main/kotlin/kr/co/vividnext/sodalive/admin/audition/role/AdminAuditionRoleRepository.kt
+++ b/src/main/kotlin/kr/co/vividnext/sodalive/admin/audition/role/AdminAuditionRoleRepository.kt
@@ -1,7 +1,10 @@
 package kr.co.vividnext.sodalive.admin.audition.role
 
 import com.querydsl.jpa.impl.JPAQueryFactory
+import kr.co.vividnext.sodalive.admin.audition.GetAuditionRoleListData
+import kr.co.vividnext.sodalive.admin.audition.QGetAuditionRoleListData
 import kr.co.vividnext.sodalive.audition.AuditionRole
+import kr.co.vividnext.sodalive.audition.QAudition.audition
 import kr.co.vividnext.sodalive.audition.QAuditionApplicant.auditionApplicant
 import kr.co.vividnext.sodalive.audition.QAuditionRole.auditionRole
 import kr.co.vividnext.sodalive.audition.QAuditionVote.auditionVote
@@ -12,6 +15,7 @@ import org.springframework.data.jpa.repository.JpaRepository
 interface AdminAuditionRoleRepository : JpaRepository<AuditionRole, Long>, AdminAuditionRoleQueryRepository
 
 interface AdminAuditionRoleQueryRepository {
+    fun getAuditionRoleListByAuditionId(auditionId: Long): List<GetAuditionRoleListData>
     fun getAuditionRoleDetail(auditionRoleId: Long): GetAuditionRoleDetailResponse
     fun getAuditionApplicantList(auditionRoleId: Long, offset: Long, limit: Long): List<GetAuditionRoleApplicantItem>
     fun getAuditionApplicantTotalCount(auditionRoleId: Long): Int
@@ -23,6 +27,22 @@ class AdminAuditionRoleQueryRepositoryImpl(
     @Value("\${cloud.aws.cloud-front.host}")
     private val cloudfrontHost: String
 ) : AdminAuditionRoleQueryRepository {
+    override fun getAuditionRoleListByAuditionId(auditionId: Long): List<GetAuditionRoleListData> {
+        return queryFactory
+            .select(
+                QGetAuditionRoleListData(
+                    auditionRole.id,
+                    auditionRole.name,
+                    auditionRole.imagePath.prepend("/").prepend(cloudfrontHost),
+                    auditionRole.status
+                )
+            )
+            .from(auditionRole)
+            .innerJoin(auditionRole.audition, audition)
+            .where(auditionRole.audition.id.eq(auditionId))
+            .fetch()
+    }
+
     override fun getAuditionRoleDetail(auditionRoleId: Long): GetAuditionRoleDetailResponse {
         return queryFactory
             .select(