From a8589ef4e733e570d2e75f2d5ad632758688a252 Mon Sep 17 00:00:00 2001 From: Klaus Date: Fri, 14 Feb 2025 04:31:05 +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=20=EC=8B=9C=EB=A6=AC=EC=A6=88=20=ED=83=AD=20-=20?= =?UTF-8?q?=EC=99=84=EA=B2=B0=20=EC=8B=9C=EB=A6=AC=EC=A6=88=20=EC=A0=84?= =?UTF-8?q?=EC=B2=B4=EB=B3=B4=EA=B8=B0=20API?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../AudioContentMainTabSeriesController.kt | 17 +++++++ .../AudioContentMainTabSeriesService.kt | 34 ++++++++++++++ .../sodalive/rank/RankingRepository.kt | 47 +++++++++++++++++-- .../vividnext/sodalive/rank/RankingService.kt | 14 ++++++ 4 files changed, 108 insertions(+), 4 deletions(-) diff --git a/src/main/kotlin/kr/co/vividnext/sodalive/content/main/tab/series/AudioContentMainTabSeriesController.kt b/src/main/kotlin/kr/co/vividnext/sodalive/content/main/tab/series/AudioContentMainTabSeriesController.kt index f9ff1af..3b753f5 100644 --- a/src/main/kotlin/kr/co/vividnext/sodalive/content/main/tab/series/AudioContentMainTabSeriesController.kt +++ b/src/main/kotlin/kr/co/vividnext/sodalive/content/main/tab/series/AudioContentMainTabSeriesController.kt @@ -37,4 +37,21 @@ class AudioContentMainTabSeriesController(private val service: AudioContentMainT ) ) } + + @GetMapping("/completed-monthly-rank") + fun getRankMonthlyCompletedSeriesList( + @AuthenticationPrincipal(expression = "#this == 'anonymousUser' ? null : member") member: Member?, + pageable: Pageable + ) = run { + if (member == null) throw SodaException("로그인 정보를 확인해주세요.") + + ApiResponse.ok( + service.getRankMonthlyCompletedSeriesList( + memberId = member.id!!, + isAdult = member.auth != null, + offset = pageable.offset, + limit = pageable.pageSize.toLong() + ) + ) + } } diff --git a/src/main/kotlin/kr/co/vividnext/sodalive/content/main/tab/series/AudioContentMainTabSeriesService.kt b/src/main/kotlin/kr/co/vividnext/sodalive/content/main/tab/series/AudioContentMainTabSeriesService.kt index 45e05a2..bd7093b 100644 --- a/src/main/kotlin/kr/co/vividnext/sodalive/content/main/tab/series/AudioContentMainTabSeriesService.kt +++ b/src/main/kotlin/kr/co/vividnext/sodalive/content/main/tab/series/AudioContentMainTabSeriesService.kt @@ -166,4 +166,38 @@ class AudioContentMainTabSeriesService( return GetSeriesListResponse(totalCount, items) } + + fun getRankMonthlyCompletedSeriesList( + memberId: Long, + isAdult: Boolean, + offset: Long, + limit: Long + ): GetSeriesListResponse { + val monthlyRankingStartDate = LocalDateTime.now() + .withDayOfMonth(1) + .withHour(15) + .withMinute(0) + .withSecond(0) + .minusDays(1) + val monthlyRankingEndDate = monthlyRankingStartDate + .plusMonths(1) + + val totalCount = rankingService.getCompleteSeriesRankingTotalCount( + memberId = memberId, + isAdult = isAdult, + startDate = monthlyRankingStartDate, + endDate = monthlyRankingEndDate + ) + + val items = rankingService.getCompleteSeriesRanking( + memberId = memberId, + isAdult = isAdult, + startDate = monthlyRankingStartDate, + endDate = monthlyRankingEndDate, + offset = offset, + limit = limit + ) + + return GetSeriesListResponse(totalCount, items) + } } diff --git a/src/main/kotlin/kr/co/vividnext/sodalive/rank/RankingRepository.kt b/src/main/kotlin/kr/co/vividnext/sodalive/rank/RankingRepository.kt index 6f639cc..cf804a5 100644 --- a/src/main/kotlin/kr/co/vividnext/sodalive/rank/RankingRepository.kt +++ b/src/main/kotlin/kr/co/vividnext/sodalive/rank/RankingRepository.kt @@ -209,6 +209,48 @@ class RankingRepository( .fetch() } + fun getCompleteSeriesRankingTotalCount( + memberId: Long, + isAdult: Boolean, + startDate: LocalDateTime, + endDate: LocalDateTime + ): Int { + val blockMemberCondition = blockMember.member.id.eq(member.id) + .and(blockMember.isActive.isTrue) + .and(blockMember.blockedMember.id.eq(memberId)) + + var where = series.isActive.isTrue + .and(series.state.eq(SeriesState.COMPLETE)) + .and(audioContent.isActive.isTrue) + .and(member.isActive.isTrue) + .and(member.isNotNull) + .and(member.role.eq(MemberRole.CREATOR)) + .and(audioContent.duration.isNotNull) + .and(audioContent.limited.isNull) + .and(blockMember.id.isNull) + .and(order.isActive.isTrue) + .and(order.createdAt.goe(startDate)) + .and(order.createdAt.lt(endDate)) + + if (!isAdult) { + where = where.and(series.isAdult.isFalse) + } + + return queryFactory + .select(series.id) + .from(seriesContent) + .innerJoin(seriesContent.series, series) + .innerJoin(seriesContent.content, audioContent) + .innerJoin(series.member, member) + .leftJoin(order).on(audioContent.id.eq(order.audioContent.id)) + .leftJoin(blockMember).on(blockMemberCondition) + .where(where) + .groupBy(series.id) + .orderBy(order.can.sum().desc()) + .fetch() + .size + } + fun getCompleteSeriesRanking( memberId: Long, isAdult: Boolean, @@ -248,10 +290,7 @@ class RankingRepository( .leftJoin(blockMember).on(blockMemberCondition) .where(where) .groupBy(series.id) - .orderBy( - order.can.sum().desc(), - Expressions.numberTemplate(Double::class.java, "function('rand')").asc() - ) + .orderBy(order.can.sum().desc()) .offset(offset) .limit(limit) .fetch() diff --git a/src/main/kotlin/kr/co/vividnext/sodalive/rank/RankingService.kt b/src/main/kotlin/kr/co/vividnext/sodalive/rank/RankingService.kt index a3504fc..f9aac15 100644 --- a/src/main/kotlin/kr/co/vividnext/sodalive/rank/RankingService.kt +++ b/src/main/kotlin/kr/co/vividnext/sodalive/rank/RankingService.kt @@ -82,6 +82,20 @@ class RankingService( return seriesToSeriesListItem(seriesList = seriesList, isAdult = isAdult) } + fun getCompleteSeriesRankingTotalCount( + memberId: Long, + isAdult: Boolean, + startDate: LocalDateTime, + endDate: LocalDateTime + ): Int { + return repository.getCompleteSeriesRankingTotalCount( + memberId = memberId, + isAdult = isAdult, + startDate = startDate, + endDate = endDate + ) + } + fun getCompleteSeriesRanking( memberId: Long, isAdult: Boolean,