feat(gift): 선물 캔 결제 처리를 추가한다

This commit is contained in:
2026-09-30 13:36:04 +09:00
parent 760005c266
commit 57bb57ffb5
3 changed files with 36 additions and 2 deletions
@@ -120,6 +120,7 @@ class CanService(
CanUsage.CHAT_QUOTA_PURCHASE -> "캐릭터 톡 이용권 구매" CanUsage.CHAT_QUOTA_PURCHASE -> "캐릭터 톡 이용권 구매"
CanUsage.CHAT_ROOM_RESET -> "캐릭터 톡 초기화" CanUsage.CHAT_ROOM_RESET -> "캐릭터 톡 초기화"
CanUsage.GIFT -> "선물하기"
} }
val createdAt = it.createdAt val createdAt = it.createdAt
@@ -54,7 +54,7 @@ class CanPaymentService(
communityPost: CreatorCommunity? = null, communityPost: CreatorCommunity? = null,
auditionApplicant: AuditionApplicant? = null, auditionApplicant: AuditionApplicant? = null,
container: String container: String
) { ): UseCan {
val member = memberRepository.findByIdOrNull(id = memberId) val member = memberRepository.findByIdOrNull(id = memberId)
?: throw SodaException(messageKey = "can.payment.invalid_request_retry") ?: throw SodaException(messageKey = "can.payment.invalid_request_retry")
val useRewardCan = spendRewardCan(member, needCan, container) val useRewardCan = spendRewardCan(member, needCan, container)
@@ -131,6 +131,8 @@ class CanPaymentService(
useCan.member = member useCan.member = member
useCan.chatRoomId = chatRoomId useCan.chatRoomId = chatRoomId
useCan.characterId = characterId useCan.characterId = characterId
} else if (canUsage == CanUsage.GIFT) {
useCan.member = member
} else { } else {
throw SodaException(messageKey = "common.error.invalid_request") throw SodaException(messageKey = "common.error.invalid_request")
} }
@@ -160,6 +162,18 @@ class CanPaymentService(
useCan, useCan,
paymentGateway = PaymentGateway.APPLE_IAP 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( private fun setUseCanCalculate(
@@ -324,6 +338,24 @@ class CanPaymentService(
roomId = roomId, roomId = roomId,
canUsage = CanUsage.LIVE canUsage = CanUsage.LIVE
) ?: throw SodaException(messageKey = "can.payment.invalid_reservation") ) ?: 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 useCan.isRefund = true
val useCanCalculates = useCanCalculateRepository.findByUseCanIdAndStatus(useCan.id!!) val useCanCalculates = useCanCalculateRepository.findByUseCanIdAndStatus(useCan.id!!)
@@ -14,5 +14,6 @@ enum class CanUsage {
CHAT_MESSAGE_PURCHASE, // 메시지를 통한 구매(이미지 등 다양한 리소스에 공통 적용) CHAT_MESSAGE_PURCHASE, // 메시지를 통한 구매(이미지 등 다양한 리소스에 공통 적용)
CHARACTER_IMAGE_PURCHASE, // 캐릭터 이미지 단독 구매 CHARACTER_IMAGE_PURCHASE, // 캐릭터 이미지 단독 구매
CHAT_QUOTA_PURCHASE, // 채팅 횟수(쿼터) 충전 CHAT_QUOTA_PURCHASE, // 채팅 횟수(쿼터) 충전
CHAT_ROOM_RESET // 채팅방 초기화 결제(별도 구분) CHAT_ROOM_RESET, // 채팅방 초기화 결제(별도 구분)
GIFT
} }