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
2 changes: 1 addition & 1 deletion build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -74,6 +74,6 @@ tasks.withType(JavaCompile){

bootJar{
archiveBaseName = 'BalbamBalbam-Application'
archiveVersion = '1.2.0'
archiveVersion = '1.2.1'
exclude '**/application-local.properties'
}
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@
@Getter
@Setter
@NoArgsConstructor
public class CustomCard {
public class CustomCard {
@Id
@Column(name = "id")
@GeneratedValue(strategy = GenerationType.IDENTITY)
Expand Down
30 changes: 30 additions & 0 deletions src/main/java/com/potato/balbambalbam/data/entity/Withdrawal.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
package com.potato.balbambalbam.data.entity;

import jakarta.persistence.*;
import lombok.Getter;
import lombok.Setter;

import java.time.LocalDateTime;

@Entity(name = "withdrawal")
@Getter
@Setter
public class Withdrawal {

@Id
@Column(name = "id")
@GeneratedValue(strategy = GenerationType.IDENTITY)
private long id;

@Column(name = "user_id", nullable = false)
private long userId;

@Column(name = "code", nullable = false)
private long code;

@Column(name = "details")
private String details;

@Column(name = "created_at", nullable = false)
private LocalDateTime createdAt;
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
package com.potato.balbambalbam.data.entity;

import jakarta.persistence.*;
import lombok.Getter;
import lombok.Setter;

@Entity(name = "withdrawal_code")
@Getter
@Setter
public class WithdrawalCode {

@Id
@Column(name = "id")
private long code;

@Column(name = "description", nullable = false)
private String description;
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
package com.potato.balbambalbam.data.repository;

import com.potato.balbambalbam.data.entity.Withdrawal;
import org.springframework.data.jpa.repository.JpaRepository;

public interface WithdrawalRepository extends JpaRepository<Withdrawal, Long> {
}
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@
import jakarta.servlet.http.HttpServletResponse;
import jakarta.transaction.Transactional;
import java.time.LocalDateTime;
import java.util.UUID;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;

Expand Down Expand Up @@ -139,13 +140,19 @@ public void anonymizeUserData(String socialId) {
cardScoreRepository.deleteByUserId(userId);
customCardRepository.deleteByUserId(userId);
notificationReadRepository.deleteByUserId(userId);
refreshRepository.deleteByUserId(userId);
userAttendanceRepository.deleteByUserId(userId);
userLevelRepository.deleteByUserId(userId);
userWeakSoundRepository.deleteByUserId(userId);
refreshRepository.deleteByUserId(userId);

// 3. UUID 생성 (중복 체크)
String uniqueSocialId;
do {
uniqueSocialId = "Deleted_" + UUID.randomUUID();
} while (userRepository.existsBySocialId(uniqueSocialId)); // DB에 같은 UUID가 있으면 다시 생성

// 3. 사용자 민감 정보 초기화 (익명화)
user.setSocialId("Deleted");
// 4. 사용자 민감 정보 초기화 (익명화)
user.setSocialId(uniqueSocialId);
user.setName("Anonymous");
user.setStatusId(4L); // 익명화된 사용자 상태로 설정
userRepository.save(user);
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
package com.potato.balbambalbam.user.withdrawal.controller;

import com.potato.balbambalbam.user.token.jwt.JWTUtil;
import com.potato.balbambalbam.user.withdrawal.dto.WithdrawalRequestDto;
import com.potato.balbambalbam.user.withdrawal.service.WithdrawalService;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.responses.ApiResponse;
import io.swagger.v3.oas.annotations.responses.ApiResponses;
import io.swagger.v3.oas.annotations.tags.Tag;
import lombok.RequiredArgsConstructor;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestHeader;
import org.springframework.web.bind.annotation.RestController;


@RequiredArgsConstructor
@RestController
@Tag(name = "Withdrawal API", description = "탈퇴 사유를 저장한다.")
public class WithdrawalController {

private final JWTUtil jwtUtil;
private final WithdrawalService withdrawalService;

@Operation(summary = "사용자 계정 탈퇴 사유", description = "사용자의 탈퇴 사유를 저장합니다.")
@ApiResponses(value = {
@ApiResponse(responseCode = "200", description = "탈퇴 사유 저장 성공"),
})
@PostMapping("/users/withdrawal")
public ResponseEntity<?> setWithdrawal(
@RequestHeader("access") String access, @RequestBody WithdrawalRequestDto requestDto) {

Long userId = jwtUtil.getUserId(access);
withdrawalService.processWithdrawal(userId, requestDto);

return ResponseEntity.ok().body("사용자의 탈퇴 사유 저장 완료");
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
package com.potato.balbambalbam.user.withdrawal.dto;

import io.swagger.v3.oas.annotations.media.Schema;
import jakarta.validation.constraints.NotNull;
import lombok.Getter;
import lombok.Setter;

@Getter
@Setter
@Schema(description = "탈퇴 사유 Request DTO")
public class WithdrawalRequestDto {

@NotNull(message = "탈퇴 사유 코드가 필요합니다.")
private Long reasonCode;
private String details;
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
package com.potato.balbambalbam.user.withdrawal.service;

import com.potato.balbambalbam.data.entity.Withdrawal;
import com.potato.balbambalbam.data.repository.UserRepository;
import com.potato.balbambalbam.data.repository.WithdrawalRepository;
import com.potato.balbambalbam.user.withdrawal.dto.WithdrawalRequestDto;
import java.time.LocalDateTime;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;

@Service
@RequiredArgsConstructor
public class WithdrawalService {

private final WithdrawalRepository withdrawalRepository;

public void processWithdrawal(Long userId, WithdrawalRequestDto requestDto) {

// 탈퇴 사유가 'Other(6)'일 경우, details가 필수
if (requestDto.getReasonCode() == 6 && (requestDto.getDetails() == null || requestDto.getDetails().isBlank())) {
throw new IllegalArgumentException("Other인 경우 입력값이 필요합니다.");
}

// 탈퇴 기록 저장
Withdrawal withdrawal = new Withdrawal();
withdrawal.setUserId(userId);
withdrawal.setCode(requestDto.getReasonCode());
withdrawal.setDetails(requestDto.getReasonCode() == 6 ? requestDto.getDetails() : null);
withdrawal.setCreatedAt(LocalDateTime.now());

withdrawalRepository.save(withdrawal);
}
}