From c65bad63caf566ffb57656788ccdc38188022b1b Mon Sep 17 00:00:00 2001
From: Klaus <klaus@vividnext.co.kr>
Date: Wed, 3 Jan 2024 23:31:12 +0900
Subject: [PATCH] =?UTF-8?q?=EC=BA=94=20=EC=BF=A0=ED=8F=B0=20-=20=EC=88=98?=
 =?UTF-8?q?=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?
+)