diff --git a/.env.example b/.env.example new file mode 100644 index 0000000..0c0af2c --- /dev/null +++ b/.env.example @@ -0,0 +1,3 @@ +SPOONACCULAR_API_URL= +SPOONACCULAR_API_KEY= +SPOONACCULAR_API_SEARCH_RANKING= \ No newline at end of file diff --git a/.gitignore b/.gitignore index 0e580e5..ef5a5f4 100644 --- a/.gitignore +++ b/.gitignore @@ -92,3 +92,7 @@ out !gradle/wrapper/gradle-wrapper.jar frontend/src/index.js + +.env + +.DS_Store diff --git a/backend/src/main/spoonaccular/RecipeInformation.java b/backend/src/main/spoonaccular/RecipeInformation.java new file mode 100644 index 0000000..812e874 --- /dev/null +++ b/backend/src/main/spoonaccular/RecipeInformation.java @@ -0,0 +1,40 @@ +package spoonaccular; + +import com.fasterxml.jackson.databind.ObjectMapper; +import io.github.cdimascio.dotenv.Dotenv; +import org.springframework.stereotype.Component; +import spoonaccular.models.recipe_by_ingredient.ExtendedRecipeByIngredient; +import spoonaccular.models.recipe_by_ingredient.RecipeByIngredient; +import spoonaccular.models.recipe_information.Recipe; + +import java.io.IOException; +import java.net.URL; + +@Component +public class RecipeInformation { + + private final Dotenv dotenv; + + public RecipeInformation(){ + dotenv = Dotenv.load(); + } + + public Recipe getRecipeFromId(int id) throws IOException { + String urlString = dotenv.get("SPOONACCULAR_API_URL") + "/recipes/" + id + "/information?apiKey="+dotenv.get("SPOONACCULAR_API_KEY")+"&includeNutrition=false"; + URL url = new URL(urlString); + return new ObjectMapper().readValue(url, Recipe.class); + } + + public ExtendedRecipeByIngredient getExtendedRecipeFromId(int id) throws IOException { + String urlString = dotenv.get("SPOONACCULAR_API_URL") + "/recipes/" + id + "/information?apiKey="+dotenv.get("SPOONACCULAR_API_KEY")+"&includeNutrition=false"; + URL url = new URL(urlString); + return new ObjectMapper().readValue(url, ExtendedRecipeByIngredient.class); + } + + public ExtendedRecipeByIngredient getRecepieByIngredientsExtended(RecipeByIngredient recipeByIngredient) throws IOException { + ExtendedRecipeByIngredient extendedRecipeByIngredient = getExtendedRecipeFromId(recipeByIngredient.getId()); + extendedRecipeByIngredient.setMissedIngredients(recipeByIngredient.getMissedIngredients()); + return extendedRecipeByIngredient; + } + +} diff --git a/backend/src/main/spoonaccular/RecipeSearch.java b/backend/src/main/spoonaccular/RecipeSearch.java new file mode 100644 index 0000000..970a5e8 --- /dev/null +++ b/backend/src/main/spoonaccular/RecipeSearch.java @@ -0,0 +1,57 @@ +package spoonaccular; + +import com.fasterxml.jackson.databind.ObjectMapper; +import io.github.cdimascio.dotenv.Dotenv; +import org.json.JSONException; +import org.json.JSONObject; +import org.springframework.stereotype.Component; +import spoonaccular.models.recipe_by_ingredient.RecipeByIngredient; +import spoonaccular.models.recipe_information.Recipe; +import whattocook.models.Item; + +import java.io.IOException; +import java.net.URI; +import java.net.URL; +import java.net.http.HttpClient; +import java.net.http.HttpRequest; +import java.net.http.HttpResponse; +import java.util.LinkedList; +import java.util.List; +import java.util.Random; + +@Component +public class RecipeSearch { + private static final boolean IGNOREPANTRY = true; + + private final Random rnd; + private final Dotenv dotenv; + + public RecipeSearch(){ + rnd = new Random(); + dotenv = Dotenv.load(); + } + + public RecipeByIngredient[] getForIngridients(Iterable items, int number) throws java.io.IOException { + List itemNames = new LinkedList<>(); + items.forEach(item -> itemNames.add(item.getName())); + String ingridients = String.join(",", itemNames); + String urlString = dotenv.get("SPOONACCULAR_API_URL") + "/recipes/findByIngredients?apiKey=" + dotenv.get("SPOONACCULAR_API_KEY") + "&ingredients=" + ingridients + "&ranking=" + dotenv.get("SPOONACCULAR_API_SEARCH_RANKING") + "&ignorePantry=" + IGNOREPANTRY + "&number=" + number; + URL url = new URL(urlString); + return new ObjectMapper().readValue(url, RecipeByIngredient[].class); + } + + public RecipeByIngredient getOneForIngridients(Iterable items, int number) throws IOException { + return getForIngridients(items, number)[rnd.nextInt(number)]; + } + + public Recipe[] getRandom(List tags, int number) throws java.io.IOException, InterruptedException, JSONException { + String tagString = String.join(",", tags); + HttpRequest request = HttpRequest.newBuilder() + .uri(URI.create(dotenv.get("SPOONACCULAR_API_URL") + "/recipes/random?apiKey=" + dotenv.get("SPOONACCULAR_API_KEY") + "&number=" + number + "&tags=" + tagString)) + .method("GET", HttpRequest.BodyPublishers.noBody()) + .build(); + HttpResponse response = HttpClient.newHttpClient().send(request, HttpResponse.BodyHandlers.ofString()); + JSONObject jsonObject = new JSONObject(response.body()); + return new ObjectMapper().readValue(jsonObject.getJSONArray("recipes").toString(), Recipe[].class); + } +} diff --git a/backend/src/main/spoonaccular/models/recipe_by_ingredient/ExtendedRecipeByIngredient.java b/backend/src/main/spoonaccular/models/recipe_by_ingredient/ExtendedRecipeByIngredient.java new file mode 100644 index 0000000..d423728 --- /dev/null +++ b/backend/src/main/spoonaccular/models/recipe_by_ingredient/ExtendedRecipeByIngredient.java @@ -0,0 +1,59 @@ +package spoonaccular.models.recipe_by_ingredient; + +import com.fasterxml.jackson.annotation.JsonProperty; +import spoonaccular.models.recipe_information.Recipe; + +import java.util.List; + +public class ExtendedRecipeByIngredient extends Recipe { + + @JsonProperty("usedIngredientCount") + private Integer usedIngredientCount; + @JsonProperty("missedIngredientCount") + private Integer missedIngredientCount; + @JsonProperty("missedIngredients") + private List missedIngredients = null; + @JsonProperty("usedIngredients") + private List usedIngredients = null; + + @JsonProperty("usedIngredientCount") + public Integer getUsedIngredientCount() { + return usedIngredientCount; + } + + @JsonProperty("usedIngredientCount") + public void setUsedIngredientCount(Integer usedIngredientCount) { + this.usedIngredientCount = usedIngredientCount; + } + + @JsonProperty("missedIngredientCount") + public Integer getMissedIngredientCount() { + return missedIngredientCount; + } + + @JsonProperty("missedIngredientCount") + public void setMissedIngredientCount(Integer missedIngredientCount) { + this.missedIngredientCount = missedIngredientCount; + } + + @JsonProperty("missedIngredients") + public List getMissedIngredients() { + return missedIngredients; + } + + @JsonProperty("missedIngredients") + public void setMissedIngredients(List missedIngredients) { + this.missedIngredients = missedIngredients; + } + + @JsonProperty("usedIngredients") + public List getUsedIngredients() { + return usedIngredients; + } + + @JsonProperty("usedIngredients") + public void setUsedIngredients(List usedIngredients) { + this.usedIngredients = usedIngredients; + } + +} diff --git a/backend/src/main/spoonaccular/models/recipe_by_ingredient/MissedIngredient.java b/backend/src/main/spoonaccular/models/recipe_by_ingredient/MissedIngredient.java new file mode 100644 index 0000000..cbb953b --- /dev/null +++ b/backend/src/main/spoonaccular/models/recipe_by_ingredient/MissedIngredient.java @@ -0,0 +1,29 @@ + +package spoonaccular.models.recipe_by_ingredient; + +import com.fasterxml.jackson.annotation.*; + +import javax.annotation.Generated; + +@JsonInclude(JsonInclude.Include.NON_NULL) +@JsonIgnoreProperties(ignoreUnknown = true) +@JsonPropertyOrder({ + "name" +}) +@Generated("jsonschema2pojo") +public class MissedIngredient { + + @JsonProperty("name") + private String name; + + @JsonProperty("name") + public String getName() { + return name; + } + + @JsonProperty("name") + public void setName(String name) { + this.name = name; + } + +} diff --git a/backend/src/main/spoonaccular/models/recipe_by_ingredient/RecipeByIngredient.java b/backend/src/main/spoonaccular/models/recipe_by_ingredient/RecipeByIngredient.java new file mode 100644 index 0000000..1249f5c --- /dev/null +++ b/backend/src/main/spoonaccular/models/recipe_by_ingredient/RecipeByIngredient.java @@ -0,0 +1,108 @@ + +package spoonaccular.models.recipe_by_ingredient; + +import com.fasterxml.jackson.annotation.*; + +import javax.annotation.Generated; +import java.util.List; + +@JsonInclude(JsonInclude.Include.NON_NULL) +@JsonIgnoreProperties(ignoreUnknown = true) +@JsonPropertyOrder({ + "id", + "title", + "image", + "usedIngredientCount", + "missedIngredientCount", + "missedIngredients", + "usedIngredients", +}) +@Generated("jsonschema2pojo") +public class RecipeByIngredient { + + @JsonProperty("id") + private Integer id; + @JsonProperty("title") + private String title; + @JsonProperty("image") + private String image; + @JsonProperty("usedIngredientCount") + private Integer usedIngredientCount; + @JsonProperty("missedIngredientCount") + private Integer missedIngredientCount; + @JsonProperty("missedIngredients") + private List missedIngredients = null; + @JsonProperty("usedIngredients") + private List usedIngredients = null; + + @JsonProperty("id") + public Integer getId() { + return id; + } + + @JsonProperty("id") + public void setId(Integer id) { + this.id = id; + } + + @JsonProperty("title") + public String getTitle() { + return title; + } + + @JsonProperty("title") + public void setTitle(String title) { + this.title = title; + } + + @JsonProperty("image") + public String getImage() { + return image; + } + + @JsonProperty("image") + public void setImage(String image) { + this.image = image; + } + + @JsonProperty("usedIngredientCount") + public Integer getUsedIngredientCount() { + return usedIngredientCount; + } + + @JsonProperty("usedIngredientCount") + public void setUsedIngredientCount(Integer usedIngredientCount) { + this.usedIngredientCount = usedIngredientCount; + } + + @JsonProperty("missedIngredientCount") + public Integer getMissedIngredientCount() { + return missedIngredientCount; + } + + @JsonProperty("missedIngredientCount") + public void setMissedIngredientCount(Integer missedIngredientCount) { + this.missedIngredientCount = missedIngredientCount; + } + + @JsonProperty("missedIngredients") + public List getMissedIngredients() { + return missedIngredients; + } + + @JsonProperty("missedIngredients") + public void setMissedIngredients(List missedIngredients) { + this.missedIngredients = missedIngredients; + } + + @JsonProperty("usedIngredients") + public List getUsedIngredients() { + return usedIngredients; + } + + @JsonProperty("usedIngredients") + public void setUsedIngredients(List usedIngredients) { + this.usedIngredients = usedIngredients; + } + +} diff --git a/backend/src/main/spoonaccular/models/recipe_by_ingredient/UsedIngredient.java b/backend/src/main/spoonaccular/models/recipe_by_ingredient/UsedIngredient.java new file mode 100644 index 0000000..c3f20d5 --- /dev/null +++ b/backend/src/main/spoonaccular/models/recipe_by_ingredient/UsedIngredient.java @@ -0,0 +1,29 @@ + +package spoonaccular.models.recipe_by_ingredient; + +import com.fasterxml.jackson.annotation.*; + +import javax.annotation.Generated; + +@JsonInclude(JsonInclude.Include.NON_NULL) +@JsonIgnoreProperties(ignoreUnknown = true) +@JsonPropertyOrder({ + "name" +}) +@Generated("jsonschema2pojo") +public class UsedIngredient { + + @JsonProperty("name") + private String name; + + @JsonProperty("name") + public String getName() { + return name; + } + + @JsonProperty("name") + public void setName(String name) { + this.name = name; + } + +} diff --git a/backend/src/main/spoonaccular/models/recipe_information/ExtendedIngredient.java b/backend/src/main/spoonaccular/models/recipe_information/ExtendedIngredient.java new file mode 100644 index 0000000..6b2aa58 --- /dev/null +++ b/backend/src/main/spoonaccular/models/recipe_information/ExtendedIngredient.java @@ -0,0 +1,42 @@ + +package spoonaccular.models.recipe_information; + +import javax.annotation.Generated; + +import com.fasterxml.jackson.annotation.*; + +@JsonInclude(JsonInclude.Include.NON_NULL) +@JsonIgnoreProperties(ignoreUnknown = true) +@JsonPropertyOrder({ + "name", + "measures" +}) +@Generated("jsonschema2pojo") +public class ExtendedIngredient { + + @JsonProperty("name") + private String name; + @JsonProperty("measures") + private Measures measures; + + @JsonProperty("name") + public String getName() { + return name; + } + + @JsonProperty("name") + public void setName(String name) { + this.name = name; + } + + @JsonProperty("measures") + public Measures getMeasures() { + return measures; + } + + @JsonProperty("measures") + public void setMeasures(Measures measures) { + this.measures = measures; + } + +} diff --git a/backend/src/main/spoonaccular/models/recipe_information/Measures.java b/backend/src/main/spoonaccular/models/recipe_information/Measures.java new file mode 100644 index 0000000..960f417 --- /dev/null +++ b/backend/src/main/spoonaccular/models/recipe_information/Measures.java @@ -0,0 +1,31 @@ + +package spoonaccular.models.recipe_information; + +import java.util.HashMap; +import java.util.Map; +import javax.annotation.Generated; + +import com.fasterxml.jackson.annotation.*; + +@JsonInclude(JsonInclude.Include.NON_NULL) +@JsonIgnoreProperties(ignoreUnknown = true) +@JsonPropertyOrder({ + "metric" +}) +@Generated("jsonschema2pojo") +public class Measures { + + @JsonProperty("metric") + private Metric metric; + + @JsonProperty("metric") + public Metric getMetric() { + return metric; + } + + @JsonProperty("metric") + public void setMetric(Metric metric) { + this.metric = metric; + } + +} diff --git a/backend/src/main/spoonaccular/models/recipe_information/Metric.java b/backend/src/main/spoonaccular/models/recipe_information/Metric.java new file mode 100644 index 0000000..8443e22 --- /dev/null +++ b/backend/src/main/spoonaccular/models/recipe_information/Metric.java @@ -0,0 +1,42 @@ + +package spoonaccular.models.recipe_information; + +import javax.annotation.Generated; + +import com.fasterxml.jackson.annotation.*; + +@JsonInclude(JsonInclude.Include.NON_NULL) +@JsonIgnoreProperties(ignoreUnknown = true) +@JsonPropertyOrder({ + "amount", + "unitShort" +}) +@Generated("jsonschema2pojo") +public class Metric { + + @JsonProperty("amount") + private Double amount; + @JsonProperty("unitShort") + private String unitShort; + + @JsonProperty("amount") + public Double getAmount() { + return amount; + } + + @JsonProperty("amount") + public void setAmount(Double amount) { + this.amount = amount; + } + + @JsonProperty("unitShort") + public String getUnitShort() { + return unitShort; + } + + @JsonProperty("unitShort") + public void setUnitShort(String unitShort) { + this.unitShort = unitShort; + } + +} diff --git a/backend/src/main/spoonaccular/models/recipe_information/Recipe.java b/backend/src/main/spoonaccular/models/recipe_information/Recipe.java new file mode 100644 index 0000000..130a869 --- /dev/null +++ b/backend/src/main/spoonaccular/models/recipe_information/Recipe.java @@ -0,0 +1,150 @@ + +package spoonaccular.models.recipe_information; + +import java.util.List; +import javax.annotation.Generated; + +import com.fasterxml.jackson.annotation.*; + +@JsonInclude(JsonInclude.Include.NON_NULL) +@JsonIgnoreProperties(ignoreUnknown = true) +@JsonPropertyOrder({ + "vegetarian", + "vegan", + "glutenFree", + "dairyFree", + "extendedIngredients", + "id", + "title", + "readyInMinutes", + "servings", + "image", + "spoonacularSourceUrl" +}) +@Generated("jsonschema2pojo") +public class Recipe { + + @JsonProperty("vegetarian") + private Boolean vegetarian; + @JsonProperty("vegan") + private Boolean vegan; + @JsonProperty("glutenFree") + private Boolean glutenFree; + @JsonProperty("dairyFree") + private Boolean diaryFree; + @JsonProperty("extendedIngredients") + private List extendedIngredients = null; + @JsonProperty("id") + private Integer id; + @JsonProperty("title") + private String title; + @JsonProperty("readyInMinutes") + private Integer readyInMinutes; + @JsonProperty("servings") + private Integer servings; + @JsonProperty("image") + private String image; + @JsonProperty("spoonacularSourceUrl") + private String spoonacularSourceUrl; + + @JsonProperty("vegetarian") + public Boolean getVegetarian() { + return vegetarian; + } + + @JsonProperty("vegetarian") + public void setVegetarian(Boolean vegetarian) { + this.vegetarian = vegetarian; + } + + @JsonProperty("vegan") + public Boolean getVegan() { + return vegan; + } + + @JsonProperty("vegan") + public void setVegan(Boolean vegan) { + this.vegan = vegan; + } + + @JsonProperty("glutenFree") + public Boolean getGlutenFree() { + return glutenFree; + } + + @JsonProperty("glutenFree") + public void setGlutenFree(Boolean glutenFree) { + this.glutenFree = glutenFree; + } + + @JsonProperty("extendedIngredients") + public List getExtendedIngredients() { + return extendedIngredients; + } + + @JsonProperty("extendedIngredients") + public void setExtendedIngredients(List extendedIngredients) { + this.extendedIngredients = extendedIngredients; + } + + @JsonProperty("id") + public Integer getId() { + return id; + } + + @JsonProperty("id") + public void setId(Integer id) { + this.id = id; + } + + @JsonProperty("title") + public String getTitle() { + return title; + } + + @JsonProperty("title") + public void setTitle(String title) { + this.title = title; + } + + @JsonProperty("readyInMinutes") + public Integer getReadyInMinutes() { + return readyInMinutes; + } + + @JsonProperty("readyInMinutes") + public void setReadyInMinutes(Integer readyInMinutes) { + this.readyInMinutes = readyInMinutes; + } + + @JsonProperty("servings") + public Integer getServings() { + return servings; + } + + @JsonProperty("servings") + public void setServings(Integer servings) { + this.servings = servings; + } + + @JsonProperty("image") + public String getImage() { + return image; + } + + @JsonProperty("image") + public void setImage(String image) { + this.image = image; + } + + @JsonProperty("spoonacularSourceUrl") + public String getSpoonacularSourceUrl() { + return spoonacularSourceUrl; + } + + @JsonProperty("spoonacularSourceUrl") + public void setSpoonacularSourceUrl(String spoonacularSourceUrl) { + this.spoonacularSourceUrl = spoonacularSourceUrl; + } + +} diff --git a/backend/src/main/whattocook/Application.java b/backend/src/main/whattocook/Application.java index e6c2f04..51ce46f 100644 --- a/backend/src/main/whattocook/Application.java +++ b/backend/src/main/whattocook/Application.java @@ -11,7 +11,7 @@ import org.springframework.web.filter.CorsFilter; import java.util.Collections; -@SpringBootApplication +@SpringBootApplication(scanBasePackages = {"spoonaccular", "whattocook"}) public class Application { public static void main(String[] args) { diff --git a/backend/src/main/whattocook/Controller/SpoonacularController.java b/backend/src/main/whattocook/Controller/SpoonacularController.java deleted file mode 100644 index bfbf3f7..0000000 --- a/backend/src/main/whattocook/Controller/SpoonacularController.java +++ /dev/null @@ -1,49 +0,0 @@ -package whattocook.Controller; - - -import org.json.JSONArray; -import org.json.JSONException; -import org.json.JSONObject; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.http.HttpEntity; - -import org.springframework.web.bind.annotation.GetMapping; - -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; -import whattocook.services.SpoonacularApiService; -import whattocook.repositories.ItemRepository; - -import java.io.IOException; -import java.util.LinkedList; - -@RestController -@RequestMapping("/recipes") -public class SpoonacularController { - private int nextRecepies=10; - private int nextRecepiesForOneRandom=20; - @Autowired - private ItemRepository itemRepository; - @Autowired - private SpoonacularApiService service; - - @GetMapping("/forFridge") - public HttpEntity getForFridge() throws IOException, InterruptedException, JSONException { - return new HttpEntity(service.getForIngridients(itemRepository.findAll(), nextRecepies)); - } - - @GetMapping("/random") - public HttpEntity getRandom() throws IOException, InterruptedException, JSONException { - return new HttpEntity(service.getRandom(new LinkedList<>(), nextRecepies)); - //when user has food preferences apply instead of linked list. - } - - @GetMapping("/oneFridge") - public HttpEntity getOneFridge() throws IOException, InterruptedException, JSONException { - return new HttpEntity(service.getOneForIngridients(itemRepository.findAll(), nextRecepiesForOneRandom)); - } - - public void setNextRecepies(int nextRecepies) { - this.nextRecepies = nextRecepies; - } -} diff --git a/backend/src/main/whattocook/controller/SpoonacularController.java b/backend/src/main/whattocook/controller/SpoonacularController.java new file mode 100644 index 0000000..b517559 --- /dev/null +++ b/backend/src/main/whattocook/controller/SpoonacularController.java @@ -0,0 +1,52 @@ +package whattocook.controller; + +import org.json.JSONException; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; +import spoonaccular.RecipeInformation; +import spoonaccular.RecipeSearch; +import spoonaccular.models.recipe_by_ingredient.ExtendedRecipeByIngredient; +import spoonaccular.models.recipe_by_ingredient.RecipeByIngredient; +import spoonaccular.models.recipe_information.Recipe; +import whattocook.repositories.ItemRepository; + +import java.io.IOException; +import java.util.LinkedList; + +@RestController() +@RequestMapping(path = "recipe") +public class SpoonacularController { + private int nextRecepies=10; + private int nextRecepiesForOneRandom=20; + @Autowired + private ItemRepository itemRepository; + @Autowired + private RecipeInformation recipeInformation; + @Autowired + private RecipeSearch recipeSearch; + + @GetMapping("/forFridge") + public RecipeByIngredient[] getForFridge() throws IOException { + return recipeSearch.getForIngridients(itemRepository.findAll(), nextRecepies); + } + + @GetMapping("/random") + public Recipe[] getRandom() throws IOException, InterruptedException, JSONException { + return recipeSearch.getRandom(new LinkedList<>(), nextRecepies); + //when user has food preferences apply instead of linked list. + } + + @GetMapping("/oneFridge") + public ExtendedRecipeByIngredient getOneFridge() throws IOException { + RecipeByIngredient recipe = recipeSearch.getOneForIngridients(itemRepository.findAll(), nextRecepiesForOneRandom); + return recipeInformation.getRecepieByIngredientsExtended(recipe); + } + + @GetMapping("/info/{id}") + public Recipe getInfo(@PathVariable int id) throws IOException { + return recipeInformation.getRecipeFromId(id); + } +} diff --git a/backend/src/main/whattocook/implementation/SpoonacularApiServiceImpl.java b/backend/src/main/whattocook/implementation/SpoonacularApiServiceImpl.java deleted file mode 100644 index 557f2cc..0000000 --- a/backend/src/main/whattocook/implementation/SpoonacularApiServiceImpl.java +++ /dev/null @@ -1,86 +0,0 @@ -package whattocook.implementation; - - -import org.springframework.stereotype.Service; -import whattocook.models.Item; -import whattocook.services.SpoonacularApiService; -import org.json.*; - -import java.io.IOException; -import java.net.http.HttpResponse; -import java.net.http.HttpRequest; -import java.net.http.HttpClient; -import java.net.URI; -import java.util.Iterator; -import java.util.Random; - -@Service -public class SpoonacularApiServiceImpl implements SpoonacularApiService { - private final String KEY = "85cc006d508b447a88e659cd748899db"; - private final String RANKING = "2"; - private final boolean IGNOREPANTRY = true; - Random rnd=new Random(); - - public JSONArray getForIngridients(Iterable items, int number) throws java.io.IOException, InterruptedException, JSONException { - Iterator itemIterator = items.iterator(); - if (!itemIterator.hasNext()) { - return getRandom(new java.util.LinkedList(), number); - } else { - String ingridients = itemIterator.next().getName(); - for (Iterator it = itemIterator; it.hasNext(); ) { - Item curryItem = it.next(); - - - ingridients += "," + curryItem.getName(); - } - java.net.http.HttpRequest request = java.net.http.HttpRequest.newBuilder() - .uri(java.net.URI.create("https://api.spoonacular.com/recipes/findByIngredients?apiKey=" + KEY + "&ingredients=" + ingridients + "&ranking=" + RANKING + "&ignorePantry=" + IGNOREPANTRY + "&number=" + number)) - .method("GET", java.net.http.HttpRequest.BodyPublishers.noBody()) - .build(); - java.net.http.HttpResponse response = java.net.http.HttpClient.newHttpClient().send(request, java.net.http.HttpResponse.BodyHandlers.ofString()); - - JSONArray array=new JSONArray(response.body()); - return array; - - - } - } - - @Override - public JSONObject getOneForIngridients(Iterable items, int number) throws IOException, InterruptedException, JSONException { - JSONArray array= getForIngridients(items, number); - - - return array.getJSONObject(rnd.nextInt(20)); - } - - public JSONArray getRandom(java.util.List tags, int number) throws java.io.IOException, InterruptedException, JSONException { - if (tags.isEmpty()) { - HttpRequest request = HttpRequest.newBuilder() - .uri(URI.create("https://api.spoonacular.com/recipes/random?apiKey=" + KEY + "&number=" + number)) - .method("GET", HttpRequest.BodyPublishers.noBody()) - .build(); - HttpResponse response = HttpClient.newHttpClient().send(request, HttpResponse.BodyHandlers.ofString()); - - JSONArray array=new JSONArray(response.body()); - return array; - - } else { - String tagString = tags.get(0); - for (int i = 1; i < tags.size(); i++) { - tagString += "," + tags.get(i); - } - HttpRequest request = HttpRequest.newBuilder() - .uri(URI.create("https://api.spoonacular.com/recipes/random?apiKey=" + KEY + "&number=" + number + "&tags=" + tagString)) - .method("GET", HttpRequest.BodyPublishers.noBody()) - .build(); - HttpResponse response = HttpClient.newHttpClient().send(request, HttpResponse.BodyHandlers.ofString()); - JSONArray array=new JSONArray(response.body()); - return array; - } - } - - - - -} diff --git a/backend/src/main/whattocook/services/SpoonacularApiService.java b/backend/src/main/whattocook/services/SpoonacularApiService.java deleted file mode 100644 index 8e18814..0000000 --- a/backend/src/main/whattocook/services/SpoonacularApiService.java +++ /dev/null @@ -1,13 +0,0 @@ -package whattocook.services; - -import org.json.JSONArray; -import org.json.JSONException; -import org.json.JSONObject; -import whattocook.models.Item; - -public interface SpoonacularApiService { - JSONArray getForIngridients(Iterable items, int number) throws java.io.IOException, InterruptedException, JSONException; - JSONObject getOneForIngridients(Iterable items, int number) throws java.io.IOException, InterruptedException, JSONException; - - JSONArray getRandom(java.util.List tags, int number) throws java.io.IOException, InterruptedException, JSONException; -} diff --git a/build.gradle b/build.gradle index 26ce9e8..244c645 100644 --- a/build.gradle +++ b/build.gradle @@ -29,10 +29,12 @@ dependencies { // https://mvnrepository.com/artifact/com.h2database/h2 implementation group: 'com.h2database', name: 'h2', version: '1.3.148' - //lombok + // lombok compileOnly 'org.projectlombok:lombok:1.18.24' annotationProcessor 'org.projectlombok:lombok:1.18.24' + implementation 'io.github.cdimascio:dotenv-java:2.2.4' + testCompileOnly 'org.projectlombok:lombok:1.18.24' testAnnotationProcessor 'org.projectlombok:lombok:1.18.24'