feat(admin-member): 관리자 사용자 차단 기능을 추가한다

This commit is contained in:
2026-03-05 15:38:26 +09:00
parent c422bb3d6e
commit 6b274b9529
3 changed files with 98 additions and 0 deletions

View File

@@ -0,0 +1,19 @@
package kr.co.vividnext.sodalive.admin.member
import kr.co.vividnext.sodalive.common.ApiResponse
import org.springframework.security.access.prepost.PreAuthorize
import org.springframework.web.bind.annotation.PostMapping
import org.springframework.web.bind.annotation.RequestBody
import org.springframework.web.bind.annotation.RequestMapping
import org.springframework.web.bind.annotation.RestController
@RestController
@RequestMapping("/admin/member/block")
@PreAuthorize("hasRole('ADMIN')")
class AdminMemberBlockController(private val service: AdminMemberBlockService) {
@PostMapping
fun blockMember(@RequestBody request: AdminMemberBlockRequest) = ApiResponse.ok(
service.blockMember(request),
"차단되었습니다."
)
}

View File

@@ -0,0 +1,6 @@
package kr.co.vividnext.sodalive.admin.member
data class AdminMemberBlockRequest(
val memberId: Long,
val reason: String
)

View File

@@ -0,0 +1,73 @@
package kr.co.vividnext.sodalive.admin.member
import kr.co.vividnext.sodalive.common.SodaException
import kr.co.vividnext.sodalive.member.MemberService
import kr.co.vividnext.sodalive.member.SignOut
import kr.co.vividnext.sodalive.member.SignOutRepository
import kr.co.vividnext.sodalive.member.auth.AuthRepository
import kr.co.vividnext.sodalive.member.auth.BlockAuth
import kr.co.vividnext.sodalive.member.auth.BlockAuthRepository
import org.springframework.stereotype.Service
import org.springframework.transaction.annotation.Transactional
@Service
class AdminMemberBlockService(
private val adminMemberRepository: AdminMemberRepository,
private val signOutRepository: SignOutRepository,
private val memberService: MemberService,
private val authRepository: AuthRepository,
private val blockAuthRepository: BlockAuthRepository
) {
@Transactional
fun blockMember(request: AdminMemberBlockRequest) {
if (request.reason.isBlank()) {
throw SodaException(messageKey = "member.validation.signout_reason_required")
}
val member = adminMemberRepository.findByIdAndActive(memberId = request.memberId)
?: throw SodaException(messageKey = "admin.member.not_found")
val auth = member.auth
val memberIdsToBlock = if (auth != null) {
authRepository.getActiveMemberIdsByNameAndBirthAndDiAndUniqueCi(
name = auth.name,
birth = auth.birth,
di = auth.di,
uniqueCi = auth.uniqueCi
)
.ifEmpty { listOf(member.id!!) }
} else {
listOf(member.id!!)
}
memberIdsToBlock
.distinct()
.forEach { memberId ->
val targetMember = adminMemberRepository.findByIdAndActive(memberId = memberId)
?: return@forEach
targetMember.isActive = false
targetMember.nickname = "deleted_${targetMember.nickname}"
val signOut = SignOut(reason = request.reason)
signOut.member = targetMember
signOutRepository.save(signOut)
memberService.logoutAll(memberId = targetMember.id!!)
}
if (auth == null) return
val alreadyBlockedAuthId = blockAuthRepository.findByUniqueCiAndDi(auth.uniqueCi, auth.di)
if (alreadyBlockedAuthId == null || alreadyBlockedAuthId <= 0) {
blockAuthRepository.save(
BlockAuth(
name = auth.name,
birth = auth.birth,
uniqueCi = auth.uniqueCi,
di = auth.di,
gender = auth.gender
)
)
}
}
}