From 17fc2f62bd98bc354cdd7b8122702b1f704eb561 Mon Sep 17 00:00:00 2001 From: Kirill Kamakin Date: Sat, 29 Oct 2022 17:09:42 +0200 Subject: [PATCH] Check version when requesting recipes --- .../mealient/data/baseurl/BaseURLStorage.kt | 4 +++- .../data/baseurl/impl/BaseURLStorageImpl.kt | 16 +++++++++++++--- .../data/network/MealieDataSourceWrapper.kt | 12 +++++------- .../mealient/data/storage/PreferencesStorage.kt | 2 ++ .../data/storage/PreferencesStorageImpl.kt | 2 ++ .../mealient/ui/baseurl/BaseURLViewModel.kt | 4 ++-- .../data/baseurl/BaseURLStorageImplTest.kt | 2 +- .../kirmanak/mealient/test/AuthImplTestData.kt | 1 + .../mealient/ui/baseurl/BaseURLViewModelTest.kt | 5 +++-- 9 files changed, 32 insertions(+), 16 deletions(-) diff --git a/app/src/main/java/gq/kirmanak/mealient/data/baseurl/BaseURLStorage.kt b/app/src/main/java/gq/kirmanak/mealient/data/baseurl/BaseURLStorage.kt index 7864ea9..4c0bcee 100644 --- a/app/src/main/java/gq/kirmanak/mealient/data/baseurl/BaseURLStorage.kt +++ b/app/src/main/java/gq/kirmanak/mealient/data/baseurl/BaseURLStorage.kt @@ -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? } \ No newline at end of file diff --git a/app/src/main/java/gq/kirmanak/mealient/data/baseurl/impl/BaseURLStorageImpl.kt b/app/src/main/java/gq/kirmanak/mealient/data/baseurl/impl/BaseURLStorageImpl.kt index 64280cf..86ac2f6 100644 --- a/app/src/main/java/gq/kirmanak/mealient/data/baseurl/impl/BaseURLStorageImpl.kt +++ b/app/src/main/java/gq/kirmanak/mealient/data/baseurl/impl/BaseURLStorageImpl.kt @@ -14,13 +14,23 @@ class BaseURLStorageImpl @Inject constructor( private val baseUrlKey: Preferences.Key get() = preferencesStorage.baseUrlKey - override suspend fun getBaseURL(): String? = preferencesStorage.getValue(baseUrlKey) + private val serverVersionKey: Preferences.Key + 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 getValue(key: Preferences.Key): T? = preferencesStorage.getValue(key) } \ No newline at end of file diff --git a/app/src/main/java/gq/kirmanak/mealient/data/network/MealieDataSourceWrapper.kt b/app/src/main/java/gq/kirmanak/mealient/data/network/MealieDataSourceWrapper.kt index bd91b0c..b66084b 100644 --- a/app/src/main/java/gq/kirmanak/mealient/data/network/MealieDataSourceWrapper.kt +++ b/app/src/main/java/gq/kirmanak/mealient/data/network/MealieDataSourceWrapper.kt @@ -41,7 +41,9 @@ class MealieDataSourceWrapper @Inject constructor( override suspend fun requestRecipes(start: Int, limit: Int): List = 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 withAuthHeader(block: (String?) -> T): T = runCatching { block(authRepo.getAuthHeader()) }.getOrElse { if (it is NetworkError.Unauthorized) { diff --git a/app/src/main/java/gq/kirmanak/mealient/data/storage/PreferencesStorage.kt b/app/src/main/java/gq/kirmanak/mealient/data/storage/PreferencesStorage.kt index 31e9174..df88285 100644 --- a/app/src/main/java/gq/kirmanak/mealient/data/storage/PreferencesStorage.kt +++ b/app/src/main/java/gq/kirmanak/mealient/data/storage/PreferencesStorage.kt @@ -7,6 +7,8 @@ interface PreferencesStorage { val baseUrlKey: Preferences.Key + val serverVersionKey: Preferences.Key + val isDisclaimerAcceptedKey: Preferences.Key suspend fun getValue(key: Preferences.Key): T? diff --git a/app/src/main/java/gq/kirmanak/mealient/data/storage/PreferencesStorageImpl.kt b/app/src/main/java/gq/kirmanak/mealient/data/storage/PreferencesStorageImpl.kt index e42346c..f9e7bfa 100644 --- a/app/src/main/java/gq/kirmanak/mealient/data/storage/PreferencesStorageImpl.kt +++ b/app/src/main/java/gq/kirmanak/mealient/data/storage/PreferencesStorageImpl.kt @@ -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 getValue(key: Preferences.Key): T? { diff --git a/app/src/main/java/gq/kirmanak/mealient/ui/baseurl/BaseURLViewModel.kt b/app/src/main/java/gq/kirmanak/mealient/ui/baseurl/BaseURLViewModel.kt index 1b98c87..bb3e3c7 100644 --- a/app/src/main/java/gq/kirmanak/mealient/ui/baseurl/BaseURLViewModel.kt +++ b/app/src/main/java/gq/kirmanak/mealient/ui/baseurl/BaseURLViewModel.kt @@ -35,8 +35,8 @@ class BaseURLViewModel @Inject constructor( logger.v { "checkBaseURL() called with: baseURL = $baseURL" } val result = runCatchingExceptCancel { // If it returns proper version info then it must be a Mealie - versionDataSource.getVersionInfo(baseURL) - baseURLStorage.storeBaseURL(baseURL) + val version = versionDataSource.getVersionInfo(baseURL).version + baseURLStorage.storeBaseURL(baseURL, version) } logger.i { "checkBaseURL: result is $result" } _uiState.value = OperationUiState.fromResult(result) diff --git a/app/src/test/java/gq/kirmanak/mealient/data/baseurl/BaseURLStorageImplTest.kt b/app/src/test/java/gq/kirmanak/mealient/data/baseurl/BaseURLStorageImplTest.kt index 256139a..9197830 100644 --- a/app/src/test/java/gq/kirmanak/mealient/data/baseurl/BaseURLStorageImplTest.kt +++ b/app/src/test/java/gq/kirmanak/mealient/data/baseurl/BaseURLStorageImplTest.kt @@ -57,7 +57,7 @@ class BaseURLStorageImplTest { @Test fun `when storeBaseURL then calls preferences storage`() = runTest { - subject.storeBaseURL("baseUrl") + subject.storeBaseURL("baseUrl", "v0.5.6") coVerify { preferencesStorage.baseUrlKey preferencesStorage.storeValues(eq(Pair(baseUrlKey, "baseUrl"))) diff --git a/app/src/test/java/gq/kirmanak/mealient/test/AuthImplTestData.kt b/app/src/test/java/gq/kirmanak/mealient/test/AuthImplTestData.kt index feb4866..6fd70ba 100644 --- a/app/src/test/java/gq/kirmanak/mealient/test/AuthImplTestData.kt +++ b/app/src/test/java/gq/kirmanak/mealient/test/AuthImplTestData.kt @@ -7,4 +7,5 @@ object AuthImplTestData { const val TEST_TOKEN = "TEST_TOKEN" const val TEST_AUTH_HEADER = "Bearer TEST_TOKEN" const val TEST_URL = "TEST_URL" + const val TEST_VERSION = "v0.5.6" } \ No newline at end of file diff --git a/app/src/test/java/gq/kirmanak/mealient/ui/baseurl/BaseURLViewModelTest.kt b/app/src/test/java/gq/kirmanak/mealient/ui/baseurl/BaseURLViewModelTest.kt index b41b7fa..4c91bf1 100644 --- a/app/src/test/java/gq/kirmanak/mealient/ui/baseurl/BaseURLViewModelTest.kt +++ b/app/src/test/java/gq/kirmanak/mealient/ui/baseurl/BaseURLViewModelTest.kt @@ -5,6 +5,7 @@ import gq.kirmanak.mealient.data.baseurl.VersionDataSource import gq.kirmanak.mealient.data.baseurl.VersionInfo import gq.kirmanak.mealient.logging.Logger import gq.kirmanak.mealient.test.AuthImplTestData.TEST_BASE_URL +import gq.kirmanak.mealient.test.AuthImplTestData.TEST_VERSION import gq.kirmanak.mealient.test.RobolectricTest import io.mockk.MockKAnnotations import io.mockk.coEvery @@ -40,9 +41,9 @@ class BaseURLViewModelTest : RobolectricTest() { fun `when saveBaseUrl and getVersionInfo returns result then saves to storage`() = runTest { coEvery { versionDataSource.getVersionInfo(eq(TEST_BASE_URL)) - } returns VersionInfo(true, "0.5.6", true) + } returns VersionInfo(TEST_VERSION) subject.saveBaseUrl(TEST_BASE_URL) advanceUntilIdle() - coVerify { baseURLStorage.storeBaseURL(eq(TEST_BASE_URL)) } + coVerify { baseURLStorage.storeBaseURL(eq(TEST_BASE_URL), eq(TEST_VERSION)) } } } \ No newline at end of file