test #384
@@ -9,6 +9,7 @@ interface PushTokenRepository : JpaRepository<PushToken, Long>, PushTokenQueryRe
|
|||||||
interface PushTokenQueryRepository {
|
interface PushTokenQueryRepository {
|
||||||
fun findByToken(token: String): PushToken?
|
fun findByToken(token: String): PushToken?
|
||||||
fun findByMemberId(memberId: Long): List<PushToken>
|
fun findByMemberId(memberId: Long): List<PushToken>
|
||||||
|
fun findByMemberIds(memberIds: List<Long>): List<PushToken>
|
||||||
}
|
}
|
||||||
|
|
||||||
class PushTokenQueryRepositoryImpl(
|
class PushTokenQueryRepositoryImpl(
|
||||||
@@ -27,4 +28,12 @@ class PushTokenQueryRepositoryImpl(
|
|||||||
.where(pushToken.member.id.eq(memberId))
|
.where(pushToken.member.id.eq(memberId))
|
||||||
.fetch()
|
.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.extensions.convertLocalDateTime
|
||||||
import kr.co.vividnext.sodalive.fcm.FcmEvent
|
import kr.co.vividnext.sodalive.fcm.FcmEvent
|
||||||
import kr.co.vividnext.sodalive.fcm.FcmEventType
|
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.LangContext
|
||||||
import kr.co.vividnext.sodalive.i18n.SodaMessageSource
|
import kr.co.vividnext.sodalive.i18n.SodaMessageSource
|
||||||
import kr.co.vividnext.sodalive.live.reservation.LiveReservationRepository
|
import kr.co.vividnext.sodalive.live.reservation.LiveReservationRepository
|
||||||
@@ -95,6 +96,7 @@ class LiveRoomService(
|
|||||||
private val roomVisitService: LiveRoomVisitService,
|
private val roomVisitService: LiveRoomVisitService,
|
||||||
private val canPaymentService: CanPaymentService,
|
private val canPaymentService: CanPaymentService,
|
||||||
private val chargeRepository: ChargeRepository,
|
private val chargeRepository: ChargeRepository,
|
||||||
|
private val pushTokenRepository: PushTokenRepository,
|
||||||
private val memberRepository: MemberRepository,
|
private val memberRepository: MemberRepository,
|
||||||
private val tagRepository: LiveTagRepository,
|
private val tagRepository: LiveTagRepository,
|
||||||
private val canRepository: CanRepository,
|
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)
|
@Transactional(readOnly = true)
|
||||||
fun getRoomList(
|
fun getRoomList(
|
||||||
dateString: String?,
|
dateString: String?,
|
||||||
@@ -161,6 +219,9 @@ class LiveRoomService(
|
|||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
val creatorIds = roomList.mapNotNull { it.member?.id }.distinct()
|
||||||
|
val languageTagByMemberId = buildLanguageTagMap(creatorIds)
|
||||||
|
|
||||||
return roomList
|
return roomList
|
||||||
.filter {
|
.filter {
|
||||||
if (member?.id != null) {
|
if (member?.id != null) {
|
||||||
@@ -193,6 +254,11 @@ class LiveRoomService(
|
|||||||
val beginDateTimeUtc = it.beginDateTime
|
val beginDateTimeUtc = it.beginDateTime
|
||||||
.format(DateTimeFormatter.ISO_LOCAL_DATE_TIME)
|
.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(
|
GetRoomListResponse(
|
||||||
roomId = it.id!!,
|
roomId = it.id!!,
|
||||||
title = it.title,
|
title = it.title,
|
||||||
@@ -213,11 +279,7 @@ class LiveRoomService(
|
|||||||
},
|
},
|
||||||
creatorNickname = it.member!!.nickname,
|
creatorNickname = it.member!!.nickname,
|
||||||
creatorId = it.member!!.id!!,
|
creatorId = it.member!!.id!!,
|
||||||
tags = it.tags
|
tags = tags,
|
||||||
.asSequence()
|
|
||||||
.filter { tag -> tag.tag.isActive }
|
|
||||||
.map { tag -> tag.tag.tag }
|
|
||||||
.toList(),
|
|
||||||
coverImageUrl = if (it.coverImage!!.startsWith("https://")) {
|
coverImageUrl = if (it.coverImage!!.startsWith("https://")) {
|
||||||
it.coverImage!!
|
it.coverImage!!
|
||||||
} else {
|
} else {
|
||||||
@@ -440,12 +502,17 @@ class LiveRoomService(
|
|||||||
val beginDateTimeUtc = room.beginDateTime
|
val beginDateTimeUtc = room.beginDateTime
|
||||||
.format(DateTimeFormatter.ISO_LOCAL_DATE_TIME)
|
.format(DateTimeFormatter.ISO_LOCAL_DATE_TIME)
|
||||||
|
|
||||||
|
val languageTagByMemberId = buildLanguageTagMap(listOfNotNull(room.member?.id))
|
||||||
val response = GetRoomDetailResponse(
|
val response = GetRoomDetailResponse(
|
||||||
roomId = roomId,
|
roomId = roomId,
|
||||||
title = room.title,
|
title = room.title,
|
||||||
notice = room.notice,
|
notice = room.notice,
|
||||||
price = room.price,
|
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,
|
numberOfParticipantsTotal = room.numberOfPeople,
|
||||||
numberOfParticipants = 0,
|
numberOfParticipants = 0,
|
||||||
channelName = room.channelName,
|
channelName = room.channelName,
|
||||||
|
|||||||
Reference in New Issue
Block a user