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

This commit is contained in:
James Rich 2025-05-25 20:41:49 -05:00 committed by GitHub
parent be437ebb91
commit 139a17f22f
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
5 changed files with 13 additions and 8 deletions

View file

@ -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

View file

@ -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

View file

@ -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))
}
}
}

View file

@ -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()
}
}

View file

@ -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()
}
}