diff --git a/application/external-api-v2/src/main/java/com/namo/spring/application/external/api/user/controller/AuthController.java b/application/external-api-v2/src/main/java/com/namo/spring/application/external/api/user/controller/AuthController.java index 663e26e4..8f8eaa40 100644 --- a/application/external-api-v2/src/main/java/com/namo/spring/application/external/api/user/controller/AuthController.java +++ b/application/external-api-v2/src/main/java/com/namo/spring/application/external/api/user/controller/AuthController.java @@ -4,6 +4,7 @@ import org.springframework.security.access.prepost.PreAuthorize; import org.springframework.security.core.annotation.AuthenticationPrincipal; +import org.springframework.web.bind.annotation.DeleteMapping; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestBody; @@ -105,4 +106,20 @@ public ResponseDto removeAuthUser( return ResponseDto.onSuccess("회원탈퇴가 완료되었습니다."); } + @Operation(summary = "!!!!!!!!!!!!!!!!즉시 회원 탈퇴!!!!!!!!!!!!", description = """ + 즉시 회원을 탈퇴합니다. 절대 복구가 불가능합니다 + 테스트용으로만 사용해주세요!!!!!!!!!!!!!!!! + """) + @DeleteMapping("/admin/{socialType}") + @PreAuthorize("isAuthenticated()") + public ResponseDto removeUserImmediate( + @RequestHeader(value = "Authorization") String authHeader, + @RequestHeader(value = "refreshToken") String refreshToken, + @AuthenticationPrincipal SecurityUserDetails member + ) { + String accessToken = authHeader.split(" ")[1]; + memberFacade.removeMemberNow(member.getUserId(), accessToken, refreshToken); + return ResponseDto.onSuccess("즉시 회원탈퇴가 완료되었습니다."); + } + } diff --git a/application/external-api-v2/src/main/java/com/namo/spring/application/external/api/user/facade/AuthFacade.java b/application/external-api-v2/src/main/java/com/namo/spring/application/external/api/user/facade/AuthFacade.java index 52d73a7c..6681d4ce 100644 --- a/application/external-api-v2/src/main/java/com/namo/spring/application/external/api/user/facade/AuthFacade.java +++ b/application/external-api-v2/src/main/java/com/namo/spring/application/external/api/user/facade/AuthFacade.java @@ -120,4 +120,12 @@ public Member completeSignup(MemberRequest.CompleteSignUpDto dto, Long memberId) scheduleMaker.createBirthdaySchedules(savedMember); return member; } + + @Transactional + public void removeMemberNow(Long memberId, String accessToken, String refreshToken) { + Member member = memberManageService.getMember(memberId); + socialLoginService.unlinkSocialAccount(member); + jwtAuthHelper.removeJwtsToken(memberId, accessToken, refreshToken); + memberManageService.removeMember(member); + } } diff --git a/application/external-api-v2/src/main/java/com/namo/spring/application/external/api/user/scheduler/MemberScheduler.java b/application/external-api-v2/src/main/java/com/namo/spring/application/external/api/user/scheduler/MemberScheduler.java index ffa17c59..1ccfc17d 100644 --- a/application/external-api-v2/src/main/java/com/namo/spring/application/external/api/user/scheduler/MemberScheduler.java +++ b/application/external-api-v2/src/main/java/com/namo/spring/application/external/api/user/scheduler/MemberScheduler.java @@ -7,6 +7,7 @@ import org.springframework.transaction.annotation.Transactional; import com.namo.spring.application.external.api.user.service.MemberManageService; +import com.namo.spring.application.external.api.user.service.SocialLoginService; import com.namo.spring.db.mysql.domains.user.entity.Member; import lombok.RequiredArgsConstructor; @@ -18,6 +19,7 @@ public class MemberScheduler { private final MemberManageService memberManageService; + private final SocialLoginService socialLoginService; /** * 매일 자정에 실행되며, 탈퇴 이후 3일간 활동이 없는 사용자를 DB에서 삭제한다. @@ -39,6 +41,7 @@ public void removePendingUsersFromDB() { List pendingMembers = memberManageService.getPendingMembers(); for (Member member : pendingMembers) { log.debug("[Delete PENDING] user name: {}", member.getName()); + socialLoginService.unlinkSocialAccount(member); memberManageService.removeMember(member); } }