feat(banner): 구형 공개 조회에 예약 기간 필터를 적용한다

This commit is contained in:
2026-10-27 20:48:30 +09:00
parent 98e68fc994
commit da73b98374
6 changed files with 241 additions and 6 deletions
@@ -16,6 +16,7 @@ import kr.co.vividnext.sodalive.content.main.QGetAudioContentMainItem
import kr.co.vividnext.sodalive.content.main.QGetAudioContentRankingItem
import kr.co.vividnext.sodalive.content.main.banner.AudioContentBanner
import kr.co.vividnext.sodalive.content.main.banner.QAudioContentBanner.audioContentBanner
import kr.co.vividnext.sodalive.content.main.banner.isVisibleAt
import kr.co.vividnext.sodalive.content.main.curation.AudioContentCuration
import kr.co.vividnext.sodalive.content.main.curation.QAudioContentCuration.audioContentCuration
import kr.co.vividnext.sodalive.content.main.curation.QAudioContentCurationItem.audioContentCurationItem
@@ -38,6 +39,7 @@ import org.springframework.beans.factory.annotation.Value
import org.springframework.data.jpa.repository.JpaRepository
import org.springframework.stereotype.Repository
import java.time.LocalDateTime
import java.time.ZoneOffset
@Repository
interface AudioContentRepository : JpaRepository<AudioContent, Long>, AudioContentQueryRepository
@@ -215,7 +217,8 @@ class AudioContentQueryRepositoryImpl(
private val queryFactory: JPAQueryFactory,
@Value("\${cloud.aws.cloud-front.host}")
private val imageHost: String
private val imageHost: String,
private val nowProvider: () -> LocalDateTime = { LocalDateTime.now(ZoneOffset.UTC) }
) : AudioContentQueryRepository {
override fun findByIdAndActive(contentId: Long): AudioContent? {
return queryFactory
@@ -904,7 +907,7 @@ class AudioContentQueryRepositoryImpl(
.leftJoin(audioContentBanner.tab, audioContentMainTab)
.leftJoin(audioContentBanner.event, event)
.leftJoin(audioContentBanner.creator, member)
.where(where)
.where(where, audioContentBanner.isVisibleAt(nowProvider()))
.orderBy(audioContentBanner.orders.asc())
.fetch()
}
@@ -7,6 +7,8 @@ import kr.co.vividnext.sodalive.event.QEvent.event
import kr.co.vividnext.sodalive.i18n.Lang
import kr.co.vividnext.sodalive.member.QMember.member
import org.springframework.data.jpa.repository.JpaRepository
import java.time.LocalDateTime
import java.time.ZoneOffset
interface AudioContentBannerRepository : JpaRepository<AudioContentBanner, Long>, AudioContentBannerQueryRepository
@@ -15,7 +17,8 @@ interface AudioContentBannerQueryRepository {
}
class AudioContentBannerQueryRepositoryImpl(
private val queryFactory: JPAQueryFactory
private val queryFactory: JPAQueryFactory,
private val nowProvider: () -> LocalDateTime = { LocalDateTime.now(ZoneOffset.UTC) }
) : AudioContentBannerQueryRepository {
override fun getAudioContentMainBannerList(tabId: Long, isAdult: Boolean, lang: Lang?): List<AudioContentBanner> {
var where = audioContentBanner.isActive.isTrue
@@ -39,7 +42,7 @@ class AudioContentBannerQueryRepositoryImpl(
.leftJoin(audioContentBanner.tab, audioContentMainTab)
.leftJoin(audioContentBanner.event, event)
.leftJoin(audioContentBanner.creator, member)
.where(where)
.where(where, audioContentBanner.isVisibleAt(nowProvider()))
.orderBy(audioContentBanner.orders.asc())
.fetch()
}
@@ -0,0 +1,11 @@
package kr.co.vividnext.sodalive.content.main.banner
import com.querydsl.core.types.dsl.BooleanExpression
import java.time.LocalDateTime
import java.time.temporal.ChronoUnit
fun QAudioContentBanner.isVisibleAt(now: LocalDateTime): BooleanExpression {
val currentSecond = now.truncatedTo(ChronoUnit.SECONDS)
return startDate.isNull.or(startDate.loe(currentSecond))
.and(endDate.isNull.or(endDate.goe(currentSecond)))
}