Merge pull request '탐색 - 인기 급상승 제거, 인기 크리에이터 섹션 추가' (#42) from test into main
Reviewed-on: #42
This commit is contained in:
		| @@ -0,0 +1,22 @@ | |||||||
|  | package kr.co.vividnext.sodalive.explorer | ||||||
|  |  | ||||||
|  | import kr.co.vividnext.sodalive.member.Member | ||||||
|  | import javax.persistence.Entity | ||||||
|  | import javax.persistence.FetchType | ||||||
|  | import javax.persistence.GeneratedValue | ||||||
|  | import javax.persistence.GenerationType | ||||||
|  | import javax.persistence.Id | ||||||
|  | import javax.persistence.JoinColumn | ||||||
|  | import javax.persistence.OneToOne | ||||||
|  |  | ||||||
|  | @Entity | ||||||
|  | data class CreatorRanking( | ||||||
|  |     @Id | ||||||
|  |     @GeneratedValue(strategy = GenerationType.IDENTITY) | ||||||
|  |     var id: Long? = null, | ||||||
|  |     val ranking: Int | ||||||
|  | ) { | ||||||
|  |     @OneToOne(fetch = FetchType.LAZY) | ||||||
|  |     @JoinColumn(name = "creator_id", nullable = false) | ||||||
|  |     var member: Member? = null | ||||||
|  | } | ||||||
| @@ -10,6 +10,7 @@ import kr.co.vividnext.sodalive.can.use.QUseCanCalculate.useCanCalculate | |||||||
| import kr.co.vividnext.sodalive.can.use.UseCanCalculateStatus | import kr.co.vividnext.sodalive.can.use.UseCanCalculateStatus | ||||||
| import kr.co.vividnext.sodalive.common.SodaException | import kr.co.vividnext.sodalive.common.SodaException | ||||||
| import kr.co.vividnext.sodalive.content.QAudioContent.audioContent | import kr.co.vividnext.sodalive.content.QAudioContent.audioContent | ||||||
|  | import kr.co.vividnext.sodalive.explorer.QCreatorRanking.creatorRanking | ||||||
| import kr.co.vividnext.sodalive.explorer.follower.GetFollowerListDto | import kr.co.vividnext.sodalive.explorer.follower.GetFollowerListDto | ||||||
| import kr.co.vividnext.sodalive.explorer.follower.QGetFollowerListDto | import kr.co.vividnext.sodalive.explorer.follower.QGetFollowerListDto | ||||||
| import kr.co.vividnext.sodalive.explorer.profile.ChannelNotice | import kr.co.vividnext.sodalive.explorer.profile.ChannelNotice | ||||||
| @@ -158,21 +159,6 @@ class ExplorerQueryRepository( | |||||||
|             } |             } | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     fun getSubscriberGrowthRankingCreators(limit: Long): List<Member> { |  | ||||||
|         return queryFactory |  | ||||||
|             .selectFrom(member) |  | ||||||
|             .join(member.follower, creatorFollowing) |  | ||||||
|             .where( |  | ||||||
|                 member.role.eq(MemberRole.CREATOR) |  | ||||||
|                     .and(creatorFollowing.createdAt.goe(LocalDateTime.now().minusMonths(1))) |  | ||||||
|                     .and(creatorFollowing.isActive.isTrue) |  | ||||||
|             ) |  | ||||||
|             .groupBy(member.id) |  | ||||||
|             .orderBy(member.follower.size().desc()) |  | ||||||
|             .limit(limit) |  | ||||||
|             .fetch() |  | ||||||
|     } |  | ||||||
|  |  | ||||||
|     fun getNewCreators(): List<Member> { |     fun getNewCreators(): List<Member> { | ||||||
|         return queryFactory |         return queryFactory | ||||||
|             .selectFrom(member) |             .selectFrom(member) | ||||||
| @@ -636,4 +622,13 @@ class ExplorerQueryRepository( | |||||||
|             .where(member.id.eq(creatorId)) |             .where(member.id.eq(creatorId)) | ||||||
|             .fetchFirst() |             .fetchFirst() | ||||||
|     } |     } | ||||||
|  |  | ||||||
|  |     fun getCreatorRankings(): List<Member> { | ||||||
|  |         return queryFactory | ||||||
|  |             .select(member) | ||||||
|  |             .from(creatorRanking) | ||||||
|  |             .innerJoin(creatorRanking.member, member) | ||||||
|  |             .orderBy(creatorRanking.ranking.asc()) | ||||||
|  |             .fetch() | ||||||
|  |     } | ||||||
| } | } | ||||||
|   | |||||||
| @@ -24,6 +24,8 @@ import org.springframework.stereotype.Service | |||||||
| import org.springframework.transaction.annotation.Transactional | import org.springframework.transaction.annotation.Transactional | ||||||
| import java.time.DayOfWeek | import java.time.DayOfWeek | ||||||
| import java.time.LocalDate | import java.time.LocalDate | ||||||
|  | import java.time.LocalDateTime | ||||||
|  | import java.time.format.DateTimeFormatter | ||||||
| import java.time.temporal.TemporalAdjusters | import java.time.temporal.TemporalAdjusters | ||||||
|  |  | ||||||
| @Service | @Service | ||||||
| @@ -42,9 +44,9 @@ class ExplorerService( | |||||||
|     fun getExplorer(member: Member, growthRankingCreatorsLimit: Long = 20): GetExplorerResponse { |     fun getExplorer(member: Member, growthRankingCreatorsLimit: Long = 20): GetExplorerResponse { | ||||||
|         val sections = mutableListOf<GetExplorerSectionResponse>() |         val sections = mutableListOf<GetExplorerSectionResponse>() | ||||||
|  |  | ||||||
|         // 인기 급상승중 (subscriberGrowthRankingCreators) |         // 인기 크리에이터 | ||||||
|         val growthRankingCreators = queryRepository |         val creatorRankings = queryRepository | ||||||
|             .getSubscriberGrowthRankingCreators(limit = growthRankingCreatorsLimit) |             .getCreatorRankings() | ||||||
|             .asSequence() |             .asSequence() | ||||||
|             .filter { !memberService.isBlocked(blockedMemberId = member.id!!, memberId = it.id!!) } |             .filter { !memberService.isBlocked(blockedMemberId = member.id!!, memberId = it.id!!) } | ||||||
|             .map { |             .map { | ||||||
| @@ -65,13 +67,25 @@ class ExplorerService( | |||||||
|             } |             } | ||||||
|             .toList() |             .toList() | ||||||
|  |  | ||||||
|         val growthRankingSection = GetExplorerSectionResponse( |         val currentDateTime = LocalDateTime.now() | ||||||
|             title = "인기 급상승중", |         val lastMonday = currentDateTime | ||||||
|  |             .minusWeeks(1) | ||||||
|  |             .with(TemporalAdjusters.previousOrSame(DayOfWeek.MONDAY)) | ||||||
|  |         val lastSunday = lastMonday | ||||||
|  |             .plusDays(6) | ||||||
|  |  | ||||||
|  |         val formatter = DateTimeFormatter.ofPattern("MM월 dd일") | ||||||
|  |         val formattedLastMonday = lastMonday.format(formatter) | ||||||
|  |         val formattedLastSunday = lastSunday.format(formatter) | ||||||
|  |  | ||||||
|  |         val creatorRankingSection = GetExplorerSectionResponse( | ||||||
|  |             title = "인기 크리에이터", | ||||||
|             coloredTitle = "인기", |             coloredTitle = "인기", | ||||||
|             color = "FF5C49", |             color = "FF5C49", | ||||||
|             creators = growthRankingCreators |             desc = "$formattedLastMonday~$formattedLastSunday\n※ 인기 크리에이터의 순위는 매주 업데이트 됩니다.", | ||||||
|  |             creators = creatorRankings | ||||||
|         ) |         ) | ||||||
|         sections.add(growthRankingSection) |         sections.add(creatorRankingSection) | ||||||
|  |  | ||||||
|         // 새로 시작 (newCreators) |         // 새로 시작 (newCreators) | ||||||
|         val newCreators = queryRepository |         val newCreators = queryRepository | ||||||
|   | |||||||
| @@ -6,6 +6,7 @@ data class GetExplorerSectionResponse( | |||||||
|     val title: String, |     val title: String, | ||||||
|     val coloredTitle: String?, |     val coloredTitle: String?, | ||||||
|     val color: String?, |     val color: String?, | ||||||
|  |     val desc: String? = null, | ||||||
|     val creators: List<GetExplorerSectionCreatorResponse> |     val creators: List<GetExplorerSectionCreatorResponse> | ||||||
| ) | ) | ||||||
|  |  | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user