feat(content-banner): 오디오 콘텐츠 배너를 언어별로 등록하고 노출한다

This commit is contained in:
2026-04-02 17:55:20 +09:00
parent 3c32559c5d
commit 7f1606a8aa
11 changed files with 508 additions and 6 deletions

View File

@@ -72,7 +72,7 @@ class AdminContentBannerService(
null
}
val audioContentBanner = AudioContentBanner(type = request.type)
val audioContentBanner = AudioContentBanner(type = request.type, lang = request.lang)
audioContentBanner.link = request.link
audioContentBanner.isAdult = request.isAdult
audioContentBanner.event = event

View File

@@ -1,9 +1,11 @@
package kr.co.vividnext.sodalive.admin.content.banner
import kr.co.vividnext.sodalive.content.main.banner.AudioContentBannerType
import kr.co.vividnext.sodalive.i18n.Lang
data class CreateContentBannerRequest(
val type: AudioContentBannerType,
val lang: Lang,
val tabId: Long?,
val eventId: Long?,
val creatorId: Long?,

View File

@@ -124,7 +124,8 @@ class HomeService(
val bannerList = bannerService.getBannerList(
tabId = 1,
memberId = member?.id,
isAdult = isAdult
isAdult = isAdult,
lang = langContext.lang
)
val originalAudioDramaList = seriesService.getOriginalAudioDramaList(

View File

@@ -4,6 +4,7 @@ import kr.co.vividnext.sodalive.common.BaseEntity
import kr.co.vividnext.sodalive.content.main.tab.AudioContentMainTab
import kr.co.vividnext.sodalive.creator.admin.content.series.Series
import kr.co.vividnext.sodalive.event.Event
import kr.co.vividnext.sodalive.i18n.Lang
import kr.co.vividnext.sodalive.member.Member
import javax.persistence.Column
import javax.persistence.Entity
@@ -22,6 +23,9 @@ data class AudioContentBanner(
@Enumerated(value = EnumType.STRING)
var type: AudioContentBannerType,
@Column(nullable = false)
@Enumerated(value = EnumType.STRING)
var lang: Lang = Lang.KO,
@Column(nullable = false)
var isAdult: Boolean = false,
@Column(nullable = false)
var isActive: Boolean = true,

View File

@@ -4,19 +4,20 @@ import com.querydsl.jpa.impl.JPAQueryFactory
import kr.co.vividnext.sodalive.content.main.banner.QAudioContentBanner.audioContentBanner
import kr.co.vividnext.sodalive.content.main.tab.QAudioContentMainTab.audioContentMainTab
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
interface AudioContentBannerRepository : JpaRepository<AudioContentBanner, Long>, AudioContentBannerQueryRepository
interface AudioContentBannerQueryRepository {
fun getAudioContentMainBannerList(tabId: Long, isAdult: Boolean): List<AudioContentBanner>
fun getAudioContentMainBannerList(tabId: Long, isAdult: Boolean, lang: Lang? = null): List<AudioContentBanner>
}
class AudioContentBannerQueryRepositoryImpl(
private val queryFactory: JPAQueryFactory
) : AudioContentBannerQueryRepository {
override fun getAudioContentMainBannerList(tabId: Long, isAdult: Boolean): List<AudioContentBanner> {
override fun getAudioContentMainBannerList(tabId: Long, isAdult: Boolean, lang: Lang?): List<AudioContentBanner> {
var where = audioContentBanner.isActive.isTrue
where = if (tabId == 1L) {
@@ -29,6 +30,10 @@ class AudioContentBannerQueryRepositoryImpl(
where = where.and(audioContentBanner.isAdult.isFalse)
}
if (lang != null) {
where = where.and(audioContentBanner.lang.eq(lang))
}
return queryFactory
.selectFrom(audioContentBanner)
.leftJoin(audioContentBanner.tab, audioContentMainTab)

View File

@@ -1,6 +1,7 @@
package kr.co.vividnext.sodalive.content.main.banner
import kr.co.vividnext.sodalive.event.EventItem
import kr.co.vividnext.sodalive.i18n.Lang
import kr.co.vividnext.sodalive.member.block.BlockMemberRepository
import org.springframework.beans.factory.annotation.Value
import org.springframework.stereotype.Service
@@ -13,8 +14,8 @@ class AudioContentBannerService(
@Value("\${cloud.aws.cloud-front.host}")
private val imageHost: String
) {
fun getBannerList(tabId: Long, memberId: Long?, isAdult: Boolean): List<GetAudioContentBannerResponse> {
return repository.getAudioContentMainBannerList(tabId, isAdult)
fun getBannerList(tabId: Long, memberId: Long?, isAdult: Boolean, lang: Lang? = null): List<GetAudioContentBannerResponse> {
return repository.getAudioContentMainBannerList(tabId, isAdult, lang)
.filter {
if (it.type == AudioContentBannerType.CREATOR && it.creator != null && memberId != null) {
!isBlockedBetweenMembers(memberId = memberId, creatorId = it.creator!!.id!!)