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..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 { @@ -28,4 +31,20 @@ 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("변경사항이 없습니다.") + } + } } 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 } 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..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 @@ -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? +)