From f9dd3bc7e2f6b71f5736222380eacaf8d5a6756d Mon Sep 17 00:00:00 2001 From: Klaus Date: Mon, 11 Nov 2024 16:09:46 +0900 Subject: [PATCH] =?UTF-8?q?=EB=9D=BC=EC=9D=B4=EB=B8=8C=20=EB=B0=A9=20-=20?= =?UTF-8?q?=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 +)