From e6dec42a00390f4552b05539508f534ebcece96a Mon Sep 17 00:00:00 2001
From: Klaus <klaus@vividnext.co.kr>
Date: Wed, 8 May 2024 20:22:47 +0900
Subject: [PATCH] =?UTF-8?q?=EB=B6=88=ED=95=84=EC=9A=94=ED=95=9C=20?=
 =?UTF-8?q?=EB=A7=88=EC=9D=B4=EA=B7=B8=EB=A0=88=EC=9D=B4=EC=85=98=20?=
 =?UTF-8?q?=EB=A1=9C=EC=A7=81=20=EC=A0=9C=EA=B1=B0?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 .../live/roulette/NewRouletteService.kt       |  22 +--
 .../live/roulette/RouletteController.kt       |  60 -------
 .../live/roulette/RouletteRepository.kt       |   7 -
 .../sodalive/live/roulette/RouletteService.kt | 147 ------------------
 .../live/roulette/v2/RouletteController.kt    |   8 +
 .../live/roulette/v2/RouletteRepository.kt    |   8 +
 .../live/roulette/v2/RouletteService.kt       |   6 +
 7 files changed, 23 insertions(+), 235 deletions(-)
 delete mode 100644 src/main/kotlin/kr/co/vividnext/sodalive/live/roulette/RouletteController.kt
 delete mode 100644 src/main/kotlin/kr/co/vividnext/sodalive/live/roulette/RouletteRepository.kt
 delete mode 100644 src/main/kotlin/kr/co/vividnext/sodalive/live/roulette/RouletteService.kt
 create mode 100644 src/main/kotlin/kr/co/vividnext/sodalive/live/roulette/v2/RouletteController.kt
 create mode 100644 src/main/kotlin/kr/co/vividnext/sodalive/live/roulette/v2/RouletteRepository.kt
 create mode 100644 src/main/kotlin/kr/co/vividnext/sodalive/live/roulette/v2/RouletteService.kt

