diff --git a/app/src/androidTest/java/com/afternote/afternote_fe/TimeLetterMindRecordCompletionAndroidTest.kt b/app/src/androidTest/java/com/afternote/afternote_fe/TimeLetterMindRecordCompletionAndroidTest.kt index fc5996f016..4950dfcfeb 100644 --- a/app/src/androidTest/java/com/afternote/afternote_fe/TimeLetterMindRecordCompletionAndroidTest.kt +++ b/app/src/androidTest/java/com/afternote/afternote_fe/TimeLetterMindRecordCompletionAndroidTest.kt @@ -534,8 +534,7 @@ class TimeLetterMindRecordCompletionAndroidTest { assertEquals("
완성한 본문
", update.second.content) assertEquals(false, update.second.isDraft) assertEquals(TodayMood.SOSO, update.second.todayMood) - assertEquals(draftDate.toString(), update.second.date) - assertEquals("https://afternote.test/draft.jpg", update.second.imageUrl) + // date·imageUrl 은 수정 요청 계약에 없어 페이로드에서 걷었다 (#955). assertTrue(repository.createCalls.isEmpty()) assertEquals(2, repository.listCalls.size) assertTrue(repository.listCalls.all { it == currentMonth.toString() to true }) @@ -869,9 +868,7 @@ private class CompletionDiaryRepository( diary.copy( title = payload.title, content = payload.content, - date = payload.date, todayMood = payload.todayMood, - imageUrl = payload.imageUrl, isDraft = payload.isDraft, ) } else { diff --git a/feature/mindrecord/data/src/main/kotlin/com/afternote/feature/mindrecord/data/dto/DiaryDto.kt b/feature/mindrecord/data/src/main/kotlin/com/afternote/feature/mindrecord/data/dto/DiaryDto.kt index 5826c340d8..0be1f15d5b 100644 --- a/feature/mindrecord/data/src/main/kotlin/com/afternote/feature/mindrecord/data/dto/DiaryDto.kt +++ b/feature/mindrecord/data/src/main/kotlin/com/afternote/feature/mindrecord/data/dto/DiaryDto.kt @@ -38,8 +38,8 @@ data class DiaryUpdateRequestDto( @SerialName("content") val content: String, @SerialName("isDraft") val isDraft: Boolean, @SerialName("todayMood") val todayMood: TodayMoodDto, - @SerialName("date") val date: String, - @SerialName("imageUrl") val imageUrl: String?, + /** null 이면 기존 수신자 유지, 빈 목록이면 전체 해제 (서버 규칙). */ + @SerialName("receiverIds") val receiverIds: List본문
", + isDraft = false, + todayMood = TodayMood.HAPPY, + receiverIds = receiverIds, + ).toRequest(), + ) + + @Test + fun `고른 수신자가 요청 본문에 실린다`() { + assertTrue(bodyOf(listOf(17L, 18L)).contains("\"receiverIds\":[17,18]")) + } + + @Test + fun `수신자를 안 골랐으면 receiverIds 를 아예 보내지 않는다`() { + // 서버는 빈 목록을 "전체 해제" 로 읽는다. 안 고른 것을 해제로 보내면 수신자를 + // 건드리지 않은 편집이 기존 지정을 지운다. + assertFalse(bodyOf(null).contains("receiverIds")) + } + + @Test + fun `서버 스키마에 없는 date 는 보내지 않는다`() { + assertFalse(bodyOf(null).contains("\"date\"")) + } + + @Test + fun `나머지 필드는 그대로 실린다`() { + val body = + json.encodeToString( + DiaryUpdatePayload( + title = "제목", + content = "본문
", + isDraft = true, + todayMood = TodayMood.SAD, + receiverIds = listOf(17L), + ).toRequest(), + ) + + assertTrue(body.contains("\"title\":\"제목\"")) + assertTrue(body.contains("\"content\":\"본문
\"")) + assertTrue(body.contains("\"isDraft\":true")) + assertTrue(body.contains("\"todayMood\":\"SAD\"")) + assertTrue(body.contains("\"receiverIds\":[17]")) + } + + @Test + fun `서버 스키마에 없는 imageUrl 도 보내지 않는다`() { + // date 를 뺀 근거가 그대로 적용된다 — BE `DiaryUpdateRequest` 는 + // [title, content, isDraft, todayMood, receiverIds] 뿐이고 `Diary.imageUrl` 에 + // 대입하는 코드도 없다. 화면이 이미지를 붙인 편집에서만 실려 나가던 자리다. + assertFalse(bodyOf(null).contains("\"imageUrl\"")) + } +} diff --git a/feature/mindrecord/domain/src/main/kotlin/com/afternote/feature/mindrecord/domain/model/DiaryModels.kt b/feature/mindrecord/domain/src/main/kotlin/com/afternote/feature/mindrecord/domain/model/DiaryModels.kt index 9ac8f68e14..245b2b5f6c 100644 --- a/feature/mindrecord/domain/src/main/kotlin/com/afternote/feature/mindrecord/domain/model/DiaryModels.kt +++ b/feature/mindrecord/domain/src/main/kotlin/com/afternote/feature/mindrecord/domain/model/DiaryModels.kt @@ -40,6 +40,12 @@ data class DiaryUpdatePayload( val content: String, val isDraft: Boolean, val todayMood: TodayMood, - val date: String, - val imageUrl: String? = null, + /** + * 이 일기를 전달받을 수신자 ID 목록. 생성 경로와 같은 형태다 (#955). + * + * 서버 규칙: **null 이면 기존 수신자를 그대로 두고, 빈 목록이면 전체 해제**한다 (실측). + * 그래서 "고른 게 없음" 을 빈 목록으로 보내면 안 된다 — 수신자를 건드리지 않은 편집이 + * 기존 지정을 지워 버린다. + */ + val receiverIds: List