feat: revised shop list item api

This commit is contained in:
Zhongheng Liu 2026-01-21 14:37:40 +01:00
commit 79b46541a8
Signed by: steven
GPG key ID: F69B980899C1C09D
6 changed files with 145 additions and 17 deletions

View file

@ -21,8 +21,8 @@ import client.scenes.nutrition.NutritionDetailsCtrl;
import client.scenes.nutrition.NutritionViewCtrl; import client.scenes.nutrition.NutritionViewCtrl;
import client.scenes.recipe.IngredientListCtrl; import client.scenes.recipe.IngredientListCtrl;
import client.scenes.recipe.RecipeStepListCtrl; import client.scenes.recipe.RecipeStepListCtrl;
import client.service.NonFunctionalShoppingListService;
import client.service.ShoppingListService; import client.service.ShoppingListService;
import client.service.ShoppingListServiceImpl;
import client.service.ShoppingListViewModel; import client.service.ShoppingListViewModel;
import client.utils.ConfigService; import client.utils.ConfigService;
import client.utils.LocaleManager; import client.utils.LocaleManager;
@ -61,7 +61,7 @@ public class MyModule implements Module {
new WebSocketDataService<>() new WebSocketDataService<>()
); );
binder.bind(ShoppingListViewModel.class).toInstance(new ShoppingListViewModel()); binder.bind(ShoppingListViewModel.class).toInstance(new ShoppingListViewModel());
binder.bind(ShoppingListService.class).to(NonFunctionalShoppingListService.class); binder.bind(ShoppingListService.class).to(ShoppingListServiceImpl.class);
binder.bind(new TypeLiteral<WebSocketDataService<Long, Ingredient>>() {}).toInstance( binder.bind(new TypeLiteral<WebSocketDataService<Long, Ingredient>>() {}).toInstance(
new WebSocketDataService<>() new WebSocketDataService<>()
); );

View file

@ -3,12 +3,10 @@ package client.service;
import com.google.inject.Inject; import com.google.inject.Inject;
import commons.FormalIngredient; import commons.FormalIngredient;
import commons.Recipe; import commons.Recipe;
import commons.RecipeIngredient; import commons.Unit;
import javafx.util.Pair;
import org.apache.commons.lang3.NotImplementedException; import org.apache.commons.lang3.NotImplementedException;
import java.util.List; import java.util.List;
import java.util.Optional;
public class NonFunctionalShoppingListService extends ShoppingListService { public class NonFunctionalShoppingListService extends ShoppingListService {
@Inject @Inject
@ -32,7 +30,7 @@ public class NonFunctionalShoppingListService extends ShoppingListService {
} }
@Override @Override
public void putArbitraryItem(String name) { public void putArbitraryItem(Double amount, String name, Unit unit) {
throw new NotImplementedException(); throw new NotImplementedException();
} }
@ -52,7 +50,7 @@ public class NonFunctionalShoppingListService extends ShoppingListService {
} }
@Override @Override
public List<Pair<FormalIngredient, Optional<String>>> getItems() { public List<ShopListItem> getItems() {
throw new NotImplementedException(); throw new NotImplementedException();
} }

View file

@ -0,0 +1,32 @@
package client.service;
import commons.FormalIngredient;
public class ShopListItem {
private FormalIngredient ingredient;
private String refRecipeName;
public ShopListItem(FormalIngredient ingredient, String refRecipeName) {
this.ingredient = ingredient;
this.refRecipeName = refRecipeName;
}
public ShopListItem(FormalIngredient ingredient) {
this.ingredient = ingredient;
this.refRecipeName = null;
}
public FormalIngredient getIngredient() {
return ingredient;
}
public String getRefRecipeName() {
return refRecipeName;
}
public void setRefRecipeName(String refRecipeName) {
this.refRecipeName = refRecipeName;
}
public void setIngredient(FormalIngredient ingredient) {
this.ingredient = ingredient;
}
}

View file

