diff --git a/src/main/kotlin/kr/co/vividnext/sodalive/audition/AuditionController.kt b/src/main/kotlin/kr/co/vividnext/sodalive/audition/AuditionController.kt index ee3e7e4..ce4593c 100644 --- a/src/main/kotlin/kr/co/vividnext/sodalive/audition/AuditionController.kt +++ b/src/main/kotlin/kr/co/vividnext/sodalive/audition/AuditionController.kt @@ -6,6 +6,7 @@ import kr.co.vividnext.sodalive.member.Member import org.springframework.data.domain.Pageable import org.springframework.security.core.annotation.AuthenticationPrincipal import org.springframework.web.bind.annotation.GetMapping +import org.springframework.web.bind.annotation.PathVariable import org.springframework.web.bind.annotation.RequestMapping import org.springframework.web.bind.annotation.RestController @@ -27,4 +28,14 @@ class AuditionController(private val service: AuditionService) { ) ) } + + @GetMapping("/{id}") + fun getAuditionDetail( + @PathVariable id: Long, + @AuthenticationPrincipal(expression = "#this == 'anonymousUser' ? null : member") member: Member? + ) = run { + if (member == null) throw SodaException("로그인 정보를 확인해주세요.") + + ApiResponse.ok(service.getAuditionDetail(auditionId = id)) + } } diff --git a/src/main/kotlin/kr/co/vividnext/sodalive/audition/AuditionRepository.kt b/src/main/kotlin/kr/co/vividnext/sodalive/audition/AuditionRepository.kt index 9fa812d..8bb8360 100644 --- a/src/main/kotlin/kr/co/vividnext/sodalive/audition/AuditionRepository.kt +++ b/src/main/kotlin/kr/co/vividnext/sodalive/audition/AuditionRepository.kt @@ -11,6 +11,7 @@ interface AuditionQueryRepository { fun getInProgressAuditionCount(isAdult: Boolean): Int fun getCompletedAuditionCount(isAdult: Boolean): Int fun getAuditionList(offset: Long, limit: Long, isAdult: Boolean): List + fun getAuditionDetail(auditionId: Long): GetAuditionDetailRawData } class AuditionQueryRepositoryImpl( @@ -75,4 +76,19 @@ class AuditionQueryRepositoryImpl( .where(where) .fetch() } + + override fun getAuditionDetail(auditionId: Long): GetAuditionDetailRawData { + return queryFactory + .select( + QGetAuditionDetailRawData( + audition.id, + audition.title, + audition.imagePath.prepend("/").prepend(cloudFrontHost), + audition.information + ) + ) + .from(audition) + .where(audition.id.eq(auditionId)) + .fetchFirst() + } } diff --git a/src/main/kotlin/kr/co/vividnext/sodalive/audition/AuditionService.kt b/src/main/kotlin/kr/co/vividnext/sodalive/audition/AuditionService.kt index cde6ad5..2f6286c 100644 --- a/src/main/kotlin/kr/co/vividnext/sodalive/audition/AuditionService.kt +++ b/src/main/kotlin/kr/co/vividnext/sodalive/audition/AuditionService.kt @@ -1,9 +1,13 @@ package kr.co.vividnext.sodalive.audition +import kr.co.vividnext.sodalive.audition.role.AuditionRoleRepository import org.springframework.stereotype.Service @Service -class AuditionService(private val repository: AuditionRepository) { +class AuditionService( + private val repository: AuditionRepository, + private val roleRepository: AuditionRoleRepository +) { fun getAuditionList(offset: Long, limit: Long, isAdult: Boolean): GetAuditionListResponse { val inProgressCount = repository.getInProgressAuditionCount(isAdult = isAdult) val completedCount = repository.getCompletedAuditionCount(isAdult = isAdult) @@ -11,4 +15,17 @@ class AuditionService(private val repository: AuditionRepository) { return GetAuditionListResponse(inProgressCount, completedCount, items) } + + fun getAuditionDetail(auditionId: Long): GetAuditionDetailResponse { + val auditionDetail = repository.getAuditionDetail(auditionId = auditionId) + val roleList = roleRepository.getAuditionRoleListByAuditionId(auditionId = auditionId) + + return GetAuditionDetailResponse( + auditionId = auditionId, + title = auditionDetail.title, + imageUrl = auditionDetail.imageUrl, + information = auditionDetail.information, + roleList = roleList + ) + } } diff --git a/src/main/kotlin/kr/co/vividnext/sodalive/audition/GetAuditionDetailResponse.kt b/src/main/kotlin/kr/co/vividnext/sodalive/audition/GetAuditionDetailResponse.kt new file mode 100644 index 0000000..4a99d8c --- /dev/null +++ b/src/main/kotlin/kr/co/vividnext/sodalive/audition/GetAuditionDetailResponse.kt @@ -0,0 +1,25 @@ +package kr.co.vividnext.sodalive.audition + +import com.querydsl.core.annotations.QueryProjection + +data class GetAuditionDetailRawData @QueryProjection constructor( + val auditionId: Long, + val title: String, + val imageUrl: String, + val information: String +) + +data class GetAuditionDetailResponse( + val auditionId: Long, + val title: String, + val imageUrl: String, + val information: String, + val roleList: List +) + +data class GetAuditionRoleListData @QueryProjection constructor( + val roleId: Long, + val name: String, + val imageUrl: String, + val isComplete: Boolean +) diff --git a/src/main/kotlin/kr/co/vividnext/sodalive/audition/role/AuditionRoleRepository.kt b/src/main/kotlin/kr/co/vividnext/sodalive/audition/role/AuditionRoleRepository.kt new file mode 100644 index 0000000..b46f4df --- /dev/null +++ b/src/main/kotlin/kr/co/vividnext/sodalive/audition/role/AuditionRoleRepository.kt @@ -0,0 +1,43 @@ +package kr.co.vividnext.sodalive.audition.role + +import com.querydsl.jpa.impl.JPAQueryFactory +import kr.co.vividnext.sodalive.audition.AuditionRole +import kr.co.vividnext.sodalive.audition.AuditionStatus +import kr.co.vividnext.sodalive.audition.GetAuditionRoleListData +import kr.co.vividnext.sodalive.audition.QAudition.audition +import kr.co.vividnext.sodalive.audition.QAuditionRole.auditionRole +import kr.co.vividnext.sodalive.audition.QGetAuditionRoleListData +import org.springframework.beans.factory.annotation.Value +import org.springframework.data.jpa.repository.JpaRepository + +interface AuditionRoleRepository : JpaRepository, AuditionRoleQueryRepository + +interface AuditionRoleQueryRepository { + fun getAuditionRoleListByAuditionId(auditionId: Long): List +} + +class AuditionRoleQueryRepositoryImpl( + private val queryFactory: JPAQueryFactory, + + @Value("\${cloud.aws.cloud-front.host}") + private val cloudfrontHost: String +) : AuditionRoleQueryRepository { + override fun getAuditionRoleListByAuditionId(auditionId: Long): List { + return queryFactory + .select( + QGetAuditionRoleListData( + auditionRole.id, + auditionRole.name, + auditionRole.imagePath.prepend("/").prepend(cloudfrontHost), + auditionRole.status.eq(AuditionStatus.COMPLETED) + ) + ) + .from(auditionRole) + .innerJoin(auditionRole.audition, audition) + .where( + audition.id.eq(auditionId), + auditionRole.isActive.isTrue + ) + .fetch() + } +}