From a3aad9d2c93209a5da70900226e6e1b23f2dfb4a Mon Sep 17 00:00:00 2001 From: Klaus Date: Fri, 18 Jul 2025 14:15:03 +0900 Subject: [PATCH] =?UTF-8?q?feat:=20=EC=B5=9C=EA=B7=BC=20=EC=A2=85=EB=A3=8C?= =?UTF-8?q?=ED=95=9C=20=EB=9D=BC=EC=9D=B4=EB=B8=8C=2020=EA=B0=9C=20?= =?UTF-8?q?=EA=B0=80=EC=A0=B8=EC=98=A4=EB=8A=94=20API=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../live/room/GetLatestFinishedLiveResponse.kt | 9 +++++++++ .../sodalive/live/room/LiveRoomController.kt | 3 +++ .../sodalive/live/room/LiveRoomRepository.kt | 15 +++++++++++++++ .../sodalive/live/room/LiveRoomService.kt | 14 ++++++++++++++ 4 files changed, 41 insertions(+) create mode 100644 src/main/kotlin/kr/co/vividnext/sodalive/live/room/GetLatestFinishedLiveResponse.kt diff --git a/src/main/kotlin/kr/co/vividnext/sodalive/live/room/GetLatestFinishedLiveResponse.kt b/src/main/kotlin/kr/co/vividnext/sodalive/live/room/GetLatestFinishedLiveResponse.kt new file mode 100644 index 0000000..57f61cf --- /dev/null +++ b/src/main/kotlin/kr/co/vividnext/sodalive/live/room/GetLatestFinishedLiveResponse.kt @@ -0,0 +1,9 @@ +package kr.co.vividnext.sodalive.live.room + +data class GetLatestFinishedLiveResponse( + val memberId: Long, + val nickname: String, + val profileImageUrl: String, + val title: String, + val timeAgo: String +) 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 5389795..c39ed1a 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 @@ -291,4 +291,7 @@ class LiveRoomController( ApiResponse.ok(service.getHeartList(roomId)) } + + @GetMapping("/latest-finished-live") + fun getLatestFinishedLive() = run { ApiResponse.ok(service.getLatestFinishedLive()) } } 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 a648fe2..d92f181 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 @@ -60,6 +60,7 @@ interface LiveRoomQueryRepository { fun getTotalHeartCount(roomId: Long): Int? fun getLiveRoomCreatorId(roomId: Long): Long? fun getHeartList(roomId: Long): List + fun getLatestFinishedLive(): List } class LiveRoomQueryRepositoryImpl( @@ -380,4 +381,18 @@ class LiveRoomQueryRepositoryImpl( .orderBy(useCan.can.add(useCan.rewardCan).sum().desc()) .fetch() } + + override fun getLatestFinishedLive(): List { + return queryFactory + .selectFrom(liveRoom) + .innerJoin(liveRoom.member, member) + .where( + liveRoom.isActive.isFalse + .and(liveRoom.channelName.isNotNull) + ) + .groupBy(liveRoom.member.id) + .orderBy(liveRoom.updatedAt.max().desc()) + .limit(20) + .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 fd7e628..e5a88cc 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 @@ -19,6 +19,7 @@ import kr.co.vividnext.sodalive.can.use.UseCanCalculateStatus import kr.co.vividnext.sodalive.common.SodaException import kr.co.vividnext.sodalive.explorer.ExplorerQueryRepository import kr.co.vividnext.sodalive.extensions.convertLocalDateTime +import kr.co.vividnext.sodalive.extensions.getTimeAgoString import kr.co.vividnext.sodalive.fcm.FcmEvent import kr.co.vividnext.sodalive.fcm.FcmEventType import kr.co.vividnext.sodalive.live.reservation.LiveReservationRepository @@ -1296,4 +1297,17 @@ class LiveRoomService( totalHeart = heartList.sumOf { it.heart } ) } + + fun getLatestFinishedLive(): List { + return repository.getLatestFinishedLive() + .map { + GetLatestFinishedLiveResponse( + memberId = it.member!!.id!!, + nickname = it.member!!.nickname, + profileImageUrl = "$cloudFrontHost/${it.member!!.profileImage}", + title = it.title, + timeAgo = it.updatedAt!!.getTimeAgoString() + ) + } + } }