@@ -4,10 +4,12 @@
|
|||||||
1. Happy path: 상대방이 DM Room에 입장하지 않은 상태에서 WebSocket 텍스트 메시지를 보내면 `FcmEvent.messageKey`가 `message.fcm.dm_received`이다.
|
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` 한국어 문구는 그대로다.
|
2. Edge: `message.fcm.dm_received`가 KO/EN/JA에서 조회되고, 기존 `message.fcm.text_received` 한국어 문구는 그대로다.
|
||||||
3. Adjacent regression: DM 음성 메시지 푸시는 계속 `message.fcm.voice_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 전용 키 다국어 조회와 기존 키 보존 테스트를 추가한다.
|
1. RED: `SodaMessageSourceTest`에 DM 전용 키 다국어 조회와 기존 키 보존 테스트를 추가한다.
|
||||||
2. RED: `UserCreatorChatServiceTest`에 DM 텍스트 푸시 키와 음성 푸시 키 회귀 assertion을 추가한다.
|
2. RED: `UserCreatorChatServiceTest`에 DM 텍스트 푸시 키와 음성 푸시 키 회귀 assertion을 추가한다.
|
||||||
3. GREEN: `SodaMessageSource`에 `message.fcm.dm_received` 다국어 메시지를 추가한다.
|
3. GREEN: `SodaMessageSource`에 `message.fcm.dm_received` 다국어 메시지를 추가한다.
|
||||||
4. GREEN: `UserCreatorChatService.publishMessagePush`의 텍스트 분기만 새 키로 바꾼다.
|
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를 실행한다.
|
||||||
|
|||||||
@@ -9,6 +9,8 @@ DM Room에서 텍스트 메시지를 보냈을 때 상대방이 해당 채팅방
|
|||||||
- 새 한국어 문구는 기존 문구의 `문자메시지가`를 `DM이`로 바꾼다.
|
- 새 한국어 문구는 기존 문구의 `문자메시지가`를 `DM이`로 바꾼다.
|
||||||
- 새 메시지 키는 한국어, 영어, 일본어를 모두 제공한다.
|
- 새 메시지 키는 한국어, 영어, 일본어를 모두 제공한다.
|
||||||
- DM 음성 메시지 푸시는 기존 `message.fcm.voice_received`를 유지한다.
|
- DM 음성 메시지 푸시는 기존 `message.fcm.voice_received`를 유지한다.
|
||||||
|
- DM 텍스트 푸시(`message.fcm.dm_received`) 사용 시 푸시 제목을 새 키 `message.fcm.dm_title`("DM")로 표시한다.
|
||||||
|
- 음성 등 그 외 푸시 제목은 기존 `message.fcm.title`을 유지한다.
|
||||||
|
|
||||||
## 비범위
|
## 비범위
|
||||||
- FCM 발송 구조, deep link, 수신자 선정 로직은 변경하지 않는다.
|
- FCM 발송 구조, deep link, 수신자 선정 로직은 변경하지 않는다.
|
||||||
@@ -18,3 +20,5 @@ DM Room에서 텍스트 메시지를 보냈을 때 상대방이 해당 채팅방
|
|||||||
- 오프라인 DM 텍스트 메시지 푸시 이벤트가 새 DM 메시지 키를 사용한다.
|
- 오프라인 DM 텍스트 메시지 푸시 이벤트가 새 DM 메시지 키를 사용한다.
|
||||||
- `message.fcm.text_received`는 기존 값으로 남아 있다.
|
- `message.fcm.text_received`는 기존 값으로 남아 있다.
|
||||||
- 새 DM 메시지 키가 `Lang.KO`, `Lang.EN`, `Lang.JA`에서 조회된다.
|
- 새 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"으로 조회된다.
|
||||||
|
|||||||
@@ -1175,6 +1175,11 @@ class SodaMessageSource {
|
|||||||
Lang.EN to "You have received a DM from %s.",
|
Lang.EN to "You have received a DM from %s.",
|
||||||
Lang.JA to "%sからDMが届きました。"
|
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(
|
"message.fcm.voice_received" to mapOf(
|
||||||
Lang.KO to "%s님으로 부터 음성메시지가 도착했습니다.",
|
Lang.KO to "%s님으로 부터 음성메시지가 도착했습니다.",
|
||||||
Lang.EN to "You have received a voice message from %s.",
|
Lang.EN to "You have received a voice message from %s.",
|
||||||
|
|||||||
@@ -226,11 +226,16 @@ class UserCreatorChatService(
|
|||||||
} else {
|
} else {
|
||||||
"message.fcm.dm_received"
|
"message.fcm.dm_received"
|
||||||
}
|
}
|
||||||
|
val titleKey = if (messageKey == "message.fcm.dm_received") {
|
||||||
|
"message.fcm.dm_title"
|
||||||
|
} else {
|
||||||
|
"message.fcm.title"
|
||||||
|
}
|
||||||
applicationEventPublisher.publishEvent(
|
applicationEventPublisher.publishEvent(
|
||||||
FcmEvent(
|
FcmEvent(
|
||||||
type = FcmEventType.INDIVIDUAL,
|
type = FcmEventType.INDIVIDUAL,
|
||||||
category = PushNotificationCategory.MESSAGE,
|
category = PushNotificationCategory.MESSAGE,
|
||||||
titleKey = "message.fcm.title",
|
titleKey = titleKey,
|
||||||
messageKey = messageKey,
|
messageKey = messageKey,
|
||||||
senderMemberId = sender.id,
|
senderMemberId = sender.id,
|
||||||
args = listOf(sender.nickname),
|
args = listOf(sender.nickname),
|
||||||
|
|||||||
@@ -198,6 +198,7 @@ class UserCreatorChatServiceTest {
|
|||||||
Mockito.verify(eventPublisher).publishEvent(eventCaptor.capture())
|
Mockito.verify(eventPublisher).publishEvent(eventCaptor.capture())
|
||||||
assertEquals(FcmEventType.INDIVIDUAL, eventCaptor.value.type)
|
assertEquals(FcmEventType.INDIVIDUAL, eventCaptor.value.type)
|
||||||
assertEquals("message.fcm.dm_received", eventCaptor.value.messageKey)
|
assertEquals("message.fcm.dm_received", eventCaptor.value.messageKey)
|
||||||
|
assertEquals("message.fcm.dm_title", eventCaptor.value.titleKey)
|
||||||
assertEquals(listOf(2L), eventCaptor.value.recipients)
|
assertEquals(listOf(2L), eventCaptor.value.recipients)
|
||||||
assertEquals(null, eventCaptor.value.roomId)
|
assertEquals(null, eventCaptor.value.roomId)
|
||||||
assertEquals(null, eventCaptor.value.messageId)
|
assertEquals(null, eventCaptor.value.messageId)
|
||||||
@@ -231,6 +232,7 @@ class UserCreatorChatServiceTest {
|
|||||||
Mockito.verify(eventPublisher).publishEvent(eventCaptor.capture())
|
Mockito.verify(eventPublisher).publishEvent(eventCaptor.capture())
|
||||||
assertEquals(FcmEventType.INDIVIDUAL, eventCaptor.value.type)
|
assertEquals(FcmEventType.INDIVIDUAL, eventCaptor.value.type)
|
||||||
assertEquals("message.fcm.dm_received", eventCaptor.value.messageKey)
|
assertEquals("message.fcm.dm_received", eventCaptor.value.messageKey)
|
||||||
|
assertEquals("message.fcm.dm_title", eventCaptor.value.titleKey)
|
||||||
assertEquals(listOf(2L), eventCaptor.value.recipients)
|
assertEquals(listOf(2L), eventCaptor.value.recipients)
|
||||||
Mockito.verifyNoInteractions(roomMessageBroker)
|
Mockito.verifyNoInteractions(roomMessageBroker)
|
||||||
}
|
}
|
||||||
@@ -289,6 +291,7 @@ class UserCreatorChatServiceTest {
|
|||||||
Mockito.verify(eventPublisher).publishEvent(eventCaptor.capture())
|
Mockito.verify(eventPublisher).publishEvent(eventCaptor.capture())
|
||||||
assertEquals(FcmEventType.INDIVIDUAL, eventCaptor.value.type)
|
assertEquals(FcmEventType.INDIVIDUAL, eventCaptor.value.type)
|
||||||
assertEquals("message.fcm.voice_received", eventCaptor.value.messageKey)
|
assertEquals("message.fcm.voice_received", eventCaptor.value.messageKey)
|
||||||
|
assertEquals("message.fcm.title", eventCaptor.value.titleKey)
|
||||||
assertEquals(listOf(2L), eventCaptor.value.recipients)
|
assertEquals(listOf(2L), eventCaptor.value.recipients)
|
||||||
assertEquals(null, eventCaptor.value.roomId)
|
assertEquals(null, eventCaptor.value.roomId)
|
||||||
assertEquals(null, eventCaptor.value.messageId)
|
assertEquals(null, eventCaptor.value.messageId)
|
||||||
|
|||||||
Reference in New Issue
Block a user