fix(#79): centralize retrofit error handling with NetworkResult
This commit is contained in:
1 parent
43df3c6e73
commit
508aea8bfa
22 files changed
+743
-738
No files matched your search
@@ -8,6 +8,8 @@ import com.m57.hermescontrol.data.local.HermesDatabase
|
||||
import com.m57.hermescontrol.data.local.toEntity
|
||||
import com.m57.hermescontrol.data.local.toUiModel
|
||||
import com.m57.hermescontrol.data.remote.ApiClient
|
||||
import com.m57.hermescontrol.data.remote.NetworkResult
|
||||
import com.m57.hermescontrol.data.remote.safeApiCall
|
||||
import com.m57.hermescontrol.data.ws.HermesWsClient
|
||||
import com.m57.hermescontrol.data.ws.WsEvent
|
||||
import com.m57.hermescontrol.data.ws.WsMethods
|
||||
@@ -423,10 +425,13 @@ class ChatViewModel(
|
||||
|
||||
"/status" -> {
|
||||
viewModelScope.launch {
|
||||
try {
|
||||
val response = withContext(Dispatchers.IO) { ApiClient.hermesApi.getStatus() }
|
||||
if (response.isSuccessful && response.body() != null) {
|
||||
val body = response.body()!!
|
||||
val result =
|
||||
withContext(Dispatchers.IO) {
|
||||
safeApiCall { ApiClient.hermesApi.getStatus() }
|
||||
}
|
||||
when (result) {
|
||||
is NetworkResult.Success -> {
|
||||
val body = result.data
|
||||
val platformsStr =
|
||||
body.gateway_platforms?.entries?.joinToString("\n") { (k, v) ->
|
||||
" • **$k**: ${v.state ?: "Unknown"}${if (v.error_code != null) " (Error: ${v.error_code})" else ""}"
|
||||
@@ -444,41 +449,45 @@ class ChatViewModel(
|
||||
$platformsStr
|
||||
""".trimIndent()
|
||||
addAssistantMessage(statusText)
|
||||
} else {
|
||||
addAssistantMessage("Failed to retrieve status: HTTP ${response.code()}")
|
||||
}
|
||||
} catch (e: Exception) {
|
||||
addAssistantMessage("Failed to retrieve status: ${e.message}")
|
||||
is NetworkResult.Failure -> {
|
||||
addAssistantMessage("Failed to retrieve status: ${result.error.message}")
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
"/sessions" -> {
|
||||
viewModelScope.launch {
|
||||
try {
|
||||
val response = withContext(Dispatchers.IO) { ApiClient.hermesApi.getSessions() }
|
||||
if (response.isSuccessful && response.body() != null) {
|
||||
val body = response.body()!!
|
||||
val result =
|
||||
withContext(Dispatchers.IO) {
|
||||
safeApiCall { ApiClient.hermesApi.getSessions() }
|
||||
}
|
||||
when (result) {
|
||||
is NetworkResult.Success -> {
|
||||
val body = result.data
|
||||
val sessionsStr =
|
||||
body.sessions.joinToString("\n") { s ->
|
||||
"• **${s.title ?: "Untitled"}** (ID: `${s.id}`, Messages: ${s.message_count ?: 0})"
|
||||
}
|
||||
addAssistantMessage("**Sessions List:**\n$sessionsStr")
|
||||
} else {
|
||||
addAssistantMessage("Failed to list sessions: HTTP ${response.code()}")
|
||||
}
|
||||
} catch (e: Exception) {
|
||||
addAssistantMessage("Failed to list sessions: ${e.message}")
|
||||
is NetworkResult.Failure -> {
|
||||
addAssistantMessage("Failed to list sessions: ${result.error.message}")
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
"/stats", "/system" -> {
|
||||
viewModelScope.launch {
|
||||
try {
|
||||
val response = withContext(Dispatchers.IO) { ApiClient.hermesApi.getSystemStats() }
|
||||
if (response.isSuccessful && response.body() != null) {
|
||||
val body = response.body()!!
|
||||
val result =
|
||||
withContext(Dispatchers.IO) {
|
||||
safeApiCall { ApiClient.hermesApi.getSystemStats() }
|
||||
}
|
||||
when (result) {
|
||||
is NetworkResult.Success -> {
|
||||
val body = result.data
|
||||
val cpuPct = body.cpuPercent?.let { String.format("%.1f%%", it) } ?: "N/A"
|
||||
val memPct = body.memoryPercent?.let { String.format("%.1f%%", it) } ?: "N/A"
|
||||
val uptimeVal = body.uptime ?: "N/A"
|
||||
@@ -490,11 +499,10 @@ class ChatViewModel(
|
||||
• **Uptime:** $uptimeVal
|
||||
""".trimIndent()
|
||||
addAssistantMessage(statsText)
|
||||
} else {
|
||||
addAssistantMessage("Failed to retrieve system stats: HTTP ${response.code()}")
|
||||
}
|
||||
} catch (e: Exception) {
|
||||
addAssistantMessage("Failed to retrieve system stats: ${e.message}")
|
||||
is NetworkResult.Failure -> {
|
||||
addAssistantMessage("Failed to retrieve system stats: ${result.error.message}")
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -584,13 +592,13 @@ class ChatViewModel(
|
||||
|
||||
private fun loadSessionMessages(sessionId: String) {
|
||||
viewModelScope.launch {
|
||||
try {
|
||||
val response =
|
||||
withContext(Dispatchers.IO) {
|
||||
ApiClient.hermesApi.getSessionMessages(sessionId)
|
||||
}
|
||||
if (response.isSuccessful) {
|
||||
val messagesList = response.body()?.messages.orEmpty()
|
||||
val result =
|
||||
withContext(Dispatchers.IO) {
|
||||
safeApiCall { ApiClient.hermesApi.getSessionMessages(sessionId) }
|
||||
}
|
||||
when (result) {
|
||||
is NetworkResult.Success -> {
|
||||
val messagesList = result.data.messages.orEmpty()
|
||||
val chatMessages =
|
||||
messagesList.map { msg ->
|
||||
val role =
|
||||
@@ -618,21 +626,15 @@ class ChatViewModel(
|
||||
isLoading = false,
|
||||
)
|
||||
}
|
||||
} else {
|
||||
}
|
||||
is NetworkResult.Failure -> {
|
||||
_uiState.update {
|
||||
it.copy(
|
||||
isLoading = false,
|
||||
errorMessage = "Failed to load messages: HTTP ${response.code()}",
|
||||
errorMessage = "Failed to load messages: ${result.error.message}",
|
||||
)
|
||||
}
|
||||
}
|
||||
} catch (e: Exception) {
|
||||
_uiState.update {
|
||||
it.copy(
|
||||
isLoading = false,
|
||||
errorMessage = "Failed to load messages: ${e.message}",
|
||||
)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in new issue
Block a user