From c65bad63caf566ffb57656788ccdc38188022b1b Mon Sep 17 00:00:00 2001 From: Klaus Date: Wed, 3 Jan 2024 23:31:12 +0900 Subject: [PATCH 1/4] =?UTF-8?q?=EC=BA=94=20=EC=BF=A0=ED=8F=B0=20-=20?= =?UTF-8?q?=EC=88=98=EC=A0=95=20API=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../sodalive/can/coupon/CanCoupon.kt | 6 ++-- .../can/coupon/CanCouponController.kt | 12 +++++++ .../can/coupon/CanCouponIssueService.kt | 6 ++++ .../sodalive/can/coupon/CanCouponService.kt | 33 +++++++++++++++++++ .../can/coupon/ModifyCanCouponRequest.kt | 8 +++++ 5 files changed, 62 insertions(+), 3 deletions(-) create mode 100644 src/main/kotlin/kr/co/vividnext/sodalive/can/coupon/ModifyCanCouponRequest.kt diff --git a/src/main/kotlin/kr/co/vividnext/sodalive/can/coupon/CanCoupon.kt b/src/main/kotlin/kr/co/vividnext/sodalive/can/coupon/CanCoupon.kt index d122cbb..92ec244 100644 --- a/src/main/kotlin/kr/co/vividnext/sodalive/can/coupon/CanCoupon.kt +++ b/src/main/kotlin/kr/co/vividnext/sodalive/can/coupon/CanCoupon.kt @@ -9,7 +9,7 @@ data class CanCoupon( val couponName: String, val can: Int, val couponCount: Int, - val validity: LocalDateTime, - val isActive: Boolean, - val isMultipleUse: Boolean + var validity: LocalDateTime, + var isActive: Boolean, + var isMultipleUse: Boolean ) : BaseEntity() diff --git a/src/main/kotlin/kr/co/vividnext/sodalive/can/coupon/CanCouponController.kt b/src/main/kotlin/kr/co/vividnext/sodalive/can/coupon/CanCouponController.kt index 5962f3a..9d680a1 100644 --- a/src/main/kotlin/kr/co/vividnext/sodalive/can/coupon/CanCouponController.kt +++ b/src/main/kotlin/kr/co/vividnext/sodalive/can/coupon/CanCouponController.kt @@ -12,6 +12,7 @@ import org.springframework.security.access.prepost.PreAuthorize import org.springframework.security.core.annotation.AuthenticationPrincipal import org.springframework.web.bind.annotation.GetMapping import org.springframework.web.bind.annotation.PostMapping +import org.springframework.web.bind.annotation.PutMapping import org.springframework.web.bind.annotation.RequestBody import org.springframework.web.bind.annotation.RequestMapping import org.springframework.web.bind.annotation.RequestParam @@ -33,6 +34,17 @@ class CanCouponController(private val service: CanCouponService) { ApiResponse.ok(service.generateCoupon(request)) } + @PutMapping + @PreAuthorize("hasRole('ADMIN')") + fun modifyCoupon( + @RequestBody request: ModifyCanCouponRequest, + @AuthenticationPrincipal(expression = "#this == 'anonymousUser' ? null : member") member: Member? + ) = run { + if (member == null) throw SodaException("로그인 정보를 확인해주세요.") + + ApiResponse.ok(service.modifyCoupon(request)) + } + @GetMapping @PreAuthorize("hasRole('ADMIN')") fun getCouponList( diff --git a/src/main/kotlin/kr/co/vividnext/sodalive/can/coupon/CanCouponIssueService.kt b/src/main/kotlin/kr/co/vividnext/sodalive/can/coupon/CanCouponIssueService.kt index 547e7fa..c761f3b 100644 --- a/src/main/kotlin/kr/co/vividnext/sodalive/can/coupon/CanCouponIssueService.kt +++ b/src/main/kotlin/kr/co/vividnext/sodalive/can/coupon/CanCouponIssueService.kt @@ -28,4 +28,10 @@ class CanCouponIssueService(private val couponNumberRepository: CanCouponNumberR } private fun isMultipleUse(canCouponNumber: CanCouponNumber) = canCouponNumber.canCoupon!!.isMultipleUse + + fun checkAnyChanges(request: ModifyCanCouponRequest) { + if (request.isMultipleUse == null && request.isActive == null && request.validity == null) { + throw SodaException("변경사항이 없습니다.") + } + } } diff --git a/src/main/kotlin/kr/co/vividnext/sodalive/can/coupon/CanCouponService.kt b/src/main/kotlin/kr/co/vividnext/sodalive/can/coupon/CanCouponService.kt index f0474b8..b506c7c 100644 --- a/src/main/kotlin/kr/co/vividnext/sodalive/can/coupon/CanCouponService.kt +++ b/src/main/kotlin/kr/co/vividnext/sodalive/can/coupon/CanCouponService.kt @@ -10,9 +10,12 @@ import org.apache.poi.xssf.usermodel.XSSFWorkbook import org.springframework.context.ApplicationEventPublisher import org.springframework.data.repository.findByIdOrNull import org.springframework.stereotype.Service +import org.springframework.transaction.annotation.Transactional import java.io.ByteArrayInputStream import java.io.ByteArrayOutputStream import java.io.IOException +import java.time.LocalDateTime +import java.time.ZoneId import java.time.format.DateTimeFormatter @Service @@ -33,6 +36,36 @@ class CanCouponService( applicationEventPublisher.publishEvent(SqsEvent(type = SqsEventType.GENERATE_COUPON, message = message)) } + @Transactional + fun modifyCoupon(request: ModifyCanCouponRequest) { + issueService.checkAnyChanges(request) + + val canCoupon = repository.findByIdOrNull(id = request.couponId) + ?: throw SodaException("잘못된 쿠폰번호입니다.\n고객센터로 문의해 주시기 바랍니다.") + + if (request.validity != null) { + val dateTimeFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd hh:mm:ss") + val validity = LocalDateTime.parse(request.validity, dateTimeFormatter) + .atZone(ZoneId.of("Asia/Seoul")) + .withZoneSameInstant(ZoneId.of("UTC")) + .toLocalDateTime() + + if (validity <= canCoupon.validity) { + throw SodaException("유효기간은 기존 유효기간 이후 날짜로 설정하실 수 있습니다.") + } + + canCoupon.validity = validity + } + + if (request.isActive != null) { + canCoupon.isActive = request.isActive + } + + if (request.isMultipleUse != null) { + canCoupon.isMultipleUse = request.isMultipleUse + } + } + fun getCouponList(offset: Long, limit: Long): GetCouponListResponse { val totalCount = repository.getCouponTotalCount() diff --git a/src/main/kotlin/kr/co/vividnext/sodalive/can/coupon/ModifyCanCouponRequest.kt b/src/main/kotlin/kr/co/vividnext/sodalive/can/coupon/ModifyCanCouponRequest.kt new file mode 100644 index 0000000..12035f7 --- /dev/null +++ b/src/main/kotlin/kr/co/vividnext/sodalive/can/coupon/ModifyCanCouponRequest.kt @@ -0,0 +1,8 @@ +package kr.co.vividnext.sodalive.can.coupon + +data class ModifyCanCouponRequest( + val couponId: Long, + val validity: String?, + val isMultipleUse: Boolean?, + val isActive: Boolean? +) From 02254c29e4306e06d6543eddb3177a3bcbf5a217 Mon Sep 17 00:00:00 2001 From: Klaus Date: Wed, 3 Jan 2024 23:48:39 +0900 Subject: [PATCH 2/4] =?UTF-8?q?=EC=BA=94=20=EC=BF=A0=ED=8F=B0=20-=20?= =?UTF-8?q?=EC=82=AC=EC=9A=A9=20=EC=88=98=EB=9F=89=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../sodalive/can/coupon/CanCouponNumberRepository.kt | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/main/kotlin/kr/co/vividnext/sodalive/can/coupon/CanCouponNumberRepository.kt b/src/main/kotlin/kr/co/vividnext/sodalive/can/coupon/CanCouponNumberRepository.kt index 0e4ccd1..f8e7899 100644 --- a/src/main/kotlin/kr/co/vividnext/sodalive/can/coupon/CanCouponNumberRepository.kt +++ b/src/main/kotlin/kr/co/vividnext/sodalive/can/coupon/CanCouponNumberRepository.kt @@ -25,7 +25,10 @@ class CanCouponNumberQueryRepositoryImpl(private val queryFactory: JPAQueryFacto return queryFactory .select(canCouponNumber.id) .from(canCouponNumber) - .where(canCouponNumber.member.isNotNull) + .where( + canCouponNumber.member.isNotNull + .and(canCouponNumber.id.eq(id)) + ) .fetch() .size } From 3d76220660cd6e27b60d4d3e14d9a7f5b769c470 Mon Sep 17 00:00:00 2001 From: Klaus Date: Wed, 3 Jan 2024 23:52:59 +0900 Subject: [PATCH 3/4] =?UTF-8?q?=EC=BA=94=20=EC=BF=A0=ED=8F=B0=20=EC=88=98?= =?UTF-8?q?=EC=A0=95=20-=20=EB=82=A0=EC=A7=9C=20=ED=8C=A8=ED=84=B4=20?= =?UTF-8?q?=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../kr/co/vividnext/sodalive/can/coupon/CanCouponService.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/kotlin/kr/co/vividnext/sodalive/can/coupon/CanCouponService.kt b/src/main/kotlin/kr/co/vividnext/sodalive/can/coupon/CanCouponService.kt index b506c7c..8fa9f8e 100644 --- a/src/main/kotlin/kr/co/vividnext/sodalive/can/coupon/CanCouponService.kt +++ b/src/main/kotlin/kr/co/vividnext/sodalive/can/coupon/CanCouponService.kt @@ -44,7 +44,7 @@ class CanCouponService( ?: throw SodaException("잘못된 쿠폰번호입니다.\n고객센터로 문의해 주시기 바랍니다.") if (request.validity != null) { - val dateTimeFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd hh:mm:ss") + val dateTimeFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss") val validity = LocalDateTime.parse(request.validity, dateTimeFormatter) .atZone(ZoneId.of("Asia/Seoul")) .withZoneSameInstant(ZoneId.of("UTC")) From 5a0bf61a36de27b2abd2007db3a39746a58d95f6 Mon Sep 17 00:00:00 2001 From: Klaus Date: Thu, 4 Jan 2024 00:09:45 +0900 Subject: [PATCH 4/4] =?UTF-8?q?=EC=BA=94=20=EC=9C=A0=ED=9A=A8=EC=84=B1=20?= =?UTF-8?q?=EA=B2=80=EC=82=AC=20-=20=EC=BF=A0=ED=8F=B0=20=EC=9C=A0?= =?UTF-8?q?=ED=9A=A8=EA=B8=B0=EA=B0=84=EA=B3=BC=20=ED=99=9C=EC=84=B1?= =?UTF-8?q?=ED=99=94=20=EC=BF=A0=ED=8F=B0=20=EA=B2=80=EC=82=AC=20=EC=B6=94?= =?UTF-8?q?=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../sodalive/can/coupon/CanCouponIssueService.kt | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/src/main/kotlin/kr/co/vividnext/sodalive/can/coupon/CanCouponIssueService.kt b/src/main/kotlin/kr/co/vividnext/sodalive/can/coupon/CanCouponIssueService.kt index c761f3b..2af50b1 100644 --- a/src/main/kotlin/kr/co/vividnext/sodalive/can/coupon/CanCouponIssueService.kt +++ b/src/main/kotlin/kr/co/vividnext/sodalive/can/coupon/CanCouponIssueService.kt @@ -2,6 +2,7 @@ package kr.co.vividnext.sodalive.can.coupon import kr.co.vividnext.sodalive.common.SodaException import org.springframework.stereotype.Service +import java.time.LocalDateTime @Service class CanCouponIssueService(private val couponNumberRepository: CanCouponNumberRepository) { @@ -14,6 +15,8 @@ class CanCouponIssueService(private val couponNumberRepository: CanCouponNumberR throw SodaException("해당 쿠폰은 1회만 충전이 가능합니다.") } } + + validateCoupon(canCouponNumber.canCoupon!!) } private fun checkCanCouponNumber(couponNumber: String): CanCouponNumber { @@ -29,6 +32,16 @@ class CanCouponIssueService(private val couponNumberRepository: CanCouponNumberR private fun isMultipleUse(canCouponNumber: CanCouponNumber) = canCouponNumber.canCoupon!!.isMultipleUse + private fun validateCoupon(canCoupon: CanCoupon) { + if (canCoupon.validity < LocalDateTime.now()) { + throw SodaException("유효기간이 경과된 쿠폰입니다.") + } + + if (!canCoupon.isActive) { + throw SodaException("이용이 불가능한 쿠폰입니다.") + } + } + fun checkAnyChanges(request: ModifyCanCouponRequest) { if (request.isMultipleUse == null && request.isActive == null && request.validity == null) { throw SodaException("변경사항이 없습니다.")