클라이언트 메시지 다국어 처리

공개 API 변경 없음.
This commit is contained in:
2025-12-22 23:12:29 +09:00
parent 93e0411337
commit 4dcf9f6ed1
11 changed files with 165 additions and 54 deletions

View File

@@ -6,6 +6,8 @@ import kr.co.vividnext.sodalive.aws.s3.S3Uploader
import kr.co.vividnext.sodalive.common.SodaException
import kr.co.vividnext.sodalive.fcm.FcmEvent
import kr.co.vividnext.sodalive.fcm.FcmEventType
import kr.co.vividnext.sodalive.i18n.LangContext
import kr.co.vividnext.sodalive.i18n.SodaMessageSource
import kr.co.vividnext.sodalive.member.Member
import kr.co.vividnext.sodalive.member.MemberRepository
import kr.co.vividnext.sodalive.member.block.BlockMemberRepository
@@ -26,6 +28,8 @@ class MessageService(
private val repository: MessageRepository,
private val memberRepository: MemberRepository,
private val blockMemberRepository: BlockMemberRepository,
private val messageSource: SodaMessageSource,
private val langContext: LangContext,
private val applicationEventPublisher: ApplicationEventPublisher,
private val objectMapper: ObjectMapper,
@@ -39,17 +43,21 @@ class MessageService(
@Transactional
fun sendTextMessage(request: SendTextMessageRequest, member: Member) {
val recipient = memberRepository.findByIdOrNull(request.recipientId)
?: throw SodaException("받는 사람이 없습니다.")
?: throw SodaException(messageKey = "message.error.recipient_not_found")
if (!recipient.isActive) {
throw SodaException("탈퇴한 유저에게는 메시지를 보내실 수 없습니다.")
throw SodaException(messageKey = "message.error.recipient_inactive")
}
val isBlocked = blockMemberRepository.isBlocked(blockedMemberId = member.id!!, memberId = request.recipientId)
if (isBlocked) throw SodaException("${recipient.nickname}님의 요청으로 메시지를 보낼 수 없습니다.")
if (isBlocked) {
val messageTemplate = messageSource.getMessage("message.error.blocked_by_recipient", langContext.lang).orEmpty()
val message = String.format(messageTemplate, recipient.nickname)
throw SodaException(message = message)
}
val sender = memberRepository.findByIdOrNull(member.id!!)
?: throw SodaException("로그인 정보를 확인해주세요.")
?: throw SodaException(messageKey = "common.error.bad_credentials")
val message = Message(
textMessage = request.textMessage,
@@ -64,8 +72,11 @@ class MessageService(
applicationEventPublisher.publishEvent(
FcmEvent(
type = FcmEventType.SEND_MESSAGE,
title = "메시지",
message = "${sender.nickname}님으로 부터 문자메시지가 도착했습니다.",
title = messageSource.getMessage("message.fcm.title", langContext.lang).orEmpty(),
message = run {
val messageTemplate = messageSource.getMessage("message.fcm.text_received", langContext.lang).orEmpty()
String.format(messageTemplate, sender.nickname)
},
messageId = message.id
)
)
@@ -99,17 +110,21 @@ class MessageService(
val request = objectMapper.readValue(requestString, SendVoiceMessageRequest::class.java)
val recipient = memberRepository.findByIdOrNull(request.recipientId)
?: throw SodaException("받는 사람이 없습니다.")
?: throw SodaException(messageKey = "message.error.recipient_not_found")
if (!recipient.isActive) {
throw SodaException("탈퇴한 유저에게는 메시지를 보내실 수 없습니다.")
throw SodaException(messageKey = "message.error.recipient_inactive")
}
val isBlocked = blockMemberRepository.isBlocked(blockedMemberId = member.id!!, memberId = request.recipientId)
if (isBlocked) throw SodaException("${recipient.nickname}님의 요청으로 메시지를 보낼 수 없습니다.")
if (isBlocked) {
val messageTemplate = messageSource.getMessage("message.error.blocked_by_recipient", langContext.lang).orEmpty()
val message = String.format(messageTemplate, recipient.nickname)
throw SodaException(message = message)
}
val sender = memberRepository.findByIdOrNull(member.id!!)
?: throw SodaException("로그인 정보를 확인해주세요.")
?: throw SodaException(messageKey = "common.error.bad_credentials")
val message = Message(messageType = MessageType.VOICE)
message.sender = sender
@@ -132,8 +147,11 @@ class MessageService(
applicationEventPublisher.publishEvent(
FcmEvent(
type = FcmEventType.SEND_MESSAGE,
title = "메시지",
message = "${sender.nickname}님으로 부터 음성메시지가 도착했습니다.",
title = messageSource.getMessage("message.fcm.title", langContext.lang).orEmpty(),
message = run {
val messageTemplate = messageSource.getMessage("message.fcm.voice_received", langContext.lang).orEmpty()
String.format(messageTemplate, sender.nickname)
},
messageId = message.id
)
)
@@ -166,7 +184,7 @@ class MessageService(
@Transactional
fun deleteMessage(messageId: Long, member: Member) {
val message = repository.findByIdOrNull(messageId)
?: throw SodaException("해당하는 메시지가 없습니다.\n다시 확인해 주시기 바랍니다.")
?: throw SodaException(messageKey = "message.error.not_found_retry")
if (message.sender!!.id!! == member.id!!) {
message.isSenderDelete = true
@@ -247,14 +265,14 @@ class MessageService(
private fun keepMessage(messageId: Long, member: Member) {
val message = repository.findByIdOrNull(messageId)
?: throw SodaException("잘못된 요청입니다.")
?: throw SodaException(messageKey = "common.error.invalid_request")
if (message.recipient != member) {
throw SodaException("잘못된 요청입니다.")
throw SodaException(messageKey = "common.error.invalid_request")
}
if (message.isRecipientKeep) {
throw SodaException("이미 보관된 메시지 입니다.")
throw SodaException(messageKey = "message.error.already_kept")
}
message.isRecipientKeep = true