diff --git a/docs/20260327_멤버콘텐츠선호기본값조정.md b/docs/20260327_멤버콘텐츠선호기본값조정.md new file mode 100644 index 00000000..60595f94 --- /dev/null +++ b/docs/20260327_멤버콘텐츠선호기본값조정.md @@ -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 검증으로 정합성을 확인했다. diff --git a/src/main/kotlin/kr/co/vividnext/sodalive/api/home/HomeService.kt b/src/main/kotlin/kr/co/vividnext/sodalive/api/home/HomeService.kt index 35192c0c..3548adbe 100644 --- a/src/main/kotlin/kr/co/vividnext/sodalive/api/home/HomeService.kt +++ b/src/main/kotlin/kr/co/vividnext/sodalive/api/home/HomeService.kt @@ -405,11 +405,7 @@ class HomeService( ) } - return memberContentPreferenceService.resolveForQuery( - member = member, - isAdultContentVisible = isAdultContentVisible, - contentType = contentType - ) + return memberContentPreferenceService.resolveForQuery(member = member) } private fun pickByTimeDecay( diff --git a/src/main/kotlin/kr/co/vividnext/sodalive/api/live/LiveApiService.kt b/src/main/kotlin/kr/co/vividnext/sodalive/api/live/LiveApiService.kt index 0d449b69..94fe228f 100644 --- a/src/main/kotlin/kr/co/vividnext/sodalive/api/live/LiveApiService.kt +++ b/src/main/kotlin/kr/co/vividnext/sodalive/api/live/LiveApiService.kt @@ -112,10 +112,6 @@ class LiveApiService( ) } - return memberContentPreferenceService.resolveForQuery( - member = member, - isAdultContentVisible = isAdultContentVisible, - contentType = contentType - ) + return memberContentPreferenceService.resolveForQuery(member = member) } } diff --git a/src/main/kotlin/kr/co/vividnext/sodalive/content/AudioContentController.kt b/src/main/kotlin/kr/co/vividnext/sodalive/content/AudioContentController.kt index e3da7bf3..66258861 100644 --- a/src/main/kotlin/kr/co/vividnext/sodalive/content/AudioContentController.kt +++ b/src/main/kotlin/kr/co/vividnext/sodalive/content/AudioContentController.kt @@ -306,10 +306,6 @@ class AudioContentController( ) } - return memberContentPreferenceService.resolveForQuery( - member = member, - isAdultContentVisible = isAdultContentVisible, - contentType = contentType - ) + return memberContentPreferenceService.resolveForQuery(member = member) } } diff --git a/src/main/kotlin/kr/co/vividnext/sodalive/content/main/AudioContentMainController.kt b/src/main/kotlin/kr/co/vividnext/sodalive/content/main/AudioContentMainController.kt index f5338503..a716a256 100644 --- a/src/main/kotlin/kr/co/vividnext/sodalive/content/main/AudioContentMainController.kt +++ b/src/main/kotlin/kr/co/vividnext/sodalive/content/main/AudioContentMainController.kt @@ -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) } diff --git a/src/main/kotlin/kr/co/vividnext/sodalive/content/main/curation/AudioContentCurationController.kt b/src/main/kotlin/kr/co/vividnext/sodalive/content/main/curation/AudioContentCurationController.kt index dacea554..15ac3b67 100644 --- a/src/main/kotlin/kr/co/vividnext/sodalive/content/main/curation/AudioContentCurationController.kt +++ b/src/main/kotlin/kr/co/vividnext/sodalive/content/main/curation/AudioContentCurationController.kt @@ -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) } diff --git a/src/main/kotlin/kr/co/vividnext/sodalive/content/main/tab/alarm/AudioContentMainTabAlarmController.kt b/src/main/kotlin/kr/co/vividnext/sodalive/content/main/tab/alarm/AudioContentMainTabAlarmController.kt index 96adf929..d7069675 100644 --- a/src/main/kotlin/kr/co/vividnext/sodalive/content/main/tab/alarm/AudioContentMainTabAlarmController.kt +++ b/src/main/kotlin/kr/co/vividnext/sodalive/content/main/tab/alarm/AudioContentMainTabAlarmController.kt @@ -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) } diff --git a/src/main/kotlin/kr/co/vividnext/sodalive/content/main/tab/asmr/AudioContentMainTabAsmrController.kt b/src/main/kotlin/kr/co/vividnext/sodalive/content/main/tab/asmr/AudioContentMainTabAsmrController.kt index 4bad32d9..189d081e 100644 --- a/src/main/kotlin/kr/co/vividnext/sodalive/content/main/tab/asmr/AudioContentMainTabAsmrController.kt +++ b/src/main/kotlin/kr/co/vividnext/sodalive/content/main/tab/asmr/AudioContentMainTabAsmrController.kt @@ -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) } diff --git a/src/main/kotlin/kr/co/vividnext/sodalive/content/main/tab/content/AudioContentMainTabContentController.kt b/src/main/kotlin/kr/co/vividnext/sodalive/content/main/tab/content/AudioContentMainTabContentController.kt index ebbd9b28..1cac31da 100644 --- a/src/main/kotlin/kr/co/vividnext/sodalive/content/main/tab/content/AudioContentMainTabContentController.kt +++ b/src/main/kotlin/kr/co/vividnext/sodalive/content/main/tab/content/AudioContentMainTabContentController.kt @@ -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) } diff --git a/src/main/kotlin/kr/co/vividnext/sodalive/content/main/tab/free/AudioContentMainTabFreeController.kt b/src/main/kotlin/kr/co/vividnext/sodalive/content/main/tab/free/AudioContentMainTabFreeController.kt index 51693825..bf73f120 100644 --- a/src/main/kotlin/kr/co/vividnext/sodalive/content/main/tab/free/AudioContentMainTabFreeController.kt +++ b/src/main/kotlin/kr/co/vividnext/sodalive/content/main/tab/free/AudioContentMainTabFreeController.kt @@ -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) } diff --git a/src/main/kotlin/kr/co/vividnext/sodalive/content/main/tab/home/AudioContentMainTabHomeController.kt b/src/main/kotlin/kr/co/vividnext/sodalive/content/main/tab/home/AudioContentMainTabHomeController.kt index 9feae3ca..0e0ea1f2 100644 --- a/src/main/kotlin/kr/co/vividnext/sodalive/content/main/tab/home/AudioContentMainTabHomeController.kt +++ b/src/main/kotlin/kr/co/vividnext/sodalive/content/main/tab/home/AudioContentMainTabHomeController.kt @@ -82,10 +82,6 @@ class AudioContentMainTabHomeController( ) } - return memberContentPreferenceService.resolveForQuery( - member = member, - isAdultContentVisible = isAdultContentVisible, - contentType = contentType - ) + return memberContentPreferenceService.resolveForQuery(member = member) } } diff --git a/src/main/kotlin/kr/co/vividnext/sodalive/content/main/tab/replay/AudioContentMainTabLiveReplayController.kt b/src/main/kotlin/kr/co/vividnext/sodalive/content/main/tab/replay/AudioContentMainTabLiveReplayController.kt index bacd2d4c..e9cf7685 100644 --- a/src/main/kotlin/kr/co/vividnext/sodalive/content/main/tab/replay/AudioContentMainTabLiveReplayController.kt +++ b/src/main/kotlin/kr/co/vividnext/sodalive/content/main/tab/replay/AudioContentMainTabLiveReplayController.kt @@ -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) } diff --git a/src/main/kotlin/kr/co/vividnext/sodalive/content/main/tab/series/AudioContentMainTabSeriesController.kt b/src/main/kotlin/kr/co/vividnext/sodalive/content/main/tab/series/AudioContentMainTabSeriesController.kt index bd6eb7e4..89cdac08 100644 --- a/src/main/kotlin/kr/co/vividnext/sodalive/content/main/tab/series/AudioContentMainTabSeriesController.kt +++ b/src/main/kotlin/kr/co/vividnext/sodalive/content/main/tab/series/AudioContentMainTabSeriesController.kt @@ -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) } diff --git a/src/main/kotlin/kr/co/vividnext/sodalive/content/series/ContentSeriesController.kt b/src/main/kotlin/kr/co/vividnext/sodalive/content/series/ContentSeriesController.kt index 88c0184a..2b814b11 100644 --- a/src/main/kotlin/kr/co/vividnext/sodalive/content/series/ContentSeriesController.kt +++ b/src/main/kotlin/kr/co/vividnext/sodalive/content/series/ContentSeriesController.kt @@ -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) } diff --git a/src/main/kotlin/kr/co/vividnext/sodalive/content/series/main/SeriesMainController.kt b/src/main/kotlin/kr/co/vividnext/sodalive/content/series/main/SeriesMainController.kt index 037e5dde..41c6fde9 100644 --- a/src/main/kotlin/kr/co/vividnext/sodalive/content/series/main/SeriesMainController.kt +++ b/src/main/kotlin/kr/co/vividnext/sodalive/content/series/main/SeriesMainController.kt @@ -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) } diff --git a/src/main/kotlin/kr/co/vividnext/sodalive/content/theme/AudioContentThemeController.kt b/src/main/kotlin/kr/co/vividnext/sodalive/content/theme/AudioContentThemeController.kt index 65acd1d0..8591b185 100644 --- a/src/main/kotlin/kr/co/vividnext/sodalive/content/theme/AudioContentThemeController.kt +++ b/src/main/kotlin/kr/co/vividnext/sodalive/content/theme/AudioContentThemeController.kt @@ -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) } diff --git a/src/main/kotlin/kr/co/vividnext/sodalive/explorer/ExplorerController.kt b/src/main/kotlin/kr/co/vividnext/sodalive/explorer/ExplorerController.kt index e756b2a6..86afac22 100644 --- a/src/main/kotlin/kr/co/vividnext/sodalive/explorer/ExplorerController.kt +++ b/src/main/kotlin/kr/co/vividnext/sodalive/explorer/ExplorerController.kt @@ -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 ) ) diff --git a/src/main/kotlin/kr/co/vividnext/sodalive/explorer/ExplorerService.kt b/src/main/kotlin/kr/co/vividnext/sodalive/explorer/ExplorerService.kt index 96c1beb7..3d228843 100644 --- a/src/main/kotlin/kr/co/vividnext/sodalive/explorer/ExplorerService.kt +++ b/src/main/kotlin/kr/co/vividnext/sodalive/explorer/ExplorerService.kt @@ -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) diff --git a/src/main/kotlin/kr/co/vividnext/sodalive/live/room/LiveRoomService.kt b/src/main/kotlin/kr/co/vividnext/sodalive/live/room/LiveRoomService.kt index 6567bb9b..04a7e5db 100644 --- a/src/main/kotlin/kr/co/vividnext/sodalive/live/room/LiveRoomService.kt +++ b/src/main/kotlin/kr/co/vividnext/sodalive/live/room/LiveRoomService.kt @@ -1480,11 +1480,7 @@ class LiveRoomService( ) } - return memberContentPreferenceService.resolveForQuery( - member = member, - isAdultContentVisible = isAdultContentVisible, - contentType = null - ) + return memberContentPreferenceService.resolveForQuery(member = member) } @Transactional diff --git a/src/main/kotlin/kr/co/vividnext/sodalive/member/contentpreference/MemberContentPreferenceService.kt b/src/main/kotlin/kr/co/vividnext/sodalive/member/contentpreference/MemberContentPreferenceService.kt index e9a90ca8..4b73520a 100644 --- a/src/main/kotlin/kr/co/vividnext/sodalive/member/contentpreference/MemberContentPreferenceService.kt +++ b/src/main/kotlin/kr/co/vividnext/sodalive/member/contentpreference/MemberContentPreferenceService.kt @@ -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 ) } diff --git a/src/main/kotlin/kr/co/vividnext/sodalive/search/SearchController.kt b/src/main/kotlin/kr/co/vividnext/sodalive/search/SearchController.kt index d1bb4213..1e96237c 100644 --- a/src/main/kotlin/kr/co/vividnext/sodalive/search/SearchController.kt +++ b/src/main/kotlin/kr/co/vividnext/sodalive/search/SearchController.kt @@ -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) } diff --git a/src/test/kotlin/kr/co/vividnext/sodalive/member/contentpreference/MemberContentPreferenceIntegrationTest.kt b/src/test/kotlin/kr/co/vividnext/sodalive/member/contentpreference/MemberContentPreferenceIntegrationTest.kt index 8b765bca..76dab580 100644 --- a/src/test/kotlin/kr/co/vividnext/sodalive/member/contentpreference/MemberContentPreferenceIntegrationTest.kt +++ b/src/test/kotlin/kr/co/vividnext/sodalive/member/contentpreference/MemberContentPreferenceIntegrationTest.kt @@ -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) diff --git a/src/test/kotlin/kr/co/vividnext/sodalive/member/contentpreference/MemberContentPreferenceServiceTest.kt b/src/test/kotlin/kr/co/vividnext/sodalive/member/contentpreference/MemberContentPreferenceServiceTest.kt index bb2c86fe..5e1cd3f6 100644 --- a/src/test/kotlin/kr/co/vividnext/sodalive/member/contentpreference/MemberContentPreferenceServiceTest.kt +++ b/src/test/kotlin/kr/co/vividnext/sodalive/member/contentpreference/MemberContentPreferenceServiceTest.kt @@ -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) }