From 40ee4dad535201802eadb0ef35c7eb9f10f95436 Mon Sep 17 00:00:00 2001 From: Marcel Raddatz Date: Mon, 6 Apr 2026 19:44:44 +0200 Subject: [PATCH] refactor(shopping): extract mergeKey helper to eliminate duplicate key construction Co-Authored-By: Claude Sonnet 4.6 --- .../com/recipeapp/shopping/ShoppingService.java | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git a/backend/src/main/java/com/recipeapp/shopping/ShoppingService.java b/backend/src/main/java/com/recipeapp/shopping/ShoppingService.java index e0658d0..4acdd3a 100644 --- a/backend/src/main/java/com/recipeapp/shopping/ShoppingService.java +++ b/backend/src/main/java/com/recipeapp/shopping/ShoppingService.java @@ -90,7 +90,7 @@ public class ShoppingService { if (ingredient.isStaple()) { continue; } - String key = ingredient.getId().toString() + "|" + ri.getUnit(); + String key = mergeKey(ingredient.getId(), ri.getUnit()); merged.computeIfAbsent(key, k -> new MergedIngredient(ingredient, ri.getUnit())) .addQuantity(ri.getQuantity()) .addRecipeId(recipe.getId()); @@ -103,7 +103,7 @@ public class ShoppingService { for (ShoppingListItem item : shoppingList.getItems()) { if (item.getSourceRecipes() != null && item.getSourceRecipes().length > 0) { // Generated item - String key = (item.getIngredient() != null ? item.getIngredient().getId().toString() : "") + "|" + item.getUnit(); + String key = mergeKey(item.getIngredient() != null ? item.getIngredient().getId() : null, item.getUnit()); existingByKey.put(key, item); } else { customItems.add(item); @@ -113,7 +113,7 @@ public class ShoppingService { // Merge: update existing, add new, collect keys to keep Set mergedKeys = new HashSet<>(); for (MergedIngredient mi : merged.values()) { - String key = mi.ingredient.getId().toString() + "|" + mi.unit; + String key = mergeKey(mi.ingredient.getId(), mi.unit); mergedKeys.add(key); ShoppingListItem existing = existingByKey.get(key); @@ -133,8 +133,9 @@ public class ShoppingService { // Remove generated items no longer in the plan shoppingList.getItems().removeIf(item -> item.getSourceRecipes() != null && item.getSourceRecipes().length > 0 - && !mergedKeys.contains( - (item.getIngredient() != null ? item.getIngredient().getId().toString() : "") + "|" + item.getUnit())); + && !mergedKeys.contains(mergeKey( + item.getIngredient() != null ? item.getIngredient().getId() : null, + item.getUnit()))); shoppingList.setGeneratedAt(java.time.Instant.now()); shoppingListRepository.save(shoppingList); @@ -308,6 +309,10 @@ public class ShoppingService { ); } + private static String mergeKey(UUID ingredientId, String unit) { + return (ingredientId != null ? ingredientId.toString() : "") + "|" + unit; + } + private static class MergedIngredient { final Ingredient ingredient; final String unit;