diff --git a/core/data/src/test/java/com/afternote/core/data/repoimpl/ReceiverRequestFailureTest.kt b/core/data/src/test/java/com/afternote/core/data/repoimpl/ReceiverRequestFailureTest.kt index ae59f89b5f..92dad14d76 100644 --- a/core/data/src/test/java/com/afternote/core/data/repoimpl/ReceiverRequestFailureTest.kt +++ b/core/data/src/test/java/com/afternote/core/data/repoimpl/ReceiverRequestFailureTest.kt @@ -67,7 +67,8 @@ class ReceiverRequestFailureTest { assertTrue(result is ReceiverRequestRejectedException) val domainError = result as ReceiverRequestRejectedException - assertEquals("수신자 이메일은 필수입니다.", domainError.userMessage) + // 서버 원문은 접근자가 아니라 진단용 message 로만 남는다 — 화면 문구는 소비처가 타입만 보고 고른다. + assertEquals("수신자 이메일은 필수입니다.", domainError.message) assertSame(apiError, domainError.cause) } diff --git a/core/domain/src/main/java/com/afternote/core/domain/error/ReceiverRequestRejectedException.kt b/core/domain/src/main/java/com/afternote/core/domain/error/ReceiverRequestRejectedException.kt index 8924769955..f579d3df76 100644 --- a/core/domain/src/main/java/com/afternote/core/domain/error/ReceiverRequestRejectedException.kt +++ b/core/domain/src/main/java/com/afternote/core/domain/error/ReceiverRequestRejectedException.kt @@ -1,7 +1,20 @@ package com.afternote.core.domain.error -/** 사용자가 입력을 수정해 해결할 수 있는 수신자 등록·수정 요청 오류. */ +/** + * 사용자가 입력을 수정해 해결할 수 있는 수신자 등록·수정 요청 오류. + * + * **서버 원문을 접근자로 열지 않는다.** 서버 `message` 는 사용자 노출용이라는 규정이 없고(BE#92), + * 그건 [CoreAuthFailure] 와 수신자 흐름의 `ReceiverFailure` 루트가 이미 세운 규약이다. public + * 접근자로 열어 두면 어느 모듈이든 그 값을 그대로 화면에 실을 수 있다. 소비처는 값이 아니라 + * **타입만** 보고 로컬 리소스를 고른다(setting 의 `Throwable.toReceiverFailureMessage`). + * + * 원문은 진단용으로 `message` 에만 남는다. 리포팅 백엔드에는 닿지 않는다 — `core:common` 의 + * `ErrorReporter` 가 message 를 타입 이름으로 갈아치운 사본만 올린다. + * + * @param serverMessage 서버가 내려준 거절 사유 원문. 진단 문구로만 쓴다. + * @param cause 이 실패를 만든 인프라 예외. + */ class ReceiverRequestRejectedException( - val userMessage: String, + serverMessage: String, cause: Throwable, -) : Exception(userMessage, cause) +) : Exception(serverMessage, cause) diff --git a/feature/setting/presentation/src/main/kotlin/com/afternote/feature/setting/presentation/viewmodel/ReceiverFailureMessage.kt b/feature/setting/presentation/src/main/kotlin/com/afternote/feature/setting/presentation/viewmodel/ReceiverFailureMessage.kt index f4538178f3..a4c5fb8b31 100644 --- a/feature/setting/presentation/src/main/kotlin/com/afternote/feature/setting/presentation/viewmodel/ReceiverFailureMessage.kt +++ b/feature/setting/presentation/src/main/kotlin/com/afternote/feature/setting/presentation/viewmodel/ReceiverFailureMessage.kt @@ -6,9 +6,12 @@ import com.afternote.core.ui.UiText import com.afternote.feature.setting.presentation.R /** - * [ReceiverRequestRejectedException.userMessage] 는 서버 원문이라 사용자 화면에 직접 노출하지 - * 않는다(리포팅·로그 용도로만 예외에 남긴다) — feature/receiver 의 ReceiverFailureTranslation.kt - * 이 확정한 선례(#1339)와 같은 규칙이다. + * [ReceiverRequestRejectedException] 은 **타입만** 보고 문구를 고른다. 그 예외가 나르는 서버 원문은 + * 사용자 화면에 노출하지 않으므로(BE#92 — 서버 `message` 는 사용자 노출용이라는 규정이 없다), 표시 + * 문구는 여기 로컬 리소스가 갖는다 — feature/receiver 의 ReceiverFailureTranslation.kt 이 확정한 + * 선례(#1339)와 같은 규칙이다. + * + * 그래서 그 예외는 원문을 읽을 접근자를 두지 않는다. 값은 진단용 `message` 에만 남는다. */ internal fun Throwable.toReceiverFailureMessage( @StringRes fallbackResId: Int,