diff --git a/src/main/kotlin/kr/co/vividnext/sodalive/audition/AuditionController.kt b/src/main/kotlin/kr/co/vividnext/sodalive/audition/AuditionController.kt index ce4593c..527d4f1 100644 --- a/src/main/kotlin/kr/co/vividnext/sodalive/audition/AuditionController.kt +++ b/src/main/kotlin/kr/co/vividnext/sodalive/audition/AuditionController.kt @@ -18,13 +18,11 @@ class AuditionController(private val service: AuditionService) { @AuthenticationPrincipal(expression = "#this == 'anonymousUser' ? null : member") member: Member?, pageable: Pageable ) = run { - if (member == null) throw SodaException("로그인 정보를 확인해주세요.") - ApiResponse.ok( service.getAuditionList( offset = pageable.offset, limit = pageable.pageSize.toLong(), - isAdult = member.auth != null + isAdult = member?.auth != null ) ) } 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..f9e5969 100644 --- a/src/main/kotlin/kr/co/vividnext/sodalive/configs/SecurityConfig.kt +++ b/src/main/kotlin/kr/co/vividnext/sodalive/configs/SecurityConfig.kt @@ -8,6 +8,7 @@ import kr.co.vividnext.sodalive.jwt.JwtFilter import kr.co.vividnext.sodalive.jwt.TokenProvider import org.springframework.context.annotation.Bean import org.springframework.context.annotation.Configuration +import org.springframework.http.HttpMethod import org.springframework.security.config.annotation.method.configuration.EnableGlobalMethodSecurity import org.springframework.security.config.annotation.web.builders.HttpSecurity import org.springframework.security.config.annotation.web.builders.WebSecurity @@ -74,6 +75,16 @@ 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() + .antMatchers("/v2/audio-content/main/home/content/ranking").permitAll() + .antMatchers(HttpMethod.GET, "/faq").permitAll() + .antMatchers(HttpMethod.GET, "/faq/category").permitAll() + .antMatchers("/audition").permitAll() + .antMatchers("/live/recommend/channel").permitAll() + .antMatchers(HttpMethod.GET, "/live/room").permitAll() + .antMatchers(HttpMethod.GET, "/event").permitAll() + .antMatchers(HttpMethod.GET, "/live/recommend").permitAll() .anyRequest().authenticated() .and() .build() diff --git a/src/main/kotlin/kr/co/vividnext/sodalive/content/AudioContentController.kt b/src/main/kotlin/kr/co/vividnext/sodalive/content/AudioContentController.kt index 53ad914..4b4549a 100644 --- a/src/main/kotlin/kr/co/vividnext/sodalive/content/AudioContentController.kt +++ b/src/main/kotlin/kr/co/vividnext/sodalive/content/AudioContentController.kt @@ -184,8 +184,6 @@ class AudioContentController(private val service: AudioContentService) { @AuthenticationPrincipal(expression = "#this == 'anonymousUser' ? null : member") member: Member?, pageable: Pageable ) = run { - if (member == null) throw SodaException("로그인 정보를 확인해주세요.") - val currentDateTime = LocalDateTime.now() val startDate = currentDateTime .withHour(15) @@ -198,7 +196,7 @@ class AudioContentController(private val service: AudioContentService) { ApiResponse.ok( service.getAudioContentRanking( - isAdult = member.auth != null && (isAdultContentVisible ?: true), + isAdult = member?.auth != null && (isAdultContentVisible ?: true), contentType = contentType ?: ContentType.ALL, startDate = startDate, endDate = endDate, 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..5015035 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,14 +34,29 @@ 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 ) ) } + + @GetMapping("/content/ranking") + fun getContentRanking( + @RequestParam("sort-type", required = false) sortType: String? = "매출", + @RequestParam("isAdultContentVisible", required = false) isAdultContentVisible: Boolean? = null, + @RequestParam("contentType", required = false) contentType: ContentType? = null, + @AuthenticationPrincipal(expression = "#this == 'anonymousUser' ? null : member") member: Member? + ) = run { + ApiResponse.ok( + service.getContentRanking( + sortType = sortType ?: "매출", + isAdultContentVisible = isAdultContentVisible ?: true, + contentType = contentType ?: ContentType.ALL, + member + ) + ) + } } 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..f86f0a9 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), @@ -123,4 +123,32 @@ class AudioContentMainTabHomeService( contentType = contentType ) } + + fun getContentRanking( + sortType: String, + isAdultContentVisible: Boolean, + contentType: ContentType, + member: Member? + ): List { + val isAdult = member?.auth != null && isAdultContentVisible + + val currentDateTime = LocalDateTime.now() + val startDate = currentDateTime + .withHour(15) + .withMinute(0) + .withSecond(0) + .minusWeeks(1) + .with(TemporalAdjusters.previousOrSame(DayOfWeek.MONDAY)) + val endDate = startDate + .plusDays(6) + + return rankingService.getContentRanking( + memberId = member?.id, + isAdult = isAdult, + contentType = contentType, + startDate = startDate.minusDays(1), + endDate = endDate, + sortType = sortType + ) + } } diff --git a/src/main/kotlin/kr/co/vividnext/sodalive/faq/FaqController.kt b/src/main/kotlin/kr/co/vividnext/sodalive/faq/FaqController.kt index 195d3ea..729667a 100644 --- a/src/main/kotlin/kr/co/vividnext/sodalive/faq/FaqController.kt +++ b/src/main/kotlin/kr/co/vividnext/sodalive/faq/FaqController.kt @@ -31,7 +31,7 @@ class FaqController(private val service: FaqService) { @DeleteMapping("/{id}") @PreAuthorize("hasRole('ADMIN')") - fun deleteCan(@PathVariable id: Long) = ApiResponse.ok(service.delete(id), "삭제되었습니다.") + fun deleteFaq(@PathVariable id: Long) = ApiResponse.ok(service.delete(id), "삭제되었습니다.") @GetMapping fun getFaqList(@RequestParam("category") category: String) = ApiResponse.ok(service.getFaqList(category)) diff --git a/src/main/kotlin/kr/co/vividnext/sodalive/live/recommend/LiveRecommendController.kt b/src/main/kotlin/kr/co/vividnext/sodalive/live/recommend/LiveRecommendController.kt index a7c005c..3b8a252 100644 --- a/src/main/kotlin/kr/co/vividnext/sodalive/live/recommend/LiveRecommendController.kt +++ b/src/main/kotlin/kr/co/vividnext/sodalive/live/recommend/LiveRecommendController.kt @@ -16,8 +16,6 @@ class LiveRecommendController(private val service: LiveRecommendService) { fun getRecommendLive( @AuthenticationPrincipal(expression = "#this == 'anonymousUser' ? null : member") member: Member? ) = run { - if (member == null) throw SodaException("로그인 정보를 확인해주세요.") - ApiResponse.ok(service.getRecommendLive(member)) } @@ -25,8 +23,6 @@ class LiveRecommendController(private val service: LiveRecommendService) { fun getRecommendChannelList( @AuthenticationPrincipal(expression = "#this == 'anonymousUser' ? null : member") member: Member? ) = run { - if (member == null) throw SodaException("로그인 정보를 확인해주세요.") - ApiResponse.ok(service.getRecommendChannelList(member)) } diff --git a/src/main/kotlin/kr/co/vividnext/sodalive/live/recommend/LiveRecommendRepository.kt b/src/main/kotlin/kr/co/vividnext/sodalive/live/recommend/LiveRecommendRepository.kt index b3c3bf5..88ed214 100644 --- a/src/main/kotlin/kr/co/vividnext/sodalive/live/recommend/LiveRecommendRepository.kt +++ b/src/main/kotlin/kr/co/vividnext/sodalive/live/recommend/LiveRecommendRepository.kt @@ -20,7 +20,6 @@ class LiveRecommendRepository( private val cloudFrontHost: String ) { fun getRecommendLive( - memberId: Long, isBlocked: (Long) -> Boolean, isAdult: Boolean ): List { @@ -51,7 +50,6 @@ class LiveRecommendRepository( } fun getOnAirRecommendChannelList( - memberId: Long, isBlocked: (Long) -> Boolean, isCreator: Boolean, isAdult: Boolean @@ -95,7 +93,6 @@ class LiveRecommendRepository( } fun getRecommendChannelList( - memberId: Long, withOutCreatorList: List, limit: Long, isBlocked: (Long) -> Boolean diff --git a/src/main/kotlin/kr/co/vividnext/sodalive/live/recommend/LiveRecommendService.kt b/src/main/kotlin/kr/co/vividnext/sodalive/live/recommend/LiveRecommendService.kt index 5ec9478..67d86fa 100644 --- a/src/main/kotlin/kr/co/vividnext/sodalive/live/recommend/LiveRecommendService.kt +++ b/src/main/kotlin/kr/co/vividnext/sodalive/live/recommend/LiveRecommendService.kt @@ -12,20 +12,30 @@ class LiveRecommendService( private val blockMemberRepository: BlockMemberRepository ) { - fun getRecommendLive(member: Member): List { + fun getRecommendLive(member: Member?): List { return repository.getRecommendLive( - memberId = member.id!!, - isBlocked = { blockMemberRepository.isBlocked(blockedMemberId = member.id!!, memberId = it) }, - isAdult = member.auth != null + isBlocked = { + if (member != null) { + blockMemberRepository.isBlocked(blockedMemberId = member.id!!, memberId = it) + } else { + false + } + }, + isAdult = member?.auth != null ) } - fun getRecommendChannelList(member: Member): List { + fun getRecommendChannelList(member: Member?): List { val onAirChannelList = repository.getOnAirRecommendChannelList( - member.id!!, - isBlocked = { blockMemberRepository.isBlocked(blockedMemberId = member.id!!, memberId = it) }, - isCreator = member.role == MemberRole.CREATOR, - isAdult = member.auth != null + isBlocked = { + if (member != null) { + blockMemberRepository.isBlocked(blockedMemberId = member.id!!, memberId = it) + } else { + false + } + }, + isCreator = member?.role == MemberRole.CREATOR, + isAdult = member?.auth != null ) if (onAirChannelList.size >= 20) { @@ -35,10 +45,15 @@ class LiveRecommendService( val onAirCreatorIdList = onAirChannelList.map { it.creatorId } val notOnAirCreatorList = repository.getRecommendChannelList( - member.id!!, withOutCreatorList = onAirCreatorIdList, limit = (20 - onAirChannelList.size).toLong(), - isBlocked = { blockMemberRepository.isBlocked(blockedMemberId = member.id!!, memberId = it) } + isBlocked = { + if (member != null) { + blockMemberRepository.isBlocked(blockedMemberId = member.id!!, memberId = it) + } else { + false + } + } ) return onAirChannelList + notOnAirCreatorList diff --git a/src/main/kotlin/kr/co/vividnext/sodalive/live/room/LiveRoomController.kt b/src/main/kotlin/kr/co/vividnext/sodalive/live/room/LiveRoomController.kt index 6874e68..74b9bae 100644 --- a/src/main/kotlin/kr/co/vividnext/sodalive/live/room/LiveRoomController.kt +++ b/src/main/kotlin/kr/co/vividnext/sodalive/live/room/LiveRoomController.kt @@ -38,8 +38,6 @@ class LiveRoomController( @AuthenticationPrincipal(expression = "#this == 'anonymousUser' ? null : member") member: Member?, pageable: Pageable ) = run { - if (member == null) throw SodaException("로그인 정보를 확인해주세요.") - ApiResponse.ok( service.getRoomList( dateString, diff --git a/src/main/kotlin/kr/co/vividnext/sodalive/live/room/LiveRoomRepository.kt b/src/main/kotlin/kr/co/vividnext/sodalive/live/room/LiveRoomRepository.kt index e06153b..a648fe2 100644 --- a/src/main/kotlin/kr/co/vividnext/sodalive/live/room/LiveRoomRepository.kt +++ b/src/main/kotlin/kr/co/vividnext/sodalive/live/room/LiveRoomRepository.kt @@ -29,7 +29,7 @@ interface LiveRoomQueryRepository { offset: Long, limit: Long, timezone: String, - memberId: Long, + memberId: Long?, isCreator: Boolean, isAdult: Boolean ): List @@ -38,14 +38,14 @@ interface LiveRoomQueryRepository { date: LocalDateTime, offset: Long, limit: Long, - memberId: Long, + memberId: Long?, isCreator: Boolean, isAdult: Boolean ): List fun getLiveRoomListReservationWithoutDate( timezone: String, - memberId: Long, + memberId: Long?, isCreator: Boolean, isAdult: Boolean ): List @@ -72,7 +72,7 @@ class LiveRoomQueryRepositoryImpl( offset: Long, limit: Long, timezone: String, - memberId: Long, + memberId: Long?, isCreator: Boolean, isAdult: Boolean ): List { @@ -85,7 +85,7 @@ class LiveRoomQueryRepositoryImpl( where = where.and(liveRoom.isAdult.isFalse) } - if (isCreator) { + if (isCreator && memberId != null) { where = where.and( liveRoom.isAvailableJoinCreator.isTrue .or(liveRoom.member.id.eq(memberId)) @@ -112,7 +112,7 @@ class LiveRoomQueryRepositoryImpl( date: LocalDateTime, offset: Long, limit: Long, - memberId: Long, + memberId: Long?, isCreator: Boolean, isAdult: Boolean ): List { @@ -129,7 +129,7 @@ class LiveRoomQueryRepositoryImpl( where = where.and(liveRoom.isAdult.isFalse) } - if (isCreator) { + if (isCreator && memberId != null) { where = where.and( liveRoom.isAvailableJoinCreator.isTrue .or(liveRoom.member.id.eq(memberId)) @@ -148,7 +148,7 @@ class LiveRoomQueryRepositoryImpl( override fun getLiveRoomListReservationWithoutDate( timezone: String, - memberId: Long, + memberId: Long?, isCreator: Boolean, isAdult: Boolean ): List { @@ -169,25 +169,31 @@ class LiveRoomQueryRepositoryImpl( where = where.and(liveRoom.isAdult.isFalse) } - if (isCreator) { + if (isCreator && memberId != null) { where = where.and( liveRoom.isAvailableJoinCreator.isTrue .or(liveRoom.member.id.eq(memberId)) ) } + val orderBy = if (memberId != null) { + listOf( + CaseBuilder() + .`when`(member.id.eq(memberId)).then(1) + .otherwise(2) + .asc(), + liveRoom.beginDateTime.asc() + ) + } else { + listOf(liveRoom.beginDateTime.asc()) + } + return queryFactory .selectFrom(liveRoom) .innerJoin(liveRoom.member, member) .limit(10) .where(where) - .orderBy( - CaseBuilder() - .`when`(member.id.eq(memberId)).then(1) - .otherwise(2) - .asc(), - liveRoom.beginDateTime.asc() - ) + .orderBy(*orderBy.toTypedArray()) .fetch() } diff --git a/src/main/kotlin/kr/co/vividnext/sodalive/live/room/LiveRoomService.kt b/src/main/kotlin/kr/co/vividnext/sodalive/live/room/LiveRoomService.kt index 37ecf7b..8a2b52e 100644 --- a/src/main/kotlin/kr/co/vividnext/sodalive/live/room/LiveRoomService.kt +++ b/src/main/kotlin/kr/co/vividnext/sodalive/live/room/LiveRoomService.kt @@ -118,42 +118,54 @@ class LiveRoomService( status: LiveRoomStatus, isAdultContentVisible: Boolean, pageable: Pageable, - member: Member, + member: Member?, timezone: String ): List { val roomList = if (status == LiveRoomStatus.NOW) { getLiveRoomListNow( pageable, timezone, - memberId = member.id!!, - isCreator = member.role == MemberRole.CREATOR, - isAdult = member.auth != null && isAdultContentVisible + memberId = member?.id, + isCreator = member?.role == MemberRole.CREATOR, + isAdult = member?.auth != null && isAdultContentVisible ) } else if (dateString != null) { getLiveRoomListReservationWithDate( dateString, pageable, timezone, - memberId = member.id!!, - isCreator = member.role == MemberRole.CREATOR, - isAdult = member.auth != null && isAdultContentVisible + memberId = member?.id, + isCreator = member?.role == MemberRole.CREATOR, + isAdult = member?.auth != null && isAdultContentVisible ) } else { getLiveRoomListReservationWithoutDate( timezone, - isCreator = member.role == MemberRole.CREATOR, - memberId = member.id!!, - isAdult = member.auth != null && isAdultContentVisible + isCreator = member?.role == MemberRole.CREATOR, + memberId = member?.id, + isAdult = member?.auth != null && isAdultContentVisible ) } return roomList - .filter { !blockMemberRepository.isBlocked(blockedMemberId = member.id!!, memberId = it.member!!.id!!) } + .filter { + if (member?.id != null) { + !blockMemberRepository.isBlocked(blockedMemberId = member.id!!, memberId = it.member!!.id!!) + } else { + true + } + } .map { val roomInfo = roomInfoRepository.findByIdOrNull(it.id!!) val reservations = it.reservations - .filter { reservation -> reservation.member!!.id!! == member.id!! && reservation.isActive } + .filter { reservation -> + if (member?.id != null) { + reservation.member!!.id!! == member.id!! && reservation.isActive + } else { + true + } + } val beginDateTime = it.beginDateTime .atZone(ZoneId.of("UTC")) @@ -202,7 +214,7 @@ class LiveRoomService( private fun getLiveRoomListNow( pageable: Pageable, timezone: String, - memberId: Long, + memberId: Long?, isCreator: Boolean, isAdult: Boolean ): List { @@ -220,7 +232,7 @@ class LiveRoomService( dateString: String, pageable: Pageable, timezone: String, - memberId: Long, + memberId: Long?, isCreator: Boolean, isAdult: Boolean ): List { @@ -242,7 +254,7 @@ class LiveRoomService( private fun getLiveRoomListReservationWithoutDate( timezone: String, - memberId: Long, + memberId: Long?, isCreator: Boolean, isAdult: Boolean ): List { diff --git a/src/main/kotlin/kr/co/vividnext/sodalive/notice/ServiceNoticeController.kt b/src/main/kotlin/kr/co/vividnext/sodalive/notice/ServiceNoticeController.kt index e4f258f..f93eeaf 100644 --- a/src/main/kotlin/kr/co/vividnext/sodalive/notice/ServiceNoticeController.kt +++ b/src/main/kotlin/kr/co/vividnext/sodalive/notice/ServiceNoticeController.kt @@ -31,7 +31,7 @@ class ServiceNoticeController(private val service: ServiceNoticeService) { @DeleteMapping("/{id}") @PreAuthorize("hasRole('ADMIN')") - fun deleteCan(@PathVariable id: Long) = ApiResponse.ok(service.delete(id), "삭제되었습니다.") + fun deleteNotice(@PathVariable id: Long) = ApiResponse.ok(service.delete(id), "삭제되었습니다.") @GetMapping fun getNoticeList(pageable: Pageable, timezone: String) = ApiResponse.ok(service.getNoticeList(pageable, timezone)) 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..9b3e6f7 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, @@ -53,9 +53,13 @@ class RankingRepository( sortType: String, theme: String = "" ): List { - val blockMemberCondition = blockMember.member.id.eq(member.id) - .and(blockMember.isActive.isTrue) - .and(blockMember.blockedMember.id.eq(memberId)) + val blockMemberCondition = if (memberId != null) { + blockMember.member.id.eq(member.id) + .and(blockMember.isActive.isTrue) + .and(blockMember.blockedMember.id.eq(memberId)) + } else { + null + } var where = audioContent.isActive.isTrue .and(audioContent.member.isActive.isTrue) @@ -64,7 +68,6 @@ class RankingRepository( .and(audioContent.duration.isNotNull) .and(audioContentTheme.isActive.isTrue) .and(audioContent.limited.isNull) - .and(blockMember.id.isNull) if (!isAdult) { where = where.and(audioContent.isAdult.isFalse) @@ -110,7 +113,41 @@ 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) { + where = where.and(blockMember.id.isNull) + select = select.leftJoin(blockMember).on(blockMemberCondition) + } + + select = when (sortType) { + "후원" -> { + select .where( where .and(audioContentComment.isActive.isTrue) @@ -124,11 +161,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 +173,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 +185,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,15 +203,19 @@ class RankingRepository( } fun getSeriesRanking( - memberId: Long, + memberId: Long?, isAdult: Boolean, contentType: ContentType, startDate: LocalDateTime, endDate: LocalDateTime ): List { - val blockMemberCondition = blockMember.member.id.eq(member.id) - .and(blockMember.isActive.isTrue) - .and(blockMember.blockedMember.id.eq(memberId)) + val blockMemberCondition = if (memberId != null) { + blockMember.member.id.eq(member.id) + .and(blockMember.isActive.isTrue) + .and(blockMember.blockedMember.id.eq(memberId)) + } else { + null + } var where = series.isActive.isTrue .and(audioContent.isActive.isTrue) @@ -198,7 +224,6 @@ class RankingRepository( .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)) @@ -221,14 +246,20 @@ 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) { + where = where.and(blockMember.id.isNull) + select = select.leftJoin(blockMember).on(blockMemberCondition) + } + + return select .where(where) .groupBy(series.id) .orderBy( @@ -408,15 +439,19 @@ class RankingRepository( } fun fetchCreatorBySellContentCountRankTop20( - memberId: Long, + memberId: Long?, isAdult: Boolean, contentType: ContentType, startDate: LocalDateTime, endDate: LocalDateTime ): List { - val blockMemberCondition = blockMember.member.id.eq(member.id) - .and(blockMember.isActive.isTrue) - .and(blockMember.blockedMember.id.eq(memberId)) + val blockMemberCondition = if (memberId != null) { + blockMember.member.id.eq(member.id) + .and(blockMember.isActive.isTrue) + .and(blockMember.blockedMember.id.eq(memberId)) + } else { + null + } val ordersCondition = order.audioContent.id.eq(audioContent.id) .and(order.isActive.isTrue) @@ -431,7 +466,6 @@ class RankingRepository( .and(audioContent.price.gt(0)) .and(audioContent.duration.isNotNull) .and(audioContent.limited.isNull) - .and(blockMember.id.isNull) if (!isAdult) { where = where.and(audioContent.isAdult.isFalse) @@ -451,7 +485,7 @@ class RankingRepository( } } - return queryFactory + var select = queryFactory .select( QContentCreatorResponse( member.id, @@ -462,7 +496,13 @@ class RankingRepository( .from(audioContent) .innerJoin(member).on(memberCondition) .leftJoin(order).on(ordersCondition) - .leftJoin(blockMember).on(blockMemberCondition) + + if (memberId != null) { + where = where.and(blockMember.id.isNull) + 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,