From 9afc44b7b1c4803bfc0bd6900cc69f5b00c19037 Mon Sep 17 00:00:00 2001 From: Klaus Date: Tue, 7 Nov 2023 20:19:34 +0900 Subject: [PATCH] =?UTF-8?q?=EC=BD=98=ED=85=90=EC=B8=A0=20=EB=A9=94?= =?UTF-8?q?=EC=9D=B8=20API=20-=20=EC=BA=90=EC=8B=B1=EC=9D=84=20=EC=A0=81?= =?UTF-8?q?=EC=9A=A9=ED=95=98=EA=B8=B0=20=EC=9C=84=ED=95=B4=20AudioContent?= =?UTF-8?q?MainManageService=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/AudioContentMainController.kt | 9 +- .../main/AudioContentMainManageService.kt | 94 +++++++++++++++++++ .../content/main/AudioContentMainService.kt | 73 +------------- .../theme/AudioContentThemeQueryRepository.kt | 4 - 4 files changed, 103 insertions(+), 77 deletions(-) create mode 100644 src/main/kotlin/kr/co/vividnext/sodalive/content/main/AudioContentMainManageService.kt diff --git a/src/main/kotlin/kr/co/vividnext/sodalive/content/main/AudioContentMainController.kt b/src/main/kotlin/kr/co/vividnext/sodalive/content/main/AudioContentMainController.kt index 18c4884..9c51e43 100644 --- a/src/main/kotlin/kr/co/vividnext/sodalive/content/main/AudioContentMainController.kt +++ b/src/main/kotlin/kr/co/vividnext/sodalive/content/main/AudioContentMainController.kt @@ -12,7 +12,10 @@ import org.springframework.web.bind.annotation.RestController @RestController @RequestMapping("/audio-content/main") -class AudioContentMainController(private val service: AudioContentMainService) { +class AudioContentMainController( + private val service: AudioContentMainService, + private val manageService: AudioContentMainManageService +) { @GetMapping fun getMain( @@ -20,7 +23,7 @@ class AudioContentMainController(private val service: AudioContentMainService) { ) = run { if (member == null) throw SodaException("로그인 정보를 확인해주세요.") - ApiResponse.ok(service.getMain(memberId = member.id!!, isAdult = member.auth != null)) + ApiResponse.ok(manageService.getMain(member)) } @GetMapping("/new") @@ -40,7 +43,7 @@ class AudioContentMainController(private val service: AudioContentMainService) { ) = run { if (member == null) throw SodaException("로그인 정보를 확인해주세요.") - ApiResponse.ok(service.getThemeList(member)) + ApiResponse.ok(service.getThemeList(isAdult = member.auth != null)) } @GetMapping("/new/all") diff --git a/src/main/kotlin/kr/co/vividnext/sodalive/content/main/AudioContentMainManageService.kt b/src/main/kotlin/kr/co/vividnext/sodalive/content/main/AudioContentMainManageService.kt new file mode 100644 index 0000000..4ec97e1 --- /dev/null +++ b/src/main/kotlin/kr/co/vividnext/sodalive/content/main/AudioContentMainManageService.kt @@ -0,0 +1,94 @@ +package kr.co.vividnext.sodalive.content.main + +import kr.co.vividnext.sodalive.content.AudioContentRepository +import kr.co.vividnext.sodalive.content.AudioContentService +import kr.co.vividnext.sodalive.content.order.OrderService +import kr.co.vividnext.sodalive.content.theme.AudioContentThemeQueryRepository +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.stereotype.Service +import org.springframework.transaction.annotation.Transactional +import java.time.DayOfWeek +import java.time.LocalDateTime +import java.time.temporal.TemporalAdjusters + +@Service +class AudioContentMainManageService( + private val service: AudioContentMainService, + private val orderService: OrderService, + private val audioContentService: AudioContentService, + + private val repository: AudioContentRepository, + private val blockMemberRepository: BlockMemberRepository, + private val audioContentThemeRepository: AudioContentThemeQueryRepository, + + @Value("\${cloud.aws.cloud-front.host}") + private val imageHost: String +) { + @Transactional(readOnly = true) + fun getMain(member: Member): GetAudioContentMainResponse { + val memberId = member.id!! + val isAdult = member.auth != null + + val newContentUploadCreatorList = service.getNewContentUploadCreatorList( + memberId = memberId, + isAdult = isAdult + ) + + val bannerList = service.getAudioContentMainBannerList(memberId = memberId, isAdult = isAdult) + + val orderList = orderService.getAudioContentMainOrderList( + memberId = memberId, + limit = 20 + ) + + // 콘텐츠 테마 + val themeList = audioContentThemeRepository.getActiveThemeOfContent(isAdult = isAdult) + + // 새 콘텐츠 20개 - 시간 내림차순 정렬 + val newContentList = repository.findByTheme( + cloudfrontHost = imageHost, + isAdult = isAdult + ) + .asSequence() + .filter { + !blockMemberRepository.isBlocked( + blockedMemberId = memberId, + memberId = it.creatorId + ) + } + .toList() + + val curationList = service.getAudioContentCurationList(memberId = memberId, isAdult = isAdult) + + 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 contentRankingSortTypeList = audioContentService.getContentRankingSortTypeList() + val contentRanking = audioContentService.getAudioContentRanking( + isAdult = isAdult, + startDate = startDate, + endDate = endDate, + offset = 0, + limit = 12 + ) + + return GetAudioContentMainResponse( + newContentUploadCreatorList = newContentUploadCreatorList, + bannerList = bannerList, + orderList = orderList, + themeList = themeList, + newContentList = newContentList, + curationList = curationList, + contentRankingSortTypeList = contentRankingSortTypeList, + contentRanking = contentRanking + ) + } +} diff --git a/src/main/kotlin/kr/co/vividnext/sodalive/content/main/AudioContentMainService.kt b/src/main/kotlin/kr/co/vividnext/sodalive/content/main/AudioContentMainService.kt index dd81dfa..50ca1ff 100644 --- a/src/main/kotlin/kr/co/vividnext/sodalive/content/main/AudioContentMainService.kt +++ b/src/main/kotlin/kr/co/vividnext/sodalive/content/main/AudioContentMainService.kt @@ -1,11 +1,9 @@ package kr.co.vividnext.sodalive.content.main import kr.co.vividnext.sodalive.content.AudioContentRepository -import kr.co.vividnext.sodalive.content.AudioContentService import kr.co.vividnext.sodalive.content.main.banner.AudioContentBannerType import kr.co.vividnext.sodalive.content.main.banner.GetAudioContentBannerResponse import kr.co.vividnext.sodalive.content.main.curation.GetAudioContentCurationResponse -import kr.co.vividnext.sodalive.content.order.OrderService import kr.co.vividnext.sodalive.content.theme.AudioContentThemeQueryRepository import kr.co.vividnext.sodalive.event.EventItem import kr.co.vividnext.sodalive.member.Member @@ -15,85 +13,20 @@ import org.springframework.cache.annotation.Cacheable import org.springframework.data.domain.Pageable import org.springframework.stereotype.Service import org.springframework.transaction.annotation.Transactional -import java.time.DayOfWeek -import java.time.LocalDateTime -import java.time.temporal.TemporalAdjusters @Service class AudioContentMainService( private val repository: AudioContentRepository, - private val audioContentService: AudioContentService, private val blockMemberRepository: BlockMemberRepository, - private val orderService: OrderService, private val audioContentThemeRepository: AudioContentThemeQueryRepository, @Value("\${cloud.aws.cloud-front.host}") private val imageHost: String ) { @Transactional(readOnly = true) - fun getMain(memberId: Long, isAdult: Boolean): GetAudioContentMainResponse { - // 2주일 이내에 콘텐츠를 올린 크리에이터 20명 조회 - val newContentUploadCreatorList = getNewContentUploadCreatorList(memberId = memberId, isAdult = isAdult) - - val bannerList = getAudioContentMainBannerList(memberId = memberId, isAdult = isAdult) - - // 구매목록 20개 - val orderList = orderService.getAudioContentMainOrderList( - memberId = memberId, - limit = 20 - ) - - // 콘텐츠 테마 - val themeList = audioContentThemeRepository.getActiveThemeOfContent(isAdult = isAdult) - - // 새 콘텐츠 20개 - 시간 내림차순 정렬 - val newContentList = repository.findByTheme( - cloudfrontHost = imageHost, - isAdult = isAdult - ) - .asSequence() - .filter { - !blockMemberRepository.isBlocked( - blockedMemberId = memberId, - memberId = it.creatorId - ) - } - .toList() - - val curationList = getAudioContentCurationList(memberId = memberId, isAdult = isAdult) - - 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 contentRankingSortTypeList = audioContentService.getContentRankingSortTypeList() - val contentRanking = audioContentService.getAudioContentRanking( - isAdult = isAdult, - startDate = startDate, - endDate = endDate, - offset = 0, - limit = 12 - ) - - return GetAudioContentMainResponse( - newContentUploadCreatorList = newContentUploadCreatorList, - bannerList = bannerList, - orderList = orderList, - themeList = themeList, - newContentList = newContentList, - curationList = curationList, - contentRankingSortTypeList = contentRankingSortTypeList, - contentRanking = contentRanking - ) - } - - fun getThemeList(member: Member): List { - return audioContentThemeRepository.getActiveThemeOfContent(isAdult = member.auth != null) + @Cacheable(cacheNames = ["default"], key = "'themeList:' + ':' + #isAdult") + fun getThemeList(isAdult: Boolean): List { + return audioContentThemeRepository.getActiveThemeOfContent(isAdult = isAdult) } fun getNewContentByTheme(theme: String, member: Member, pageable: Pageable): List { diff --git a/src/main/kotlin/kr/co/vividnext/sodalive/content/theme/AudioContentThemeQueryRepository.kt b/src/main/kotlin/kr/co/vividnext/sodalive/content/theme/AudioContentThemeQueryRepository.kt index da81883..e5cba07 100644 --- a/src/main/kotlin/kr/co/vividnext/sodalive/content/theme/AudioContentThemeQueryRepository.kt +++ b/src/main/kotlin/kr/co/vividnext/sodalive/content/theme/AudioContentThemeQueryRepository.kt @@ -4,9 +4,7 @@ import com.querydsl.jpa.impl.JPAQueryFactory import kr.co.vividnext.sodalive.content.QAudioContent.audioContent import kr.co.vividnext.sodalive.content.theme.QAudioContentTheme.audioContentTheme import org.springframework.beans.factory.annotation.Value -import org.springframework.cache.annotation.Cacheable import org.springframework.stereotype.Repository -import org.springframework.transaction.annotation.Transactional @Repository class AudioContentThemeQueryRepository( @@ -29,8 +27,6 @@ class AudioContentThemeQueryRepository( .fetch() } - @Transactional(readOnly = true) - @Cacheable(cacheNames = ["default"], key = "'activeThemeOfContent:' + ':' + #isAdult") fun getActiveThemeOfContent(isAdult: Boolean = false): List { var where = audioContent.isActive.isTrue .and(audioContentTheme.isActive.isTrue)