From 6111409d660171b9615f0d685687086fa44acb14 Mon Sep 17 00:00:00 2001 From: Klaus Date: Mon, 11 Nov 2024 12:29:29 +0900 Subject: [PATCH 1/8] =?UTF-8?q?=EB=9D=BC=EC=9D=B4=EB=B8=8C=20=EB=B0=A9=20-?= =?UTF-8?q?=20=ED=9B=84=EC=9B=90=20=EB=A9=94=EC=8B=9C=EC=A7=80=20=EB=A6=AC?= =?UTF-8?q?=EC=8A=A4=ED=8A=B8=20-=20=EB=B9=84=EB=B0=80=20=ED=9B=84?= =?UTF-8?q?=EC=9B=90=20=EB=A9=94=EC=8B=9C=EC=A7=80=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/live/room/LiveRoomService.kt | 9 +++++++-- .../live/room/donation/LiveRoomDonationMessage.kt | 2 ++ .../co/vividnext/sodalive/live/room/info/LiveRoomInfo.kt | 8 ++++++-- .../sodalive/live/roulette/v2/RouletteService.kt | 1 + 4 files changed, 16 insertions(+), 4 deletions(-) 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 18addd3..6f23069 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 @@ -889,6 +889,7 @@ class LiveRoomService( ?: throw SodaException("해당하는 라이브의 정보가 없습니다.") return roomInfo.donationMessageList + .filter { !it.isSecret || it.memberId == member.id!! } } fun deleteDonationMessage(request: DeleteLiveRoomDonationMessage, member: Member) { @@ -1068,14 +1069,16 @@ class LiveRoomService( container = request.container ) - if (!request.isSecret && request.message.isNotBlank()) { + if (request.message.isNotBlank()) { val lock = getOrCreateLock(memberId = member.id!!) lock.write { val roomInfo = roomInfoRepository.findByIdOrNull(room.id!!) ?: throw SodaException("해당하는 라이브의 정보가 없습니다.") roomInfo.addDonationMessage( + memberId = member.id!!, nickname = member.nickname, + isSecret = request.isSecret, can = request.can, donationMessage = request.message ) @@ -1112,14 +1115,16 @@ class LiveRoomService( container = request.container ) - if (!request.isSecret && request.message.isNotBlank()) { + if (request.message.isNotBlank()) { val lock = getOrCreateLock(memberId = member.id!!) lock.write { val roomInfo = roomInfoRepository.findByIdOrNull(room.id!!) ?: throw SodaException("해당하는 라이브의 정보가 없습니다.") roomInfo.addDonationMessage( + memberId = member.id!!, nickname = member.nickname, + isSecret = request.isSecret, can = request.can, donationMessage = request.message ) diff --git a/src/main/kotlin/kr/co/vividnext/sodalive/live/room/donation/LiveRoomDonationMessage.kt b/src/main/kotlin/kr/co/vividnext/sodalive/live/room/donation/LiveRoomDonationMessage.kt index 52bb4a1..9088b3a 100644 --- a/src/main/kotlin/kr/co/vividnext/sodalive/live/room/donation/LiveRoomDonationMessage.kt +++ b/src/main/kotlin/kr/co/vividnext/sodalive/live/room/donation/LiveRoomDonationMessage.kt @@ -4,7 +4,9 @@ import java.util.UUID data class LiveRoomDonationMessage( val uuid: String = UUID.randomUUID().toString(), + val memberId: Long, val nickname: String, + val isSecret: Boolean, val canMessage: String, val donationMessage: String ) diff --git a/src/main/kotlin/kr/co/vividnext/sodalive/live/room/info/LiveRoomInfo.kt b/src/main/kotlin/kr/co/vividnext/sodalive/live/room/info/LiveRoomInfo.kt index 8d19de1..3ee0b47 100644 --- a/src/main/kotlin/kr/co/vividnext/sodalive/live/room/info/LiveRoomInfo.kt +++ b/src/main/kotlin/kr/co/vividnext/sodalive/live/room/info/LiveRoomInfo.kt @@ -83,11 +83,13 @@ data class LiveRoomInfo( managerCount = managerList.size } - fun addDonationMessage(nickname: String, can: Int, donationMessage: String) { + fun addDonationMessage(memberId: Long, nickname: String, isSecret: Boolean, can: Int, donationMessage: String) { val donationMessageSet = donationMessageList.toMutableSet() donationMessageSet.add( LiveRoomDonationMessage( + memberId = memberId, nickname = nickname, + isSecret = isSecret, canMessage = "${can}캔을 후원하셨습니다.", donationMessage = donationMessage ) @@ -95,11 +97,13 @@ data class LiveRoomInfo( donationMessageList = donationMessageSet.toList() } - fun addRouletteMessage(nickname: String, donationMessage: String) { + fun addRouletteMessage(memberId: Long, nickname: String, donationMessage: String) { val donationMessageSet = donationMessageList.toMutableSet() donationMessageSet.add( LiveRoomDonationMessage( + memberId = memberId, nickname = nickname, + isSecret = false, canMessage = "", donationMessage = donationMessage ) 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 7b273f4..bcd5802 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 @@ -162,6 +162,7 @@ class RouletteService( ?: throw SodaException("해당하는 라이브의 정보가 없습니다.") roomInfo.addRouletteMessage( + memberId = member.id!!, nickname = member.nickname, donationMessage = "[$result] 당첨!" ) From 297f6555f31940087e77a83e7300211364490448 Mon Sep 17 00:00:00 2001 From: Klaus Date: Mon, 11 Nov 2024 12:37:14 +0900 Subject: [PATCH 2/8] =?UTF-8?q?=EB=9D=BC=EC=9D=B4=EB=B8=8C=20=EB=B0=A9=20-?= =?UTF-8?q?=20=ED=9B=84=EC=9B=90=20=EB=A9=94=EC=8B=9C=EC=A7=80=20=EB=A6=AC?= =?UTF-8?q?=EC=8A=A4=ED=8A=B8=20-=20=EB=B0=A9=EC=9E=A5=EC=9D=80=20?= =?UTF-8?q?=EB=AA=A8=EB=93=A0=20=ED=9B=84=EC=9B=90=20=EB=A9=94=EC=8B=9C?= =?UTF-8?q?=EC=A7=80=EB=A5=BC=20=EB=B3=BC=20=EC=88=98=20=EC=9E=88=EB=8F=84?= =?UTF-8?q?=EB=A1=9D=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../sodalive/live/room/LiveRoomRepository.kt | 12 ++++++++++++ .../vividnext/sodalive/live/room/LiveRoomService.kt | 11 +++++++++-- 2 files changed, 21 insertions(+), 2 deletions(-) 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 d1fe8f2..3445f6a 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 @@ -56,6 +56,7 @@ interface LiveRoomQueryRepository { fun getRoomActiveAndChannelNameIsNotNull(memberId: Long): List fun getActiveRoomIdList(memberId: Long): Int fun getTotalHeartCount(roomId: Long): Int? + fun getLiveRoomCreatorId(roomId: Long): Long? } class LiveRoomQueryRepositoryImpl( @@ -334,4 +335,15 @@ class LiveRoomQueryRepositoryImpl( .where(where) .fetchOne() } + + override fun getLiveRoomCreatorId(roomId: Long): Long? { + return queryFactory + .select(liveRoom.member.id) + .from(liveRoom) + .where( + liveRoom.isActive.isTrue + .and(liveRoom.id.eq(roomId)) + ) + .fetchFirst() + } } 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 6f23069..4c31c80 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 @@ -885,11 +885,18 @@ class LiveRoomService( } fun getDonationMessageList(roomId: Long, member: Member): List { + val liveRoomCreatorId = repository.getLiveRoomCreatorId(roomId) + ?: throw SodaException("해당하는 라이브의 정보가 없습니다.") + val roomInfo = roomInfoRepository.findByIdOrNull(roomId) ?: throw SodaException("해당하는 라이브의 정보가 없습니다.") - return roomInfo.donationMessageList - .filter { !it.isSecret || it.memberId == member.id!! } + return if (liveRoomCreatorId != member.id!!) { + roomInfo.donationMessageList + .filter { !it.isSecret || it.memberId == member.id!! } + } else { + roomInfo.donationMessageList + } } fun deleteDonationMessage(request: DeleteLiveRoomDonationMessage, member: Member) { From 7cec01897f1bb031c442541db3bf142cec61f957 Mon Sep 17 00:00:00 2001 From: Klaus Date: Mon, 11 Nov 2024 14:02:48 +0900 Subject: [PATCH 3/8] =?UTF-8?q?=EB=9D=BC=EC=9D=B4=EB=B8=8C=20=EB=B0=A9=20-?= =?UTF-8?q?=20=ED=9B=84=EC=9B=90=20=EB=A9=94=EC=8B=9C=EC=A7=80=20=EB=A6=AC?= =?UTF-8?q?=EC=8A=A4=ED=8A=B8=20-=20=EB=B9=84=EB=B0=80=20=ED=9B=84?= =?UTF-8?q?=EC=9B=90=EA=B3=BC=20=EC=9D=BC=EB=B0=98=20=ED=9B=84=EC=9B=90=20?= =?UTF-8?q?=EB=A9=94=EC=8B=9C=EC=A7=80=20=EB=B6=84=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../kr/co/vividnext/sodalive/live/room/info/LiveRoomInfo.kt | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/main/kotlin/kr/co/vividnext/sodalive/live/room/info/LiveRoomInfo.kt b/src/main/kotlin/kr/co/vividnext/sodalive/live/room/info/LiveRoomInfo.kt index 3ee0b47..6c366d8 100644 --- a/src/main/kotlin/kr/co/vividnext/sodalive/live/room/info/LiveRoomInfo.kt +++ b/src/main/kotlin/kr/co/vividnext/sodalive/live/room/info/LiveRoomInfo.kt @@ -90,7 +90,11 @@ data class LiveRoomInfo( memberId = memberId, nickname = nickname, isSecret = isSecret, - canMessage = "${can}캔을 후원하셨습니다.", + canMessage = if (isSecret) { + "${can}캔으로 비밀미션을 보냈습니다." + } else { + "${can}캔을 후원하셨습니다." + }, donationMessage = donationMessage ) ) From f9dd3bc7e2f6b71f5736222380eacaf8d5a6756d Mon Sep 17 00:00:00 2001 From: Klaus Date: Mon, 11 Nov 2024 16:09:46 +0900 Subject: [PATCH 4/8] =?UTF-8?q?=EB=9D=BC=EC=9D=B4=EB=B8=8C=20=EB=B0=A9=20-?= =?UTF-8?q?=20=ED=98=84=EC=9E=AC=20=EB=9D=BC=EC=9D=B4=EB=B8=8C=20=ED=95=98?= =?UTF-8?q?=ED=8A=B8=20=EB=9E=AD=ED=82=B9=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 | 28 +++++++++++++++++++ .../sodalive/live/room/LiveRoomService.kt | 11 ++++++++ .../room/like/GetLiveRoomHeartListResponse.kt | 15 ++++++++++ 4 files changed, 64 insertions(+) create mode 100644 src/main/kotlin/kr/co/vividnext/sodalive/live/room/like/GetLiveRoomHeartListResponse.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 ebbd3a9..6874e68 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 @@ -283,4 +283,14 @@ class LiveRoomController( ApiResponse.ok(service.getTotalHeartCount(roomId)) } + + @GetMapping("/{id}/heart-list") + fun heartList( + @PathVariable("id") roomId: Long, + @AuthenticationPrincipal(expression = "#this == 'anonymousUser' ? null : member") member: Member? + ) = run { + if (member == null) throw SodaException("로그인 정보를 확인해주세요.") + + ApiResponse.ok(service.getHeartList(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 3445f6a..8bc3ec9 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 @@ -12,6 +12,8 @@ import kr.co.vividnext.sodalive.live.room.QLiveRoom.liveRoom import kr.co.vividnext.sodalive.live.room.QQuarterLiveRankings.quarterLiveRankings import kr.co.vividnext.sodalive.live.room.donation.GetLiveRoomDonationItem import kr.co.vividnext.sodalive.live.room.donation.QGetLiveRoomDonationItem +import kr.co.vividnext.sodalive.live.room.like.GetLiveRoomHeartListItem +import kr.co.vividnext.sodalive.live.room.like.QGetLiveRoomHeartListItem import kr.co.vividnext.sodalive.member.QMember.member import org.springframework.beans.factory.annotation.Value import org.springframework.data.jpa.repository.JpaRepository @@ -57,6 +59,7 @@ interface LiveRoomQueryRepository { fun getActiveRoomIdList(memberId: Long): Int fun getTotalHeartCount(roomId: Long): Int? fun getLiveRoomCreatorId(roomId: Long): Long? + fun getHeartList(roomId: Long): List } class LiveRoomQueryRepositoryImpl( @@ -346,4 +349,29 @@ class LiveRoomQueryRepositoryImpl( ) .fetchFirst() } + + override fun getHeartList(roomId: Long): List { + val where = liveRoom.id.eq(roomId) + .and(useCan.canUsage.eq(CanUsage.HEART)) + .and(useCan.isRefund.isFalse) + + return queryFactory + .select( + QGetLiveRoomHeartListItem( + member.profileImage + .coalesce("profile/default-profile.png") + .prepend("/") + .prepend(cloudFrontHost), + member.nickname, + useCan.can.add(useCan.rewardCan) + ) + ) + .from(useCan) + .innerJoin(useCan.room, liveRoom) + .innerJoin(useCan.member, member) + .groupBy(useCan.member.id) + .where(where) + .orderBy(useCan.can.add(useCan.rewardCan).sum().desc()) + .fetch() + } } 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 4c31c80..37ecf7b 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.GetLiveRoomHeartListResponse 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 @@ -1269,4 +1270,14 @@ class LiveRoomService( fun getTotalHeartCount(roomId: Long): GetLiveRoomHeartTotalResponse { return GetLiveRoomHeartTotalResponse(totalHeartCount = repository.getTotalHeartCount(roomId = roomId) ?: 0) } + + fun getHeartList(roomId: Long): GetLiveRoomHeartListResponse { + val heartList = repository.getHeartList(roomId = roomId) + + return GetLiveRoomHeartListResponse( + heartList = heartList, + totalCount = heartList.size, + totalHeart = heartList.sumOf { it.heart } + ) + } } diff --git a/src/main/kotlin/kr/co/vividnext/sodalive/live/room/like/GetLiveRoomHeartListResponse.kt b/src/main/kotlin/kr/co/vividnext/sodalive/live/room/like/GetLiveRoomHeartListResponse.kt new file mode 100644 index 0000000..882df29 --- /dev/null +++ b/src/main/kotlin/kr/co/vividnext/sodalive/live/room/like/GetLiveRoomHeartListResponse.kt @@ -0,0 +1,15 @@ +package kr.co.vividnext.sodalive.live.room.like + +import com.querydsl.core.annotations.QueryProjection + +data class GetLiveRoomHeartListResponse( + val heartList: List, + val totalCount: Int, + val totalHeart: Int +) + +data class GetLiveRoomHeartListItem @QueryProjection constructor( + val profileImage: String, + val nickname: String, + val heart: Int +) From 82b07897f8084aeff9c26b30e400e2d9a7604b84 Mon Sep 17 00:00:00 2001 From: Klaus Date: Mon, 11 Nov 2024 20:29:48 +0900 Subject: [PATCH 5/8] =?UTF-8?q?=EB=9D=BC=EC=9D=B4=EB=B8=8C=20=EB=B0=A9=20-?= =?UTF-8?q?=20=ED=98=84=EC=9E=AC=20=EB=9D=BC=EC=9D=B4=EB=B8=8C=20=ED=95=98?= =?UTF-8?q?=ED=8A=B8=20=EB=9E=AD=ED=82=B9=20API=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/live/room/LiveRoomController.kt | 1 - 1 file changed, 1 deletion(-) 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 6874e68..bf975f2 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 @@ -290,7 +290,6 @@ class LiveRoomController( @AuthenticationPrincipal(expression = "#this == 'anonymousUser' ? null : member") member: Member? ) = run { if (member == null) throw SodaException("로그인 정보를 확인해주세요.") - ApiResponse.ok(service.getHeartList(roomId)) } } From adf181f79086cf7ecd13cb390630e22d7bd1f158 Mon Sep 17 00:00:00 2001 From: Klaus Date: Mon, 11 Nov 2024 20:49:48 +0900 Subject: [PATCH 6/8] =?UTF-8?q?=EB=9D=BC=EC=9D=B4=EB=B8=8C=20=EB=B0=A9=20-?= =?UTF-8?q?=20=ED=98=84=EC=9E=AC=20=EB=9D=BC=EC=9D=B4=EB=B8=8C=20=ED=95=98?= =?UTF-8?q?=ED=8A=B8=20=EB=9E=AD=ED=82=B9=20API=20404=EB=82=98=EC=99=80?= =?UTF-8?q?=EC=84=9C=20=EC=9E=84=EC=8B=9C=20=EC=A0=9C=EA=B1=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../sodalive/live/room/LiveRoomController.kt | 9 ------ .../sodalive/live/room/LiveRoomRepository.kt | 28 ------------------- .../sodalive/live/room/LiveRoomService.kt | 11 -------- 3 files changed, 48 deletions(-) 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 bf975f2..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 @@ -283,13 +283,4 @@ class LiveRoomController( ApiResponse.ok(service.getTotalHeartCount(roomId)) } - - @GetMapping("/{id}/heart-list") - fun heartList( - @PathVariable("id") roomId: Long, - @AuthenticationPrincipal(expression = "#this == 'anonymousUser' ? null : member") member: Member? - ) = run { - if (member == null) throw SodaException("로그인 정보를 확인해주세요.") - ApiResponse.ok(service.getHeartList(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 8bc3ec9..3445f6a 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 @@ -12,8 +12,6 @@ import kr.co.vividnext.sodalive.live.room.QLiveRoom.liveRoom import kr.co.vividnext.sodalive.live.room.QQuarterLiveRankings.quarterLiveRankings import kr.co.vividnext.sodalive.live.room.donation.GetLiveRoomDonationItem import kr.co.vividnext.sodalive.live.room.donation.QGetLiveRoomDonationItem -import kr.co.vividnext.sodalive.live.room.like.GetLiveRoomHeartListItem -import kr.co.vividnext.sodalive.live.room.like.QGetLiveRoomHeartListItem import kr.co.vividnext.sodalive.member.QMember.member import org.springframework.beans.factory.annotation.Value import org.springframework.data.jpa.repository.JpaRepository @@ -59,7 +57,6 @@ interface LiveRoomQueryRepository { fun getActiveRoomIdList(memberId: Long): Int fun getTotalHeartCount(roomId: Long): Int? fun getLiveRoomCreatorId(roomId: Long): Long? - fun getHeartList(roomId: Long): List } class LiveRoomQueryRepositoryImpl( @@ -349,29 +346,4 @@ class LiveRoomQueryRepositoryImpl( ) .fetchFirst() } - - override fun getHeartList(roomId: Long): List { - val where = liveRoom.id.eq(roomId) - .and(useCan.canUsage.eq(CanUsage.HEART)) - .and(useCan.isRefund.isFalse) - - return queryFactory - .select( - QGetLiveRoomHeartListItem( - member.profileImage - .coalesce("profile/default-profile.png") - .prepend("/") - .prepend(cloudFrontHost), - member.nickname, - useCan.can.add(useCan.rewardCan) - ) - ) - .from(useCan) - .innerJoin(useCan.room, liveRoom) - .innerJoin(useCan.member, member) - .groupBy(useCan.member.id) - .where(where) - .orderBy(useCan.can.add(useCan.rewardCan).sum().desc()) - .fetch() - } } 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 37ecf7b..4c31c80 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,7 +39,6 @@ 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.GetLiveRoomHeartListResponse 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 @@ -1270,14 +1269,4 @@ class LiveRoomService( fun getTotalHeartCount(roomId: Long): GetLiveRoomHeartTotalResponse { return GetLiveRoomHeartTotalResponse(totalHeartCount = repository.getTotalHeartCount(roomId = roomId) ?: 0) } - - fun getHeartList(roomId: Long): GetLiveRoomHeartListResponse { - val heartList = repository.getHeartList(roomId = roomId) - - return GetLiveRoomHeartListResponse( - heartList = heartList, - totalCount = heartList.size, - totalHeart = heartList.sumOf { it.heart } - ) - } } From 19dc676c36a4f24cf3babb59e3c2c1b0a2ce18d2 Mon Sep 17 00:00:00 2001 From: Klaus Date: Mon, 11 Nov 2024 21:07:02 +0900 Subject: [PATCH 7/8] =?UTF-8?q?=EB=9D=BC=EC=9D=B4=EB=B8=8C=20=EB=B0=A9=20-?= =?UTF-8?q?=20=ED=98=84=EC=9E=AC=20=EB=9D=BC=EC=9D=B4=EB=B8=8C=20=ED=95=98?= =?UTF-8?q?=ED=8A=B8=20=EB=9E=AD=ED=82=B9=20API?= 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 | 28 +++++++++++++++++++ .../sodalive/live/room/LiveRoomService.kt | 11 ++++++++ 3 files changed, 49 insertions(+) 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 ebbd3a9..6874e68 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 @@ -283,4 +283,14 @@ class LiveRoomController( ApiResponse.ok(service.getTotalHeartCount(roomId)) } + + @GetMapping("/{id}/heart-list") + fun heartList( + @PathVariable("id") roomId: Long, + @AuthenticationPrincipal(expression = "#this == 'anonymousUser' ? null : member") member: Member? + ) = run { + if (member == null) throw SodaException("로그인 정보를 확인해주세요.") + + ApiResponse.ok(service.getHeartList(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 3445f6a..8bc3ec9 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 @@ -12,6 +12,8 @@ import kr.co.vividnext.sodalive.live.room.QLiveRoom.liveRoom import kr.co.vividnext.sodalive.live.room.QQuarterLiveRankings.quarterLiveRankings import kr.co.vividnext.sodalive.live.room.donation.GetLiveRoomDonationItem import kr.co.vividnext.sodalive.live.room.donation.QGetLiveRoomDonationItem +import kr.co.vividnext.sodalive.live.room.like.GetLiveRoomHeartListItem +import kr.co.vividnext.sodalive.live.room.like.QGetLiveRoomHeartListItem import kr.co.vividnext.sodalive.member.QMember.member import org.springframework.beans.factory.annotation.Value import org.springframework.data.jpa.repository.JpaRepository @@ -57,6 +59,7 @@ interface LiveRoomQueryRepository { fun getActiveRoomIdList(memberId: Long): Int fun getTotalHeartCount(roomId: Long): Int? fun getLiveRoomCreatorId(roomId: Long): Long? + fun getHeartList(roomId: Long): List } class LiveRoomQueryRepositoryImpl( @@ -346,4 +349,29 @@ class LiveRoomQueryRepositoryImpl( ) .fetchFirst() } + + override fun getHeartList(roomId: Long): List { + val where = liveRoom.id.eq(roomId) + .and(useCan.canUsage.eq(CanUsage.HEART)) + .and(useCan.isRefund.isFalse) + + return queryFactory + .select( + QGetLiveRoomHeartListItem( + member.profileImage + .coalesce("profile/default-profile.png") + .prepend("/") + .prepend(cloudFrontHost), + member.nickname, + useCan.can.add(useCan.rewardCan) + ) + ) + .from(useCan) + .innerJoin(useCan.room, liveRoom) + .innerJoin(useCan.member, member) + .groupBy(useCan.member.id) + .where(where) + .orderBy(useCan.can.add(useCan.rewardCan).sum().desc()) + .fetch() + } } 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 4c31c80..37ecf7b 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.GetLiveRoomHeartListResponse 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 @@ -1269,4 +1270,14 @@ class LiveRoomService( fun getTotalHeartCount(roomId: Long): GetLiveRoomHeartTotalResponse { return GetLiveRoomHeartTotalResponse(totalHeartCount = repository.getTotalHeartCount(roomId = roomId) ?: 0) } + + fun getHeartList(roomId: Long): GetLiveRoomHeartListResponse { + val heartList = repository.getHeartList(roomId = roomId) + + return GetLiveRoomHeartListResponse( + heartList = heartList, + totalCount = heartList.size, + totalHeart = heartList.sumOf { it.heart } + ) + } } From f134bc459939a1a964d369883918a173ef8ce44c Mon Sep 17 00:00:00 2001 From: Klaus Date: Tue, 12 Nov 2024 00:05:40 +0900 Subject: [PATCH 8/8] =?UTF-8?q?=EB=9D=BC=EC=9D=B4=EB=B8=8C=20=EB=B0=A9=20-?= =?UTF-8?q?=20=ED=98=84=EC=9E=AC=20=EB=9D=BC=EC=9D=B4=EB=B8=8C=20=ED=95=98?= =?UTF-8?q?=ED=8A=B8=20=EB=9E=AD=ED=82=B9=20API?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../kr/co/vividnext/sodalive/live/room/LiveRoomRepository.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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 8bc3ec9..e06153b 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 @@ -363,7 +363,7 @@ class LiveRoomQueryRepositoryImpl( .prepend("/") .prepend(cloudFrontHost), member.nickname, - useCan.can.add(useCan.rewardCan) + useCan.can.add(useCan.rewardCan).sum() ) ) .from(useCan)