Skip to content

Commit

Permalink
Merge pull request #221 from marinesnow34/pointFix
Browse files Browse the repository at this point in the history
Fix: 포인트 사용 수정
  • Loading branch information
marinesnow34 authored Mar 24, 2024
2 parents 2573eaa + 8d1be6d commit 842e03a
Show file tree
Hide file tree
Showing 3 changed files with 49 additions and 5 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -3,11 +3,17 @@
import java.util.Optional;

import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.Lock;

import com.readyvery.readyverydemo.domain.SocialType;
import com.readyvery.readyverydemo.domain.UserInfo;

import jakarta.persistence.LockModeType;

public interface UserRepository extends JpaRepository<UserInfo, Long> {
@Lock(LockModeType.PESSIMISTIC_WRITE)
Optional<UserInfo> findUserInfoById(Long id);

Optional<UserInfo> findByEmail(String email);

Optional<UserInfo> findByRefreshToken(String refreshToken);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -67,6 +67,7 @@
import com.readyvery.readyverydemo.src.order.dto.TossCancelReq;
import com.readyvery.readyverydemo.src.order.dto.TosspaymentDto;
import com.readyvery.readyverydemo.src.order.dto.TosspaymentMakeRes;
import com.readyvery.readyverydemo.src.user.UserServiceFacade;

import jakarta.transaction.Transactional;
import lombok.RequiredArgsConstructor;
Expand All @@ -82,6 +83,7 @@ public class OrderServiceImpl implements OrderService {
private final FoodieRepository foodieRepository;
private final FoodieOptionRepository foodieOptionRepository;
private final UserRepository userRepository;
private final UserServiceFacade userServiceFacade;
private final StoreRepository storeRepository;
private final OrderMapper orderMapper;
private final TossPaymentConfig tosspaymentConfig;
Expand Down Expand Up @@ -307,7 +309,9 @@ private void cartOrder(Cart cart) {
@Transactional
public PaySuccess tossPaymentSuccess(String paymentKey, String orderId, Long amount) {
Order order = getOrder(orderId);
UserInfo user = userServiceFacade.getUserInfoWithPessimisticLock(order.getUserInfo().getId());
verifyOrder(order, amount);
verifyUsePoint(order, user);

TosspaymentDto tosspaymentDto;
if (amount > 0) {
Expand All @@ -328,10 +332,23 @@ public PaySuccess tossPaymentSuccess(String paymentKey, String orderId, Long amo
if (order.getPoint() < 0L) {
Point point = orderMapper.orderToPoint(order);
pointRepository.save(point);
userServiceFacade.saveUserPoint(user, user.getPoint() + order.getPoint());
}
return orderMapper.tosspaymentDtoToPaySuccess(TOSSPAYMENT_SUCCESS_MESSAGE);
}

private void verifyUsePoint(Order order, UserInfo user) {
// 포인트 사용 X
if (order.getPoint() >= 0L) {
return;
}
// 유저 포인트 충분
if (user.getPoint() + order.getPoint() >= 0L) {
return;
}
throw new BusinessLogicException(ExceptionCode.POINT_NOT_ENOUGH);
}

private TosspaymentDto makeZeroPaymentDto(String paymentKey) {
return TosspaymentDto.builder()
.paymentKey(paymentKey)
Expand Down Expand Up @@ -365,18 +382,30 @@ public CurrentRes getCurrent(String orderId) {
@Override
@Transactional
public Object cancelTossPayment(CustomUserDetails userDetails, TossCancelReq tossCancelReq) {
UserInfo user = getUserInfo(userDetails);
UserInfo user = userServiceFacade.getUserInfoWithPessimisticLock(userDetails.getId());
Order order = getOrder(tossCancelReq.getOrderId());
verifyCancel(order, user);

TosspaymentDto tosspaymentDto = requestTossPaymentCancel(order.getPaymentKey());
TosspaymentDto tosspaymentDto = null;
if (order.getAmount() > 0L) {
tosspaymentDto = requestTossPaymentCancel(order.getPaymentKey());
} else {
tosspaymentDto = makeZeroPaymentCancelDto();
}

applyCancelTosspaymentDto(order, tosspaymentDto);
userServiceFacade.saveUserPoint(user, user.getPoint() - order.getPoint());

ordersRepository.save(order);
return orderMapper.tosspaymentDtoToCancelRes();
}

private TosspaymentDto makeZeroPaymentCancelDto() {
return TosspaymentDto.builder()
.cancels(",=단순 변심")
.status("CANCELED")
.build();
}

@Override
@Transactional
public HistoryDetailRes getReceipt(CustomUserDetails userDetails, String orderId) {
Expand Down Expand Up @@ -430,7 +459,6 @@ private void applyCancelTosspaymentDto(Order order, TosspaymentDto tosspaymentDt
order.setPayStatus(false);
order.getReceipt().setCancels(tosspaymentDto.getCancels().toString());
order.getReceipt().setStatus(tosspaymentDto.getStatus());
order.getUserInfo().setPoint(order.getUserInfo().getPoint() - order.getPoint());
if (order.getCoupon() != null) {
order.getCoupon().setUseCount(order.getCoupon().getUseCount() - 1);
}
Expand Down Expand Up @@ -508,7 +536,6 @@ private void applyTosspaymentDto(Order order, TosspaymentDto tosspaymentDto) {
order.setPayStatus(true);
order.getCart().setIsOrdered(true);
order.setMessage(TOSSPAYMENT_SUCCESS_MESSAGE);
order.getUserInfo().setPoint(order.getUserInfo().getPoint() + order.getPoint());
if (order.getCoupon() != null) {
order.getCoupon().setUseCount(order.getCoupon().getUseCount() + 1);
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,12 @@ public UserInfo getUserInfo(Long id) {
);
}

public UserInfo getUserInfoWithPessimisticLock(Long id) {
return userRepository.findUserInfoById(id).orElseThrow(
() -> new BusinessLogicException(ExceptionCode.USER_NOT_FOUND)
);
}

public UserInfo getUserInfoByEmail(String email) {
return userRepository.findByEmail(email).orElseThrow(
() -> new BusinessLogicException(ExceptionCode.USER_NOT_FOUND)
Expand All @@ -32,4 +38,9 @@ public void updateUserPhone(UserInfo userInfo, String phoneNumber) {
userInfo.updatePhone(phoneNumber);
userRepository.save(userInfo);
}

public void saveUserPoint(UserInfo user, long point) {
user.setPoint(point);
userRepository.save(user);
}
}

0 comments on commit 842e03a

Please sign in to comment.