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

@@ -0,0 +1,102 @@
# 20260327 멤버 콘텐츠 선호 기본값 조정
## 목적
- `MemberContentPreference` 신규 생성 기본값을 다음 정책으로 고정한다.
- 기존 회원 + `member.auth != null` 인 경우: `isAdultContentVisible = true`, `contentType = ContentType.ALL`
- 그 외: `isAdultContentVisible = false`, `contentType = ContentType.ALL`
## 구현 체크리스트
- [x] 기본값 시드 로직을 `member.auth` 기준 정책으로 단순화한다.
- QA: row 미존재 + 인증/미인증 케이스에서 저장값이 각각 `true/ALL`, `false/ALL`인지 테스트로 확인
- [x] 레거시 조회 파라미터(`isAdultContentVisible`, `contentType`)가 신규 row 기본값에 영향을 주지 않도록 정리한다.
- QA: `resolveForQuery` 호출 시 파라미터 전달 여부와 무관하게 정책 기본값으로 생성되는지 확인
- [x] 관련 단위/통합 테스트 기대값을 정책에 맞게 수정한다.
- QA: `MemberContentPreferenceServiceTest`, `MemberContentPreferenceIntegrationTest` 통과
- [x] 회귀 검증을 실행한다.
- QA: `./gradlew test --tests "kr.co.vividnext.sodalive.member.contentpreference.MemberContentPreferenceServiceTest" --tests "kr.co.vividnext.sodalive.member.contentpreference.MemberContentPreferenceIntegrationTest"`, `./gradlew build` 성공
## 구현 완료 후 기록
### 1차 구현
- 무엇을:
- `MemberContentPreferenceService.initializeDefaultPreference`의 기본 seed를 `member.auth != null` 기준으로 변경해 인증 회원은 `true/ALL`, 그 외는 `false/ALL`로 생성되도록 수정했다.
- `resolveForQuery`의 신규 row 생성 seed 계산에서 legacy 파라미터를 제거하고 `member.auth` 기반 고정 정책(`true/ALL` 또는 `false/ALL`)만 사용하도록 정리했다.
- `MemberContentPreferenceServiceTest`, `MemberContentPreferenceIntegrationTest`의 관련 시나리오를 정책에 맞게 수정했다.
- 왜:
- 요청사항이 “기존 회원가입 + `member.auth != null`이면 `true/ALL`, 그 외는 `false/ALL`”로 명확하여, 신규 row 기본값이 요청 파라미터에 영향을 받지 않도록 일관된 기준으로 통일해야 했기 때문이다.
- 어떻게:
- 명령:
- `./gradlew test --tests "kr.co.vividnext.sodalive.member.contentpreference.MemberContentPreferenceServiceTest.shouldSeedPreferenceToTrueAndAllWhenRowMissingAndAuthenticatedRegardlessOfLegacyParams"`
- `./gradlew test --tests "kr.co.vividnext.sodalive.member.contentpreference.MemberContentPreferenceServiceTest" --tests "kr.co.vividnext.sodalive.member.contentpreference.MemberContentPreferenceIntegrationTest"`
- `./gradlew build`
- 결과:
- 정책 핵심 시나리오 단일 테스트 통과.
- 대상 단위/통합 테스트 통과.
- 전체 build(테스트/ktlint 포함) 통과.
- `.kt` 확장자용 LSP 서버가 현재 환경에 없어 `lsp_diagnostics`는 실행 불가였고, 대신 Gradle 검증으로 정합성을 확인했다.
## 연계 작업(동일 기능)
### 2차 구현 - `resolveForQuery` 조회 파라미터 제거
- 무엇을:
- `MemberContentPreferenceService.resolveForQuery` 시그니처에서 미사용 파라미터 2개
(`isAdultContentVisible`, `contentType`)를 제거하고 `member` 단일 파라미터로 정리했다.
- 시그니처 변경에 맞춰 서비스/컨트롤러/테스트의 `resolveForQuery` 호출부 인자 전달 코드를 일괄 정리했다.
- 왜:
- 실제로 사용되지 않는 파라미터를 제거해 함수 계약을 단순화하고, 호출부 가독성과 유지보수성을 높이기 위해서다.
- 어떻게:
- 명령:
- `./gradlew compileKotlin compileTestKotlin`
- `./gradlew test --tests "kr.co.vividnext.sodalive.member.contentpreference.MemberContentPreferenceServiceTest" --tests "kr.co.vividnext.sodalive.member.contentpreference.MemberContentPreferenceIntegrationTest"`
- `./gradlew build`
- `lsp_diagnostics(filePath="src/main/kotlin", extension=".kt")`
- 결과:
- 시그니처 변경 직후 컴파일 에러로 표시된 호출부를 모두 정리한 뒤 `compileKotlin/compileTestKotlin` 성공.
- 관련 단위/통합 테스트 통과.
- 전체 build(ktlint/test 포함) 성공.
- 현재 환경에는 Kotlin LSP 서버가 없어 `lsp_diagnostics`는 실행 불가였고,
Gradle 컴파일/테스트/빌드로 정합성을 확인했다.
### 3차 구현 - 수정 파일 미사용 파라미터 정리
- 무엇을:
- `resolveForQuery(member = member)`로 단순화된 이후 미사용 상태가 된
`resolvePreference` 헬퍼 파라미터를 12개 파일에서 제거했다.
- 헬퍼 호출부를 정리했고, null 회원 분기에서 실제로 파라미터를 사용하는 서비스/컨트롤러
(`HomeService`, `LiveApiService`, `AudioContentController`, `AudioContentMainTabHomeController`)는
기존 전달 로직을 유지했다.
- 왜:
- 사용되지 않는 파라미터는 경고와 혼선을 유발해 유지보수 비용을 높이므로,
실제 사용하는 함수 계약만 남겨 코드 의도를 명확히 하기 위해서다.
- 어떻게:
- 명령:
- `./gradlew compileKotlin`
- `./gradlew test --tests "kr.co.vividnext.sodalive.member.contentpreference.MemberContentPreferenceServiceTest" --tests "kr.co.vividnext.sodalive.member.contentpreference.MemberContentPreferenceIntegrationTest"`
- `./gradlew build`
- `lsp_diagnostics(filePath="src/main/kotlin", extension=".kt")`
- 결과:
- `compileKotlin` 성공.
- 관련 단위/통합 테스트 성공.
- 전체 build(ktlint/test 포함) 성공.
- 현재 환경에 Kotlin LSP 서버가 없어 `lsp_diagnostics`는 실행 불가였고,
Gradle 컴파일/테스트/빌드 결과로 정합성을 확인했다.
### 4차 수정 - 잔여 미사용 파라미터 추가 정리
- 무엇을:
- 3차 정리 이후에도 남아 있던 수정 파일 내 함수 미사용 파라미터를 추가 제거했다.
- `resolvePreference(member: Member)`만 사용하는 컨트롤러들의
`@RequestParam("isAdultContentVisible")`, `@RequestParam("contentType")`를 제거하고 import를 정리했다.
- `ExplorerService.getCreatorProfile`의 미사용 파라미터 `isAdultContentVisible`을 제거하고
`ExplorerController` 호출부를 함께 수정했다.
- 왜:
- 실제 로직에서 사용되지 않는 파라미터를 제거해 함수 계약을 단순화하고,
유지보수 시 혼선을 줄이기 위해서다.
- 어떻게:
- 명령:
- `./gradlew compileKotlin compileTestKotlin`
- `./gradlew test --tests "kr.co.vividnext.sodalive.member.contentpreference.MemberContentPreferenceServiceTest" --tests "kr.co.vividnext.sodalive.member.contentpreference.MemberContentPreferenceIntegrationTest"`
- `./gradlew build`
- `lsp_diagnostics(filePath="src/main/kotlin", extension=".kt")`
- 결과:
- `compileKotlin`, `compileTestKotlin` 성공.
- 관련 단위/통합 테스트 성공.
- 전체 build(ktlint/test 포함) 성공.
- 현재 환경에 Kotlin LSP 서버가 없어 `lsp_diagnostics`는 실행 불가였고,
Gradle 검증으로 정합성을 확인했다.

View File

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

View File

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

View File

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

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

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

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

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

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

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

View File

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

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

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

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

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

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

View File

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

View File

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

View File

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

View File

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

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

View File

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

View File

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