1
0
Fork 0
mirror of https://github.com/mealie-recipes/mealie.git synced 2025-08-02 03:55:22 +02:00

fix: Bulk Update Owner Removes Some Recipe Data (#4393)

This commit is contained in:
Michael Genson 2024-10-19 15:36:34 -05:00 committed by GitHub
parent a17529bd71
commit 543a53cab4
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
4 changed files with 37 additions and 3 deletions

View file

@ -182,6 +182,10 @@ export class RecipeAPI extends BaseCRUDAPI<CreateRecipe, Recipe, Recipe> {
return await this.requests.put<Recipe[]>(routes.recipesBase, payload); return await this.requests.put<Recipe[]>(routes.recipesBase, payload);
} }
async patchMany(payload: Recipe[]) {
return await this.requests.patch<Recipe[]>(routes.recipesBase, payload);
}
async updateLastMade(recipeSlug: string, timestamp: string) { async updateLastMade(recipeSlug: string, timestamp: string) {
return await this.requests.patch<Recipe, RecipeLastMade>(routes.recipesSlugLastMade(recipeSlug), { timestamp }) return await this.requests.patch<Recipe, RecipeLastMade>(routes.recipesSlugLastMade(recipeSlug), { timestamp })
} }

View file

@ -377,7 +377,7 @@ export default defineComponent({
}); });
loading.value = true; loading.value = true;
await api.recipes.updateMany(selected.value); await api.recipes.patchMany(selected.value);
await refreshRecipes(); await refreshRecipes();
resetAll(); resetAll();

View file

@ -516,6 +516,31 @@ class RecipeController(BaseRecipeController):
return recipe return recipe
@router.patch("")
def patch_many(self, data: list[Recipe]):
updated_by_group_and_household: defaultdict[UUID4, defaultdict[UUID4, list[Recipe]]] = defaultdict(
lambda: defaultdict(list)
)
for recipe in data:
r = self.service.patch_one(recipe.id, recipe) # type: ignore
updated_by_group_and_household[r.group_id][r.household_id].append(r)
all_updated: list[Recipe] = []
if updated_by_group_and_household:
for group_id, household_dict in updated_by_group_and_household.items():
for household_id, updated_recipes in household_dict.items():
all_updated.extend(updated_recipes)
self.publish_event(
event_type=EventTypes.recipe_updated,
document_data=EventRecipeBulkData(
operation=EventOperation.update, recipe_slugs=[r.slug for r in updated_recipes]
),
group_id=group_id,
household_id=household_id,
)
return all_updated
@router.patch("/{slug}/last-made") @router.patch("/{slug}/last-made")
def update_last_made(self, slug: str, data: RecipeLastMade): def update_last_made(self, slug: str, data: RecipeLastMade):
"""Update a recipe's last made timestamp""" """Update a recipe's last made timestamp"""

View file

@ -483,7 +483,8 @@ def test_read_update(
assert cats[0]["name"] in test_name assert cats[0]["name"] in test_name
def test_update_many(api_client: TestClient, unique_user: TestUser): @pytest.mark.parametrize("use_patch", [True, False])
def test_update_many(api_client: TestClient, unique_user: TestUser, use_patch: bool):
recipe_slugs = [random_string() for _ in range(3)] recipe_slugs = [random_string() for _ in range(3)]
for slug in recipe_slugs: for slug in recipe_slugs:
api_client.post(api_routes.recipes, json={"name": slug}, headers=unique_user.token) api_client.post(api_routes.recipes, json={"name": slug}, headers=unique_user.token)
@ -498,7 +499,11 @@ def test_update_many(api_client: TestClient, unique_user: TestUser):
recipe_data["name"] = new_slug_by_id[recipe_data["id"]] recipe_data["name"] = new_slug_by_id[recipe_data["id"]]
recipe_data["slug"] = new_slug_by_id[recipe_data["id"]] recipe_data["slug"] = new_slug_by_id[recipe_data["id"]]
response = api_client.put(api_routes.recipes, json=recipes_data, headers=unique_user.token) if use_patch:
api_client_func = api_client.patch
else:
api_client_func = api_client.put
response = api_client_func(api_routes.recipes, json=recipes_data, headers=unique_user.token)
assert response.status_code == 200 assert response.status_code == 200
for updated_recipe_data in response.json(): for updated_recipe_data in response.json():
assert updated_recipe_data["slug"] == new_slug_by_id[updated_recipe_data["id"]] assert updated_recipe_data["slug"] == new_slug_by_id[updated_recipe_data["id"]]