From 95b867aff232bd200eb0074e3e18a5f004c7febc Mon Sep 17 00:00:00 2001 From: "chosw1002@naver.com" Date: Sun, 26 Jan 2025 21:34:48 +0900 Subject: [PATCH 1/3] =?UTF-8?q?feat:=20=EC=8A=A4=ED=84=B0=EB=94=94=20?= =?UTF-8?q?=EC=88=98=EB=A3=8C=20=EC=BF=A0=ED=8F=B0=EC=9D=84=20=EC=8A=A4?= =?UTF-8?q?=ED=84=B0=EB=94=94=20=EB=8B=B9=20=ED=95=98=EB=82=98=EB=A7=8C=20?= =?UTF-8?q?=EA=B0=80=EC=A7=80=EB=8F=84=EB=A1=9D=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/gdschongik/gdsc/domain/common/vo/Money.java | 1 + .../domain/coupon/application/CouponService.java | 13 +++++++++---- .../gdsc/domain/coupon/dao/CouponRepository.java | 7 ++++++- 3 files changed, 16 insertions(+), 5 deletions(-) diff --git a/src/main/java/com/gdschongik/gdsc/domain/common/vo/Money.java b/src/main/java/com/gdschongik/gdsc/domain/common/vo/Money.java index 33b7b1e05..013cc4a50 100644 --- a/src/main/java/com/gdschongik/gdsc/domain/common/vo/Money.java +++ b/src/main/java/com/gdschongik/gdsc/domain/common/vo/Money.java @@ -18,6 +18,7 @@ public final class Money { public static final Money ZERO = Money.from(BigDecimal.ZERO); + public static final Money FIVE_THOUSAND = Money.from(5000L); private BigDecimal amount; diff --git a/src/main/java/com/gdschongik/gdsc/domain/coupon/application/CouponService.java b/src/main/java/com/gdschongik/gdsc/domain/coupon/application/CouponService.java index 7daaa768f..42e7eabc8 100644 --- a/src/main/java/com/gdschongik/gdsc/domain/coupon/application/CouponService.java +++ b/src/main/java/com/gdschongik/gdsc/domain/coupon/application/CouponService.java @@ -109,10 +109,7 @@ public void createAndIssueCouponByStudyHistories(List studyHistoryIds) { List students = memberRepository.findAllById(studentIds); Study study = studyHistories.get(0).getStudy(); - String couponName = couponNameUtil.generateStudyCompletionCouponName(study); - // TODO: 요청할 때마다 새로운 쿠폰 생성되는 문제 수정: 스터디마다 하나의 쿠폰만 존재하도록 쿠폰 타입 및 참조 식별자 추가 - Coupon coupon = Coupon.createAutomatic(couponName, Money.from(5000L), CouponType.STUDY_COMPLETION, study); - couponRepository.save(coupon); + Coupon coupon = findOrCreate(CouponType.STUDY_COMPLETION, study); List issuedCoupons = students.stream() .map(student -> IssuedCoupon.create(coupon, student)) @@ -123,4 +120,12 @@ public void createAndIssueCouponByStudyHistories(List studyHistoryIds) { "[CouponService] 스터디 수료 쿠폰 발급: issuedCouponIds={}", issuedCoupons.stream().map(IssuedCoupon::getId).toList()); } + + private Coupon findOrCreate(CouponType couponType, Study study) { + return couponRepository.findByCouponTypeAndStudy(couponType, study).orElseGet(() -> { + String couponName = couponNameUtil.generateStudyCompletionCouponName(study); + Coupon coupon = Coupon.createAutomatic(couponName, Money.FIVE_THOUSAND, couponType, study); + return couponRepository.save(coupon); + }); + } } diff --git a/src/main/java/com/gdschongik/gdsc/domain/coupon/dao/CouponRepository.java b/src/main/java/com/gdschongik/gdsc/domain/coupon/dao/CouponRepository.java index d8c6d87fc..1ded9e95c 100644 --- a/src/main/java/com/gdschongik/gdsc/domain/coupon/dao/CouponRepository.java +++ b/src/main/java/com/gdschongik/gdsc/domain/coupon/dao/CouponRepository.java @@ -1,6 +1,11 @@ package com.gdschongik.gdsc.domain.coupon.dao; import com.gdschongik.gdsc.domain.coupon.domain.Coupon; +import com.gdschongik.gdsc.domain.coupon.domain.CouponType; +import com.gdschongik.gdsc.domain.study.domain.Study; +import java.util.Optional; import org.springframework.data.jpa.repository.JpaRepository; -public interface CouponRepository extends JpaRepository {} +public interface CouponRepository extends JpaRepository { + Optional findByCouponTypeAndStudy(CouponType couponType, Study study); +} From e5f37fbec2cca4c712506d67215a95fe511601c1 Mon Sep 17 00:00:00 2001 From: "chosw1002@naver.com" Date: Tue, 28 Jan 2025 16:23:31 +0900 Subject: [PATCH 2/3] =?UTF-8?q?chore:=20todo=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../domain/study/application/StudentStudyHistoryService.java | 1 + 1 file changed, 1 insertion(+) diff --git a/src/main/java/com/gdschongik/gdsc/domain/study/application/StudentStudyHistoryService.java b/src/main/java/com/gdschongik/gdsc/domain/study/application/StudentStudyHistoryService.java index b79e4a8dc..aed1da320 100644 --- a/src/main/java/com/gdschongik/gdsc/domain/study/application/StudentStudyHistoryService.java +++ b/src/main/java/com/gdschongik/gdsc/domain/study/application/StudentStudyHistoryService.java @@ -133,6 +133,7 @@ public List getMyCompletedStudies() { } private AssignmentHistory findOrCreate(Member currentMember, StudyDetail studyDetail) { + // todo: create로 분기할 경우 내부에서 save 호출하도록 수정 return assignmentHistoryRepository .findByMemberAndStudyDetail(currentMember, studyDetail) .orElseGet(() -> AssignmentHistory.create(studyDetail, currentMember)); From d2db7d6cfd37235c2c9bcb81dac14fda479d404d Mon Sep 17 00:00:00 2001 From: "chosw1002@naver.com" Date: Tue, 28 Jan 2025 16:27:28 +0900 Subject: [PATCH 3/3] =?UTF-8?q?feat:=20=EC=BF=A0=ED=8F=B0=20unique=20const?= =?UTF-8?q?raint=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/gdschongik/gdsc/domain/coupon/domain/Coupon.java | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/main/java/com/gdschongik/gdsc/domain/coupon/domain/Coupon.java b/src/main/java/com/gdschongik/gdsc/domain/coupon/domain/Coupon.java index 1f1ded89d..9e82ea7db 100644 --- a/src/main/java/com/gdschongik/gdsc/domain/coupon/domain/Coupon.java +++ b/src/main/java/com/gdschongik/gdsc/domain/coupon/domain/Coupon.java @@ -17,6 +17,8 @@ import jakarta.persistence.Id; import jakarta.persistence.JoinColumn; import jakarta.persistence.ManyToOne; +import jakarta.persistence.Table; +import jakarta.persistence.UniqueConstraint; import lombok.AccessLevel; import lombok.Builder; import lombok.Getter; @@ -24,6 +26,7 @@ @Getter @Entity +@Table(uniqueConstraints = {@UniqueConstraint(columnNames = {"coupon_type", "study_id"})}) @NoArgsConstructor(access = AccessLevel.PROTECTED) public class Coupon extends BaseEntity {