Merge pull request 'test' (#294) from test into main

Reviewed-on: #294
This commit is contained in:
klaus 2025-03-24 09:09:16 +00:00
commit f00ea03fad
16 changed files with 232 additions and 115 deletions

View File

@ -18,13 +18,11 @@ class AuditionController(private val service: AuditionService) {
@AuthenticationPrincipal(expression = "#this == 'anonymousUser' ? null : member") member: Member?, @AuthenticationPrincipal(expression = "#this == 'anonymousUser' ? null : member") member: Member?,
pageable: Pageable pageable: Pageable
) = run { ) = run {
if (member == null) throw SodaException("로그인 정보를 확인해주세요.")
ApiResponse.ok( ApiResponse.ok(
service.getAuditionList( service.getAuditionList(
offset = pageable.offset, offset = pageable.offset,
limit = pageable.pageSize.toLong(), limit = pageable.pageSize.toLong(),
isAdult = member.auth != null isAdult = member?.auth != null
) )
) )
} }

View File

@ -8,6 +8,7 @@ import kr.co.vividnext.sodalive.jwt.JwtFilter
import kr.co.vividnext.sodalive.jwt.TokenProvider import kr.co.vividnext.sodalive.jwt.TokenProvider
import org.springframework.context.annotation.Bean import org.springframework.context.annotation.Bean
import org.springframework.context.annotation.Configuration 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.method.configuration.EnableGlobalMethodSecurity
import org.springframework.security.config.annotation.web.builders.HttpSecurity import org.springframework.security.config.annotation.web.builders.HttpSecurity
import org.springframework.security.config.annotation.web.builders.WebSecurity import org.springframework.security.config.annotation.web.builders.WebSecurity
@ -74,6 +75,16 @@ class SecurityConfig(
.antMatchers("/stplat/terms_of_service").permitAll() .antMatchers("/stplat/terms_of_service").permitAll()
.antMatchers("/stplat/privacy_policy").permitAll() .antMatchers("/stplat/privacy_policy").permitAll()
.antMatchers("/charge/ads").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() .anyRequest().authenticated()
.and() .and()
.build() .build()

View File

@ -184,8 +184,6 @@ class AudioContentController(private val service: AudioContentService) {
@AuthenticationPrincipal(expression = "#this == 'anonymousUser' ? null : member") member: Member?, @AuthenticationPrincipal(expression = "#this == 'anonymousUser' ? null : member") member: Member?,
pageable: Pageable pageable: Pageable
) = run { ) = run {
if (member == null) throw SodaException("로그인 정보를 확인해주세요.")
val currentDateTime = LocalDateTime.now() val currentDateTime = LocalDateTime.now()
val startDate = currentDateTime val startDate = currentDateTime
.withHour(15) .withHour(15)
@ -198,7 +196,7 @@ class AudioContentController(private val service: AudioContentService) {
ApiResponse.ok( ApiResponse.ok(
service.getAudioContentRanking( service.getAudioContentRanking(
isAdult = member.auth != null && (isAdultContentVisible ?: true), isAdult = member?.auth != null && (isAdultContentVisible ?: true),
contentType = contentType ?: ContentType.ALL, contentType = contentType ?: ContentType.ALL,
startDate = startDate, startDate = startDate,
endDate = endDate, endDate = endDate,

View File

@ -13,12 +13,12 @@ class AudioContentBannerService(
@Value("\${cloud.aws.cloud-front.host}") @Value("\${cloud.aws.cloud-front.host}")
private val imageHost: String private val imageHost: String
) { ) {
fun getBannerList(tabId: Long, memberId: Long, isAdult: Boolean): List<GetAudioContentBannerResponse> { fun getBannerList(tabId: Long, memberId: Long?, isAdult: Boolean): List<GetAudioContentBannerResponse> {
return repository.getAudioContentMainBannerList(tabId, isAdult) return repository.getAudioContentMainBannerList(tabId, isAdult)
.filter { .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!!) !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!!) !blockMemberRepository.isBlocked(blockedMemberId = memberId, memberId = it.series!!.member!!.id!!)
} else { } else {
true true

View File

@ -1,7 +1,6 @@
package kr.co.vividnext.sodalive.content.main.tab.home package kr.co.vividnext.sodalive.content.main.tab.home
import kr.co.vividnext.sodalive.common.ApiResponse 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.content.ContentType
import kr.co.vividnext.sodalive.member.Member import kr.co.vividnext.sodalive.member.Member
import org.springframework.security.core.annotation.AuthenticationPrincipal import org.springframework.security.core.annotation.AuthenticationPrincipal
@ -19,8 +18,6 @@ class AudioContentMainTabHomeController(private val service: AudioContentMainTab
@RequestParam("contentType", required = false) contentType: ContentType? = null, @RequestParam("contentType", required = false) contentType: ContentType? = null,
@AuthenticationPrincipal(expression = "#this == 'anonymousUser' ? null : member") member: Member? @AuthenticationPrincipal(expression = "#this == 'anonymousUser' ? null : member") member: Member?
) = run { ) = run {
if (member == null) throw SodaException("로그인 정보를 확인해주세요.")
ApiResponse.ok( ApiResponse.ok(
service.fetchData( service.fetchData(
isAdultContentVisible = isAdultContentVisible ?: true, isAdultContentVisible = isAdultContentVisible ?: true,
@ -37,14 +34,29 @@ class AudioContentMainTabHomeController(private val service: AudioContentMainTab
@RequestParam("contentType", required = false) contentType: ContentType? = null, @RequestParam("contentType", required = false) contentType: ContentType? = null,
@AuthenticationPrincipal(expression = "#this == 'anonymousUser' ? null : member") member: Member? @AuthenticationPrincipal(expression = "#this == 'anonymousUser' ? null : member") member: Member?
) = run { ) = run {
if (member == null) throw SodaException("로그인 정보를 확인해주세요.")
ApiResponse.ok( ApiResponse.ok(
service.getPopularContentByCreator( service.getPopularContentByCreator(
creatorId = creatorId, creatorId = creatorId,
isAdult = member.auth != null && (isAdultContentVisible ?: true), isAdult = member?.auth != null && (isAdultContentVisible ?: true),
contentType = contentType ?: ContentType.ALL 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
)
)
}
} }

View File

@ -23,7 +23,7 @@ class AudioContentMainTabHomeService(
fun fetchData( fun fetchData(
isAdultContentVisible: Boolean, isAdultContentVisible: Boolean,
contentType: ContentType, contentType: ContentType,
member: Member member: Member?
): GetContentMainTabHomeResponse { ): GetContentMainTabHomeResponse {
// 주간 랭킹 기간 // 주간 랭킹 기간
val currentDateTime = LocalDateTime.now() val currentDateTime = LocalDateTime.now()
@ -42,7 +42,7 @@ class AudioContentMainTabHomeService(
val formattedLastMonday = startDate.format(startDateFormatter) val formattedLastMonday = startDate.format(startDateFormatter)
val formattedLastSunday = endDate.format(endDateFormatter) val formattedLastSunday = endDate.format(endDateFormatter)
val isAdult = member.auth != null && isAdultContentVisible val isAdult = member?.auth != null && isAdultContentVisible
// 최근 공지사항 // 최근 공지사항
val latestNotice = noticeService.getLatestNotice() val latestNotice = noticeService.getLatestNotice()
@ -50,19 +50,19 @@ class AudioContentMainTabHomeService(
// 메인 배너 (홈) // 메인 배너 (홈)
val contentBannerList = bannerService.getBannerList( val contentBannerList = bannerService.getBannerList(
tabId = 1, tabId = 1,
memberId = member.id!!, memberId = member?.id,
isAdult = isAdult isAdult = isAdult
) )
// 인기 크리에이터 // 인기 크리에이터
val rankCreatorList = rankingService.getCreatorRanking( val rankCreatorList = rankingService.getCreatorRanking(
memberId = member.id!!, memberId = member?.id,
rankingDate = "$formattedLastMonday ~ $formattedLastSunday" rankingDate = "$formattedLastMonday ~ $formattedLastSunday"
) )
// 인기 시리즈 // 인기 시리즈
val rankSeriesList = rankingService.getSeriesRanking( val rankSeriesList = rankingService.getSeriesRanking(
memberId = member.id!!, memberId = member?.id,
isAdult = isAdult, isAdult = isAdult,
contentType = contentType, contentType = contentType,
startDate = startDate.minusDays(1), startDate = startDate.minusDays(1),
@ -71,7 +71,7 @@ class AudioContentMainTabHomeService(
// 인기 콘텐츠 // 인기 콘텐츠
val rankContentList = rankingService.getContentRanking( val rankContentList = rankingService.getContentRanking(
memberId = member.id!!, memberId = member?.id,
isAdult = isAdult, isAdult = isAdult,
contentType = contentType, contentType = contentType,
startDate = startDate.minusDays(1), startDate = startDate.minusDays(1),
@ -82,7 +82,7 @@ class AudioContentMainTabHomeService(
val eventBannerList = eventService.getEventList(isAdult = isAdult) val eventBannerList = eventService.getEventList(isAdult = isAdult)
val contentRankCreatorList = rankingService.fetchCreatorBySellContentCountRankTop20( val contentRankCreatorList = rankingService.fetchCreatorBySellContentCountRankTop20(
memberId = member.id!!, memberId = member?.id,
isAdult = isAdult, isAdult = isAdult,
contentType = contentType, contentType = contentType,
startDate = startDate.minusDays(1), startDate = startDate.minusDays(1),
@ -123,4 +123,32 @@ class AudioContentMainTabHomeService(
contentType = contentType contentType = contentType
) )
} }
fun getContentRanking(
sortType: String,
isAdultContentVisible: Boolean,
contentType: ContentType,
member: Member?
): List<GetAudioContentRankingItem> {
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
)
}
} }

View File

@ -31,7 +31,7 @@ class FaqController(private val service: FaqService) {
@DeleteMapping("/{id}") @DeleteMapping("/{id}")
@PreAuthorize("hasRole('ADMIN')") @PreAuthorize("hasRole('ADMIN')")
fun deleteCan(@PathVariable id: Long) = ApiResponse.ok(service.delete(id), "삭제되었습니다.") fun deleteFaq(@PathVariable id: Long) = ApiResponse.ok(service.delete(id), "삭제되었습니다.")
@GetMapping @GetMapping
fun getFaqList(@RequestParam("category") category: String) = ApiResponse.ok(service.getFaqList(category)) fun getFaqList(@RequestParam("category") category: String) = ApiResponse.ok(service.getFaqList(category))

View File

@ -16,8 +16,6 @@ class LiveRecommendController(private val service: LiveRecommendService) {
fun getRecommendLive( fun getRecommendLive(
@AuthenticationPrincipal(expression = "#this == 'anonymousUser' ? null : member") member: Member? @AuthenticationPrincipal(expression = "#this == 'anonymousUser' ? null : member") member: Member?
) = run { ) = run {
if (member == null) throw SodaException("로그인 정보를 확인해주세요.")
ApiResponse.ok(service.getRecommendLive(member)) ApiResponse.ok(service.getRecommendLive(member))
} }
@ -25,8 +23,6 @@ class LiveRecommendController(private val service: LiveRecommendService) {
fun getRecommendChannelList( fun getRecommendChannelList(
@AuthenticationPrincipal(expression = "#this == 'anonymousUser' ? null : member") member: Member? @AuthenticationPrincipal(expression = "#this == 'anonymousUser' ? null : member") member: Member?
) = run { ) = run {
if (member == null) throw SodaException("로그인 정보를 확인해주세요.")
ApiResponse.ok(service.getRecommendChannelList(member)) ApiResponse.ok(service.getRecommendChannelList(member))
} }

View File

@ -20,7 +20,6 @@ class LiveRecommendRepository(
private val cloudFrontHost: String private val cloudFrontHost: String
) { ) {
fun getRecommendLive( fun getRecommendLive(
memberId: Long,
isBlocked: (Long) -> Boolean, isBlocked: (Long) -> Boolean,
isAdult: Boolean isAdult: Boolean
): List<GetRecommendLiveResponse> { ): List<GetRecommendLiveResponse> {
@ -51,7 +50,6 @@ class LiveRecommendRepository(
} }
fun getOnAirRecommendChannelList( fun getOnAirRecommendChannelList(
memberId: Long,
isBlocked: (Long) -> Boolean, isBlocked: (Long) -> Boolean,
isCreator: Boolean, isCreator: Boolean,
isAdult: Boolean isAdult: Boolean
@ -95,7 +93,6 @@ class LiveRecommendRepository(
} }
fun getRecommendChannelList( fun getRecommendChannelList(
memberId: Long,
withOutCreatorList: List<Long>, withOutCreatorList: List<Long>,
limit: Long, limit: Long,
isBlocked: (Long) -> Boolean isBlocked: (Long) -> Boolean

View File

@ -12,20 +12,30 @@ class LiveRecommendService(
private val blockMemberRepository: BlockMemberRepository private val blockMemberRepository: BlockMemberRepository
) { ) {
fun getRecommendLive(member: Member): List<GetRecommendLiveResponse> { fun getRecommendLive(member: Member?): List<GetRecommendLiveResponse> {
return repository.getRecommendLive( return repository.getRecommendLive(
memberId = member.id!!, isBlocked = {
isBlocked = { blockMemberRepository.isBlocked(blockedMemberId = member.id!!, memberId = it) }, if (member != null) {
isAdult = member.auth != null blockMemberRepository.isBlocked(blockedMemberId = member.id!!, memberId = it)
} else {
false
}
},
isAdult = member?.auth != null
) )
} }
fun getRecommendChannelList(member: Member): List<GetRecommendChannelResponse> { fun getRecommendChannelList(member: Member?): List<GetRecommendChannelResponse> {
val onAirChannelList = repository.getOnAirRecommendChannelList( val onAirChannelList = repository.getOnAirRecommendChannelList(
member.id!!, isBlocked = {
isBlocked = { blockMemberRepository.isBlocked(blockedMemberId = member.id!!, memberId = it) }, if (member != null) {
isCreator = member.role == MemberRole.CREATOR, blockMemberRepository.isBlocked(blockedMemberId = member.id!!, memberId = it)
isAdult = member.auth != null } else {
false
}
},
isCreator = member?.role == MemberRole.CREATOR,
isAdult = member?.auth != null
) )
if (onAirChannelList.size >= 20) { if (onAirChannelList.size >= 20) {
@ -35,10 +45,15 @@ class LiveRecommendService(
val onAirCreatorIdList = onAirChannelList.map { it.creatorId } val onAirCreatorIdList = onAirChannelList.map { it.creatorId }
val notOnAirCreatorList = repository.getRecommendChannelList( val notOnAirCreatorList = repository.getRecommendChannelList(
member.id!!,
withOutCreatorList = onAirCreatorIdList, withOutCreatorList = onAirCreatorIdList,
limit = (20 - onAirChannelList.size).toLong(), 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 return onAirChannelList + notOnAirCreatorList

View File

@ -38,8 +38,6 @@ class LiveRoomController(
@AuthenticationPrincipal(expression = "#this == 'anonymousUser' ? null : member") member: Member?, @AuthenticationPrincipal(expression = "#this == 'anonymousUser' ? null : member") member: Member?,
pageable: Pageable pageable: Pageable
) = run { ) = run {
if (member == null) throw SodaException("로그인 정보를 확인해주세요.")
ApiResponse.ok( ApiResponse.ok(
service.getRoomList( service.getRoomList(
dateString, dateString,

View File

@ -29,7 +29,7 @@ interface LiveRoomQueryRepository {
offset: Long, offset: Long,
limit: Long, limit: Long,
timezone: String, timezone: String,
memberId: Long, memberId: Long?,
isCreator: Boolean, isCreator: Boolean,
isAdult: Boolean isAdult: Boolean
): List<LiveRoom> ): List<LiveRoom>
@ -38,14 +38,14 @@ interface LiveRoomQueryRepository {
date: LocalDateTime, date: LocalDateTime,
offset: Long, offset: Long,
limit: Long, limit: Long,
memberId: Long, memberId: Long?,
isCreator: Boolean, isCreator: Boolean,
isAdult: Boolean isAdult: Boolean
): List<LiveRoom> ): List<LiveRoom>
fun getLiveRoomListReservationWithoutDate( fun getLiveRoomListReservationWithoutDate(
timezone: String, timezone: String,
memberId: Long, memberId: Long?,
isCreator: Boolean, isCreator: Boolean,
isAdult: Boolean isAdult: Boolean
): List<LiveRoom> ): List<LiveRoom>
@ -72,7 +72,7 @@ class LiveRoomQueryRepositoryImpl(
offset: Long, offset: Long,
limit: Long, limit: Long,
timezone: String, timezone: String,
memberId: Long, memberId: Long?,
isCreator: Boolean, isCreator: Boolean,
isAdult: Boolean isAdult: Boolean
): List<LiveRoom> { ): List<LiveRoom> {
@ -85,7 +85,7 @@ class LiveRoomQueryRepositoryImpl(
where = where.and(liveRoom.isAdult.isFalse) where = where.and(liveRoom.isAdult.isFalse)
} }
if (isCreator) { if (isCreator && memberId != null) {
where = where.and( where = where.and(
liveRoom.isAvailableJoinCreator.isTrue liveRoom.isAvailableJoinCreator.isTrue
.or(liveRoom.member.id.eq(memberId)) .or(liveRoom.member.id.eq(memberId))
@ -112,7 +112,7 @@ class LiveRoomQueryRepositoryImpl(
date: LocalDateTime, date: LocalDateTime,
offset: Long, offset: Long,
limit: Long, limit: Long,
memberId: Long, memberId: Long?,
isCreator: Boolean, isCreator: Boolean,
isAdult: Boolean isAdult: Boolean
): List<LiveRoom> { ): List<LiveRoom> {
@ -129,7 +129,7 @@ class LiveRoomQueryRepositoryImpl(
where = where.and(liveRoom.isAdult.isFalse) where = where.and(liveRoom.isAdult.isFalse)
} }
if (isCreator) { if (isCreator && memberId != null) {
where = where.and( where = where.and(
liveRoom.isAvailableJoinCreator.isTrue liveRoom.isAvailableJoinCreator.isTrue
.or(liveRoom.member.id.eq(memberId)) .or(liveRoom.member.id.eq(memberId))
@ -148,7 +148,7 @@ class LiveRoomQueryRepositoryImpl(
override fun getLiveRoomListReservationWithoutDate( override fun getLiveRoomListReservationWithoutDate(
timezone: String, timezone: String,
memberId: Long, memberId: Long?,
isCreator: Boolean, isCreator: Boolean,
isAdult: Boolean isAdult: Boolean
): List<LiveRoom> { ): List<LiveRoom> {
@ -169,25 +169,31 @@ class LiveRoomQueryRepositoryImpl(
where = where.and(liveRoom.isAdult.isFalse) where = where.and(liveRoom.isAdult.isFalse)
} }
if (isCreator) { if (isCreator && memberId != null) {
where = where.and( where = where.and(
liveRoom.isAvailableJoinCreator.isTrue liveRoom.isAvailableJoinCreator.isTrue
.or(liveRoom.member.id.eq(memberId)) .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 return queryFactory
.selectFrom(liveRoom) .selectFrom(liveRoom)
.innerJoin(liveRoom.member, member) .innerJoin(liveRoom.member, member)
.limit(10) .limit(10)
.where(where) .where(where)
.orderBy( .orderBy(*orderBy.toTypedArray())
CaseBuilder()
.`when`(member.id.eq(memberId)).then(1)
.otherwise(2)
.asc(),
liveRoom.beginDateTime.asc()
)
.fetch() .fetch()
} }

View File

@ -118,42 +118,54 @@ class LiveRoomService(
status: LiveRoomStatus, status: LiveRoomStatus,
isAdultContentVisible: Boolean, isAdultContentVisible: Boolean,
pageable: Pageable, pageable: Pageable,
member: Member, member: Member?,
timezone: String timezone: String
): List<GetRoomListResponse> { ): List<GetRoomListResponse> {
val roomList = if (status == LiveRoomStatus.NOW) { val roomList = if (status == LiveRoomStatus.NOW) {
getLiveRoomListNow( getLiveRoomListNow(
pageable, pageable,
timezone, timezone,
memberId = member.id!!, memberId = member?.id,
isCreator = member.role == MemberRole.CREATOR, isCreator = member?.role == MemberRole.CREATOR,
isAdult = member.auth != null && isAdultContentVisible isAdult = member?.auth != null && isAdultContentVisible
) )
} else if (dateString != null) { } else if (dateString != null) {
getLiveRoomListReservationWithDate( getLiveRoomListReservationWithDate(
dateString, dateString,
pageable, pageable,
timezone, timezone,
memberId = member.id!!, memberId = member?.id,
isCreator = member.role == MemberRole.CREATOR, isCreator = member?.role == MemberRole.CREATOR,
isAdult = member.auth != null && isAdultContentVisible isAdult = member?.auth != null && isAdultContentVisible
) )
} else { } else {
getLiveRoomListReservationWithoutDate( getLiveRoomListReservationWithoutDate(
timezone, timezone,
isCreator = member.role == MemberRole.CREATOR, isCreator = member?.role == MemberRole.CREATOR,
memberId = member.id!!, memberId = member?.id,
isAdult = member.auth != null && isAdultContentVisible isAdult = member?.auth != null && isAdultContentVisible
) )
} }
return roomList 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 { .map {
val roomInfo = roomInfoRepository.findByIdOrNull(it.id!!) val roomInfo = roomInfoRepository.findByIdOrNull(it.id!!)
val reservations = it.reservations 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 val beginDateTime = it.beginDateTime
.atZone(ZoneId.of("UTC")) .atZone(ZoneId.of("UTC"))
@ -202,7 +214,7 @@ class LiveRoomService(
private fun getLiveRoomListNow( private fun getLiveRoomListNow(
pageable: Pageable, pageable: Pageable,
timezone: String, timezone: String,
memberId: Long, memberId: Long?,
isCreator: Boolean, isCreator: Boolean,
isAdult: Boolean isAdult: Boolean
): List<LiveRoom> { ): List<LiveRoom> {
@ -220,7 +232,7 @@ class LiveRoomService(
dateString: String, dateString: String,
pageable: Pageable, pageable: Pageable,
timezone: String, timezone: String,
memberId: Long, memberId: Long?,
isCreator: Boolean, isCreator: Boolean,
isAdult: Boolean isAdult: Boolean
): List<LiveRoom> { ): List<LiveRoom> {
@ -242,7 +254,7 @@ class LiveRoomService(
private fun getLiveRoomListReservationWithoutDate( private fun getLiveRoomListReservationWithoutDate(
timezone: String, timezone: String,
memberId: Long, memberId: Long?,
isCreator: Boolean, isCreator: Boolean,
isAdult: Boolean isAdult: Boolean
): List<LiveRoom> { ): List<LiveRoom> {

View File

@ -31,7 +31,7 @@ class ServiceNoticeController(private val service: ServiceNoticeService) {
@DeleteMapping("/{id}") @DeleteMapping("/{id}")
@PreAuthorize("hasRole('ADMIN')") @PreAuthorize("hasRole('ADMIN')")
fun deleteCan(@PathVariable id: Long) = ApiResponse.ok(service.delete(id), "삭제되었습니다.") fun deleteNotice(@PathVariable id: Long) = ApiResponse.ok(service.delete(id), "삭제되었습니다.")
@GetMapping @GetMapping
fun getNoticeList(pageable: Pageable, timezone: String) = ApiResponse.ok(service.getNoticeList(pageable, timezone)) fun getNoticeList(pageable: Pageable, timezone: String) = ApiResponse.ok(service.getNoticeList(pageable, timezone))

View File

@ -43,7 +43,7 @@ class RankingRepository(
} }
fun getAudioContentRanking( fun getAudioContentRanking(
memberId: Long, memberId: Long?,
isAdult: Boolean, isAdult: Boolean,
contentType: ContentType, contentType: ContentType,
startDate: LocalDateTime, startDate: LocalDateTime,
@ -53,9 +53,13 @@ class RankingRepository(
sortType: String, sortType: String,
theme: String = "" theme: String = ""
): List<GetAudioContentRankingItem> { ): List<GetAudioContentRankingItem> {
val blockMemberCondition = blockMember.member.id.eq(member.id) val blockMemberCondition = if (memberId != null) {
.and(blockMember.isActive.isTrue) blockMember.member.id.eq(member.id)
.and(blockMember.blockedMember.id.eq(memberId)) .and(blockMember.isActive.isTrue)
.and(blockMember.blockedMember.id.eq(memberId))
} else {
null
}
var where = audioContent.isActive.isTrue var where = audioContent.isActive.isTrue
.and(audioContent.member.isActive.isTrue) .and(audioContent.member.isActive.isTrue)
@ -64,7 +68,6 @@ class RankingRepository(
.and(audioContent.duration.isNotNull) .and(audioContent.duration.isNotNull)
.and(audioContentTheme.isActive.isTrue) .and(audioContentTheme.isActive.isTrue)
.and(audioContent.limited.isNull) .and(audioContent.limited.isNull)
.and(blockMember.id.isNull)
if (!isAdult) { if (!isAdult) {
where = where.and(audioContent.isAdult.isFalse) where = where.and(audioContent.isAdult.isFalse)
@ -110,7 +113,41 @@ class RankingRepository(
.innerJoin(audioContentComment.audioContent, audioContent) .innerJoin(audioContentComment.audioContent, audioContent)
.innerJoin(audioContent.member, member) .innerJoin(audioContent.member, member)
.innerJoin(audioContent.theme, audioContentTheme) .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(
where where
.and(audioContentComment.isActive.isTrue) .and(audioContentComment.isActive.isTrue)
@ -124,11 +161,6 @@ class RankingRepository(
"댓글" -> { "댓글" -> {
select select
.from(audioContentComment)
.innerJoin(audioContentComment.audioContent, audioContent)
.innerJoin(audioContent.member, member)
.innerJoin(audioContent.theme, audioContentTheme)
.leftJoin(blockMember).on(blockMemberCondition)
.where( .where(
where where
.and(audioContentComment.isActive.isTrue) .and(audioContentComment.isActive.isTrue)
@ -141,11 +173,6 @@ class RankingRepository(
"좋아요" -> { "좋아요" -> {
select select
.from(audioContentLike)
.innerJoin(audioContentLike.audioContent, audioContent)
.innerJoin(audioContent.member, member)
.innerJoin(audioContent.theme, audioContentTheme)
.leftJoin(blockMember).on(blockMemberCondition)
.where( .where(
where where
.and(audioContentLike.isActive.isTrue) .and(audioContentLike.isActive.isTrue)
@ -158,11 +185,6 @@ class RankingRepository(
else -> { else -> {
select select
.from(order)
.innerJoin(order.audioContent, audioContent)
.innerJoin(audioContent.member, member)
.innerJoin(audioContent.theme, audioContentTheme)
.leftJoin(blockMember).on(blockMemberCondition)
.where( .where(
where where
.and(order.isActive.isTrue) .and(order.isActive.isTrue)
@ -181,15 +203,19 @@ class RankingRepository(
} }
fun getSeriesRanking( fun getSeriesRanking(
memberId: Long, memberId: Long?,
isAdult: Boolean, isAdult: Boolean,
contentType: ContentType, contentType: ContentType,
startDate: LocalDateTime, startDate: LocalDateTime,
endDate: LocalDateTime endDate: LocalDateTime
): List<Series> { ): List<Series> {
val blockMemberCondition = blockMember.member.id.eq(member.id) val blockMemberCondition = if (memberId != null) {
.and(blockMember.isActive.isTrue) blockMember.member.id.eq(member.id)
.and(blockMember.blockedMember.id.eq(memberId)) .and(blockMember.isActive.isTrue)
.and(blockMember.blockedMember.id.eq(memberId))
} else {
null
}
var where = series.isActive.isTrue var where = series.isActive.isTrue
.and(audioContent.isActive.isTrue) .and(audioContent.isActive.isTrue)
@ -198,7 +224,6 @@ class RankingRepository(
.and(member.role.eq(MemberRole.CREATOR)) .and(member.role.eq(MemberRole.CREATOR))
.and(audioContent.duration.isNotNull) .and(audioContent.duration.isNotNull)
.and(audioContent.limited.isNull) .and(audioContent.limited.isNull)
.and(blockMember.id.isNull)
.and(order.isActive.isTrue) .and(order.isActive.isTrue)
.and(order.createdAt.goe(startDate)) .and(order.createdAt.goe(startDate))
.and(order.createdAt.lt(endDate)) .and(order.createdAt.lt(endDate))
@ -221,14 +246,20 @@ class RankingRepository(
} }
} }
return queryFactory var select = queryFactory
.select(series) .select(series)
.from(seriesContent) .from(seriesContent)
.innerJoin(seriesContent.series, series) .innerJoin(seriesContent.series, series)
.innerJoin(seriesContent.content, audioContent) .innerJoin(seriesContent.content, audioContent)
.innerJoin(series.member, member) .innerJoin(series.member, member)
.leftJoin(order).on(audioContent.id.eq(order.audioContent.id)) .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) .where(where)
.groupBy(series.id) .groupBy(series.id)
.orderBy( .orderBy(
@ -408,15 +439,19 @@ class RankingRepository(
} }
fun fetchCreatorBySellContentCountRankTop20( fun fetchCreatorBySellContentCountRankTop20(
memberId: Long, memberId: Long?,
isAdult: Boolean, isAdult: Boolean,
contentType: ContentType, contentType: ContentType,
startDate: LocalDateTime, startDate: LocalDateTime,
endDate: LocalDateTime endDate: LocalDateTime
): List<ContentCreatorResponse> { ): List<ContentCreatorResponse> {
val blockMemberCondition = blockMember.member.id.eq(member.id) val blockMemberCondition = if (memberId != null) {
.and(blockMember.isActive.isTrue) blockMember.member.id.eq(member.id)
.and(blockMember.blockedMember.id.eq(memberId)) .and(blockMember.isActive.isTrue)
.and(blockMember.blockedMember.id.eq(memberId))
} else {
null
}
val ordersCondition = order.audioContent.id.eq(audioContent.id) val ordersCondition = order.audioContent.id.eq(audioContent.id)
.and(order.isActive.isTrue) .and(order.isActive.isTrue)
@ -431,7 +466,6 @@ class RankingRepository(
.and(audioContent.price.gt(0)) .and(audioContent.price.gt(0))
.and(audioContent.duration.isNotNull) .and(audioContent.duration.isNotNull)
.and(audioContent.limited.isNull) .and(audioContent.limited.isNull)
.and(blockMember.id.isNull)
if (!isAdult) { if (!isAdult) {
where = where.and(audioContent.isAdult.isFalse) where = where.and(audioContent.isAdult.isFalse)
@ -451,7 +485,7 @@ class RankingRepository(
} }
} }
return queryFactory var select = queryFactory
.select( .select(
QContentCreatorResponse( QContentCreatorResponse(
member.id, member.id,
@ -462,7 +496,13 @@ class RankingRepository(
.from(audioContent) .from(audioContent)
.innerJoin(member).on(memberCondition) .innerJoin(member).on(memberCondition)
.leftJoin(order).on(ordersCondition) .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) .where(where)
.groupBy(member.id) .groupBy(member.id)
.having(audioContent.id.count().goe(4)) .having(audioContent.id.count().goe(4))

View File

@ -23,10 +23,16 @@ class RankingService(
@Value("\${cloud.aws.cloud-front.host}") @Value("\${cloud.aws.cloud-front.host}")
private val imageHost: String private val imageHost: String
) { ) {
fun getCreatorRanking(memberId: Long, rankingDate: String): GetExplorerSectionResponse { fun getCreatorRanking(memberId: Long?, rankingDate: String): GetExplorerSectionResponse {
val creatorRankings = repository val creatorRankings = repository
.getCreatorRankings() .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) } .map { it.toExplorerSectionCreator(imageHost) }
return GetExplorerSectionResponse( return GetExplorerSectionResponse(
@ -39,7 +45,7 @@ class RankingService(
} }
fun getContentRanking( fun getContentRanking(
memberId: Long, memberId: Long?,
isAdult: Boolean, isAdult: Boolean,
contentType: ContentType, contentType: ContentType,
startDate: LocalDateTime, startDate: LocalDateTime,
@ -71,7 +77,7 @@ class RankingService(
} }
fun getSeriesRanking( fun getSeriesRanking(
memberId: Long, memberId: Long?,
isAdult: Boolean, isAdult: Boolean,
contentType: ContentType, contentType: ContentType,
startDate: LocalDateTime, startDate: LocalDateTime,
@ -211,7 +217,7 @@ class RankingService(
} }
fun fetchCreatorBySellContentCountRankTop20( fun fetchCreatorBySellContentCountRankTop20(
memberId: Long, memberId: Long?,
isAdult: Boolean, isAdult: Boolean,
contentType: ContentType, contentType: ContentType,
startDate: LocalDateTime, startDate: LocalDateTime,