Save isFavorite flag to DB for recipes

This commit is contained in:
Kirill Kamakin
2022-12-12 21:26:57 +01:00
parent a42758f3d1
commit aefb974cb3
23 changed files with 352 additions and 30 deletions

View File

@@ -5,13 +5,13 @@ interface NetworkRequestWrapper {
suspend fun <T> makeCall(
block: suspend () -> T,
logMethod: () -> String,
logParameters: () -> String,
logParameters: (() -> String)? = null,
): Result<T>
suspend fun <T> makeCallAndHandleUnauthorized(
block: suspend () -> T,
logMethod: () -> String,
logParameters: () -> String,
logParameters: (() -> String)? = null,
): T
}

View File

@@ -16,18 +16,40 @@ class NetworkRequestWrapperImpl @Inject constructor(
override suspend fun <T> makeCall(
block: suspend () -> T,
logMethod: () -> String,
logParameters: () -> String,
logParameters: (() -> String)?,
): Result<T> {
logger.v { "${logMethod()} called with: ${logParameters()}" }
logger.v {
if (logParameters == null) {
"${logMethod()} called"
} else {
"${logMethod()} called with: ${logParameters()}"
}
}
return runCatchingExceptCancel { block() }
.onFailure { logger.e(it) { "${logMethod()} request failed with: ${logParameters()}" } }
.onSuccess { logger.d { "${logMethod()} request succeeded with ${logParameters()}, result = $it" } }
.onFailure {
logger.e(it) {
if (logParameters == null) {
"${logMethod()} request failed"
} else {
"${logMethod()} request failed with: ${logParameters()}"
}
}
}
.onSuccess {
logger.d {
if (logParameters == null) {
"${logMethod()} request succeeded, result = $it"
} else {
"${logMethod()} request succeeded with: ${logParameters()}, result = $it"
}
}
}
}
override suspend fun <T> makeCallAndHandleUnauthorized(
block: suspend () -> T,
logMethod: () -> String,
logParameters: () -> String
logParameters: (() -> String)?
): T = makeCall(block, logMethod, logParameters).getOrElse {
throw if (it is HttpException && it.code() in listOf(401, 403)) {
NetworkError.Unauthorized(it)

View File

@@ -4,6 +4,7 @@ import gq.kirmanak.mealient.datasource.v0.models.AddRecipeRequestV0
import gq.kirmanak.mealient.datasource.v0.models.CreateApiTokenRequestV0
import gq.kirmanak.mealient.datasource.v0.models.GetRecipeResponseV0
import gq.kirmanak.mealient.datasource.v0.models.GetRecipeSummaryResponseV0
import gq.kirmanak.mealient.datasource.v0.models.GetUserInfoResponseV0
import gq.kirmanak.mealient.datasource.v0.models.ParseRecipeURLRequestV0
import gq.kirmanak.mealient.datasource.v0.models.VersionResponseV0
@@ -21,8 +22,7 @@ interface MealieDataSourceV0 {
password: String,
): String
suspend fun getVersionInfo(
): VersionResponseV0
suspend fun getVersionInfo(): VersionResponseV0
suspend fun requestRecipes(
start: Int,
@@ -40,4 +40,6 @@ interface MealieDataSourceV0 {
suspend fun createApiToken(
request: CreateApiTokenRequestV0,
): String
suspend fun requestUserInfo(): GetUserInfoResponseV0
}

View File

@@ -8,6 +8,7 @@ import gq.kirmanak.mealient.datasource.v0.models.CreateApiTokenRequestV0
import gq.kirmanak.mealient.datasource.v0.models.ErrorDetailV0
import gq.kirmanak.mealient.datasource.v0.models.GetRecipeResponseV0
import gq.kirmanak.mealient.datasource.v0.models.GetRecipeSummaryResponseV0
import gq.kirmanak.mealient.datasource.v0.models.GetUserInfoResponseV0
import gq.kirmanak.mealient.datasource.v0.models.ParseRecipeURLRequestV0
import gq.kirmanak.mealient.datasource.v0.models.VersionResponseV0
import kotlinx.serialization.SerializationException
@@ -49,7 +50,6 @@ class MealieDataSourceV0Impl @Inject constructor(
override suspend fun getVersionInfo(): VersionResponseV0 = networkRequestWrapper.makeCall(
block = { service.getVersion() },
logMethod = { "getVersionInfo" },
logParameters = { "" },
).getOrElse {
throw when (it) {
is HttpException, is SerializationException -> NetworkError.NotMealie(it)
@@ -90,4 +90,11 @@ class MealieDataSourceV0Impl @Inject constructor(
logMethod = { "createApiToken" },
logParameters = { "request = $request" }
)
override suspend fun requestUserInfo(): GetUserInfoResponseV0 {
return networkRequestWrapper.makeCallAndHandleUnauthorized(
block = { service.getUserSelfInfo() },
logMethod = { "requestUserInfo" },
)
}
}

View File

@@ -40,4 +40,7 @@ interface MealieServiceV0 {
suspend fun createApiToken(
@Body request: CreateApiTokenRequestV0,
): String
@GET("/api/users/self")
suspend fun getUserSelfInfo(): GetUserInfoResponseV0
}

View File

@@ -0,0 +1,9 @@
package gq.kirmanak.mealient.datasource.v0.models
import kotlinx.serialization.SerialName
import kotlinx.serialization.Serializable
@Serializable
data class GetUserInfoResponseV0(
@SerialName("favoriteRecipes") val favoriteRecipes: List<String> = emptyList(),
)

View File

@@ -5,6 +5,7 @@ import gq.kirmanak.mealient.datasource.v1.models.CreateApiTokenResponseV1
import gq.kirmanak.mealient.datasource.v1.models.CreateRecipeRequestV1
import gq.kirmanak.mealient.datasource.v1.models.GetRecipeResponseV1
import gq.kirmanak.mealient.datasource.v1.models.GetRecipeSummaryResponseV1
import gq.kirmanak.mealient.datasource.v1.models.GetUserInfoResponseV1
import gq.kirmanak.mealient.datasource.v1.models.ParseRecipeURLRequestV1
import gq.kirmanak.mealient.datasource.v1.models.UpdateRecipeRequestV1
import gq.kirmanak.mealient.datasource.v1.models.VersionResponseV1
@@ -47,4 +48,6 @@ interface MealieDataSourceV1 {
suspend fun createApiToken(
request: CreateApiTokenRequestV1,
): CreateApiTokenResponseV1
suspend fun requestUserInfo(): GetUserInfoResponseV1
}

View File

@@ -9,6 +9,7 @@ import gq.kirmanak.mealient.datasource.v1.models.CreateRecipeRequestV1
import gq.kirmanak.mealient.datasource.v1.models.ErrorDetailV1
import gq.kirmanak.mealient.datasource.v1.models.GetRecipeResponseV1
import gq.kirmanak.mealient.datasource.v1.models.GetRecipeSummaryResponseV1
import gq.kirmanak.mealient.datasource.v1.models.GetUserInfoResponseV1
import gq.kirmanak.mealient.datasource.v1.models.ParseRecipeURLRequestV1
import gq.kirmanak.mealient.datasource.v1.models.UpdateRecipeRequestV1
import gq.kirmanak.mealient.datasource.v1.models.VersionResponseV1
@@ -60,7 +61,6 @@ class MealieDataSourceV1Impl @Inject constructor(
override suspend fun getVersionInfo(): VersionResponseV1 = networkRequestWrapper.makeCall(
block = { service.getVersion() },
logMethod = { "getVersionInfo" },
logParameters = { "" },
).getOrElse {
throw when (it) {
is HttpException, is SerializationException -> NetworkError.NotMealie(it)
@@ -101,5 +101,12 @@ class MealieDataSourceV1Impl @Inject constructor(
logMethod = { "createApiToken" },
logParameters = { "request = $request" }
)
override suspend fun requestUserInfo(): GetUserInfoResponseV1 {
return networkRequestWrapper.makeCallAndHandleUnauthorized(
block = { service.getUserSelfInfo() },
logMethod = { "requestUserInfo" },
)
}
}

View File

@@ -46,4 +46,7 @@ interface MealieServiceV1 {
suspend fun createApiToken(
@Body request: CreateApiTokenRequestV1,
): CreateApiTokenResponseV1
@GET("/api/users/self")
suspend fun getUserSelfInfo(): GetUserInfoResponseV1
}

View File

@@ -0,0 +1,9 @@
package gq.kirmanak.mealient.datasource.v1.models
import kotlinx.serialization.SerialName
import kotlinx.serialization.Serializable
@Serializable
data class GetUserInfoResponseV1(
@SerialName("favoriteRecipes") val favoriteRecipes: List<String> = emptyList(),
)