Skip to content
Merged

#0 #248

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
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@
import devut.buzzerbidder.domain.user.entity.User;
import devut.buzzerbidder.domain.user.repository.DeliveryAddressRepository;
import devut.buzzerbidder.domain.user.service.UserService;
import devut.buzzerbidder.domain.wallet.enums.WalletTransactionType;
import devut.buzzerbidder.domain.wallet.service.WalletService;
import devut.buzzerbidder.global.exeption.BusinessException;
import devut.buzzerbidder.global.exeption.ErrorCode;
Expand Down Expand Up @@ -155,7 +156,7 @@ public void completePayment(User currentUser, Long dealId) {
User seller = userService.findById(deal.getItem().getSellerUserId());

// Wallet์—์„œ ์ž”๊ธˆ ์ด์ฒด (๊ตฌ๋งค์ž -> ํŒ๋งค์ž)
walletService.transferBizz(currentUser, seller, remainingAmount);
walletService.transferBizz(currentUser, seller, remainingAmount, WalletTransactionType.PAY_SETTLEMENT);

// Deal ์ƒํƒœ ๋ณ€๊ฒฝ
deal.updateStatus(DealStatus.PAID);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -108,13 +108,6 @@ private LiveBidResponse handleBidResult(
walletService.refundBidBizz(bidder, depositAmount);
}

walletHistoryService.recordWalletHistory(
bidder,
depositAmount,
WalletTransactionType.BID,
balanceBefore,
balanceAfter
);
walletHistoryService.recordWalletHistory(
bidder,
depositAmount,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -672,9 +672,8 @@ public void endAuction(Long itemId) {
}
}

User buyer = userService.findById(currentBidderId);
User seller = userService.findById(liveItem.getSellerUserId());
walletService.transferBizz(buyer, seller, winnerDeposit);
walletService.receiveDeposit(seller, winnerDeposit);

liveDealService.createDeal(itemId, currentBidderId, maxBidPrice, winnerDeposit);
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,18 +8,23 @@
public enum WalletTransactionType {

// ์ฆ๊ฐ€ ๊ณ„์—ด
CHARGE(true), // ์ถฉ์ „
REFUND(true), // ์ทจ์†Œ/์‹คํŒจ ํ™˜๋ถˆ
BID_REFUND(true), // ์ž…์ฐฐ ์‹คํŒจ ์‹œ ํ™˜๋ถˆ
RECEIVE_FROM_USER(true), // ๋‹ค๋ฅธ ์œ ์ €์—๊ฒŒ์„œ ๋ฐ›์Œ,
DEAL_SETTLEMENT(true), // ๊ฒฝ๋งค/์ฆ‰์‹œ๊ตฌ๋งค ํŒ๋งค์ž ์ •์‚ฐ
ADMIN_GRANT(true), // ๊ด€๋ฆฌ์ž ์ง€๊ธ‰
CHARGE(true), // ์ถฉ์ „
RECEIVE_FROM_USER(true), // ๋‹ค๋ฅธ ์œ ์ €์—๊ฒŒ์„œ ๋ฐ›์Œ,
BID_REFUND(true), // ์ž…์ฐฐ ์‹คํŒจ ์‹œ ํ™˜๋ถˆ
RECIEVE_DEPOSIT(true), // ๋ณด์ฆ๊ธˆ ์ˆ˜๋ น
REFUND(true), // ์ทจ์†Œ/์‹คํŒจ ํ™˜๋ถˆ
RECEIVE_SETTLEMENT(true), // ๊ฒฝ๋งค ์ •์‚ฐ ๋ฐ›๊ธฐ
ADMIN_GRANT(true), // ๊ด€๋ฆฌ์ž ์ง€๊ธ‰

// ๊ฐ์†Œ ๊ณ„์—ด
PAY_TO_USER(false), // ๋‹ค๋ฅธ ์œ ์ €์—๊ฒŒ ๋ณด๋ƒ„
BID(false), // ์ž…์ฐฐ ์‹œ ์ฝ”์ธ ์ฐจ๊ฐ
BID(false), // ์ž…์ฐฐ ์‹œ ์ฝ”์ธ ์ฐจ๊ฐ
WITHDRAW(false), // ์ถœ๊ธˆ
ADMIN_DEDUCT(false); // ๊ด€๋ฆฌ์ž ์ฐจ๊ฐ
PAY_SETTLEMENT(false), // ๊ฒฝ๋งค ์ •์‚ฐ ํ•˜๊ธฐ
ADMIN_DEDUCT(false),

// ์•ˆ ์“ฐ๋Š” ๊ฐ’(DB์—๋Š” ๋‚จ์•„์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์ง€์šฐ์ง€ ์•Š์Œ)
DEAL_SETTLEMENT(true);

private final boolean isIncrease;
}
Original file line number Diff line number Diff line change
Expand Up @@ -112,11 +112,15 @@ public void refundBidBizz(User user, Long amount) {

// ๊ฒฝ๋งค/์ฆ‰์‹œ๊ตฌ๋งค ๊ฑฐ๋ž˜ ์™„๋ฃŒ์‹œ ํŒ๋งค์ž ์ •์‚ฐ
public void settleDealToSeller(User seller, Long amount) {
changeBizz(seller, amount, WalletTransactionType.DEAL_SETTLEMENT);
changeBizz(seller, amount, WalletTransactionType.RECEIVE_SETTLEMENT);
}

public void receiveDeposit(User user, Long amount) {
changeBizz(user, amount, WalletTransactionType.RECIEVE_DEPOSIT);
}

// A์œ ์ € -> B์œ ์ € ์†ก๊ธˆ
public void transferBizz(User fromUser, User toUser, Long amount) {
public void transferBizz(User fromUser, User toUser, Long amount, WalletTransactionType sendType) {
if (fromUser == null || toUser == null) {
throw new BusinessException(ErrorCode.USER_NOT_FOUND);
}
Expand All @@ -126,6 +130,12 @@ public void transferBizz(User fromUser, User toUser, Long amount) {
throw new BusinessException(ErrorCode.INVALID_TRANSFER);
}

WalletTransactionType receiveType = switch(sendType) {
case PAY_SETTLEMENT -> receiveType = WalletTransactionType.RECEIVE_SETTLEMENT;
case PAY_TO_USER -> receiveType = WalletTransactionType.RECEIVE_FROM_USER;
default -> throw new BusinessException(ErrorCode.INVALID_WALLET_TRANSACTION_TYPE);
};

Long fromId = fromUser.getId();
Long toId = toUser.getId();

Expand All @@ -142,16 +152,16 @@ public void transferBizz(User fromUser, User toUser, Long amount) {
// ์ง€๊ฐ‘ ํžˆ์Šคํ† ๋ฆฌ ๋‚จ๊ธฐ๊ธฐ
Long fromBalanceBefore = r.fromBefore();
Long frombalanceAfter = r.fromAfter();
walletHistoryService.recordWalletHistory(fromUser, amount, WalletTransactionType.PAY_TO_USER, fromBalanceBefore, frombalanceAfter);
walletHistoryService.recordWalletHistory(fromUser, amount, sendType, fromBalanceBefore, frombalanceAfter);
Long toBalanceBefore = r.toBefore();
Long tobalanceAfter = r.toAfter();
walletHistoryService.recordWalletHistory(toUser, amount, WalletTransactionType.RECEIVE_FROM_USER, toBalanceBefore, tobalanceAfter);
walletHistoryService.recordWalletHistory(toUser, amount, receiveType, toBalanceBefore, tobalanceAfter);
return;
}

// ๋‘˜ ๋‹ค DB => DB ์ฒ˜๋ฆฌ
if (!fromRedis && !toRedis) {
transferDbFallback(fromUser, toUser, amount);
transferDbFallback(fromUser, toUser, amount, sendType, receiveType);
return;
}

Expand All @@ -161,14 +171,14 @@ public void transferBizz(User fromUser, User toUser, Long amount) {
walletRedisService.changeBizzIfPresent(fromId, amount, false, "TransferBizz_OUT", null);

if (!out.hit()) {
transferDbFallback(fromUser, toUser, amount);
transferDbFallback(fromUser, toUser, amount, sendType, receiveType);
return;
}

try {
// 1) DB ์ž…๊ธˆ ์‹œ๋„
Wallet toWallet = findByUserIdWithLockOrThrow(toId);
updateBizzAndRecordHistory(toWallet, toUser, amount, WalletTransactionType.RECEIVE_FROM_USER);
updateBizzAndRecordHistory(toWallet, toUser, amount, receiveType);

// 2) "DB์ž…๊ธˆ ์„ฑ๊ณต ์ดํ›„์—๋งŒ" ๋กค๋ฐฑ ํ›… ๋“ฑ๋ก
runAfterRollback(() -> {
Expand All @@ -192,7 +202,7 @@ public void transferBizz(User fromUser, User toUser, Long amount) {
// ํžˆ์Šคํ† ๋ฆฌ
Long fromBalanceBefore = out.before();
Long fromBalanceAfter = out.after();
walletHistoryService.recordWalletHistory(fromUser, amount, WalletTransactionType.PAY_TO_USER, fromBalanceBefore, fromBalanceAfter);
walletHistoryService.recordWalletHistory(fromUser, amount, sendType, fromBalanceBefore, fromBalanceAfter);

return;
}
Expand All @@ -201,7 +211,7 @@ public void transferBizz(User fromUser, User toUser, Long amount) {
if (!fromRedis && toRedis) {
// DB ์ฐจ๊ฐ
Wallet fromWallet = findByUserIdWithLockOrThrow(fromId);
updateBizzAndRecordHistory(fromWallet, fromUser, amount, WalletTransactionType.PAY_TO_USER);
updateBizzAndRecordHistory(fromWallet, fromUser, amount, sendType);

// to๋Š” Redis๊ฐ€ ์ง„์‹ค์ด๋ฏ€๋กœ Redis์— ์ž…๊ธˆ
WalletRedisService.RedisBizzChangeResult in =
Expand All @@ -214,7 +224,7 @@ public void transferBizz(User fromUser, User toUser, Long amount) {

Long toBalanceBefore = in.before();
Long toBalanceAfter = in.after();
walletHistoryService.recordWalletHistory(toUser, amount, WalletTransactionType.RECEIVE_FROM_USER, toBalanceBefore, toBalanceAfter);
walletHistoryService.recordWalletHistory(toUser, amount, receiveType, toBalanceBefore, toBalanceAfter);

// ๋กค๋ฐฑ๋˜๋ฉด Redis ์ž…๊ธˆ ๋˜๋Œ๋ฆฌ๊ธฐ
runAfterRollback(() -> {
Expand Down Expand Up @@ -269,7 +279,7 @@ public HistoriesPageResponseDto getHistories(Long userId, int page) {

/* ==================== ์ด ๋ฐ‘์œผ๋กœ๋Š” ํ—ฌํผ ๋ฉ”์„œ๋“œ ==================== */

private void transferDbFallback(User fromUser, User toUser, Long amount) {
private void transferDbFallback(User fromUser, User toUser, Long amount, WalletTransactionType sendType, WalletTransactionType receiveType) {
// ID ์ˆœ์„œ๋Œ€๋กœ ๋ฝ ํš๋“ํ•˜์—ฌ ๋ฐ๋“œ๋ฝ ๋ฐฉ์ง€
Long smallerId = Math.min(fromUser.getId(), toUser.getId());
Long largerId = Math.max(fromUser.getId(), toUser.getId());
Expand All @@ -284,8 +294,8 @@ private void transferDbFallback(User fromUser, User toUser, Long amount) {
? firstWallet : secondWallet;

// ์†ก๊ธˆ ์‹คํ–‰
updateBizzAndRecordHistory(fromWallet, fromUser, amount, WalletTransactionType.PAY_TO_USER);
updateBizzAndRecordHistory(toWallet, toUser, amount, WalletTransactionType.RECEIVE_FROM_USER);
updateBizzAndRecordHistory(fromWallet, fromUser, amount, sendType);
updateBizzAndRecordHistory(toWallet, toUser, amount, receiveType);
}

/** ํŠธ๋žœ์žญ์…˜์ด "๋กค๋ฐฑ"์œผ๋กœ ๋๋‚˜๋ฉด ์‹คํ–‰ํ•  ๋ณด์ƒ ๋กœ์ง */
Expand Down