From 0c106540cdc105c821bf5f39ca43effcb5f76d5c Mon Sep 17 00:00:00 2001 From: Klaus Date: Wed, 2 Aug 2023 15:54:25 +0900 Subject: [PATCH] =?UTF-8?q?=EB=AA=A8=EB=93=A0=20=EA=B8=B0=EA=B8=B0?= =?UTF-8?q?=EC=97=90=EC=84=9C=20=EB=A1=9C=EA=B7=B8=EC=95=84=EC=9B=83=20?= =?UTF-8?q?=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../co/vividnext/sodalive/member/MemberController.kt | 9 +++++++++ .../kr/co/vividnext/sodalive/member/MemberService.kt | 11 +++++++++++ 2 files changed, 20 insertions(+) diff --git a/src/main/kotlin/kr/co/vividnext/sodalive/member/MemberController.kt b/src/main/kotlin/kr/co/vividnext/sodalive/member/MemberController.kt index 6d12515..850f27e 100644 --- a/src/main/kotlin/kr/co/vividnext/sodalive/member/MemberController.kt +++ b/src/main/kotlin/kr/co/vividnext/sodalive/member/MemberController.kt @@ -40,6 +40,15 @@ class MemberController(private val service: MemberService) { ApiResponse.ok(service.logout(token.removePrefix("Bearer "), member.id!!)) } + @PostMapping("/logout/all") + fun logoutAll( + @AuthenticationPrincipal(expression = "#this == 'anonymousUser' ? null : member") member: Member? + ) = run { + if (member == null) throw SodaException("로그인 정보를 확인해주세요.") + + ApiResponse.ok(service.logoutAll(member.id!!)) + } + @GetMapping("/info") fun getMemberInfo( @RequestParam container: String?, diff --git a/src/main/kotlin/kr/co/vividnext/sodalive/member/MemberService.kt b/src/main/kotlin/kr/co/vividnext/sodalive/member/MemberService.kt index 1b59996..b4f11eb 100644 --- a/src/main/kotlin/kr/co/vividnext/sodalive/member/MemberService.kt +++ b/src/main/kotlin/kr/co/vividnext/sodalive/member/MemberService.kt @@ -376,6 +376,17 @@ class MemberService( } } + @Transactional + fun logoutAll(memberId: Long) { + val member = repository.findByIdOrNull(memberId) + ?: throw SodaException("로그인 정보를 확인해주세요.") + + member.pushToken = null + + val lock = getOrCreateLock(memberId = memberId) + lock.write { tokenRepository.deleteById(memberId) } + } + private fun getOrCreateLock(memberId: Long): ReentrantReadWriteLock { return tokenLocks.computeIfAbsent(memberId) { ReentrantReadWriteLock() } }