diff --git a/src/main/java/com/ayucoupon/coupon/domain/CouponRepository.java b/src/main/java/com/ayucoupon/coupon/domain/CouponRepository.java index fa28820..e2b8c4a 100644 --- a/src/main/java/com/ayucoupon/coupon/domain/CouponRepository.java +++ b/src/main/java/com/ayucoupon/coupon/domain/CouponRepository.java @@ -5,7 +5,10 @@ import org.springframework.data.domain.Pageable; import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.data.jpa.repository.Lock; +import org.springframework.data.jpa.repository.Modifying; import org.springframework.data.jpa.repository.Query; +import org.springframework.transaction.annotation.Propagation; +import org.springframework.transaction.annotation.Transactional; import java.time.LocalDateTime; import java.util.List; @@ -16,6 +19,9 @@ public interface CouponRepository extends JpaRepository<Coupon, Long> { @Query("select c from Coupon c where c.couponId=:couponId") Coupon findByIdWithPessimisticLock(Long couponId); + @Query("select c.usageHours from Coupon c where c.couponId=:couponId") + Long findCouponUsageHours(Long couponId); + @Query("select c from Coupon c " + "where c.issuePeriod.startedAt <= :currentTime and :currentTime <= c.issuePeriod.finishedAt") List<Coupon> findCouponsInProgress(LocalDateTime currentTime, Pageable pageable); diff --git a/src/main/java/com/ayucoupon/usercoupon/service/issue/IssueUserCouponModuleImpl.java b/src/main/java/com/ayucoupon/usercoupon/service/issue/IssueUserCouponModuleImpl.java index 74f078b..eeea544 100644 --- a/src/main/java/com/ayucoupon/usercoupon/service/issue/IssueUserCouponModuleImpl.java +++ b/src/main/java/com/ayucoupon/usercoupon/service/issue/IssueUserCouponModuleImpl.java @@ -20,21 +20,22 @@ public class IssueUserCouponModuleImpl implements IssueUserCouponModule { @Override @Transactional public Long issue(IssueUserCouponCommand command) { - UserCoupon issuedUserCoupon = issueUserCoupon(command); - return saveCoupon(issuedUserCoupon); - } - - private UserCoupon issueUserCoupon(IssueUserCouponCommand command) { - Coupon coupon = couponRepository.findByIdWithPessimisticLock(command.couponId()); - LocalDateTime currentTime = LocalDateTime.now(); + Long userCouponId = issueUserCoupon(command, currentTime); + decreaseCouponQuantity(command, currentTime); + return userCouponId; + } - coupon.decrease(currentTime); - return new UserCoupon(command.userId(), coupon.getCouponId(), coupon.getUsageHours(), currentTime); + private Long issueUserCoupon(IssueUserCouponCommand command, LocalDateTime currentTime) { + Long couponUsageHours = couponRepository.findCouponUsageHours(command.couponId()); + UserCoupon issuedCoupon = new UserCoupon(command.userId(), command.couponId(), couponUsageHours, currentTime); + return userCouponRepository.save(issuedCoupon) + .getUserCouponId(); } - private Long saveCoupon(UserCoupon issuedCoupon) { - return userCouponRepository.save(issuedCoupon).getUserCouponId(); + private void decreaseCouponQuantity(IssueUserCouponCommand command, LocalDateTime currentTime) { + Coupon coupon = couponRepository.findByIdWithPessimisticLock(command.couponId()); + coupon.decrease(currentTime); } }