diff --git a/docs/20260226_홈콘텐츠랭킹차단크리에이터필터링.md b/docs/20260226_홈콘텐츠랭킹차단크리에이터필터링.md new file mode 100644 index 00000000..5798c329 --- /dev/null +++ b/docs/20260226_홈콘텐츠랭킹차단크리에이터필터링.md @@ -0,0 +1,24 @@ +- [x] 홈 `fetchData` 콘텐츠 랭킹 조회 경로 및 차단 적용 패턴 확인 +- [x] `RankingRepository.getAudioContentRanking`에 양방향 차단(내가 차단/나를 차단) 조건 적용 +- [x] 변경 파일 진단 및 테스트/빌드 검증 수행 +- [x] 검증 결과 기록 + +## 1차 구현 검증 기록 +- 무엇: 홈 `fetchData`의 `contentRanking`에서 내가 차단한 크리에이터와 나를 차단한 크리에이터의 콘텐츠를 + 모두 제외하도록 서비스 레벨 필터를 추가했다. +- 왜: 기존 랭킹 조회 쿼리에는 한 방향 차단만 반영되어 양방향 차단 관계를 완전히 차단하지 못할 수 있기 때문이다. +- 어떻게: + - `lsp_diagnostics`: Kotlin(`.kt`)용 LSP 서버가 현재 환경에 없어 도구 기반 진단은 수행 불가. + - `./gradlew ktlintCheck`: 성공. + - `./gradlew test`: 성공. + - `./gradlew build -x test`: 성공. + +## 2차 수정 검증 기록 +- 무엇: 서비스(`HomeService`)에서 처리하던 `contentRanking` 차단 필터를 제거하고, `RankingRepository.getAudioContentRanking` + 쿼리의 `blockMemberCondition`을 양방향 차단 조건으로 수정했다. +- 왜: 홈 서비스가 아닌 랭킹 데이터 조회 계층에서 차단 정책을 일관되게 보장하기 위해서다. +- 어떻게: + - `lsp_diagnostics`: Kotlin(`.kt`)용 LSP 서버가 현재 환경에 없어 도구 기반 진단은 수행 불가. + - `./gradlew ktlintCheck`: 성공. + - `./gradlew test`: 성공. + - `./gradlew build -x test`: 성공. diff --git a/src/main/kotlin/kr/co/vividnext/sodalive/rank/RankingRepository.kt b/src/main/kotlin/kr/co/vividnext/sodalive/rank/RankingRepository.kt index a95c5e05..69670edb 100644 --- a/src/main/kotlin/kr/co/vividnext/sodalive/rank/RankingRepository.kt +++ b/src/main/kotlin/kr/co/vividnext/sodalive/rank/RankingRepository.kt @@ -80,9 +80,15 @@ class RankingRepository( locale: String? = null ): List { val blockMemberCondition = if (memberId != null) { - blockMember.member.id.eq(member.id) - .and(blockMember.isActive.isTrue) - .and(blockMember.blockedMember.id.eq(memberId)) + blockMember.isActive.isTrue + .and( + blockMember.member.id.eq(member.id) + .and(blockMember.blockedMember.id.eq(memberId)) + .or( + blockMember.member.id.eq(memberId) + .and(blockMember.blockedMember.id.eq(member.id)) + ) + ) } else { null }