From e96b3d9bd4233e824817f37384764987a90f1404 Mon Sep 17 00:00:00 2001 From: Klaus Date: Tue, 28 Nov 2023 14:24:03 +0900 Subject: [PATCH] =?UTF-8?q?=EB=A3=B0=EB=A0=9B=20=EB=8D=B0=EC=9D=B4?= =?UTF-8?q?=ED=84=B0=20=EC=83=9D=EC=84=B1/=EC=88=98=EC=A0=95=20API=20?= =?UTF-8?q?=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../roulette/CreateOrUpdateRouletteRequest.kt | 7 ++++ .../sodalive/live/roulette/Roulette.kt | 18 +++++++++ .../live/roulette/RouletteController.kt | 27 +++++++++++++ .../live/roulette/RouletteRepository.kt | 7 ++++ .../sodalive/live/roulette/RouletteService.kt | 39 +++++++++++++++++++ 5 files changed, 98 insertions(+) create mode 100644 src/main/kotlin/kr/co/vividnext/sodalive/live/roulette/CreateOrUpdateRouletteRequest.kt create mode 100644 src/main/kotlin/kr/co/vividnext/sodalive/live/roulette/Roulette.kt create mode 100644 src/main/kotlin/kr/co/vividnext/sodalive/live/roulette/RouletteController.kt create mode 100644 src/main/kotlin/kr/co/vividnext/sodalive/live/roulette/RouletteRepository.kt create mode 100644 src/main/kotlin/kr/co/vividnext/sodalive/live/roulette/RouletteService.kt diff --git a/src/main/kotlin/kr/co/vividnext/sodalive/live/roulette/CreateOrUpdateRouletteRequest.kt b/src/main/kotlin/kr/co/vividnext/sodalive/live/roulette/CreateOrUpdateRouletteRequest.kt new file mode 100644 index 0000000..6f726c9 --- /dev/null +++ b/src/main/kotlin/kr/co/vividnext/sodalive/live/roulette/CreateOrUpdateRouletteRequest.kt @@ -0,0 +1,7 @@ +package kr.co.vividnext.sodalive.live.roulette + +data class CreateOrUpdateRouletteRequest( + val can: Int, + val isActive: Boolean, + val items: List +) diff --git a/src/main/kotlin/kr/co/vividnext/sodalive/live/roulette/Roulette.kt b/src/main/kotlin/kr/co/vividnext/sodalive/live/roulette/Roulette.kt new file mode 100644 index 0000000..9784c2c --- /dev/null +++ b/src/main/kotlin/kr/co/vividnext/sodalive/live/roulette/Roulette.kt @@ -0,0 +1,18 @@ +package kr.co.vividnext.sodalive.live.roulette + +import org.springframework.data.annotation.Id +import org.springframework.data.redis.core.RedisHash + +@RedisHash("roulette") +data class Roulette( + @Id + val creatorId: Long, + var can: Int, + var isActive: Boolean, + var items: List +) + +data class RouletteItem( + val title: String, + val percentage: Int +) 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 new file mode 100644 index 0000000..b4c84c4 --- /dev/null +++ b/src/main/kotlin/kr/co/vividnext/sodalive/live/roulette/RouletteController.kt @@ -0,0 +1,27 @@ +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.PostMapping +import org.springframework.web.bind.annotation.RequestBody +import org.springframework.web.bind.annotation.RequestMapping +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)) + } +} 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 new file mode 100644 index 0000000..fbdf7c7 --- /dev/null +++ b/src/main/kotlin/kr/co/vividnext/sodalive/live/roulette/RouletteRepository.kt @@ -0,0 +1,7 @@ +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 new file mode 100644 index 0000000..6939703 --- /dev/null +++ b/src/main/kotlin/kr/co/vividnext/sodalive/live/roulette/RouletteService.kt @@ -0,0 +1,39 @@ +package kr.co.vividnext.sodalive.live.roulette + +import kr.co.vividnext.sodalive.common.SodaException +import org.springframework.data.repository.findByIdOrNull +import org.springframework.stereotype.Service + +@Service +class RouletteService(private val repository: RouletteRepository) { + fun createOrUpdateRoulette(memberId: Long, request: CreateOrUpdateRouletteRequest) { + rouletteValidate(request) + + val roulette = repository.findByIdOrNull(id = memberId) ?: Roulette( + creatorId = memberId, + can = request.can, + isActive = request.isActive, + items = request.items + ) + + repository.save(roulette) + } + + private fun rouletteValidate(request: CreateOrUpdateRouletteRequest) { + if (request.can < 5) { + throw SodaException("룰렛 금액은 최소 5캔 입니다.") + } + + if (request.items.size < 2 || request.items.size > 6) { + throw SodaException("룰렛 옵션은 최소 2개, 최대 6개까지 설정할 수 있습니다.") + } + + val percentage = request.items.asSequence() + .map { it.percentage } + .reduce { acc, percentage -> acc + percentage } + + if (percentage != 100) { + throw SodaException("옵션 확률의 합이 100%가 아닙니다.") + } + } +}