diff --git a/src/main/kotlin/kr/co/vividnext/sodalive/can/CanService.kt b/src/main/kotlin/kr/co/vividnext/sodalive/can/CanService.kt index b24964b9..d51443a3 100644 --- a/src/main/kotlin/kr/co/vividnext/sodalive/can/CanService.kt +++ b/src/main/kotlin/kr/co/vividnext/sodalive/can/CanService.kt @@ -120,6 +120,7 @@ class CanService( CanUsage.CHAT_QUOTA_PURCHASE -> "캐릭터 톡 이용권 구매" CanUsage.CHAT_ROOM_RESET -> "캐릭터 톡 초기화" + CanUsage.GIFT -> "선물하기" } val createdAt = it.createdAt diff --git a/src/main/kotlin/kr/co/vividnext/sodalive/can/payment/CanPaymentService.kt b/src/main/kotlin/kr/co/vividnext/sodalive/can/payment/CanPaymentService.kt index d5de9e6d..dc3d61ee 100644 --- a/src/main/kotlin/kr/co/vividnext/sodalive/can/payment/CanPaymentService.kt +++ b/src/main/kotlin/kr/co/vividnext/sodalive/can/payment/CanPaymentService.kt @@ -54,7 +54,7 @@ class CanPaymentService( communityPost: CreatorCommunity? = null, auditionApplicant: AuditionApplicant? = null, container: String - ) { + ): UseCan { val member = memberRepository.findByIdOrNull(id = memberId) ?: throw SodaException(messageKey = "can.payment.invalid_request_retry") val useRewardCan = spendRewardCan(member, needCan, container) @@ -131,6 +131,8 @@ class CanPaymentService( useCan.member = member useCan.chatRoomId = chatRoomId useCan.characterId = characterId + } else if (canUsage == CanUsage.GIFT) { + useCan.member = member } else { throw SodaException(messageKey = "common.error.invalid_request") } @@ -160,6 +162,18 @@ class CanPaymentService( useCan, paymentGateway = PaymentGateway.APPLE_IAP ) + + return useCan + } + + @Transactional + fun spendGiftCan(memberId: Long, needCan: Int, container: String): Long { + return spendCan( + memberId = memberId, + needCan = needCan, + canUsage = CanUsage.GIFT, + container = container + ).id!! } private fun setUseCanCalculate( @@ -324,6 +338,24 @@ class CanPaymentService( roomId = roomId, canUsage = CanUsage.LIVE ) ?: throw SodaException(messageKey = "can.payment.invalid_reservation") + refundUseCan(member, useCan) + } + + @Transactional + fun refundGiftCan(memberId: Long, useCanId: Long) { + val member = memberRepository.findByIdOrNull(memberId) + ?: throw SodaException(messageKey = "common.error.invalid_request") + val useCan = useCanRepository.findByIdOrNull(useCanId) + ?: throw SodaException(messageKey = "common.error.invalid_request") + + if (useCan.member?.id != member.id || useCan.canUsage != CanUsage.GIFT || useCan.isRefund) { + throw SodaException(messageKey = "common.error.invalid_request") + } + + refundUseCan(member, useCan) + } + + private fun refundUseCan(member: Member, useCan: UseCan) { useCan.isRefund = true val useCanCalculates = useCanCalculateRepository.findByUseCanIdAndStatus(useCan.id!!) diff --git a/src/main/kotlin/kr/co/vividnext/sodalive/can/use/CanUsage.kt b/src/main/kotlin/kr/co/vividnext/sodalive/can/use/CanUsage.kt index 32259413..a98a7c9c 100644 --- a/src/main/kotlin/kr/co/vividnext/sodalive/can/use/CanUsage.kt +++ b/src/main/kotlin/kr/co/vividnext/sodalive/can/use/CanUsage.kt @@ -14,5 +14,6 @@ enum class CanUsage { CHAT_MESSAGE_PURCHASE, // 메시지를 통한 구매(이미지 등 다양한 리소스에 공통 적용) CHARACTER_IMAGE_PURCHASE, // 캐릭터 이미지 단독 구매 CHAT_QUOTA_PURCHASE, // 채팅 횟수(쿼터) 충전 - CHAT_ROOM_RESET // 채팅방 초기화 결제(별도 구분) + CHAT_ROOM_RESET, // 채팅방 초기화 결제(별도 구분) + GIFT }