From c8c081b3fd04f0820a41ae350b5d9eba5c5d7d3f Mon Sep 17 00:00:00 2001 From: Klaus Date: Wed, 16 Oct 2024 17:32:50 +0900 Subject: [PATCH 1/6] =?UTF-8?q?=EB=9D=BC=EC=9D=B4=EB=B8=8C=20=EB=B0=A9=20-?= =?UTF-8?q?=20=ED=95=98=ED=8A=B8=20=ED=9B=84=EC=9B=90=20=EA=B8=B0=EB=8A=A5?= =?UTF-8?q?=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../co/vividnext/sodalive/can/CanService.kt | 2 +- .../co/vividnext/sodalive/can/use/CanUsage.kt | 1 + .../sodalive/live/room/LiveRoomController.kt | 11 ++++++++++ .../sodalive/live/room/LiveRoomService.kt | 22 +++++++++++++++++++ .../room/like/LiveRoomLikeHeartRequest.kt | 6 +++++ 5 files changed, 41 insertions(+), 1 deletion(-) create mode 100644 src/main/kotlin/kr/co/vividnext/sodalive/live/room/like/LiveRoomLikeHeartRequest.kt 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 +) From ba0151bca044f5fea67f76cf75dc2da2f34a9d5f Mon Sep 17 00:00:00 2001 From: Klaus Date: Wed, 16 Oct 2024 17:50:39 +0900 Subject: [PATCH 2/6] =?UTF-8?q?=EB=9D=BC=EC=9D=B4=EB=B8=8C=20=EB=B0=A9=20-?= =?UTF-8?q?=20=ED=95=98=ED=8A=B8=20=ED=9B=84=EC=9B=90=20=EA=B8=B0=EB=8A=A5?= =?UTF-8?q?=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../kr/co/vividnext/sodalive/can/payment/CanPaymentService.kt | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/main/kotlin/kr/co/vividnext/sodalive/can/payment/CanPaymentService.kt b/src/main/kotlin/kr/co/vividnext/sodalive/can/payment/CanPaymentService.kt index 14479c8..c50f823 100644 --- a/src/main/kotlin/kr/co/vividnext/sodalive/can/payment/CanPaymentService.kt +++ b/src/main/kotlin/kr/co/vividnext/sodalive/can/payment/CanPaymentService.kt @@ -100,6 +100,10 @@ class CanPaymentService( useCan.member = member } else if (canUsage == CanUsage.ALARM_SLOT) { useCan.member = member + } else if (canUsage == CanUsage.HEART && liveRoom != null) { + recipientId = liveRoom.member!!.id!! + useCan.room = liveRoom + useCan.member = member } else { throw SodaException("잘못된 요청입니다.") } From 98b337c5eef082c3396974e469c057d470ce9b11 Mon Sep 17 00:00:00 2001 From: Klaus Date: Wed, 16 Oct 2024 18:21:54 +0900 Subject: [PATCH 3/6] =?UTF-8?q?=EB=9D=BC=EC=9D=B4=EB=B8=8C=20=EB=B0=A9=20-?= =?UTF-8?q?=20=ED=95=98=ED=8A=B8=20=ED=9B=84=EC=9B=90=20=ED=95=A9=EA=B3=84?= =?UTF-8?q?=20=EC=A1=B0=ED=9A=8C=20API=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../sodalive/live/room/LiveRoomController.kt | 10 ++++++++++ .../sodalive/live/room/LiveRoomRepository.kt | 15 +++++++++++++++ .../sodalive/live/room/LiveRoomService.kt | 5 +++++ .../room/like/GetLiveRoomHeartTotalResponse.kt | 5 +++++ 4 files changed, 35 insertions(+) create mode 100644 src/main/kotlin/kr/co/vividnext/sodalive/live/room/like/GetLiveRoomHeartTotalResponse.kt 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 a6e84fd..ebbd3a9 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 @@ -273,4 +273,14 @@ class LiveRoomController( ApiResponse.ok(service.likeHeart(request, member)) } + + @GetMapping("/{id}/heart-total") + fun getTotalHeartCount( + @PathVariable("id") roomId: Long, + @AuthenticationPrincipal(expression = "#this == 'anonymousUser' ? null : member") member: Member? + ) = run { + if (member == null) throw SodaException("로그인 정보를 확인해주세요.") + + ApiResponse.ok(service.getTotalHeartCount(roomId)) + } } diff --git a/src/main/kotlin/kr/co/vividnext/sodalive/live/room/LiveRoomRepository.kt b/src/main/kotlin/kr/co/vividnext/sodalive/live/room/LiveRoomRepository.kt index 6d2eb3d..7348403 100644 --- a/src/main/kotlin/kr/co/vividnext/sodalive/live/room/LiveRoomRepository.kt +++ b/src/main/kotlin/kr/co/vividnext/sodalive/live/room/LiveRoomRepository.kt @@ -53,6 +53,7 @@ interface LiveRoomQueryRepository { fun getDonationList(roomId: Long, isLiveCreator: Boolean): List fun getRoomActiveAndChannelNameIsNotNull(memberId: Long): List fun getActiveRoomIdList(memberId: Long): Int + fun getTotalHeartCount(roomId: Long): Int? } class LiveRoomQueryRepositoryImpl( @@ -297,4 +298,18 @@ class LiveRoomQueryRepositoryImpl( .fetch() .size } + + override fun getTotalHeartCount(roomId: Long): Int? { + val where = liveRoom.id.eq(roomId) + .and(useCan.canUsage.eq(CanUsage.HEART)) + .and(useCan.isRefund.isFalse) + + return queryFactory + .select(useCanCalculate.can.sum()) + .from(useCanCalculate) + .innerJoin(useCanCalculate.useCan, useCan) + .innerJoin(useCan.room, liveRoom) + .where(where) + .fetchOne() + } } 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 e78fafb..8d4fcf0 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.GetLiveRoomHeartTotalResponse 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 @@ -1243,4 +1244,8 @@ class LiveRoomService( container = request.container ) } + + fun getTotalHeartCount(roomId: Long): GetLiveRoomHeartTotalResponse { + return GetLiveRoomHeartTotalResponse(totalHeartCount = repository.getTotalHeartCount(roomId = roomId) ?: 0) + } } diff --git a/src/main/kotlin/kr/co/vividnext/sodalive/live/room/like/GetLiveRoomHeartTotalResponse.kt b/src/main/kotlin/kr/co/vividnext/sodalive/live/room/like/GetLiveRoomHeartTotalResponse.kt new file mode 100644 index 0000000..b3dbc9d --- /dev/null +++ b/src/main/kotlin/kr/co/vividnext/sodalive/live/room/like/GetLiveRoomHeartTotalResponse.kt @@ -0,0 +1,5 @@ +package kr.co.vividnext.sodalive.live.room.like + +data class GetLiveRoomHeartTotalResponse( + val totalHeartCount: Int +) From dcf0637420d25bf8652316a273353ecaa10585ad Mon Sep 17 00:00:00 2001 From: Klaus Date: Tue, 22 Oct 2024 22:04:50 +0900 Subject: [PATCH 4/6] =?UTF-8?q?=EB=9D=BC=EC=9D=B4=EB=B8=8C=20=EB=B0=A9=20?= =?UTF-8?q?=EB=A3=B0=EB=A0=9B=20=EC=97=85=EB=8D=B0=EC=9D=B4=ED=8A=B8=20-?= =?UTF-8?q?=20=EB=A3=B0=EB=A0=9B=EC=9D=84=20=EB=AA=A8=EB=91=90=20=EB=B9=84?= =?UTF-8?q?=ED=99=9C=EC=84=B1=ED=99=94=20=ED=96=88=EB=8D=94=EB=9D=BC?= =?UTF-8?q?=EB=8F=84=20=EB=A3=B0=EB=A0=9B=EC=9D=B4=20=ED=99=9C=EC=84=B1?= =?UTF-8?q?=ED=99=94=20=EB=90=9C=20=EA=B2=83=EC=9C=BC=EB=A1=9C=20=EB=B0=98?= =?UTF-8?q?=ED=99=98=ED=95=98=EB=8D=98=20=EB=B2=84=EA=B7=B8=20=EC=88=98?= =?UTF-8?q?=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../sodalive/live/roulette/v2/RouletteService.kt | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) 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 index 6529381..3e3637f 100644 --- 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 @@ -93,15 +93,17 @@ class RouletteService( var activeRoulette = false rouletteList.forEach { - if (request.isActive || it.isActive) { - activeRoulette = true - } - if (it.id == request.id) { it.can = request.can it.items = request.items it.isActive = request.isActive repository.save(it) + } else { + if ( + !activeRoulette && (request.isActive || it.isActive) + ) { + activeRoulette = true + } } } From fa99c296a5aa9a07a164485918e16ce9df71373b Mon Sep 17 00:00:00 2001 From: Klaus Date: Tue, 22 Oct 2024 22:37:37 +0900 Subject: [PATCH 5/6] =?UTF-8?q?(=ED=81=AC=EB=A6=AC=EC=97=90=EC=9D=B4?= =?UTF-8?q?=ED=84=B0)=20=EA=B4=80=EB=A6=AC=EC=9E=90=20=EB=9D=BC=EC=9D=B4?= =?UTF-8?q?=EB=B8=8C=20=EC=A0=95=EC=82=B0=20-=20=EC=BA=94=20=EC=82=AC?= =?UTF-8?q?=EC=9A=A9=20=EA=B5=AC=EB=B6=84=EC=97=90=20"=ED=95=98=ED=8A=B8"?= =?UTF-8?q?=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../sodalive/admin/calculate/GetCalculateLiveQueryData.kt | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/main/kotlin/kr/co/vividnext/sodalive/admin/calculate/GetCalculateLiveQueryData.kt b/src/main/kotlin/kr/co/vividnext/sodalive/admin/calculate/GetCalculateLiveQueryData.kt index 41b6515..f23d21a 100644 --- a/src/main/kotlin/kr/co/vividnext/sodalive/admin/calculate/GetCalculateLiveQueryData.kt +++ b/src/main/kotlin/kr/co/vividnext/sodalive/admin/calculate/GetCalculateLiveQueryData.kt @@ -31,6 +31,10 @@ data class GetCalculateLiveQueryData @QueryProjection constructor( "룰렛" } + CanUsage.HEART -> { + "하트" + } + else -> { "후원" } From 91a8aa0afe8305580199fe1d7594883aeb5b443b Mon Sep 17 00:00:00 2001 From: Klaus Date: Wed, 23 Oct 2024 01:06:21 +0900 Subject: [PATCH 6/6] =?UTF-8?q?=EB=9D=BC=EC=9D=B4=EB=B8=8C=20=EB=B0=A9=20?= =?UTF-8?q?=EB=A3=B0=EB=A0=9B=20=EC=97=85=EB=8D=B0=EC=9D=B4=ED=8A=B8=20-?= =?UTF-8?q?=20=EB=A3=B0=EB=A0=9B=EC=9D=84=20=EB=AA=A8=EB=91=90=20=EB=B9=84?= =?UTF-8?q?=ED=99=9C=EC=84=B1=ED=99=94=20=ED=96=88=EB=8D=94=EB=9D=BC?= =?UTF-8?q?=EB=8F=84=20=EB=A3=B0=EB=A0=9B=EC=9D=B4=20=ED=99=9C=EC=84=B1?= =?UTF-8?q?=ED=99=94=20=EB=90=9C=20=EA=B2=83=EC=9C=BC=EB=A1=9C=20=EB=B0=98?= =?UTF-8?q?=ED=99=98=ED=95=98=EB=8D=98=20=EB=B2=84=EA=B7=B8=20=EC=88=98?= =?UTF-8?q?=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../co/vividnext/sodalive/live/roulette/v2/RouletteService.kt | 2 ++ 1 file changed, 2 insertions(+) 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 index 3e3637f..7b273f4 100644 --- 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 @@ -98,6 +98,8 @@ class RouletteService( it.items = request.items it.isActive = request.isActive repository.save(it) + + activeRoulette = request.isActive } else { if ( !activeRoulette && (request.isActive || it.isActive)