fix(content-preference): 조회 선호도 오버라이드 파라미터를 제거해 저장값만 사용한다

This commit is contained in:
2026-03-28 00:51:19 +09:00
parent ae68886bdb
commit ff47a7686a
23 changed files with 183 additions and 353 deletions

View File

@@ -405,11 +405,7 @@ class HomeService(
)
}
return memberContentPreferenceService.resolveForQuery(
member = member,
isAdultContentVisible = isAdultContentVisible,
contentType = contentType
)
return memberContentPreferenceService.resolveForQuery(member = member)
}
private fun pickByTimeDecay(

View File

@@ -112,10 +112,6 @@ class LiveApiService(
)
}
return memberContentPreferenceService.resolveForQuery(
member = member,
isAdultContentVisible = isAdultContentVisible,
contentType = contentType
)
return memberContentPreferenceService.resolveForQuery(member = member)
}
}

View File

@@ -306,10 +306,6 @@ class AudioContentController(
)
}
return memberContentPreferenceService.resolveForQuery(
member = member,
isAdultContentVisible = isAdultContentVisible,
contentType = contentType
)
return memberContentPreferenceService.resolveForQuery(member = member)
}
}

View File

@@ -2,7 +2,6 @@ package kr.co.vividnext.sodalive.content.main
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.order.OrderService
import kr.co.vividnext.sodalive.member.Member
import kr.co.vividnext.sodalive.member.contentpreference.MemberContentPreferenceService
@@ -25,7 +24,7 @@ class AudioContentMainController(
@AuthenticationPrincipal(expression = "#this == 'anonymousUser' ? null : member") member: Member?
) = run {
if (member == null) throw SodaException(messageKey = "common.error.bad_credentials")
val preference = resolvePreference(member, null, null)
val preference = resolvePreference(member)
ApiResponse.ok(
service.getNewContentUploadCreatorList(
@@ -40,7 +39,7 @@ class AudioContentMainController(
@AuthenticationPrincipal(expression = "#this == 'anonymousUser' ? null : member") member: Member?
) = run {
if (member == null) throw SodaException(messageKey = "common.error.bad_credentials")
val preference = resolvePreference(member, null, null)
val preference = resolvePreference(member)
ApiResponse.ok(
service.getAudioContentMainBannerList(
@@ -67,13 +66,11 @@ class AudioContentMainController(
@GetMapping("/new")
fun getNewContentByTheme(
@RequestParam("theme") theme: String,
@RequestParam("isAdultContentVisible", required = false) isAdultContentVisible: Boolean? = null,
@RequestParam("contentType", required = false) contentType: ContentType? = null,
@AuthenticationPrincipal(expression = "#this == 'anonymousUser' ? null : member") member: Member?,
pageable: Pageable
) = run {
if (member == null) throw SodaException(messageKey = "common.error.bad_credentials")
val preference = resolvePreference(member, isAdultContentVisible, contentType)
val preference = resolvePreference(member)
ApiResponse.ok(
service.getNewContentByTheme(
@@ -88,12 +85,10 @@ class AudioContentMainController(
@GetMapping("/theme")
fun getThemeList(
@RequestParam("isAdultContentVisible", required = false) isAdultContentVisible: Boolean? = null,
@RequestParam("contentType", required = false) contentType: ContentType? = null,
@AuthenticationPrincipal(expression = "#this == 'anonymousUser' ? null : member") member: Member?
) = run {
if (member == null) throw SodaException(messageKey = "common.error.bad_credentials")
val preference = resolvePreference(member, isAdultContentVisible, contentType)
val preference = resolvePreference(member)
ApiResponse.ok(
service.getThemeList(
@@ -106,13 +101,11 @@ class AudioContentMainController(
@GetMapping("/new/all")
fun getNewContentAllByTheme(
@RequestParam("theme") theme: String,
@RequestParam("isAdultContentVisible", required = false) isAdultContentVisible: Boolean? = null,
@RequestParam("contentType", required = false) contentType: ContentType? = null,
@AuthenticationPrincipal(expression = "#this == 'anonymousUser' ? null : member") member: Member?,
pageable: Pageable
) = run {
if (member == null) throw SodaException(messageKey = "common.error.bad_credentials")
val preference = resolvePreference(member, isAdultContentVisible, contentType)
val preference = resolvePreference(member)
ApiResponse.ok(
service.getNewContentFor2WeeksByTheme(
@@ -127,13 +120,11 @@ class AudioContentMainController(
@GetMapping("/curation-list")
fun getCurationList(
@RequestParam("isAdultContentVisible", required = false) isAdultContentVisible: Boolean? = null,
@RequestParam("contentType", required = false) contentType: ContentType? = null,
@AuthenticationPrincipal(expression = "#this == 'anonymousUser' ? null : member") member: Member?,
pageable: Pageable
) = run {
if (member == null) throw SodaException(messageKey = "common.error.bad_credentials")
val preference = resolvePreference(member, isAdultContentVisible, contentType)
val preference = resolvePreference(member)
ApiResponse.ok(
service.getAudioContentCurationListWithPaging(
@@ -146,13 +137,5 @@ class AudioContentMainController(
)
}
private fun resolvePreference(
member: Member,
isAdultContentVisible: Boolean?,
contentType: ContentType?
) = memberContentPreferenceService.resolveForQuery(
member = member,
isAdultContentVisible = isAdultContentVisible,
contentType = contentType
)
private fun resolvePreference(member: Member) = memberContentPreferenceService.resolveForQuery(member = member)
}

View File

@@ -2,7 +2,6 @@ package kr.co.vividnext.sodalive.content.main.curation
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.SortType
import kr.co.vividnext.sodalive.member.Member
import kr.co.vividnext.sodalive.member.contentpreference.MemberContentPreferenceService
@@ -23,14 +22,12 @@ class AudioContentCurationController(
@GetMapping("/{id}")
fun getCurationContent(
@PathVariable id: Long,
@RequestParam("isAdultContentVisible", required = false) isAdultContentVisible: Boolean? = null,
@RequestParam("contentType", required = false) contentType: ContentType? = null,
@RequestParam("sort-type", required = false) sortType: SortType? = SortType.NEWEST,
@AuthenticationPrincipal(expression = "#this == 'anonymousUser' ? null : member") member: Member?,
pageable: Pageable
) = run {
if (member == null) throw SodaException("로그인 정보를 확인해주세요.")
val preference = resolvePreference(member, isAdultContentVisible, contentType)
val preference = resolvePreference(member)
ApiResponse.ok(
service.getCurationContent(
@@ -44,13 +41,5 @@ class AudioContentCurationController(
)
}
private fun resolvePreference(
member: Member,
isAdultContentVisible: Boolean?,
contentType: ContentType?
) = memberContentPreferenceService.resolveForQuery(
member = member,
isAdultContentVisible = isAdultContentVisible,
contentType = contentType
)
private fun resolvePreference(member: Member) = memberContentPreferenceService.resolveForQuery(member = member)
}

View File

@@ -2,7 +2,6 @@ package kr.co.vividnext.sodalive.content.main.tab.alarm
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 kr.co.vividnext.sodalive.member.contentpreference.MemberContentPreferenceService
import org.springframework.data.domain.Pageable
@@ -20,12 +19,10 @@ class AudioContentMainTabAlarmController(
) {
@GetMapping
fun fetchContentMainTabAlarm(
@RequestParam("isAdultContentVisible", required = false) isAdultContentVisible: Boolean? = null,
@RequestParam("contentType", required = false) contentType: ContentType? = null,
@AuthenticationPrincipal(expression = "#this == 'anonymousUser' ? null : member") member: Member?
) = run {
if (member == null) throw SodaException("로그인 정보를 확인해주세요.")
val preference = resolvePreference(member, isAdultContentVisible, contentType)
val preference = resolvePreference(member)
ApiResponse.ok(
service.fetchData(
@@ -39,13 +36,11 @@ class AudioContentMainTabAlarmController(
@GetMapping("/all")
fun fetchAlarmContentByTheme(
@RequestParam("theme") theme: String,
@RequestParam("isAdultContentVisible", required = false) isAdultContentVisible: Boolean? = null,
@RequestParam("contentType", required = false) contentType: ContentType? = null,
@AuthenticationPrincipal(expression = "#this == 'anonymousUser' ? null : member") member: Member?,
pageable: Pageable
) = run {
if (member == null) throw SodaException("로그인 정보를 확인해주세요.")
val preference = resolvePreference(member, isAdultContentVisible, contentType)
val preference = resolvePreference(member)
ApiResponse.ok(
service.fetchAlarmContentByTheme(
@@ -59,13 +54,5 @@ class AudioContentMainTabAlarmController(
)
}
private fun resolvePreference(
member: Member,
isAdultContentVisible: Boolean?,
contentType: ContentType?
) = memberContentPreferenceService.resolveForQuery(
member = member,
isAdultContentVisible = isAdultContentVisible,
contentType = contentType
)
private fun resolvePreference(member: Member) = memberContentPreferenceService.resolveForQuery(member = member)
}

View File

@@ -2,7 +2,6 @@ package kr.co.vividnext.sodalive.content.main.tab.asmr
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 kr.co.vividnext.sodalive.member.contentpreference.MemberContentPreferenceService
import org.springframework.security.core.annotation.AuthenticationPrincipal
@@ -19,12 +18,10 @@ class AudioContentMainTabAsmrController(
) {
@GetMapping
fun fetchContentMainTabAsmr(
@RequestParam("isAdultContentVisible", required = false) isAdultContentVisible: Boolean? = null,
@RequestParam("contentType", required = false) contentType: ContentType? = null,
@AuthenticationPrincipal(expression = "#this == 'anonymousUser' ? null : member") member: Member?
) = run {
if (member == null) throw SodaException("로그인 정보를 확인해주세요.")
val preference = resolvePreference(member, isAdultContentVisible, contentType)
val preference = resolvePreference(member)
ApiResponse.ok(
service.fetchData(
@@ -38,12 +35,10 @@ class AudioContentMainTabAsmrController(
@GetMapping("/popular-content-by-creator")
fun getPopularContentByCreator(
@RequestParam creatorId: Long,
@RequestParam("isAdultContentVisible", required = false) isAdultContentVisible: Boolean? = null,
@RequestParam("contentType", required = false) contentType: ContentType? = null,
@AuthenticationPrincipal(expression = "#this == 'anonymousUser' ? null : member") member: Member?
) = run {
if (member == null) throw SodaException("로그인 정보를 확인해주세요.")
val preference = resolvePreference(member, isAdultContentVisible, contentType)
val preference = resolvePreference(member)
ApiResponse.ok(
service.getPopularContentByCreator(
@@ -54,13 +49,5 @@ class AudioContentMainTabAsmrController(
)
}
private fun resolvePreference(
member: Member,
isAdultContentVisible: Boolean?,
contentType: ContentType?
) = memberContentPreferenceService.resolveForQuery(
member = member,
isAdultContentVisible = isAdultContentVisible,
contentType = contentType
)
private fun resolvePreference(member: Member) = memberContentPreferenceService.resolveForQuery(member = member)
}

View File

@@ -2,7 +2,6 @@ package kr.co.vividnext.sodalive.content.main.tab.content
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 kr.co.vividnext.sodalive.member.contentpreference.MemberContentPreferenceService
import org.springframework.data.domain.Pageable
@@ -20,12 +19,10 @@ class AudioContentMainTabContentController(
) {
@GetMapping
fun fetchContentMainTabContent(
@RequestParam("isAdultContentVisible", required = false) isAdultContentVisible: Boolean? = null,
@RequestParam("contentType", required = false) contentType: ContentType? = null,
@AuthenticationPrincipal(expression = "#this == 'anonymousUser' ? null : member") member: Member?
) = run {
if (member == null) throw SodaException("로그인 정보를 확인해주세요.")
val preference = resolvePreference(member, isAdultContentVisible, contentType)
val preference = resolvePreference(member)
ApiResponse.ok(
service.fetchData(
@@ -39,13 +36,11 @@ class AudioContentMainTabContentController(
@GetMapping("/ranking")
fun getAudioContentRanking(
@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?,
pageable: Pageable
) = run {
if (member == null) throw SodaException("로그인 정보를 확인해주세요.")
val preference = resolvePreference(member, isAdultContentVisible, contentType)
val preference = resolvePreference(member)
ApiResponse.ok(
service.getAudioContentRanking(
@@ -60,13 +55,11 @@ class AudioContentMainTabContentController(
@GetMapping("/new-content-by-theme")
fun getNewContentByTheme(
@RequestParam("theme") theme: String,
@RequestParam("isAdultContentVisible", required = false) isAdultContentVisible: Boolean? = null,
@RequestParam("contentType", required = false) contentType: ContentType? = null,
@AuthenticationPrincipal(expression = "#this == 'anonymousUser' ? null : member") member: Member?,
pageable: Pageable
) = run {
if (member == null) throw SodaException("로그인 정보를 확인해주세요.")
val preference = resolvePreference(member, isAdultContentVisible, contentType)
val preference = resolvePreference(member)
ApiResponse.ok(
service.getNewContentByTheme(
@@ -81,12 +74,10 @@ class AudioContentMainTabContentController(
@GetMapping("/popular-content-by-creator")
fun getPopularContentByCreator(
@RequestParam creatorId: Long,
@RequestParam("isAdultContentVisible", required = false) isAdultContentVisible: Boolean? = null,
@RequestParam("contentType", required = false) contentType: ContentType? = null,
@AuthenticationPrincipal(expression = "#this == 'anonymousUser' ? null : member") member: Member?
) = run {
if (member == null) throw SodaException("로그인 정보를 확인해주세요.")
val preference = resolvePreference(member, isAdultContentVisible, contentType)
val preference = resolvePreference(member)
ApiResponse.ok(
service.getPopularContentByCreator(
@@ -100,12 +91,10 @@ class AudioContentMainTabContentController(
@GetMapping("/recommend-content-by-tag")
fun getRecommendedContentByTag(
@RequestParam tag: String,
@RequestParam("isAdultContentVisible", required = false) isAdultContentVisible: Boolean? = null,
@RequestParam("contentType", required = false) contentType: ContentType? = null,
@AuthenticationPrincipal(expression = "#this == 'anonymousUser' ? null : member") member: Member?
) = run {
if (member == null) throw SodaException("로그인 정보를 확인해주세요.")
val preference = resolvePreference(member, isAdultContentVisible, contentType)
val preference = resolvePreference(member)
ApiResponse.ok(
service.getRecommendedContentByTag(
memberId = member.id!!,
@@ -116,13 +105,5 @@ class AudioContentMainTabContentController(
)
}
private fun resolvePreference(
member: Member,
isAdultContentVisible: Boolean?,
contentType: ContentType?
) = memberContentPreferenceService.resolveForQuery(
member = member,
isAdultContentVisible = isAdultContentVisible,
contentType = contentType
)
private fun resolvePreference(member: Member) = memberContentPreferenceService.resolveForQuery(member = member)
}

View File

@@ -2,7 +2,6 @@ package kr.co.vividnext.sodalive.content.main.tab.free
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 kr.co.vividnext.sodalive.member.contentpreference.MemberContentPreferenceService
import org.springframework.data.domain.Pageable
@@ -20,12 +19,10 @@ class AudioContentMainTabFreeController(
) {
@GetMapping
fun fetchContentMainFree(
@RequestParam("isAdultContentVisible", required = false) isAdultContentVisible: Boolean? = null,
@RequestParam("contentType", required = false) contentType: ContentType? = null,
@AuthenticationPrincipal(expression = "#this == 'anonymousUser' ? null : member") member: Member?
) = run {
if (member == null) throw SodaException("로그인 정보를 확인해주세요.")
val preference = resolvePreference(member, isAdultContentVisible, contentType)
val preference = resolvePreference(member)
ApiResponse.ok(
service.fetchData(
@@ -38,13 +35,11 @@ class AudioContentMainTabFreeController(
@GetMapping("/introduce-creator")
fun getIntroduceCreator(
@RequestParam("isAdultContentVisible", required = false) isAdultContentVisible: Boolean? = null,
@RequestParam("contentType", required = false) contentType: ContentType? = null,
@AuthenticationPrincipal(expression = "#this == 'anonymousUser' ? null : member") member: Member?,
pageable: Pageable
) = run {
if (member == null) throw SodaException("로그인 정보를 확인해주세요.")
val preference = resolvePreference(member, isAdultContentVisible, contentType)
val preference = resolvePreference(member)
ApiResponse.ok(
service.getIntroduceCreator(
@@ -60,13 +55,11 @@ class AudioContentMainTabFreeController(
@GetMapping("/new-content-by-theme")
fun getNewContentByTheme(
@RequestParam("theme") theme: String,
@RequestParam("isAdultContentVisible", required = false) isAdultContentVisible: Boolean? = null,
@RequestParam("contentType", required = false) contentType: ContentType? = null,
@AuthenticationPrincipal(expression = "#this == 'anonymousUser' ? null : member") member: Member?,
pageable: Pageable
) = run {
if (member == null) throw SodaException("로그인 정보를 확인해주세요.")
val preference = resolvePreference(member, isAdultContentVisible, contentType)
val preference = resolvePreference(member)
ApiResponse.ok(
service.getNewContentByTheme(
@@ -83,12 +76,10 @@ class AudioContentMainTabFreeController(
@GetMapping("/popular-content-by-creator")
fun getPopularContentByCreator(
@RequestParam creatorId: Long,
@RequestParam("isAdultContentVisible", required = false) isAdultContentVisible: Boolean? = null,
@RequestParam("contentType", required = false) contentType: ContentType? = null,
@AuthenticationPrincipal(expression = "#this == 'anonymousUser' ? null : member") member: Member?
) = run {
if (member == null) throw SodaException("로그인 정보를 확인해주세요.")
val preference = resolvePreference(member, isAdultContentVisible, contentType)
val preference = resolvePreference(member)
ApiResponse.ok(
service.getPopularContentByCreator(
@@ -99,13 +90,5 @@ class AudioContentMainTabFreeController(
)
}
private fun resolvePreference(
member: Member,
isAdultContentVisible: Boolean?,
contentType: ContentType?
) = memberContentPreferenceService.resolveForQuery(
member = member,
isAdultContentVisible = isAdultContentVisible,
contentType = contentType
)
private fun resolvePreference(member: Member) = memberContentPreferenceService.resolveForQuery(member = member)
}

View File

@@ -82,10 +82,6 @@ class AudioContentMainTabHomeController(
)
}
return memberContentPreferenceService.resolveForQuery(
member = member,
isAdultContentVisible = isAdultContentVisible,
contentType = contentType
)
return memberContentPreferenceService.resolveForQuery(member = member)
}
}

View File

@@ -2,7 +2,6 @@ package kr.co.vividnext.sodalive.content.main.tab.replay
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 kr.co.vividnext.sodalive.member.contentpreference.MemberContentPreferenceService
import org.springframework.security.core.annotation.AuthenticationPrincipal
@@ -19,12 +18,10 @@ class AudioContentMainTabLiveReplayController(
) {
@GetMapping
fun fetchContentMainTabLiveReplay(
@RequestParam("isAdultContentVisible", required = false) isAdultContentVisible: Boolean? = null,
@RequestParam("contentType", required = false) contentType: ContentType? = null,
@AuthenticationPrincipal(expression = "#this == 'anonymousUser' ? null : member") member: Member?
) = run {
if (member == null) throw SodaException("로그인 정보를 확인해주세요.")
val preference = resolvePreference(member, isAdultContentVisible, contentType)
val preference = resolvePreference(member)
ApiResponse.ok(
service.fetchData(
@@ -38,12 +35,10 @@ class AudioContentMainTabLiveReplayController(
@GetMapping("/popular-content-by-creator")
fun getPopularContentByCreator(
@RequestParam creatorId: Long,
@RequestParam("isAdultContentVisible", required = false) isAdultContentVisible: Boolean? = null,
@RequestParam("contentType", required = false) contentType: ContentType? = null,
@AuthenticationPrincipal(expression = "#this == 'anonymousUser' ? null : member") member: Member?
) = run {
if (member == null) throw SodaException("로그인 정보를 확인해주세요.")
val preference = resolvePreference(member, isAdultContentVisible, contentType)
val preference = resolvePreference(member)
ApiResponse.ok(
service.getPopularContentByCreator(
@@ -54,13 +49,5 @@ class AudioContentMainTabLiveReplayController(
)
}
private fun resolvePreference(
member: Member,
isAdultContentVisible: Boolean?,
contentType: ContentType?
) = memberContentPreferenceService.resolveForQuery(
member = member,
isAdultContentVisible = isAdultContentVisible,
contentType = contentType
)
private fun resolvePreference(member: Member) = memberContentPreferenceService.resolveForQuery(member = member)
}

View File

@@ -2,7 +2,6 @@ package kr.co.vividnext.sodalive.content.main.tab.series
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 kr.co.vividnext.sodalive.member.contentpreference.MemberContentPreferenceService
import org.springframework.data.domain.Pageable
@@ -20,12 +19,10 @@ class AudioContentMainTabSeriesController(
) {
@GetMapping
fun fetchContentMainSeries(
@RequestParam("isAdultContentVisible", required = false) isAdultContentVisible: Boolean? = null,
@RequestParam("contentType", required = false) contentType: ContentType? = null,
@AuthenticationPrincipal(expression = "#this == 'anonymousUser' ? null : member") member: Member?
) = run {
if (member == null) throw SodaException("로그인 정보를 확인해주세요.")
val preference = resolvePreference(member, isAdultContentVisible, contentType)
val preference = resolvePreference(member)
ApiResponse.ok(
service.fetchData(
@@ -38,13 +35,11 @@ class AudioContentMainTabSeriesController(
@GetMapping("/original")
fun getOriginalAudioDramaList(
@RequestParam("isAdultContentVisible", required = false) isAdultContentVisible: Boolean? = null,
@RequestParam("contentType", required = false) contentType: ContentType? = null,
@AuthenticationPrincipal(expression = "#this == 'anonymousUser' ? null : member") member: Member?,
pageable: Pageable
) = run {
if (member == null) throw SodaException("로그인 정보를 확인해주세요.")
val preference = resolvePreference(member, isAdultContentVisible, contentType)
val preference = resolvePreference(member)
ApiResponse.ok(
service.getOriginalAudioDramaList(
@@ -59,13 +54,11 @@ class AudioContentMainTabSeriesController(
@GetMapping("/completed-rank")
fun getRank10DaysCompletedSeriesList(
@RequestParam("isAdultContentVisible", required = false) isAdultContentVisible: Boolean? = null,
@RequestParam("contentType", required = false) contentType: ContentType? = null,
@AuthenticationPrincipal(expression = "#this == 'anonymousUser' ? null : member") member: Member?,
pageable: Pageable
) = run {
if (member == null) throw SodaException("로그인 정보를 확인해주세요.")
val preference = resolvePreference(member, isAdultContentVisible, contentType)
val preference = resolvePreference(member)
ApiResponse.ok(
service.getRank10DaysCompletedSeriesList(
@@ -81,12 +74,10 @@ class AudioContentMainTabSeriesController(
@GetMapping("/recommend-by-genre")
fun getRecommendSeriesListByGenre(
@RequestParam genreId: Long,
@RequestParam("isAdultContentVisible", required = false) isAdultContentVisible: Boolean? = null,
@RequestParam("contentType", required = false) contentType: ContentType? = null,
@AuthenticationPrincipal(expression = "#this == 'anonymousUser' ? null : member") member: Member?
) = run {
if (member == null) throw SodaException("로그인 정보를 확인해주세요.")
val preference = resolvePreference(member, isAdultContentVisible, contentType)
val preference = resolvePreference(member)
ApiResponse.ok(
service.getRecommendSeriesListByGenre(
@@ -101,12 +92,10 @@ class AudioContentMainTabSeriesController(
@GetMapping("/recommend-series-by-creator")
fun getRecommendSeriesByCreator(
@RequestParam creatorId: Long,
@RequestParam("isAdultContentVisible", required = false) isAdultContentVisible: Boolean? = null,
@RequestParam("contentType", required = false) contentType: ContentType? = null,
@AuthenticationPrincipal(expression = "#this == 'anonymousUser' ? null : member") member: Member?
) = run {
if (member == null) throw SodaException("로그인 정보를 확인해주세요.")
val preference = resolvePreference(member, isAdultContentVisible, contentType)
val preference = resolvePreference(member)
ApiResponse.ok(
service.getRecommendSeriesByCreator(
@@ -117,13 +106,5 @@ class AudioContentMainTabSeriesController(
)
}
private fun resolvePreference(
member: Member,
isAdultContentVisible: Boolean?,
contentType: ContentType?
) = memberContentPreferenceService.resolveForQuery(
member = member,
isAdultContentVisible = isAdultContentVisible,
contentType = contentType
)
private fun resolvePreference(member: Member) = memberContentPreferenceService.resolveForQuery(member = member)
}

View File

@@ -2,7 +2,6 @@ package kr.co.vividnext.sodalive.content.series
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.creator.admin.content.series.SeriesSortType
import kr.co.vividnext.sodalive.member.Member
import kr.co.vividnext.sodalive.member.contentpreference.MemberContentPreferenceService
@@ -25,13 +24,11 @@ class ContentSeriesController(
@RequestParam(required = false) creatorId: Long?,
@RequestParam(name = "isOriginal", required = false) isOriginal: Boolean? = null,
@RequestParam(name = "isCompleted", required = false) isCompleted: Boolean? = null,
@RequestParam("isAdultContentVisible", required = false) isAdultContentVisible: Boolean? = null,
@RequestParam("contentType", required = false) contentType: ContentType? = null,
@AuthenticationPrincipal(expression = "#this == 'anonymousUser' ? null : member") member: Member?,
pageable: Pageable
) = run {
if (member == null) throw SodaException(messageKey = "common.error.bad_credentials")
val preference = resolvePreference(member, isAdultContentVisible, contentType)
val preference = resolvePreference(member)
ApiResponse.ok(
service.getSeriesList(
@@ -50,12 +47,10 @@ class ContentSeriesController(
@GetMapping("/{id}")
fun getSeriesDetail(
@PathVariable id: Long,
@RequestParam("isAdultContentVisible", required = false) isAdultContentVisible: Boolean? = null,
@RequestParam("contentType", required = false) contentType: ContentType? = null,
@AuthenticationPrincipal(expression = "#this == 'anonymousUser' ? null : member") member: Member?
) = run {
if (member == null) throw SodaException(messageKey = "common.error.bad_credentials")
val preference = resolvePreference(member, isAdultContentVisible, contentType)
val preference = resolvePreference(member)
ApiResponse.ok(
service.getSeriesDetail(
@@ -71,13 +66,11 @@ class ContentSeriesController(
fun getSeriesContentList(
@PathVariable id: Long,
@RequestParam("sortType", required = false) sortType: SeriesSortType? = SeriesSortType.NEWEST,
@RequestParam("isAdultContentVisible", required = false) isAdultContentVisible: Boolean? = null,
@RequestParam("contentType", required = false) contentType: ContentType? = null,
@AuthenticationPrincipal(expression = "#this == 'anonymousUser' ? null : member") member: Member?,
pageable: Pageable
) = run {
if (member == null) throw SodaException(messageKey = "common.error.bad_credentials")
val preference = resolvePreference(member, isAdultContentVisible, contentType)
val preference = resolvePreference(member)
ApiResponse.ok(
service.getSeriesContentList(
@@ -94,12 +87,10 @@ class ContentSeriesController(
@GetMapping("/recommend")
fun getRecommendSeriesList(
@RequestParam("isAdultContentVisible", required = false) isAdultContentVisible: Boolean? = null,
@RequestParam("contentType", required = false) contentType: ContentType? = null,
@AuthenticationPrincipal(expression = "#this == 'anonymousUser' ? null : member") member: Member?
) = run {
if (member == null) throw SodaException(messageKey = "common.error.bad_credentials")
val preference = resolvePreference(member, isAdultContentVisible, contentType)
val preference = resolvePreference(member)
ApiResponse.ok(
service.getRecommendSeriesList(
@@ -110,13 +101,5 @@ class ContentSeriesController(
)
}
private fun resolvePreference(
member: Member,
isAdultContentVisible: Boolean?,
contentType: ContentType?
) = memberContentPreferenceService.resolveForQuery(
member = member,
isAdultContentVisible = isAdultContentVisible,
contentType = contentType
)
private fun resolvePreference(member: Member) = memberContentPreferenceService.resolveForQuery(member = member)
}

View File

@@ -3,7 +3,6 @@ package kr.co.vividnext.sodalive.content.series.main
import kr.co.vividnext.sodalive.admin.content.series.banner.dto.SeriesBannerResponse
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.series.ContentSeriesService
import kr.co.vividnext.sodalive.content.series.main.banner.ContentSeriesBannerService
import kr.co.vividnext.sodalive.creator.admin.content.series.SeriesPublishedDaysOfWeek
@@ -29,12 +28,10 @@ class SeriesMainController(
) {
@GetMapping
fun fetchData(
@RequestParam("isAdultContentVisible", required = false) isAdultContentVisible: Boolean? = null,
@RequestParam("contentType", required = false) contentType: ContentType? = null,
@AuthenticationPrincipal(expression = "#this == 'anonymousUser' ? null : member") member: Member?
) = run {
if (member == null) throw SodaException(messageKey = "common.error.bad_credentials")
val preference = resolvePreference(member, isAdultContentVisible, contentType)
val preference = resolvePreference(member)
val banners = bannerService.getActiveBanners(PageRequest.of(0, 10))
.content
@@ -69,12 +66,10 @@ class SeriesMainController(
@GetMapping("/recommend")
fun getRecommendSeriesList(
@RequestParam("isAdultContentVisible", required = false) isAdultContentVisible: Boolean? = null,
@RequestParam("contentType", required = false) contentType: ContentType? = null,
@AuthenticationPrincipal(expression = "#this == 'anonymousUser' ? null : member") member: Member?
) = run {
if (member == null) throw SodaException(messageKey = "common.error.bad_credentials")
val preference = resolvePreference(member, isAdultContentVisible, contentType)
val preference = resolvePreference(member)
ApiResponse.ok(
contentSeriesService.getRecommendSeriesList(
@@ -88,14 +83,12 @@ class SeriesMainController(
@GetMapping("/day-of-week")
fun getDayOfWeekSeriesList(
@RequestParam("dayOfWeek") dayOfWeek: SeriesPublishedDaysOfWeek,
@RequestParam("isAdultContentVisible", required = false) isAdultContentVisible: Boolean? = null,
@RequestParam("contentType", required = false) contentType: ContentType? = null,
@RequestParam(defaultValue = "0") page: Int,
@RequestParam(defaultValue = "20") size: Int,
@AuthenticationPrincipal(expression = "#this == 'anonymousUser' ? null : member") member: Member?
) = run {
if (member == null) throw SodaException(messageKey = "common.error.bad_credentials")
val preference = resolvePreference(member, isAdultContentVisible, contentType)
val preference = resolvePreference(member)
val pageable = PageRequest.of(page, size)
ApiResponse.ok(
@@ -112,12 +105,10 @@ class SeriesMainController(
@GetMapping("/genre-list")
fun getGenreList(
@RequestParam("isAdultContentVisible", required = false) isAdultContentVisible: Boolean? = null,
@RequestParam("contentType", required = false) contentType: ContentType? = null,
@AuthenticationPrincipal(expression = "#this == 'anonymousUser' ? null : member") member: Member?
) = run {
if (member == null) throw SodaException(messageKey = "common.error.bad_credentials")
val preference = resolvePreference(member, isAdultContentVisible, contentType)
val preference = resolvePreference(member)
val memberId = member.id!!
val isAdult = preference.isAdult
@@ -134,14 +125,12 @@ class SeriesMainController(
@GetMapping("/list-by-genre")
fun getSeriesListByGenre(
@RequestParam("genreId") genreId: Long,
@RequestParam("isAdultContentVisible", required = false) isAdultContentVisible: Boolean? = null,
@RequestParam("contentType", required = false) contentType: ContentType? = null,
@RequestParam(defaultValue = "0") page: Int,
@RequestParam(defaultValue = "20") size: Int,
@AuthenticationPrincipal(expression = "#this == 'anonymousUser' ? null : member") member: Member?
) = run {
if (member == null) throw SodaException(messageKey = "common.error.bad_credentials")
val preference = resolvePreference(member, isAdultContentVisible, contentType)
val preference = resolvePreference(member)
val pageable = PageRequest.of(page, size)
ApiResponse.ok(
@@ -156,13 +145,5 @@ class SeriesMainController(
)
}
private fun resolvePreference(
member: Member,
isAdultContentVisible: Boolean?,
contentType: ContentType?
) = memberContentPreferenceService.resolveForQuery(
member = member,
isAdultContentVisible = isAdultContentVisible,
contentType = contentType
)
private fun resolvePreference(member: Member) = memberContentPreferenceService.resolveForQuery(member = member)
}

View File

@@ -2,7 +2,6 @@ package kr.co.vividnext.sodalive.content.theme
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.SortType
import kr.co.vividnext.sodalive.member.Member
import kr.co.vividnext.sodalive.member.contentpreference.MemberContentPreferenceService
@@ -35,12 +34,10 @@ class AudioContentThemeController(
fun getActiveThemes(
@RequestParam("isFree", required = false) isFree: Boolean? = null,
@RequestParam("isPointAvailableOnly", required = false) isPointAvailableOnly: Boolean? = null,
@RequestParam("isAdultContentVisible", required = false) isAdultContentVisible: Boolean? = null,
@RequestParam("contentType", required = false) contentType: ContentType? = null,
@AuthenticationPrincipal(expression = "#this == 'anonymousUser' ? null : member") member: Member?
) = run {
if (member == null) throw SodaException(messageKey = "common.error.bad_credentials")
val preference = resolvePreference(member, isAdultContentVisible, contentType)
val preference = resolvePreference(member)
ApiResponse.ok(
service.getActiveThemeOfContent(
@@ -56,13 +53,11 @@ class AudioContentThemeController(
fun getContentByTheme(
@PathVariable id: Long,
@RequestParam("sort-type", required = false) sortType: SortType? = SortType.NEWEST,
@RequestParam("isAdultContentVisible", required = false) isAdultContentVisible: Boolean? = null,
@RequestParam("contentType", required = false) contentType: ContentType? = null,
@AuthenticationPrincipal(expression = "#this == 'anonymousUser' ? null : member") member: Member?,
pageable: Pageable
) = run {
if (member == null) throw SodaException(messageKey = "common.error.bad_credentials")
val preference = resolvePreference(member, isAdultContentVisible, contentType)
val preference = resolvePreference(member)
ApiResponse.ok(
service.getContentByTheme(
@@ -77,13 +72,5 @@ class AudioContentThemeController(
)
}
private fun resolvePreference(
member: Member,
isAdultContentVisible: Boolean?,
contentType: ContentType?
) = memberContentPreferenceService.resolveForQuery(
member = member,
isAdultContentVisible = isAdultContentVisible,
contentType = contentType
)
private fun resolvePreference(member: Member) = memberContentPreferenceService.resolveForQuery(member = member)
}

View File

@@ -59,7 +59,6 @@ class ExplorerController(
fun getCreatorProfile(
@PathVariable("id") creatorId: Long,
@RequestParam timezone: String,
@RequestParam("isAdultContentVisible", required = false) isAdultContentVisible: Boolean? = null,
@AuthenticationPrincipal(expression = "#this == 'anonymousUser' ? null : member") member: Member?
) = run {
if (member == null) throw SodaException(messageKey = "common.error.bad_credentials")
@@ -67,7 +66,6 @@ class ExplorerController(
service.getCreatorProfile(
creatorId = creatorId,
timezone = timezone,
isAdultContentVisible = isAdultContentVisible,
member = member
)
)

View File

@@ -258,14 +258,9 @@ class ExplorerService(
fun getCreatorProfile(
creatorId: Long,
timezone: String,
isAdultContentVisible: Boolean?,
member: Member
): GetCreatorProfileResponse {
val preference = memberContentPreferenceService.resolveForQuery(
member = member,
isAdultContentVisible = isAdultContentVisible,
contentType = null
)
val preference = memberContentPreferenceService.resolveForQuery(member = member)
// 크리에이터(유저) 정보
val creatorAccount = queryRepository.getMember(creatorId)

View File

@@ -1480,11 +1480,7 @@ class LiveRoomService(
)
}
return memberContentPreferenceService.resolveForQuery(
member = member,
isAdultContentVisible = isAdultContentVisible,
contentType = null
)
return memberContentPreferenceService.resolveForQuery(member = member)
}
@Transactional

View File

@@ -40,7 +40,7 @@ class MemberContentPreferenceService(
return initializeDefaultPreference(
member = member,
seed = PreferenceSeed(
isAdultContentVisible = false,
isAdultContentVisible = member.auth != null,
contentType = ContentType.ALL
)
)
@@ -82,18 +82,10 @@ class MemberContentPreferenceService(
}
@Transactional(propagation = Propagation.REQUIRES_NEW)
fun resolveForQuery(
member: Member,
isAdultContentVisible: Boolean?,
contentType: ContentType?
): ViewerContentPreference {
fun resolveForQuery(member: Member): ViewerContentPreference {
val preference = initializeDefaultPreference(
member = member,
seed = resolvePreferenceSeedForQuery(
member = member,
isAdultContentVisible = isAdultContentVisible,
contentType = contentType
)
seed = resolvePreferenceSeedForQuery(member)
)
val countryCode = resolveCountryCode(member)
@@ -178,21 +170,10 @@ class MemberContentPreferenceService(
}
}
private fun resolvePreferenceSeedForQuery(
member: Member,
isAdultContentVisible: Boolean?,
contentType: ContentType?
): PreferenceSeed {
if (member.auth == null) {
return PreferenceSeed(
isAdultContentVisible = false,
contentType = ContentType.ALL
)
}
private fun resolvePreferenceSeedForQuery(member: Member): PreferenceSeed {
return PreferenceSeed(
isAdultContentVisible = isAdultContentVisible ?: true,
contentType = contentType ?: ContentType.ALL
isAdultContentVisible = member.auth != null,
contentType = ContentType.ALL
)
}

View File

@@ -2,7 +2,6 @@ package kr.co.vividnext.sodalive.search
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 kr.co.vividnext.sodalive.member.contentpreference.MemberContentPreferenceService
import org.springframework.data.domain.Pageable
@@ -21,12 +20,10 @@ class SearchController(
@GetMapping
fun searchUnified(
@RequestParam keyword: String,
@RequestParam("isAdultContentVisible", required = false) isAdultContentVisible: Boolean? = null,
@RequestParam("contentType", required = false) contentType: ContentType? = null,
@AuthenticationPrincipal(expression = "#this == 'anonymousUser' ? null : member") member: Member?
) = run {
if (member == null) throw SodaException(messageKey = "common.error.bad_credentials")
val preference = resolvePreference(member, isAdultContentVisible, contentType)
val preference = resolvePreference(member)
ApiResponse.ok(
service.searchUnified(
keyword,
@@ -57,13 +54,11 @@ class SearchController(
@GetMapping("/contents")
fun searchContentList(
@RequestParam keyword: String,
@RequestParam("isAdultContentVisible", required = false) isAdultContentVisible: Boolean? = null,
@RequestParam("contentType", required = false) contentType: ContentType? = null,
@AuthenticationPrincipal(expression = "#this == 'anonymousUser' ? null : member") member: Member?,
pageable: Pageable
) = run {
if (member == null) throw SodaException(messageKey = "common.error.bad_credentials")
val preference = resolvePreference(member, isAdultContentVisible, contentType)
val preference = resolvePreference(member)
ApiResponse.ok(
service.searchContentList(
keyword,
@@ -79,13 +74,11 @@ class SearchController(
@GetMapping("/series")
fun searchSeriesList(
@RequestParam keyword: String,
@RequestParam("isAdultContentVisible", required = false) isAdultContentVisible: Boolean? = null,
@RequestParam("contentType", required = false) contentType: ContentType? = null,
@AuthenticationPrincipal(expression = "#this == 'anonymousUser' ? null : member") member: Member?,
pageable: Pageable
) = run {
if (member == null) throw SodaException(messageKey = "common.error.bad_credentials")
val preference = resolvePreference(member, isAdultContentVisible, contentType)
val preference = resolvePreference(member)
ApiResponse.ok(
service.searchSeriesList(
keyword,
@@ -98,13 +91,5 @@ class SearchController(
)
}
private fun resolvePreference(
member: Member,
isAdultContentVisible: Boolean?,
contentType: ContentType?
) = memberContentPreferenceService.resolveForQuery(
member = member,
isAdultContentVisible = isAdultContentVisible,
contentType = contentType
)
private fun resolvePreference(member: Member) = memberContentPreferenceService.resolveForQuery(member = member)
}

View File

@@ -54,11 +54,7 @@ class MemberContentPreferenceIntegrationTest @Autowired constructor(
assertEquals(null, preferenceRepository.findByMemberId(member.id!!))
val resolved = service.resolveForQuery(
member = member,
isAdultContentVisible = true,
contentType = ContentType.MALE
)
val resolved = service.resolveForQuery(member = member)
val stored = service.getStoredPreference(member)
assertNotNull(preferenceRepository.findByMemberId(member.id!!))
@@ -81,11 +77,7 @@ class MemberContentPreferenceIntegrationTest @Autowired constructor(
assertEquals(null, preferenceRepository.findByMemberId(member.id!!))
val resolved = service.resolveForQuery(
member = reloadedMember,
isAdultContentVisible = null,
contentType = null
)
val resolved = service.resolveForQuery(member = reloadedMember)
val stored = service.getStoredPreference(reloadedMember)
assertNotNull(preferenceRepository.findByMemberId(member.id!!))
@@ -123,11 +115,7 @@ class MemberContentPreferenceIntegrationTest @Autowired constructor(
val member = saveNonForcedMember("kr-unauth-user")
countryContext.setCountryCode(null)
val resolved = service.resolveForQuery(
member = member,
isAdultContentVisible = true,
contentType = ContentType.MALE
)
val resolved = service.resolveForQuery(member = member)
val stored = service.getStoredPreference(member)
assertEquals("KR", resolved.countryCode)
@@ -139,22 +127,18 @@ class MemberContentPreferenceIntegrationTest @Autowired constructor(
}
@Test
@DisplayName("KR + 인증 사용자는 요청값이 저장되고 성인 조회값(isAdult)이 true로 계산된다")
fun shouldApplyRequestValuesForKrAuthenticatedMember() {
@DisplayName("KR + 인증 사용자는 legacy 파라미터와 무관하게 true/ALL로 생성되고 isAdult true로 계산된다")
fun shouldCreateTrueAndAllForKrAuthenticatedMemberRegardlessOfLegacyParams() {
val member = saveNonForcedMember("kr-auth-user")
countryContext.setCountryCode(null)
saveAuth(member)
val reloadedMember = memberRepository.findById(member.id!!).orElseThrow()
val resolved = service.resolveForQuery(
member = reloadedMember,
isAdultContentVisible = true,
contentType = ContentType.FEMALE
)
val resolved = service.resolveForQuery(member = reloadedMember)
assertEquals("KR", resolved.countryCode)
assertTrue(resolved.isAdultContentVisible)
assertEquals(ContentType.FEMALE, resolved.contentType)
assertEquals(ContentType.ALL, resolved.contentType)
assertTrue(resolved.isAdult)
}
@@ -172,11 +156,7 @@ class MemberContentPreferenceIntegrationTest @Autowired constructor(
contentType = ContentType.FEMALE
)
val resolved = service.resolveForQuery(
member = reloadedMember,
isAdultContentVisible = true,
contentType = ContentType.MALE
)
val resolved = service.resolveForQuery(member = reloadedMember)
val stored = service.getStoredPreference(reloadedMember)
assertFalse(resolved.isAdultContentVisible)

View File

@@ -258,8 +258,8 @@ class MemberContentPreferenceServiceTest {
}
@Test
@DisplayName("row 미존재 + 인증 사용자 legacy 조회 파라미터는 초기 생성값으로 반영된다")
fun shouldSeedPreferenceFromLegacyParamsWhenRowMissingAndAuthenticated() {
@DisplayName("row 미존재 + 인증 사용자 legacy 파라미터와 무관하게 true/ALL로 초기 생성된다")
fun shouldSeedPreferenceToTrueAndAllWhenRowMissingAndAuthenticatedRegardlessOfLegacyParams() {
val member = createMember(id = 2100L, withAuth = true)
countryContext.setCountryCode("US")
@@ -269,14 +269,10 @@ class MemberContentPreferenceServiceTest {
Mockito.`when`(repository.saveAndFlush(Mockito.any(MemberContentPreference::class.java)))
.thenAnswer { invocation -> invocation.getArgument(0) }
val result = service.resolveForQuery(
member = member,
isAdultContentVisible = true,
contentType = ContentType.FEMALE
)
val result = service.resolveForQuery(member = member)
assertTrue(result.isAdultContentVisible)
assertEquals(ContentType.FEMALE, result.contentType)
assertEquals(ContentType.ALL, result.contentType)
assertTrue(result.isAdult)
}
@@ -292,11 +288,7 @@ class MemberContentPreferenceServiceTest {
Mockito.`when`(repository.saveAndFlush(Mockito.any(MemberContentPreference::class.java)))
.thenAnswer { invocation -> invocation.getArgument(0) }
val result = service.resolveForQuery(
member = member,
isAdultContentVisible = null,
contentType = null
)
val result = service.resolveForQuery(member = member)
assertTrue(result.isAdultContentVisible)
assertEquals(ContentType.ALL, result.contentType)
@@ -315,11 +307,7 @@ class MemberContentPreferenceServiceTest {
Mockito.`when`(repository.saveAndFlush(Mockito.any(MemberContentPreference::class.java)))
.thenAnswer { invocation -> invocation.getArgument(0) }
val result = service.resolveForQuery(
member = member,
isAdultContentVisible = true,
contentType = ContentType.MALE
)
val result = service.resolveForQuery(member = member)
assertFalse(result.isAdultContentVisible)
assertEquals(ContentType.ALL, result.contentType)
@@ -431,11 +419,7 @@ class MemberContentPreferenceServiceTest {
countryContext.setCountryCode("US")
Mockito.`when`(repository.findByMemberId(21L)).thenReturn(preference)
val result = service.resolveForQuery(
member = member,
isAdultContentVisible = true,
contentType = ContentType.MALE
)
val result = service.resolveForQuery(member = member)
assertEquals(ContentType.FEMALE, result.contentType)
assertFalse(result.isAdultContentVisible)
@@ -449,11 +433,7 @@ class MemberContentPreferenceServiceTest {
countryContext.setCountryCode("US")
Mockito.`when`(repository.findByMemberId(25L)).thenReturn(preference)
service.resolveForQuery(
member = member,
isAdultContentVisible = true,
contentType = null
)
service.resolveForQuery(member = member)
verifyRecommendLiveCacheNotEvicted(25L)
}