diff --git a/docs/20260712_DM룸_푸시문구_수정/plan-task.md b/docs/20260712_DM룸_푸시문구_수정/plan-task.md index 78263952..b8de611d 100644 --- a/docs/20260712_DM룸_푸시문구_수정/plan-task.md +++ b/docs/20260712_DM룸_푸시문구_수정/plan-task.md @@ -4,10 +4,12 @@ 1. Happy path: 상대방이 DM Room에 입장하지 않은 상태에서 WebSocket 텍스트 메시지를 보내면 `FcmEvent.messageKey`가 `message.fcm.dm_received`이다. 2. Edge: `message.fcm.dm_received`가 KO/EN/JA에서 조회되고, 기존 `message.fcm.text_received` 한국어 문구는 그대로다. 3. Adjacent regression: DM 음성 메시지 푸시는 계속 `message.fcm.voice_received`를 사용한다. +4. Title: DM 텍스트 푸시의 `titleKey`는 `message.fcm.dm_title`("DM"), 음성 등 그 외는 `message.fcm.title`을 유지한다. ## 작업 1. RED: `SodaMessageSourceTest`에 DM 전용 키 다국어 조회와 기존 키 보존 테스트를 추가한다. 2. RED: `UserCreatorChatServiceTest`에 DM 텍스트 푸시 키와 음성 푸시 키 회귀 assertion을 추가한다. 3. GREEN: `SodaMessageSource`에 `message.fcm.dm_received` 다국어 메시지를 추가한다. 4. GREEN: `UserCreatorChatService.publishMessagePush`의 텍스트 분기만 새 키로 바꾼다. -5. VERIFY: 관련 테스트와 lint를 실행한다. +5. GREEN: `SodaMessageSource`에 `message.fcm.dm_title`(KO/EN/JA "DM")를 추가하고, `publishMessagePush`가 DM 텍스트일 때만 `titleKey`를 `message.fcm.dm_title`로 분기한다. +6. VERIFY: 관련 테스트와 lint를 실행한다. diff --git a/docs/20260712_DM룸_푸시문구_수정/prd.md b/docs/20260712_DM룸_푸시문구_수정/prd.md index 7c552f70..7418203f 100644 --- a/docs/20260712_DM룸_푸시문구_수정/prd.md +++ b/docs/20260712_DM룸_푸시문구_수정/prd.md @@ -9,6 +9,8 @@ DM Room에서 텍스트 메시지를 보냈을 때 상대방이 해당 채팅방 - 새 한국어 문구는 기존 문구의 `문자메시지가`를 `DM이`로 바꾼다. - 새 메시지 키는 한국어, 영어, 일본어를 모두 제공한다. - DM 음성 메시지 푸시는 기존 `message.fcm.voice_received`를 유지한다. +- DM 텍스트 푸시(`message.fcm.dm_received`) 사용 시 푸시 제목을 새 키 `message.fcm.dm_title`("DM")로 표시한다. +- 음성 등 그 외 푸시 제목은 기존 `message.fcm.title`을 유지한다. ## 비범위 - FCM 발송 구조, deep link, 수신자 선정 로직은 변경하지 않는다. @@ -18,3 +20,5 @@ DM Room에서 텍스트 메시지를 보냈을 때 상대방이 해당 채팅방 - 오프라인 DM 텍스트 메시지 푸시 이벤트가 새 DM 메시지 키를 사용한다. - `message.fcm.text_received`는 기존 값으로 남아 있다. - 새 DM 메시지 키가 `Lang.KO`, `Lang.EN`, `Lang.JA`에서 조회된다. +- DM 텍스트 푸시 이벤트의 `titleKey`가 `message.fcm.dm_title`이고, 음성 등 그 외 푸시는 `message.fcm.title`을 유지한다. +- `message.fcm.dm_title`이 `Lang.KO`, `Lang.EN`, `Lang.JA` 모두 "DM"으로 조회된다. diff --git a/src/main/kotlin/kr/co/vividnext/sodalive/i18n/SodaMessageSource.kt b/src/main/kotlin/kr/co/vividnext/sodalive/i18n/SodaMessageSource.kt index f8bdaaaf..7907600b 100644 --- a/src/main/kotlin/kr/co/vividnext/sodalive/i18n/SodaMessageSource.kt +++ b/src/main/kotlin/kr/co/vividnext/sodalive/i18n/SodaMessageSource.kt @@ -1175,6 +1175,11 @@ class SodaMessageSource { Lang.EN to "You have received a DM from %s.", Lang.JA to "%sからDMが届きました。" ), + "message.fcm.dm_title" to mapOf( + Lang.KO to "DM", + Lang.EN to "DM", + Lang.JA to "DM" + ), "message.fcm.voice_received" to mapOf( Lang.KO to "%s님으로 부터 음성메시지가 도착했습니다.", Lang.EN to "You have received a voice message from %s.", diff --git a/src/main/kotlin/kr/co/vividnext/sodalive/v2/usercreatorchat/service/UserCreatorChatService.kt b/src/main/kotlin/kr/co/vividnext/sodalive/v2/usercreatorchat/service/UserCreatorChatService.kt index db688b1a..7150767c 100644 --- a/src/main/kotlin/kr/co/vividnext/sodalive/v2/usercreatorchat/service/UserCreatorChatService.kt +++ b/src/main/kotlin/kr/co/vividnext/sodalive/v2/usercreatorchat/service/UserCreatorChatService.kt @@ -226,11 +226,16 @@ class UserCreatorChatService( } else { "message.fcm.dm_received" } + val titleKey = if (messageKey == "message.fcm.dm_received") { + "message.fcm.dm_title" + } else { + "message.fcm.title" + } applicationEventPublisher.publishEvent( FcmEvent( type = FcmEventType.INDIVIDUAL, category = PushNotificationCategory.MESSAGE, - titleKey = "message.fcm.title", + titleKey = titleKey, messageKey = messageKey, senderMemberId = sender.id, args = listOf(sender.nickname), diff --git a/src/test/kotlin/kr/co/vividnext/sodalive/v2/usercreatorchat/UserCreatorChatServiceTest.kt b/src/test/kotlin/kr/co/vividnext/sodalive/v2/usercreatorchat/UserCreatorChatServiceTest.kt index 997fbd94..fd564faa 100644 --- a/src/test/kotlin/kr/co/vividnext/sodalive/v2/usercreatorchat/UserCreatorChatServiceTest.kt +++ b/src/test/kotlin/kr/co/vividnext/sodalive/v2/usercreatorchat/UserCreatorChatServiceTest.kt @@ -198,6 +198,7 @@ class UserCreatorChatServiceTest { Mockito.verify(eventPublisher).publishEvent(eventCaptor.capture()) assertEquals(FcmEventType.INDIVIDUAL, eventCaptor.value.type) assertEquals("message.fcm.dm_received", eventCaptor.value.messageKey) + assertEquals("message.fcm.dm_title", eventCaptor.value.titleKey) assertEquals(listOf(2L), eventCaptor.value.recipients) assertEquals(null, eventCaptor.value.roomId) assertEquals(null, eventCaptor.value.messageId) @@ -231,6 +232,7 @@ class UserCreatorChatServiceTest { Mockito.verify(eventPublisher).publishEvent(eventCaptor.capture()) assertEquals(FcmEventType.INDIVIDUAL, eventCaptor.value.type) assertEquals("message.fcm.dm_received", eventCaptor.value.messageKey) + assertEquals("message.fcm.dm_title", eventCaptor.value.titleKey) assertEquals(listOf(2L), eventCaptor.value.recipients) Mockito.verifyNoInteractions(roomMessageBroker) } @@ -289,6 +291,7 @@ class UserCreatorChatServiceTest { Mockito.verify(eventPublisher).publishEvent(eventCaptor.capture()) assertEquals(FcmEventType.INDIVIDUAL, eventCaptor.value.type) assertEquals("message.fcm.voice_received", eventCaptor.value.messageKey) + assertEquals("message.fcm.title", eventCaptor.value.titleKey) assertEquals(listOf(2L), eventCaptor.value.recipients) assertEquals(null, eventCaptor.value.roomId) assertEquals(null, eventCaptor.value.messageId)