Extract server info repo
This commit is contained in:
@@ -0,0 +1,11 @@
|
||||
package gq.kirmanak.mealient.data.baseurl
|
||||
|
||||
interface ServerInfoRepo {
|
||||
|
||||
suspend fun getUrl(): String?
|
||||
|
||||
suspend fun requireUrl(): String
|
||||
|
||||
suspend fun getVersion(): ServerVersion
|
||||
}
|
||||
|
||||
@@ -0,0 +1,47 @@
|
||||
package gq.kirmanak.mealient.data.baseurl
|
||||
|
||||
import gq.kirmanak.mealient.datasource.NetworkError
|
||||
import gq.kirmanak.mealient.logging.Logger
|
||||
import javax.inject.Inject
|
||||
import javax.inject.Singleton
|
||||
|
||||
@Singleton
|
||||
class ServerInfoRepoImpl @Inject constructor(
|
||||
private val serverInfoStorage: ServerInfoStorage,
|
||||
private val versionDataSource: VersionDataSource,
|
||||
private val logger: Logger,
|
||||
) : ServerInfoRepo {
|
||||
|
||||
override suspend fun getUrl(): String? {
|
||||
val result = serverInfoStorage.getBaseURL()
|
||||
logger.v { "getUrl() returned: $result" }
|
||||
return result
|
||||
}
|
||||
|
||||
override suspend fun requireUrl(): String {
|
||||
val result = checkNotNull(getUrl()) { "Server URL was null when it was required" }
|
||||
logger.v { "requireUrl() returned: $result" }
|
||||
return result
|
||||
}
|
||||
|
||||
override suspend fun getVersion(): ServerVersion {
|
||||
var version = serverInfoStorage.getServerVersion()
|
||||
val serverVersion = if (version == null) {
|
||||
logger.d { "getVersion: version is null, requesting" }
|
||||
version = versionDataSource.getVersionInfo(requireUrl()).version
|
||||
val result = determineServerVersion(version)
|
||||
serverInfoStorage.storeServerVersion(version)
|
||||
result
|
||||
} else {
|
||||
determineServerVersion(version)
|
||||
}
|
||||
logger.v { "getVersion() returned: $serverVersion from $version" }
|
||||
return serverVersion
|
||||
}
|
||||
|
||||
private fun determineServerVersion(version: String): ServerVersion = when {
|
||||
version.startsWith("v0") -> ServerVersion.V0
|
||||
version.startsWith("v1") -> ServerVersion.V1
|
||||
else -> throw NetworkError.NotMealie(IllegalStateException("Server version is unknown: $version"))
|
||||
}
|
||||
}
|
||||
@@ -1,11 +1,9 @@
|
||||
package gq.kirmanak.mealient.data.baseurl
|
||||
|
||||
interface BaseURLStorage {
|
||||
interface ServerInfoStorage {
|
||||
|
||||
suspend fun getBaseURL(): String?
|
||||
|
||||
suspend fun requireBaseURL(): String
|
||||
|
||||
suspend fun storeBaseURL(baseURL: String, version: String)
|
||||
|
||||
suspend fun storeServerVersion(version: String)
|
||||
@@ -0,0 +1,3 @@
|
||||
package gq.kirmanak.mealient.data.baseurl
|
||||
|
||||
enum class ServerVersion { V0, V1 }
|
||||
@@ -0,0 +1,37 @@
|
||||
package gq.kirmanak.mealient.data.baseurl
|
||||
|
||||
import gq.kirmanak.mealient.datasource.v0.MealieDataSourceV0
|
||||
import gq.kirmanak.mealient.datasource.v1.MealieDataSourceV1
|
||||
import gq.kirmanak.mealient.extensions.runCatchingExceptCancel
|
||||
import gq.kirmanak.mealient.extensions.toVersionInfo
|
||||
import kotlinx.coroutines.async
|
||||
import kotlinx.coroutines.awaitAll
|
||||
import kotlinx.coroutines.coroutineScope
|
||||
import javax.inject.Inject
|
||||
import javax.inject.Singleton
|
||||
|
||||
@Singleton
|
||||
class VersionDataSourceImpl @Inject constructor(
|
||||
private val v0Source: MealieDataSourceV0,
|
||||
private val v1Source: MealieDataSourceV1,
|
||||
) : VersionDataSource {
|
||||
|
||||
override suspend fun getVersionInfo(baseUrl: String): VersionInfo {
|
||||
val responses = coroutineScope {
|
||||
val v0Deferred = async {
|
||||
runCatchingExceptCancel { v0Source.getVersionInfo(baseUrl).toVersionInfo() }
|
||||
}
|
||||
val v1Deferred = async {
|
||||
runCatchingExceptCancel { v1Source.getVersionInfo(baseUrl).toVersionInfo() }
|
||||
}
|
||||
listOf(v0Deferred, v1Deferred).awaitAll()
|
||||
}
|
||||
val firstSuccess = responses.firstNotNullOfOrNull { it.getOrNull() }
|
||||
if (firstSuccess == null) {
|
||||
throw responses.firstNotNullOf { it.exceptionOrNull() }
|
||||
} else {
|
||||
return firstSuccess
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
@@ -1,15 +1,15 @@
|
||||
package gq.kirmanak.mealient.data.baseurl.impl
|
||||
|
||||
import androidx.datastore.preferences.core.Preferences
|
||||
import gq.kirmanak.mealient.data.baseurl.BaseURLStorage
|
||||
import gq.kirmanak.mealient.data.baseurl.ServerInfoStorage
|
||||
import gq.kirmanak.mealient.data.storage.PreferencesStorage
|
||||
import javax.inject.Inject
|
||||
import javax.inject.Singleton
|
||||
|
||||
@Singleton
|
||||
class BaseURLStorageImpl @Inject constructor(
|
||||
class ServerInfoStorageImpl @Inject constructor(
|
||||
private val preferencesStorage: PreferencesStorage,
|
||||
) : BaseURLStorage {
|
||||
) : ServerInfoStorage {
|
||||
|
||||
private val baseUrlKey: Preferences.Key<String>
|
||||
get() = preferencesStorage.baseUrlKey
|
||||
@@ -19,10 +19,6 @@ class BaseURLStorageImpl @Inject constructor(
|
||||
|
||||
override suspend fun getBaseURL(): String? = getValue(baseUrlKey)
|
||||
|
||||
override suspend fun requireBaseURL(): String = checkNotNull(getBaseURL()) {
|
||||
"Base URL was null when it was required"
|
||||
}
|
||||
|
||||
override suspend fun storeBaseURL(baseURL: String, version: String) {
|
||||
preferencesStorage.storeValues(
|
||||
Pair(baseUrlKey, baseURL),
|
||||
Reference in New Issue
Block a user