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)
 | 
					        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()
 | 
					            .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(
 | 
					    fun getCompleteSeriesRanking(
 | 
				
			||||||
        memberId: Long,
 | 
					        memberId: Long,
 | 
				
			||||||
        isAdult: Boolean,
 | 
					        isAdult: Boolean,
 | 
				
			||||||
@@ -248,10 +290,7 @@ class RankingRepository(
 | 
				
			|||||||
            .leftJoin(blockMember).on(blockMemberCondition)
 | 
					            .leftJoin(blockMember).on(blockMemberCondition)
 | 
				
			||||||
            .where(where)
 | 
					            .where(where)
 | 
				
			||||||
            .groupBy(series.id)
 | 
					            .groupBy(series.id)
 | 
				
			||||||
            .orderBy(
 | 
					            .orderBy(order.can.sum().desc())
 | 
				
			||||||
                order.can.sum().desc(),
 | 
					 | 
				
			||||||
                Expressions.numberTemplate(Double::class.java, "function('rand')").asc()
 | 
					 | 
				
			||||||
            )
 | 
					 | 
				
			||||||
            .offset(offset)
 | 
					            .offset(offset)
 | 
				
			||||||
            .limit(limit)
 | 
					            .limit(limit)
 | 
				
			||||||
            .fetch()
 | 
					            .fetch()
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -82,6 +82,20 @@ class RankingService(
 | 
				
			|||||||
        return seriesToSeriesListItem(seriesList = seriesList, isAdult = isAdult)
 | 
					        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(
 | 
					    fun getCompleteSeriesRanking(
 | 
				
			||||||
        memberId: Long,
 | 
					        memberId: Long,
 | 
				
			||||||
        isAdult: Boolean,
 | 
					        isAdult: Boolean,
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user