콘텐츠 메인 - API 분리

This commit is contained in:
Klaus 2023-10-22 19:50:59 +09:00
parent f45c6c7938
commit 9a7e76ea7a
3 changed files with 230 additions and 4 deletions

View File

@ -78,6 +78,9 @@ interface AudioContentQueryRepository {
fun getAudioContentMainBannerList(isAdult: Boolean): List<AudioContentBanner>
fun getAudioContentCurations(isAdult: Boolean): List<AudioContentCuration>
fun getAudioContentCurationList(isAdult: Boolean, offset: Long = 0, limit: Long = 10): List<AudioContentCuration>
fun findAudioContentByCurationId(
curationId: Long,
cloudfrontHost: String,
@ -337,10 +340,6 @@ class AudioContentQueryRepositoryImpl(private val queryFactory: JPAQueryFactory)
.fetch()
}
@Cacheable(
value = ["getNewContentUploadCreatorList"],
cacheManager = "cacheManager"
)
override fun getNewContentUploadCreatorList(
cloudfrontHost: String,
isAdult: Boolean
@ -410,6 +409,26 @@ class AudioContentQueryRepositoryImpl(private val queryFactory: JPAQueryFactory)
.fetch()
}
override fun getAudioContentCurationList(
isAdult: Boolean,
offset: Long,
limit: Long
): List<AudioContentCuration> {
var where = audioContentCuration.isActive.isTrue
if (!isAdult) {
where = where.and(audioContentCuration.isAdult.isFalse)
}
return queryFactory
.selectFrom(audioContentCuration)
.where(where)
.orderBy(audioContentCuration.orders.asc())
.offset(offset)
.limit(limit)
.fetch()
}
override fun findAudioContentByCurationId(
curationId: Long,
cloudfrontHost: String,

View File

@ -23,6 +23,33 @@ class AudioContentMainController(private val service: AudioContentMainService) {
ApiResponse.ok(service.getMain(member = member))
}
@GetMapping("/new-content-upload-creator")
fun getNewContentUploadCreatorList(
@AuthenticationPrincipal(expression = "#this == 'anonymousUser' ? null : member") member: Member?
) = run {
if (member == null) throw SodaException("로그인 정보를 확인해주세요.")
ApiResponse.ok(service.getNewContentUploadCreatorList(member = member))
}
@GetMapping("/banner-list")
fun getAudioContentMainBannerList(
@AuthenticationPrincipal(expression = "#this == 'anonymousUser' ? null : member") member: Member?
) = run {
if (member == null) throw SodaException("로그인 정보를 확인해주세요.")
ApiResponse.ok(service.getAudioContentMainBannerList(member = member))
}
@GetMapping("/order-list")
fun getAudioContentMainOrderList(
@AuthenticationPrincipal(expression = "#this == 'anonymousUser' ? null : member") member: Member?
) = run {
if (member == null) throw SodaException("로그인 정보를 확인해주세요.")
ApiResponse.ok(service.getAudioContentMainOrderList(member = member))
}
@GetMapping("/new")
fun getNewContentByTheme(
@RequestParam("theme") theme: String,
@ -53,4 +80,29 @@ class AudioContentMainController(private val service: AudioContentMainService) {
ApiResponse.ok(service.getNewContentFor2WeeksByTheme(theme, member, pageable))
}
@GetMapping("/curation-list")
fun getAudioContentMainCurationList(
@AuthenticationPrincipal(expression = "#this == 'anonymousUser' ? null : member") member: Member?,
pageable: Pageable
) = run {
if (member == null) throw SodaException("로그인 정보를 확인해주세요.")
ApiResponse.ok(
service.getAudioContentMainCurationList(
member,
offset = pageable.offset,
limit = pageable.pageSize.toLong()
)
)
}
@GetMapping("/content-ranking")
fun getAudioContentMainContentRanking(
@AuthenticationPrincipal(expression = "#this == 'anonymousUser' ? null : member") member: Member?
) = run {
if (member == null) throw SodaException("로그인 정보를 확인해주세요.")
ApiResponse.ok(service.getAudioContentMainContentRanking(member))
}
}

View File

@ -10,6 +10,7 @@ import kr.co.vividnext.sodalive.event.EventItem
import kr.co.vividnext.sodalive.member.Member
import kr.co.vividnext.sodalive.member.block.BlockMemberRepository
import org.springframework.beans.factory.annotation.Value
import org.springframework.cache.annotation.Cacheable
import org.springframework.data.domain.Pageable
import org.springframework.stereotype.Service
import java.time.DayOfWeek
@ -168,6 +169,87 @@ class AudioContentMainService(
)
}
@Cacheable(
value = ["getNewContentUploadCreatorList"],
cacheManager = "cacheManager"
)
fun getNewContentUploadCreatorList(member: Member): List<GetNewContentUploadCreator> {
val isAdult = member.auth != null
// 2주일 이내에 콘텐츠를 올린 크리에이터 20명 조회
return repository.getNewContentUploadCreatorList(
cloudfrontHost = imageHost,
isAdult = isAdult
)
.asSequence()
.filter { !blockMemberRepository.isBlocked(blockedMemberId = member.id!!, memberId = it.creatorId) }
.toList()
}
@Cacheable(
value = ["getAudioContentMainBannerList"],
cacheManager = "cacheManager"
)
fun getAudioContentMainBannerList(member: Member): List<GetAudioContentBannerResponse> {
val isAdult = member.auth != null
return repository
.getAudioContentMainBannerList(isAdult = isAdult)
.asSequence()
.filter {
if (it.type == AudioContentBannerType.CREATOR && it.creator != null) {
!blockMemberRepository.isBlocked(blockedMemberId = member.id!!, memberId = it.creator!!.id!!)
} else {
true
}
}
.map {
GetAudioContentBannerResponse(
type = it.type,
thumbnailImageUrl = "$imageHost/${it.thumbnailImage}",
eventItem = if (it.type == AudioContentBannerType.EVENT && it.event != null) {
EventItem(
id = it.event!!.id!!,
thumbnailImageUrl = if (!it.event!!.thumbnailImage.startsWith("https://")) {
"$imageHost/${it.event!!.thumbnailImage}"
} else {
it.event!!.thumbnailImage
},
detailImageUrl = if (
it.event!!.detailImage != null &&
!it.event!!.detailImage!!.startsWith("https://")
) {
"$imageHost/${it.event!!.detailImage}"
} else {
it.event!!.detailImage
},
popupImageUrl = null,
link = it.event!!.link,
title = it.event!!.title,
isPopup = false
)
} else {
null
},
creatorId = if (it.type == AudioContentBannerType.CREATOR && it.creator != null) {
it.creator!!.id
} else {
null
},
link = it.link
)
}
.toList()
}
fun getAudioContentMainOrderList(member: Member): List<GetAudioContentMainItem> {
return orderService
.getAudioContentMainOrderList(
member = member,
limit = 20
)
}
fun getThemeList(member: Member): List<String> {
return audioContentThemeRepository.getActiveThemeOfContent(isAdult = member.auth != null)
}
@ -197,4 +279,77 @@ class AudioContentMainService(
return GetNewContentAllResponse(totalCount, items)
}
@Cacheable(
value = ["getAudioContentMainCurationList"],
cacheManager = "cacheManager"
)
fun getAudioContentMainCurationList(
member: Member,
offset: Long,
limit: Long
): List<GetAudioContentCurationResponse> {
val isAdult = member.auth != null
return repository
.getAudioContentCurationList(
isAdult = isAdult,
offset = offset,
limit = limit
)
.asSequence()
.map {
GetAudioContentCurationResponse(
curationId = it.id!!,
title = it.title,
description = it.description,
contents = repository.findAudioContentByCurationId(
curationId = it.id!!,
cloudfrontHost = imageHost,
isAdult = isAdult
)
.asSequence()
.filter { content ->
!blockMemberRepository.isBlocked(
blockedMemberId = member.id!!,
memberId = content.creatorId
)
}
.toList()
)
}
.filter { it.contents.isNotEmpty() }
.toList()
}
fun getAudioContentMainContentRanking(member: Member): GetAudioContentRanking {
val isAdult = member.auth != null
val currentDateTime = LocalDateTime.now()
val startDate = currentDateTime
.minusWeeks(1)
.with(TemporalAdjusters.previousOrSame(DayOfWeek.MONDAY))
.withHour(15)
.withMinute(0)
.withSecond(0)
val endDate = startDate
.plusDays(7)
val startDateFormatter = DateTimeFormatter.ofPattern("yyyy년 MM월 dd일")
val endDateFormatter = DateTimeFormatter.ofPattern("MM월 dd일")
val contentRankingItemList = repository
.getAudioContentRanking(
cloudfrontHost = imageHost,
startDate = startDate.minusDays(1),
endDate = endDate.minusDays(1),
isAdult = isAdult
)
return GetAudioContentRanking(
startDate = startDate.format(startDateFormatter),
endDate = endDate.minusDays(1).format(endDateFormatter),
contentRankingItemList
)
}
}