fix(content-preference): 조회 선호도 오버라이드 파라미터를 제거해 저장값만 사용한다
This commit is contained in:
102
docs/20260327_멤버콘텐츠선호기본값조정.md
Normal file
102
docs/20260327_멤버콘텐츠선호기본값조정.md
Normal 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 검증으로 정합성을 확인했다.
|
||||
@@ -405,11 +405,7 @@ class HomeService(
|
||||
)
|
||||
}
|
||||
|
||||
return memberContentPreferenceService.resolveForQuery(
|
||||
member = member,
|
||||
isAdultContentVisible = isAdultContentVisible,
|
||||
contentType = contentType
|
||||
)
|
||||
return memberContentPreferenceService.resolveForQuery(member = member)
|
||||
}
|
||||
|
||||
private fun pickByTimeDecay(
|
||||
|
||||
@@ -112,10 +112,6 @@ class LiveApiService(
|
||||
)
|
||||
}
|
||||
|
||||
return memberContentPreferenceService.resolveForQuery(
|
||||
member = member,
|
||||
isAdultContentVisible = isAdultContentVisible,
|
||||
contentType = contentType
|
||||
)
|
||||
return memberContentPreferenceService.resolveForQuery(member = member)
|
||||
}
|
||||
}
|
||||
|
||||
@@ -306,10 +306,6 @@ class AudioContentController(
|
||||
)
|
||||
}
|
||||
|
||||
return memberContentPreferenceService.resolveForQuery(
|
||||
member = member,
|
||||
isAdultContentVisible = isAdultContentVisible,
|
||||
contentType = contentType
|
||||
)
|
||||
return memberContentPreferenceService.resolveForQuery(member = member)
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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)
|
||||
}
|
||||
|
||||
@@ -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)
|
||||
}
|
||||
|
||||
@@ -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)
|
||||
}
|
||||
|
||||
@@ -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)
|
||||
}
|
||||
|
||||
@@ -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)
|
||||
}
|
||||
|
||||
@@ -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)
|
||||
}
|
||||
|
||||
@@ -82,10 +82,6 @@ class AudioContentMainTabHomeController(
|
||||
)
|
||||
}
|
||||
|
||||
return memberContentPreferenceService.resolveForQuery(
|
||||
member = member,
|
||||
isAdultContentVisible = isAdultContentVisible,
|
||||
contentType = contentType
|
||||
)
|
||||
return memberContentPreferenceService.resolveForQuery(member = member)
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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)
|
||||
}
|
||||
|
||||
@@ -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)
|
||||
}
|
||||
|
||||
@@ -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)
|
||||
}
|
||||
|
||||
@@ -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)
|
||||
}
|
||||
|
||||
@@ -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)
|
||||
}
|
||||
|
||||
@@ -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
|
||||
)
|
||||
)
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -1480,11 +1480,7 @@ class LiveRoomService(
|
||||
)
|
||||
}
|
||||
|
||||
return memberContentPreferenceService.resolveForQuery(
|
||||
member = member,
|
||||
isAdultContentVisible = isAdultContentVisible,
|
||||
contentType = null
|
||||
)
|
||||
return memberContentPreferenceService.resolveForQuery(member = member)
|
||||
}
|
||||
|
||||
@Transactional
|
||||
|
||||
@@ -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
|
||||
)
|
||||
}
|
||||
|
||||
|
||||
@@ -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)
|
||||
}
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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)
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user