앱 - 오디션 상세 API

This commit is contained in:
Klaus 2024-12-30 23:42:25 +09:00
parent b56b2e15af
commit ddd552deb4
5 changed files with 113 additions and 1 deletions

View File

@ -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))
}
}

View File

@ -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<GetAuditionListItem>
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()
}
}

View File

@ -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
)
}
}

View File

@ -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<GetAuditionRoleListData>
)
data class GetAuditionRoleListData @QueryProjection constructor(
val roleId: Long,
val name: String,
val imageUrl: String,
val isComplete: Boolean
)

View File

@ -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<AuditionRole, Long>, AuditionRoleQueryRepository
interface AuditionRoleQueryRepository {
fun getAuditionRoleListByAuditionId(auditionId: Long): List<GetAuditionRoleListData>
}
class AuditionRoleQueryRepositoryImpl(
private val queryFactory: JPAQueryFactory,
@Value("\${cloud.aws.cloud-front.host}")
private val cloudfrontHost: String
) : AuditionRoleQueryRepository {
override fun getAuditionRoleListByAuditionId(auditionId: Long): List<GetAuditionRoleListData> {
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()
}
}