diff --git a/src/main/java/cmc/peerna/domain/PeerFeedback.java b/src/main/java/cmc/peerna/domain/PeerFeedback.java index 1fe107b..50c87c9 100644 --- a/src/main/java/cmc/peerna/domain/PeerFeedback.java +++ b/src/main/java/cmc/peerna/domain/PeerFeedback.java @@ -32,4 +32,8 @@ public class PeerFeedback extends BaseEntity { public void updateWriter(Member member) { this.writer = member; } + public void updateWriterToNull(){ + this.writer = null; + } + } diff --git a/src/main/java/cmc/peerna/domain/PeerGradeResult.java b/src/main/java/cmc/peerna/domain/PeerGradeResult.java index ab1e387..3dc5bbe 100644 --- a/src/main/java/cmc/peerna/domain/PeerGradeResult.java +++ b/src/main/java/cmc/peerna/domain/PeerGradeResult.java @@ -27,4 +27,8 @@ public class PeerGradeResult extends BaseEntity { public void updateWriter(Member member) { this.writer = member; } + public void updateWriterToNull(){ + this.writer = null; + } + } diff --git a/src/main/java/cmc/peerna/domain/PeerTest.java b/src/main/java/cmc/peerna/domain/PeerTest.java index aff91e7..0eaa159 100644 --- a/src/main/java/cmc/peerna/domain/PeerTest.java +++ b/src/main/java/cmc/peerna/domain/PeerTest.java @@ -35,4 +35,8 @@ public class PeerTest extends BaseEntity { public void updateWriter(Member member) { this.writer = member; } + + public void updateWriterToNull(){ + this.writer = null; + } } diff --git a/src/main/java/cmc/peerna/repository/PeerFeedbackRepository.java b/src/main/java/cmc/peerna/repository/PeerFeedbackRepository.java index 2ead810..98b6342 100644 --- a/src/main/java/cmc/peerna/repository/PeerFeedbackRepository.java +++ b/src/main/java/cmc/peerna/repository/PeerFeedbackRepository.java @@ -17,4 +17,8 @@ public interface PeerFeedbackRepository extends JpaRepository findTop3ByTargetOrderByCreatedAtDesc(Member target); Page findAllByTarget(Member target, PageRequest pageRequest); + + List findAllByWriter(Member writer); + + void deleteAllByTarget(Member target); } diff --git a/src/main/java/cmc/peerna/repository/PeerGradeResultRepository.java b/src/main/java/cmc/peerna/repository/PeerGradeResultRepository.java index ec42b31..340077d 100644 --- a/src/main/java/cmc/peerna/repository/PeerGradeResultRepository.java +++ b/src/main/java/cmc/peerna/repository/PeerGradeResultRepository.java @@ -15,7 +15,10 @@ public interface PeerGradeResultRepository extends JpaRepository findAllByTarget(Member target); + List findAllByWriter(Member writer); Long countByTarget(Member target); + void deleteAllByTarget(Member target); + } diff --git a/src/main/java/cmc/peerna/repository/PeerTestRepository.java b/src/main/java/cmc/peerna/repository/PeerTestRepository.java index 5f88c23..5f47554 100644 --- a/src/main/java/cmc/peerna/repository/PeerTestRepository.java +++ b/src/main/java/cmc/peerna/repository/PeerTestRepository.java @@ -9,7 +9,11 @@ public interface PeerTestRepository extends JpaRepository { List findALlByTarget(Member target); + List findALlByWriter(Member writer); List findAllByNonMemberUuid(String nonMemberUuid); Long countByTargetAndAnswerId(Member target, Long answerId); + + void deleteAllByTarget(Member target); + } diff --git a/src/main/java/cmc/peerna/service/MemberService.java b/src/main/java/cmc/peerna/service/MemberService.java index 06498bd..2763aec 100644 --- a/src/main/java/cmc/peerna/service/MemberService.java +++ b/src/main/java/cmc/peerna/service/MemberService.java @@ -23,4 +23,6 @@ public interface MemberService { MemberRequestDto.profileUpdateDto updateMemberProfile(Member member, MemberRequestDto.profileUpdateDto request); String regenerateAccessToken(RefreshToken refreshToken); + + void withdrawal(Member member); } diff --git a/src/main/java/cmc/peerna/service/serviceImpl/MemberServiceImpl.java b/src/main/java/cmc/peerna/service/serviceImpl/MemberServiceImpl.java index eeb361f..4132d3d 100644 --- a/src/main/java/cmc/peerna/service/serviceImpl/MemberServiceImpl.java +++ b/src/main/java/cmc/peerna/service/serviceImpl/MemberServiceImpl.java @@ -3,13 +3,11 @@ import cmc.peerna.apiResponse.code.ResponseStatus; import cmc.peerna.apiResponse.exception.handler.MemberException; import cmc.peerna.converter.MemberConverter; -import cmc.peerna.domain.Member; -import cmc.peerna.domain.PeerGradeResult; +import cmc.peerna.domain.*; import cmc.peerna.domain.enums.SocialType; import cmc.peerna.jwt.JwtProvider; import cmc.peerna.redis.domain.RefreshToken; -import cmc.peerna.repository.MemberRepository; -import cmc.peerna.repository.PeerGradeResultRepository; +import cmc.peerna.repository.*; import cmc.peerna.service.MemberService; import cmc.peerna.web.dto.requestDto.MemberRequestDto; import cmc.peerna.web.dto.responseDto.MemberResponseDto; @@ -29,7 +27,11 @@ public class MemberServiceImpl implements MemberService { private final MemberRepository memberRepository; + private final SelfTestRepository selfTestRepository; + private final SelfTestResultRepository selfTestResultRepository; private final PeerGradeResultRepository peerGradeResultRepository; + private final PeerFeedbackRepository peerFeedbackRepository; + private final PeerTestRepository peerTestRepository; private final JwtProvider jwtProvider; @@ -112,4 +114,30 @@ public String regenerateAccessToken(RefreshToken refreshToken) { String accessToken = jwtProvider.createAccessToken(member.getId(), member.getSocialType().toString(), member.getSocialId(), Arrays.asList(new SimpleGrantedAuthority("USER"))); return accessToken; } + + @Override + @Transactional + public void withdrawal(Member member) { + selfTestRepository.deleteAllByWriter(member); + selfTestResultRepository.deleteByMember(member); + peerTestRepository.deleteAllByTarget(member); + peerFeedbackRepository.deleteAllByTarget(member); + peerGradeResultRepository.deleteAllByTarget(member); + + List peerTestListByWriter = peerTestRepository.findALlByWriter(member); + for (PeerTest peerTest : peerTestListByWriter) { + peerTest.updateWriterToNull(); + } + + List peerFeedbackListByWriter = peerFeedbackRepository.findAllByWriter(member); + for (PeerFeedback peerFeedback : peerFeedbackListByWriter) { + peerFeedback.updateWriterToNull(); + } + + List peerGradeResultListByWriter = peerGradeResultRepository.findAllByWriter(member); + for (PeerGradeResult peerGradeResult : peerGradeResultListByWriter) { + peerGradeResult.updateWriterToNull(); + } + memberRepository.deleteById(member.getId()); + } } diff --git a/src/main/java/cmc/peerna/web/controller/MemberController.java b/src/main/java/cmc/peerna/web/controller/MemberController.java index 5e905ba..f7f1bba 100644 --- a/src/main/java/cmc/peerna/web/controller/MemberController.java +++ b/src/main/java/cmc/peerna/web/controller/MemberController.java @@ -3,6 +3,7 @@ import cmc.peerna.apiResponse.code.ResponseStatus; import cmc.peerna.apiResponse.exception.handler.MemberException; import cmc.peerna.apiResponse.response.ResponseDto; +import cmc.peerna.converter.MemberConverter; import cmc.peerna.domain.Member; import cmc.peerna.domain.enums.SocialType; import cmc.peerna.domain.enums.UserRole; @@ -257,6 +258,17 @@ ResponseDto getMemberBasicInfo(@AuthMember } - + @Operation(summary = "회원탈퇴 API ✔️🔑", description = "회원탈퇴 API입니다.") + @ApiResponses({ + @ApiResponse(responseCode = "2200", description = "BAD_REQUEST, 존재하지 않는 유저를 조회한 경우.") + }) + @Parameters({ + @Parameter(name = "member", hidden = true) + }) + @PostMapping("/member/withdrawal") + ResponseDto withdrawal(@AuthMember Member member) { + memberService.withdrawal(member); + return ResponseDto.of(MemberConverter.toMemberStatusDto(member.getId(), "회원탈퇴 완료")); + } }