From ba1709553683f52874d4f3072d1eb275a58855bd Mon Sep 17 00:00:00 2001
From: Klaus <klaus@vividnext.co.kr>
Date: Wed, 4 Dec 2024 18:44:17 +0900
Subject: [PATCH] =?UTF-8?q?=EA=B5=AC=EB=A7=A4=EB=AA=A9=EB=A1=9D=20?=
 =?UTF-8?q?=EC=A1=B0=ED=9A=8C=20-=20=EA=B5=AC=EB=A7=A4=EC=9C=A0=ED=98=95?=
 =?UTF-8?q?=EB=B3=84=EB=A1=9C=20=EC=A1=B0=ED=9A=8C=ED=95=A0=20=EC=88=98=20?=
 =?UTF-8?q?=EC=9E=88=EB=8F=84=EB=A1=9D=20orderType=20=EC=B6=94=EA=B0=80?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 .../sodalive/content/order/OrderController.kt |  3 +
 .../sodalive/content/order/OrderRepository.kt | 88 +++++++++++++------
 .../sodalive/content/order/OrderService.kt    |  3 +
 3 files changed, 68 insertions(+), 26 deletions(-)

diff --git a/src/main/kotlin/kr/co/vividnext/sodalive/content/order/OrderController.kt b/src/main/kotlin/kr/co/vividnext/sodalive/content/order/OrderController.kt
index 89c1e08..889e6ed 100644
--- a/src/main/kotlin/kr/co/vividnext/sodalive/content/order/OrderController.kt
+++ b/src/main/kotlin/kr/co/vividnext/sodalive/content/order/OrderController.kt
@@ -9,6 +9,7 @@ import org.springframework.web.bind.annotation.GetMapping
 import org.springframework.web.bind.annotation.PostMapping
 import org.springframework.web.bind.annotation.RequestBody
 import org.springframework.web.bind.annotation.RequestMapping
+import org.springframework.web.bind.annotation.RequestParam
 import org.springframework.web.bind.annotation.RestController
 
 @RestController
