diff --git a/src/main/kotlin/kr/co/vividnext/sodalive/content/main/tab/replay/AudioContentMainTabLiveReplayController.kt b/src/main/kotlin/kr/co/vividnext/sodalive/content/main/tab/replay/AudioContentMainTabLiveReplayController.kt new file mode 100644 index 0000000..c9b3739 --- /dev/null +++ b/src/main/kotlin/kr/co/vividnext/sodalive/content/main/tab/replay/AudioContentMainTabLiveReplayController.kt @@ -0,0 +1,22 @@ +package kr.co.vividnext.sodalive.content.main.tab.replay + +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.RequestMapping +import org.springframework.web.bind.annotation.RestController + +@RestController +@RequestMapping("/v2/audio-content/main/replay") +class AudioContentMainTabLiveReplayController(private val service: AudioContentMainTabLiveReplayService) { + @GetMapping + fun fetchContentMainTabLiveReplay( + @AuthenticationPrincipal(expression = "#this == 'anonymousUser' ? null : member") member: Member? + ) = run { + if (member == null) throw SodaException("로그인 정보를 확인해주세요.") + + ApiResponse.ok(service.fetchData(member)) + } +} diff --git a/src/main/kotlin/kr/co/vividnext/sodalive/content/main/tab/replay/AudioContentMainTabLiveReplayService.kt b/src/main/kotlin/kr/co/vividnext/sodalive/content/main/tab/replay/AudioContentMainTabLiveReplayService.kt new file mode 100644 index 0000000..560ca76 --- /dev/null +++ b/src/main/kotlin/kr/co/vividnext/sodalive/content/main/tab/replay/AudioContentMainTabLiveReplayService.kt @@ -0,0 +1,84 @@ +package kr.co.vividnext.sodalive.content.main.tab.replay + +import kr.co.vividnext.sodalive.content.AudioContentRepository +import kr.co.vividnext.sodalive.content.ContentType +import kr.co.vividnext.sodalive.content.main.banner.AudioContentBannerService +import kr.co.vividnext.sodalive.content.main.curation.AudioContentCurationQueryRepository +import kr.co.vividnext.sodalive.content.main.tab.GetContentCurationResponse +import kr.co.vividnext.sodalive.event.EventService +import kr.co.vividnext.sodalive.member.Member +import kr.co.vividnext.sodalive.rank.RankingService +import org.springframework.stereotype.Service +import java.time.DayOfWeek +import java.time.LocalDateTime +import java.time.temporal.TemporalAdjusters + +@Service +class AudioContentMainTabLiveReplayService( + private val bannerService: AudioContentBannerService, + private val contentRepository: AudioContentRepository, + private val rankingService: RankingService, + private val eventService: EventService, + private val curationRepository: AudioContentCurationQueryRepository +) { + fun fetchData(member: Member): GetContentMainTabLiveReplayResponse { + val isAdult = member.auth != null + val memberId = member.id!! + val theme = "다시듣기" + val tabId = 6L + + val contentBannerList = bannerService.getBannerList( + tabId = tabId, + memberId = memberId, + isAdult = isAdult + ) + + val newLiveReplayContentList = contentRepository.findByTheme( + memberId = memberId, + theme = theme, + isAdult = isAdult, + contentType = ContentType.ALL, + limit = 10 + ) + + val currentDateTime = LocalDateTime.now() + val startDate = currentDateTime + .withHour(15) + .withMinute(0) + .withSecond(0) + .minusWeeks(1) + .with(TemporalAdjusters.previousOrSame(DayOfWeek.MONDAY)) + val endDate = startDate + .plusDays(6) + + val rankLiveReplayContentList = rankingService.getContentRanking( + memberId = memberId, + isAdult = isAdult, + startDate = startDate, + endDate = endDate, + theme = theme + ) + + val eventBannerList = eventService.getEventList(isAdult = isAdult) + + val curationList = curationRepository.findByContentMainTabId(tabId = tabId, isAdult = isAdult) + .map { + GetContentCurationResponse( + title = it.title, + items = contentRepository.findAudioContentByCurationId( + curationId = it.id!!, + isAdult = isAdult, + contentType = ContentType.ALL + ) + ) + } + + return GetContentMainTabLiveReplayResponse( + contentBannerList = contentBannerList, + newLiveReplayContentList = newLiveReplayContentList, + rankLiveReplayContentList = rankLiveReplayContentList, + eventBannerList = eventBannerList, + curationList = curationList + ) + } +} diff --git a/src/main/kotlin/kr/co/vividnext/sodalive/content/main/tab/replay/GetContentMainTabLiveReplayResponse.kt b/src/main/kotlin/kr/co/vividnext/sodalive/content/main/tab/replay/GetContentMainTabLiveReplayResponse.kt new file mode 100644 index 0000000..eea8309 --- /dev/null +++ b/src/main/kotlin/kr/co/vividnext/sodalive/content/main/tab/replay/GetContentMainTabLiveReplayResponse.kt @@ -0,0 +1,16 @@ +package kr.co.vividnext.sodalive.content.main.tab.replay + +import kr.co.vividnext.sodalive.content.main.GetAudioContentMainItem +import kr.co.vividnext.sodalive.content.main.GetAudioContentRankingItem +import kr.co.vividnext.sodalive.content.main.banner.GetAudioContentBannerResponse +import kr.co.vividnext.sodalive.content.main.tab.GetContentCurationResponse +import kr.co.vividnext.sodalive.event.GetEventResponse + +data class GetContentMainTabLiveReplayResponse( + val tabId: Long = 6, + val contentBannerList: List<GetAudioContentBannerResponse>, + val newLiveReplayContentList: List<GetAudioContentMainItem>, + val rankLiveReplayContentList: List<GetAudioContentRankingItem>, + val eventBannerList: GetEventResponse, + val curationList: List<GetContentCurationResponse> +)