fix: Distinguish between an empty response and a network error (#1938)

pull/1937/head
James Rich 2025-05-25 20:41:49 -05:00 zatwierdzone przez GitHub
rodzic be437ebb91
commit 139a17f22f
Nie znaleziono w bazie danych klucza dla tego podpisu
ID klucza GPG: B5690EEEBB952194
5 zmienionych plików z 13 dodań i 8 usunięć

Wyświetl plik

@ -52,7 +52,9 @@ class DeviceHardwareRepository @Inject constructor(
}
try {
debug("Fetching device hardware from server")
localDataSource.insertAllDeviceHardware(apiDataSource.getAllDeviceHardware())
val deviceHardware = apiDataSource.getAllDeviceHardware()
?: throw IOException("empty response from server")
localDataSource.insertAllDeviceHardware(deviceHardware)
val cachedHardware = localDataSource.getByHwModel(hwModel)
val externalModel = cachedHardware?.asExternalModel()
return@withContext externalModel

Wyświetl plik

@ -61,6 +61,7 @@ class FirmwareReleaseRepository @Inject constructor(
try {
debug("Fetching firmware releases from server")
val networkFirmwareReleases = apiDataSource.getFirmwareReleases()
?: throw IOException("empty response from server")
val releases = when (releaseType) {
FirmwareReleaseType.STABLE -> networkFirmwareReleases.releases.stable
FirmwareReleaseType.ALPHA -> networkFirmwareReleases.releases.alpha

Wyświetl plik

@ -19,17 +19,19 @@ package com.geeksville.mesh.network.retrofit
import com.geeksville.mesh.network.model.NetworkDeviceHardware
import com.geeksville.mesh.network.model.NetworkFirmwareReleases
import okhttp3.ResponseBody.Companion.toResponseBody
import retrofit2.Response
import javax.inject.Inject
import javax.inject.Singleton
private const val ERROR_NO_OP = 420
@Singleton
class NoOpApiService@Inject constructor() : ApiService {
override suspend fun getDeviceHardware(): Response<List<NetworkDeviceHardware>> {
return Response.success(emptyList())
return Response.error(ERROR_NO_OP, "Not Found".toResponseBody(null))
}
override suspend fun getFirmwareReleases(): Response<NetworkFirmwareReleases> {
return Response.success(NetworkFirmwareReleases(emptyList()))
return Response.error(ERROR_NO_OP, "Not Found".toResponseBody(null))
}
}
}

Wyświetl plik

@ -26,7 +26,7 @@ import javax.inject.Inject
class DeviceHardwareRemoteDataSource @Inject constructor(
private val apiService: ApiService,
) {
suspend fun getAllDeviceHardware(): List<NetworkDeviceHardware> = withContext(Dispatchers.IO) {
apiService.getDeviceHardware().body() ?: emptyList()
suspend fun getAllDeviceHardware(): List<NetworkDeviceHardware>? = withContext(Dispatchers.IO) {
apiService.getDeviceHardware().body()
}
}

Wyświetl plik

@ -26,7 +26,7 @@ import javax.inject.Inject
class FirmwareReleaseRemoteDataSource @Inject constructor(
private val apiService: ApiService,
) {
suspend fun getFirmwareReleases(): NetworkFirmwareReleases = withContext(Dispatchers.IO) {
apiService.getFirmwareReleases().body() ?: NetworkFirmwareReleases()
suspend fun getFirmwareReleases(): NetworkFirmwareReleases? = withContext(Dispatchers.IO) {
apiService.getFirmwareReleases().body()
}
}