관리자 오디션 상세 API

This commit is contained in:
Klaus 2024-12-24 16:28:11 +09:00
parent e29e71b8bd
commit bb3263dd68
4 changed files with 55 additions and 0 deletions

View File

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

View File

@ -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<Audition, Long>, AdminAudition
interface AdminAuditionQueryRepository {
fun getAuditionList(offset: Long, limit: Long): List<GetAuditionListItem>
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<LocalDateTime>): StringTemplate {
return Expressions.stringTemplate(
"DATE_FORMAT({0}, {1})",

View File

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

View File

@ -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<GetAuditionDetailRole> = listOf()
)
data class GetAuditionDetailRole @QueryProjection constructor(
val id: Long,
val name: String,
val imageUrl: String
)