Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[PC-615] 회원 탈퇴 이유 저장 #62

Merged
merged 10 commits into from
Feb 16, 2025
Original file line number Diff line number Diff line change
Expand Up @@ -7,20 +7,23 @@
import org.yapp.core.domain.profile.Profile;
import org.yapp.core.domain.user.RoleStatus;
import org.yapp.core.domain.user.User;
import org.yapp.core.domain.user.UserDeleteReason;
import org.yapp.core.domain.user.UserRejectHistory;
import org.yapp.core.exception.ApplicationException;
import org.yapp.core.exception.error.code.UserErrorCode;
import org.yapp.domain.auth.presentation.dto.response.OauthLoginResponse;
import org.yapp.domain.user.dao.UserDeleteReasonRepository;
import org.yapp.domain.user.dao.UserRejectHistoryRepository;
import org.yapp.domain.user.dao.UserRepository;
import org.yapp.domain.user.presentation.response.UserRejectHistoryResponse;
import org.yapp.domain.user.presentation.dto.response.UserRejectHistoryResponse;

@Service
@RequiredArgsConstructor
public class UserService {

private final UserRepository userRepository;
private final UserRejectHistoryRepository userRejectHistoryRepository;
private final UserDeleteReasonRepository userDeleteReasonRepository;
private final JwtUtil jwtUtil;

/**
Expand Down Expand Up @@ -92,7 +95,8 @@ public UserRejectHistoryResponse getUserRejectHistoryLatest(Long userId) {
}

@Transactional
public void deleteUser(Long userId) {
public void deleteUser(Long userId, String reason) {
userDeleteReasonRepository.save(new UserDeleteReason(userId, reason));
userRepository.deleteById(userId);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
package org.yapp.domain.user.dao;

import org.springframework.data.jpa.repository.JpaRepository;
import org.yapp.core.domain.user.UserDeleteReason;

public interface UserDeleteReasonRepository extends JpaRepository<UserDeleteReason, Long> {

}
Original file line number Diff line number Diff line change
@@ -1,17 +1,20 @@
package org.yapp.domain.user.presentation;

import io.swagger.v3.oas.annotations.Operation;
import jakarta.validation.Valid;
import lombok.RequiredArgsConstructor;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
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.GetMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.yapp.domain.user.application.UserService;
import org.yapp.domain.user.presentation.response.UserRejectHistoryResponse;
import org.yapp.domain.user.presentation.dto.request.UserDeleteRequest;
import org.yapp.domain.user.presentation.dto.response.UserRejectHistoryResponse;
import org.yapp.format.CommonResponse;

@RestController
Expand All @@ -34,10 +37,12 @@ public ResponseEntity<CommonResponse<UserRejectHistoryResponse>> getUserRejectHi
}

@DeleteMapping
@PreAuthorize(value = "hasRole('USER')")
@PreAuthorize(value = "hasAnyAuthority('REGISTER','USER')")
@Operation(summary = "회원 탈퇴", description = "회원 탈퇴합니다.", tags = {"사용자"})
public ResponseEntity<CommonResponse<Void>> deleteUser(@AuthenticationPrincipal Long userId) {
userService.deleteUser(userId);
public ResponseEntity<CommonResponse<Void>> deleteUser(
@RequestBody @Valid UserDeleteRequest request,
@AuthenticationPrincipal Long userId) {
userService.deleteUser(userId, request.getReason());
return ResponseEntity.ok(CommonResponse.createSuccessWithNoContent());
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
package org.yapp.domain.user.presentation.dto.request;

import jakarta.validation.constraints.Size;
import lombok.Getter;
import lombok.NoArgsConstructor;

@NoArgsConstructor
@Getter
public class UserDeleteRequest {

@Size(max = 100, message = "탈퇴 이유는 100자 이하여야합니다.")
private String reason;
}
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package org.yapp.domain.user.presentation.response;
package org.yapp.domain.user.presentation.dto.response;

import org.yapp.core.domain.profile.ProfileStatus;

Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
package org.yapp.core.domain.user;

import jakarta.persistence.Column;
import jakarta.persistence.Entity;
import jakarta.persistence.Id;
import jakarta.persistence.Table;
import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.NoArgsConstructor;

@Entity
@Getter
@NoArgsConstructor
@AllArgsConstructor
@Table(name = "user_delete_reason")
public class UserDeleteReason {

@Id
@Column(name = "user_id")
private Long id;

@Column(name = "reason")
private String reason;
}
Loading