From d9f6ac01f45cd4ba8f827ef73800c5486de8f6f3 Mon Sep 17 00:00:00 2001 From: Klaus Date: Wed, 2 Aug 2023 16:57:26 +0900 Subject: [PATCH] =?UTF-8?q?=ED=9A=8C=EC=9B=90=ED=83=88=ED=87=B4=20API=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 --- .../kr/co/vividnext/sodalive/member/Member.kt | 3 +++ .../sodalive/member/MemberController.kt | 7 ++++++ .../sodalive/member/MemberService.kt | 20 +++++++++++++++++ .../co/vividnext/sodalive/member/SignOut.kt | 22 +++++++++++++++++++ .../sodalive/member/SignOutRepository.kt | 7 ++++++ .../sodalive/member/SignOutRequest.kt | 6 +++++ 6 files changed, 65 insertions(+) create mode 100644 src/main/kotlin/kr/co/vividnext/sodalive/member/SignOut.kt create mode 100644 src/main/kotlin/kr/co/vividnext/sodalive/member/SignOutRepository.kt create mode 100644 src/main/kotlin/kr/co/vividnext/sodalive/member/SignOutRequest.kt diff --git a/src/main/kotlin/kr/co/vividnext/sodalive/member/Member.kt b/src/main/kotlin/kr/co/vividnext/sodalive/member/Member.kt index 9179ddf..785517d 100644 --- a/src/main/kotlin/kr/co/vividnext/sodalive/member/Member.kt +++ b/src/main/kotlin/kr/co/vividnext/sodalive/member/Member.kt @@ -41,6 +41,9 @@ data class Member( @OneToMany(mappedBy = "creator") var follower: MutableList = mutableListOf() + @OneToMany(mappedBy = "member", cascade = [CascadeType.ALL]) + val signOutReasons: MutableList = mutableListOf() + @OneToOne(mappedBy = "member", fetch = FetchType.LAZY) var notification: MemberNotification? = null 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 850f27e..a515312 100644 --- a/src/main/kotlin/kr/co/vividnext/sodalive/member/MemberController.kt +++ b/src/main/kotlin/kr/co/vividnext/sodalive/member/MemberController.kt @@ -7,6 +7,7 @@ import kr.co.vividnext.sodalive.member.following.CreatorFollowRequest import kr.co.vividnext.sodalive.member.login.LoginRequest import kr.co.vividnext.sodalive.member.notification.UpdateNotificationSettingRequest import org.springframework.security.core.annotation.AuthenticationPrincipal +import org.springframework.security.core.userdetails.User import org.springframework.web.bind.annotation.GetMapping import org.springframework.web.bind.annotation.PostMapping import org.springframework.web.bind.annotation.PutMapping @@ -144,4 +145,10 @@ class MemberController(private val service: MemberService) { ApiResponse.ok(service.searchMember(nickname = nickname, memberId = member.id!!)) } + + @PostMapping("/sign_out") + fun signOut( + @RequestBody signOutRequest: SignOutRequest, + @AuthenticationPrincipal user: User + ) = ApiResponse.ok(service.signOut(signOutRequest, user), "정상적으로 탈퇴 처리되었습니다.") } 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 b4f11eb..4ed6090 100644 --- a/src/main/kotlin/kr/co/vividnext/sodalive/member/MemberService.kt +++ b/src/main/kotlin/kr/co/vividnext/sodalive/member/MemberService.kt @@ -32,6 +32,7 @@ import org.springframework.data.repository.findByIdOrNull import org.springframework.security.authentication.UsernamePasswordAuthenticationToken import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder import org.springframework.security.core.context.SecurityContextHolder +import org.springframework.security.core.userdetails.User import org.springframework.security.core.userdetails.UserDetails import org.springframework.security.core.userdetails.UserDetailsService import org.springframework.security.core.userdetails.UsernameNotFoundException @@ -51,6 +52,7 @@ class MemberService( private val stipulationAgreeRepository: StipulationAgreeRepository, private val creatorFollowingRepository: CreatorFollowingRepository, private val blockMemberRepository: BlockMemberRepository, + private val signOutRepository: SignOutRepository, private val memberNotificationService: MemberNotificationService, @@ -390,4 +392,22 @@ class MemberService( private fun getOrCreateLock(memberId: Long): ReentrantReadWriteLock { return tokenLocks.computeIfAbsent(memberId) { ReentrantReadWriteLock() } } + + @Transactional + fun signOut(signOutRequest: SignOutRequest, user: User) { + val member = repository.findByEmail(user.username) ?: throw SodaException("로그인 정보를 확인해주세요.") + if (!passwordEncoder.matches(signOutRequest.password, member.password)) { + throw SodaException("비밀번호가 일치하지 않습니다.") + } + + if (signOutRequest.reason.isBlank()) { + throw SodaException("탈퇴하려는 이유를 입력해 주세요.") + } + + member.isActive = false + + val signOut = SignOut(reason = signOutRequest.reason) + signOut.member = member + signOutRepository.save(signOut) + } } diff --git a/src/main/kotlin/kr/co/vividnext/sodalive/member/SignOut.kt b/src/main/kotlin/kr/co/vividnext/sodalive/member/SignOut.kt new file mode 100644 index 0000000..5447060 --- /dev/null +++ b/src/main/kotlin/kr/co/vividnext/sodalive/member/SignOut.kt @@ -0,0 +1,22 @@ +package kr.co.vividnext.sodalive.member + +import kr.co.vividnext.sodalive.common.BaseEntity +import javax.persistence.Column +import javax.persistence.Entity +import javax.persistence.FetchType +import javax.persistence.JoinColumn +import javax.persistence.ManyToOne + +@Entity +data class SignOut( + @Column(columnDefinition = "TEXT", nullable = false) + val reason: String +) : BaseEntity() { + @ManyToOne(fetch = FetchType.LAZY) + @JoinColumn(name = "member_id", nullable = false) + var member: Member? = null + set(value) { + value?.signOutReasons?.add(this) + field = value + } +} diff --git a/src/main/kotlin/kr/co/vividnext/sodalive/member/SignOutRepository.kt b/src/main/kotlin/kr/co/vividnext/sodalive/member/SignOutRepository.kt new file mode 100644 index 0000000..c81dc61 --- /dev/null +++ b/src/main/kotlin/kr/co/vividnext/sodalive/member/SignOutRepository.kt @@ -0,0 +1,7 @@ +package kr.co.vividnext.sodalive.member + +import org.springframework.data.jpa.repository.JpaRepository +import org.springframework.stereotype.Repository + +@Repository +interface SignOutRepository : JpaRepository diff --git a/src/main/kotlin/kr/co/vividnext/sodalive/member/SignOutRequest.kt b/src/main/kotlin/kr/co/vividnext/sodalive/member/SignOutRequest.kt new file mode 100644 index 0000000..208323d --- /dev/null +++ b/src/main/kotlin/kr/co/vividnext/sodalive/member/SignOutRequest.kt @@ -0,0 +1,6 @@ +package kr.co.vividnext.sodalive.member + +data class SignOutRequest( + val reason: String, + val password: String +)