diff --git a/shared/src/commonMain/kotlin/friends/mobile/core/domain/model/UserFriendlyError.kt b/shared/src/commonMain/kotlin/friends/mobile/core/domain/model/UserFriendlyError.kt index 15e0e8e..da20099 100644 --- a/shared/src/commonMain/kotlin/friends/mobile/core/domain/model/UserFriendlyError.kt +++ b/shared/src/commonMain/kotlin/friends/mobile/core/domain/model/UserFriendlyError.kt @@ -11,35 +11,26 @@ object ErrorMessages { const val UNKNOWN = "Произошла неизвестная ошибка" } -sealed class UserFriendlyError { - data object Network : UserFriendlyError() - data object Unauthorized : UserFriendlyError() - data object Forbidden : UserFriendlyError() - data object NotFound : UserFriendlyError() - data object Conflict : UserFriendlyError() - data object ClientError : UserFriendlyError() - data object Server : UserFriendlyError() - data object Unknown : UserFriendlyError() +sealed class UserFriendlyError(open val message: String) { + data class Network(override val message: String = ErrorMessages.NETWORK) : UserFriendlyError(message) + data class Unauthorized(override val message: String = ErrorMessages.UNAUTHORIZED) : UserFriendlyError(message) + data class Forbidden(override val message: String = ErrorMessages.FORBIDDEN) : UserFriendlyError(message) + data class NotFound(override val message: String = ErrorMessages.NOT_FOUND) : UserFriendlyError(message) + data class Conflict(override val message: String = ErrorMessages.CONFLICT) : UserFriendlyError(message) + data class ClientError(override val message: String = ErrorMessages.CLIENT_ERROR) : UserFriendlyError(message) + data class Server(override val message: String = ErrorMessages.SERVER_ERROR) : UserFriendlyError(message) + data class Unknown(override val message: String = ErrorMessages.UNKNOWN) : UserFriendlyError(message) } fun mapApiErrorToUserFriendly(error: ApiError): UserFriendlyError = when (error.code) { - 401 -> UserFriendlyError.Unauthorized - 403 -> UserFriendlyError.Forbidden - 404 -> UserFriendlyError.NotFound - 409 -> UserFriendlyError.Conflict - in 400..499 -> UserFriendlyError.ClientError - in 500..599 -> UserFriendlyError.Server - -1 -> UserFriendlyError.Network - else -> UserFriendlyError.Unknown + 401 -> UserFriendlyError.Unauthorized(error.message) + 403 -> UserFriendlyError.Forbidden(error.message) + 404 -> UserFriendlyError.NotFound(error.message) + 409 -> UserFriendlyError.Conflict(error.message) + in 400..499 -> UserFriendlyError.ClientError(error.message) + in 500..599 -> UserFriendlyError.Server(error.message) + -1 -> UserFriendlyError.Network(error.message) + else -> UserFriendlyError.Unknown(error.message) } -fun getErrorMessage(error: UserFriendlyError): String = when (error) { - UserFriendlyError.Network -> ErrorMessages.NETWORK - UserFriendlyError.Unauthorized -> ErrorMessages.UNAUTHORIZED - UserFriendlyError.Forbidden -> ErrorMessages.FORBIDDEN - UserFriendlyError.NotFound -> ErrorMessages.NOT_FOUND - UserFriendlyError.Conflict -> ErrorMessages.CONFLICT - UserFriendlyError.ClientError -> ErrorMessages.CLIENT_ERROR - UserFriendlyError.Server -> ErrorMessages.SERVER_ERROR - UserFriendlyError.Unknown -> ErrorMessages.UNKNOWN -} +fun getErrorMessage(error: UserFriendlyError): String = error.message diff --git a/shared/src/commonMain/kotlin/friends/mobile/core/network/SafeApiCall.kt b/shared/src/commonMain/kotlin/friends/mobile/core/network/SafeApiCall.kt index cb14350..02e8ce7 100644 --- a/shared/src/commonMain/kotlin/friends/mobile/core/network/SafeApiCall.kt +++ b/shared/src/commonMain/kotlin/friends/mobile/core/network/SafeApiCall.kt @@ -2,6 +2,7 @@ package friends.mobile.core.network import friends.mobile.core.domain.model.ApiError import friends.mobile.core.domain.model.ResultWrapper +import io.ktor.client.call.body import io.ktor.client.plugins.ResponseException import kotlinx.coroutines.TimeoutCancellationException import kotlinx.io.IOException @@ -21,17 +22,21 @@ suspend fun safeApiCall(apiCall: suspend () -> T): ResultWrapper { } catch (e: ResponseException) { val code = e.response.status.value - val message = when (code) { - in CLIENT_ERROR_RANGE -> { - "Ошибка запроса: ${e.message}" - } - - in SERVER_ERROR_RANGE -> { - "Ошибка сервера: ${e.message}" - } - - else -> { - e.message ?: "HTTP error" + val message = try { + e.response.body() + } catch (_: Exception) { + when (code) { + in CLIENT_ERROR_RANGE -> { + "Ошибка запроса" + } + + in SERVER_ERROR_RANGE -> { + "Ошибка сервера" + } + + else -> { + "HTTP error" + } } }