diff --git a/src/main/java/kr/co/fastcampus/yanabada/common/exception/PasswordConfirmationException.java b/src/main/java/kr/co/fastcampus/yanabada/common/exception/PasswordConfirmationException.java new file mode 100644 index 00000000..3cf6646d --- /dev/null +++ b/src/main/java/kr/co/fastcampus/yanabada/common/exception/PasswordConfirmationException.java @@ -0,0 +1,9 @@ +package kr.co.fastcampus.yanabada.common.exception; + +import static kr.co.fastcampus.yanabada.common.response.ErrorCode.PASSWORD_CONFIRMATION_DOES_NOT_MATCH; + +public class PasswordConfirmationException extends BaseException { + public PasswordConfirmationException() { + super(PASSWORD_CONFIRMATION_DOES_NOT_MATCH.getMessage()); + } +} diff --git a/src/main/java/kr/co/fastcampus/yanabada/common/response/ErrorCode.java b/src/main/java/kr/co/fastcampus/yanabada/common/response/ErrorCode.java index 387d0f00..eb2fa291 100644 --- a/src/main/java/kr/co/fastcampus/yanabada/common/response/ErrorCode.java +++ b/src/main/java/kr/co/fastcampus/yanabada/common/response/ErrorCode.java @@ -31,6 +31,7 @@ public enum ErrorCode { CANNOT_NEGOTIATE_OWN_PRODUCT("자신이 등록한 상품을 네고할 순 없습니다."), CHAT_ROOM_NOT_FOUND_EXCEPTION("존재하지 않은 채팅방입니다."), INCORRECT_CHAT_ROOM_MEMBER("채팅방 멤버가 올바르지 않습니다."), + PASSWORD_CONFIRMATION_DOES_NOT_MATCH("입력한 비밀번호가 서로 일치하지 않습니다."), EMAIL_SEND_FAILED("이메일 전송에 실패하였습니다."), diff --git a/src/main/java/kr/co/fastcampus/yanabada/domain/payment/controller/YanoljaPayController.java b/src/main/java/kr/co/fastcampus/yanabada/domain/payment/controller/YanoljaPayController.java index 991254bb..736f881e 100644 --- a/src/main/java/kr/co/fastcampus/yanabada/domain/payment/controller/YanoljaPayController.java +++ b/src/main/java/kr/co/fastcampus/yanabada/domain/payment/controller/YanoljaPayController.java @@ -1,11 +1,15 @@ package kr.co.fastcampus.yanabada.domain.payment.controller; +import jakarta.validation.Valid; import kr.co.fastcampus.yanabada.common.response.ResponseBody; +import kr.co.fastcampus.yanabada.domain.payment.dto.request.PayPasswordSaveRequest; import kr.co.fastcampus.yanabada.domain.payment.dto.response.YanoljaPayHomeResponse; import kr.co.fastcampus.yanabada.domain.payment.service.YanoljaPayService; import lombok.RequiredArgsConstructor; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; @@ -20,5 +24,14 @@ public class YanoljaPayController { public ResponseBody getYanoljaPay(@PathVariable Long memberId) { return ResponseBody.ok(yanoljaPayService.getYanoljaPay(memberId)); } + + @PostMapping("/pay-password/{memberId}") + public ResponseBody setPayPassword( + @PathVariable("memberId") Long memberId, + @RequestBody @Valid PayPasswordSaveRequest payPasswordSaveRequest + ) { + yanoljaPayService.setPayPassword(memberId, payPasswordSaveRequest); + return ResponseBody.ok(); + } } diff --git a/src/main/java/kr/co/fastcampus/yanabada/domain/payment/dto/request/PayPasswordSaveRequest.java b/src/main/java/kr/co/fastcampus/yanabada/domain/payment/dto/request/PayPasswordSaveRequest.java new file mode 100644 index 00000000..8854dbef --- /dev/null +++ b/src/main/java/kr/co/fastcampus/yanabada/domain/payment/dto/request/PayPasswordSaveRequest.java @@ -0,0 +1,19 @@ +package kr.co.fastcampus.yanabada.domain.payment.dto.request; + +import jakarta.validation.constraints.NotBlank; +import jakarta.validation.constraints.Pattern; +import lombok.Builder; + +@Builder +public record PayPasswordSaveRequest( + @NotBlank(message = "패스워드는 공백일 수 없습니다.") + @Pattern(regexp = "\\d{6}", message = "패스워드는 6글자이어야 합니다.") + String password, + @NotBlank(message = "확인용 패스워드도 공백일 수 없습니다.") + String confirmPassword +) { + + public boolean isPasswordMatch() { + return this.password.equals(this.confirmPassword); + } +} diff --git a/src/main/java/kr/co/fastcampus/yanabada/domain/payment/entity/YanoljaPay.java b/src/main/java/kr/co/fastcampus/yanabada/domain/payment/entity/YanoljaPay.java index a8a1ca00..11444e64 100644 --- a/src/main/java/kr/co/fastcampus/yanabada/domain/payment/entity/YanoljaPay.java +++ b/src/main/java/kr/co/fastcampus/yanabada/domain/payment/entity/YanoljaPay.java @@ -93,4 +93,8 @@ public static YanoljaPay create( balance ); } + + public void savePassword(String password) { + this.simplePassword = password; + } } \ No newline at end of file diff --git a/src/main/java/kr/co/fastcampus/yanabada/domain/payment/repository/YanoljaPayRepository.java b/src/main/java/kr/co/fastcampus/yanabada/domain/payment/repository/YanoljaPayRepository.java index 7e8d7ad9..da8a8685 100644 --- a/src/main/java/kr/co/fastcampus/yanabada/domain/payment/repository/YanoljaPayRepository.java +++ b/src/main/java/kr/co/fastcampus/yanabada/domain/payment/repository/YanoljaPayRepository.java @@ -1,11 +1,17 @@ package kr.co.fastcampus.yanabada.domain.payment.repository; +import io.lettuce.core.dynamic.annotation.Param; +import jakarta.validation.constraints.Pattern; import java.util.Optional; import kr.co.fastcampus.yanabada.domain.member.entity.Member; import kr.co.fastcampus.yanabada.domain.payment.entity.YanoljaPay; import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.data.jpa.repository.Modifying; +import org.springframework.data.jpa.repository.Query; public interface YanoljaPayRepository extends JpaRepository { + Optional findByMember(Member member); + } diff --git a/src/main/java/kr/co/fastcampus/yanabada/domain/payment/service/YanoljaPayService.java b/src/main/java/kr/co/fastcampus/yanabada/domain/payment/service/YanoljaPayService.java index 8e8f2acb..70c77955 100644 --- a/src/main/java/kr/co/fastcampus/yanabada/domain/payment/service/YanoljaPayService.java +++ b/src/main/java/kr/co/fastcampus/yanabada/domain/payment/service/YanoljaPayService.java @@ -1,8 +1,11 @@ package kr.co.fastcampus.yanabada.domain.payment.service; +import kr.co.fastcampus.yanabada.common.exception.MemberNotFoundException; +import kr.co.fastcampus.yanabada.common.exception.PasswordConfirmationException; import kr.co.fastcampus.yanabada.common.exception.YanoljaPayNotFoundException; import kr.co.fastcampus.yanabada.domain.member.entity.Member; import kr.co.fastcampus.yanabada.domain.member.repository.MemberRepository; +import kr.co.fastcampus.yanabada.domain.payment.dto.request.PayPasswordSaveRequest; import kr.co.fastcampus.yanabada.domain.payment.dto.response.YanoljaPayHomeResponse; import kr.co.fastcampus.yanabada.domain.payment.entity.YanoljaPay; import kr.co.fastcampus.yanabada.domain.payment.repository.YanoljaPayRepository; @@ -30,4 +33,17 @@ private YanoljaPayHomeResponse getYanoljaPay(Member member) { return YanoljaPayHomeResponse.from(yanoljaPay); } + + @Transactional + public void setPayPassword(Long memberId, PayPasswordSaveRequest payPasswordSaveRequest) { + if (!payPasswordSaveRequest.isPasswordMatch()) { + throw new PasswordConfirmationException(); + } + + Member member = memberRepository.getMember(memberId); + YanoljaPay yanoljaPay = yanoljaPayRepository.findByMember(member) + .orElseThrow(YanoljaPayNotFoundException::new); + + yanoljaPay.savePassword(payPasswordSaveRequest.password()); + } } \ No newline at end of file