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 { 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 { - 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 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 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