feat(live-recommend): 추천 크리에이터 배너를 언어별로 등록하고 노출한다
This commit is contained in:
@@ -39,9 +39,10 @@ class AdminLiveController(private val service: AdminLiveService) {
|
||||
@RequestParam("creator_id") creatorId: Long,
|
||||
@RequestParam("start_date") startDate: String,
|
||||
@RequestParam("end_date") endDate: String,
|
||||
@RequestParam("is_adult") isAdult: Boolean
|
||||
@RequestParam("is_adult") isAdult: Boolean,
|
||||
@RequestParam("lang") lang: String
|
||||
) = ApiResponse.ok(
|
||||
service.createRecommendCreatorBanner(image, creatorId, startDate, endDate, isAdult),
|
||||
service.createRecommendCreatorBanner(image, creatorId, startDate, endDate, isAdult, lang),
|
||||
"등록되었습니다."
|
||||
)
|
||||
|
||||
|
||||
@@ -17,6 +17,7 @@ import kr.co.vividnext.sodalive.fcm.FcmDeepLinkValue
|
||||
import kr.co.vividnext.sodalive.fcm.FcmEvent
|
||||
import kr.co.vividnext.sodalive.fcm.FcmEventType
|
||||
import kr.co.vividnext.sodalive.fcm.notification.PushNotificationCategory
|
||||
import kr.co.vividnext.sodalive.i18n.Lang
|
||||
import kr.co.vividnext.sodalive.i18n.LangContext
|
||||
import kr.co.vividnext.sodalive.i18n.SodaMessageSource
|
||||
import kr.co.vividnext.sodalive.live.recommend.RecommendLiveCreatorBanner
|
||||
@@ -122,7 +123,8 @@ class AdminLiveService(
|
||||
creatorId: Long,
|
||||
startDateString: String,
|
||||
endDateString: String,
|
||||
isAdult: Boolean
|
||||
isAdult: Boolean,
|
||||
lang: String
|
||||
): Long {
|
||||
if (creatorId < 1) throw SodaException(messageKey = "admin.live.creator_required")
|
||||
|
||||
@@ -150,10 +152,17 @@ class AdminLiveService(
|
||||
if (endDate < nowDate) throw SodaException(messageKey = "admin.live.end_after_now")
|
||||
if (endDate <= startDate) throw SodaException(messageKey = "admin.live.start_before_end")
|
||||
|
||||
val bannerLang = try {
|
||||
Lang.fromCode(lang)
|
||||
} catch (_: IllegalArgumentException) {
|
||||
throw SodaException(messageKey = "common.error.invalid_request")
|
||||
}
|
||||
|
||||
val recommendCreatorBanner = RecommendLiveCreatorBanner(
|
||||
startDate = startDate,
|
||||
endDate = endDate,
|
||||
isAdult = isAdult
|
||||
isAdult = isAdult,
|
||||
lang = bannerLang
|
||||
)
|
||||
recommendCreatorBanner.creator = creator
|
||||
recommendCreatorBannerRepository.save(recommendCreatorBanner)
|
||||
|
||||
@@ -3,6 +3,7 @@ package kr.co.vividnext.sodalive.api.live
|
||||
import kr.co.vividnext.sodalive.content.AudioContentService
|
||||
import kr.co.vividnext.sodalive.content.ContentType
|
||||
import kr.co.vividnext.sodalive.explorer.profile.creatorCommunity.CreatorCommunityService
|
||||
import kr.co.vividnext.sodalive.i18n.LangContext
|
||||
import kr.co.vividnext.sodalive.live.recommend.LiveRecommendService
|
||||
import kr.co.vividnext.sodalive.live.room.LiveRoomService
|
||||
import kr.co.vividnext.sodalive.live.room.LiveRoomStatus
|
||||
@@ -20,8 +21,8 @@ class LiveApiService(
|
||||
private val recommendService: LiveRecommendService,
|
||||
private val creatorCommunityService: CreatorCommunityService,
|
||||
private val memberContentPreferenceService: MemberContentPreferenceService,
|
||||
|
||||
private val blockMemberRepository: BlockMemberRepository
|
||||
private val blockMemberRepository: BlockMemberRepository,
|
||||
private val langContext: LangContext
|
||||
) {
|
||||
fun fetchData(
|
||||
timezone: String,
|
||||
@@ -49,7 +50,7 @@ class LiveApiService(
|
||||
listOf()
|
||||
}
|
||||
|
||||
val recommendLiveList = recommendService.getRecommendLive(member)
|
||||
val recommendLiveList = recommendService.getRecommendLive(member, langContext.lang)
|
||||
|
||||
val latestFinishedLiveList = liveService.getLatestFinishedLive(member)
|
||||
|
||||
|
||||
@@ -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
|
||||
)
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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")
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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
|
||||
)
|
||||
}
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user