From 97735847c02fcfca6584a6b4074f4659e3067725 Mon Sep 17 00:00:00 2001 From: Kirill Kamakin Date: Tue, 13 Dec 2022 20:53:45 +0100 Subject: [PATCH] Refresh favorite recipes on change --- .../gq/kirmanak/mealient/data/recipes/db/RecipeStorage.kt | 2 ++ .../mealient/data/recipes/db/RecipeStorageImpl.kt | 8 ++++++++ .../kirmanak/mealient/data/recipes/impl/RecipeRepoImpl.kt | 1 + .../mealient/data/recipes/impl/RecipesRemoteMediator.kt | 6 ++++++ .../gq/kirmanak/mealient/database/recipe/RecipeDao.kt | 6 ++++++ 5 files changed, 23 insertions(+) diff --git a/app/src/main/java/gq/kirmanak/mealient/data/recipes/db/RecipeStorage.kt b/app/src/main/java/gq/kirmanak/mealient/data/recipes/db/RecipeStorage.kt index 737c417..171d8ab 100644 --- a/app/src/main/java/gq/kirmanak/mealient/data/recipes/db/RecipeStorage.kt +++ b/app/src/main/java/gq/kirmanak/mealient/data/recipes/db/RecipeStorage.kt @@ -17,4 +17,6 @@ interface RecipeStorage { suspend fun saveRecipeInfo(recipe: FullRecipeInfo) suspend fun queryRecipeInfo(recipeId: String): FullRecipeEntity? + + suspend fun updateFavoriteRecipes(favorites: List) } \ No newline at end of file diff --git a/app/src/main/java/gq/kirmanak/mealient/data/recipes/db/RecipeStorageImpl.kt b/app/src/main/java/gq/kirmanak/mealient/data/recipes/db/RecipeStorageImpl.kt index 9219e34..70fa579 100644 --- a/app/src/main/java/gq/kirmanak/mealient/data/recipes/db/RecipeStorageImpl.kt +++ b/app/src/main/java/gq/kirmanak/mealient/data/recipes/db/RecipeStorageImpl.kt @@ -72,4 +72,12 @@ class RecipeStorageImpl @Inject constructor( logger.v { "queryRecipeInfo() returned: $fullRecipeInfo" } return fullRecipeInfo } + + override suspend fun updateFavoriteRecipes(favorites: List) { + logger.v { "updateFavoriteRecipes() called with: favorites = $favorites" } + db.withTransaction { + recipeDao.setFavorite(favorites) + recipeDao.setNonFavorite(favorites) + } + } } \ No newline at end of file diff --git a/app/src/main/java/gq/kirmanak/mealient/data/recipes/impl/RecipeRepoImpl.kt b/app/src/main/java/gq/kirmanak/mealient/data/recipes/impl/RecipeRepoImpl.kt index 7f57ef5..900d320 100644 --- a/app/src/main/java/gq/kirmanak/mealient/data/recipes/impl/RecipeRepoImpl.kt +++ b/app/src/main/java/gq/kirmanak/mealient/data/recipes/impl/RecipeRepoImpl.kt @@ -76,6 +76,7 @@ class RecipeRepoImpl @Inject constructor( logger.v { "updateIsRecipeFavorite() called with: recipeSlug = $recipeSlug, isFavorite = $isFavorite" } runCatchingExceptCancel { dataSource.updateIsRecipeFavorite(recipeSlug, isFavorite) + mediator.onFavoritesChange() }.onFailure { logger.e(it) { "Can't update recipe's is favorite status" } } diff --git a/app/src/main/java/gq/kirmanak/mealient/data/recipes/impl/RecipesRemoteMediator.kt b/app/src/main/java/gq/kirmanak/mealient/data/recipes/impl/RecipesRemoteMediator.kt index 7c8d577..77dcbef 100644 --- a/app/src/main/java/gq/kirmanak/mealient/data/recipes/impl/RecipesRemoteMediator.kt +++ b/app/src/main/java/gq/kirmanak/mealient/data/recipes/impl/RecipesRemoteMediator.kt @@ -79,4 +79,10 @@ class RecipesRemoteMediator @Inject constructor( else storage.saveRecipes(entities) recipes.size } + + suspend fun onFavoritesChange() { + val favorites = network.getFavoriteRecipes() + storage.updateFavoriteRecipes(favorites) + pagingSourceFactory.invalidate() + } } \ No newline at end of file diff --git a/database/src/main/kotlin/gq/kirmanak/mealient/database/recipe/RecipeDao.kt b/database/src/main/kotlin/gq/kirmanak/mealient/database/recipe/RecipeDao.kt index eaea4e9..29d74e8 100644 --- a/database/src/main/kotlin/gq/kirmanak/mealient/database/recipe/RecipeDao.kt +++ b/database/src/main/kotlin/gq/kirmanak/mealient/database/recipe/RecipeDao.kt @@ -40,4 +40,10 @@ interface RecipeDao { @Query("DELETE FROM recipe_instruction WHERE recipe_id = :recipeId") suspend fun deleteRecipeInstructions(recipeId: String) + + @Query("UPDATE recipe_summaries SET is_favorite = 1 WHERE slug IN (:favorites)") + suspend fun setFavorite(favorites: List) + + @Query("UPDATE recipe_summaries SET is_favorite = 0 WHERE slug NOT IN (:favorites)") + suspend fun setNonFavorite(favorites: List) } \ No newline at end of file