Compare commits

..

No commits in common. "affbb3eba323f06effadbc7b8d018a4928fc6e22" and "bb41a81eb1cb4977087002b5ec99b9c8e012f23c" have entirely different histories.

15 changed files with 0 additions and 532 deletions

View File

@ -2,7 +2,6 @@ package kr.co.vividnext.sodalive.admin.audition.role
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
@ -13,7 +12,6 @@ import org.springframework.web.bind.annotation.RestController
import org.springframework.web.multipart.MultipartFile
@RestController
@PreAuthorize("hasRole('ADMIN')")
@RequestMapping("/admin/audition/role")
class AdminAuditionRoleController(private val service: AdminAuditionRoleService) {
@PostMapping

View File

@ -1,41 +0,0 @@
package kr.co.vividnext.sodalive.audition
import kr.co.vividnext.sodalive.common.ApiResponse
import kr.co.vividnext.sodalive.common.SodaException
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
@RestController
@RequestMapping("/audition")
class AuditionController(private val service: AuditionService) {
@GetMapping
fun getAuditionList(
@AuthenticationPrincipal(expression = "#this == 'anonymousUser' ? null : member") member: Member?,
pageable: Pageable
) = run {
if (member == null) throw SodaException("로그인 정보를 확인해주세요.")
ApiResponse.ok(
service.getAuditionList(
offset = pageable.offset,
limit = pageable.pageSize.toLong(),
isAdult = member.auth != null
)
)
}
@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

@ -1,94 +0,0 @@
package kr.co.vividnext.sodalive.audition
import com.querydsl.jpa.impl.JPAQueryFactory
import kr.co.vividnext.sodalive.audition.QAudition.audition
import org.springframework.beans.factory.annotation.Value
import org.springframework.data.jpa.repository.JpaRepository
interface AuditionRepository : JpaRepository<Audition, Long>, AuditionQueryRepository
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(
private val queryFactory: JPAQueryFactory,
@Value("\${cloud.aws.cloud-front.host}")
private val cloudFrontHost: String
) : AuditionQueryRepository {
override fun getInProgressAuditionCount(isAdult: Boolean): Int {
var where = audition.isActive.isTrue
.and(audition.status.eq(AuditionStatus.IN_PROGRESS))
if (!isAdult) {
where = where.and(audition.isAdult.isFalse)
}
return queryFactory
.select(audition.id)
.from(audition)
.where(where)
.fetch()
.size
}
override fun getCompletedAuditionCount(isAdult: Boolean): Int {
var where = audition.isActive.isTrue
.and(audition.status.eq(AuditionStatus.COMPLETED))
if (!isAdult) {
where = where.and(audition.isAdult.isFalse)
}
return queryFactory
.select(audition.id)
.from(audition)
.where(where)
.fetch()
.size
}
override fun getAuditionList(offset: Long, limit: Long, isAdult: Boolean): List<GetAuditionListItem> {
var where = audition.isActive.isTrue
.and(
audition.status.eq(AuditionStatus.COMPLETED)
.and(audition.status.eq(AuditionStatus.IN_PROGRESS))
)
if (!isAdult) {
where = where.and(audition.isAdult.isFalse)
}
return queryFactory
.select(
QGetAuditionListItem(
audition.id,
audition.title,
audition.imagePath.prepend("/").prepend(cloudFrontHost),
audition.status.eq(AuditionStatus.COMPLETED)
)
)
.from(audition)
.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,31 +0,0 @@
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,
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)
val items = repository.getAuditionList(offset = offset, limit = limit, isAdult = isAdult)
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

@ -1,25 +0,0 @@
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

@ -1,16 +0,0 @@
package kr.co.vividnext.sodalive.audition
import com.querydsl.core.annotations.QueryProjection
data class GetAuditionListResponse(
val inProgressCount: Int,
val completedCount: Int,
val items: List<GetAuditionListItem>
)
data class GetAuditionListItem @QueryProjection constructor(
val id: Long,
val title: String,
val imageUrl: String,
val isOff: Boolean
)

View File

@ -1,34 +0,0 @@
package kr.co.vividnext.sodalive.audition.applicant
import kr.co.vividnext.sodalive.common.ApiResponse
import kr.co.vividnext.sodalive.common.SodaException
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.RequestMapping
import org.springframework.web.bind.annotation.RequestParam
import org.springframework.web.bind.annotation.RestController
@RestController
@RequestMapping("/audition/applicant")
class AuditionApplicantController(private val service: AuditionApplicantService) {
@GetMapping
fun getAuditionApplicantList(
@RequestParam auditionRoleId: Long,
@RequestParam sortType: AuditionApplicantSortType,
@AuthenticationPrincipal(expression = "#this == 'anonymousUser' ? null : member") member: Member?,
pageable: Pageable
) = run {
if (member == null) throw SodaException("로그인 정보를 확인해주세요.")
ApiResponse.ok(
service.getAuditionApplicantList(
auditionRoleId = auditionRoleId,
sortType = sortType,
offset = pageable.offset,
limit = pageable.pageSize.toLong()
)
)
}
}

View File

@ -1,93 +0,0 @@
package kr.co.vividnext.sodalive.audition.applicant
import com.querydsl.jpa.impl.JPAQueryFactory
import kr.co.vividnext.sodalive.audition.AuditionApplicant
import kr.co.vividnext.sodalive.audition.QAuditionApplicant.auditionApplicant
import kr.co.vividnext.sodalive.audition.QAuditionRole.auditionRole
import kr.co.vividnext.sodalive.audition.QAuditionVote.auditionVote
import kr.co.vividnext.sodalive.member.QMember.member
import org.springframework.beans.factory.annotation.Value
import org.springframework.data.jpa.repository.JpaRepository
interface AuditionApplicantRepository : JpaRepository<AuditionApplicant, Long>, AuditionApplicantQueryRepository
interface AuditionApplicantQueryRepository {
fun isAlreadyApplicant(auditionRoleId: Long, memberId: Long): Boolean
fun getAuditionApplicantTotalCount(auditionRoleId: Long): Int
fun getAuditionApplicantList(
auditionRoleId: Long,
sortType: AuditionApplicantSortType,
offset: Long,
limit: Long
): List<GetAuditionRoleApplicantItem>
}
class AuditionApplicantQueryRepositoryImpl(
private val queryFactory: JPAQueryFactory,
@Value("\${cloud.aws.cloud-front.host}")
private val cloudFrontHost: String
) : AuditionApplicantQueryRepository {
override fun isAlreadyApplicant(auditionRoleId: Long, memberId: Long): Boolean {
return queryFactory
.select(auditionApplicant.id)
.from(auditionApplicant)
.innerJoin(auditionApplicant.role, auditionRole)
.innerJoin(auditionApplicant.member, member)
.where(
auditionRole.id.eq(auditionRoleId),
member.id.eq(memberId),
auditionApplicant.isActive.isTrue
)
.fetch()
.size > 0
}
override fun getAuditionApplicantTotalCount(auditionRoleId: Long): Int {
return queryFactory
.select(auditionApplicant.id)
.from(auditionApplicant)
.innerJoin(auditionApplicant.role, auditionRole)
.where(
auditionRole.id.eq(auditionRoleId),
auditionRole.isActive.isTrue
)
.fetch()
.size
}
override fun getAuditionApplicantList(
auditionRoleId: Long,
sortType: AuditionApplicantSortType,
offset: Long,
limit: Long
): List<GetAuditionRoleApplicantItem> {
val orderBy = if (sortType == AuditionApplicantSortType.LIKES) {
auditionVote.id.count().desc()
} else {
auditionApplicant.id.desc()
}
return queryFactory
.select(
QGetAuditionRoleApplicantItem(
auditionApplicant.id,
member.nickname,
member.profileImage.prepend("/").prepend(cloudFrontHost),
auditionApplicant.voicePath.prepend("/").prepend(cloudFrontHost),
auditionVote.id.count()
)
)
.from(auditionApplicant)
.innerJoin(auditionApplicant.member, member)
.innerJoin(auditionApplicant.role, auditionRole)
.leftJoin(auditionVote).on(auditionApplicant.id.eq(auditionVote.applicant.id))
.where(
auditionRole.id.eq(auditionRoleId),
auditionRole.isActive.isTrue
)
.groupBy(auditionApplicant.id)
.orderBy(orderBy)
.fetch()
}
}

View File

@ -1,26 +0,0 @@
package kr.co.vividnext.sodalive.audition.applicant
import org.springframework.stereotype.Service
@Service
class AuditionApplicantService(private val repository: AuditionApplicantRepository) {
fun getAuditionApplicantList(
auditionRoleId: Long,
sortType: AuditionApplicantSortType,
offset: Long,
limit: Long
): GetAuditionApplicantListResponse {
val totalCount = repository.getAuditionApplicantTotalCount(auditionRoleId = auditionRoleId)
val items = repository.getAuditionApplicantList(
auditionRoleId = auditionRoleId,
sortType = sortType,
offset = offset,
limit = limit
)
return GetAuditionApplicantListResponse(
totalCount = totalCount,
items = items
)
}
}

View File

@ -1,5 +0,0 @@
package kr.co.vividnext.sodalive.audition.applicant
enum class AuditionApplicantSortType {
NEWEST, LIKES
}

View File

@ -1,16 +0,0 @@
package kr.co.vividnext.sodalive.audition.applicant
import com.querydsl.core.annotations.QueryProjection
data class GetAuditionApplicantListResponse(
val totalCount: Int,
val items: List<GetAuditionRoleApplicantItem>
)
data class GetAuditionRoleApplicantItem @QueryProjection constructor(
val applicantId: Long,
val nickname: String,
val profileImageUrl: String,
val voiceUrl: String,
val voteCount: Long
)

View File

@ -1,29 +0,0 @@
package kr.co.vividnext.sodalive.audition.role
import kr.co.vividnext.sodalive.common.ApiResponse
import kr.co.vividnext.sodalive.common.SodaException
import kr.co.vividnext.sodalive.member.Member
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
@RestController
@RequestMapping("/audition/role")
class AuditionRoleController(private val service: AuditionRoleService) {
@GetMapping("/{id}")
fun getAuditionRoleDetail(
@PathVariable id: Long,
@AuthenticationPrincipal(expression = "#this == 'anonymousUser' ? null : member") member: Member?
) = run {
if (member == null) throw SodaException("로그인 정보를 확인해주세요.")
ApiResponse.ok(
service.getAuditionRoleDetail(
auditionRoleId = id,
memberId = member.id!!
)
)
}
}

View File

@ -1,65 +0,0 @@
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>
fun getAuditionRoleDetail(auditionRoleId: Long): GetAuditionRoleDetailData?
}
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()
}
override fun getAuditionRoleDetail(auditionRoleId: Long): GetAuditionRoleDetailData? {
return queryFactory
.select(
QGetAuditionRoleDetailData(
auditionRole.id,
auditionRole.name,
auditionRole.imagePath.prepend("/").prepend(cloudfrontHost),
auditionRole.information,
audition.originalWorkUrl,
auditionRole.auditionScriptUrl
)
)
.from(auditionRole)
.innerJoin(auditionRole.audition, audition)
.where(
auditionRole.id.eq(auditionRoleId),
auditionRole.isActive.isTrue
)
.fetchFirst()
}
}

