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 7348403..c87176b 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 @@ -2,6 +2,7 @@ package kr.co.vividnext.sodalive.live.room import com.querydsl.core.types.Projections import com.querydsl.core.types.dsl.CaseBuilder +import com.querydsl.core.types.dsl.Expressions import com.querydsl.jpa.impl.JPAQueryFactory import kr.co.vividnext.sodalive.can.use.CanUsage import kr.co.vividnext.sodalive.can.use.QUseCan.useCan @@ -49,7 +50,7 @@ interface LiveRoomQueryRepository { fun getLiveRoom(id: Long): LiveRoom? fun getLiveRoomAndAccountId(roomId: Long, memberId: Long): LiveRoom? fun getRecentRoomInfo(memberId: Long): GetRecentRoomInfoResponse? - fun getDonationTotal(roomId: Long, isLiveCreator: Boolean): Int? + fun getDonationTotal(roomId: Long): Int? fun getDonationList(roomId: Long, isLiveCreator: Boolean): List fun getRoomActiveAndChannelNameIsNotNull(memberId: Long): List fun getActiveRoomIdList(memberId: Long): Int @@ -227,14 +228,11 @@ class LiveRoomQueryRepositoryImpl( .fetchFirst() } - override fun getDonationTotal(roomId: Long, isLiveCreator: Boolean): Int? { - var where = liveRoom.id.eq(roomId) + override fun getDonationTotal(roomId: Long): Int? { + val where = liveRoom.id.eq(roomId) .and(useCan.canUsage.eq(CanUsage.DONATION).or(useCan.canUsage.eq(CanUsage.SPIN_ROULETTE))) .and(useCan.isRefund.isFalse) - - if (!isLiveCreator) { - where = where.and(useCan.isSecret.isFalse) - } + .and(useCan.isSecret.isFalse) return queryFactory .select(useCanCalculate.can.sum()) @@ -246,14 +244,10 @@ class LiveRoomQueryRepositoryImpl( } override fun getDonationList(roomId: Long, isLiveCreator: Boolean): List { - var where = liveRoom.id.eq(roomId) + val where = liveRoom.id.eq(roomId) .and(useCan.canUsage.eq(CanUsage.DONATION).or(useCan.canUsage.eq(CanUsage.SPIN_ROULETTE))) .and(useCan.isRefund.isFalse) - if (!isLiveCreator) { - where = where.and(useCan.isSecret.isFalse) - } - return queryFactory .select( QGetLiveRoomDonationItem( @@ -263,13 +257,31 @@ class LiveRoomQueryRepositoryImpl( .prepend(cloudFrontHost), member.nickname, member.id.coalesce(0), - useCan.can.sum().add(useCan.rewardCan.sum()) + Expressions.asNumber( + CaseBuilder() + .`when`(useCan.isSecret.isFalse) + .then(useCan.can.add(useCan.rewardCan)) + .otherwise(0) + ).sum(), + Expressions.asNumber( + CaseBuilder() + .`when`(Expressions.asBoolean(isLiveCreator).isTrue) + .then( + Expressions.asNumber( + CaseBuilder() + .`when`(useCan.isSecret.isTrue) + .then(useCan.can.add(useCan.rewardCan)) + .otherwise(0) + ).sum() + ) + .otherwise(0) + ) ) ) .from(useCan) .innerJoin(useCan.room, liveRoom) .join(useCan.member, member) - .groupBy(useCan.member) + .groupBy(useCan.member.id) .where(where) .orderBy(useCan.can.sum().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 8d4fcf0..a5211fd 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 @@ -973,11 +973,8 @@ class LiveRoomService( } fun getDonationTotal(roomId: Long, memberId: Long): GetLiveRoomDonationTotalResponse { - val room = repository.getLiveRoom(roomId) - ?: return GetLiveRoomDonationTotalResponse(0) - val isLiveCreator = room.member!!.id == memberId return GetLiveRoomDonationTotalResponse( - totalDonationCan = repository.getDonationTotal(roomId = roomId, isLiveCreator = isLiveCreator) ?: 0 + totalDonationCan = repository.getDonationTotal(roomId = roomId) ?: 0 ) } @@ -1180,12 +1177,15 @@ class LiveRoomService( val room = repository.getLiveRoom(roomId) ?: throw SodaException("잘못된 요청입니다.") val isLiveCreator = room.member!!.id == memberId val donationList = repository.getDonationList(roomId = room.id!!, isLiveCreator = isLiveCreator) + .filter { it.secretCan > 0 || it.can > 0 } val totalCan = donationList.sumOf { it.can } + val totalSecretCan = donationList.sumOf { it.secretCan } return GetLiveRoomDonationStatusResponse( donationList = donationList, totalCount = donationList.size, - totalCan = totalCan + totalCan = totalCan, + totalSecretCan = totalSecretCan ) } diff --git a/src/main/kotlin/kr/co/vividnext/sodalive/live/room/donation/GetLiveRoomDonationStatusResponse.kt b/src/main/kotlin/kr/co/vividnext/sodalive/live/room/donation/GetLiveRoomDonationStatusResponse.kt index 2cc8a12..cb25eb0 100644 --- a/src/main/kotlin/kr/co/vividnext/sodalive/live/room/donation/GetLiveRoomDonationStatusResponse.kt +++ b/src/main/kotlin/kr/co/vividnext/sodalive/live/room/donation/GetLiveRoomDonationStatusResponse.kt @@ -5,12 +5,14 @@ import com.querydsl.core.annotations.QueryProjection data class GetLiveRoomDonationStatusResponse( val donationList: List, val totalCount: Int, - val totalCan: Int + val totalCan: Int, + val totalSecretCan: Int ) data class GetLiveRoomDonationItem @QueryProjection constructor( val profileImage: String, val nickname: String, val userId: Long, - val can: Int + val can: Int, + val secretCan: Int )