@@ -33,6 +34,7 @@ class OrderController(private val service: OrderService) {
 
     @GetMapping("/audio-content")
     fun getAudioContentOrderList(
+        @RequestParam(value = "orderType", required = false) orderType: OrderType? = null,
         @AuthenticationPrincipal(expression = "#this == 'anonymousUser' ? null : member") member: Member?,
         pageable: Pageable
     ) = run {
@@ -40,6 +42,7 @@ class OrderController(private val service: OrderService) {
 
         ApiResponse.ok(
             service.getAudioContentOrderList(
+                orderType = orderType,
                 member = member,
                 offset = pageable.offset,
                 limit = pageable.pageSize.toLong()
diff --git a/src/main/kotlin/kr/co/vividnext/sodalive/content/order/OrderRepository.kt b/src/main/kotlin/kr/co/vividnext/sodalive/content/order/OrderRepository.kt
index fb6022a..4c7887b 100644
--- a/src/main/kotlin/kr/co/vividnext/sodalive/content/order/OrderRepository.kt
+++ b/src/main/kotlin/kr/co/vividnext/sodalive/content/order/OrderRepository.kt
@@ -20,6 +20,7 @@ interface OrderQueryRepository {
     fun isExistOrderedAndOrderType(memberId: Long, contentId: Long): Pair<Boolean, OrderType?>
     fun getAudioContentRemainingTime(memberId: Long, contentId: Long, timezone: String): String
     fun getAudioContentOrderList(
+        orderType: OrderType?,
         dateTime: LocalDateTime,
         coverImageHost: String,
         memberId: Long,
@@ -27,7 +28,7 @@ interface OrderQueryRepository {
         limit: Long = 10
     ): List<GetAudioContentOrderListItem>
 
-    fun totalAudioContentOrderListCount(memberId: Long, dateTime: LocalDateTime): Int
+    fun totalAudioContentOrderListCount(orderType: OrderType?, memberId: Long, dateTime: LocalDateTime): Int
     fun getAudioContentMainOrderList(
         dateTime: LocalDateTime,
         coverImageHost: String,
@@ -117,12 +118,41 @@ class OrderQueryRepositoryImpl(private val queryFactory: JPAQueryFactory) : Orde
     }
 
     override fun getAudioContentOrderList(
+        orderType: OrderType?,
         dateTime: LocalDateTime,
         coverImageHost: String,
         memberId: Long,
         offset: Long,
         limit: Long
     ): List<GetAudioContentOrderListItem> {
+        var where = order.member.id.eq(memberId)
+            .and(order.isActive.isTrue)
+
+        when (orderType) {
+            OrderType.RENTAL -> {
+                where = where.and(
+                    order.type.eq(OrderType.RENTAL)
+                        .and(order.startDate.before(dateTime))
+                        .and(order.endDate.after(dateTime))
+                )
+            }
+
+            OrderType.KEEP -> {
+                where = where.and(order.type.eq(OrderType.KEEP))
+            }
+
+            null -> {
+                where = where.and(
+                    order.type.eq(OrderType.KEEP)
+                        .or(
+                            order.type.eq(OrderType.RENTAL)
+                                .and(order.startDate.before(dateTime))
+                                .and(order.endDate.after(dateTime))
+                        )
+                )
+            }
+        }
+
         return queryFactory
             .select(
                 QGetAudioContentOrderListItem(
@@ -141,39 +171,45 @@ class OrderQueryRepositoryImpl(private val queryFactory: JPAQueryFactory) : Orde
             )
             .from(order)
             .innerJoin(order.audioContent, audioContent)
-            .where(
-                order.member.id.eq(memberId)
-                    .and(order.isActive.isTrue)
-                    .and(
-                        order.type.eq(OrderType.KEEP)
-                            .or(
-                                order.type.eq(OrderType.RENTAL)
-                                    .and(order.startDate.before(dateTime))
-                                    .and(order.endDate.after(dateTime))
-                            )
-                    )
-            )
+            .where(where)
             .offset(offset)
             .limit(limit)
             .orderBy(order.createdAt.desc())
             .fetch()
     }
 
-    override fun totalAudioContentOrderListCount(memberId: Long, dateTime: LocalDateTime): Int {
+    override fun totalAudioContentOrderListCount(orderType: OrderType?, memberId: Long, dateTime: LocalDateTime): Int {
+        var where = order.member.id.eq(memberId)
+            .and(order.isActive.isTrue)
+
+        when (orderType) {
+            OrderType.RENTAL -> {
+                where = where.and(
+                    order.type.eq(OrderType.RENTAL)
+                        .and(order.startDate.before(dateTime))
+                        .and(order.endDate.after(dateTime))
+                )
+            }
+
+            OrderType.KEEP -> {
+                where = where.and(order.type.eq(OrderType.KEEP))
+            }
+
+            null -> {
+                where = where.and(
+                    order.type.eq(OrderType.KEEP)
+                        .or(
+                            order.type.eq(OrderType.RENTAL)
+                                .and(order.startDate.before(dateTime))
+                                .and(order.endDate.after(dateTime))
+                        )
+                )
+            }
+        }
+
         return queryFactory.select(order.id)
             .from(order)
-            .where(
-                order.member.id.eq(memberId)
-                    .and(order.isActive.isTrue)
-                    .and(
-                        order.type.eq(OrderType.KEEP)
-                            .or(
-                                order.type.eq(OrderType.RENTAL)
-                                    .and(order.startDate.before(dateTime))
-                                    .and(order.endDate.after(dateTime))
-                            )
-                    )
-            )
+            .where(where)
             .fetch()
             .size
     }
diff --git a/src/main/kotlin/kr/co/vividnext/sodalive/content/order/OrderService.kt b/src/main/kotlin/kr/co/vividnext/sodalive/content/order/OrderService.kt
index 630b22a..620aaaa 100644
--- a/src/main/kotlin/kr/co/vividnext/sodalive/content/order/OrderService.kt
+++ b/src/main/kotlin/kr/co/vividnext/sodalive/content/order/OrderService.kt
@@ -90,15 +90,18 @@ class OrderService(
     }
 
     fun getAudioContentOrderList(
+        orderType: OrderType? = null,
         member: Member,
         offset: Long,
         limit: Long
     ): GetAudioContentOrderListResponse {
         val totalCount = repository.totalAudioContentOrderListCount(
+            orderType = orderType,
             memberId = member.id!!,
             dateTime = LocalDateTime.now()
         )
         val orderItems = repository.getAudioContentOrderList(
+            orderType = orderType,
             dateTime = LocalDateTime.now(),
             coverImageHost = audioContentCoverImageHost,
             memberId = member.id!!,