From 519c63a0233ce807f3803aa2a497ab3e3d3e6178 Mon Sep 17 00:00:00 2001 From: Klaus Date: Sat, 22 Mar 2025 00:52:34 +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=ED=99=88=20-=20=EB=A1=9C=EA=B7=B8=EC=9D=B8=20?= =?UTF-8?q?=EC=97=86=EC=9D=B4=20=EC=A1=B0=ED=9A=8C=EA=B0=80=20=EA=B0=80?= =?UTF-8?q?=EB=8A=A5=ED=95=98=EB=8F=84=EB=A1=9D=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../sodalive/configs/SecurityConfig.kt | 2 + .../main/banner/AudioContentBannerService.kt | 6 +- .../home/AudioContentMainTabHomeController.kt | 7 +- .../home/AudioContentMainTabHomeService.kt | 14 ++-- .../sodalive/rank/RankingRepository.kt | 74 +++++++++++++------ .../vividnext/sodalive/rank/RankingService.kt | 16 ++-- 6 files changed, 75 insertions(+), 44 deletions(-) diff --git a/src/main/kotlin/kr/co/vividnext/sodalive/configs/SecurityConfig.kt b/src/main/kotlin/kr/co/vividnext/sodalive/configs/SecurityConfig.kt index 6423bda..5c5784d 100644 --- a/src/main/kotlin/kr/co/vividnext/sodalive/configs/SecurityConfig.kt +++ b/src/main/kotlin/kr/co/vividnext/sodalive/configs/SecurityConfig.kt @@ -74,6 +74,8 @@ class SecurityConfig( .antMatchers("/stplat/terms_of_service").permitAll() .antMatchers("/stplat/privacy_policy").permitAll() .antMatchers("/charge/ads").permitAll() + .antMatchers("/v2/audio-content/main/home").permitAll() + .antMatchers("/v2/audio-content/main/home/popular-content-by-creator").permitAll() .anyRequest().authenticated() .and() .build() diff --git a/src/main/kotlin/kr/co/vividnext/sodalive/content/main/banner/AudioContentBannerService.kt b/src/main/kotlin/kr/co/vividnext/sodalive/content/main/banner/AudioContentBannerService.kt index 022a888..6226b23 100644 --- a/src/main/kotlin/kr/co/vividnext/sodalive/content/main/banner/AudioContentBannerService.kt +++ b/src/main/kotlin/kr/co/vividnext/sodalive/content/main/banner/AudioContentBannerService.kt @@ -13,12 +13,12 @@ class AudioContentBannerService( @Value("\${cloud.aws.cloud-front.host}") private val imageHost: String ) { - fun getBannerList(tabId: Long, memberId: Long, isAdult: Boolean): List { + fun getBannerList(tabId: Long, memberId: Long?, isAdult: Boolean): List { return repository.getAudioContentMainBannerList(tabId, isAdult) .filter { - if (it.type == AudioContentBannerType.CREATOR && it.creator != null) { + if (it.type == AudioContentBannerType.CREATOR && it.creator != null && memberId != null) { !blockMemberRepository.isBlocked(blockedMemberId = memberId, memberId = it.creator!!.id!!) - } else if (it.type == AudioContentBannerType.SERIES && it.series != null) { + } else if (it.type == AudioContentBannerType.SERIES && it.series != null && memberId != null) { !blockMemberRepository.isBlocked(blockedMemberId = memberId, memberId = it.series!!.member!!.id!!) } else { true diff --git a/src/main/kotlin/kr/co/vividnext/sodalive/content/main/tab/home/AudioContentMainTabHomeController.kt b/src/main/kotlin/kr/co/vividnext/sodalive/content/main/tab/home/AudioContentMainTabHomeController.kt index b2ca129..a743dce 100644 --- a/src/main/kotlin/kr/co/vividnext/sodalive/content/main/tab/home/AudioContentMainTabHomeController.kt +++ b/src/main/kotlin/kr/co/vividnext/sodalive/content/main/tab/home/AudioContentMainTabHomeController.kt @@ -1,7 +1,6 @@ package kr.co.vividnext.sodalive.content.main.tab.home import kr.co.vividnext.sodalive.common.ApiResponse -import kr.co.vividnext.sodalive.common.SodaException import kr.co.vividnext.sodalive.content.ContentType import kr.co.vividnext.sodalive.member.Member import org.springframework.security.core.annotation.AuthenticationPrincipal @@ -19,8 +18,6 @@ class AudioContentMainTabHomeController(private val service: AudioContentMainTab @RequestParam("contentType", required = false) contentType: ContentType? = null, @AuthenticationPrincipal(expression = "#this == 'anonymousUser' ? null : member") member: Member? ) = run { - if (member == null) throw SodaException("로그인 정보를 확인해주세요.") - ApiResponse.ok( service.fetchData( isAdultContentVisible = isAdultContentVisible ?: true, @@ -37,12 +34,10 @@ class AudioContentMainTabHomeController(private val service: AudioContentMainTab @RequestParam("contentType", required = false) contentType: ContentType? = null, @AuthenticationPrincipal(expression = "#this == 'anonymousUser' ? null : member") member: Member? ) = run { - if (member == null) throw SodaException("로그인 정보를 확인해주세요.") - ApiResponse.ok( service.getPopularContentByCreator( creatorId = creatorId, - isAdult = member.auth != null && (isAdultContentVisible ?: true), + isAdult = member?.auth != null && (isAdultContentVisible ?: true), contentType = contentType ?: ContentType.ALL ) ) diff --git a/src/main/kotlin/kr/co/vividnext/sodalive/content/main/tab/home/AudioContentMainTabHomeService.kt b/src/main/kotlin/kr/co/vividnext/sodalive/content/main/tab/home/AudioContentMainTabHomeService.kt index 7179cd3..42dd140 100644 --- a/src/main/kotlin/kr/co/vividnext/sodalive/content/main/tab/home/AudioContentMainTabHomeService.kt +++ b/src/main/kotlin/kr/co/vividnext/sodalive/content/main/tab/home/AudioContentMainTabHomeService.kt @@ -23,7 +23,7 @@ class AudioContentMainTabHomeService( fun fetchData( isAdultContentVisible: Boolean, contentType: ContentType, - member: Member + member: Member? ): GetContentMainTabHomeResponse { // 주간 랭킹 기간 val currentDateTime = LocalDateTime.now() @@ -42,7 +42,7 @@ class AudioContentMainTabHomeService( val formattedLastMonday = startDate.format(startDateFormatter) val formattedLastSunday = endDate.format(endDateFormatter) - val isAdult = member.auth != null && isAdultContentVisible + val isAdult = member?.auth != null && isAdultContentVisible // 최근 공지사항 val latestNotice = noticeService.getLatestNotice() @@ -50,19 +50,19 @@ class AudioContentMainTabHomeService( // 메인 배너 (홈) val contentBannerList = bannerService.getBannerList( tabId = 1, - memberId = member.id!!, + memberId = member?.id, isAdult = isAdult ) // 인기 크리에이터 val rankCreatorList = rankingService.getCreatorRanking( - memberId = member.id!!, + memberId = member?.id, rankingDate = "$formattedLastMonday ~ $formattedLastSunday" ) // 인기 시리즈 val rankSeriesList = rankingService.getSeriesRanking( - memberId = member.id!!, + memberId = member?.id, isAdult = isAdult, contentType = contentType, startDate = startDate.minusDays(1), @@ -71,7 +71,7 @@ class AudioContentMainTabHomeService( // 인기 콘텐츠 val rankContentList = rankingService.getContentRanking( - memberId = member.id!!, + memberId = member?.id, isAdult = isAdult, contentType = contentType, startDate = startDate.minusDays(1), @@ -82,7 +82,7 @@ class AudioContentMainTabHomeService( val eventBannerList = eventService.getEventList(isAdult = isAdult) val contentRankCreatorList = rankingService.fetchCreatorBySellContentCountRankTop20( - memberId = member.id!!, + memberId = member?.id, isAdult = isAdult, contentType = contentType, startDate = startDate.minusDays(1), 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 b0639c1..1e7da14 100644 --- a/src/main/kotlin/kr/co/vividnext/sodalive/rank/RankingRepository.kt +++ b/src/main/kotlin/kr/co/vividnext/sodalive/rank/RankingRepository.kt @@ -43,7 +43,7 @@ class RankingRepository( } fun getAudioContentRanking( - memberId: Long, + memberId: Long?, isAdult: Boolean, contentType: ContentType, startDate: LocalDateTime, @@ -110,7 +110,40 @@ class RankingRepository( .innerJoin(audioContentComment.audioContent, audioContent) .innerJoin(audioContent.member, member) .innerJoin(audioContent.theme, audioContentTheme) - .leftJoin(blockMember).on(blockMemberCondition) + } + + "댓글" -> { + select + .from(audioContentComment) + .innerJoin(audioContentComment.audioContent, audioContent) + .innerJoin(audioContent.member, member) + .innerJoin(audioContent.theme, audioContentTheme) + } + + "좋아요" -> { + select + .from(audioContentLike) + .innerJoin(audioContentLike.audioContent, audioContent) + .innerJoin(audioContent.member, member) + .innerJoin(audioContent.theme, audioContentTheme) + } + + else -> { + select + .from(order) + .innerJoin(order.audioContent, audioContent) + .innerJoin(audioContent.member, member) + .innerJoin(audioContent.theme, audioContentTheme) + } + } + + if (memberId != null) { + select = select.leftJoin(blockMember).on(blockMemberCondition) + } + + select = when (sortType) { + "후원" -> { + select .where( where .and(audioContentComment.isActive.isTrue) @@ -124,11 +157,6 @@ class RankingRepository( "댓글" -> { select - .from(audioContentComment) - .innerJoin(audioContentComment.audioContent, audioContent) - .innerJoin(audioContent.member, member) - .innerJoin(audioContent.theme, audioContentTheme) - .leftJoin(blockMember).on(blockMemberCondition) .where( where .and(audioContentComment.isActive.isTrue) @@ -141,11 +169,6 @@ class RankingRepository( "좋아요" -> { select - .from(audioContentLike) - .innerJoin(audioContentLike.audioContent, audioContent) - .innerJoin(audioContent.member, member) - .innerJoin(audioContent.theme, audioContentTheme) - .leftJoin(blockMember).on(blockMemberCondition) .where( where .and(audioContentLike.isActive.isTrue) @@ -158,11 +181,6 @@ class RankingRepository( else -> { select - .from(order) - .innerJoin(order.audioContent, audioContent) - .innerJoin(audioContent.member, member) - .innerJoin(audioContent.theme, audioContentTheme) - .leftJoin(blockMember).on(blockMemberCondition) .where( where .and(order.isActive.isTrue) @@ -181,7 +199,7 @@ class RankingRepository( } fun getSeriesRanking( - memberId: Long, + memberId: Long?, isAdult: Boolean, contentType: ContentType, startDate: LocalDateTime, @@ -221,14 +239,19 @@ class RankingRepository( } } - return queryFactory + var select = queryFactory .select(series) .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) + + if (memberId != null) { + select = select.leftJoin(blockMember).on(blockMemberCondition) + } + + return select .where(where) .groupBy(series.id) .orderBy( @@ -408,7 +431,7 @@ class RankingRepository( } fun fetchCreatorBySellContentCountRankTop20( - memberId: Long, + memberId: Long?, isAdult: Boolean, contentType: ContentType, startDate: LocalDateTime, @@ -451,7 +474,7 @@ class RankingRepository( } } - return queryFactory + var select = queryFactory .select( QContentCreatorResponse( member.id, @@ -462,7 +485,12 @@ class RankingRepository( .from(audioContent) .innerJoin(member).on(memberCondition) .leftJoin(order).on(ordersCondition) - .leftJoin(blockMember).on(blockMemberCondition) + + if (memberId != null) { + select = select.leftJoin(blockMember).on(blockMemberCondition) + } + + return select .where(where) .groupBy(member.id) .having(audioContent.id.count().goe(4)) 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 91a46e4..7b5fdeb 100644 --- a/src/main/kotlin/kr/co/vividnext/sodalive/rank/RankingService.kt +++ b/src/main/kotlin/kr/co/vividnext/sodalive/rank/RankingService.kt @@ -23,10 +23,16 @@ class RankingService( @Value("\${cloud.aws.cloud-front.host}") private val imageHost: String ) { - fun getCreatorRanking(memberId: Long, rankingDate: String): GetExplorerSectionResponse { + fun getCreatorRanking(memberId: Long?, rankingDate: String): GetExplorerSectionResponse { val creatorRankings = repository .getCreatorRankings() - .filter { !memberService.isBlocked(blockedMemberId = memberId, memberId = it.id!!) } + .filter { + if (memberId != null) { + !memberService.isBlocked(blockedMemberId = memberId, memberId = it.id!!) + } else { + true + } + } .map { it.toExplorerSectionCreator(imageHost) } return GetExplorerSectionResponse( @@ -39,7 +45,7 @@ class RankingService( } fun getContentRanking( - memberId: Long, + memberId: Long?, isAdult: Boolean, contentType: ContentType, startDate: LocalDateTime, @@ -71,7 +77,7 @@ class RankingService( } fun getSeriesRanking( - memberId: Long, + memberId: Long?, isAdult: Boolean, contentType: ContentType, startDate: LocalDateTime, @@ -211,7 +217,7 @@ class RankingService( } fun fetchCreatorBySellContentCountRankTop20( - memberId: Long, + memberId: Long?, isAdult: Boolean, contentType: ContentType, startDate: LocalDateTime,