라이브 방 태그 언어 우선 적용
This commit is contained in:
@@ -9,6 +9,7 @@ interface PushTokenRepository : JpaRepository<PushToken, Long>, PushTokenQueryRe
|
||||
interface PushTokenQueryRepository {
|
||||
fun findByToken(token: String): PushToken?
|
||||
fun findByMemberId(memberId: Long): List<PushToken>
|
||||
fun findByMemberIds(memberIds: List<Long>): List<PushToken>
|
||||
}
|
||||
|
||||
class PushTokenQueryRepositoryImpl(
|
||||
@@ -27,4 +28,12 @@ class PushTokenQueryRepositoryImpl(
|
||||
.where(pushToken.member.id.eq(memberId))
|
||||
.fetch()
|
||||
}
|
||||
|
||||
override fun findByMemberIds(memberIds: List<Long>): List<PushToken> {
|
||||
if (memberIds.isEmpty()) return emptyList()
|
||||
return queryFactory
|
||||
.selectFrom(pushToken)
|
||||
.where(pushToken.member.id.`in`(memberIds))
|
||||
.fetch()
|
||||
}
|
||||
}
|
||||
|
||||
@@ -21,6 +21,7 @@ import kr.co.vividnext.sodalive.explorer.ExplorerQueryRepository
|
||||
import kr.co.vividnext.sodalive.extensions.convertLocalDateTime
|
||||
import kr.co.vividnext.sodalive.fcm.FcmEvent
|
||||
import kr.co.vividnext.sodalive.fcm.FcmEventType
|
||||
import kr.co.vividnext.sodalive.fcm.PushTokenRepository
|
||||
import kr.co.vividnext.sodalive.i18n.LangContext
|
||||
import kr.co.vividnext.sodalive.i18n.SodaMessageSource
|
||||
import kr.co.vividnext.sodalive.live.reservation.LiveReservationRepository
|
||||
@@ -95,6 +96,7 @@ class LiveRoomService(
|
||||
private val roomVisitService: LiveRoomVisitService,
|
||||
private val canPaymentService: CanPaymentService,
|
||||
private val chargeRepository: ChargeRepository,
|
||||
private val pushTokenRepository: PushTokenRepository,
|
||||
private val memberRepository: MemberRepository,
|
||||
private val tagRepository: LiveTagRepository,
|
||||
private val canRepository: CanRepository,
|
||||
@@ -126,6 +128,62 @@ class LiveRoomService(
|
||||
}
|
||||
}
|
||||
|
||||
private fun applyLanguageTagToRoomTags(
|
||||
memberId: Long?,
|
||||
tags: List<String>,
|
||||
languageTagByMemberId: Map<Long, String?>? = null
|
||||
): List<String> {
|
||||
val randomizedTags = tags.shuffled()
|
||||
val languageTag = getCreatorLanguageTag(memberId, languageTagByMemberId) ?: return randomizedTags
|
||||
val filteredTags = randomizedTags.filterNot { it == languageTag }
|
||||
return listOf(languageTag) + filteredTags
|
||||
}
|
||||
|
||||
private fun getCreatorLanguageTag(
|
||||
memberId: Long?,
|
||||
languageTagByMemberId: Map<Long, String?>? = null
|
||||
): String? {
|
||||
if (memberId == null) return null
|
||||
if (languageTagByMemberId != null && languageTagByMemberId.containsKey(memberId)) {
|
||||
return languageTagByMemberId[memberId]
|
||||
}
|
||||
|
||||
val tokens = pushTokenRepository.findByMemberId(memberId)
|
||||
val languageCode = tokens
|
||||
.filterNot { it.languageCode.isNullOrBlank() }
|
||||
.maxByOrNull { it.updatedAt ?: LocalDateTime.MIN }
|
||||
?.languageCode
|
||||
|
||||
val languageTag = when (languageCode?.lowercase()?.take(2)) {
|
||||
"ko" -> "한국어"
|
||||
"ja" -> "일본어"
|
||||
"en" -> "영어"
|
||||
else -> null
|
||||
}
|
||||
return languageTag
|
||||
}
|
||||
|
||||
private fun buildLanguageTagMap(memberIds: List<Long>): Map<Long, String?> {
|
||||
val tokens = pushTokenRepository.findByMemberIds(memberIds)
|
||||
if (tokens.isEmpty()) return emptyMap()
|
||||
|
||||
val latestTokenByMemberId = tokens
|
||||
.filter { it.member?.id != null }
|
||||
.groupBy { it.member!!.id!! }
|
||||
.mapValues { (_, memberTokens) ->
|
||||
memberTokens.maxByOrNull { it.updatedAt ?: LocalDateTime.MIN }
|
||||
}
|
||||
|
||||
return latestTokenByMemberId.mapValues { (_, token) ->
|
||||
when (token?.languageCode?.lowercase()?.take(2)) {
|
||||
"ko" -> "한국어"
|
||||
"ja" -> "일본어"
|
||||
"en" -> "영어"
|
||||
else -> null
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@Transactional(readOnly = true)
|
||||
fun getRoomList(
|
||||
dateString: String?,
|
||||
@@ -161,6 +219,9 @@ class LiveRoomService(
|
||||
)
|
||||
}
|
||||
|
||||
val creatorIds = roomList.mapNotNull { it.member?.id }.distinct()
|
||||
val languageTagByMemberId = buildLanguageTagMap(creatorIds)
|
||||
|
||||
return roomList
|
||||
.filter {
|
||||
if (member?.id != null) {
|
||||
@@ -193,6 +254,11 @@ class LiveRoomService(
|
||||
val beginDateTimeUtc = it.beginDateTime
|
||||
.format(DateTimeFormatter.ISO_LOCAL_DATE_TIME)
|
||||
|
||||
val tags = it.tags
|
||||
.filter { tag -> tag.tag.isActive }
|
||||
.map { tag -> tag.tag.tag }
|
||||
.let { list -> applyLanguageTagToRoomTags(it.member?.id, list, languageTagByMemberId) }
|
||||
|
||||
GetRoomListResponse(
|
||||
roomId = it.id!!,
|
||||
title = it.title,
|
||||
@@ -213,11 +279,7 @@ class LiveRoomService(
|
||||
},
|
||||
creatorNickname = it.member!!.nickname,
|
||||
creatorId = it.member!!.id!!,
|
||||
tags = it.tags
|
||||
.asSequence()
|
||||
.filter { tag -> tag.tag.isActive }
|
||||
.map { tag -> tag.tag.tag }
|
||||
.toList(),
|
||||
tags = tags,
|
||||
coverImageUrl = if (it.coverImage!!.startsWith("https://")) {
|
||||
it.coverImage!!
|
||||
} else {
|
||||
@@ -440,12 +502,17 @@ class LiveRoomService(
|
||||
val beginDateTimeUtc = room.beginDateTime
|
||||
.format(DateTimeFormatter.ISO_LOCAL_DATE_TIME)
|
||||
|
||||
val languageTagByMemberId = buildLanguageTagMap(listOfNotNull(room.member?.id))
|
||||
val response = GetRoomDetailResponse(
|
||||
roomId = roomId,
|
||||
title = room.title,
|
||||
notice = room.notice,
|
||||
price = room.price,
|
||||
tags = room.tags.asSequence().filter { it.tag.isActive }.map { it.tag.tag }.toList(),
|
||||
tags = room.tags.asSequence()
|
||||
.filter { it.tag.isActive }
|
||||
.map { it.tag.tag }
|
||||
.toList()
|
||||
.let { tags -> applyLanguageTagToRoomTags(room.member?.id, tags, languageTagByMemberId) },
|
||||
numberOfParticipantsTotal = room.numberOfPeople,
|
||||
numberOfParticipants = 0,
|
||||
channelName = room.channelName,
|
||||
|
||||
Reference in New Issue
Block a user