Check version when requesting recipes

This commit is contained in:
Kirill Kamakin
2022-10-29 17:09:42 +02:00
parent 1502d3db9d
commit 17fc2f62bd
9 changed files with 32 additions and 16 deletions

View File

@@ -6,5 +6,7 @@ interface BaseURLStorage {
suspend fun requireBaseURL(): String
suspend fun storeBaseURL(baseURL: String)
suspend fun storeBaseURL(baseURL: String, version: String)
suspend fun getServerVersion(): String?
}

View File

@@ -14,13 +14,23 @@ class BaseURLStorageImpl @Inject constructor(
private val baseUrlKey: Preferences.Key<String>
get() = preferencesStorage.baseUrlKey
override suspend fun getBaseURL(): String? = preferencesStorage.getValue(baseUrlKey)
private val serverVersionKey: Preferences.Key<String>
get() = preferencesStorage.serverVersionKey
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) {
preferencesStorage.storeValues(Pair(baseUrlKey, baseURL))
override suspend fun storeBaseURL(baseURL: String, version: String) {
preferencesStorage.storeValues(
Pair(baseUrlKey, baseURL),
Pair(serverVersionKey, version),
)
}
override suspend fun getServerVersion(): String? = getValue(serverVersionKey)
private suspend fun <T> getValue(key: Preferences.Key<T>): T? = preferencesStorage.getValue(key)
}

View File

@@ -41,7 +41,9 @@ class MealieDataSourceWrapper @Inject constructor(
override suspend fun requestRecipes(start: Int, limit: Int): List<GetRecipeSummaryResponseV1> =
withAuthHeader { token ->
runCatchingExceptCancel {
if (isV1()) {
mealieDataSourceV1.requestRecipes(getUrl(), token, start, limit)
} else {
mealieDataSource.requestRecipes(getUrl(), token, start, limit).map {
GetRecipeSummaryResponseV1(
remoteId = it.remoteId.toString(),
@@ -56,12 +58,6 @@ class MealieDataSourceWrapper @Inject constructor(
dateUpdated = it.dateUpdated,
)
}
}.getOrElse {
if (it is NetworkError.NotMealie) {
mealieDataSourceV1.requestRecipes(getUrl(), token, start, limit)
} else {
throw it
}
}
}
@@ -70,6 +66,8 @@ class MealieDataSourceWrapper @Inject constructor(
private suspend fun getUrl() = baseURLStorage.requireBaseURL()
private suspend fun isV1() = baseURLStorage.getServerVersion().orEmpty().startsWith("v1")
private suspend inline fun <T> withAuthHeader(block: (String?) -> T): T =
runCatching { block(authRepo.getAuthHeader()) }.getOrElse {
if (it is NetworkError.Unauthorized) {

View File

@@ -7,6 +7,8 @@ interface PreferencesStorage {
val baseUrlKey: Preferences.Key<String>
val serverVersionKey: Preferences.Key<String>
val isDisclaimerAcceptedKey: Preferences.Key<Boolean>
suspend fun <T> getValue(key: Preferences.Key<T>): T?

View File

@@ -18,6 +18,8 @@ class PreferencesStorageImpl @Inject constructor(
override val baseUrlKey = stringPreferencesKey("baseUrl")
override val serverVersionKey = stringPreferencesKey("serverVersion")
override val isDisclaimerAcceptedKey = booleanPreferencesKey("isDisclaimedAccepted")
override suspend fun <T> getValue(key: Preferences.Key<T>): T? {