From e137e1c2ef27376fdda1694f093ff0a4f6d098c2 Mon Sep 17 00:00:00 2001 From: yoownny Date: Mon, 10 Feb 2025 01:03:20 +0900 Subject: [PATCH] =?UTF-8?q?[Feat]=20:=20=ED=83=88=ED=87=B4=ED=95=9C=20?= =?UTF-8?q?=EC=82=AC=EC=9A=A9=EC=9E=90=20=EB=B3=B5=EA=B5=AC=20=EC=84=A4?= =?UTF-8?q?=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../data/repository/CustomCardRepository.java | 2 ++ .../NotificationReadRepository.java | 2 ++ .../data/repository/RefreshRepository.java | 5 +++ .../data/repository/UserRepository.java | 1 - .../report/controller/ReportController.java | 6 ++-- .../user/join/controller/JoinController.java | 14 ++++++++ .../user/join/service/JoinService.java | 33 +++++++++++++++++++ .../setting/controller/ProfileController.java | 13 -------- .../user/setting/service/ProfileService.java | 11 +++++-- 9 files changed, 68 insertions(+), 19 deletions(-) diff --git a/src/main/java/com/potato/balbambalbam/data/repository/CustomCardRepository.java b/src/main/java/com/potato/balbambalbam/data/repository/CustomCardRepository.java index 0e2d2eb1..265e3be4 100644 --- a/src/main/java/com/potato/balbambalbam/data/repository/CustomCardRepository.java +++ b/src/main/java/com/potato/balbambalbam/data/repository/CustomCardRepository.java @@ -27,4 +27,6 @@ public interface CustomCardRepository extends JpaRepository { @Query("SELECT COUNT(cc) FROM custom_card cc WHERE cc.userId = :userId") Long countByUserId(@Param("userId") Long userId); + + void deleteByUserId(Long userId); } \ No newline at end of file diff --git a/src/main/java/com/potato/balbambalbam/data/repository/NotificationReadRepository.java b/src/main/java/com/potato/balbambalbam/data/repository/NotificationReadRepository.java index a42cb2a0..22509f1b 100644 --- a/src/main/java/com/potato/balbambalbam/data/repository/NotificationReadRepository.java +++ b/src/main/java/com/potato/balbambalbam/data/repository/NotificationReadRepository.java @@ -7,4 +7,6 @@ public interface NotificationReadRepository extends JpaRepository { List findByUserId(Long userId); boolean existsByNotificationIdAndUserId(Long notificationId, Long userId); + + void deleteByUserId(Long userId); } diff --git a/src/main/java/com/potato/balbambalbam/data/repository/RefreshRepository.java b/src/main/java/com/potato/balbambalbam/data/repository/RefreshRepository.java index c2240ab8..f47de3ae 100644 --- a/src/main/java/com/potato/balbambalbam/data/repository/RefreshRepository.java +++ b/src/main/java/com/potato/balbambalbam/data/repository/RefreshRepository.java @@ -1,9 +1,11 @@ package com.potato.balbambalbam.data.repository; import com.potato.balbambalbam.data.entity.Refresh; +import com.potato.balbambalbam.data.entity.User; import jakarta.transaction.Transactional; import java.time.LocalDateTime; import java.util.List; +import java.util.Optional; import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.data.jpa.repository.Modifying; import org.springframework.data.jpa.repository.Query; @@ -15,6 +17,9 @@ public interface RefreshRepository extends JpaRepository { @Query("SELECT r.refresh FROM refresh r WHERE r.socialId = :socialId") String findRefreshBySocialId(@Param("socialId") String socialId); + @Query("SELECT r FROM refresh r WHERE r.userId = :userId") + Refresh findRefreshByUserId(@Param("userId") Long userId); + @Transactional @Modifying @Query("DELETE FROM refresh r WHERE r.userId = :userId") diff --git a/src/main/java/com/potato/balbambalbam/data/repository/UserRepository.java b/src/main/java/com/potato/balbambalbam/data/repository/UserRepository.java index 4bb3e899..21f1147b 100644 --- a/src/main/java/com/potato/balbambalbam/data/repository/UserRepository.java +++ b/src/main/java/com/potato/balbambalbam/data/repository/UserRepository.java @@ -9,6 +9,5 @@ @Repository public interface UserRepository extends JpaRepository { Optional findBySocialId(String socialId); - Boolean existsBySocialId(String SocialId); } \ No newline at end of file diff --git a/src/main/java/com/potato/balbambalbam/myReport/report/controller/ReportController.java b/src/main/java/com/potato/balbambalbam/myReport/report/controller/ReportController.java index 062f849a..f15ff317 100644 --- a/src/main/java/com/potato/balbambalbam/myReport/report/controller/ReportController.java +++ b/src/main/java/com/potato/balbambalbam/myReport/report/controller/ReportController.java @@ -40,9 +40,9 @@ public ResponseEntity getHomeInfo(@RequestHeader("access") String @Operation(summary = "사용자 카드 레벨 설정", description = "사용자가 선택한 카드 레벨을 설정한다.") @ApiResponses(value = { - @ApiResponse(responseCode = "200", description = "카드 레벨 설정 성공", content = @Content), - @ApiResponse(responseCode = "400", description = "잘못된 요청", content = @Content), - @ApiResponse(responseCode = "500", description = "서버 오류 발생", content = @Content) + @ApiResponse(responseCode = "200", description = "카드 레벨 설정 성공", content = @Content(mediaType = "application/json", schema = @Schema(implementation = CardLevelRequestDto.class))), + @ApiResponse(responseCode = "400", description = "잘못된 요청", content = @Content(mediaType = "application/json", schema = @Schema(implementation = ExceptionDto.class))), + @ApiResponse(responseCode = "500", description = "서버 오류 발생", content = @Content(mediaType = "application/json", schema = @Schema(implementation = ExceptionDto.class))) }) @PostMapping("/report/cardLevel") public ResponseEntity setCardLevel(@RequestHeader("access") String access, @RequestBody CardLevelRequestDto requestDto) { diff --git a/src/main/java/com/potato/balbambalbam/user/join/controller/JoinController.java b/src/main/java/com/potato/balbambalbam/user/join/controller/JoinController.java index f5d7b2bb..ef24e731 100644 --- a/src/main/java/com/potato/balbambalbam/user/join/controller/JoinController.java +++ b/src/main/java/com/potato/balbambalbam/user/join/controller/JoinController.java @@ -18,6 +18,7 @@ import org.springframework.http.ResponseEntity; import org.springframework.stereotype.Controller; import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.DeleteMapping; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.PostMapping; @@ -80,4 +81,17 @@ public ResponseEntity recoverUser(@RequestParam("socialId") String socialId, return ResponseEntity.ok(message); // 복구 성공 시 성공 메시지 반환 } + + @DeleteMapping("/users/delete") + @Operation(summary = "탈퇴 계정 삭제", description = "사용자의 민감 정보를 초기화하고 나머지 데이터는 남겨둔다.") + @ApiResponses({ + @ApiResponse(responseCode = "200", description = "사용자 민감 정보 초기화 성공", content = @Content(mediaType = "application/json")), + @ApiResponse(responseCode = "404", description = "사용자를 찾을 수 없음", content = @Content(mediaType = "application/json", schema = @Schema(implementation = ExceptionDto.class))) + }) + // 회원정보 영구 삭제 + public ResponseEntity anonymizeUser(@RequestParam("socialId") String socialId) { + joinService.anonymizeUserData(socialId); + return ResponseEntity.ok("사용자의 데이터가 초기화되었습니다."); + } + } diff --git a/src/main/java/com/potato/balbambalbam/user/join/service/JoinService.java b/src/main/java/com/potato/balbambalbam/user/join/service/JoinService.java index a45fc547..cfc0c1a1 100644 --- a/src/main/java/com/potato/balbambalbam/user/join/service/JoinService.java +++ b/src/main/java/com/potato/balbambalbam/user/join/service/JoinService.java @@ -25,6 +25,12 @@ public class JoinService { private final JWTUtil jwtUtil; private final RefreshRepository refreshRepository; private final UserLevelRepository userLevelRepository; + private final CardBookmarkRepository cardBookmarkRepository; + private final CardScoreRepository cardScoreRepository; + private final CustomCardRepository customCardRepository; + private final NotificationReadRepository notificationReadRepository; + private final UserAttendanceRepository userAttendanceRepository; + private final UserWeakSoundRepository userWeakSoundRepository; //새로운 회원정보 저장 @Transactional @@ -120,4 +126,31 @@ public String recoverDeletedUser(String socialId, HttpServletResponse response) return "계정이 성공적으로 복구되었습니다."; } + @Transactional + public void anonymizeUserData(String socialId) { + // 1. 사용자 조회 + User user = userRepository.findBySocialId(socialId) + .orElseThrow(() -> new UserNotFoundException("해당 사용자를 찾을 수 없습니다.")); + + Long userId = user.getId(); + + // 2. 모든 연관된 데이터 삭제 + cardBookmarkRepository.deleteByUserId(userId); + cardScoreRepository.deleteByUserId(userId); + customCardRepository.deleteByUserId(userId); + notificationReadRepository.deleteByUserId(userId); + refreshRepository.deleteByUserId(userId); + userAttendanceRepository.deleteByUserId(userId); + userLevelRepository.deleteByUserId(userId); + userWeakSoundRepository.deleteByUserId(userId); + + // 3. 사용자 민감 정보 초기화 (익명화) + user.setSocialId("Deleted"); + user.setName("Anonymous"); + user.setStatusId(4L); // 익명화된 사용자 상태로 설정 + userRepository.save(user); + } + + + } \ No newline at end of file diff --git a/src/main/java/com/potato/balbambalbam/user/setting/controller/ProfileController.java b/src/main/java/com/potato/balbambalbam/user/setting/controller/ProfileController.java index de1afec4..e24c6291 100644 --- a/src/main/java/com/potato/balbambalbam/user/setting/controller/ProfileController.java +++ b/src/main/java/com/potato/balbambalbam/user/setting/controller/ProfileController.java @@ -34,11 +34,6 @@ public class ProfileController { private final RefreshRepository refreshRepository; private final JWTUtil jwtUtil; - private String extractSocialIdFromToken(String access) { - String socialId = jwtUtil.getSocialId(access); - return socialId; - } - @Operation(summary = "회원정보 수정", description = "기존 사용자의 정보를 수정한다.") @ApiResponses(value = { @ApiResponse(responseCode = "200", description = "회원정보가 성공적으로 수정된 경우", content = @Content(mediaType = "application/json", schema = @Schema(implementation = EditResponseDto.class))), @@ -73,14 +68,6 @@ public ResponseEntity deleteUser(@RequestHeader("access") String access, String name = deleteUserDto.getName(); profileService.deleteUser(userId, name); - // refresh - String socialID = extractSocialIdFromToken(access); - String refresh = refreshRepository.findRefreshBySocialId(socialID); - - if (refresh != null && refreshRepository.existsByRefresh(refresh)) { - refreshRepository.deleteByUserId(userId); - } - return ResponseEntity.ok().body("회원 탈퇴가 완료되었습니다."); //200 } } diff --git a/src/main/java/com/potato/balbambalbam/user/setting/service/ProfileService.java b/src/main/java/com/potato/balbambalbam/user/setting/service/ProfileService.java index bfd06f42..7b280960 100644 --- a/src/main/java/com/potato/balbambalbam/user/setting/service/ProfileService.java +++ b/src/main/java/com/potato/balbambalbam/user/setting/service/ProfileService.java @@ -1,11 +1,15 @@ package com.potato.balbambalbam.user.setting.service; +import com.potato.balbambalbam.data.entity.Refresh; import com.potato.balbambalbam.data.entity.User; +import com.potato.balbambalbam.data.repository.RefreshRepository; import com.potato.balbambalbam.data.repository.UserRepository; import com.potato.balbambalbam.exception.UserNotFoundException; import com.potato.balbambalbam.user.setting.dto.EditResponseDto; import jakarta.transaction.Transactional; +import java.time.LocalDateTime; +import java.util.Optional; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; @@ -13,6 +17,7 @@ @Service public class ProfileService { private final UserRepository userRepository; + private final RefreshRepository refreshRepository; // 회원정보 업데이트 @Transactional @@ -34,8 +39,10 @@ public EditResponseDto updateUser(Long userId, EditResponseDto editResponseDto) public void deleteUser(Long userId, String name) { User user = userRepository.findById(userId) .orElseThrow(() -> new UserNotFoundException("사용자를 찾을 수 없습니다.")); - user.setStatusId(3L); - } + Refresh refresh = refreshRepository.findRefreshByUserId(userId); + refresh.setExpiration(LocalDateTime.now()); + + } }