From aeed1dbd06707c1634c0157903a9df60d6af05fb Mon Sep 17 00:00:00 2001 From: Klaus Date: Fri, 1 Dec 2023 02:36:29 +0900 Subject: [PATCH] =?UTF-8?q?=EB=A3=B0=EB=A0=9B=20=EC=A0=80=EC=9E=A5=20API,?= =?UTF-8?q?=20=EB=A3=B0=EB=A0=9B=20=EA=B0=80=EC=A0=B8=EC=98=A4=EA=B8=B0=20?= =?UTF-8?q?API=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../sodalive/live/roulette/Roulette.kt | 2 +- .../live/roulette/RouletteController.kt | 7 +-- .../sodalive/live/roulette/RouletteService.kt | 48 ++++++++++--------- 3 files changed, 27 insertions(+), 30 deletions(-) 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 index 0a13e61..560e44c 100644 --- a/src/main/kotlin/kr/co/vividnext/sodalive/live/roulette/Roulette.kt +++ b/src/main/kotlin/kr/co/vividnext/sodalive/live/roulette/Roulette.kt @@ -9,7 +9,7 @@ data class Roulette( val creatorId: Long, var can: Int, var isActive: Boolean, - var items: List + var items: List = mutableListOf() ) data class RouletteItem( 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 29df13a..979bee4 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 @@ -34,12 +34,7 @@ class RouletteController(private val service: RouletteService) { ): ApiResponse { if (member == null) throw SodaException("로그인 정보를 확인해주세요.") - val response = service.getRoulette(creatorId = creatorId) - if (response == null && creatorId != member.id!!) { - throw SodaException("룰렛을 사용할 수 없습니다.") - } - - return ApiResponse.ok(response) + return ApiResponse.ok(service.getRoulette(creatorId = creatorId, memberId = member.id!!)) } @PostMapping("/spin") 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 9eece76..0dceae6 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 @@ -8,8 +8,6 @@ import kr.co.vividnext.sodalive.member.MemberRole import org.springframework.data.repository.findByIdOrNull import org.springframework.stereotype.Service import org.springframework.transaction.annotation.Transactional -import java.util.concurrent.locks.ReentrantReadWriteLock -import kotlin.concurrent.write @Service class RouletteService( @@ -17,22 +15,26 @@ class RouletteService( private val repository: RouletteRepository, private val roomRepository: LiveRoomRepository ) { - private val tokenLocks: MutableMap = mutableMapOf() - - fun createOrUpdateRoulette(memberId: Long, request: CreateOrUpdateRouletteRequest) { + fun createOrUpdateRoulette(memberId: Long, request: CreateOrUpdateRouletteRequest): Boolean { rouletteValidate(request) - val roulette = repository.findByIdOrNull(id = memberId) ?: Roulette( - creatorId = memberId, - can = request.can, - isActive = request.isActive, - items = request.items - ) - - val lock = getOrCreateLock(memberId = memberId) - lock.write { - repository.save(roulette) + 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) { @@ -45,14 +47,18 @@ class RouletteService( } } - fun getRoulette(creatorId: Long): GetRouletteResponse? { + fun getRoulette(creatorId: Long, memberId: Long): GetRouletteResponse? { val roulette = repository.findByIdOrNull(id = creatorId) - if (roulette == null || !roulette.isActive || roulette.items.isEmpty()) { - return null + if (creatorId != memberId && (roulette == null || !roulette.isActive || roulette.items.isEmpty())) { + throw SodaException("룰렛을 사용할 수 없습니다.") } - return GetRouletteResponse(can = roulette.can, isActive = roulette.isActive, items = roulette.items) + return GetRouletteResponse( + can = roulette?.can ?: 5, + isActive = roulette?.isActive ?: false, + items = roulette?.items ?: listOf() + ) } @Transactional @@ -85,8 +91,4 @@ class RouletteService( return GetRouletteResponse(can = roulette.can, isActive = roulette.isActive, items = roulette.items) } - - private fun getOrCreateLock(memberId: Long): ReentrantReadWriteLock { - return tokenLocks.computeIfAbsent(memberId) { ReentrantReadWriteLock() } - } }