@ -3,28 +3,31 @@ package client.service;
import com.google.inject.Inject; import com.google.inject.Inject;
import commons.FormalIngredient; import commons.FormalIngredient;
import commons.Recipe; import commons.Recipe;
import commons.RecipeIngredient; import commons.Unit;
import javafx.util.Pair;
import java.util.List; import java.util.List;
import java.util.Optional;
public abstract class ShoppingListService { public abstract class ShoppingListService {
private ShoppingListViewModel viewModel; private final ShoppingListViewModel viewModel;
@Inject @Inject
public ShoppingListService(ShoppingListViewModel viewModel) { public ShoppingListService(ShoppingListViewModel viewModel) {
this.viewModel = viewModel; this.viewModel = viewModel;
} }
public ShoppingListViewModel getViewModel() {
return viewModel;
}
public abstract void putIngredient(FormalIngredient ingredient); public abstract void putIngredient(FormalIngredient ingredient);
public abstract void putIngredient(FormalIngredient ingredient, Recipe recipe); public abstract void putIngredient(FormalIngredient ingredient, Recipe recipe);
public abstract void putIngredient(FormalIngredient ingredient, String recipeName); public abstract void putIngredient(FormalIngredient ingredient, String recipeName);
public abstract void putArbitraryItem(String name); public abstract void putArbitraryItem(Double amount, String name, Unit unit);
public abstract FormalIngredient purgeIngredient(Long id); public abstract FormalIngredient purgeIngredient(Long id);
public abstract FormalIngredient purgeIngredient(String ingredientName); public abstract FormalIngredient purgeIngredient(String ingredientName);
public abstract void reset(); public abstract void reset();
public abstract List<Pair<FormalIngredient, Optional<String>>> getItems(); public abstract List<ShopListItem> getItems();
public abstract String makePrintable(); public abstract String makePrintable();
} }

View file

@ -0,0 +1,65 @@
package client.service;
import com.google.inject.Inject;
import commons.FormalIngredient;
import commons.Recipe;
import commons.Unit;
import org.apache.commons.lang3.NotImplementedException;
import java.util.List;
public class ShoppingListServiceImpl extends ShoppingListService {
@Inject
public ShoppingListServiceImpl(ShoppingListViewModel viewModel) {
super(viewModel);
}
@Override
public void putIngredient(FormalIngredient ingredient) {
getViewModel().add(ingredient);
}
@Override
public void putIngredient(FormalIngredient ingredient, Recipe recipe) {
putIngredient(ingredient, recipe.getName());
}
@Override
public void putIngredient(FormalIngredient ingredient, String recipeName) {
getViewModel().add(ingredient, recipeName);
}
@Override
public void putArbitraryItem(Double amount, String name, Unit unit) {
throw new NotImplementedException();
}
@Override
public FormalIngredient purgeIngredient(Long id) {
FormalIngredient i = getViewModel().get(id).getIngredient();
getViewModel().delete(id);
return i;
}
@Override
public FormalIngredient purgeIngredient(String ingredientName) {
FormalIngredient i = getViewModel().get(ingredientName).getIngredient();
getViewModel().delete(ingredientName);
return i;
}
@Override
public void reset() {
throw new NotImplementedException();
}
@Override
public List<ShopListItem> getItems() {
return getViewModel().getListItems();
}
@Override
public String makePrintable() {
return "";
}
}

View file

@ -4,19 +4,49 @@ import commons.FormalIngredient;
import javafx.beans.property.ListProperty; import javafx.beans.property.ListProperty;
import javafx.beans.property.SimpleListProperty; import javafx.beans.property.SimpleListProperty;
import javafx.collections.FXCollections; import javafx.collections.FXCollections;
import javafx.util.Pair; import javafx.collections.ObservableList;
import org.apache.commons.lang3.NotImplementedException; import org.apache.commons.lang3.NotImplementedException;
import java.util.function.Predicate;
import java.util.Optional;
public class ShoppingListViewModel { public class ShoppingListViewModel {
/** /**
* The formal ingredient provides the ingredient and its amount, * The formal ingredient provides the ingredient and its amount,
* and the string (optional) describes the recipe where it came from. * and the string (optional) describes the recipe where it came from.
*/ */
private final ListProperty<Pair<FormalIngredient, Optional<String>>> listItems = new SimpleListProperty<>(FXCollections.observableArrayList()); private final ListProperty<ShopListItem> listItems = new SimpleListProperty<>(FXCollections.observableArrayList());
public void addArbitrary() { public void addArbitrary() {
throw new NotImplementedException(); throw new NotImplementedException();
} }
public void add(FormalIngredient formalIngredient) {
listItems.get().add(new ShopListItem(formalIngredient));
}
public void add(FormalIngredient formalIngredient, String recipeName) {
listItems.get().add(new ShopListItem(formalIngredient, recipeName));
}
public ShopListItem get(Long id) {
return get(item -> item.getIngredient().getId().equals(id));
}
private ShopListItem get(Predicate<ShopListItem> matcher) {
return listItems.get().stream()
.filter(matcher)
.findFirst()
.orElseThrow(NullPointerException::new);
}
public ShopListItem get(String recipeName) {
return get(i -> i.getRefRecipeName().equals(recipeName));
}
public void delete(Long id) {
throw new NotImplementedException();
}
public ObservableList<ShopListItem> getListItems() {
return listItems.get();
}
/**
* Deleting an item of name which is not associated to any recipe.
* @param name the name of the ingredient
*/
public void delete(String name) {
}
} }