Check version when requesting recipes
This commit is contained in:
@@ -6,5 +6,7 @@ interface BaseURLStorage {
|
|||||||
|
|
||||||
suspend fun requireBaseURL(): String
|
suspend fun requireBaseURL(): String
|
||||||
|
|
||||||
suspend fun storeBaseURL(baseURL: String)
|
suspend fun storeBaseURL(baseURL: String, version: String)
|
||||||
|
|
||||||
|
suspend fun getServerVersion(): String?
|
||||||
}
|
}
|
||||||
@@ -14,13 +14,23 @@ class BaseURLStorageImpl @Inject constructor(
|
|||||||
private val baseUrlKey: Preferences.Key<String>
|
private val baseUrlKey: Preferences.Key<String>
|
||||||
get() = preferencesStorage.baseUrlKey
|
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()) {
|
override suspend fun requireBaseURL(): String = checkNotNull(getBaseURL()) {
|
||||||
"Base URL was null when it was required"
|
"Base URL was null when it was required"
|
||||||
}
|
}
|
||||||
|
|
||||||
override suspend fun storeBaseURL(baseURL: String) {
|
override suspend fun storeBaseURL(baseURL: String, version: String) {
|
||||||
preferencesStorage.storeValues(Pair(baseUrlKey, baseURL))
|
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)
|
||||||
}
|
}
|
||||||
@@ -41,7 +41,9 @@ class MealieDataSourceWrapper @Inject constructor(
|
|||||||
|
|
||||||
override suspend fun requestRecipes(start: Int, limit: Int): List<GetRecipeSummaryResponseV1> =
|
override suspend fun requestRecipes(start: Int, limit: Int): List<GetRecipeSummaryResponseV1> =
|
||||||
withAuthHeader { token ->
|
withAuthHeader { token ->
|
||||||
runCatchingExceptCancel {
|
if (isV1()) {
|
||||||
|
mealieDataSourceV1.requestRecipes(getUrl(), token, start, limit)
|
||||||
|
} else {
|
||||||
mealieDataSource.requestRecipes(getUrl(), token, start, limit).map {
|
mealieDataSource.requestRecipes(getUrl(), token, start, limit).map {
|
||||||
GetRecipeSummaryResponseV1(
|
GetRecipeSummaryResponseV1(
|
||||||
remoteId = it.remoteId.toString(),
|
remoteId = it.remoteId.toString(),
|
||||||
@@ -56,12 +58,6 @@ class MealieDataSourceWrapper @Inject constructor(
|
|||||||
dateUpdated = it.dateUpdated,
|
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 getUrl() = baseURLStorage.requireBaseURL()
|
||||||
|
|
||||||
|
private suspend fun isV1() = baseURLStorage.getServerVersion().orEmpty().startsWith("v1")
|
||||||
|
|
||||||
private suspend inline fun <T> withAuthHeader(block: (String?) -> T): T =
|
private suspend inline fun <T> withAuthHeader(block: (String?) -> T): T =
|
||||||
runCatching { block(authRepo.getAuthHeader()) }.getOrElse {
|
runCatching { block(authRepo.getAuthHeader()) }.getOrElse {
|
||||||
if (it is NetworkError.Unauthorized) {
|
if (it is NetworkError.Unauthorized) {
|
||||||
|
|||||||
@@ -7,6 +7,8 @@ interface PreferencesStorage {
|
|||||||
|
|
||||||
val baseUrlKey: Preferences.Key<String>
|
val baseUrlKey: Preferences.Key<String>
|
||||||
|
|
||||||
|
val serverVersionKey: Preferences.Key<String>
|
||||||
|
|
||||||
val isDisclaimerAcceptedKey: Preferences.Key<Boolean>
|
val isDisclaimerAcceptedKey: Preferences.Key<Boolean>
|
||||||
|
|
||||||
suspend fun <T> getValue(key: Preferences.Key<T>): T?
|
suspend fun <T> getValue(key: Preferences.Key<T>): T?
|
||||||
|
|||||||
@@ -18,6 +18,8 @@ class PreferencesStorageImpl @Inject constructor(
|
|||||||
|
|
||||||
override val baseUrlKey = stringPreferencesKey("baseUrl")
|
override val baseUrlKey = stringPreferencesKey("baseUrl")
|
||||||
|
|
||||||
|
override val serverVersionKey = stringPreferencesKey("serverVersion")
|
||||||
|
|
||||||
override val isDisclaimerAcceptedKey = booleanPreferencesKey("isDisclaimedAccepted")
|
override val isDisclaimerAcceptedKey = booleanPreferencesKey("isDisclaimedAccepted")
|
||||||
|
|
||||||
override suspend fun <T> getValue(key: Preferences.Key<T>): T? {
|
override suspend fun <T> getValue(key: Preferences.Key<T>): T? {
|
||||||
|
|||||||
@@ -35,8 +35,8 @@ class BaseURLViewModel @Inject constructor(
|
|||||||
logger.v { "checkBaseURL() called with: baseURL = $baseURL" }
|
logger.v { "checkBaseURL() called with: baseURL = $baseURL" }
|
||||||
val result = runCatchingExceptCancel {
|
val result = runCatchingExceptCancel {
|
||||||
// If it returns proper version info then it must be a Mealie
|
// If it returns proper version info then it must be a Mealie
|
||||||
versionDataSource.getVersionInfo(baseURL)
|
val version = versionDataSource.getVersionInfo(baseURL).version
|
||||||
baseURLStorage.storeBaseURL(baseURL)
|
baseURLStorage.storeBaseURL(baseURL, version)
|
||||||
}
|
}
|
||||||
logger.i { "checkBaseURL: result is $result" }
|
logger.i { "checkBaseURL: result is $result" }
|
||||||
_uiState.value = OperationUiState.fromResult(result)
|
_uiState.value = OperationUiState.fromResult(result)
|
||||||
|
|||||||
@@ -57,7 +57,7 @@ class BaseURLStorageImplTest {
|
|||||||
|
|
||||||
@Test
|
@Test
|
||||||
fun `when storeBaseURL then calls preferences storage`() = runTest {
|
fun `when storeBaseURL then calls preferences storage`() = runTest {
|
||||||
subject.storeBaseURL("baseUrl")
|
subject.storeBaseURL("baseUrl", "v0.5.6")
|
||||||
coVerify {
|
coVerify {
|
||||||
preferencesStorage.baseUrlKey
|
preferencesStorage.baseUrlKey
|
||||||
preferencesStorage.storeValues(eq(Pair(baseUrlKey, "baseUrl")))
|
preferencesStorage.storeValues(eq(Pair(baseUrlKey, "baseUrl")))
|
||||||
|
|||||||
@@ -7,4 +7,5 @@ object AuthImplTestData {
|
|||||||
const val TEST_TOKEN = "TEST_TOKEN"
|
const val TEST_TOKEN = "TEST_TOKEN"
|
||||||
const val TEST_AUTH_HEADER = "Bearer TEST_TOKEN"
|
const val TEST_AUTH_HEADER = "Bearer TEST_TOKEN"
|
||||||
const val TEST_URL = "TEST_URL"
|
const val TEST_URL = "TEST_URL"
|
||||||
|
const val TEST_VERSION = "v0.5.6"
|
||||||
}
|
}
|
||||||
@@ -5,6 +5,7 @@ import gq.kirmanak.mealient.data.baseurl.VersionDataSource
|
|||||||
import gq.kirmanak.mealient.data.baseurl.VersionInfo
|
import gq.kirmanak.mealient.data.baseurl.VersionInfo
|
||||||
import gq.kirmanak.mealient.logging.Logger
|
import gq.kirmanak.mealient.logging.Logger
|
||||||
import gq.kirmanak.mealient.test.AuthImplTestData.TEST_BASE_URL
|
import gq.kirmanak.mealient.test.AuthImplTestData.TEST_BASE_URL
|
||||||
|
import gq.kirmanak.mealient.test.AuthImplTestData.TEST_VERSION
|
||||||
import gq.kirmanak.mealient.test.RobolectricTest
|
import gq.kirmanak.mealient.test.RobolectricTest
|
||||||
import io.mockk.MockKAnnotations
|
import io.mockk.MockKAnnotations
|
||||||
import io.mockk.coEvery
|
import io.mockk.coEvery
|
||||||
@@ -40,9 +41,9 @@ class BaseURLViewModelTest : RobolectricTest() {
|
|||||||
fun `when saveBaseUrl and getVersionInfo returns result then saves to storage`() = runTest {
|
fun `when saveBaseUrl and getVersionInfo returns result then saves to storage`() = runTest {
|
||||||
coEvery {
|
coEvery {
|
||||||
versionDataSource.getVersionInfo(eq(TEST_BASE_URL))
|
versionDataSource.getVersionInfo(eq(TEST_BASE_URL))
|
||||||
} returns VersionInfo(true, "0.5.6", true)
|
} returns VersionInfo(TEST_VERSION)
|
||||||
subject.saveBaseUrl(TEST_BASE_URL)
|
subject.saveBaseUrl(TEST_BASE_URL)
|
||||||
advanceUntilIdle()
|
advanceUntilIdle()
|
||||||
coVerify { baseURLStorage.storeBaseURL(eq(TEST_BASE_URL)) }
|
coVerify { baseURLStorage.storeBaseURL(eq(TEST_BASE_URL), eq(TEST_VERSION)) }
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
Reference in New Issue
Block a user