From d1c889e5f2de39d467b76a86dea660117d6a39fe Mon Sep 17 00:00:00 2001 From: Klaus Date: Thu, 17 Jul 2025 18:58:48 +0900 Subject: [PATCH 01/15] =?UTF-8?q?fix:=20=EB=9D=BC=EC=9D=B4=EB=B8=8C=20?= =?UTF-8?q?=EB=A6=AC=EC=8A=A4=ED=8A=B8=20API=20-=20=EB=9D=BC=EC=9D=B4?= =?UTF-8?q?=EB=B8=8C=20=EC=8B=9C=EC=9E=91=20=EC=8B=9C=EA=B0=84=20UTC=20?= =?UTF-8?q?=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../kr/co/vividnext/sodalive/live/room/GetRoomListResponse.kt | 1 + .../kr/co/vividnext/sodalive/live/room/LiveRoomService.kt | 4 ++++ 2 files changed, 5 insertions(+) diff --git a/src/main/kotlin/kr/co/vividnext/sodalive/live/room/GetRoomListResponse.kt b/src/main/kotlin/kr/co/vividnext/sodalive/live/room/GetRoomListResponse.kt index 2649133..01ed451 100644 --- a/src/main/kotlin/kr/co/vividnext/sodalive/live/room/GetRoomListResponse.kt +++ b/src/main/kotlin/kr/co/vividnext/sodalive/live/room/GetRoomListResponse.kt @@ -5,6 +5,7 @@ data class GetRoomListResponse( val title: String, val content: String, val beginDateTime: String, + val beginDateTimeUtc: String, val numberOfParticipate: Int, val numberOfPeople: Int, val coverImageUrl: String, 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 c066c1d..cb86349 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 @@ -176,11 +176,15 @@ class LiveRoomService( .withLocale(Locale.KOREAN) ) + val beginDateTimeUtc = it.beginDateTime + .format(DateTimeFormatter.ISO_LOCAL_DATE_TIME) + GetRoomListResponse( roomId = it.id!!, title = it.title, content = it.notice, beginDateTime = beginDateTime, + beginDateTimeUtc = beginDateTimeUtc, numberOfParticipate = (roomInfo?.listenerCount ?: 0) + (roomInfo?.speakerCount ?: 0) + (roomInfo?.managerCount ?: 0), -- 2.40.1 From 34440e9ba305ce465de3368ae13e6618946e22a6 Mon Sep 17 00:00:00 2001 From: Klaus Date: Thu, 17 Jul 2025 19:36:10 +0900 Subject: [PATCH 02/15] =?UTF-8?q?fix:=20=EB=9D=BC=EC=9D=B4=EB=B8=8C=20?= =?UTF-8?q?=ED=9B=84=EC=9B=90=20=ED=95=A9=EA=B3=84=20API=20-=20=EC=95=88?= =?UTF-8?q?=EC=93=B0=EB=8A=94=20=ED=8C=8C=EB=9D=BC=EB=AF=B8=ED=84=B0=20?= =?UTF-8?q?=EC=A0=9C=EA=B1=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../kr/co/vividnext/sodalive/live/room/LiveRoomController.kt | 2 +- .../kr/co/vividnext/sodalive/live/room/LiveRoomService.kt | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) 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 74b9bae..5389795 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 @@ -171,7 +171,7 @@ class LiveRoomController( ) = run { if (member == null) throw SodaException("로그인 정보를 확인해주세요.") - ApiResponse.ok(service.getDonationTotal(roomId, memberId = member.id!!)) + ApiResponse.ok(service.getDonationTotal(roomId)) } @PutMapping("/info/set/speaker") 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 cb86349..fd7e628 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 @@ -997,7 +997,7 @@ class LiveRoomService( ) } - fun getDonationTotal(roomId: Long, memberId: Long): GetLiveRoomDonationTotalResponse { + fun getDonationTotal(roomId: Long): GetLiveRoomDonationTotalResponse { return GetLiveRoomDonationTotalResponse( totalDonationCan = repository.getDonationTotal(roomId = roomId) ?: 0 ) -- 2.40.1 From d98268f8091a2464301791ae7ece12d3a2a0ba04 Mon Sep 17 00:00:00 2001 From: Klaus Date: Fri, 18 Jul 2025 13:33:19 +0900 Subject: [PATCH 03/15] =?UTF-8?q?refactor:=20timeAgo=20=ED=95=A8=EC=88=98?= =?UTF-8?q?=20-=20LocalDateTime=20=ED=99=95=EC=9E=A5=ED=95=A8=EC=88=98=20?= =?UTF-8?q?=EC=B2=98=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../CreatorCommunityService.kt | 24 ++++--------------- .../extensions/LocalDateTimeExtensions.kt | 18 ++++++++++++++ 2 files changed, 23 insertions(+), 19 deletions(-) create mode 100644 src/main/kotlin/kr/co/vividnext/sodalive/extensions/LocalDateTimeExtensions.kt diff --git a/src/main/kotlin/kr/co/vividnext/sodalive/explorer/profile/creatorCommunity/CreatorCommunityService.kt b/src/main/kotlin/kr/co/vividnext/sodalive/explorer/profile/creatorCommunity/CreatorCommunityService.kt index a8deee9..a209742 100644 --- a/src/main/kotlin/kr/co/vividnext/sodalive/explorer/profile/creatorCommunity/CreatorCommunityService.kt +++ b/src/main/kotlin/kr/co/vividnext/sodalive/explorer/profile/creatorCommunity/CreatorCommunityService.kt @@ -16,6 +16,7 @@ import kr.co.vividnext.sodalive.explorer.profile.creatorCommunity.like.CreatorCo import kr.co.vividnext.sodalive.explorer.profile.creatorCommunity.like.CreatorCommunityLikeRepository import kr.co.vividnext.sodalive.explorer.profile.creatorCommunity.like.PostCommunityPostLikeRequest import kr.co.vividnext.sodalive.explorer.profile.creatorCommunity.like.PostCommunityPostLikeResponse +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.member.Member @@ -28,8 +29,6 @@ import org.springframework.data.repository.findByIdOrNull import org.springframework.stereotype.Service import org.springframework.transaction.annotation.Transactional import org.springframework.web.multipart.MultipartFile -import java.time.Duration -import java.time.LocalDateTime @Service class CreatorCommunityService( @@ -243,7 +242,7 @@ class CreatorCommunityService( it.toCommunityPostListResponse( imageHost = imageHost, audioUrl = audioUrl, - date = getTimeAgoString(it.date), + date = it.date.getTimeAgoString(), isLike = isLike, memberId = memberId, existOrdered = if (memberId == it.creatorId) { @@ -314,7 +313,7 @@ class CreatorCommunityService( return post.toCommunityPostListResponse( imageHost = imageHost, audioUrl = audioUrl, - date = getTimeAgoString(post.date), + date = post.date.getTimeAgoString(), isLike = isLike, memberId = memberId, existOrdered = if (memberId == post.creatorId) { @@ -328,19 +327,6 @@ class CreatorCommunityService( ) } - private fun getTimeAgoString(dateTime: LocalDateTime): String { - val now = LocalDateTime.now() - val duration = Duration.between(dateTime, now) - - return when { - duration.toMinutes() < 60 -> "${duration.toMinutes()}분전" - duration.toHours() < 24 -> "${duration.toHours()}시간전" - duration.toDays() < 30 -> "${duration.toDays()}일전" - duration.toDays() < 365 -> "${duration.toDays() / 30}개월전" - else -> "${duration.toDays() / 365}년전" - } - } - @Transactional fun communityPostLike(request: PostCommunityPostLikeRequest, member: Member): PostCommunityPostLikeResponse { var postLike = likeRepository.findByPostIdAndMemberId(postId = request.postId, memberId = member.id!!) @@ -506,7 +492,7 @@ class CreatorCommunityService( it.toCommunityPostListResponse( imageHost = imageHost, audioUrl = null, - date = getTimeAgoString(it.date), + date = it.date.getTimeAgoString(), isLike = isLike, memberId = memberId, existOrdered = if (memberId == it.creatorId) { @@ -590,7 +576,7 @@ class CreatorCommunityService( imageHost = imageHost, audioUrl = audioUrl, content = post.content, - date = getTimeAgoString(post.createdAt!!), + date = post.createdAt!!.getTimeAgoString(), isLike = isLike, existOrdered = true, likeCount = likeCount, diff --git a/src/main/kotlin/kr/co/vividnext/sodalive/extensions/LocalDateTimeExtensions.kt b/src/main/kotlin/kr/co/vividnext/sodalive/extensions/LocalDateTimeExtensions.kt new file mode 100644 index 0000000..061e19c --- /dev/null +++ b/src/main/kotlin/kr/co/vividnext/sodalive/extensions/LocalDateTimeExtensions.kt @@ -0,0 +1,18 @@ +package kr.co.vividnext.sodalive.extensions + +import java.time.Duration +import java.time.LocalDateTime + +fun LocalDateTime.getTimeAgoString(): String { + val now = LocalDateTime.now() + val duration = Duration.between(this, now) + + return when { + duration.toMinutes() < 1 -> "방금 전" + duration.toMinutes() < 60 -> "${duration.toMinutes()}분전" + duration.toHours() < 24 -> "${duration.toHours()}시간전" + duration.toDays() < 30 -> "${duration.toDays()}일전" + duration.toDays() < 365 -> "${duration.toDays() / 30}개월전" + else -> "${duration.toDays() / 365}년전" + } +} -- 2.40.1 From a3aad9d2c93209a5da70900226e6e1b23f2dfb4a Mon Sep 17 00:00:00 2001 From: Klaus Date: Fri, 18 Jul 2025 14:15:03 +0900 Subject: [PATCH 04/15] =?UTF-8?q?feat:=20=EC=B5=9C=EA=B7=BC=20=EC=A2=85?= =?UTF-8?q?=EB=A3=8C=ED=95=9C=20=EB=9D=BC=EC=9D=B4=EB=B8=8C=2020=EA=B0=9C?= =?UTF-8?q?=20=EA=B0=80=EC=A0=B8=EC=98=A4=EB=8A=94=20API=20=EC=B6=94?= =?UTF-8?q?=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() + ) + } + } } -- 2.40.1 From d04b44c93126dcfb261da16ea6fa8dc0d3762e20 Mon Sep 17 00:00:00 2001 From: Klaus Date: Fri, 18 Jul 2025 14:40:16 +0900 Subject: [PATCH 05/15] =?UTF-8?q?fix:=20=EC=B5=9C=EA=B7=BC=20=EC=A2=85?= =?UTF-8?q?=EB=A3=8C=ED=95=9C=20=EB=9D=BC=EC=9D=B4=EB=B8=8C=20API=20-=20?= =?UTF-8?q?=EC=B0=A8=EB=8B=A8=20=EB=8B=B9=ED=95=9C=20=ED=81=AC=EB=A6=AC?= =?UTF-8?q?=EC=97=90=EC=9D=B4=ED=84=B0=EB=8A=94=20=EC=95=88=EB=B3=B4?= =?UTF-8?q?=EC=9D=B4=EB=8F=84=EB=A1=9D=20=EC=88=98=EC=A0=95=20-=2020?= =?UTF-8?q?=EA=B0=9C=20=EB=AF=B8=EB=A7=8C=EC=9D=B4=EB=A9=B4=20=EC=9E=AC?= =?UTF-8?q?=EC=8B=9C=EB=8F=84=20=EC=B2=98=EB=A6=AC=20-=20=EC=9E=AC?= =?UTF-8?q?=EC=8B=9C=EB=8F=84=20=EC=B5=9C=EB=8C=80=20=ED=9A=9F=EC=88=98=20?= =?UTF-8?q?3=ED=9A=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../sodalive/live/room/LiveRoomController.kt | 6 ++- .../sodalive/live/room/LiveRoomRepository.kt | 5 ++- .../sodalive/live/room/LiveRoomService.kt | 38 +++++++++++++------ 3 files changed, 35 insertions(+), 14 deletions(-) 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 c39ed1a..c33c5be 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 @@ -293,5 +293,9 @@ class LiveRoomController( } @GetMapping("/latest-finished-live") - fun getLatestFinishedLive() = run { ApiResponse.ok(service.getLatestFinishedLive()) } + fun getLatestFinishedLive( + @AuthenticationPrincipal(expression = "#this == 'anonymousUser' ? null : member") member: Member? + ) = run { + ApiResponse.ok(service.getLatestFinishedLive(member)) + } } 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 d92f181..905fd26 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,7 +60,7 @@ interface LiveRoomQueryRepository { fun getTotalHeartCount(roomId: Long): Int? fun getLiveRoomCreatorId(roomId: Long): Long? fun getHeartList(roomId: Long): List - fun getLatestFinishedLive(): List + fun getLatestFinishedLive(offset: Long): List } class LiveRoomQueryRepositoryImpl( @@ -382,7 +382,7 @@ class LiveRoomQueryRepositoryImpl( .fetch() } - override fun getLatestFinishedLive(): List { + override fun getLatestFinishedLive(offset: Long): List { return queryFactory .selectFrom(liveRoom) .innerJoin(liveRoom.member, member) @@ -392,6 +392,7 @@ class LiveRoomQueryRepositoryImpl( ) .groupBy(liveRoom.member.id) .orderBy(liveRoom.updatedAt.max().desc()) + .offset(offset) .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 e5a88cc..bae8f86 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 @@ -1298,16 +1298,32 @@ class LiveRoomService( ) } - 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() - ) - } + fun getLatestFinishedLive(member: Member?): List { + val result = mutableListOf() + var retry = 0L + + do { + result.addAll( + repository.getLatestFinishedLive(offset = retry) + .filter { + if (member?.id != null) { + !blockMemberRepository.isBlocked(blockedMemberId = member.id!!, memberId = it.member!!.id!!) + } else { + true + } + } + .map { + GetLatestFinishedLiveResponse( + memberId = it.member!!.id!!, + nickname = it.member!!.nickname, + profileImageUrl = "$cloudFrontHost/${it.member!!.profileImage}", + title = it.title, + timeAgo = it.updatedAt!!.getTimeAgoString() + ) + } + ) + } while (result.size < 20 && retry++ < 3) + + return result.take(20) } } -- 2.40.1 From a849d00c7f865a9ec33bfcf6dc547ac7a64dacc5 Mon Sep 17 00:00:00 2001 From: Klaus Date: Fri, 18 Jul 2025 15:46:20 +0900 Subject: [PATCH 06/15] =?UTF-8?q?fix:=20=EC=B5=9C=EA=B7=BC=20=EC=A2=85?= =?UTF-8?q?=EB=A3=8C=ED=95=9C=20=EB=9D=BC=EC=9D=B4=EB=B8=8C=20API=20?= =?UTF-8?q?=EC=98=A4=EB=A5=98=20=EC=88=98=EC=A0=95=20-=20SQLSyntaxErrorExc?= =?UTF-8?q?eption=20=EC=98=A4=EB=A5=98=EC=88=98=EC=A0=95=20-=20select=20?= =?UTF-8?q?=EA=B0=92=EC=97=90=20=EC=A7=91=EA=B3=84=EC=BF=BC=EB=A6=AC?= =?UTF-8?q?=EB=A5=BC=20=EB=84=A3=EC=96=B4=EC=84=9C=20=ED=95=B4=EA=B2=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../room/GetLatestFinishedLiveResponse.kt | 22 ++++++++++++++++++- .../sodalive/live/room/LiveRoomRepository.kt | 14 +++++++++--- .../sodalive/live/room/LiveRoomService.kt | 11 ++-------- 3 files changed, 34 insertions(+), 13 deletions(-) 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 index 57f61cf..8955da6 100644 --- a/src/main/kotlin/kr/co/vividnext/sodalive/live/room/GetLatestFinishedLiveResponse.kt +++ b/src/main/kotlin/kr/co/vividnext/sodalive/live/room/GetLatestFinishedLiveResponse.kt @@ -1,9 +1,29 @@ package kr.co.vividnext.sodalive.live.room +import com.querydsl.core.annotations.QueryProjection +import kr.co.vividnext.sodalive.extensions.getTimeAgoString +import java.time.LocalDateTime + +data class GetLatestFinishedLiveQueryResponse @QueryProjection constructor( + val memberId: Long, + val nickname: String, + val profileImageUrl: String, + val title: String, + val updatedAt: LocalDateTime +) + data class GetLatestFinishedLiveResponse( val memberId: Long, val nickname: String, val profileImageUrl: String, val title: String, val timeAgo: String -) +) { + constructor(response: GetLatestFinishedLiveQueryResponse) : this( + response.memberId, + response.nickname, + response.profileImageUrl, + response.title, + response.updatedAt.getTimeAgoString() + ) +} 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 905fd26..6480b0a 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,7 +60,7 @@ interface LiveRoomQueryRepository { fun getTotalHeartCount(roomId: Long): Int? fun getLiveRoomCreatorId(roomId: Long): Long? fun getHeartList(roomId: Long): List - fun getLatestFinishedLive(offset: Long): List + fun getLatestFinishedLive(offset: Long): List } class LiveRoomQueryRepositoryImpl( @@ -382,9 +382,17 @@ class LiveRoomQueryRepositoryImpl( .fetch() } - override fun getLatestFinishedLive(offset: Long): List { + override fun getLatestFinishedLive(offset: Long): List { return queryFactory - .selectFrom(liveRoom) + .select( + QGetLatestFinishedLiveQueryResponse( + member.id, + member.nickname, + member.profileImage.prepend("/").prepend(cloudFrontHost), + liveRoom.title, + liveRoom.updatedAt.max() + ) + ) .innerJoin(liveRoom.member, member) .where( liveRoom.isActive.isFalse 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 bae8f86..766d41f 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,7 +19,6 @@ 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 @@ -1307,19 +1306,13 @@ class LiveRoomService( repository.getLatestFinishedLive(offset = retry) .filter { if (member?.id != null) { - !blockMemberRepository.isBlocked(blockedMemberId = member.id!!, memberId = it.member!!.id!!) + !blockMemberRepository.isBlocked(blockedMemberId = member.id!!, memberId = it.memberId) } else { true } } .map { - GetLatestFinishedLiveResponse( - memberId = it.member!!.id!!, - nickname = it.member!!.nickname, - profileImageUrl = "$cloudFrontHost/${it.member!!.profileImage}", - title = it.title, - timeAgo = it.updatedAt!!.getTimeAgoString() - ) + GetLatestFinishedLiveResponse(response = it) } ) } while (result.size < 20 && retry++ < 3) -- 2.40.1 From 885243a5b07cfaffc41462a20236c33e976e9afc Mon Sep 17 00:00:00 2001 From: Klaus Date: Fri, 18 Jul 2025 16:35:15 +0900 Subject: [PATCH 07/15] =?UTF-8?q?fix:=20=EC=B5=9C=EA=B7=BC=20=EC=A2=85?= =?UTF-8?q?=EB=A3=8C=ED=95=9C=20=EB=9D=BC=EC=9D=B4=EB=B8=8C=20API=20?= =?UTF-8?q?=EC=98=A4=EB=A5=98=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../kr/co/vividnext/sodalive/live/room/LiveRoomRepository.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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 6480b0a..308b589 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 @@ -398,7 +398,7 @@ class LiveRoomQueryRepositoryImpl( liveRoom.isActive.isFalse .and(liveRoom.channelName.isNotNull) ) - .groupBy(liveRoom.member.id) + .groupBy(member.id) .orderBy(liveRoom.updatedAt.max().desc()) .offset(offset) .limit(20) -- 2.40.1 From 5696240e0378164950060024bfb1eba628d2ae9b Mon Sep 17 00:00:00 2001 From: Klaus Date: Fri, 18 Jul 2025 16:49:18 +0900 Subject: [PATCH 08/15] =?UTF-8?q?fix:=20=EC=B5=9C=EA=B7=BC=20=EC=A2=85?= =?UTF-8?q?=EB=A3=8C=ED=95=9C=20=EB=9D=BC=EC=9D=B4=EB=B8=8C=20API=20?= =?UTF-8?q?=EC=98=A4=EB=A5=98=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../kr/co/vividnext/sodalive/live/room/LiveRoomRepository.kt | 1 + 1 file changed, 1 insertion(+) 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 308b589..d2e20f4 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 @@ -393,6 +393,7 @@ class LiveRoomQueryRepositoryImpl( liveRoom.updatedAt.max() ) ) + .from(liveRoom) .innerJoin(liveRoom.member, member) .where( liveRoom.isActive.isFalse -- 2.40.1 From 1ba63e2cab22aecc98bcf9bd5ed70e1af2dc6ed4 Mon Sep 17 00:00:00 2001 From: Klaus Date: Fri, 18 Jul 2025 17:13:37 +0900 Subject: [PATCH 09/15] =?UTF-8?q?fix:=20=EC=B5=9C=EA=B7=BC=20=EC=A2=85?= =?UTF-8?q?=EB=A3=8C=ED=95=9C=20=EB=9D=BC=EC=9D=B4=EB=B8=8C=20API=20?= =?UTF-8?q?=EC=98=A4=EB=A5=98=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../sodalive/live/room/LiveRoomRepository.kt | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) 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 d2e20f4..5bb40f2 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 @@ -4,6 +4,7 @@ import com.querydsl.core.types.Projections import com.querydsl.core.types.dsl.CaseBuilder import com.querydsl.core.types.dsl.Expressions import com.querydsl.core.types.dsl.NumberExpression +import com.querydsl.jpa.JPAExpressions import com.querydsl.jpa.impl.JPAQueryFactory import kr.co.vividnext.sodalive.can.use.CanUsage import kr.co.vividnext.sodalive.can.use.QUseCan.useCan @@ -383,6 +384,9 @@ class LiveRoomQueryRepositoryImpl( } override fun getLatestFinishedLive(offset: Long): List { + val liveRoom = liveRoom + val subLiveRoom = QLiveRoom.liveRoom + return queryFactory .select( QGetLatestFinishedLiveQueryResponse( @@ -396,7 +400,13 @@ class LiveRoomQueryRepositoryImpl( .from(liveRoom) .innerJoin(liveRoom.member, member) .where( - liveRoom.isActive.isFalse + liveRoom.updatedAt + .eq( + JPAExpressions.select(subLiveRoom.updatedAt.max()) + .from(subLiveRoom) + .where(subLiveRoom.member.eq(liveRoom.member)) + ) + .and(liveRoom.isActive.isFalse) .and(liveRoom.channelName.isNotNull) ) .groupBy(member.id) -- 2.40.1 From 1a6a331ad84ba876ff3c5da8b396f468c92a87d2 Mon Sep 17 00:00:00 2001 From: Klaus Date: Fri, 18 Jul 2025 17:22:05 +0900 Subject: [PATCH 10/15] =?UTF-8?q?fix:=20=EC=B5=9C=EA=B7=BC=20=EC=A2=85?= =?UTF-8?q?=EB=A3=8C=ED=95=9C=20=EB=9D=BC=EC=9D=B4=EB=B8=8C=20API=20?= =?UTF-8?q?=EC=98=A4=EB=A5=98=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../kr/co/vividnext/sodalive/live/room/LiveRoomRepository.kt | 1 - 1 file changed, 1 deletion(-) 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 5bb40f2..732efcd 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 @@ -409,7 +409,6 @@ class LiveRoomQueryRepositoryImpl( .and(liveRoom.isActive.isFalse) .and(liveRoom.channelName.isNotNull) ) - .groupBy(member.id) .orderBy(liveRoom.updatedAt.max().desc()) .offset(offset) .limit(20) -- 2.40.1 From 741a1282a3b02829e0b4a9481becd5d251588c84 Mon Sep 17 00:00:00 2001 From: Klaus Date: Fri, 18 Jul 2025 17:30:48 +0900 Subject: [PATCH 11/15] =?UTF-8?q?fix:=20=EC=B5=9C=EA=B7=BC=20=EC=A2=85?= =?UTF-8?q?=EB=A3=8C=ED=95=9C=20=EB=9D=BC=EC=9D=B4=EB=B8=8C=20API=20?= =?UTF-8?q?=EC=98=A4=EB=A5=98=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../sodalive/live/room/LiveRoomRepository.kt | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) 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 732efcd..35c12cf 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 @@ -394,7 +394,7 @@ class LiveRoomQueryRepositoryImpl( member.nickname, member.profileImage.prepend("/").prepend(cloudFrontHost), liveRoom.title, - liveRoom.updatedAt.max() + liveRoom.updatedAt ) ) .from(liveRoom) @@ -404,12 +404,14 @@ class LiveRoomQueryRepositoryImpl( .eq( JPAExpressions.select(subLiveRoom.updatedAt.max()) .from(subLiveRoom) - .where(subLiveRoom.member.eq(liveRoom.member)) + .where( + subLiveRoom.member.eq(liveRoom.member) + .and(subLiveRoom.isActive.isFalse) + .and(subLiveRoom.channelName.isNotNull) + ) ) - .and(liveRoom.isActive.isFalse) - .and(liveRoom.channelName.isNotNull) ) - .orderBy(liveRoom.updatedAt.max().desc()) + .orderBy(liveRoom.updatedAt.desc()) .offset(offset) .limit(20) .fetch() -- 2.40.1 From 2192ddc8fab62a02f072b2065137f96a8345b606 Mon Sep 17 00:00:00 2001 From: Klaus Date: Fri, 18 Jul 2025 17:50:18 +0900 Subject: [PATCH 12/15] =?UTF-8?q?fix:=20=EC=B5=9C=EA=B7=BC=20=EC=A2=85?= =?UTF-8?q?=EB=A3=8C=ED=95=9C=20=EB=9D=BC=EC=9D=B4=EB=B8=8C=20API=20?= =?UTF-8?q?=EC=98=A4=EB=A5=98=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../sodalive/live/room/LiveRoomRepository.kt | 21 ++++++++++--------- 1 file changed, 11 insertions(+), 10 deletions(-) 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 35c12cf..9c998c8 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 @@ -387,6 +387,15 @@ class LiveRoomQueryRepositoryImpl( val liveRoom = liveRoom val subLiveRoom = QLiveRoom.liveRoom + val subQuery = JPAExpressions + .select(subLiveRoom.member.id, subLiveRoom.updatedAt.max()) + .from(subLiveRoom) + .where( + subLiveRoom.isActive.isFalse + .and(subLiveRoom.channelName.isNotNull) + ) + .groupBy(subLiveRoom.member.id) + return queryFactory .select( QGetLatestFinishedLiveQueryResponse( @@ -400,16 +409,8 @@ class LiveRoomQueryRepositoryImpl( .from(liveRoom) .innerJoin(liveRoom.member, member) .where( - liveRoom.updatedAt - .eq( - JPAExpressions.select(subLiveRoom.updatedAt.max()) - .from(subLiveRoom) - .where( - subLiveRoom.member.eq(liveRoom.member) - .and(subLiveRoom.isActive.isFalse) - .and(subLiveRoom.channelName.isNotNull) - ) - ) + Expressions.list(liveRoom.member.id, liveRoom.updatedAt) + .`in`(subQuery) ) .orderBy(liveRoom.updatedAt.desc()) .offset(offset) -- 2.40.1 From a99260209bc43d59bddfc7b53ac412397df94d48 Mon Sep 17 00:00:00 2001 From: Klaus Date: Fri, 18 Jul 2025 18:00:36 +0900 Subject: [PATCH 13/15] =?UTF-8?q?fix:=20=EC=B5=9C=EA=B7=BC=20=EC=A2=85?= =?UTF-8?q?=EB=A3=8C=ED=95=9C=20=EB=9D=BC=EC=9D=B4=EB=B8=8C=20API=20?= =?UTF-8?q?=EC=98=A4=EB=A5=98=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../sodalive/live/room/LiveRoomRepository.kt | 5 ++- .../sodalive/live/room/LiveRoomService.kt | 31 +++++++------------ 2 files changed, 13 insertions(+), 23 deletions(-) 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 9c998c8..8d0ff5a 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 @@ -61,7 +61,7 @@ interface LiveRoomQueryRepository { fun getTotalHeartCount(roomId: Long): Int? fun getLiveRoomCreatorId(roomId: Long): Long? fun getHeartList(roomId: Long): List - fun getLatestFinishedLive(offset: Long): List + fun getLatestFinishedLive(): List } class LiveRoomQueryRepositoryImpl( @@ -383,7 +383,7 @@ class LiveRoomQueryRepositoryImpl( .fetch() } - override fun getLatestFinishedLive(offset: Long): List { + override fun getLatestFinishedLive(): List { val liveRoom = liveRoom val subLiveRoom = QLiveRoom.liveRoom @@ -413,7 +413,6 @@ class LiveRoomQueryRepositoryImpl( .`in`(subQuery) ) .orderBy(liveRoom.updatedAt.desc()) - .offset(offset) .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 766d41f..b8a6e27 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 @@ -1298,25 +1298,16 @@ class LiveRoomService( } fun getLatestFinishedLive(member: Member?): List { - val result = mutableListOf() - var retry = 0L - - do { - result.addAll( - repository.getLatestFinishedLive(offset = retry) - .filter { - if (member?.id != null) { - !blockMemberRepository.isBlocked(blockedMemberId = member.id!!, memberId = it.memberId) - } else { - true - } - } - .map { - GetLatestFinishedLiveResponse(response = it) - } - ) - } while (result.size < 20 && retry++ < 3) - - return result.take(20) + return repository.getLatestFinishedLive() + .filter { + if (member?.id != null) { + !blockMemberRepository.isBlocked(blockedMemberId = member.id!!, memberId = it.memberId) + } else { + true + } + } + .map { + GetLatestFinishedLiveResponse(response = it) + } } } -- 2.40.1 From d18c19dd356d347604edd02b8369ddd9ee414921 Mon Sep 17 00:00:00 2001 From: Klaus Date: Fri, 18 Jul 2025 18:09:00 +0900 Subject: [PATCH 14/15] =?UTF-8?q?fix:=20=EC=B5=9C=EA=B7=BC=20=EC=A2=85?= =?UTF-8?q?=EB=A3=8C=ED=95=9C=20=EB=9D=BC=EC=9D=B4=EB=B8=8C=20API=20?= =?UTF-8?q?=EC=98=A4=EB=A5=98=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../kr/co/vividnext/sodalive/live/room/LiveRoomRepository.kt | 2 ++ 1 file changed, 2 insertions(+) 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 8d0ff5a..5967fb9 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 @@ -15,6 +15,7 @@ import kr.co.vividnext.sodalive.live.room.donation.GetLiveRoomDonationItem import kr.co.vividnext.sodalive.live.room.donation.QGetLiveRoomDonationItem import kr.co.vividnext.sodalive.live.room.like.GetLiveRoomHeartListItem import kr.co.vividnext.sodalive.live.room.like.QGetLiveRoomHeartListItem +import kr.co.vividnext.sodalive.member.MemberRole import kr.co.vividnext.sodalive.member.QMember.member import org.springframework.beans.factory.annotation.Value import org.springframework.data.jpa.repository.JpaRepository @@ -393,6 +394,7 @@ class LiveRoomQueryRepositoryImpl( .where( subLiveRoom.isActive.isFalse .and(subLiveRoom.channelName.isNotNull) + .and(subLiveRoom.member.role.eq(MemberRole.CREATOR)) ) .groupBy(subLiveRoom.member.id) -- 2.40.1 From 8e877a63660e1bfa7a998a2762a17720c15dcb61 Mon Sep 17 00:00:00 2001 From: Klaus Date: Fri, 18 Jul 2025 20:27:02 +0900 Subject: [PATCH 15/15] =?UTF-8?q?fix:=20=EB=9D=BC=EC=9D=B4=EB=B8=8C=20?= =?UTF-8?q?=EB=8B=A4=EC=8B=9C=EB=93=A3=EA=B8=B0=20=EC=BD=98=ED=85=90?= =?UTF-8?q?=EC=B8=A0=20API=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../content/AudioContentController.kt | 20 +++++++++++++++++++ .../content/AudioContentRepository.kt | 6 ++---- 2 files changed, 22 insertions(+), 4 deletions(-) diff --git a/src/main/kotlin/kr/co/vividnext/sodalive/content/AudioContentController.kt b/src/main/kotlin/kr/co/vividnext/sodalive/content/AudioContentController.kt index f5a529a..c9510ab 100644 --- a/src/main/kotlin/kr/co/vividnext/sodalive/content/AudioContentController.kt +++ b/src/main/kotlin/kr/co/vividnext/sodalive/content/AudioContentController.kt @@ -236,4 +236,24 @@ class AudioContentController(private val service: AudioContentService) { ApiResponse.ok(service.unpinAtTheTop(contentId = id, member = member)) } + + @GetMapping("/replay-live") + fun replayLive( + @RequestParam("isAdultContentVisible", required = false) isAdultContentVisible: Boolean? = null, + @RequestParam("contentType", required = false) contentType: ContentType? = null, + @AuthenticationPrincipal(expression = "#this == 'anonymousUser' ? null : member") member: Member? + ) = run { + ApiResponse.ok( + service.getLatestContentByTheme( + theme = listOf("다시듣기"), + contentType = contentType ?: ContentType.ALL, + isFree = false, + isAdult = if (member != null) { + (isAdultContentVisible ?: true) && member.auth != null + } else { + false + } + ) + ) + } } diff --git a/src/main/kotlin/kr/co/vividnext/sodalive/content/AudioContentRepository.kt b/src/main/kotlin/kr/co/vividnext/sodalive/content/AudioContentRepository.kt index 1ee6a50..40038d3 100644 --- a/src/main/kotlin/kr/co/vividnext/sodalive/content/AudioContentRepository.kt +++ b/src/main/kotlin/kr/co/vividnext/sodalive/content/AudioContentRepository.kt @@ -490,10 +490,8 @@ class AudioContentQueryRepositoryImpl( where = where.and(audioContentTheme.theme.`in`(theme)) } - where = if (isFree) { - where.and(audioContent.price.loe(0)) - } else { - where.and(audioContent.price.gt(0)) + if (isFree) { + where = where.and(audioContent.price.loe(0)) } return queryFactory -- 2.40.1