diff --git a/src/main/kotlin/kr/co/vividnext/sodalive/live/roulette/NewRouletteService.kt b/src/main/kotlin/kr/co/vividnext/sodalive/live/roulette/NewRouletteService.kt
index fc669e1..8d9b176 100644
--- a/src/main/kotlin/kr/co/vividnext/sodalive/live/roulette/NewRouletteService.kt
+++ b/src/main/kotlin/kr/co/vividnext/sodalive/live/roulette/NewRouletteService.kt
@@ -27,7 +27,6 @@ class NewRouletteService(
 
     private val canRepository: CanRepository,
     private val repository: NewRouletteRepository,
-    private val oldRepository: RouletteRepository,
     private val roomRepository: LiveRoomRepository,
     private val memberRepository: MemberRepository,
     private val chargeRepository: ChargeRepository,
@@ -36,27 +35,9 @@ class NewRouletteService(
     fun getAllRoulette(creatorId: Long, memberId: Long): List<GetNewRouletteResponse> {
         if (creatorId != memberId) throw SodaException("잘못된 요청입니다.")
 
-        var rouletteList = repository.findByCreatorId(creatorId)
-        if (rouletteList.isEmpty()) {
-            val roulette = oldRepository.findByIdOrNull(creatorId)
-            if (roulette != null) {
-                repository.save(
-                    NewRoulette(
-                        id = idGenerator.generateId(SEQUENCE_NAME),
-                        creatorId = creatorId,
-                        can = roulette.can,
-                        isActive = false,
-                        items = roulette.items
-                    )
-                )
-
-                rouletteList = repository.findByCreatorId(creatorId)
-                oldRepository.deleteById(roulette.creatorId)
-            }
-        }
+        val rouletteList = repository.findByCreatorId(creatorId)
 
         return rouletteList.sortedBy { it.id }
-            .asSequence()
             .map {
                 GetNewRouletteResponse(
                     it.id,
@@ -65,7 +46,6 @@ class NewRouletteService(
                     it.items
                 )
             }
-            .toList()
     }
 
     fun createRoulette(memberId: Long, request: CreateNewRouletteRequest): Boolean {
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
deleted file mode 100644
index 06e48da..0000000
--- a/src/main/kotlin/kr/co/vividnext/sodalive/live/roulette/RouletteController.kt
+++ /dev/null
@@ -1,60 +0,0 @@
-package kr.co.vividnext.sodalive.live.roulette
-
-import kr.co.vividnext.sodalive.common.ApiResponse
-import kr.co.vividnext.sodalive.common.SodaException
-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
-import org.springframework.web.bind.annotation.RequestParam
-import org.springframework.web.bind.annotation.RestController
-
-@RestController
-@RequestMapping("/roulette")
-class RouletteController(private val service: RouletteService) {
-    @PostMapping
-    fun createOrUpdateRoulette(
-        @RequestBody request: CreateOrUpdateRouletteRequest,
-        @AuthenticationPrincipal(expression = "#this == 'anonymousUser' ? null : member") member: Member?
-    ) = run {
-        if (member == null || member.role != MemberRole.CREATOR) {
-            throw SodaException("로그인 정보를 확인해주세요.")
-        }
-
-        ApiResponse.ok(service.createOrUpdateRoulette(memberId = member.id!!, request = request))
-    }
-
-    @GetMapping
-    fun getRoulette(
-        @RequestParam creatorId: Long,
-        @AuthenticationPrincipal(expression = "#this == 'anonymousUser' ? null : member") member: Member?
-    ): ApiResponse<GetRouletteResponse> {
-        if (member == null) throw SodaException("로그인 정보를 확인해주세요.")
-
-        return ApiResponse.ok(service.getRoulette(creatorId = creatorId, memberId = member.id!!))
-    }
-
-    @PostMapping("/spin")
-    fun spinRoulette(
-        @RequestBody request: SpinRouletteRequest,
-        @AuthenticationPrincipal(expression = "#this == 'anonymousUser' ? null : member") member: Member?
-    ) = run {
-        if (member == null) throw SodaException("로그인 정보를 확인해주세요.")
-
-        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/RouletteRepository.kt b/src/main/kotlin/kr/co/vividnext/sodalive/live/roulette/RouletteRepository.kt
deleted file mode 100644
index fbdf7c7..0000000
--- a/src/main/kotlin/kr/co/vividnext/sodalive/live/roulette/RouletteRepository.kt
+++ /dev/null
@@ -1,7 +0,0 @@
-package kr.co.vividnext.sodalive.live.roulette
-
-import org.springframework.data.repository.CrudRepository
-import org.springframework.stereotype.Repository
-
-@Repository
-interface RouletteRepository : CrudRepository<Roulette, Long>
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
deleted file mode 100644
index d3826e4..0000000
--- a/src/main/kotlin/kr/co/vividnext/sodalive/live/roulette/RouletteService.kt
+++ /dev/null
@@ -1,147 +0,0 @@
-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
-import org.springframework.transaction.annotation.Transactional
-
-@Service
-class RouletteService(
-    private val canPaymentService: CanPaymentService,
-
-    private val canRepository: CanRepository,
-    private val repository: RouletteRepository,
-    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)
-
-        var roulette = repository.findByIdOrNull(id = memberId)
-        if (roulette != null) {
-            roulette.can = request.can
-            roulette.isActive = request.isActive
-            roulette.items = request.items
-        } else {
-            roulette = Roulette(
-                creatorId = memberId,
-                can = request.can,
-                isActive = request.isActive,
-                items = request.items
-            )
-        }
-
-        repository.save(roulette)
-
-        return request.isActive
-    }
-
-    private fun rouletteValidate(request: CreateOrUpdateRouletteRequest) {
-        if (request.can < 5) {
-            throw SodaException("룰렛 금액은 최소 5캔 입니다.")
-        }
-
-        if (request.items.size < 2 || request.items.size > 10) {
-            throw SodaException("룰렛 옵션은 최소 2개, 최대 10개까지 설정할 수 있습니다.")
-        }
-    }
-
-    fun getRoulette(creatorId: Long, memberId: Long): GetRouletteResponse? {
-        val roulette = repository.findByIdOrNull(id = creatorId)
-
-        if (creatorId != memberId && (roulette == null || !roulette.isActive || roulette.items.isEmpty())) {
-            throw SodaException("룰렛을 사용할 수 없습니다.")
-        }
-
-        return GetRouletteResponse(
-            can = roulette?.can ?: 0,
-            isActive = roulette?.isActive ?: false,
-            items = roulette?.items ?: listOf()
-        )
-    }
-
-    @Transactional
-    fun spinRoulette(request: SpinRouletteRequest, memberId: Long): GetRouletteResponse {
-        // STEP 1 - 라이브 정보 가져오기
-        val room = roomRepository.findByIdOrNull(request.roomId)
-            ?: throw SodaException("해당하는 라이브가 없습니다.")
-
-        val host = room.member ?: throw SodaException("잘못된 요청입니다.")
-
-        if (host.role != MemberRole.CREATOR) {
-            throw SodaException("비비드넥스트와 계약한\n크리에이터의 룰렛만 사용하실 수 있습니다.")
-        }
-
-        // STEP 2 - 룰렛 데이터 가져오기
-        val roulette = repository.findByIdOrNull(id = host.id!!)
-
-        if (roulette == null || !roulette.isActive || roulette.items.isEmpty()) {
-            throw SodaException("룰렛을 사용할 수 없습니다.")
-        }
-
-        // STEP 3 - 캔 사용
-        canPaymentService.spendCan(
-            memberId = memberId,
-            needCan = roulette.can,
-            canUsage = CanUsage.SPIN_ROULETTE,
-            liveRoom = room,
-            container = request.container
-        )
-
-        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)
-        }
-    }
-}
diff --git a/src/main/kotlin/kr/co/vividnext/sodalive/live/roulette/v2/RouletteController.kt b/src/main/kotlin/kr/co/vividnext/sodalive/live/roulette/v2/RouletteController.kt
new file mode 100644
index 0000000..d26521f
--- /dev/null
+++ b/src/main/kotlin/kr/co/vividnext/sodalive/live/roulette/v2/RouletteController.kt
@@ -0,0 +1,8 @@
+package kr.co.vividnext.sodalive.live.roulette.v2
+
+import org.springframework.web.bind.annotation.RequestMapping
+import org.springframework.web.bind.annotation.RestController
+
+@RestController
+@RequestMapping("/roulette")
+class RouletteController(private val service: RouletteService)
diff --git a/src/main/kotlin/kr/co/vividnext/sodalive/live/roulette/v2/RouletteRepository.kt b/src/main/kotlin/kr/co/vividnext/sodalive/live/roulette/v2/RouletteRepository.kt
new file mode 100644
index 0000000..202b47c
--- /dev/null
+++ b/src/main/kotlin/kr/co/vividnext/sodalive/live/roulette/v2/RouletteRepository.kt
@@ -0,0 +1,8 @@
+package kr.co.vividnext.sodalive.live.roulette.v2
+
+import kr.co.vividnext.sodalive.live.roulette.NewRoulette
+import org.springframework.data.repository.CrudRepository
+import org.springframework.stereotype.Repository
+
+@Repository
+interface RouletteRepository : CrudRepository<NewRoulette, Long>
diff --git a/src/main/kotlin/kr/co/vividnext/sodalive/live/roulette/v2/RouletteService.kt b/src/main/kotlin/kr/co/vividnext/sodalive/live/roulette/v2/RouletteService.kt
new file mode 100644
index 0000000..3f28978
--- /dev/null
+++ b/src/main/kotlin/kr/co/vividnext/sodalive/live/roulette/v2/RouletteService.kt
@@ -0,0 +1,6 @@
+package kr.co.vividnext.sodalive.live.roulette.v2
+
+import org.springframework.stereotype.Service
+
+@Service
+class RouletteService