feat(live-recommend): 추천 크리에이터 배너를 언어별로 등록하고 노출한다

This commit is contained in:
2026-04-02 18:29:57 +09:00
parent 7f1606a8aa
commit a5ce4b6e0a
13 changed files with 256 additions and 24 deletions

View File

@@ -1,5 +1,6 @@
package kr.co.vividnext.sodalive.live.recommend
import kr.co.vividnext.sodalive.i18n.Lang
import org.springframework.cache.annotation.Cacheable
import org.springframework.stereotype.Service
@@ -9,12 +10,13 @@ class LiveRecommendCacheService(
) {
@Cacheable(
cacheNames = ["cache_ttl_3_hours"],
key = "'getRecommendLive:' + (#memberId ?: 'guest') + ':' + #isAdult"
key = "'getRecommendLive:' + (#memberId ?: 'guest') + ':' + #isAdult + ':' + #lang.name()"
)
fun getRecommendLive(memberId: Long?, isAdult: Boolean): List<GetRecommendLiveResponse> {
fun getRecommendLive(memberId: Long?, isAdult: Boolean, lang: Lang): List<GetRecommendLiveResponse> {
return repository.getRecommendLive(
memberId = memberId,
isAdult = isAdult
isAdult = isAdult,
lang = lang
)
}
}

View File

@@ -2,6 +2,7 @@ package kr.co.vividnext.sodalive.live.recommend
import kr.co.vividnext.sodalive.common.ApiResponse
import kr.co.vividnext.sodalive.common.SodaException
import kr.co.vividnext.sodalive.i18n.LangContext
import kr.co.vividnext.sodalive.member.Member
import org.springframework.data.domain.Pageable
import org.springframework.security.core.annotation.AuthenticationPrincipal
@@ -11,12 +12,15 @@ import org.springframework.web.bind.annotation.RestController
@RestController
@RequestMapping("/live/recommend")
class LiveRecommendController(private val service: LiveRecommendService) {
class LiveRecommendController(
private val service: LiveRecommendService,
private val langContext: LangContext
) {
@GetMapping
fun getRecommendLive(
@AuthenticationPrincipal(expression = "#this == 'anonymousUser' ? null : member") member: Member?
) = run {
ApiResponse.ok(service.getRecommendLive(member))
ApiResponse.ok(service.getRecommendLive(member, langContext.lang))
}
@GetMapping("/channel")

View File

@@ -3,6 +3,7 @@ package kr.co.vividnext.sodalive.live.recommend
import com.querydsl.core.types.Projections
import com.querydsl.core.types.dsl.Expressions
import com.querydsl.jpa.impl.JPAQueryFactory
import kr.co.vividnext.sodalive.i18n.Lang
import kr.co.vividnext.sodalive.live.recommend.QRecommendLiveCreatorBanner.recommendLiveCreatorBanner
import kr.co.vividnext.sodalive.live.room.QLiveRoom.liveRoom
import kr.co.vividnext.sodalive.member.MemberRole
@@ -22,12 +23,14 @@ class LiveRecommendRepository(
) {
fun getRecommendLive(
memberId: Long?,
isAdult: Boolean
isAdult: Boolean,
lang: Lang
): List<GetRecommendLiveResponse> {
val dateNow = LocalDateTime.now()
var where = recommendLiveCreatorBanner.startDate.loe(dateNow)
.and(recommendLiveCreatorBanner.endDate.goe(dateNow))
.and(recommendLiveCreatorBanner.lang.eq(lang))
if (!isAdult) {
where = where.and(recommendLiveCreatorBanner.isAdult.isFalse)

View File

@@ -1,5 +1,6 @@
package kr.co.vividnext.sodalive.live.recommend
import kr.co.vividnext.sodalive.i18n.Lang
import kr.co.vividnext.sodalive.member.Member
import kr.co.vividnext.sodalive.member.MemberRole
import kr.co.vividnext.sodalive.member.block.BlockMemberRepository
@@ -14,7 +15,7 @@ class LiveRecommendService(
private val memberContentPreferenceService: MemberContentPreferenceService,
private val liveRecommendCacheService: LiveRecommendCacheService
) {
fun getRecommendLive(member: Member?): List<GetRecommendLiveResponse> {
fun getRecommendLive(member: Member?, lang: Lang): List<GetRecommendLiveResponse> {
val isAdult = if (member != null) {
memberContentPreferenceService.getStoredPreference(member).isAdult
} else {
@@ -23,7 +24,8 @@ class LiveRecommendService(
return liveRecommendCacheService.getRecommendLive(
memberId = member?.id,
isAdult = isAdult
isAdult = isAdult,
lang = lang
)
}

View File

@@ -1,10 +1,13 @@
package kr.co.vividnext.sodalive.live.recommend
import kr.co.vividnext.sodalive.common.BaseEntity
import kr.co.vividnext.sodalive.i18n.Lang
import kr.co.vividnext.sodalive.member.Member
import java.time.LocalDateTime
import javax.persistence.Column
import javax.persistence.Entity
import javax.persistence.EnumType
import javax.persistence.Enumerated
import javax.persistence.FetchType
import javax.persistence.JoinColumn
import javax.persistence.ManyToOne
@@ -18,6 +21,9 @@ data class RecommendLiveCreatorBanner(
@Column(nullable = false)
var isAdult: Boolean = false,
@Column(nullable = false)
@Enumerated(EnumType.STRING)
var lang: Lang = Lang.KO,
@Column(nullable = false)
var orders: Int = 1,
@Column(nullable = true)
var image: String? = null