diff --git a/src/main/kotlin/kr/co/vividnext/sodalive/can/CanService.kt b/src/main/kotlin/kr/co/vividnext/sodalive/can/CanService.kt index bfe03fa..87025af 100644 --- a/src/main/kotlin/kr/co/vividnext/sodalive/can/CanService.kt +++ b/src/main/kotlin/kr/co/vividnext/sodalive/can/CanService.kt @@ -53,7 +53,7 @@ class CanService(private val repository: CanRepository) { } .map { val title: String = when (it.canUsage) { - CanUsage.DONATION, CanUsage.SPIN_ROULETTE -> { + CanUsage.HEART, CanUsage.DONATION, CanUsage.SPIN_ROULETTE -> { if (it.room != null) { "[라이브 후원] ${it.room!!.member!!.nickname}" } else if (it.audioContent != null) { diff --git a/src/main/kotlin/kr/co/vividnext/sodalive/can/use/CanUsage.kt b/src/main/kotlin/kr/co/vividnext/sodalive/can/use/CanUsage.kt index 667f2b3..6677b8f 100644 --- a/src/main/kotlin/kr/co/vividnext/sodalive/can/use/CanUsage.kt +++ b/src/main/kotlin/kr/co/vividnext/sodalive/can/use/CanUsage.kt @@ -2,6 +2,7 @@ package kr.co.vividnext.sodalive.can.use enum class CanUsage { LIVE, + HEART, DONATION, CHANGE_NICKNAME, ORDER_CONTENT, diff --git a/src/main/kotlin/kr/co/vividnext/sodalive/live/room/LiveRoomController.kt b/src/main/kotlin/kr/co/vividnext/sodalive/live/room/LiveRoomController.kt index 02029a5..a6e84fd 100644 --- a/src/main/kotlin/kr/co/vividnext/sodalive/live/room/LiveRoomController.kt +++ b/src/main/kotlin/kr/co/vividnext/sodalive/live/room/LiveRoomController.kt @@ -5,6 +5,7 @@ import kr.co.vividnext.sodalive.common.SodaException import kr.co.vividnext.sodalive.live.room.cancel.CancelLiveRequest import kr.co.vividnext.sodalive.live.room.donation.DeleteLiveRoomDonationMessage import kr.co.vividnext.sodalive.live.room.donation.LiveRoomDonationRequest +import kr.co.vividnext.sodalive.live.room.like.LiveRoomLikeHeartRequest import kr.co.vividnext.sodalive.live.room.visit.LiveRoomVisitService import kr.co.vividnext.sodalive.member.Member import org.springframework.data.domain.Pageable @@ -262,4 +263,14 @@ class LiveRoomController( ApiResponse.ok(visitService.getRecentVisitRoomUsers(member)) } + + @PostMapping("/like-heart") + fun likeHeart( + @RequestBody request: LiveRoomLikeHeartRequest, + @AuthenticationPrincipal(expression = "#this == 'anonymousUser' ? null : member") member: Member? + ) = run { + if (member == null) throw SodaException("로그인 정보를 확인해주세요.") + + ApiResponse.ok(service.likeHeart(request, member)) + } } diff --git a/src/main/kotlin/kr/co/vividnext/sodalive/live/room/LiveRoomService.kt b/src/main/kotlin/kr/co/vividnext/sodalive/live/room/LiveRoomService.kt index bad1a6d..e78fafb 100644 --- a/src/main/kotlin/kr/co/vividnext/sodalive/live/room/LiveRoomService.kt +++ b/src/main/kotlin/kr/co/vividnext/sodalive/live/room/LiveRoomService.kt @@ -39,6 +39,7 @@ import kr.co.vividnext.sodalive.live.room.info.LiveRoomInfo import kr.co.vividnext.sodalive.live.room.info.LiveRoomInfoRedisRepository import kr.co.vividnext.sodalive.live.room.info.LiveRoomMember import kr.co.vividnext.sodalive.live.room.kickout.LiveRoomKickOutService +import kr.co.vividnext.sodalive.live.room.like.LiveRoomLikeHeartRequest import kr.co.vividnext.sodalive.live.room.menu.CreateLiveMenuRequest import kr.co.vividnext.sodalive.live.room.menu.LiveRoomMenuService import kr.co.vividnext.sodalive.live.room.menu.UpdateLiveMenuRequest @@ -1221,4 +1222,25 @@ class LiveRoomService( private fun getOrCreateLock(memberId: Long): ReentrantReadWriteLock { return tokenLocks.computeIfAbsent(memberId) { ReentrantReadWriteLock() } } + + @Transactional + fun likeHeart(request: LiveRoomLikeHeartRequest, member: Member) { + val room = repository.findByIdOrNull(request.roomId) + ?: throw SodaException("해당하는 라이브가 없습니다.") + + val host = room.member ?: throw SodaException("잘못된 요청입니다.") + + if (host.role != MemberRole.CREATOR) { + throw SodaException("비비드넥스트와 계약한\n크리에이터에게만 후원을 하실 수 있습니다.") + } + + canPaymentService.spendCan( + memberId = member.id!!, + needCan = 1, + canUsage = CanUsage.HEART, + isSecret = false, + liveRoom = room, + container = request.container + ) + } } diff --git a/src/main/kotlin/kr/co/vividnext/sodalive/live/room/like/LiveRoomLikeHeartRequest.kt b/src/main/kotlin/kr/co/vividnext/sodalive/live/room/like/LiveRoomLikeHeartRequest.kt new file mode 100644 index 0000000..5b6f73a --- /dev/null +++ b/src/main/kotlin/kr/co/vividnext/sodalive/live/room/like/LiveRoomLikeHeartRequest.kt @@ -0,0 +1,6 @@ +package kr.co.vividnext.sodalive.live.room.like + +data class LiveRoomLikeHeartRequest( + val roomId: Long, + val container: String +)