From 7badf857cb08ae6a97bdb1afe35fd027c098975e Mon Sep 17 00:00:00 2001 From: Klaus Date: Sat, 2 Dec 2023 05:01:58 +0900 Subject: [PATCH] =?UTF-8?q?=EB=A3=B0=EB=A0=9B=20=EB=8F=8C=EB=A6=AC?= =?UTF-8?q?=EA=B8=B0=20=EC=8B=A4=ED=8C=A8=EC=8B=9C=20=EC=BA=94=20=ED=99=98?= =?UTF-8?q?=EB=B6=88=20API=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../live/roulette/RouletteController.kt | 11 ++++ .../sodalive/live/roulette/RouletteService.kt | 55 ++++++++++++++++++- 2 files changed, 65 insertions(+), 1 deletion(-) diff --git a/src/main/kotlin/kr/co/vividnext/sodalive/live/roulette/RouletteController.kt b/src/main/kotlin/kr/co/vividnext/sodalive/live/roulette/RouletteController.kt index 979bee4..06e48da 100644 --- a/src/main/kotlin/kr/co/vividnext/sodalive/live/roulette/RouletteController.kt +++ b/src/main/kotlin/kr/co/vividnext/sodalive/live/roulette/RouletteController.kt @@ -6,6 +6,7 @@ import kr.co.vividnext.sodalive.member.Member import kr.co.vividnext.sodalive.member.MemberRole import org.springframework.security.core.annotation.AuthenticationPrincipal import org.springframework.web.bind.annotation.GetMapping +import org.springframework.web.bind.annotation.PathVariable import org.springframework.web.bind.annotation.PostMapping import org.springframework.web.bind.annotation.RequestBody import org.springframework.web.bind.annotation.RequestMapping @@ -46,4 +47,14 @@ class RouletteController(private val service: RouletteService) { ApiResponse.ok(service.spinRoulette(request = request, memberId = member.id!!)) } + + @PostMapping("/refund/{id}") + fun refundDonation( + @PathVariable id: Long, + @AuthenticationPrincipal(expression = "#this == 'anonymousUser' ? null : member") member: Member? + ) = run { + if (member == null) throw SodaException("로그인 정보를 확인해주세요.") + + ApiResponse.ok(service.refundDonation(id, member)) + } } diff --git a/src/main/kotlin/kr/co/vividnext/sodalive/live/roulette/RouletteService.kt b/src/main/kotlin/kr/co/vividnext/sodalive/live/roulette/RouletteService.kt index 0dceae6..f45059a 100644 --- a/src/main/kotlin/kr/co/vividnext/sodalive/live/roulette/RouletteService.kt +++ b/src/main/kotlin/kr/co/vividnext/sodalive/live/roulette/RouletteService.kt @@ -1,9 +1,20 @@ package kr.co.vividnext.sodalive.live.roulette +import kr.co.vividnext.sodalive.can.CanRepository +import kr.co.vividnext.sodalive.can.charge.Charge +import kr.co.vividnext.sodalive.can.charge.ChargeRepository +import kr.co.vividnext.sodalive.can.charge.ChargeStatus import kr.co.vividnext.sodalive.can.payment.CanPaymentService +import kr.co.vividnext.sodalive.can.payment.Payment +import kr.co.vividnext.sodalive.can.payment.PaymentGateway +import kr.co.vividnext.sodalive.can.payment.PaymentStatus import kr.co.vividnext.sodalive.can.use.CanUsage +import kr.co.vividnext.sodalive.can.use.UseCanCalculateRepository +import kr.co.vividnext.sodalive.can.use.UseCanCalculateStatus import kr.co.vividnext.sodalive.common.SodaException import kr.co.vividnext.sodalive.live.room.LiveRoomRepository +import kr.co.vividnext.sodalive.member.Member +import kr.co.vividnext.sodalive.member.MemberRepository import kr.co.vividnext.sodalive.member.MemberRole import org.springframework.data.repository.findByIdOrNull import org.springframework.stereotype.Service @@ -12,8 +23,13 @@ import org.springframework.transaction.annotation.Transactional @Service class RouletteService( private val canPaymentService: CanPaymentService, + + private val canRepository: CanRepository, private val repository: RouletteRepository, - private val roomRepository: LiveRoomRepository + private val chargeRepository: ChargeRepository, + private val roomRepository: LiveRoomRepository, + private val memberRepository: MemberRepository, + private val useCanCalculateRepository: UseCanCalculateRepository ) { fun createOrUpdateRoulette(memberId: Long, request: CreateOrUpdateRouletteRequest): Boolean { rouletteValidate(request) @@ -91,4 +107,41 @@ class RouletteService( return GetRouletteResponse(can = roulette.can, isActive = roulette.isActive, items = roulette.items) } + + @Transactional + fun refundDonation(roomId: Long, member: Member) { + val donator = memberRepository.findByIdOrNull(member.id) + ?: throw SodaException("룰렛 돌리기에 실패한 캔이 환불되지 않았습니다\n고객센터로 문의해주세요.") + + val useCan = canRepository.getCanUsedForLiveRoomNotRefund( + memberId = member.id!!, + roomId = roomId, + canUsage = CanUsage.SPIN_ROULETTE + ) ?: throw SodaException("룰렛 돌리기에 실패한 캔이 환불되지 않았습니다\n고객센터로 문의해주세요.") + useCan.isRefund = true + + val useCanCalculates = useCanCalculateRepository.findByUseCanIdAndStatus(useCan.id!!) + useCanCalculates.forEach { + it.status = UseCanCalculateStatus.REFUND + val charge = Charge(0, it.can, status = ChargeStatus.REFUND_CHARGE) + charge.title = "${it.can} 캔" + charge.useCan = useCan + + when (it.paymentGateway) { + PaymentGateway.GOOGLE_IAP -> donator.googleRewardCan += charge.rewardCan + PaymentGateway.APPLE_IAP -> donator.appleRewardCan += charge.rewardCan + else -> donator.pgRewardCan += charge.rewardCan + } + charge.member = donator + + val payment = Payment( + status = PaymentStatus.COMPLETE, + paymentGateway = it.paymentGateway + ) + payment.method = "환불" + charge.payment = payment + + chargeRepository.save(charge) + } + } }