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

feat: 사용자는 환불 시에 환불액을 주고 받는다 #67

Merged
merged 11 commits into from
Aug 13, 2024
Merged
Show file tree
Hide file tree
Changes from 4 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
@@ -1,5 +1,6 @@
package com.wootecam.luckyvickyauction.core.member.domain;

import java.util.Objects;
import lombok.Builder;
import lombok.Getter;

Expand Down Expand Up @@ -41,4 +42,21 @@ public boolean isBuyer() {
public boolean confirmPassword(String password) {
return this.password.equals(password);
}

@Override
public boolean equals(Object o) {
if (this == o) {
return true;
}
if (o == null || getClass() != o.getClass()) {
return false;
}
Member member = (Member) o;
return Objects.equals(id, member.id);
}

@Override
public int hashCode() {
return Objects.hashCode(id);
}
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@EqualsAndHashCode(of = "id")

조심스럽게 제안해봅니다. ㅎㅎ

}
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,9 @@

import com.wootecam.luckyvickyauction.core.member.domain.Member;
import lombok.Builder;
import lombok.Getter;

@Getter
public class BidHistory {

private Long id;
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,10 @@
package com.wootecam.luckyvickyauction.core.payment.domain;

import java.util.Optional;

public interface BidHistoryRepository {

BidHistory save(BidHistory bidHistory);

Optional<BidHistory> findById(long bidHistoryId);
}
Original file line number Diff line number Diff line change
Expand Up @@ -34,14 +34,8 @@ public void process(Member buyer, long price, long auctionId, long quantity) {
if (submitBid(price, auctionId, quantity, buyer, seller)) {
Member savedBuyer = memberRepository.save(buyer);
Member savedSeller = memberRepository.save(seller);
BidHistory bidHistory = BidHistory.builder()
.productName(auctionInfo.productName())
.price(price)
.quantity(quantity)
.bidStatus(BidStatus.BID)
.seller(savedSeller)
.buyer(savedBuyer)
.build();
BidHistory bidHistory = BidHistory.builder().productName(auctionInfo.productName()).price(price)
.quantity(quantity).bidStatus(BidStatus.BID).seller(savedSeller).buyer(savedBuyer).build();
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

의견: 줄 구분이 있으면 좋을것 같아요!

bidHistoryRepository.save(bidHistory);
}
}
Expand All @@ -61,4 +55,40 @@ private boolean submitBid(long price, long auctionId, long quantity, Member buye
return false;
}
}

/**
* 구매자는 자신의 입찰 내역에서 상품을 환불할 수 있다 <br> 1. 환불을 요청한 사용자가 구매자 권한이 맞는 지 확인한다 <br> 2. 환불할 입찰 내역의 구매자가 환불을 요청한 사용자인지 확인한다
* <br> 3. 환불 금액과 수량을 받아와서 교환한다 <br> 4. 경매 서비스에 환불 요청한다 <br> 5. 환불 이후 정보들을 저장한다
*
* @param buyer 환불을 요청한 사용자
* @param bidHistoryId 환불할 입찰 내역의 id
*/
public void refund(Member buyer, long bidHistoryId) {
if (!buyer.isBuyer()) {
throw new BadRequestException("구매자만 환불을 할 수 있습니다.", ErrorCode.P000);
}

BidHistory refundTargetBidHistory = findRefundTargetBidHistory(bidHistoryId);
Member refundTargetBuyer = refundTargetBidHistory.getBuyer();
if (buyer.equals(refundTargetBuyer)) {
throw new BadRequestException("환불할 입찰 내역의 구매자만 환불을 할 수 있습니다.", ErrorCode.P003);
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

의견: equals도 좋지만 BidHistory memberId만 넘겨주어 비교하는 메소드를 만들어줘도 좋을것 같아요!

}

long price = refundTargetBidHistory.getPrice();
long quantity = refundTargetBidHistory.getQuantity();

Member seller = refundTargetBidHistory.getSeller();
buyer.chargePoint(price * quantity);
seller.usePoint(price * quantity);

Member savedBuyer = memberRepository.save(buyer);
Member savedSeller = memberRepository.save(seller);
// TODO 경매 서비스에 환불 요청
// TODO 환불 요청에 대한 BidHistory 저장
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

제안: BidHistory에 bidStatus 필드가 있어서 status를 변경하고 저장하는 로직을 두면 환불 요청에 대한 BidHistory를 저장할 수 있을것 같아요!

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

의견: 경매 서비스 환불 요청 인터페이스가 없다면 임의로 만들어도 괜찮지 않을까요?!

Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

좋습니당~ 포인트 수정 이후에 예외가 발생하는 경우 사용할 방어 로직도 나중에 넣어야겠네요!

}

private BidHistory findRefundTargetBidHistory(long bidHistoryId) {
return bidHistoryRepository.findById(bidHistoryId).orElseThrow(
() -> new NotFoundException("환불할 입찰 내역을 찾을 수 없습니다. 내역 id=" + bidHistoryId, ErrorCode.P002));
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -26,8 +26,10 @@ public enum ErrorCode {
M003("로그인 시, 입력 패스워드와 실제 패스워드가 다른 경우 예외가 발생합니다."),

// Payment 관련 예외 코드
P000("입찰 시, 로그인한 사용자가 구매자가 아닌 경우 예외가 발생합니다."),
P000("거래 시, 로그인한 사용자가 구매자가 아닌 경우 예외가 발생합니다."),
P001("입찰 시, 사용자의 포인트가 부족한 경우 예외가 발생합니다."),
P002("환불 시, 환불할 입찰 내역을 찾을 수 없을 경우 예외가 발생합니다."),
P003("환불 시, 요청한 사용자가 환불할 입찰의 구매자가 아닌 경우 예외가 발생합니다."),

// Global 예외
G000("DTO 생성 시, 필드의 값이 NULL인 경우 예외가 발생합니다.");
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@
class PaymentServiceTest {

@Nested
class submitBid_메소드는 {
class process_메소드는 {

@Nested
class 정상적인_요청_흐름이면 {
Expand Down Expand Up @@ -53,4 +53,52 @@ class 만약_요청한_물건의_금액이_사용자가_가진_포인트보다_
}
}
}

@Nested
class refund_메소드는 {

@Nested
class 정상적인_요청_흐름이면 {

@Test
void 환불이_진행된다() {
// given
// when
// then
}
}

@Nested
class 만약_요청한_사용자가_구매자가_아니라면 {

@Test
void 예외가_발생한다() {
// given
// when
// then
}
}

@Nested
class 만약_환불할_입찰_내역을_찾을_수_없다면 {

@Test
void 예외가_발생한다() {
// given
// when
// then
}
}

@Nested
class 만약_환불할_입찰_내역의_구매자가_환불을_요청한_사용자가_아니라면 {

@Test
void 예외가_발생한다() {
// given
// when
// then
}
}
}
}
Loading