test #384

Merged
klaus merged 10 commits from test into main 2026-02-04 12:52:24 +00:00
2 changed files with 82 additions and 6 deletions
Showing only changes of commit 8c4b599735 - Show all commits

View File

@@ -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()
}
}

View File

@@ -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,