Set base url through Interceptor
This commit is contained in:
@@ -19,18 +19,16 @@ class AuthDataSourceImpl @Inject constructor(
|
||||
|
||||
private suspend fun getVersion(): ServerVersion = serverInfoRepo.getVersion()
|
||||
|
||||
private suspend fun getUrl(): String = serverInfoRepo.requireUrl()
|
||||
|
||||
override suspend fun authenticate(
|
||||
username: String,
|
||||
password: String,
|
||||
): String = when (getVersion()) {
|
||||
ServerVersion.V0 -> v0Source.authenticate(getUrl(), username, password)
|
||||
ServerVersion.V1 -> v1Source.authenticate(getUrl(), username, password)
|
||||
ServerVersion.V0 -> v0Source.authenticate(username, password)
|
||||
ServerVersion.V1 -> v1Source.authenticate(username, password)
|
||||
}
|
||||
|
||||
override suspend fun createApiToken(name: String): String = when (getVersion()) {
|
||||
ServerVersion.V0 -> v0Source.createApiToken(getUrl(), CreateApiTokenRequestV0(name))
|
||||
ServerVersion.V1 -> v1Source.createApiToken(getUrl(), CreateApiTokenRequestV1(name)).token
|
||||
ServerVersion.V0 -> v0Source.createApiToken(CreateApiTokenRequestV0(name))
|
||||
ServerVersion.V1 -> v1Source.createApiToken(CreateApiTokenRequestV1(name)).token
|
||||
}
|
||||
}
|
||||
@@ -4,10 +4,9 @@ interface ServerInfoRepo {
|
||||
|
||||
suspend fun getUrl(): String?
|
||||
|
||||
suspend fun requireUrl(): String
|
||||
|
||||
suspend fun getVersion(): ServerVersion
|
||||
|
||||
suspend fun storeBaseURL(baseURL: String, version: String)
|
||||
suspend fun tryBaseURL(baseURL: String): Result<Unit>
|
||||
|
||||
}
|
||||
|
||||
|
||||
@@ -1,6 +1,8 @@
|
||||
package gq.kirmanak.mealient.data.baseurl
|
||||
|
||||
import gq.kirmanak.mealient.datasource.NetworkError
|
||||
import gq.kirmanak.mealient.datasource.ServerUrlProvider
|
||||
import gq.kirmanak.mealient.datasource.runCatchingExceptCancel
|
||||
import gq.kirmanak.mealient.logging.Logger
|
||||
import javax.inject.Inject
|
||||
import javax.inject.Singleton
|
||||
@@ -10,7 +12,7 @@ class ServerInfoRepoImpl @Inject constructor(
|
||||
private val serverInfoStorage: ServerInfoStorage,
|
||||
private val versionDataSource: VersionDataSource,
|
||||
private val logger: Logger,
|
||||
) : ServerInfoRepo {
|
||||
) : ServerInfoRepo, ServerUrlProvider {
|
||||
|
||||
override suspend fun getUrl(): String? {
|
||||
val result = serverInfoStorage.getBaseURL()
|
||||
@@ -18,17 +20,11 @@ class ServerInfoRepoImpl @Inject constructor(
|
||||
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
|
||||
version = versionDataSource.getVersionInfo().version
|
||||
val result = determineServerVersion(version)
|
||||
serverInfoStorage.storeServerVersion(version)
|
||||
result
|
||||
@@ -45,8 +41,16 @@ class ServerInfoRepoImpl @Inject constructor(
|
||||
else -> throw NetworkError.NotMealie(IllegalStateException("Server version is unknown: $version"))
|
||||
}
|
||||
|
||||
override suspend fun storeBaseURL(baseURL: String, version: String) {
|
||||
logger.v { "storeBaseURL() called with: baseURL = $baseURL, version = $version" }
|
||||
serverInfoStorage.storeBaseURL(baseURL, version)
|
||||
override suspend fun tryBaseURL(baseURL: String): Result<Unit> {
|
||||
val oldVersion = serverInfoStorage.getServerVersion()
|
||||
val oldBaseUrl = serverInfoStorage.getBaseURL()
|
||||
|
||||
return runCatchingExceptCancel {
|
||||
serverInfoStorage.storeBaseURL(baseURL)
|
||||
val version = versionDataSource.getVersionInfo().version
|
||||
serverInfoStorage.storeServerVersion(version)
|
||||
}.onFailure {
|
||||
serverInfoStorage.storeBaseURL(oldBaseUrl, oldVersion)
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -4,9 +4,12 @@ interface ServerInfoStorage {
|
||||
|
||||
suspend fun getBaseURL(): String?
|
||||
|
||||
suspend fun storeBaseURL(baseURL: String, version: String)
|
||||
suspend fun storeBaseURL(baseURL: String)
|
||||
|
||||
suspend fun storeBaseURL(baseURL: String?, version: String?)
|
||||
|
||||
suspend fun storeServerVersion(version: String)
|
||||
|
||||
suspend fun getServerVersion(): String?
|
||||
|
||||
}
|
||||
@@ -2,5 +2,5 @@ package gq.kirmanak.mealient.data.baseurl
|
||||
|
||||
interface VersionDataSource {
|
||||
|
||||
suspend fun getVersionInfo(baseUrl: String): VersionInfo
|
||||
suspend fun getVersionInfo(): VersionInfo
|
||||
}
|
||||
@@ -16,13 +16,13 @@ class VersionDataSourceImpl @Inject constructor(
|
||||
private val v1Source: MealieDataSourceV1,
|
||||
) : VersionDataSource {
|
||||
|
||||
override suspend fun getVersionInfo(baseUrl: String): VersionInfo {
|
||||
override suspend fun getVersionInfo(): VersionInfo {
|
||||
val responses = coroutineScope {
|
||||
val v0Deferred = async {
|
||||
runCatchingExceptCancel { v0Source.getVersionInfo(baseUrl).toVersionInfo() }
|
||||
runCatchingExceptCancel { v0Source.getVersionInfo().toVersionInfo() }
|
||||
}
|
||||
val v1Deferred = async {
|
||||
runCatchingExceptCancel { v1Source.getVersionInfo(baseUrl).toVersionInfo() }
|
||||
runCatchingExceptCancel { v1Source.getVersionInfo().toVersionInfo() }
|
||||
}
|
||||
listOf(v0Deferred, v1Deferred).awaitAll()
|
||||
}
|
||||
|
||||
@@ -19,11 +19,28 @@ class ServerInfoStorageImpl @Inject constructor(
|
||||
|
||||
override suspend fun getBaseURL(): String? = getValue(baseUrlKey)
|
||||
|
||||
override suspend fun storeBaseURL(baseURL: String, version: String) {
|
||||
preferencesStorage.storeValues(
|
||||
Pair(baseUrlKey, baseURL),
|
||||
Pair(serverVersionKey, version),
|
||||
)
|
||||
override suspend fun storeBaseURL(baseURL: String) {
|
||||
preferencesStorage.storeValues(Pair(baseUrlKey, baseURL))
|
||||
preferencesStorage.removeValues(serverVersionKey)
|
||||
}
|
||||
|
||||
override suspend fun storeBaseURL(baseURL: String?, version: String?) {
|
||||
when {
|
||||
baseURL == null -> {
|
||||
preferencesStorage.removeValues(baseUrlKey, serverVersionKey)
|
||||
}
|
||||
|
||||
version != null -> {
|
||||
preferencesStorage.storeValues(
|
||||
Pair(baseUrlKey, baseURL), Pair(serverVersionKey, version)
|
||||
)
|
||||
}
|
||||
|
||||
else -> {
|
||||
preferencesStorage.removeValues(serverVersionKey)
|
||||
preferencesStorage.storeValues(Pair(baseUrlKey, baseURL))
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
override suspend fun getServerVersion(): String? = getValue(serverVersionKey)
|
||||
@@ -33,4 +50,5 @@ class ServerInfoStorageImpl @Inject constructor(
|
||||
}
|
||||
|
||||
private suspend fun <T> getValue(key: Preferences.Key<T>): T? = preferencesStorage.getValue(key)
|
||||
|
||||
}
|
||||
@@ -29,13 +29,11 @@ class MealieDataSourceWrapper @Inject constructor(
|
||||
|
||||
private suspend fun getVersion(): ServerVersion = serverInfoRepo.getVersion()
|
||||
|
||||
private suspend fun getUrl(): String = serverInfoRepo.requireUrl()
|
||||
|
||||
override suspend fun addRecipe(recipe: AddRecipeInfo): String = when (getVersion()) {
|
||||
ServerVersion.V0 -> v0Source.addRecipe(getUrl(), recipe.toV0Request())
|
||||
ServerVersion.V0 -> v0Source.addRecipe(recipe.toV0Request())
|
||||
ServerVersion.V1 -> {
|
||||
val slug = v1Source.createRecipe(getUrl(), recipe.toV1CreateRequest())
|
||||
v1Source.updateRecipe(getUrl(), slug, recipe.toV1UpdateRequest())
|
||||
val slug = v1Source.createRecipe(recipe.toV1CreateRequest())
|
||||
v1Source.updateRecipe(slug, recipe.toV1UpdateRequest())
|
||||
slug
|
||||
}
|
||||
}
|
||||
@@ -45,25 +43,25 @@ class MealieDataSourceWrapper @Inject constructor(
|
||||
limit: Int,
|
||||
): List<RecipeSummaryInfo> = when (getVersion()) {
|
||||
ServerVersion.V0 -> {
|
||||
v0Source.requestRecipes(getUrl(), start, limit).map { it.toRecipeSummaryInfo() }
|
||||
v0Source.requestRecipes(start, limit).map { it.toRecipeSummaryInfo() }
|
||||
}
|
||||
ServerVersion.V1 -> {
|
||||
// Imagine start is 30 and limit is 15. It means that we already have page 1 and 2, now we need page 3
|
||||
val page = start / limit + 1
|
||||
v1Source.requestRecipes(getUrl(), page, limit).map { it.toRecipeSummaryInfo() }
|
||||
v1Source.requestRecipes(page, limit).map { it.toRecipeSummaryInfo() }
|
||||
}
|
||||
}
|
||||
|
||||
override suspend fun requestRecipeInfo(slug: String): FullRecipeInfo = when (getVersion()) {
|
||||
ServerVersion.V0 -> v0Source.requestRecipeInfo(getUrl(), slug).toFullRecipeInfo()
|
||||
ServerVersion.V1 -> v1Source.requestRecipeInfo(getUrl(), slug).toFullRecipeInfo()
|
||||
ServerVersion.V0 -> v0Source.requestRecipeInfo(slug).toFullRecipeInfo()
|
||||
ServerVersion.V1 -> v1Source.requestRecipeInfo(slug).toFullRecipeInfo()
|
||||
}
|
||||
|
||||
override suspend fun parseRecipeFromURL(
|
||||
parseRecipeURLInfo: ParseRecipeURLInfo,
|
||||
): String = when (getVersion()) {
|
||||
ServerVersion.V0 -> v0Source.parseRecipeFromURL(getUrl(), parseRecipeURLInfo.toV0Request())
|
||||
ServerVersion.V1 -> v1Source.parseRecipeFromURL(getUrl(), parseRecipeURLInfo.toV1Request())
|
||||
ServerVersion.V0 -> v0Source.parseRecipeFromURL(parseRecipeURLInfo.toV0Request())
|
||||
ServerVersion.V1 -> v1Source.parseRecipeFromURL(parseRecipeURLInfo.toV1Request())
|
||||
}
|
||||
|
||||
}
|
||||
@@ -6,6 +6,7 @@ import dagger.hilt.InstallIn
|
||||
import dagger.hilt.components.SingletonComponent
|
||||
import gq.kirmanak.mealient.data.baseurl.*
|
||||
import gq.kirmanak.mealient.data.baseurl.impl.ServerInfoStorageImpl
|
||||
import gq.kirmanak.mealient.datasource.ServerUrlProvider
|
||||
import javax.inject.Singleton
|
||||
|
||||
@Module
|
||||
@@ -23,4 +24,8 @@ interface BaseURLModule {
|
||||
@Binds
|
||||
@Singleton
|
||||
fun bindServerInfoRepo(serverInfoRepoImpl: ServerInfoRepoImpl): ServerInfoRepo
|
||||
|
||||
@Binds
|
||||
@Singleton
|
||||
fun bindServerUrlProvider(serverInfoRepoImpl: ServerInfoRepoImpl): ServerUrlProvider
|
||||
}
|
||||
@@ -7,9 +7,7 @@ import androidx.lifecycle.viewModelScope
|
||||
import dagger.hilt.android.lifecycle.HiltViewModel
|
||||
import gq.kirmanak.mealient.data.auth.AuthRepo
|
||||
import gq.kirmanak.mealient.data.baseurl.ServerInfoRepo
|
||||
import gq.kirmanak.mealient.data.baseurl.VersionDataSource
|
||||
import gq.kirmanak.mealient.data.recipes.RecipeRepo
|
||||
import gq.kirmanak.mealient.datasource.runCatchingExceptCancel
|
||||
import gq.kirmanak.mealient.logging.Logger
|
||||
import gq.kirmanak.mealient.ui.OperationUiState
|
||||
import kotlinx.coroutines.launch
|
||||
@@ -20,7 +18,6 @@ class BaseURLViewModel @Inject constructor(
|
||||
private val serverInfoRepo: ServerInfoRepo,
|
||||
private val authRepo: AuthRepo,
|
||||
private val recipeRepo: RecipeRepo,
|
||||
private val versionDataSource: VersionDataSource,
|
||||
private val logger: Logger,
|
||||
) : ViewModel() {
|
||||
|
||||
@@ -42,10 +39,8 @@ class BaseURLViewModel @Inject constructor(
|
||||
_uiState.value = OperationUiState.fromResult(Result.success(Unit))
|
||||
return
|
||||
}
|
||||
val result = runCatchingExceptCancel {
|
||||
// If it returns proper version info then it must be a Mealie
|
||||
val version = versionDataSource.getVersionInfo(baseURL).version
|
||||
serverInfoRepo.storeBaseURL(baseURL, version)
|
||||
val result = serverInfoRepo.tryBaseURL(baseURL)
|
||||
if (result.isSuccess) {
|
||||
authRepo.logout()
|
||||
recipeRepo.clearLocalData()
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user