View File

@ -1,23 +0,0 @@
package kr.co.vividnext.sodalive.audition.role
import kr.co.vividnext.sodalive.audition.applicant.AuditionApplicantRepository
import kr.co.vividnext.sodalive.common.SodaException
import org.springframework.stereotype.Service
@Service
class AuditionRoleService(
private val repository: AuditionRoleRepository,
private val applicantRepository: AuditionApplicantRepository
) {
fun getAuditionRoleDetail(auditionRoleId: Long, memberId: Long): GetAuditionRoleDetailResponse {
val roleDetailData = repository.getAuditionRoleDetail(auditionRoleId = auditionRoleId)
?: throw SodaException("잘못된 요청입니다.\n다시 시도해 주세요.")
val isAlreadyApplicant = applicantRepository.isAlreadyApplicant(
auditionRoleId = auditionRoleId,
memberId = memberId
)
return roleDetailData.toDetailResponse(isAlreadyApplicant = isAlreadyApplicant)
}
}

View File

@ -1,32 +0,0 @@
package kr.co.vividnext.sodalive.audition.role
import com.querydsl.core.annotations.QueryProjection
data class GetAuditionRoleDetailResponse(
val auditionRoleId: Long,
val name: String,
val imageUrl: String,
val information: String,
val originalWorkUrl: String,
val auditionScriptUrl: String,
val isAlreadyApplicant: Boolean = false
)
data class GetAuditionRoleDetailData @QueryProjection constructor(
val auditionRoleId: Long,
val name: String,
val imageUrl: String,
val information: String,
val originalWorkUrl: String,
val auditionScriptUrl: String
) {
fun toDetailResponse(isAlreadyApplicant: Boolean) = GetAuditionRoleDetailResponse(
auditionRoleId = auditionRoleId,
name = name,
imageUrl = imageUrl,
information = information,
originalWorkUrl = originalWorkUrl,
auditionScriptUrl = auditionScriptUrl,
isAlreadyApplicant = isAlreadyApplicant
)
}