fix(member-block): 동일인 판별 조건을 name birth di gender 조합으로 강화한다
This commit is contained in:
15
docs/20260225_회원차단동일인판별조건강화.md
Normal file
15
docs/20260225_회원차단동일인판별조건강화.md
Normal file
@@ -0,0 +1,15 @@
|
|||||||
|
- [x] 기존 `memberBlock` 동일인 판별 로직(`di` 단일 조건)과 연관 Repository 조회 경로 확인
|
||||||
|
- [x] `AuthRepository`에 `name + birth + di + gender` AND 조건 조회 메서드 추가
|
||||||
|
- [x] `MemberService.memberBlock`에서 다중 조건 조회 메서드 사용으로 변경
|
||||||
|
- [x] 변경 파일 정적 진단 및 테스트 실행
|
||||||
|
- [x] 구현 결과/검증 기록 문서 반영
|
||||||
|
|
||||||
|
## 검증 기록
|
||||||
|
|
||||||
|
### 1차 구현
|
||||||
|
- 무엇을: `memberBlock`의 동일인 확장 조회를 `di` 단일 조건에서 `name + birth + di + gender` AND 조건으로 변경했다.
|
||||||
|
- 왜: 동일인 판단 정밀도를 높여, `di`만 일치하는 케이스로 과차단되는 가능성을 줄이기 위해서다.
|
||||||
|
- 어떻게:
|
||||||
|
- 코드 변경: `src/main/kotlin/kr/co/vividnext/sodalive/member/auth/AuthRepository.kt`에 `getMemberIdsByNameAndBirthAndDiAndGender(...)` QueryDSL 조회를 추가했다.
|
||||||
|
- 코드 변경: `src/main/kotlin/kr/co/vividnext/sodalive/member/MemberService.kt`의 `memberBlock`에서 `blockedMember.auth`의 `name/birth/di/gender`를 사용해 신규 조회 메서드를 호출하도록 바꿨다.
|
||||||
|
- 검증: `lsp_diagnostics`는 `.kt` LSP 서버 미구성으로 실행 불가(도구 에러 확인). 대신 `./gradlew test` 성공, `./gradlew build -x test` 성공으로 테스트/빌드 및 `ktlint` 체크 통과를 확인했다.
|
||||||
@@ -529,8 +529,13 @@ class MemberService(
|
|||||||
?: throw SodaException(messageKey = "common.error.invalid_request")
|
?: throw SodaException(messageKey = "common.error.invalid_request")
|
||||||
|
|
||||||
val blockTargetMemberIds = mutableSetOf(request.blockMemberId)
|
val blockTargetMemberIds = mutableSetOf(request.blockMemberId)
|
||||||
blockedMember.auth?.di?.let { di ->
|
blockedMember.auth?.let { auth ->
|
||||||
val verifiedMemberIds = authRepository.getMemberIdsByDi(di = di)
|
val verifiedMemberIds = authRepository.getMemberIdsByNameAndBirthAndDiAndGender(
|
||||||
|
name = auth.name,
|
||||||
|
birth = auth.birth,
|
||||||
|
di = auth.di,
|
||||||
|
gender = auth.gender
|
||||||
|
)
|
||||||
blockTargetMemberIds.addAll(verifiedMemberIds)
|
blockTargetMemberIds.addAll(verifiedMemberIds)
|
||||||
}
|
}
|
||||||
blockTargetMemberIds.remove(memberId)
|
blockTargetMemberIds.remove(memberId)
|
||||||
|
|||||||
@@ -13,6 +13,7 @@ interface AuthRepository : JpaRepository<Auth, Long>, AuthQueryRepository
|
|||||||
interface AuthQueryRepository {
|
interface AuthQueryRepository {
|
||||||
fun getOldestCreatedAtByDi(di: String): LocalDateTime
|
fun getOldestCreatedAtByDi(di: String): LocalDateTime
|
||||||
fun getMemberIdsByDi(di: String): List<Long>
|
fun getMemberIdsByDi(di: String): List<Long>
|
||||||
|
fun getMemberIdsByNameAndBirthAndDiAndGender(name: String, birth: String, di: String, gender: Int): List<Long>
|
||||||
fun getAuthIdByMemberId(memberId: Long): Long?
|
fun getAuthIdByMemberId(memberId: Long): Long?
|
||||||
fun getActiveMemberIdsByDi(di: String): List<Long>
|
fun getActiveMemberIdsByDi(di: String): List<Long>
|
||||||
}
|
}
|
||||||
@@ -36,6 +37,20 @@ class AuthQueryRepositoryImpl(private val queryFactory: JPAQueryFactory) : AuthQ
|
|||||||
.fetch()
|
.fetch()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
override fun getMemberIdsByNameAndBirthAndDiAndGender(name: String, birth: String, di: String, gender: Int): List<Long> {
|
||||||
|
return queryFactory
|
||||||
|
.select(member.id)
|
||||||
|
.from(member)
|
||||||
|
.leftJoin(member.auth, auth)
|
||||||
|
.where(
|
||||||
|
auth.name.eq(name)
|
||||||
|
.and(auth.birth.eq(birth))
|
||||||
|
.and(auth.di.eq(di))
|
||||||
|
.and(auth.gender.eq(gender))
|
||||||
|
)
|
||||||
|
.fetch()
|
||||||
|
}
|
||||||
|
|
||||||
override fun getAuthIdByMemberId(memberId: Long): Long? {
|
override fun getAuthIdByMemberId(memberId: Long): Long? {
|
||||||
return queryFactory
|
return queryFactory
|
||||||
.select(auth.id)
|
.select(auth.id)
|
||||||
|
|||||||
Reference in New Issue
Block a user