test #258
@@ -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()
 | 
			
		||||
            )
 | 
			
		||||
        )
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -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)
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -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()
 | 
			
		||||
 
 | 
			
		||||
@@ -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,
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user