From bb3263dd68f5d01a3a4efda24ae463392165e531 Mon Sep 17 00:00:00 2001 From: Klaus Date: Tue, 24 Dec 2024 16:28:11 +0900 Subject: [PATCH] =?UTF-8?q?=EA=B4=80=EB=A6=AC=EC=9E=90=20=EC=98=A4?= =?UTF-8?q?=EB=94=94=EC=85=98=20=EC=83=81=EC=84=B8=20API?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../admin/audition/AdminAuditionController.kt | 6 +++++ .../admin/audition/AdminAuditionRepository.kt | 27 +++++++++++++++++++ .../admin/audition/AdminAuditionService.kt | 4 +++ .../audition/GetAuditionDetailResponse.kt | 18 +++++++++++++ 4 files changed, 55 insertions(+) create mode 100644 src/main/kotlin/kr/co/vividnext/sodalive/admin/audition/GetAuditionDetailResponse.kt diff --git a/src/main/kotlin/kr/co/vividnext/sodalive/admin/audition/AdminAuditionController.kt b/src/main/kotlin/kr/co/vividnext/sodalive/admin/audition/AdminAuditionController.kt index ab1e9ef..ebba99c 100644 --- a/src/main/kotlin/kr/co/vividnext/sodalive/admin/audition/AdminAuditionController.kt +++ b/src/main/kotlin/kr/co/vividnext/sodalive/admin/audition/AdminAuditionController.kt @@ -4,6 +4,7 @@ import kr.co.vividnext.sodalive.common.ApiResponse import org.springframework.data.domain.Pageable import org.springframework.security.access.prepost.PreAuthorize import org.springframework.web.bind.annotation.GetMapping +import org.springframework.web.bind.annotation.PathVariable import org.springframework.web.bind.annotation.PostMapping import org.springframework.web.bind.annotation.PutMapping import org.springframework.web.bind.annotation.RequestMapping @@ -34,4 +35,9 @@ class AdminAuditionController(private val service: AdminAuditionService) { limit = pageable.pageSize.toLong() ) ) + + @GetMapping("/{id}") + fun getAuditionDetail(@PathVariable id: Long) = ApiResponse.ok( + service.getAuditionDetail(auditionId = id) + ) } 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 f548802..6e0ad41 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,11 +1,13 @@ package kr.co.vividnext.sodalive.admin.audition +import com.querydsl.core.group.GroupBy.list import com.querydsl.core.types.dsl.DateTimePath import com.querydsl.core.types.dsl.Expressions 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 @@ -17,6 +19,7 @@ interface AdminAuditionRepository : JpaRepository, AdminAudition interface AdminAuditionQueryRepository { fun getAuditionList(offset: Long, limit: Long): List fun getAuditionListCount(): Int + fun getAuditionDetail(auditionId: Long): GetAuditionDetailResponse } class AdminAuditionQueryRepositoryImpl( @@ -54,6 +57,30 @@ class AdminAuditionQueryRepositoryImpl( .size } + override fun getAuditionDetail(auditionId: Long): GetAuditionDetailResponse { + return queryFactory + .select( + QGetAuditionDetailResponse( + audition.id, + audition.title, + audition.imagePath.prepend("/").prepend(coverImageHost), + audition.information, + audition.originalWorkUrl, + list( + QGetAuditionDetailRole( + auditionRole.id, + auditionRole.name, + auditionRole.imagePath.prepend("/").prepend(coverImageHost) + ) + ) + ) + ) + .from(audition) + .leftJoin(auditionRole).on(auditionRole.audition.id.eq(audition.id)) + .where(audition.id.eq(auditionId)) + .fetchFirst() + } + private fun getFormattedDate(dateTimePath: DateTimePath): StringTemplate { return Expressions.stringTemplate( "DATE_FORMAT({0}, {1})", 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 bfec948..5127a00 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 @@ -87,4 +87,8 @@ class AdminAuditionService( val items = repository.getAuditionList(offset = offset, limit = limit) return GetAuditionListResponse(totalCount, items) } + + fun getAuditionDetail(auditionId: Long): GetAuditionDetailResponse { + return repository.getAuditionDetail(auditionId = auditionId) + } } 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 new file mode 100644 index 0000000..803aca6 --- /dev/null +++ b/src/main/kotlin/kr/co/vividnext/sodalive/admin/audition/GetAuditionDetailResponse.kt @@ -0,0 +1,18 @@ +package kr.co.vividnext.sodalive.admin.audition + +import com.querydsl.core.annotations.QueryProjection + +data class GetAuditionDetailResponse @QueryProjection constructor( + val id: Long, + val title: String, + val imageUrl: String, + val information: String, + val originalWorkUrl: String, + val roleList: List = listOf() +) + +data class GetAuditionDetailRole @QueryProjection constructor( + val id: Long, + val name: String, + val imageUrl: String +)