Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -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)
}

Expand Down
Original file line number Diff line number Diff line change
@@ -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)
Original file line number Diff line number Diff line change
Expand Up @@ -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,
Expand Down
Loading