From 8595af71739cc51f089c96568170a8b6721d2bfe Mon Sep 17 00:00:00 2001 From: Klaus Date: Wed, 29 May 2024 03:00:53 +0900 Subject: [PATCH] =?UTF-8?q?=EA=B4=80=EB=A6=AC=EC=9E=90=20-=20=EB=9D=BC?= =?UTF-8?q?=EC=9D=B4=EB=B8=8C=20=EB=A6=AC=EC=8A=A4=ED=8A=B8=20-=20?= =?UTF-8?q?=EC=B0=B8=EC=97=AC=EC=9E=90=20=EC=88=98=20=EB=8D=B0=EC=9D=B4?= =?UTF-8?q?=ED=84=B0=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../admin/live/AdminLiveController.kt | 7 +++- .../live/AdminLiveRoomQueryRepository.kt | 30 +++++++++++++- .../sodalive/admin/live/AdminLiveService.kt | 39 +++++++++---------- .../sodalive/admin/live/GetLiveResponse.kt | 5 ++- 4 files changed, 56 insertions(+), 25 deletions(-) diff --git a/src/main/kotlin/kr/co/vividnext/sodalive/admin/live/AdminLiveController.kt b/src/main/kotlin/kr/co/vividnext/sodalive/admin/live/AdminLiveController.kt index 9e040bd..b4e659e 100644 --- a/src/main/kotlin/kr/co/vividnext/sodalive/admin/live/AdminLiveController.kt +++ b/src/main/kotlin/kr/co/vividnext/sodalive/admin/live/AdminLiveController.kt @@ -21,7 +21,12 @@ class AdminLiveController(private val service: AdminLiveService) { @GetMapping @PreAuthorize("hasRole('ADMIN')") - fun getOnAirLive() = ApiResponse.ok(data = service.getLiveList()) + fun getLive(pageable: Pageable) = ApiResponse.ok( + data = service.getLiveList( + offset = pageable.offset, + limit = pageable.pageSize.toLong() + ) + ) @GetMapping("/recommend-creator") @PreAuthorize("hasRole('ADMIN')") diff --git a/src/main/kotlin/kr/co/vividnext/sodalive/admin/live/AdminLiveRoomQueryRepository.kt b/src/main/kotlin/kr/co/vividnext/sodalive/admin/live/AdminLiveRoomQueryRepository.kt index ddd2170..33fa847 100644 --- a/src/main/kotlin/kr/co/vividnext/sodalive/admin/live/AdminLiveRoomQueryRepository.kt +++ b/src/main/kotlin/kr/co/vividnext/sodalive/admin/live/AdminLiveRoomQueryRepository.kt @@ -1,5 +1,6 @@ package kr.co.vividnext.sodalive.admin.live +import com.querydsl.core.types.dsl.Expressions import com.querydsl.jpa.impl.JPAQueryFactory import kr.co.vividnext.sodalive.live.recommend.QRecommendLiveCreatorBanner.recommendLiveCreatorBanner import kr.co.vividnext.sodalive.live.recommend.RecommendLiveCreatorBanner @@ -12,15 +13,40 @@ import java.time.LocalDateTime @Repository class AdminLiveRoomQueryRepository(private val queryFactory: JPAQueryFactory) { - fun getLiveRoomList(): List { + fun getLiveRoomList(imageHost: String): List { return queryFactory - .selectFrom(liveRoom) + .select( + QGetLiveResponseItem( + liveRoom.id, + liveRoom.title, + liveRoom.notice, + Expressions.constant(0), + liveRoom.member.nickname, + liveRoom.coverImage.coalesce("profile/default-profile.png") + .prepend("/") + .prepend(imageHost), + liveRoom.channelName.coalesce(""), + liveRoom.type, + liveRoom.password, + liveRoom.isAdult + ) + ) + .from(liveRoom) .innerJoin(liveRoom.member, member) .where(liveRoom.isActive.isTrue) .orderBy(liveRoom.channelName.desc(), liveRoom.beginDateTime.asc()) .fetch() } + fun getLiveRoomTotalCount(): Int { + return queryFactory + .select(liveRoom.id) + .from(liveRoom) + .where(liveRoom.isActive.isTrue) + .fetch() + .size + } + fun getRecommendCreatorTotalCount(): Int { return queryFactory .select(recommendLiveCreatorBanner.id) diff --git a/src/main/kotlin/kr/co/vividnext/sodalive/admin/live/AdminLiveService.kt b/src/main/kotlin/kr/co/vividnext/sodalive/admin/live/AdminLiveService.kt index 962431f..f1fc065 100644 --- a/src/main/kotlin/kr/co/vividnext/sodalive/admin/live/AdminLiveService.kt +++ b/src/main/kotlin/kr/co/vividnext/sodalive/admin/live/AdminLiveService.kt @@ -20,6 +20,7 @@ import kr.co.vividnext.sodalive.live.recommend.RecommendLiveCreatorBannerReposit import kr.co.vividnext.sodalive.live.reservation.LiveReservationRepository import kr.co.vividnext.sodalive.live.room.cancel.LiveRoomCancel import kr.co.vividnext.sodalive.live.room.cancel.LiveRoomCancelRepository +import kr.co.vividnext.sodalive.live.room.info.LiveRoomInfoRedisRepository import kr.co.vividnext.sodalive.member.MemberRepository import kr.co.vividnext.sodalive.utils.generateFileName import org.springframework.beans.factory.annotation.Value @@ -36,6 +37,7 @@ import java.time.format.DateTimeFormatter @Service class AdminLiveService( private val recommendCreatorBannerRepository: RecommendLiveCreatorBannerRepository, + private val roomInfoRepository: LiveRoomInfoRedisRepository, private val roomCancelRepository: LiveRoomCancelRepository, private val repository: AdminLiveRoomQueryRepository, private val memberRepository: MemberRepository, @@ -53,28 +55,23 @@ class AdminLiveService( @Value("\${cloud.aws.cloud-front.host}") private val coverImageHost: String ) { - fun getLiveList(): GetLiveResponse { - return GetLiveResponse( - liveList = repository.getLiveRoomList() - .asSequence() - .map { - GetLiveResponseItem( - id = it.id!!, - title = it.title, - content = it.notice, - managerNickname = it.member!!.nickname, - coverImageUrl = if (it.coverImage!!.startsWith("https://")) { - it.coverImage!! - } else { - "$coverImageHost/${it.coverImage!!}" - }, - channelName = it.channelName ?: "", - type = it.type, - password = it.password, - isAdult = it.isAdult - ) + fun getLiveList(offset: Long, limit: Long): GetLiveResponse { + val totalCount = repository.getLiveRoomTotalCount() + val liveList = repository.getLiveRoomList(imageHost = coverImageHost) + .map { + if (it.channelName.isNotBlank()) { + val roomInfo = roomInfoRepository.findByIdOrNull(it.id) + it.numberOfParticipants = (roomInfo?.listenerCount ?: 0) + + (roomInfo?.speakerCount ?: 0) + + (roomInfo?.managerCount ?: 0) } - .toList() + + it + } + + return GetLiveResponse( + totalCount = totalCount, + liveList = liveList ) } diff --git a/src/main/kotlin/kr/co/vividnext/sodalive/admin/live/GetLiveResponse.kt b/src/main/kotlin/kr/co/vividnext/sodalive/admin/live/GetLiveResponse.kt index b0f76fc..031c54e 100644 --- a/src/main/kotlin/kr/co/vividnext/sodalive/admin/live/GetLiveResponse.kt +++ b/src/main/kotlin/kr/co/vividnext/sodalive/admin/live/GetLiveResponse.kt @@ -1,15 +1,18 @@ package kr.co.vividnext.sodalive.admin.live +import com.querydsl.core.annotations.QueryProjection import kr.co.vividnext.sodalive.live.room.LiveRoomType data class GetLiveResponse( + val totalCount: Int, val liveList: List ) -data class GetLiveResponseItem( +data class GetLiveResponseItem @QueryProjection constructor( val id: Long, val title: String, val content: String, + var numberOfParticipants: Int, val managerNickname: String, val coverImageUrl: String, val channelName: String, -- 2.40.1