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

결제 환불 로직 및 야놀자 페이 구현 #92

Merged
merged 17 commits into from
Jan 19, 2024
Merged
Show file tree
Hide file tree
Changes from 16 commits
Commits
Show all changes
17 commits
Select commit Hold shift + click to select a range
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
@@ -0,0 +1,9 @@
package kr.co.fastcampus.yanabada.common.exception;

import static kr.co.fastcampus.yanabada.common.response.ErrorCode.DUPLICATE_YANOLJAPAY;

public class DuplicateYanoljaPayException extends BaseException {
public DuplicateYanoljaPayException() {
super(DUPLICATE_YANOLJAPAY.getMessage());
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
package kr.co.fastcampus.yanabada.common.exception;

import static kr.co.fastcampus.yanabada.common.response.ErrorCode.INCORRECT_YANOLJAPAY_PASSWORD;

public class IncorrectYanoljaPayPasswordException extends BaseException {
public IncorrectYanoljaPayPasswordException() {
super(INCORRECT_YANOLJAPAY_PASSWORD.getMessage());
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
package kr.co.fastcampus.yanabada.common.exception;

import static kr.co.fastcampus.yanabada.common.response.ErrorCode.NOT_ENOUGH_POINT;

public class NotEnoughPointException extends BaseException {
public NotEnoughPointException() {
super(NOT_ENOUGH_POINT.getMessage());
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
package kr.co.fastcampus.yanabada.common.exception;

import static kr.co.fastcampus.yanabada.common.response.ErrorCode.NOT_ENOUGH_YANOLJAPAY_BALANCE;

public class NotEnoughYanoljaPayBalanceException extends BaseException {
public NotEnoughYanoljaPayBalanceException() {
super(NOT_ENOUGH_YANOLJAPAY_BALANCE.getMessage());
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
package kr.co.fastcampus.yanabada.common.exception;

import static kr.co.fastcampus.yanabada.common.response.ErrorCode.YANOLJAPAY_HISTORY_NOT_FOUND;

public class YanoljaPayHistoryNotFoundException extends BaseException {

public YanoljaPayHistoryNotFoundException() {
super(YANOLJAPAY_HISTORY_NOT_FOUND.getMessage());
}
}
Original file line number Diff line number Diff line change
@@ -1,10 +1,10 @@
package kr.co.fastcampus.yanabada.common.exception;

import static kr.co.fastcampus.yanabada.common.response.ErrorCode.PAY_NOT_FOUND;
import static kr.co.fastcampus.yanabada.common.response.ErrorCode.YANOLJAPAY_NOT_FOUND;

public class YanoljaPayNotFoundException extends BaseException {

public YanoljaPayNotFoundException() {
super(PAY_NOT_FOUND.getMessage());
super(YANOLJAPAY_NOT_FOUND.getMessage());
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,8 @@ public enum ErrorCode {
ORDER_NOT_FOUND("존재하지 않는 예약입니다."),
PRODUCT_NOT_FOUND("존재하지 않는 상품입니다."),
TRADE_NOT_FOUND("존재하지 않는 거래입니다."),
PAY_NOT_FOUND("야놀자 페이를 찾을 수 없습니다."),
YANOLJAPAY_NOT_FOUND("야놀자 페이를 찾을 수 없습니다."),
YANOLJAPAY_HISTORY_NOT_FOUND("야놀자 페이 내역을 찾을 수 없습니다."),
ACCESS_FORBIDDEN("권한이 없습니다."),
ORDER_NOT_SELLABLE("판매할 수 없는 예약입니다."),
INVALID_SELLING_PRICE_RANGE("판매가는 구매가보다 클 수 없습니다."),
Expand All @@ -37,6 +38,10 @@ public enum ErrorCode {
ILLEGAL_PRODUCT_STATUS("해당 기능을 수행할 수 없는 상품 상태입니다."),
CANNOT_TRADE_OWN_PRODUCT("자신이 등록한 상품을 거래할 수 없습니다."),
ILLEGAL_TRADE_STATUS("해당 기능을 수행할 수 없는 거래 상태입니다."),
NOT_ENOUGH_POINT("포인트가 부족합니다."),
NOT_ENOUGH_YANOLJAPAY_BALANCE("야놀자 페이 잔액이 부족합니다."),
DUPLICATE_YANOLJAPAY("이미 야놀자 페이에 가입되어있습니다."),
INCORRECT_YANOLJAPAY_PASSWORD("일치하지 않는 야놀자 페이 비밀번호 입니다."),
;

private final String message;
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
package kr.co.fastcampus.yanabada.common.utils;

import lombok.AccessLevel;
import lombok.NoArgsConstructor;

@NoArgsConstructor(access = AccessLevel.PRIVATE)
public class AccountNumberSplitter {

private static final int LENGTH = 4;

public static String split(String accountNumber) {
int beginIndex = accountNumber.length() - LENGTH;

return accountNumber.substring(beginIndex);
}
}

This file was deleted.

Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
package kr.co.fastcampus.yanabada.common.utils;

import static kr.co.fastcampus.yanabada.domain.order.entity.enums.PaymentType.YANOLJA_PAY;

import kr.co.fastcampus.yanabada.domain.order.entity.enums.PaymentType;
import lombok.NoArgsConstructor;

@NoArgsConstructor
public class PayFeeCalculator {

private static final double FEE_RATE = 0.05;

public static int calculate(int price, PaymentType paymentType) {
if (paymentType == YANOLJA_PAY) {
return 0;
}
return (int) (price * FEE_RATE);
}
}
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
package kr.co.fastcampus.yanabada.domain.order.entity.enums;

public enum PaymentType {
NAVER_PAY
NAVER_PAY, YANOLJA_PAY,
}
Original file line number Diff line number Diff line change
Expand Up @@ -57,7 +57,7 @@ public ResponseBody<Void> cancelTrade(
return ResponseBody.ok();
}

@GetMapping("/{tradeId}/approvals")
@GetMapping("/approvals/{tradeId}")
public ResponseBody<ApprovalTradeInfoResponse> getApprovalTrade(
@PathVariable("tradeId") Long tradeId
) {
Expand All @@ -66,7 +66,7 @@ public ResponseBody<ApprovalTradeInfoResponse> getApprovalTrade(
);
}

@GetMapping("/{tradeId}/purchases")
@GetMapping("/purchases/{tradeId}")
public ResponseBody<PurchaseTradeInfoResponse> getPurchaseTrade(
@PathVariable("tradeId") Long tradeId
) {
Expand Down
Original file line number Diff line number Diff line change
@@ -1,11 +1,21 @@
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.response.YanoljaPayHomeResponse;
import kr.co.fastcampus.yanabada.domain.payment.dto.request.YanoljaPayAmountRequest;
import kr.co.fastcampus.yanabada.domain.payment.dto.request.YanoljaPayHistorySearchRequest;
import kr.co.fastcampus.yanabada.domain.payment.dto.request.YanoljaPaySaveRequest;
import kr.co.fastcampus.yanabada.domain.payment.dto.response.YanoljaPayHistoryIdResponse;
import kr.co.fastcampus.yanabada.domain.payment.dto.response.YanoljaPayHistoryInfoResponse;
import kr.co.fastcampus.yanabada.domain.payment.dto.response.YanoljaPayHistorySummaryPageResponse;
import kr.co.fastcampus.yanabada.domain.payment.dto.response.YanoljaPayInfoResponse;
import kr.co.fastcampus.yanabada.domain.payment.dto.response.YanoljaPaySummaryResponse;
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;

Expand All @@ -16,9 +26,64 @@ public class YanoljaPayController {

private final YanoljaPayService yanoljaPayService;

@GetMapping("/{memberId}")
public ResponseBody<YanoljaPayHomeResponse> getYanoljaPay(@PathVariable Long memberId) {
return ResponseBody.ok(yanoljaPayService.getYanoljaPay(memberId));
@GetMapping("/summary")
public ResponseBody<YanoljaPaySummaryResponse> getYanoljaPaySummary() {
return ResponseBody.ok(yanoljaPayService.getYanoljaPaySummary(2L));
}

@GetMapping
public ResponseBody<YanoljaPayInfoResponse> getYanoljaPay() {
return ResponseBody.ok(yanoljaPayService.getYanoljaPay(2L));
}

@PostMapping
public ResponseBody<Void> saveYanoljaPay(
@RequestBody @Valid YanoljaPaySaveRequest request
) {
yanoljaPayService.saveYanoljaPay(2L, request);
return ResponseBody.ok();
}

@PostMapping("/charge")
public ResponseBody<YanoljaPayHistoryIdResponse> chargeYanoljaPay(
@RequestBody @Valid YanoljaPayAmountRequest request
) {
return ResponseBody.ok(
yanoljaPayService.chargeYanoljaPay(2L, request)
);
}

@PostMapping("/disburse")
Hwang-Kyu-Cheol marked this conversation as resolved.
Show resolved Hide resolved
public ResponseBody<YanoljaPayHistoryIdResponse> disburseYanoljaPay(
@RequestBody @Valid YanoljaPayAmountRequest request
) {
return ResponseBody.ok(
yanoljaPayService.disburseYanoljaPay(2L, request)
);
}

@GetMapping("/histories")
public ResponseBody<YanoljaPayHistorySummaryPageResponse> getYanoljaPayHistories(
YanoljaPayHistorySearchRequest request
) {
return ResponseBody.ok(
yanoljaPayService.getYanoljaPayHistoriesBySearchRequest(
2L,
request
)
);
}

@GetMapping("/histories/{historyId}")
public ResponseBody<YanoljaPayHistoryInfoResponse> getYanoljaPayHistory(
@PathVariable("historyId") Long historyId
) {
return ResponseBody.ok(
yanoljaPayService.getYanoljaPayHistory(
2L,
historyId
)
);
}
}

Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@
import jakarta.validation.constraints.NotNull;
import java.time.LocalDateTime;
import kr.co.fastcampus.yanabada.common.utils.EntityCodeGenerator;
import kr.co.fastcampus.yanabada.common.utils.FeeCalculator;
import kr.co.fastcampus.yanabada.common.utils.PayFeeCalculator;
import kr.co.fastcampus.yanabada.domain.member.entity.Member;
import kr.co.fastcampus.yanabada.domain.order.entity.enums.PaymentType;
import kr.co.fastcampus.yanabada.domain.payment.entity.Trade;
Expand Down Expand Up @@ -32,7 +32,9 @@ public record TradeSaveRequest(
Integer point,

@NotNull
PaymentType paymentType
PaymentType paymentType,

String simplePassword
) {
public Trade toEntity(
Product product,
Expand All @@ -49,7 +51,7 @@ public Trade toEntity(
userPersonPhoneNumber,
product.getOrder().getPrice(),
product.getPrice(),
FeeCalculator.calculate(product.getPrice()),
PayFeeCalculator.calculate(product.getPrice(), paymentType),
point,
paymentType,
EntityCodeGenerator.generate(),
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
package kr.co.fastcampus.yanabada.domain.payment.dto.request;

import jakarta.validation.constraints.NotEmpty;
import jakarta.validation.constraints.NotNull;
import jakarta.validation.constraints.Positive;

public record YanoljaPayAmountRequest(
@NotNull
@Positive
Long amount,

Hwang-Kyu-Cheol marked this conversation as resolved.
Show resolved Hide resolved
@NotEmpty
String simplePassword
) {

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
package kr.co.fastcampus.yanabada.domain.payment.dto.request;

import java.util.List;
import kr.co.fastcampus.yanabada.domain.payment.entity.enums.TransactionType;

public record YanoljaPayHistorySearchRequest(
List<TransactionType> types,
Integer page,
Integer size
) {

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
package kr.co.fastcampus.yanabada.domain.payment.dto.request;

import jakarta.validation.constraints.NotBlank;
import jakarta.validation.constraints.Pattern;

public record YanoljaPaySaveRequest(
@NotBlank
@Pattern(regexp = "^\\d{6}$")
String simplePassword,

@NotBlank
String bankName,

@NotBlank
@Pattern(regexp = "^\\d{10,14}$")
String accountNumber
) {

}

This file was deleted.

Loading
Loading