From 7696f06fbd60277a9efb5ad704ada810067aad7c Mon Sep 17 00:00:00 2001
From: Klaus <klaus@vividnext.co.kr>
Date: Sun, 6 Aug 2023 22:50:57 +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=20API?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 .../admin/live/AdminLiveController.kt         | 15 ++++++++
 .../live/AdminLiveRoomQueryRepository.kt      | 19 ++++++++++
 .../sodalive/admin/live/AdminLiveService.kt   | 37 +++++++++++++++++++
 .../sodalive/admin/live/GetLiveResponse.kt    | 19 ++++++++++
 4 files changed, 90 insertions(+)
 create mode 100644 src/main/kotlin/kr/co/vividnext/sodalive/admin/live/AdminLiveController.kt
 create mode 100644 src/main/kotlin/kr/co/vividnext/sodalive/admin/live/AdminLiveRoomQueryRepository.kt
 create mode 100644 src/main/kotlin/kr/co/vividnext/sodalive/admin/live/AdminLiveService.kt
 create mode 100644 src/main/kotlin/kr/co/vividnext/sodalive/admin/live/GetLiveResponse.kt

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
new file mode 100644
index 0000000..a4f7224
--- /dev/null
+++ b/src/main/kotlin/kr/co/vividnext/sodalive/admin/live/AdminLiveController.kt
@@ -0,0 +1,15 @@
+package kr.co.vividnext.sodalive.admin.live
+
+import kr.co.vividnext.sodalive.common.ApiResponse
+import org.springframework.security.access.prepost.PreAuthorize
+import org.springframework.web.bind.annotation.GetMapping
+import org.springframework.web.bind.annotation.RequestMapping
+import org.springframework.web.bind.annotation.RestController
+
+@RestController
+@PreAuthorize("hasRole('ADMIN')")
+@RequestMapping("/admin/live")
+class AdminLiveController(private val service: AdminLiveService) {
+    @GetMapping
+    fun getOnAirLive() = ApiResponse.ok(data = service.getLiveList())
+}
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
new file mode 100644
index 0000000..a7f081b
--- /dev/null
+++ b/src/main/kotlin/kr/co/vividnext/sodalive/admin/live/AdminLiveRoomQueryRepository.kt
@@ -0,0 +1,19 @@
+package kr.co.vividnext.sodalive.admin.live
+
+import com.querydsl.jpa.impl.JPAQueryFactory
+import kr.co.vividnext.sodalive.live.room.LiveRoom
+import kr.co.vividnext.sodalive.live.room.QLiveRoom.liveRoom
+import kr.co.vividnext.sodalive.member.QMember.member
+import org.springframework.stereotype.Repository
+
+@Repository
+class AdminLiveRoomQueryRepository(private val queryFactory: JPAQueryFactory) {
+    fun getLiveRoomList(): List<LiveRoom> {
+        return queryFactory
+            .selectFrom(liveRoom)
+            .innerJoin(liveRoom.member, member)
+            .where(liveRoom.isActive.isTrue)
+            .orderBy(liveRoom.channelName.desc(), liveRoom.beginDateTime.asc())
+            .fetch()
+    }
+}
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
new file mode 100644
index 0000000..bec8b06
--- /dev/null
+++ b/src/main/kotlin/kr/co/vividnext/sodalive/admin/live/AdminLiveService.kt
@@ -0,0 +1,37 @@
+package kr.co.vividnext.sodalive.admin.live
+
+import org.springframework.beans.factory.annotation.Value
+import org.springframework.stereotype.Service
+
+@Service
+class AdminLiveService(
+    private val repository: AdminLiveRoomQueryRepository,
+
+    @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
+                    )
+                }
+                .toList()
+        )
+    }
+}
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
new file mode 100644
index 0000000..b0f76fc
--- /dev/null
+++ b/src/main/kotlin/kr/co/vividnext/sodalive/admin/live/GetLiveResponse.kt
@@ -0,0 +1,19 @@
+package kr.co.vividnext.sodalive.admin.live
+
+import kr.co.vividnext.sodalive.live.room.LiveRoomType
+
+data class GetLiveResponse(
+    val liveList: List<GetLiveResponseItem>
+)
+
+data class GetLiveResponseItem(
+    val id: Long,
+    val title: String,
+    val content: String,
+    val managerNickname: String,
+    val coverImageUrl: String,
+    val channelName: String,
+    val type: LiveRoomType,
+    val password: String?,
+    val isAdult: Boolean
+)