Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -27,4 +27,6 @@ public interface CustomCardRepository extends JpaRepository<CustomCard, Long> {

@Query("SELECT COUNT(cc) FROM custom_card cc WHERE cc.userId = :userId")
Long countByUserId(@Param("userId") Long userId);

void deleteByUserId(Long userId);
}
Original file line number Diff line number Diff line change
Expand Up @@ -7,4 +7,6 @@
public interface NotificationReadRepository extends JpaRepository<NotificationRead, Long> {
List<NotificationRead> findByUserId(Long userId);
boolean existsByNotificationIdAndUserId(Long notificationId, Long userId);

void deleteByUserId(Long userId);
}
Original file line number Diff line number Diff line change
@@ -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;
Expand All @@ -15,6 +17,9 @@ public interface RefreshRepository extends JpaRepository<Refresh, Long> {
@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")
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,5 @@
@Repository
public interface UserRepository extends JpaRepository<User, Long> {
Optional<User> findBySocialId(String socialId);

Boolean existsBySocialId(String SocialId);
}
Original file line number Diff line number Diff line change
Expand Up @@ -40,9 +40,9 @@ public ResponseEntity<ReportInfoDto> 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<String> setCardLevel(@RequestHeader("access") String access, @RequestBody CardLevelRequestDto requestDto) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -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<String> anonymizeUser(@RequestParam("socialId") String socialId) {
joinService.anonymizeUserData(socialId);
return ResponseEntity.ok("사용자의 데이터가 초기화되었습니다.");
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -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);
}



}
Original file line number Diff line number Diff line change
Expand Up @@ -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))),
Expand Down Expand Up @@ -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
}
}
Original file line number Diff line number Diff line change
@@ -1,18 +1,23 @@
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;

@RequiredArgsConstructor
@Service
public class ProfileService {
private final UserRepository userRepository;
private final RefreshRepository refreshRepository;

// 회원정보 업데이트
@Transactional
Expand All @@ -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());

}
}