From e03415981f383c9d857143311ed3f14e50ce25bc Mon Sep 17 00:00:00 2001 From: Alan Di Giovanni Date: Mon, 14 Jul 2025 22:24:06 -0300 Subject: [PATCH 1/6] feat(PC-136): Added not include to meal preps --- .../controller/MealPrepControllerAdapter.java | 13 +++-- .../controller/RecipeControllerAdapter.java | 4 +- .../model/MealPrepConfigurationRequest.java | 18 +++++++ .../in/controller/model/MealPrepRequest.java | 1 + .../in/controller/model/MealPrepResponse.java | 1 - ...n.java => RecipeConfigurationRequest.java} | 2 +- .../in/controller/model/RecipeRequest.java | 2 +- ...alPrepsByIdsDatabaseRepositoryAdapter.java | 27 ++++++++++ ...lPrepsByIdsHibernateRepositoryAdapter.java | 6 +++ ...ngredientsGeminiRestRepositoryAdapter.java | 49 +++++++++++++---- .../model/RecipeRequestGeminiModel.java | 31 +++++++++++ .../in/GetMealPrepFromIngredientsCommand.java | 3 ++ .../out/GetAllMealPrepsByIdsRepository.java | 9 ++++ .../usecase/FindOrCreateRecipeUseCase.java | 3 +- .../GetMealPrepsFromIngredientsUseCase.java | 54 +++++++++++++++---- .../application/usecase/model/MealPrep.java | 2 + .../usecase/model/MealPrepConfiguration.java | 14 +++++ .../application/usecase/model/Recipe.java | 2 + .../cuoco/shared/model/ErrorDescription.java | 3 ++ ...ateMealPrepFromIngredientsHeaderPrompt.txt | 2 + ...erateRecipeFromIngredientsHeaderPrompt.txt | 4 +- 21 files changed, 216 insertions(+), 34 deletions(-) create mode 100644 src/main/java/com/cuoco/adapter/in/controller/model/MealPrepConfigurationRequest.java rename src/main/java/com/cuoco/adapter/in/controller/model/{RecipeConfiguration.java => RecipeConfigurationRequest.java} (92%) create mode 100644 src/main/java/com/cuoco/adapter/out/hibernate/GetAllMealPrepsByIdsDatabaseRepositoryAdapter.java create mode 100644 src/main/java/com/cuoco/adapter/out/hibernate/repository/GetAllMealPrepsByIdsHibernateRepositoryAdapter.java create mode 100644 src/main/java/com/cuoco/adapter/out/rest/gemini/model/RecipeRequestGeminiModel.java create mode 100644 src/main/java/com/cuoco/application/port/out/GetAllMealPrepsByIdsRepository.java create mode 100644 src/main/java/com/cuoco/application/usecase/model/MealPrepConfiguration.java diff --git a/src/main/java/com/cuoco/adapter/in/controller/MealPrepControllerAdapter.java b/src/main/java/com/cuoco/adapter/in/controller/MealPrepControllerAdapter.java index 485567a..ff3f73e 100644 --- a/src/main/java/com/cuoco/adapter/in/controller/MealPrepControllerAdapter.java +++ b/src/main/java/com/cuoco/adapter/in/controller/MealPrepControllerAdapter.java @@ -2,19 +2,17 @@ import com.cuoco.adapter.in.controller.model.IngredientRequest; import com.cuoco.adapter.in.controller.model.IngredientResponse; +import com.cuoco.adapter.in.controller.model.MealPrepConfigurationRequest; +import com.cuoco.adapter.in.controller.model.MealPrepFilterRequest; import com.cuoco.adapter.in.controller.model.MealPrepRequest; import com.cuoco.adapter.in.controller.model.MealPrepResponse; -import com.cuoco.adapter.in.controller.model.ParametricResponse; import com.cuoco.adapter.in.controller.model.RecipeResponse; import com.cuoco.adapter.in.controller.model.StepResponse; -import com.cuoco.adapter.in.controller.model.UnitResponse; -import com.cuoco.adapter.out.hibernate.CreateUserDatabaseRepositoryAdapter; import com.cuoco.application.port.in.GetMealPrepByIdQuery; import com.cuoco.application.port.in.GetMealPrepFromIngredientsCommand; import com.cuoco.application.usecase.model.Ingredient; import com.cuoco.application.usecase.model.MealPrep; import com.cuoco.application.usecase.model.Recipe; -import com.cuoco.application.usecase.model.Step; import com.cuoco.shared.GlobalExceptionHandler; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.media.ArraySchema; @@ -76,7 +74,6 @@ public ResponseEntity> generate(@RequestBody MealPrepRequ log.info("Executing GET mealPrep from ingredients with body {}", mealPrepRequest); List mealPreps = getMealPrepFromIngredientsCommand.execute(buildGenerateMealPrepCommand(mealPrepRequest)); - List mealPrepsResponse = mealPreps.stream().map(this::buildResponse).toList(); log.info("Successfully generated recipes"); @@ -121,6 +118,10 @@ public ResponseEntity getById(@PathVariable Long id) { } private GetMealPrepFromIngredientsCommand.Command buildGenerateMealPrepCommand(MealPrepRequest mealPrepRequest) { + + if(mealPrepRequest.getFilters() == null) mealPrepRequest.setFilters(new MealPrepFilterRequest()); + if(mealPrepRequest.getConfiguration() == null) mealPrepRequest.setConfiguration(new MealPrepConfigurationRequest()); + return GetMealPrepFromIngredientsCommand.Command.builder() .ingredients(mealPrepRequest.getIngredients().stream().map(this::buildIngredient).toList()) .freeze(mealPrepRequest.getFilters().getFreeze()) @@ -131,6 +132,8 @@ private GetMealPrepFromIngredientsCommand.Command buildGenerateMealPrepCommand(M .typeIds(mealPrepRequest.getFilters().getTypeIds()) .allergiesIds(mealPrepRequest.getFilters().getAllergiesIds()) .dietaryNeedsIds(mealPrepRequest.getFilters().getDietaryNeedsIds()) + .size(mealPrepRequest.getConfiguration().getSize()) + .notInclude(mealPrepRequest.getConfiguration().getNotInclude()) .build(); } diff --git a/src/main/java/com/cuoco/adapter/in/controller/RecipeControllerAdapter.java b/src/main/java/com/cuoco/adapter/in/controller/RecipeControllerAdapter.java index fde8f09..8cb8fa1 100644 --- a/src/main/java/com/cuoco/adapter/in/controller/RecipeControllerAdapter.java +++ b/src/main/java/com/cuoco/adapter/in/controller/RecipeControllerAdapter.java @@ -3,7 +3,7 @@ import com.cuoco.adapter.in.controller.model.IngredientRequest; import com.cuoco.adapter.in.controller.model.IngredientResponse; import com.cuoco.adapter.in.controller.model.ParametricResponse; -import com.cuoco.adapter.in.controller.model.RecipeConfiguration; +import com.cuoco.adapter.in.controller.model.RecipeConfigurationRequest; import com.cuoco.adapter.in.controller.model.RecipeFilterRequest; import com.cuoco.adapter.in.controller.model.RecipeRequest; import com.cuoco.adapter.in.controller.model.RecipeResponse; @@ -208,7 +208,7 @@ private GetRecipesFromIngredientsCommand.Command buildGenerateRecipeCommand(Reci recipeRequest.setFilters(new RecipeFilterRequest()); } - if(recipeRequest.getConfiguration() == null) recipeRequest.setConfiguration(new RecipeConfiguration()); + if(recipeRequest.getConfiguration() == null) recipeRequest.setConfiguration(new RecipeConfigurationRequest()); return GetRecipesFromIngredientsCommand.Command.builder() .filtersEnabled(filtersEnabled) diff --git a/src/main/java/com/cuoco/adapter/in/controller/model/MealPrepConfigurationRequest.java b/src/main/java/com/cuoco/adapter/in/controller/model/MealPrepConfigurationRequest.java new file mode 100644 index 0000000..055aa06 --- /dev/null +++ b/src/main/java/com/cuoco/adapter/in/controller/model/MealPrepConfigurationRequest.java @@ -0,0 +1,18 @@ +package com.cuoco.adapter.in.controller.model; + +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import com.fasterxml.jackson.annotation.JsonInclude; +import com.fasterxml.jackson.databind.PropertyNamingStrategies; +import com.fasterxml.jackson.databind.annotation.JsonNaming; +import lombok.Data; + +import java.util.List; + +@Data +@JsonInclude(JsonInclude.Include.NON_NULL) +@JsonNaming(PropertyNamingStrategies.SnakeCaseStrategy.class) +@JsonIgnoreProperties(ignoreUnknown = true) +public class MealPrepConfigurationRequest { + private Integer size; + private List notInclude; +} diff --git a/src/main/java/com/cuoco/adapter/in/controller/model/MealPrepRequest.java b/src/main/java/com/cuoco/adapter/in/controller/model/MealPrepRequest.java index d620c29..2dba38f 100644 --- a/src/main/java/com/cuoco/adapter/in/controller/model/MealPrepRequest.java +++ b/src/main/java/com/cuoco/adapter/in/controller/model/MealPrepRequest.java @@ -19,4 +19,5 @@ public class MealPrepRequest { @NotEmpty(message = "Es requerido un ingrediente como minimo") private List ingredients; private MealPrepFilterRequest filters; + private MealPrepConfigurationRequest configuration; } diff --git a/src/main/java/com/cuoco/adapter/in/controller/model/MealPrepResponse.java b/src/main/java/com/cuoco/adapter/in/controller/model/MealPrepResponse.java index ede2d3e..da867d2 100644 --- a/src/main/java/com/cuoco/adapter/in/controller/model/MealPrepResponse.java +++ b/src/main/java/com/cuoco/adapter/in/controller/model/MealPrepResponse.java @@ -23,5 +23,4 @@ public class MealPrepResponse { private List steps; private List recipes; private List ingredients; - } diff --git a/src/main/java/com/cuoco/adapter/in/controller/model/RecipeConfiguration.java b/src/main/java/com/cuoco/adapter/in/controller/model/RecipeConfigurationRequest.java similarity index 92% rename from src/main/java/com/cuoco/adapter/in/controller/model/RecipeConfiguration.java rename to src/main/java/com/cuoco/adapter/in/controller/model/RecipeConfigurationRequest.java index abb2976..9dd505c 100644 --- a/src/main/java/com/cuoco/adapter/in/controller/model/RecipeConfiguration.java +++ b/src/main/java/com/cuoco/adapter/in/controller/model/RecipeConfigurationRequest.java @@ -12,7 +12,7 @@ @JsonInclude(JsonInclude.Include.NON_NULL) @JsonNaming(PropertyNamingStrategies.SnakeCaseStrategy.class) @JsonIgnoreProperties(ignoreUnknown = true) -public class RecipeConfiguration { +public class RecipeConfigurationRequest { private Integer size; private List notInclude; } diff --git a/src/main/java/com/cuoco/adapter/in/controller/model/RecipeRequest.java b/src/main/java/com/cuoco/adapter/in/controller/model/RecipeRequest.java index bbdadab..967b868 100644 --- a/src/main/java/com/cuoco/adapter/in/controller/model/RecipeRequest.java +++ b/src/main/java/com/cuoco/adapter/in/controller/model/RecipeRequest.java @@ -19,5 +19,5 @@ public class RecipeRequest { @NotEmpty(message = "Es requerido un ingrediente como minimo") private List ingredients; private RecipeFilterRequest filters; - private RecipeConfiguration configuration; + private RecipeConfigurationRequest configuration; } \ No newline at end of file diff --git a/src/main/java/com/cuoco/adapter/out/hibernate/GetAllMealPrepsByIdsDatabaseRepositoryAdapter.java b/src/main/java/com/cuoco/adapter/out/hibernate/GetAllMealPrepsByIdsDatabaseRepositoryAdapter.java new file mode 100644 index 0000000..6444d80 --- /dev/null +++ b/src/main/java/com/cuoco/adapter/out/hibernate/GetAllMealPrepsByIdsDatabaseRepositoryAdapter.java @@ -0,0 +1,27 @@ +package com.cuoco.adapter.out.hibernate; + +import com.cuoco.adapter.out.hibernate.model.MealPrepHibernateModel; +import com.cuoco.adapter.out.hibernate.repository.GetAllMealPrepsByIdsHibernateRepositoryAdapter; +import com.cuoco.application.port.out.GetAllMealPrepsByIdsRepository; +import com.cuoco.application.usecase.model.MealPrep; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Repository; + +import java.util.List; + +@Slf4j +@Repository +@RequiredArgsConstructor +public class GetAllMealPrepsByIdsDatabaseRepositoryAdapter implements GetAllMealPrepsByIdsRepository { + + private final GetAllMealPrepsByIdsHibernateRepositoryAdapter getAllMealPrepsByIdsHibernateRepositoryAdapter; + + @Override + public List execute(List ids) { + log.info("Get all meal preps by ids: {}", ids); + + List recipes = getAllMealPrepsByIdsHibernateRepositoryAdapter.findAllById(ids); + return recipes.stream().map(MealPrepHibernateModel::toDomain).toList(); + } +} diff --git a/src/main/java/com/cuoco/adapter/out/hibernate/repository/GetAllMealPrepsByIdsHibernateRepositoryAdapter.java b/src/main/java/com/cuoco/adapter/out/hibernate/repository/GetAllMealPrepsByIdsHibernateRepositoryAdapter.java new file mode 100644 index 0000000..a512237 --- /dev/null +++ b/src/main/java/com/cuoco/adapter/out/hibernate/repository/GetAllMealPrepsByIdsHibernateRepositoryAdapter.java @@ -0,0 +1,6 @@ +package com.cuoco.adapter.out.hibernate.repository; + +import com.cuoco.adapter.out.hibernate.model.MealPrepHibernateModel; +import org.springframework.data.jpa.repository.JpaRepository; + +public interface GetAllMealPrepsByIdsHibernateRepositoryAdapter extends JpaRepository {} diff --git a/src/main/java/com/cuoco/adapter/out/rest/gemini/GetMealPrepsFromIngredientsGeminiRestRepositoryAdapter.java b/src/main/java/com/cuoco/adapter/out/rest/gemini/GetMealPrepsFromIngredientsGeminiRestRepositoryAdapter.java index 1792aff..196640c 100644 --- a/src/main/java/com/cuoco/adapter/out/rest/gemini/GetMealPrepsFromIngredientsGeminiRestRepositoryAdapter.java +++ b/src/main/java/com/cuoco/adapter/out/rest/gemini/GetMealPrepsFromIngredientsGeminiRestRepositoryAdapter.java @@ -3,6 +3,7 @@ import com.cuoco.adapter.exception.NotAvailableException; import com.cuoco.adapter.exception.UnprocessableException; import com.cuoco.adapter.out.rest.gemini.model.MealPrepResponseGeminiModel; +import com.cuoco.adapter.out.rest.gemini.model.RecipeRequestGeminiModel; import com.cuoco.adapter.out.rest.gemini.model.wrapper.ContentGeminiRequestModel; import com.cuoco.adapter.out.rest.gemini.model.wrapper.GeminiResponseModel; import com.cuoco.adapter.out.rest.gemini.model.wrapper.GenerationConfigurationGeminiRequestModel; @@ -11,7 +12,11 @@ import com.cuoco.adapter.out.rest.gemini.utils.Constants; import com.cuoco.adapter.out.rest.gemini.utils.Utils; import com.cuoco.application.port.out.GetMealPrepsFromIngredientsRepository; +import com.cuoco.application.usecase.model.Allergy; +import com.cuoco.application.usecase.model.DietaryNeed; +import com.cuoco.application.usecase.model.Ingredient; import com.cuoco.application.usecase.model.MealPrep; +import com.cuoco.application.usecase.model.MealType; import com.cuoco.application.usecase.model.Recipe; import com.cuoco.shared.FileReader; import com.cuoco.shared.model.ErrorDescription; @@ -56,16 +61,12 @@ public List execute(MealPrep mealPrep) { try { log.info("Executing meal prep generation from Gemini with ingredients: {}", mealPrep.getIngredients()); - List recipesJson = mealPrep.getRecipes().stream().map(value -> { - try { - return objectMapper.writeValueAsString(value); - } catch (JsonProcessingException e) { - throw new NotAvailableException(ErrorDescription.NOT_AVAILABLE.getValue()); - } - }).toList(); + String recipesJson = buildRecipesJson(mealPrep.getRecipes()); + String mealPrepsToNotInclude = buildMealPrepsToNotInclude(mealPrep.getConfiguration().getNotInclude()); String basicPrompt = BASIC_PROMPT - .replace(Constants.RECIPES.getValue(), objectMapper.writeValueAsString(recipesJson)) + .replace(Constants.RECIPES.getValue(), recipesJson) + .replace(Constants.NOT_INCLUDE.getValue(), mealPrepsToNotInclude) .replace(Constants.MAX_MEAL_PREPS.getValue(), mealPrep.getFilters().getServings().toString()) .replace(Constants.FREEZE.getValue(), mealPrep.getFilters().getFreeze().toString()); @@ -96,14 +97,40 @@ public List execute(MealPrep mealPrep) { return mealPreps; } catch (JsonProcessingException e) { - log.error("Error generating meal preps from Gemini", e); - throw new NotAvailableException("Failed to generate meal preps"); + log.error("Failed to convert JSON in meal preps gemini adapter. ", e); + throw new NotAvailableException(ErrorDescription.NOT_AVAILABLE.getValue()); } catch (Exception e) { log.error("Error generating meal preps from Gemini", e); - throw new UnprocessableException("Failed to generate meal preps"); + throw new NotAvailableException(ErrorDescription.NOT_AVAILABLE.getValue()); } } + private String buildRecipesJson(List recipes) throws JsonProcessingException { + List requests = recipes.stream().map(this::buildRecipeRequest).toList(); + return objectMapper.writeValueAsString(requests); + } + + private RecipeRequestGeminiModel buildRecipeRequest(Recipe recipe) { + return RecipeRequestGeminiModel.builder() + .id(recipe.getId()) + .name(recipe.getName()) + .subtitle(recipe.getSubtitle()) + .description(recipe.getDescription()) + .preparationTime(recipe.getPreparationTime().getDescription()) + .cookLevelName(recipe.getCookLevel().getDescription()) + .dietName(recipe.getDiet().getDescription()) + .mealTypesNames(recipe.getMealTypes().stream().map(MealType::getDescription).toList()) + .allergiesNames(recipe.getAllergies().stream().map(Allergy::getDescription).toList()) + .dietaryNeedsNames(recipe.getDietaryNeeds().stream().map(DietaryNeed::getDescription).toList()) + .ingredientNames(recipe.getIngredients().stream().map(Ingredient::getName).toList()) + .build(); + } + + private String buildMealPrepsToNotInclude(List mealPrepsToNotInclude) throws JsonProcessingException { + List notInclude = mealPrepsToNotInclude.stream().map(MealPrep::getTitle).toList(); + return objectMapper.writeValueAsString(notInclude); + } + private PromptBodyGeminiRequestModel buildPromptBody(String prompt) { return PromptBodyGeminiRequestModel.builder() .contents(List.of(ContentGeminiRequestModel.builder().parts(buildPartsRequest(prompt)).build())) diff --git a/src/main/java/com/cuoco/adapter/out/rest/gemini/model/RecipeRequestGeminiModel.java b/src/main/java/com/cuoco/adapter/out/rest/gemini/model/RecipeRequestGeminiModel.java new file mode 100644 index 0000000..0cc6bd0 --- /dev/null +++ b/src/main/java/com/cuoco/adapter/out/rest/gemini/model/RecipeRequestGeminiModel.java @@ -0,0 +1,31 @@ +package com.cuoco.adapter.out.rest.gemini.model; + +import com.fasterxml.jackson.annotation.JsonIgnoreProperties; +import com.fasterxml.jackson.annotation.JsonInclude; +import com.fasterxml.jackson.databind.PropertyNamingStrategies; +import com.fasterxml.jackson.databind.annotation.JsonNaming; +import lombok.Builder; +import lombok.Data; + +import java.util.List; + +@Data +@Builder +@JsonInclude(JsonInclude.Include.NON_NULL) +@JsonNaming(PropertyNamingStrategies.SnakeCaseStrategy.class) +@JsonIgnoreProperties(ignoreUnknown = true) +public class RecipeRequestGeminiModel { + + private Long id; + private String name; + private String subtitle; + private String description; + + private String preparationTime; + private String cookLevelName; + private String dietName; + private List mealTypesNames; + private List allergiesNames; + private List dietaryNeedsNames; + private List ingredientNames; +} diff --git a/src/main/java/com/cuoco/application/port/in/GetMealPrepFromIngredientsCommand.java b/src/main/java/com/cuoco/application/port/in/GetMealPrepFromIngredientsCommand.java index 1158f99..1194a5e 100644 --- a/src/main/java/com/cuoco/application/port/in/GetMealPrepFromIngredientsCommand.java +++ b/src/main/java/com/cuoco/application/port/in/GetMealPrepFromIngredientsCommand.java @@ -26,6 +26,9 @@ class Command { private List typeIds; private List allergiesIds; private List dietaryNeedsIds; + + private Integer size; + private List notInclude; } } diff --git a/src/main/java/com/cuoco/application/port/out/GetAllMealPrepsByIdsRepository.java b/src/main/java/com/cuoco/application/port/out/GetAllMealPrepsByIdsRepository.java new file mode 100644 index 0000000..85e1ea4 --- /dev/null +++ b/src/main/java/com/cuoco/application/port/out/GetAllMealPrepsByIdsRepository.java @@ -0,0 +1,9 @@ +package com.cuoco.application.port.out; + +import com.cuoco.application.usecase.model.MealPrep; + +import java.util.List; + +public interface GetAllMealPrepsByIdsRepository { + List execute(List ids); +} diff --git a/src/main/java/com/cuoco/application/usecase/FindOrCreateRecipeUseCase.java b/src/main/java/com/cuoco/application/usecase/FindOrCreateRecipeUseCase.java index f2794fb..901c4cf 100644 --- a/src/main/java/com/cuoco/application/usecase/FindOrCreateRecipeUseCase.java +++ b/src/main/java/com/cuoco/application/usecase/FindOrCreateRecipeUseCase.java @@ -8,6 +8,7 @@ import com.cuoco.application.usecase.domainservice.RecipeDomainService; import com.cuoco.application.usecase.model.ParametricData; import com.cuoco.application.usecase.model.Recipe; +import com.cuoco.shared.model.ErrorDescription; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Component; @@ -48,7 +49,7 @@ public Recipe execute(Command command) { Recipe generatedRecipe = createRecipeByNameRepository.execute(command.getRecipeName(), parametricData); if (generatedRecipe == null) { - throw new RecipeGenerationException("Could not generate recipe for: " + command.getRecipeName()); + throw new RecipeGenerationException(ErrorDescription.CANNOT_GENERATE_RECIPE.getValue()); } Recipe savedRecipe = createRecipeRepository.execute(generatedRecipe); diff --git a/src/main/java/com/cuoco/application/usecase/GetMealPrepsFromIngredientsUseCase.java b/src/main/java/com/cuoco/application/usecase/GetMealPrepsFromIngredientsUseCase.java index b3115ed..b806ad3 100644 --- a/src/main/java/com/cuoco/application/usecase/GetMealPrepsFromIngredientsUseCase.java +++ b/src/main/java/com/cuoco/application/usecase/GetMealPrepsFromIngredientsUseCase.java @@ -4,6 +4,7 @@ import com.cuoco.application.exception.ForbiddenException; import com.cuoco.application.port.in.GetMealPrepFromIngredientsCommand; import com.cuoco.application.port.out.CreateAllMealPrepsRepository; +import com.cuoco.application.port.out.GetAllMealPrepsByIdsRepository; import com.cuoco.application.port.out.GetAllergiesByIdRepository; import com.cuoco.application.port.out.GetCookLevelByIdRepository; import com.cuoco.application.port.out.GetDietByIdRepository; @@ -20,6 +21,7 @@ import com.cuoco.application.usecase.model.Filters; import com.cuoco.application.usecase.model.Ingredient; import com.cuoco.application.usecase.model.MealPrep; +import com.cuoco.application.usecase.model.MealPrepConfiguration; import com.cuoco.application.usecase.model.MealType; import com.cuoco.application.usecase.model.PreparationTime; import com.cuoco.application.usecase.model.Recipe; @@ -30,10 +32,10 @@ import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.beans.factory.annotation.Value; -import org.springframework.security.core.context.SecurityContextHolder; import org.springframework.stereotype.Component; import java.util.List; +import java.util.stream.Collectors; @Slf4j @Component @@ -48,6 +50,7 @@ public class GetMealPrepsFromIngredientsUseCase implements GetMealPrepFromIngred private final UserDomainService userDomainService; private final RecipeDomainService recipeDomainService; private final GetMealPrepsFromIngredientsRepository getMealPrepsFromIngredientsProvider; + private final GetAllMealPrepsByIdsRepository getAllMealPrepsByIdsRepository; private final CreateAllMealPrepsRepository createAllMealPrepsRepository; private final GetPreparationTimeByIdRepository getPreparationTimeByIdRepository; private final GetCookLevelByIdRepository getCookLevelByIdRepository; @@ -60,6 +63,7 @@ public GetMealPrepsFromIngredientsUseCase( UserDomainService userDomainService, RecipeDomainService recipeDomainService, @Qualifier("provider") GetMealPrepsFromIngredientsRepository getMealPrepsFromIngredientsProvider, + GetAllMealPrepsByIdsRepository getAllMealPrepsByIdsRepository, CreateAllMealPrepsRepository createAllMealPrepsRepository, GetPreparationTimeByIdRepository getPreparationTimeByIdRepository, GetCookLevelByIdRepository getCookLevelByIdRepository, @@ -71,6 +75,7 @@ public GetMealPrepsFromIngredientsUseCase( this.userDomainService = userDomainService; this.recipeDomainService = recipeDomainService; this.getMealPrepsFromIngredientsProvider = getMealPrepsFromIngredientsProvider; + this.getAllMealPrepsByIdsRepository = getAllMealPrepsByIdsRepository; this.createAllMealPrepsRepository = createAllMealPrepsRepository; this.getPreparationTimeByIdRepository = getPreparationTimeByIdRepository; this.getCookLevelByIdRepository = getCookLevelByIdRepository; @@ -86,14 +91,20 @@ public List execute(Command command) { User user = validateAndGetUser(); - Recipe recipeParameters = buildRecipe(command); + List mealPrepsToNotInclude = buildNotIncludes(command.getNotInclude()); + List recipesToNotInclude = extractRecipesToNotInclude(mealPrepsToNotInclude); + + Recipe recipeParameters = buildRecipe(command, recipesToNotInclude); List recipes = recipeDomainService.getOrCreate(recipeParameters); + MealPrepConfiguration configuration = buildMealPrepConfiguration(mealPrepsToNotInclude); + MealPrep mealPrepToGenerate = buildMealPrep( user, recipeParameters.getIngredients(), recipes, - recipeParameters.getFilters() + recipeParameters.getFilters(), + configuration ); List generatedMealPreps = getMealPrepsFromIngredientsProvider.execute(mealPrepToGenerate); @@ -114,16 +125,25 @@ private User validateAndGetUser() { return user; } - private Recipe buildRecipe(Command command) { + private List buildNotIncludes(List notIncludeIds) { + return notIncludeIds != null && !notIncludeIds.isEmpty() ? getAllMealPrepsByIdsRepository.execute(notIncludeIds) : List.of(); + } + + private List extractRecipesToNotInclude(List mealPrepsToNotInclude) { + return mealPrepsToNotInclude.stream() + .flatMap(mealPrep -> mealPrep.getRecipes().stream()) + .distinct() + .collect(Collectors.toList()); + } - if(command.getIngredients().isEmpty()) { - throw new BadRequestException(ErrorDescription.INGREDIENTS_EMPTY.getValue()); - } + private Recipe buildRecipe(Command command, List notInclude) { + + if(command.getIngredients().isEmpty()) throw new BadRequestException(ErrorDescription.INGREDIENTS_EMPTY.getValue()); return Recipe.builder() .ingredients(command.getIngredients()) .filters(buildFilters(command)) - .configuration(buildConfiguration()) + .configuration(buildRecipeConfiguration(notInclude)) .build(); } @@ -149,20 +169,34 @@ private Filters buildFilters(Command command) { .build(); } - private RecipeConfiguration buildConfiguration() { + private RecipeConfiguration buildRecipeConfiguration(List notInclude) { int SIZE = RECIPES_SIZE_PER_MEAL_PREP * MEAL_PREP_SIZE; return RecipeConfiguration.builder() .size(SIZE) + .notInclude(notInclude) .build(); } - private MealPrep buildMealPrep(User user, List ingredients, List recipes, Filters filters) { + private MealPrep buildMealPrep( + User user, + List ingredients, + List recipes, + Filters filters, + MealPrepConfiguration configuration + ) { return MealPrep.builder() .user(user) .ingredients(ingredients) .recipes(recipes) .filters(filters) + .configuration(configuration) + .build(); + } + + private MealPrepConfiguration buildMealPrepConfiguration(List notInclude) { + return MealPrepConfiguration.builder() + .notInclude(notInclude) .build(); } } diff --git a/src/main/java/com/cuoco/application/usecase/model/MealPrep.java b/src/main/java/com/cuoco/application/usecase/model/MealPrep.java index 4b044be..f9fb95f 100644 --- a/src/main/java/com/cuoco/application/usecase/model/MealPrep.java +++ b/src/main/java/com/cuoco/application/usecase/model/MealPrep.java @@ -21,4 +21,6 @@ public class MealPrep { private List recipes; private Filters filters; + private MealPrepConfiguration configuration; + } diff --git a/src/main/java/com/cuoco/application/usecase/model/MealPrepConfiguration.java b/src/main/java/com/cuoco/application/usecase/model/MealPrepConfiguration.java new file mode 100644 index 0000000..bbe6a15 --- /dev/null +++ b/src/main/java/com/cuoco/application/usecase/model/MealPrepConfiguration.java @@ -0,0 +1,14 @@ +package com.cuoco.application.usecase.model; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; + +import java.util.List; + +@Data +@Builder +public class MealPrepConfiguration { + private Integer size; + private List notInclude; +} diff --git a/src/main/java/com/cuoco/application/usecase/model/Recipe.java b/src/main/java/com/cuoco/application/usecase/model/Recipe.java index 90f40a9..ade9045 100644 --- a/src/main/java/com/cuoco/application/usecase/model/Recipe.java +++ b/src/main/java/com/cuoco/application/usecase/model/Recipe.java @@ -3,12 +3,14 @@ import lombok.AllArgsConstructor; import lombok.Builder; import lombok.Data; +import lombok.EqualsAndHashCode; import lombok.NoArgsConstructor; import java.util.List; @Data @Builder +@EqualsAndHashCode(callSuper = false) @AllArgsConstructor @NoArgsConstructor public class Recipe { diff --git a/src/main/java/com/cuoco/shared/model/ErrorDescription.java b/src/main/java/com/cuoco/shared/model/ErrorDescription.java index 8c5f96f..f992299 100644 --- a/src/main/java/com/cuoco/shared/model/ErrorDescription.java +++ b/src/main/java/com/cuoco/shared/model/ErrorDescription.java @@ -36,6 +36,9 @@ public enum ErrorDescription { AUDIO_FILE_PROCESSING_ERROR("Error procesando el archivo de audio"), PRO_FEATURE("Esta funcionalidad solo es para usuarios PRO"), + CANNOT_GENERATE_RECIPE("Failed to generate recipe"), + CANNOT_GENERATE_MEAL_PREP("Could not generate meal prep"), + UNAUTHORIZED("No está autorizado a usar esta función"), UNEXPECTED_ERROR("An unexpected error occurred: "), UNHANDLED("Ha ocurrido un error inesperado"), diff --git a/src/main/resources/prompt/generateMealPrep/generateMealPrepFromIngredientsHeaderPrompt.txt b/src/main/resources/prompt/generateMealPrep/generateMealPrepFromIngredientsHeaderPrompt.txt index eb20e96..870d0b1 100644 --- a/src/main/resources/prompt/generateMealPrep/generateMealPrepFromIngredientsHeaderPrompt.txt +++ b/src/main/resources/prompt/generateMealPrep/generateMealPrepFromIngredientsHeaderPrompt.txt @@ -26,6 +26,8 @@ OBJETIVO: - Descripción del paso - Duración del paso (por ejemplo: "30 min" o "1 h") +No incluir estos meal preps (Ignorar si esta vacio): {{NOT_INCLUDE}} + Ejemplo de la estructura del JSON de respuesta: [ diff --git a/src/main/resources/prompt/generaterecipes/generateRecipeFromIngredientsHeaderPrompt.txt b/src/main/resources/prompt/generaterecipes/generateRecipeFromIngredientsHeaderPrompt.txt index c6884fe..34e7cc2 100644 --- a/src/main/resources/prompt/generaterecipes/generateRecipeFromIngredientsHeaderPrompt.txt +++ b/src/main/resources/prompt/generaterecipes/generateRecipeFromIngredientsHeaderPrompt.txt @@ -8,7 +8,7 @@ REGLAS OBLIGATORIAS: 2. No incluyas recetas que usen solo algunos de los ingredientes proporcionados. 3. Las recetas deben ser lógicas y plausibles dentro de la cocina argentina. 4. Usá español rioplatense: decí "papa" en lugar de "patata", "palta" en lugar de "aguacate", "choclo" en lugar de "maíz", etc. -5. En el campo "steps", defini cada paso que lleva la receta para lograr la coccion completa del plato. En number poner el numero de orden del paso, titulo del paso y la descripcion completa de cada uno de los pasos. +5. En el campo "steps", defini cada paso que lleva la receta para lograr la coccion completa del plato. En number poner el numero de orden del paso, titulo del paso y la descripcion completa de cada uno de los pasos. MINIMO 3/4. 6. En el campo "quantity" de cada ingrediente, usá SIEMPRE números decimales (ej: 1.00, 250.00, 0.50). Nunca uses palabras como "pizca", "a gusto", etc. 7. En "unit", usá EXACTAMENTE las unidades provistas en el JSON de units (id y symbol correctos). 8. En "preparation_time", "cook_level", "diet", "meal_types", "allergies" y "dietary_needs", usá EXACTAMENTE los valores provistos en los JSON correspondientes. No inventes ni modifiques descripciones, ids o estructuras. @@ -23,7 +23,7 @@ REGLAS OBLIGATORIAS: NO crear ni incluir las recetas de la siguiente lista de nombres: (Si la receta esta en la lista, crear otra diferente. Si la lista es vacia o null, ignorar este paso) -No incluir estas recetas: {{NOT_INCLUDE}} +No incluir estas recetas (Ignorar si esta vacio): {{NOT_INCLUDE}} ESTRUCTURA DEL JSON (respetar exactamente): From f8f24c79d98efbfd8dc04b898e8e89b0ad728eee Mon Sep 17 00:00:00 2001 From: Alan Di Giovanni Date: Mon, 14 Jul 2025 22:24:58 -0300 Subject: [PATCH 2/6] feat(PC-136): Improve steps to 4 --- .../generateMealPrepFromIngredientsHeaderPrompt.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/src/main/resources/prompt/generateMealPrep/generateMealPrepFromIngredientsHeaderPrompt.txt b/src/main/resources/prompt/generateMealPrep/generateMealPrepFromIngredientsHeaderPrompt.txt index 870d0b1..a389021 100644 --- a/src/main/resources/prompt/generateMealPrep/generateMealPrepFromIngredientsHeaderPrompt.txt +++ b/src/main/resources/prompt/generateMealPrep/generateMealPrepFromIngredientsHeaderPrompt.txt @@ -69,6 +69,7 @@ Instrucciones CRITICAS: - Usar español argentino (ejemplo: papa, palta, choclo, etc.). - Los ingredientes proporcionados deben aparecer en la lista de ingredientes de las recetas dadas - El meal prep y sus steps deben ser lógicos combinando TODOS los ingredientes dados +- Los steps deben ser como minimo 4 - Las instrucciones deben ir como texto plano, sin '\n' ni saltos de línea. - Solo usar números decimales en "quantity", sin texto. - Usar correctamente acentos y la letra ñ. From fe074e462b415259ddca9e22d6f1713c834cf2a5 Mon Sep 17 00:00:00 2001 From: Alan Di Giovanni Date: Mon, 14 Jul 2025 22:32:59 -0300 Subject: [PATCH 3/6] feat(PC-136): Minimal change --- .../usecase/FindOrCreateRecipeUseCase.java | 20 ++----- .../ParametricDataDomainService.java | 39 ++++++++++++++ .../domainservice/RecipeDomainService.java | 53 ++----------------- 3 files changed, 49 insertions(+), 63 deletions(-) create mode 100644 src/main/java/com/cuoco/application/usecase/domainservice/ParametricDataDomainService.java diff --git a/src/main/java/com/cuoco/application/usecase/FindOrCreateRecipeUseCase.java b/src/main/java/com/cuoco/application/usecase/FindOrCreateRecipeUseCase.java index 901c4cf..3d0f726 100644 --- a/src/main/java/com/cuoco/application/usecase/FindOrCreateRecipeUseCase.java +++ b/src/main/java/com/cuoco/application/usecase/FindOrCreateRecipeUseCase.java @@ -5,33 +5,23 @@ import com.cuoco.application.port.out.CreateRecipeByNameRepository; import com.cuoco.application.port.out.CreateRecipeRepository; import com.cuoco.application.port.out.FindRecipeByNameRepository; -import com.cuoco.application.usecase.domainservice.RecipeDomainService; +import com.cuoco.application.usecase.domainservice.ParametricDataDomainService; import com.cuoco.application.usecase.model.ParametricData; import com.cuoco.application.usecase.model.Recipe; import com.cuoco.shared.model.ErrorDescription; +import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Component; @Slf4j @Component +@RequiredArgsConstructor public class FindOrCreateRecipeUseCase implements FindOrCreateRecipeCommand { + private final ParametricDataDomainService parametricDataDomainService; private final CreateRecipeByNameRepository createRecipeByNameRepository; private final FindRecipeByNameRepository findRecipeByNameRepository; private final CreateRecipeRepository createRecipeRepository; - private final RecipeDomainService recipeDomainService; - - public FindOrCreateRecipeUseCase( - CreateRecipeByNameRepository createRecipeByNameRepository, - FindRecipeByNameRepository findRecipeByNameRepository, - CreateRecipeRepository createRecipeRepository, - RecipeDomainService recipeDomainService - ) { - this.createRecipeByNameRepository = createRecipeByNameRepository; - this.findRecipeByNameRepository = findRecipeByNameRepository; - this.createRecipeRepository = createRecipeRepository; - this.recipeDomainService = recipeDomainService; - } @Override public Recipe execute(Command command) { @@ -45,7 +35,7 @@ public Recipe execute(Command command) { } log.info("Recipe not found in database. Generating new recipe for: {}", command.getRecipeName()); - ParametricData parametricData = recipeDomainService.buildParametricData(); + ParametricData parametricData = parametricDataDomainService.getAll(); Recipe generatedRecipe = createRecipeByNameRepository.execute(command.getRecipeName(), parametricData); if (generatedRecipe == null) { diff --git a/src/main/java/com/cuoco/application/usecase/domainservice/ParametricDataDomainService.java b/src/main/java/com/cuoco/application/usecase/domainservice/ParametricDataDomainService.java new file mode 100644 index 0000000..3aefc2e --- /dev/null +++ b/src/main/java/com/cuoco/application/usecase/domainservice/ParametricDataDomainService.java @@ -0,0 +1,39 @@ +package com.cuoco.application.usecase.domainservice; + +import com.cuoco.application.port.out.GetAllAllergiesRepository; +import com.cuoco.application.port.out.GetAllCookLevelsRepository; +import com.cuoco.application.port.out.GetAllDietaryNeedsRepository; +import com.cuoco.application.port.out.GetAllDietsRepository; +import com.cuoco.application.port.out.GetAllMealTypesRepository; +import com.cuoco.application.port.out.GetAllPreparationTimesRepository; +import com.cuoco.application.port.out.GetAllUnitsRepository; +import com.cuoco.application.usecase.model.ParametricData; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Component; + +@Slf4j +@Component +@RequiredArgsConstructor +public class ParametricDataDomainService { + + private final GetAllUnitsRepository getAllUnitsRepository; + private final GetAllPreparationTimesRepository getAllPreparationTimesRepository; + private final GetAllCookLevelsRepository getAllCookLevelsRepository; + private final GetAllDietsRepository getAllDietsRepository; + private final GetAllMealTypesRepository getAllMealTypesRepository; + private final GetAllAllergiesRepository getAllAllergiesRepository; + private final GetAllDietaryNeedsRepository getAllDietaryNeedsRepository; + + public ParametricData getAll() { + return ParametricData.builder() + .units(getAllUnitsRepository.execute()) + .preparationTimes(getAllPreparationTimesRepository.execute()) + .cookLevels(getAllCookLevelsRepository.execute()) + .diets(getAllDietsRepository.execute()) + .mealTypes(getAllMealTypesRepository.execute()) + .allergies(getAllAllergiesRepository.execute()) + .dietaryNeeds(getAllDietaryNeedsRepository.execute()) + .build(); + } +} diff --git a/src/main/java/com/cuoco/application/usecase/domainservice/RecipeDomainService.java b/src/main/java/com/cuoco/application/usecase/domainservice/RecipeDomainService.java index 64e7c99..9f1bf62 100644 --- a/src/main/java/com/cuoco/application/usecase/domainservice/RecipeDomainService.java +++ b/src/main/java/com/cuoco/application/usecase/domainservice/RecipeDomainService.java @@ -2,17 +2,9 @@ import com.cuoco.application.port.out.CreateAllRecipesRepository; import com.cuoco.application.port.out.CreateRecipeImagesRepository; -import com.cuoco.application.port.out.GetAllAllergiesRepository; -import com.cuoco.application.port.out.GetAllCookLevelsRepository; -import com.cuoco.application.port.out.GetAllDietaryNeedsRepository; -import com.cuoco.application.port.out.GetAllDietsRepository; -import com.cuoco.application.port.out.GetAllMealTypesRepository; -import com.cuoco.application.port.out.GetAllPreparationTimesRepository; import com.cuoco.application.port.out.GetAllRecipesByIdsRepository; -import com.cuoco.application.port.out.GetAllUnitsRepository; import com.cuoco.application.port.out.GetRecipeStepsImagesRepository; import com.cuoco.application.port.out.GetRecipesFromIngredientsRepository; -import com.cuoco.application.usecase.model.ParametricData; import com.cuoco.application.usecase.model.Recipe; import com.cuoco.application.usecase.model.Step; import lombok.extern.slf4j.Slf4j; @@ -32,17 +24,9 @@ public class RecipeDomainService { private final GetAllRecipesByIdsRepository getAllRecipesByIdsRepository; private final CreateAllRecipesRepository createAllRecipesRepository; private final CreateRecipeImagesRepository createRecipeImagesRepository; - private final GetRecipeStepsImagesRepository getRecipeStepsImagesRepository; - private final AsyncRecipeDomainService asyncRecipeDomainService; - private final GetAllUnitsRepository getAllUnitsRepository; - private final GetAllPreparationTimesRepository getAllPreparationTimesRepository; - private final GetAllCookLevelsRepository getAllCookLevelsRepository; - private final GetAllDietsRepository getAllDietsRepository; - private final GetAllMealTypesRepository getAllMealTypesRepository; - private final GetAllAllergiesRepository getAllAllergiesRepository; - private final GetAllDietaryNeedsRepository getAllDietaryNeedsRepository; + private final ParametricDataDomainService parametricDataDomainService; public RecipeDomainService( @Qualifier("repository") GetRecipesFromIngredientsRepository getRecipesFromIngredientsRepository, @@ -52,13 +36,7 @@ public RecipeDomainService( CreateRecipeImagesRepository createRecipeImagesRepository, GetRecipeStepsImagesRepository getRecipeStepsImagesRepository, AsyncRecipeDomainService asyncRecipeDomainService, - GetAllUnitsRepository getAllUnitsRepository, - GetAllPreparationTimesRepository getAllPreparationTimesRepository, - GetAllCookLevelsRepository getAllCookLevelsRepository, - GetAllDietsRepository getAllDietsRepository, - GetAllMealTypesRepository getAllMealTypesRepository, - GetAllAllergiesRepository getAllAllergiesRepository, - GetAllDietaryNeedsRepository getAllDietaryNeedsRepository + ParametricDataDomainService parametricDataDomainService ) { this.getRecipesFromIngredientsRepository = getRecipesFromIngredientsRepository; this.getRecipesFromIngredientsProvider = getRecipesFromIngredientsProvider; @@ -67,13 +45,7 @@ public RecipeDomainService( this.createRecipeImagesRepository = createRecipeImagesRepository; this.getRecipeStepsImagesRepository = getRecipeStepsImagesRepository; this.asyncRecipeDomainService = asyncRecipeDomainService; - this.getAllUnitsRepository = getAllUnitsRepository; - this.getAllPreparationTimesRepository = getAllPreparationTimesRepository; - this.getAllCookLevelsRepository = getAllCookLevelsRepository; - this.getAllDietsRepository = getAllDietsRepository; - this.getAllMealTypesRepository = getAllMealTypesRepository; - this.getAllAllergiesRepository = getAllAllergiesRepository; - this.getAllDietaryNeedsRepository = getAllDietaryNeedsRepository; + this.parametricDataDomainService = parametricDataDomainService; } public List getOrCreate(Recipe recipeToFind) { @@ -83,9 +55,6 @@ public List getOrCreate(Recipe recipeToFind) { if(foundedRecipes.isEmpty()) { log.info("Can't find saved recipes with the provided ingredients and filters. Generating new ones"); - - recipeToFind.getConfiguration().setParametricData(buildParametricData()); - return generateRecipes(recipeToFind, List.of(), targetSize); } @@ -94,8 +63,6 @@ public List getOrCreate(Recipe recipeToFind) { log.info("Founded only {} saved recipes. Generating {} new recipes to complete", foundedRecipes.size(), remaining); - recipeToFind.getConfiguration().setParametricData(buildParametricData()); - List newRecipes = generateRecipes(recipeToFind, foundedRecipes, remaining); return Stream.concat(foundedRecipes.stream(), newRecipes.stream()) @@ -109,6 +76,8 @@ public List getOrCreate(Recipe recipeToFind) { private List generateRecipes(Recipe recipeParameters, List foundedRecipes, int size) { + recipeParameters.getConfiguration().setParametricData(parametricDataDomainService.getAll()); + List recipesToNotInclude = buildRecipesToNotInclude(recipeParameters.getConfiguration().getNotInclude(), foundedRecipes); recipeParameters.getConfiguration().setNotInclude(recipesToNotInclude); @@ -140,18 +109,6 @@ public Recipe generateImages(Recipe recipe) { return recipe; } - public ParametricData buildParametricData() { - return ParametricData.builder() - .units(getAllUnitsRepository.execute()) - .preparationTimes(getAllPreparationTimesRepository.execute()) - .cookLevels(getAllCookLevelsRepository.execute()) - .diets(getAllDietsRepository.execute()) - .mealTypes(getAllMealTypesRepository.execute()) - .allergies(getAllAllergiesRepository.execute()) - .dietaryNeeds(getAllDietaryNeedsRepository.execute()) - .build(); - } - private List buildRecipesToNotInclude(List requiredNotInclude, List foundedRecipes) { List recipesToNotInclude = new ArrayList<>(foundedRecipes); From 01e649858b32a84e8b5309d040ee55d05042762f Mon Sep 17 00:00:00 2001 From: Alan Di Giovanni Date: Mon, 14 Jul 2025 23:22:42 -0300 Subject: [PATCH 4/6] feat(PC-136): Added ingredient quantity multiplier per serving --- .../in/controller/RecipeControllerAdapter.java | 4 ++-- ...sFromIngredientsGeminiRestRepositoryAdapter.java | 2 +- .../application/port/in/GetRecipeByIdQuery.java | 2 +- .../usecase/GetMealPrepsFromIngredientsUseCase.java | 1 - .../application/usecase/GetRecipeByIdUseCase.java | 13 +++++++------ .../usecase/GetRecipesFromIngredientsUseCase.java | 3 ++- .../usecase/domainservice/RecipeDomainService.java | 13 +++++++++++++ .../cuoco/application/usecase/model/Filters.java | 1 - 8 files changed, 26 insertions(+), 13 deletions(-) diff --git a/src/main/java/com/cuoco/adapter/in/controller/RecipeControllerAdapter.java b/src/main/java/com/cuoco/adapter/in/controller/RecipeControllerAdapter.java index 8cb8fa1..caaa179 100644 --- a/src/main/java/com/cuoco/adapter/in/controller/RecipeControllerAdapter.java +++ b/src/main/java/com/cuoco/adapter/in/controller/RecipeControllerAdapter.java @@ -86,10 +86,10 @@ public RecipeControllerAdapter( ) ) }) - public ResponseEntity getRecipe(@PathVariable(name = "id") Long recipeId) { + public ResponseEntity getRecipe(@PathVariable(name = "id") Long recipeId, @RequestParam(required = false) Integer servings) { log.info("Executing GET for find recipe with ID {}", recipeId); - Recipe recipe = getRecipeByIdQuery.execute(recipeId); + Recipe recipe = getRecipeByIdQuery.execute(recipeId, servings); RecipeResponse recipeResponse = buildResponse(recipe); diff --git a/src/main/java/com/cuoco/adapter/out/rest/gemini/GetMealPrepsFromIngredientsGeminiRestRepositoryAdapter.java b/src/main/java/com/cuoco/adapter/out/rest/gemini/GetMealPrepsFromIngredientsGeminiRestRepositoryAdapter.java index 196640c..f301176 100644 --- a/src/main/java/com/cuoco/adapter/out/rest/gemini/GetMealPrepsFromIngredientsGeminiRestRepositoryAdapter.java +++ b/src/main/java/com/cuoco/adapter/out/rest/gemini/GetMealPrepsFromIngredientsGeminiRestRepositoryAdapter.java @@ -67,7 +67,7 @@ public List execute(MealPrep mealPrep) { String basicPrompt = BASIC_PROMPT .replace(Constants.RECIPES.getValue(), recipesJson) .replace(Constants.NOT_INCLUDE.getValue(), mealPrepsToNotInclude) - .replace(Constants.MAX_MEAL_PREPS.getValue(), mealPrep.getFilters().getServings().toString()) + .replace(Constants.MAX_MEAL_PREPS.getValue(), mealPrep.getConfiguration().getSize().toString()) .replace(Constants.FREEZE.getValue(), mealPrep.getFilters().getFreeze().toString()); PromptBodyGeminiRequestModel prompt = buildPromptBody(basicPrompt); diff --git a/src/main/java/com/cuoco/application/port/in/GetRecipeByIdQuery.java b/src/main/java/com/cuoco/application/port/in/GetRecipeByIdQuery.java index 5cdb267..ff9bc0e 100644 --- a/src/main/java/com/cuoco/application/port/in/GetRecipeByIdQuery.java +++ b/src/main/java/com/cuoco/application/port/in/GetRecipeByIdQuery.java @@ -3,5 +3,5 @@ import com.cuoco.application.usecase.model.Recipe; public interface GetRecipeByIdQuery { - Recipe execute(Long id); + Recipe execute(Long id, Integer servings); } diff --git a/src/main/java/com/cuoco/application/usecase/GetMealPrepsFromIngredientsUseCase.java b/src/main/java/com/cuoco/application/usecase/GetMealPrepsFromIngredientsUseCase.java index b806ad3..2fadc0b 100644 --- a/src/main/java/com/cuoco/application/usecase/GetMealPrepsFromIngredientsUseCase.java +++ b/src/main/java/com/cuoco/application/usecase/GetMealPrepsFromIngredientsUseCase.java @@ -159,7 +159,6 @@ private Filters buildFilters(Command command) { return Filters.builder() .enable(true) .freeze(freeze) - .servings(command.getServings()) .preparationTime(preparationTime) .cookLevel(cookLevel) .mealTypes(types) diff --git a/src/main/java/com/cuoco/application/usecase/GetRecipeByIdUseCase.java b/src/main/java/com/cuoco/application/usecase/GetRecipeByIdUseCase.java index b7914a5..0122ac5 100644 --- a/src/main/java/com/cuoco/application/usecase/GetRecipeByIdUseCase.java +++ b/src/main/java/com/cuoco/application/usecase/GetRecipeByIdUseCase.java @@ -2,32 +2,33 @@ import com.cuoco.application.port.in.GetRecipeByIdQuery; import com.cuoco.application.port.out.GetRecipeByIdRepository; +import com.cuoco.application.usecase.domainservice.RecipeDomainService; import com.cuoco.application.usecase.domainservice.UserDomainService; import com.cuoco.application.usecase.model.Recipe; import com.cuoco.application.usecase.model.User; +import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Component; @Slf4j @Component +@RequiredArgsConstructor public class GetRecipeByIdUseCase implements GetRecipeByIdQuery { private final UserDomainService userDomainService; + private final RecipeDomainService recipeDomainService; private final GetRecipeByIdRepository getRecipeByIdRepository; - public GetRecipeByIdUseCase(UserDomainService userDomainService, GetRecipeByIdRepository getRecipeByIdRepository) { - this.userDomainService = userDomainService; - this.getRecipeByIdRepository = getRecipeByIdRepository; - } - @Override - public Recipe execute(Long id) { + public Recipe execute(Long id, Integer servings) { log.info("Executing get recipe by id use case with ID: {}", id); Recipe recipe = getRecipeByIdRepository.execute(id); isFavorite(recipe); + recipeDomainService.adjustIngredientsByServings(recipe, servings); + return recipe; } diff --git a/src/main/java/com/cuoco/application/usecase/GetRecipesFromIngredientsUseCase.java b/src/main/java/com/cuoco/application/usecase/GetRecipesFromIngredientsUseCase.java index 07289e4..8c32d7a 100644 --- a/src/main/java/com/cuoco/application/usecase/GetRecipesFromIngredientsUseCase.java +++ b/src/main/java/com/cuoco/application/usecase/GetRecipesFromIngredientsUseCase.java @@ -74,6 +74,8 @@ public List execute(Command command) { List recipesToResponse = recipeDomainService.getOrCreate(recipeToFind); + recipesToResponse.forEach(recipe -> recipeDomainService.adjustIngredientsByServings(recipe, command.getServings())); + return recipesToResponse; } @@ -112,7 +114,6 @@ private Filters buildFilters(Command command, int userPlan) { return Filters.builder() .enable(true) - .servings(command.getServings()) .preparationTime(preparationTime) .cookLevel(cookLevel) .mealTypes(types) diff --git a/src/main/java/com/cuoco/application/usecase/domainservice/RecipeDomainService.java b/src/main/java/com/cuoco/application/usecase/domainservice/RecipeDomainService.java index 9f1bf62..769e8c1 100644 --- a/src/main/java/com/cuoco/application/usecase/domainservice/RecipeDomainService.java +++ b/src/main/java/com/cuoco/application/usecase/domainservice/RecipeDomainService.java @@ -5,6 +5,7 @@ import com.cuoco.application.port.out.GetAllRecipesByIdsRepository; import com.cuoco.application.port.out.GetRecipeStepsImagesRepository; import com.cuoco.application.port.out.GetRecipesFromIngredientsRepository; +import com.cuoco.application.usecase.model.Ingredient; import com.cuoco.application.usecase.model.Recipe; import com.cuoco.application.usecase.model.Step; import lombok.extern.slf4j.Slf4j; @@ -109,6 +110,18 @@ public Recipe generateImages(Recipe recipe) { return recipe; } + public void adjustIngredientsByServings(Recipe recipe, Integer servings) { + if(servings != null && servings > 1) { + log.info("Multiplying recipe ID {} ingredients quantity by {} servings", recipe.getId(), servings); + + for (Ingredient ingredient : recipe.getIngredients()) { + if (ingredient.getQuantity() != null) { + ingredient.setQuantity(ingredient.getQuantity() * servings); + } + } + } + } + private List buildRecipesToNotInclude(List requiredNotInclude, List foundedRecipes) { List recipesToNotInclude = new ArrayList<>(foundedRecipes); diff --git a/src/main/java/com/cuoco/application/usecase/model/Filters.java b/src/main/java/com/cuoco/application/usecase/model/Filters.java index c73ba7b..c6816dc 100644 --- a/src/main/java/com/cuoco/application/usecase/model/Filters.java +++ b/src/main/java/com/cuoco/application/usecase/model/Filters.java @@ -19,7 +19,6 @@ public class Filters { private Boolean useProfilePreferences; private Boolean enable; - private Integer servings; private PreparationTime preparationTime; private CookLevel cookLevel; private Diet diet; From bf943485da16c0243edcacbbb17ada3e191cebed Mon Sep 17 00:00:00 2001 From: Alan Di Giovanni Date: Mon, 14 Jul 2025 23:35:26 -0300 Subject: [PATCH 5/6] test(PC-136): Added tests and optimize imports --- .../IngredientControllerAdapter.java | 1 - .../UserRecipeControllerAdapter.java | 2 - .../in/controller/model/CalendarResponse.java | 1 - ...CreateRecipeDatabaseRepositoryAdapter.java | 5 -- ...UserCalendarDatabaseRepositoryAdapter.java | 2 +- .../CreateUserDatabaseRepositoryAdapter.java | 2 - ...UserCalendarDatabaseRepositoryAdapter.java | 2 - ...RecipeByNameDatabaseRepositoryAdapter.java | 1 - .../UpdateUserDatabaseRepositoryAdapter.java | 20 +++--- .../hibernate/model/RecipeHibernateModel.java | 2 - ...ngredientsGeminiRestRepositoryAdapter.java | 4 -- .../usecase/AuthenticateUserUseCase.java | 2 +- .../usecase/DeleteUserRepositoryUseCase.java | 1 - .../usecase/GetAllUserRecipesUseCase.java | 1 - .../usecase/model/MealPrepConfiguration.java | 1 - .../MealPrepControllerAdapterTest.java | 9 ++- .../MealTypeControllerAdapterTest.java | 7 +- .../controller/PlanControllerAdapterTest.java | 7 +- .../PreparationTimeControllerAdapterTest.java | 7 +- .../controller/UnitControllerAdapterTest.java | 7 +- .../UserCalendarControllerAdapterTest.java | 9 ++- .../controller/UserControllerAdapterTest.java | 2 +- .../UserMealPrepControllerAdapterTest.java | 9 ++- .../UserRecipeControllerAdapterTest.java | 4 +- ...MealPrepDatabaseRepositoryAdapterTest.java | 4 -- ...erRecipeDatabaseRepositoryAdapterTest.java | 4 -- ...ealTypesDatabaseRepositoryAdapterTest.java | 5 +- ...ionTimesDatabaseRepositoryAdapterTest.java | 5 +- ...AllUnitsDatabaseRepositoryAdapterTest.java | 5 +- ...PrepByIdDatabaseRepositoryAdapterTest.java | 4 +- ...dateUserDatabaseRepositoryAdapterTest.java | 6 +- ...yNameGeminiRestRespositoryAdapterTest.java | 1 - ...dientsGeminiRestRepositoryAdapterTest.java | 10 +-- ...nImageGeminiRestRepositoryAdapterTest.java | 11 +-- .../usecase/AuthenticateUserUseCaseTest.java | 2 +- .../CreateUserMealPrepUseCaseTest.java | 68 +++++++++++++++++++ .../usecase/CreateUserUseCaseTest.java | 2 +- .../DeleteUserMealPrepUseCaseTest.java | 38 +++++++++++ .../DeleteUserRepositoryUseCaseTest.java | 38 +++++++++++ .../FindOrGenerateRecipeUseCaseTest.java | 8 ++- .../usecase/FindRecipesUseCaseTest.java | 56 +++++++++++++++ .../GetAllPreparationTimesUseCaseTest.java | 31 +++++++++ .../usecase/GetMealPrepByIdUseCaseTest.java | 35 ++++++++++ .../usecase/SignInUserUseCaseTest.java | 2 +- .../usecase/UpdateUserProfileUseCaseTest.java | 5 +- .../usecase/UserRecipeUseCaseTest.java | 2 +- .../cuoco/factory/domain/CalendarFactory.java | 1 - .../cuoco/factory/domain/MealPrepFactory.java | 1 - .../factory/domain/ParametricDataFactory.java | 2 +- .../cuoco/factory/domain/RecipeFactory.java | 16 ++++- .../IngredientResponseGeminiModelFactory.java | 2 - .../RecipeResponseGeminiModelFactory.java | 2 +- .../RecipeHibernateModelFactory.java | 2 +- 53 files changed, 374 insertions(+), 102 deletions(-) create mode 100644 src/test/java/com/cuoco/application/usecase/CreateUserMealPrepUseCaseTest.java create mode 100644 src/test/java/com/cuoco/application/usecase/DeleteUserMealPrepUseCaseTest.java create mode 100644 src/test/java/com/cuoco/application/usecase/DeleteUserRepositoryUseCaseTest.java create mode 100644 src/test/java/com/cuoco/application/usecase/FindRecipesUseCaseTest.java create mode 100644 src/test/java/com/cuoco/application/usecase/GetAllPreparationTimesUseCaseTest.java create mode 100644 src/test/java/com/cuoco/application/usecase/GetMealPrepByIdUseCaseTest.java diff --git a/src/main/java/com/cuoco/adapter/in/controller/IngredientControllerAdapter.java b/src/main/java/com/cuoco/adapter/in/controller/IngredientControllerAdapter.java index 815a9a6..bdc20e5 100644 --- a/src/main/java/com/cuoco/adapter/in/controller/IngredientControllerAdapter.java +++ b/src/main/java/com/cuoco/adapter/in/controller/IngredientControllerAdapter.java @@ -2,7 +2,6 @@ import com.cuoco.adapter.in.controller.model.ImageIngredientsResponse; import com.cuoco.adapter.in.controller.model.IngredientResponse; -import com.cuoco.adapter.in.controller.model.MealPrepResponse; import com.cuoco.adapter.in.controller.model.TextRequest; import com.cuoco.adapter.in.controller.model.UnitResponse; import com.cuoco.application.port.in.GetIngredientsFromAudioCommand; diff --git a/src/main/java/com/cuoco/adapter/in/controller/UserRecipeControllerAdapter.java b/src/main/java/com/cuoco/adapter/in/controller/UserRecipeControllerAdapter.java index a16be81..1f32877 100644 --- a/src/main/java/com/cuoco/adapter/in/controller/UserRecipeControllerAdapter.java +++ b/src/main/java/com/cuoco/adapter/in/controller/UserRecipeControllerAdapter.java @@ -14,8 +14,6 @@ import io.swagger.v3.oas.annotations.responses.ApiResponses; import io.swagger.v3.oas.annotations.tags.Tag; import lombok.extern.slf4j.Slf4j; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.DeleteMapping; diff --git a/src/main/java/com/cuoco/adapter/in/controller/model/CalendarResponse.java b/src/main/java/com/cuoco/adapter/in/controller/model/CalendarResponse.java index d0ea1cc..7c2668e 100644 --- a/src/main/java/com/cuoco/adapter/in/controller/model/CalendarResponse.java +++ b/src/main/java/com/cuoco/adapter/in/controller/model/CalendarResponse.java @@ -1,6 +1,5 @@ package com.cuoco.adapter.in.controller.model; -import com.cuoco.application.usecase.model.Calendar; import com.fasterxml.jackson.annotation.JsonIgnoreProperties; import com.fasterxml.jackson.annotation.JsonInclude; import com.fasterxml.jackson.databind.PropertyNamingStrategies; diff --git a/src/main/java/com/cuoco/adapter/out/hibernate/CreateRecipeDatabaseRepositoryAdapter.java b/src/main/java/com/cuoco/adapter/out/hibernate/CreateRecipeDatabaseRepositoryAdapter.java index ffc4d55..f26e946 100644 --- a/src/main/java/com/cuoco/adapter/out/hibernate/CreateRecipeDatabaseRepositoryAdapter.java +++ b/src/main/java/com/cuoco/adapter/out/hibernate/CreateRecipeDatabaseRepositoryAdapter.java @@ -10,18 +10,13 @@ import com.cuoco.adapter.out.hibernate.model.RecipeHibernateModel; import com.cuoco.adapter.out.hibernate.model.RecipeIngredientsHibernateModel; import com.cuoco.adapter.out.hibernate.model.RecipeStepsHibernateModel; -import com.cuoco.adapter.out.hibernate.model.UnitHibernateModel; import com.cuoco.adapter.out.hibernate.repository.CreateIngredientHibernateRepositoryAdapter; import com.cuoco.adapter.out.hibernate.repository.CreateRecipeHibernateRepositoryAdapter; import com.cuoco.adapter.out.hibernate.repository.CreateRecipeIngredientsHibernateRepositoryAdapter; import com.cuoco.adapter.out.hibernate.repository.FindRecipeByNameHibernateRepositoryAdapter; import com.cuoco.adapter.out.hibernate.repository.GetIngredientByNameHibernateRepositoryAdapter; -import com.cuoco.adapter.out.hibernate.repository.GetUnitBySymbolHibernateRepositoryAdapter; import com.cuoco.application.port.out.CreateRecipeRepository; -import com.cuoco.application.usecase.model.Allergy; -import com.cuoco.application.usecase.model.DietaryNeed; import com.cuoco.application.usecase.model.Ingredient; -import com.cuoco.application.usecase.model.MealType; import com.cuoco.application.usecase.model.Recipe; import com.cuoco.application.usecase.model.Step; import jakarta.transaction.Transactional; diff --git a/src/main/java/com/cuoco/adapter/out/hibernate/CreateUserCalendarDatabaseRepositoryAdapter.java b/src/main/java/com/cuoco/adapter/out/hibernate/CreateUserCalendarDatabaseRepositoryAdapter.java index b8a24a1..da50abd 100644 --- a/src/main/java/com/cuoco/adapter/out/hibernate/CreateUserCalendarDatabaseRepositoryAdapter.java +++ b/src/main/java/com/cuoco/adapter/out/hibernate/CreateUserCalendarDatabaseRepositoryAdapter.java @@ -8,9 +8,9 @@ import com.cuoco.adapter.out.hibernate.repository.CreateAllUserRecipeCalendarsHibernateRepositoryAdapter; import com.cuoco.application.port.out.CreateUserCalendarRepository; import com.cuoco.application.usecase.model.Calendar; +import com.cuoco.application.usecase.model.CalendarRecipe; import com.cuoco.application.usecase.model.MealType; import com.cuoco.application.usecase.model.Recipe; -import com.cuoco.application.usecase.model.CalendarRecipe; import com.cuoco.application.usecase.model.User; import com.cuoco.application.usecase.model.UserCalendar; import lombok.RequiredArgsConstructor; diff --git a/src/main/java/com/cuoco/adapter/out/hibernate/CreateUserDatabaseRepositoryAdapter.java b/src/main/java/com/cuoco/adapter/out/hibernate/CreateUserDatabaseRepositoryAdapter.java index 87861df..9b6df84 100644 --- a/src/main/java/com/cuoco/adapter/out/hibernate/CreateUserDatabaseRepositoryAdapter.java +++ b/src/main/java/com/cuoco/adapter/out/hibernate/CreateUserDatabaseRepositoryAdapter.java @@ -10,8 +10,6 @@ import com.cuoco.adapter.out.hibernate.repository.CreateUserHibernateRepositoryAdapter; import com.cuoco.adapter.out.hibernate.repository.CreateUserPreferencesHibernateRepositoryAdapter; import com.cuoco.application.port.out.CreateUserRepository; -import com.cuoco.application.usecase.model.Allergy; -import com.cuoco.application.usecase.model.DietaryNeed; import com.cuoco.application.usecase.model.User; import com.cuoco.application.usecase.model.UserPreferences; import jakarta.transaction.Transactional; diff --git a/src/main/java/com/cuoco/adapter/out/hibernate/DeleteUserCalendarDatabaseRepositoryAdapter.java b/src/main/java/com/cuoco/adapter/out/hibernate/DeleteUserCalendarDatabaseRepositoryAdapter.java index b1663ba..7ba3262 100644 --- a/src/main/java/com/cuoco/adapter/out/hibernate/DeleteUserCalendarDatabaseRepositoryAdapter.java +++ b/src/main/java/com/cuoco/adapter/out/hibernate/DeleteUserCalendarDatabaseRepositoryAdapter.java @@ -9,8 +9,6 @@ import com.cuoco.application.port.out.DeleteUserCalendarRepository; import com.cuoco.application.usecase.model.Calendar; import com.cuoco.application.usecase.model.CalendarRecipe; -import com.cuoco.application.usecase.model.MealType; -import com.cuoco.application.usecase.model.Recipe; import com.cuoco.application.usecase.model.User; import com.cuoco.application.usecase.model.UserCalendar; import lombok.RequiredArgsConstructor; diff --git a/src/main/java/com/cuoco/adapter/out/hibernate/FindRecipeByNameDatabaseRepositoryAdapter.java b/src/main/java/com/cuoco/adapter/out/hibernate/FindRecipeByNameDatabaseRepositoryAdapter.java index 8c80ee1..561d371 100644 --- a/src/main/java/com/cuoco/adapter/out/hibernate/FindRecipeByNameDatabaseRepositoryAdapter.java +++ b/src/main/java/com/cuoco/adapter/out/hibernate/FindRecipeByNameDatabaseRepositoryAdapter.java @@ -1,7 +1,6 @@ package com.cuoco.adapter.out.hibernate; import com.cuoco.adapter.out.hibernate.model.RecipeHibernateModel; -import com.cuoco.adapter.out.hibernate.repository.CreateRecipeHibernateRepositoryAdapter; import com.cuoco.adapter.out.hibernate.repository.FindRecipeByNameHibernateRepositoryAdapter; import com.cuoco.application.port.out.FindRecipeByNameRepository; import com.cuoco.application.usecase.model.Recipe; diff --git a/src/main/java/com/cuoco/adapter/out/hibernate/UpdateUserDatabaseRepositoryAdapter.java b/src/main/java/com/cuoco/adapter/out/hibernate/UpdateUserDatabaseRepositoryAdapter.java index 831c41f..45916c0 100644 --- a/src/main/java/com/cuoco/adapter/out/hibernate/UpdateUserDatabaseRepositoryAdapter.java +++ b/src/main/java/com/cuoco/adapter/out/hibernate/UpdateUserDatabaseRepositoryAdapter.java @@ -1,24 +1,22 @@ package com.cuoco.adapter.out.hibernate; -import com.cuoco.adapter.out.hibernate.model.*; -import com.cuoco.adapter.out.hibernate.repository.*; -import com.cuoco.application.exception.BadRequestException; +import com.cuoco.adapter.out.hibernate.model.AllergyHibernateModel; +import com.cuoco.adapter.out.hibernate.model.CookLevelHibernateModel; +import com.cuoco.adapter.out.hibernate.model.DietHibernateModel; +import com.cuoco.adapter.out.hibernate.model.DietaryNeedHibernateModel; +import com.cuoco.adapter.out.hibernate.model.PlanHibernateModel; +import com.cuoco.adapter.out.hibernate.model.UserHibernateModel; +import com.cuoco.adapter.out.hibernate.model.UserPreferencesHibernateModel; +import com.cuoco.adapter.out.hibernate.repository.CreateUserHibernateRepositoryAdapter; +import com.cuoco.adapter.out.hibernate.repository.CreateUserPreferencesHibernateRepositoryAdapter; import com.cuoco.application.port.out.UpdateUserRepository; -import com.cuoco.application.usecase.model.Allergy; -import com.cuoco.application.usecase.model.CookLevel; -import com.cuoco.application.usecase.model.Diet; -import com.cuoco.application.usecase.model.DietaryNeed; import com.cuoco.application.usecase.model.User; import com.cuoco.application.usecase.model.UserPreferences; -import com.cuoco.shared.model.ErrorDescription; import jakarta.transaction.Transactional; import org.springframework.stereotype.Repository; import java.time.LocalDateTime; import java.util.List; -import java.util.Map; -import java.util.function.Function; -import java.util.stream.Collectors; @Repository @Transactional diff --git a/src/main/java/com/cuoco/adapter/out/hibernate/model/RecipeHibernateModel.java b/src/main/java/com/cuoco/adapter/out/hibernate/model/RecipeHibernateModel.java index 7b21c10..efbe61d 100644 --- a/src/main/java/com/cuoco/adapter/out/hibernate/model/RecipeHibernateModel.java +++ b/src/main/java/com/cuoco/adapter/out/hibernate/model/RecipeHibernateModel.java @@ -3,7 +3,6 @@ import com.cuoco.application.usecase.model.Ingredient; import com.cuoco.application.usecase.model.Recipe; import jakarta.persistence.CascadeType; -import jakarta.persistence.Column; import jakarta.persistence.Entity; import jakarta.persistence.FetchType; import jakarta.persistence.GeneratedValue; @@ -11,7 +10,6 @@ import jakarta.persistence.Id; import jakarta.persistence.JoinColumn; import jakarta.persistence.JoinTable; -import jakarta.persistence.Lob; import jakarta.persistence.ManyToMany; import jakarta.persistence.ManyToOne; import jakarta.persistence.OneToMany; diff --git a/src/main/java/com/cuoco/adapter/out/rest/gemini/GetRecipesFromIngredientsGeminiRestRepositoryAdapter.java b/src/main/java/com/cuoco/adapter/out/rest/gemini/GetRecipesFromIngredientsGeminiRestRepositoryAdapter.java index a7a0067..88451db 100644 --- a/src/main/java/com/cuoco/adapter/out/rest/gemini/GetRecipesFromIngredientsGeminiRestRepositoryAdapter.java +++ b/src/main/java/com/cuoco/adapter/out/rest/gemini/GetRecipesFromIngredientsGeminiRestRepositoryAdapter.java @@ -3,11 +3,7 @@ import com.cuoco.adapter.exception.NotAvailableException; import com.cuoco.adapter.exception.UnprocessableException; import com.cuoco.adapter.out.rest.gemini.model.RecipeResponseGeminiModel; -import com.cuoco.adapter.out.rest.gemini.model.wrapper.ContentGeminiRequestModel; import com.cuoco.adapter.out.rest.gemini.model.wrapper.GeminiResponseModel; -import com.cuoco.adapter.out.rest.gemini.model.wrapper.GenerationConfigurationGeminiRequestModel; -import com.cuoco.adapter.out.rest.gemini.model.wrapper.PartGeminiRequestModel; -import com.cuoco.adapter.out.rest.gemini.model.wrapper.PromptBodyGeminiRequestModel; import com.cuoco.adapter.out.rest.gemini.utils.Constants; import com.cuoco.adapter.out.rest.gemini.utils.Utils; import com.cuoco.application.port.out.GetRecipesFromIngredientsRepository; diff --git a/src/main/java/com/cuoco/application/usecase/AuthenticateUserUseCase.java b/src/main/java/com/cuoco/application/usecase/AuthenticateUserUseCase.java index ef88212..8d547d6 100644 --- a/src/main/java/com/cuoco/application/usecase/AuthenticateUserUseCase.java +++ b/src/main/java/com/cuoco/application/usecase/AuthenticateUserUseCase.java @@ -6,8 +6,8 @@ import com.cuoco.application.port.out.GetUserByEmailRepository; import com.cuoco.application.usecase.model.AuthenticatedUser; import com.cuoco.application.usecase.model.User; -import com.cuoco.shared.model.ErrorDescription; import com.cuoco.application.utils.JwtUtil; +import com.cuoco.shared.model.ErrorDescription; import lombok.extern.slf4j.Slf4j; import org.springframework.security.core.context.SecurityContextHolder; import org.springframework.stereotype.Component; diff --git a/src/main/java/com/cuoco/application/usecase/DeleteUserRepositoryUseCase.java b/src/main/java/com/cuoco/application/usecase/DeleteUserRepositoryUseCase.java index 13e2fbb..0186b4b 100644 --- a/src/main/java/com/cuoco/application/usecase/DeleteUserRepositoryUseCase.java +++ b/src/main/java/com/cuoco/application/usecase/DeleteUserRepositoryUseCase.java @@ -5,7 +5,6 @@ import com.cuoco.application.usecase.domainservice.UserDomainService; import com.cuoco.application.usecase.model.User; import lombok.extern.slf4j.Slf4j; -import org.springframework.security.core.context.SecurityContextHolder; import org.springframework.stereotype.Component; @Slf4j diff --git a/src/main/java/com/cuoco/application/usecase/GetAllUserRecipesUseCase.java b/src/main/java/com/cuoco/application/usecase/GetAllUserRecipesUseCase.java index 8260b73..cc71faa 100644 --- a/src/main/java/com/cuoco/application/usecase/GetAllUserRecipesUseCase.java +++ b/src/main/java/com/cuoco/application/usecase/GetAllUserRecipesUseCase.java @@ -7,7 +7,6 @@ import com.cuoco.application.usecase.model.User; import com.cuoco.application.usecase.model.UserRecipe; import lombok.extern.slf4j.Slf4j; -import org.springframework.security.core.context.SecurityContextHolder; import org.springframework.stereotype.Component; import java.util.List; diff --git a/src/main/java/com/cuoco/application/usecase/model/MealPrepConfiguration.java b/src/main/java/com/cuoco/application/usecase/model/MealPrepConfiguration.java index bbe6a15..75f80e2 100644 --- a/src/main/java/com/cuoco/application/usecase/model/MealPrepConfiguration.java +++ b/src/main/java/com/cuoco/application/usecase/model/MealPrepConfiguration.java @@ -1,6 +1,5 @@ package com.cuoco.application.usecase.model; -import lombok.AllArgsConstructor; import lombok.Builder; import lombok.Data; diff --git a/src/test/java/com/cuoco/adapter/in/controller/MealPrepControllerAdapterTest.java b/src/test/java/com/cuoco/adapter/in/controller/MealPrepControllerAdapterTest.java index ebeadc2..ce92a6b 100644 --- a/src/test/java/com/cuoco/adapter/in/controller/MealPrepControllerAdapterTest.java +++ b/src/test/java/com/cuoco/adapter/in/controller/MealPrepControllerAdapterTest.java @@ -1,8 +1,8 @@ package com.cuoco.adapter.in.controller; import com.cuoco.adapter.in.controller.model.IngredientRequest; -import com.cuoco.adapter.in.controller.model.MealPrepRequest; import com.cuoco.adapter.in.controller.model.MealPrepFilterRequest; +import com.cuoco.adapter.in.controller.model.MealPrepRequest; import com.cuoco.adapter.in.controller.model.MealPrepResponse; import com.cuoco.application.port.in.GetMealPrepByIdQuery; import com.cuoco.application.port.in.GetMealPrepFromIngredientsCommand; @@ -18,9 +18,12 @@ import java.util.List; -import static org.junit.jupiter.api.Assertions.*; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertNotNull; import static org.mockito.ArgumentMatchers.any; -import static org.mockito.Mockito.*; +import static org.mockito.Mockito.times; +import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.when; @ExtendWith(MockitoExtension.class) class MealPrepControllerAdapterTest { diff --git a/src/test/java/com/cuoco/adapter/in/controller/MealTypeControllerAdapterTest.java b/src/test/java/com/cuoco/adapter/in/controller/MealTypeControllerAdapterTest.java index 84fd13c..8739268 100644 --- a/src/test/java/com/cuoco/adapter/in/controller/MealTypeControllerAdapterTest.java +++ b/src/test/java/com/cuoco/adapter/in/controller/MealTypeControllerAdapterTest.java @@ -13,8 +13,11 @@ import java.util.List; -import static org.junit.jupiter.api.Assertions.*; -import static org.mockito.Mockito.*; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertNotNull; +import static org.mockito.Mockito.times; +import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.when; @ExtendWith(MockitoExtension.class) class MealTypeControllerAdapterTest { diff --git a/src/test/java/com/cuoco/adapter/in/controller/PlanControllerAdapterTest.java b/src/test/java/com/cuoco/adapter/in/controller/PlanControllerAdapterTest.java index 4c0509e..09496ff 100644 --- a/src/test/java/com/cuoco/adapter/in/controller/PlanControllerAdapterTest.java +++ b/src/test/java/com/cuoco/adapter/in/controller/PlanControllerAdapterTest.java @@ -13,8 +13,11 @@ import java.util.List; -import static org.junit.jupiter.api.Assertions.*; -import static org.mockito.Mockito.*; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertNotNull; +import static org.mockito.Mockito.times; +import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.when; @ExtendWith(MockitoExtension.class) class PlanControllerAdapterTest { diff --git a/src/test/java/com/cuoco/adapter/in/controller/PreparationTimeControllerAdapterTest.java b/src/test/java/com/cuoco/adapter/in/controller/PreparationTimeControllerAdapterTest.java index f7cc664..27409c3 100644 --- a/src/test/java/com/cuoco/adapter/in/controller/PreparationTimeControllerAdapterTest.java +++ b/src/test/java/com/cuoco/adapter/in/controller/PreparationTimeControllerAdapterTest.java @@ -13,8 +13,11 @@ import java.util.List; -import static org.junit.jupiter.api.Assertions.*; -import static org.mockito.Mockito.*; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertNotNull; +import static org.mockito.Mockito.times; +import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.when; @ExtendWith(MockitoExtension.class) class PreparationTimeControllerAdapterTest { diff --git a/src/test/java/com/cuoco/adapter/in/controller/UnitControllerAdapterTest.java b/src/test/java/com/cuoco/adapter/in/controller/UnitControllerAdapterTest.java index 211c655..2887881 100644 --- a/src/test/java/com/cuoco/adapter/in/controller/UnitControllerAdapterTest.java +++ b/src/test/java/com/cuoco/adapter/in/controller/UnitControllerAdapterTest.java @@ -13,8 +13,11 @@ import java.util.List; -import static org.junit.jupiter.api.Assertions.*; -import static org.mockito.Mockito.*; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertNotNull; +import static org.mockito.Mockito.times; +import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.when; @ExtendWith(MockitoExtension.class) class UnitControllerAdapterTest { diff --git a/src/test/java/com/cuoco/adapter/in/controller/UserCalendarControllerAdapterTest.java b/src/test/java/com/cuoco/adapter/in/controller/UserCalendarControllerAdapterTest.java index 3bd4e9f..0dc7471 100644 --- a/src/test/java/com/cuoco/adapter/in/controller/UserCalendarControllerAdapterTest.java +++ b/src/test/java/com/cuoco/adapter/in/controller/UserCalendarControllerAdapterTest.java @@ -1,8 +1,8 @@ package com.cuoco.adapter.in.controller; +import com.cuoco.adapter.in.controller.model.CalendarResponse; import com.cuoco.adapter.in.controller.model.RecipeCalendarRequest; import com.cuoco.adapter.in.controller.model.UserRecipeCalendarRequest; -import com.cuoco.adapter.in.controller.model.CalendarResponse; import com.cuoco.application.port.in.CreateOrUpdateUserRecipeCalendarCommand; import com.cuoco.application.port.in.GetUserCalendarQuery; import com.cuoco.application.usecase.model.Calendar; @@ -17,9 +17,12 @@ import java.util.List; -import static org.junit.jupiter.api.Assertions.*; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertNotNull; import static org.mockito.ArgumentMatchers.any; -import static org.mockito.Mockito.*; +import static org.mockito.Mockito.times; +import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.when; @ExtendWith(MockitoExtension.class) class UserCalendarControllerAdapterTest { diff --git a/src/test/java/com/cuoco/adapter/in/controller/UserControllerAdapterTest.java b/src/test/java/com/cuoco/adapter/in/controller/UserControllerAdapterTest.java index 3f2c3e0..7f2d12d 100644 --- a/src/test/java/com/cuoco/adapter/in/controller/UserControllerAdapterTest.java +++ b/src/test/java/com/cuoco/adapter/in/controller/UserControllerAdapterTest.java @@ -3,8 +3,8 @@ import com.cuoco.adapter.in.controller.model.UpdateUserRequest; import com.cuoco.application.port.in.UpdateUserProfileCommand; import com.cuoco.application.usecase.model.User; -import com.cuoco.factory.domain.UserFactory; import com.cuoco.application.utils.JwtUtil; +import com.cuoco.factory.domain.UserFactory; import com.fasterxml.jackson.databind.ObjectMapper; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; diff --git a/src/test/java/com/cuoco/adapter/in/controller/UserMealPrepControllerAdapterTest.java b/src/test/java/com/cuoco/adapter/in/controller/UserMealPrepControllerAdapterTest.java index 16d69af..691d088 100644 --- a/src/test/java/com/cuoco/adapter/in/controller/UserMealPrepControllerAdapterTest.java +++ b/src/test/java/com/cuoco/adapter/in/controller/UserMealPrepControllerAdapterTest.java @@ -1,7 +1,7 @@ package com.cuoco.adapter.in.controller; -import com.cuoco.application.port.in.CreateUserMealPrepCommand; import com.cuoco.adapter.in.controller.model.MealPrepResponse; +import com.cuoco.application.port.in.CreateUserMealPrepCommand; import com.cuoco.application.port.in.DeleteUserMealPrepCommand; import com.cuoco.application.port.in.GetAllUserMealPrepsQuery; import com.cuoco.application.usecase.model.MealPrep; @@ -16,9 +16,12 @@ import java.util.List; -import static org.junit.jupiter.api.Assertions.*; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertNotNull; import static org.mockito.ArgumentMatchers.any; -import static org.mockito.Mockito.*; +import static org.mockito.Mockito.times; +import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.when; @ExtendWith(MockitoExtension.class) class UserMealPrepControllerAdapterTest { diff --git a/src/test/java/com/cuoco/adapter/in/controller/UserRecipeControllerAdapterTest.java b/src/test/java/com/cuoco/adapter/in/controller/UserRecipeControllerAdapterTest.java index d656e74..0ac5543 100644 --- a/src/test/java/com/cuoco/adapter/in/controller/UserRecipeControllerAdapterTest.java +++ b/src/test/java/com/cuoco/adapter/in/controller/UserRecipeControllerAdapterTest.java @@ -20,7 +20,9 @@ import static org.mockito.ArgumentMatchers.any; import static org.mockito.Mockito.doNothing; import static org.mockito.Mockito.when; -import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.*; +import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.delete; +import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; +import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.post; import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.jsonPath; import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; diff --git a/src/test/java/com/cuoco/adapter/out/hibernate/DeleteUserMealPrepDatabaseRepositoryAdapterTest.java b/src/test/java/com/cuoco/adapter/out/hibernate/DeleteUserMealPrepDatabaseRepositoryAdapterTest.java index f1bc839..8ebc33b 100644 --- a/src/test/java/com/cuoco/adapter/out/hibernate/DeleteUserMealPrepDatabaseRepositoryAdapterTest.java +++ b/src/test/java/com/cuoco/adapter/out/hibernate/DeleteUserMealPrepDatabaseRepositoryAdapterTest.java @@ -1,16 +1,12 @@ package com.cuoco.adapter.out.hibernate; import com.cuoco.adapter.out.hibernate.repository.DeleteUserMealPrepsHibernateRepositoryAdapter; -import com.cuoco.application.usecase.model.UserMealPrep; -import com.cuoco.factory.domain.MealPrepFactory; -import com.cuoco.factory.domain.UserFactory; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; import org.mockito.Mock; import org.mockito.junit.jupiter.MockitoExtension; -import static org.mockito.ArgumentMatchers.any; import static org.mockito.Mockito.verify; @ExtendWith(MockitoExtension.class) diff --git a/src/test/java/com/cuoco/adapter/out/hibernate/DeleteUserRecipeDatabaseRepositoryAdapterTest.java b/src/test/java/com/cuoco/adapter/out/hibernate/DeleteUserRecipeDatabaseRepositoryAdapterTest.java index 870a61c..2a27939 100644 --- a/src/test/java/com/cuoco/adapter/out/hibernate/DeleteUserRecipeDatabaseRepositoryAdapterTest.java +++ b/src/test/java/com/cuoco/adapter/out/hibernate/DeleteUserRecipeDatabaseRepositoryAdapterTest.java @@ -1,16 +1,12 @@ package com.cuoco.adapter.out.hibernate; import com.cuoco.adapter.out.hibernate.repository.DeleteUserRecipeHibernateRepositoryAdapter; -import com.cuoco.application.usecase.model.UserRecipe; -import com.cuoco.factory.domain.RecipeFactory; -import com.cuoco.factory.domain.UserFactory; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; import org.mockito.Mock; import org.mockito.junit.jupiter.MockitoExtension; -import static org.mockito.ArgumentMatchers.any; import static org.mockito.Mockito.verify; @ExtendWith(MockitoExtension.class) diff --git a/src/test/java/com/cuoco/adapter/out/hibernate/GetAllMealTypesDatabaseRepositoryAdapterTest.java b/src/test/java/com/cuoco/adapter/out/hibernate/GetAllMealTypesDatabaseRepositoryAdapterTest.java index 488cb1e..c8e7d56 100644 --- a/src/test/java/com/cuoco/adapter/out/hibernate/GetAllMealTypesDatabaseRepositoryAdapterTest.java +++ b/src/test/java/com/cuoco/adapter/out/hibernate/GetAllMealTypesDatabaseRepositoryAdapterTest.java @@ -1,7 +1,7 @@ package com.cuoco.adapter.out.hibernate; -import com.cuoco.adapter.out.hibernate.repository.GetAllMealTypesHibernateRepositoryAdapter; import com.cuoco.adapter.out.hibernate.model.MealTypeHibernateModel; +import com.cuoco.adapter.out.hibernate.repository.GetAllMealTypesHibernateRepositoryAdapter; import com.cuoco.application.usecase.model.MealType; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; @@ -11,7 +11,8 @@ import java.util.List; -import static org.junit.jupiter.api.Assertions.*; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertNotNull; import static org.mockito.Mockito.when; @ExtendWith(MockitoExtension.class) diff --git a/src/test/java/com/cuoco/adapter/out/hibernate/GetAllPreparationTimesDatabaseRepositoryAdapterTest.java b/src/test/java/com/cuoco/adapter/out/hibernate/GetAllPreparationTimesDatabaseRepositoryAdapterTest.java index 96994b0..8f11f56 100644 --- a/src/test/java/com/cuoco/adapter/out/hibernate/GetAllPreparationTimesDatabaseRepositoryAdapterTest.java +++ b/src/test/java/com/cuoco/adapter/out/hibernate/GetAllPreparationTimesDatabaseRepositoryAdapterTest.java @@ -1,7 +1,7 @@ package com.cuoco.adapter.out.hibernate; -import com.cuoco.adapter.out.hibernate.repository.GetAllPreparationTimesHibernateRepositoryAdapter; import com.cuoco.adapter.out.hibernate.model.PreparationTimeHibernateModel; +import com.cuoco.adapter.out.hibernate.repository.GetAllPreparationTimesHibernateRepositoryAdapter; import com.cuoco.application.usecase.model.PreparationTime; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; @@ -11,7 +11,8 @@ import java.util.List; -import static org.junit.jupiter.api.Assertions.*; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertNotNull; import static org.mockito.Mockito.when; @ExtendWith(MockitoExtension.class) diff --git a/src/test/java/com/cuoco/adapter/out/hibernate/GetAllUnitsDatabaseRepositoryAdapterTest.java b/src/test/java/com/cuoco/adapter/out/hibernate/GetAllUnitsDatabaseRepositoryAdapterTest.java index 57f6e54..91d91ae 100644 --- a/src/test/java/com/cuoco/adapter/out/hibernate/GetAllUnitsDatabaseRepositoryAdapterTest.java +++ b/src/test/java/com/cuoco/adapter/out/hibernate/GetAllUnitsDatabaseRepositoryAdapterTest.java @@ -1,7 +1,7 @@ package com.cuoco.adapter.out.hibernate; -import com.cuoco.adapter.out.hibernate.repository.GetAllUnitsHibernateRepositoryAdapter; import com.cuoco.adapter.out.hibernate.model.UnitHibernateModel; +import com.cuoco.adapter.out.hibernate.repository.GetAllUnitsHibernateRepositoryAdapter; import com.cuoco.application.usecase.model.Unit; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; @@ -11,7 +11,8 @@ import java.util.List; -import static org.junit.jupiter.api.Assertions.*; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertNotNull; import static org.mockito.Mockito.when; @ExtendWith(MockitoExtension.class) diff --git a/src/test/java/com/cuoco/adapter/out/hibernate/GetMealPrepByIdDatabaseRepositoryAdapterTest.java b/src/test/java/com/cuoco/adapter/out/hibernate/GetMealPrepByIdDatabaseRepositoryAdapterTest.java index ed12966..3d71a02 100644 --- a/src/test/java/com/cuoco/adapter/out/hibernate/GetMealPrepByIdDatabaseRepositoryAdapterTest.java +++ b/src/test/java/com/cuoco/adapter/out/hibernate/GetMealPrepByIdDatabaseRepositoryAdapterTest.java @@ -13,7 +13,9 @@ import java.util.Optional; -import static org.junit.jupiter.api.Assertions.*; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertNotNull; +import static org.junit.jupiter.api.Assertions.assertThrows; import static org.mockito.Mockito.when; @ExtendWith(MockitoExtension.class) diff --git a/src/test/java/com/cuoco/adapter/out/hibernate/UpdateUserDatabaseRepositoryAdapterTest.java b/src/test/java/com/cuoco/adapter/out/hibernate/UpdateUserDatabaseRepositoryAdapterTest.java index aa655c4..b02bd9e 100644 --- a/src/test/java/com/cuoco/adapter/out/hibernate/UpdateUserDatabaseRepositoryAdapterTest.java +++ b/src/test/java/com/cuoco/adapter/out/hibernate/UpdateUserDatabaseRepositoryAdapterTest.java @@ -14,9 +14,11 @@ import org.mockito.Mock; import org.mockito.junit.jupiter.MockitoExtension; -import static org.junit.jupiter.api.Assertions.*; +import static org.junit.jupiter.api.Assertions.assertNotNull; import static org.mockito.ArgumentMatchers.any; -import static org.mockito.Mockito.*; +import static org.mockito.Mockito.times; +import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.when; @ExtendWith(MockitoExtension.class) class UpdateUserDatabaseRepositoryAdapterTest { diff --git a/src/test/java/com/cuoco/adapter/out/rest/gemini/CreateRecipeByNameGeminiRestRespositoryAdapterTest.java b/src/test/java/com/cuoco/adapter/out/rest/gemini/CreateRecipeByNameGeminiRestRespositoryAdapterTest.java index cfc04e7..f1a8578 100644 --- a/src/test/java/com/cuoco/adapter/out/rest/gemini/CreateRecipeByNameGeminiRestRespositoryAdapterTest.java +++ b/src/test/java/com/cuoco/adapter/out/rest/gemini/CreateRecipeByNameGeminiRestRespositoryAdapterTest.java @@ -1,7 +1,6 @@ package com.cuoco.adapter.out.rest.gemini; import com.cuoco.adapter.exception.NotAvailableException; -import com.cuoco.adapter.exception.UnprocessableException; import com.cuoco.adapter.out.rest.gemini.model.RecipeResponseGeminiModel; import com.cuoco.adapter.out.rest.gemini.model.wrapper.CandidateGeminiResponseModel; import com.cuoco.adapter.out.rest.gemini.model.wrapper.ContentGeminiRequestModel; diff --git a/src/test/java/com/cuoco/adapter/out/rest/gemini/GetMealPrepsFromIngredientsGeminiRestRepositoryAdapterTest.java b/src/test/java/com/cuoco/adapter/out/rest/gemini/GetMealPrepsFromIngredientsGeminiRestRepositoryAdapterTest.java index 38314fa..2f0bd15 100644 --- a/src/test/java/com/cuoco/adapter/out/rest/gemini/GetMealPrepsFromIngredientsGeminiRestRepositoryAdapterTest.java +++ b/src/test/java/com/cuoco/adapter/out/rest/gemini/GetMealPrepsFromIngredientsGeminiRestRepositoryAdapterTest.java @@ -1,14 +1,12 @@ package com.cuoco.adapter.out.rest.gemini; import com.cuoco.adapter.out.rest.gemini.model.MealPrepResponseGeminiModel; -import com.cuoco.adapter.out.rest.gemini.model.wrapper.GeminiResponseModel; import com.cuoco.adapter.out.rest.gemini.model.wrapper.CandidateGeminiResponseModel; import com.cuoco.adapter.out.rest.gemini.model.wrapper.ContentGeminiRequestModel; +import com.cuoco.adapter.out.rest.gemini.model.wrapper.GeminiResponseModel; import com.cuoco.adapter.out.rest.gemini.model.wrapper.PartGeminiRequestModel; import com.cuoco.application.usecase.model.MealPrep; -import com.cuoco.application.usecase.model.Recipe; import com.cuoco.factory.domain.MealPrepFactory; -import com.cuoco.factory.domain.RecipeFactory; import com.cuoco.factory.gemini.MealPrepResponseGeminiModelFactory; import com.fasterxml.jackson.databind.ObjectMapper; import org.junit.jupiter.api.BeforeEach; @@ -20,11 +18,13 @@ import java.util.List; -import static org.junit.jupiter.api.Assertions.*; +import static org.junit.jupiter.api.Assertions.assertFalse; +import static org.junit.jupiter.api.Assertions.assertNotNull; +import static org.junit.jupiter.api.Assertions.assertThrows; import static org.mockito.ArgumentMatchers.any; import static org.mockito.ArgumentMatchers.anyString; -import static org.mockito.Mockito.when; import static org.mockito.ArgumentMatchers.eq; +import static org.mockito.Mockito.when; @ExtendWith(MockitoExtension.class) class GetMealPrepsFromIngredientsGeminiRestRepositoryAdapterTest { diff --git a/src/test/java/com/cuoco/adapter/out/rest/gemini/GetRecipeMainImageGeminiRestRepositoryAdapterTest.java b/src/test/java/com/cuoco/adapter/out/rest/gemini/GetRecipeMainImageGeminiRestRepositoryAdapterTest.java index 4438c1e..f704db5 100644 --- a/src/test/java/com/cuoco/adapter/out/rest/gemini/GetRecipeMainImageGeminiRestRepositoryAdapterTest.java +++ b/src/test/java/com/cuoco/adapter/out/rest/gemini/GetRecipeMainImageGeminiRestRepositoryAdapterTest.java @@ -1,13 +1,9 @@ package com.cuoco.adapter.out.rest.gemini; import com.cuoco.adapter.out.rest.gemini.model.wrapper.GeminiResponseModel; -import com.cuoco.adapter.out.rest.gemini.model.wrapper.CandidateGeminiResponseModel; -import com.cuoco.adapter.out.rest.gemini.model.wrapper.ContentGeminiRequestModel; -import com.cuoco.adapter.out.rest.gemini.model.wrapper.PartGeminiRequestModel; import com.cuoco.adapter.out.rest.gemini.utils.ImageUtils; import com.cuoco.application.usecase.model.Recipe; import com.cuoco.factory.domain.RecipeFactory; -import com.fasterxml.jackson.databind.ObjectMapper; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; @@ -15,13 +11,12 @@ import org.mockito.junit.jupiter.MockitoExtension; import org.springframework.web.client.RestTemplate; -import java.util.List; - -import static org.junit.jupiter.api.Assertions.*; +import static org.junit.jupiter.api.Assertions.assertThrows; +import static org.junit.jupiter.api.Assertions.assertTrue; import static org.mockito.ArgumentMatchers.any; import static org.mockito.ArgumentMatchers.anyString; -import static org.mockito.Mockito.when; import static org.mockito.ArgumentMatchers.eq; +import static org.mockito.Mockito.when; @ExtendWith(MockitoExtension.class) class GetRecipeMainImageGeminiRestRepositoryAdapterTest { diff --git a/src/test/java/com/cuoco/application/usecase/AuthenticateUserUseCaseTest.java b/src/test/java/com/cuoco/application/usecase/AuthenticateUserUseCaseTest.java index 8379102..2e06121 100644 --- a/src/test/java/com/cuoco/application/usecase/AuthenticateUserUseCaseTest.java +++ b/src/test/java/com/cuoco/application/usecase/AuthenticateUserUseCaseTest.java @@ -5,9 +5,9 @@ import com.cuoco.application.port.out.GetUserByEmailRepository; import com.cuoco.application.usecase.model.AuthenticatedUser; import com.cuoco.application.usecase.model.User; +import com.cuoco.application.utils.JwtUtil; import com.cuoco.factory.domain.UserFactory; import com.cuoco.shared.model.ErrorDescription; -import com.cuoco.application.utils.JwtUtil; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; diff --git a/src/test/java/com/cuoco/application/usecase/CreateUserMealPrepUseCaseTest.java b/src/test/java/com/cuoco/application/usecase/CreateUserMealPrepUseCaseTest.java new file mode 100644 index 0000000..9f57afe --- /dev/null +++ b/src/test/java/com/cuoco/application/usecase/CreateUserMealPrepUseCaseTest.java @@ -0,0 +1,68 @@ +package com.cuoco.application.usecase; + +import com.cuoco.application.exception.ConflictException; +import com.cuoco.application.port.in.CreateUserMealPrepCommand; +import com.cuoco.application.port.out.CreateUserMealPrepRepository; +import com.cuoco.application.port.out.ExistsUserMealPrepRepository; +import com.cuoco.application.port.out.GetMealPrepByIdRepository; +import com.cuoco.application.usecase.domainservice.UserDomainService; +import com.cuoco.application.usecase.model.MealPrep; +import com.cuoco.application.usecase.model.User; +import com.cuoco.application.usecase.model.UserMealPrep; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; + +import static org.junit.jupiter.api.Assertions.assertThrows; +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.never; +import static org.mockito.Mockito.times; +import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.when; + +class CreateUserMealPrepUseCaseTest { + + private UserDomainService userDomainService; + private CreateUserMealPrepRepository createUserMealPrepRepository; + private ExistsUserMealPrepRepository existsUserMealPrepRepository; + private GetMealPrepByIdRepository getMealPrepByIdRepository; + private CreateUserMealPrepUseCase useCase; + + @BeforeEach + void setup() { + userDomainService = mock(UserDomainService.class); + createUserMealPrepRepository = mock(CreateUserMealPrepRepository.class); + existsUserMealPrepRepository = mock(ExistsUserMealPrepRepository.class); + getMealPrepByIdRepository = mock(GetMealPrepByIdRepository.class); + + useCase = new CreateUserMealPrepUseCase(userDomainService, createUserMealPrepRepository, existsUserMealPrepRepository, getMealPrepByIdRepository); + } + + @Test + void GIVEN_not_existing_WHEN_execute_THEN_save_user_meal_prep() { + User user = User.builder().id(1L).build(); + MealPrep mealPrep = MealPrep.builder().id(2L).build(); + CreateUserMealPrepCommand.Command command = CreateUserMealPrepCommand.Command.builder().id(2L).build(); + + when(userDomainService.getCurrentUser()).thenReturn(user); + when(getMealPrepByIdRepository.execute(2L)).thenReturn(mealPrep); + when(existsUserMealPrepRepository.execute(any(UserMealPrep.class))).thenReturn(false); + + useCase.execute(command); + verify(createUserMealPrepRepository, times(1)).execute(any(UserMealPrep.class)); + } + + @Test + void GIVEN_existing_WHEN_execute_THEN_throw_conflict() { + User user = User.builder().id(1L).build(); + MealPrep mealPrep = MealPrep.builder().id(2L).build(); + CreateUserMealPrepCommand.Command command = CreateUserMealPrepCommand.Command.builder().id(2L).build(); + + when(userDomainService.getCurrentUser()).thenReturn(user); + when(getMealPrepByIdRepository.execute(2L)).thenReturn(mealPrep); + when(existsUserMealPrepRepository.execute(any(UserMealPrep.class))).thenReturn(true); + + assertThrows(ConflictException.class, () -> useCase.execute(command)); + verify(createUserMealPrepRepository, never()).execute(any(UserMealPrep.class)); + } +} \ No newline at end of file diff --git a/src/test/java/com/cuoco/application/usecase/CreateUserUseCaseTest.java b/src/test/java/com/cuoco/application/usecase/CreateUserUseCaseTest.java index d3a3b89..facaac2 100644 --- a/src/test/java/com/cuoco/application/usecase/CreateUserUseCaseTest.java +++ b/src/test/java/com/cuoco/application/usecase/CreateUserUseCaseTest.java @@ -3,12 +3,12 @@ import com.cuoco.application.exception.BadRequestException; import com.cuoco.application.port.in.CreateUserCommand; import com.cuoco.application.port.out.CreateUserRepository; +import com.cuoco.application.port.out.ExistsUserByEmailRepository; import com.cuoco.application.port.out.GetAllergiesByIdRepository; import com.cuoco.application.port.out.GetCookLevelByIdRepository; import com.cuoco.application.port.out.GetDietByIdRepository; import com.cuoco.application.port.out.GetDietaryNeedsByIdRepository; import com.cuoco.application.port.out.GetPlanByIdRepository; -import com.cuoco.application.port.out.ExistsUserByEmailRepository; import com.cuoco.application.port.out.SendConfirmationEmailRepository; import com.cuoco.application.usecase.model.Allergy; import com.cuoco.application.usecase.model.DietaryNeed; diff --git a/src/test/java/com/cuoco/application/usecase/DeleteUserMealPrepUseCaseTest.java b/src/test/java/com/cuoco/application/usecase/DeleteUserMealPrepUseCaseTest.java new file mode 100644 index 0000000..5390362 --- /dev/null +++ b/src/test/java/com/cuoco/application/usecase/DeleteUserMealPrepUseCaseTest.java @@ -0,0 +1,38 @@ +package com.cuoco.application.usecase; + +import com.cuoco.application.port.in.DeleteUserMealPrepCommand; +import com.cuoco.application.port.out.DeleteUserMealPrepRepository; +import com.cuoco.application.usecase.domainservice.UserDomainService; +import com.cuoco.application.usecase.model.User; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; + +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.times; +import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.when; + +class DeleteUserMealPrepUseCaseTest { + + private UserDomainService userDomainService; + private DeleteUserMealPrepRepository deleteUserMealPrepRepository; + private DeleteUserMealPrepUseCase useCase; + + @BeforeEach + void setup() { + userDomainService = mock(UserDomainService.class); + deleteUserMealPrepRepository = mock(DeleteUserMealPrepRepository.class); + useCase = new DeleteUserMealPrepUseCase(userDomainService, deleteUserMealPrepRepository); + } + + @Test + void GIVEN_command_WHEN_execute_THEN_delete_called_with_user_id_and_meal_prep_id() { + User user = User.builder().id(1L).build(); + DeleteUserMealPrepCommand.Command command = DeleteUserMealPrepCommand.Command.builder().id(2L).build(); + + when(userDomainService.getCurrentUser()).thenReturn(user); + + useCase.execute(command); + verify(deleteUserMealPrepRepository, times(1)).execute(1L, 2L); + } +} \ No newline at end of file diff --git a/src/test/java/com/cuoco/application/usecase/DeleteUserRepositoryUseCaseTest.java b/src/test/java/com/cuoco/application/usecase/DeleteUserRepositoryUseCaseTest.java new file mode 100644 index 0000000..19b02dd --- /dev/null +++ b/src/test/java/com/cuoco/application/usecase/DeleteUserRepositoryUseCaseTest.java @@ -0,0 +1,38 @@ +package com.cuoco.application.usecase; + +import com.cuoco.application.port.in.DeleteUserRecipeCommand; +import com.cuoco.application.port.out.DeleteUserRecipeRepository; +import com.cuoco.application.usecase.domainservice.UserDomainService; +import com.cuoco.application.usecase.model.User; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; + +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.times; +import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.when; + +class DeleteUserRepositoryUseCaseTest { + + private UserDomainService userDomainService; + private DeleteUserRecipeRepository deleteUserRecipeRepository; + private DeleteUserRepositoryUseCase useCase; + + @BeforeEach + void setup() { + userDomainService = mock(UserDomainService.class); + deleteUserRecipeRepository = mock(DeleteUserRecipeRepository.class); + useCase = new DeleteUserRepositoryUseCase(userDomainService, deleteUserRecipeRepository); + } + + @Test + void GIVEN_command_WHEN_execute_THEN_delete_called_with_user_id_and_recipe_id() { + User user = User.builder().id(1L).build(); + DeleteUserRecipeCommand.Command command = DeleteUserRecipeCommand.Command.builder().id(2L).build(); + + when(userDomainService.getCurrentUser()).thenReturn(user); + + useCase.execute(command); + verify(deleteUserRecipeRepository, times(1)).execute(1L, 2L); + } +} \ No newline at end of file diff --git a/src/test/java/com/cuoco/application/usecase/FindOrGenerateRecipeUseCaseTest.java b/src/test/java/com/cuoco/application/usecase/FindOrGenerateRecipeUseCaseTest.java index ea5f620..e615490 100644 --- a/src/test/java/com/cuoco/application/usecase/FindOrGenerateRecipeUseCaseTest.java +++ b/src/test/java/com/cuoco/application/usecase/FindOrGenerateRecipeUseCaseTest.java @@ -14,9 +14,13 @@ import org.mockito.Mock; import org.mockito.junit.jupiter.MockitoExtension; -import static org.junit.jupiter.api.Assertions.*; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertNotNull; +import static org.junit.jupiter.api.Assertions.assertThrows; import static org.mockito.ArgumentMatchers.any; -import static org.mockito.Mockito.*; +import static org.mockito.Mockito.never; +import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.when; @ExtendWith(MockitoExtension.class) class FindOrGenerateRecipeUseCaseTest { diff --git a/src/test/java/com/cuoco/application/usecase/FindRecipesUseCaseTest.java b/src/test/java/com/cuoco/application/usecase/FindRecipesUseCaseTest.java new file mode 100644 index 0000000..dddf069 --- /dev/null +++ b/src/test/java/com/cuoco/application/usecase/FindRecipesUseCaseTest.java @@ -0,0 +1,56 @@ +package com.cuoco.application.usecase; + +import com.cuoco.application.port.in.FindRecipesCommand; +import com.cuoco.application.port.out.FindRecipesByFiltersRepository; +import com.cuoco.application.usecase.model.Recipe; +import com.cuoco.application.usecase.model.SearchFilters; +import com.cuoco.factory.domain.RecipeFactory; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.mockito.ArgumentCaptor; + +import java.util.List; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.when; + +class FindRecipesUseCaseTest { + + private FindRecipesByFiltersRepository findRecipesByFiltersRepository; + private FindRecipesUseCase useCase; + + @BeforeEach + void setUp() { + findRecipesByFiltersRepository = mock(FindRecipesByFiltersRepository.class); + useCase = new FindRecipesUseCase(findRecipesByFiltersRepository); + } + + @Test + void GIVEN_null_size_and_random_WHEN_execute_THEN_use_default_values() { + List expected = List.of(RecipeFactory.create()); + when(findRecipesByFiltersRepository.execute(any())).thenReturn(expected); + FindRecipesCommand.Command command = FindRecipesCommand.Command.builder().build(); + List result = useCase.execute(command); + assertEquals(expected, result); + ArgumentCaptor captor = ArgumentCaptor.forClass(SearchFilters.class); + verify(findRecipesByFiltersRepository).execute(captor.capture()); + assertEquals(5, captor.getValue().getSize()); + assertEquals(false, captor.getValue().getRandom()); + } + + @Test + void GIVEN_non_null_size_and_random_WHEN_execute_THEN_use_provided_values() { + List expected = List.of(RecipeFactory.create()); + when(findRecipesByFiltersRepository.execute(any())).thenReturn(expected); + FindRecipesCommand.Command command = FindRecipesCommand.Command.builder().size(10).random(true).build(); + List result = useCase.execute(command); + assertEquals(expected, result); + ArgumentCaptor captor = ArgumentCaptor.forClass(SearchFilters.class); + verify(findRecipesByFiltersRepository).execute(captor.capture()); + assertEquals(10, captor.getValue().getSize()); + assertEquals(true, captor.getValue().getRandom()); + } +} \ No newline at end of file diff --git a/src/test/java/com/cuoco/application/usecase/GetAllPreparationTimesUseCaseTest.java b/src/test/java/com/cuoco/application/usecase/GetAllPreparationTimesUseCaseTest.java new file mode 100644 index 0000000..052fd0c --- /dev/null +++ b/src/test/java/com/cuoco/application/usecase/GetAllPreparationTimesUseCaseTest.java @@ -0,0 +1,31 @@ +package com.cuoco.application.usecase; + +import com.cuoco.application.port.out.GetAllPreparationTimesRepository; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; + +import java.util.List; + +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.times; +import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.when; + +class GetAllPreparationTimesUseCaseTest { + + private GetAllPreparationTimesRepository getAllPreparationTimesRepository; + private GetAllPreparationTimesUseCase useCase; + + @BeforeEach + void setup() { + getAllPreparationTimesRepository = mock(GetAllPreparationTimesRepository.class); + useCase = new GetAllPreparationTimesUseCase(getAllPreparationTimesRepository); + } + + @Test + void GIVEN_no_params_WHEN_execute_THEN_repository_called_once() { + when(getAllPreparationTimesRepository.execute()).thenReturn(List.of()); + useCase.execute(); + verify(getAllPreparationTimesRepository, times(1)).execute(); + } +} \ No newline at end of file diff --git a/src/test/java/com/cuoco/application/usecase/GetMealPrepByIdUseCaseTest.java b/src/test/java/com/cuoco/application/usecase/GetMealPrepByIdUseCaseTest.java new file mode 100644 index 0000000..98b8cef --- /dev/null +++ b/src/test/java/com/cuoco/application/usecase/GetMealPrepByIdUseCaseTest.java @@ -0,0 +1,35 @@ +package com.cuoco.application.usecase; + +import com.cuoco.application.port.out.GetMealPrepByIdRepository; +import com.cuoco.application.usecase.model.MealPrep; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.times; +import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.when; + +class GetMealPrepByIdUseCaseTest { + + private GetMealPrepByIdRepository getMealPrepByIdRepository; + private GetMealPrepByIdUseCase useCase; + + @BeforeEach + void setup() { + getMealPrepByIdRepository = mock(GetMealPrepByIdRepository.class); + useCase = new GetMealPrepByIdUseCase(getMealPrepByIdRepository); + } + + @Test + void GIVEN_id_WHEN_execute_THEN_return_meal_prep() { + MealPrep mealPrep = MealPrep.builder().id(1L).build(); + + when(getMealPrepByIdRepository.execute(1L)).thenReturn(mealPrep); + MealPrep result = useCase.execute(1L); + + assertEquals(mealPrep, result); + verify(getMealPrepByIdRepository, times(1)).execute(1L); + } +} \ No newline at end of file diff --git a/src/test/java/com/cuoco/application/usecase/SignInUserUseCaseTest.java b/src/test/java/com/cuoco/application/usecase/SignInUserUseCaseTest.java index 58872be..e01a232 100644 --- a/src/test/java/com/cuoco/application/usecase/SignInUserUseCaseTest.java +++ b/src/test/java/com/cuoco/application/usecase/SignInUserUseCaseTest.java @@ -5,8 +5,8 @@ import com.cuoco.application.port.out.GetUserByEmailRepository; import com.cuoco.application.usecase.model.AuthenticatedUser; import com.cuoco.application.usecase.model.User; -import com.cuoco.shared.model.ErrorDescription; import com.cuoco.application.utils.JwtUtil; +import com.cuoco.shared.model.ErrorDescription; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import org.springframework.security.crypto.password.PasswordEncoder; diff --git a/src/test/java/com/cuoco/application/usecase/UpdateUserProfileUseCaseTest.java b/src/test/java/com/cuoco/application/usecase/UpdateUserProfileUseCaseTest.java index 49c7ab4..4b3d914 100644 --- a/src/test/java/com/cuoco/application/usecase/UpdateUserProfileUseCaseTest.java +++ b/src/test/java/com/cuoco/application/usecase/UpdateUserProfileUseCaseTest.java @@ -28,7 +28,10 @@ import static org.mockito.ArgumentMatchers.anyInt; import static org.mockito.ArgumentMatchers.anyList; import static org.mockito.ArgumentMatchers.argThat; -import static org.mockito.Mockito.*; +import static org.mockito.Mockito.never; +import static org.mockito.Mockito.times; +import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.when; @ExtendWith(MockitoExtension.class) class UpdateUserProfileUseCaseTest { diff --git a/src/test/java/com/cuoco/application/usecase/UserRecipeUseCaseTest.java b/src/test/java/com/cuoco/application/usecase/UserRecipeUseCaseTest.java index 936ae08..30cdb95 100644 --- a/src/test/java/com/cuoco/application/usecase/UserRecipeUseCaseTest.java +++ b/src/test/java/com/cuoco/application/usecase/UserRecipeUseCaseTest.java @@ -3,8 +3,8 @@ import com.cuoco.application.exception.ConflictException; import com.cuoco.application.port.in.CreateUserRecipeCommand; import com.cuoco.application.port.out.CreateUserRecipeRepository; -import com.cuoco.application.port.out.GetRecipeByIdRepository; import com.cuoco.application.port.out.ExistsUserRecipeByUserIdAndRecipeIdRepository; +import com.cuoco.application.port.out.GetRecipeByIdRepository; import com.cuoco.application.usecase.domainservice.UserDomainService; import com.cuoco.application.usecase.model.Recipe; import com.cuoco.application.usecase.model.User; diff --git a/src/test/java/com/cuoco/factory/domain/CalendarFactory.java b/src/test/java/com/cuoco/factory/domain/CalendarFactory.java index bac27f9..72d912c 100644 --- a/src/test/java/com/cuoco/factory/domain/CalendarFactory.java +++ b/src/test/java/com/cuoco/factory/domain/CalendarFactory.java @@ -4,7 +4,6 @@ import com.cuoco.application.usecase.model.CalendarRecipe; import com.cuoco.application.usecase.model.Day; import com.cuoco.application.usecase.model.MealType; -import com.cuoco.application.usecase.model.Recipe; import java.util.List; diff --git a/src/test/java/com/cuoco/factory/domain/MealPrepFactory.java b/src/test/java/com/cuoco/factory/domain/MealPrepFactory.java index 35a79e7..c21af55 100644 --- a/src/test/java/com/cuoco/factory/domain/MealPrepFactory.java +++ b/src/test/java/com/cuoco/factory/domain/MealPrepFactory.java @@ -1,7 +1,6 @@ package com.cuoco.factory.domain; import com.cuoco.application.usecase.model.MealPrep; -import com.cuoco.application.usecase.model.Recipe; import com.cuoco.application.usecase.model.Step; import java.util.List; diff --git a/src/test/java/com/cuoco/factory/domain/ParametricDataFactory.java b/src/test/java/com/cuoco/factory/domain/ParametricDataFactory.java index 6de7942..57634d6 100644 --- a/src/test/java/com/cuoco/factory/domain/ParametricDataFactory.java +++ b/src/test/java/com/cuoco/factory/domain/ParametricDataFactory.java @@ -1,11 +1,11 @@ package com.cuoco.factory.domain; -import com.cuoco.application.usecase.model.ParametricData; import com.cuoco.application.usecase.model.Allergy; import com.cuoco.application.usecase.model.CookLevel; import com.cuoco.application.usecase.model.Diet; import com.cuoco.application.usecase.model.DietaryNeed; import com.cuoco.application.usecase.model.MealType; +import com.cuoco.application.usecase.model.ParametricData; import com.cuoco.application.usecase.model.PreparationTime; import com.cuoco.application.usecase.model.Unit; diff --git a/src/test/java/com/cuoco/factory/domain/RecipeFactory.java b/src/test/java/com/cuoco/factory/domain/RecipeFactory.java index 11ff5c7..3c7074c 100644 --- a/src/test/java/com/cuoco/factory/domain/RecipeFactory.java +++ b/src/test/java/com/cuoco/factory/domain/RecipeFactory.java @@ -1,8 +1,20 @@ package com.cuoco.factory.domain; -import com.cuoco.adapter.in.controller.model.RecipeRequest; import com.cuoco.adapter.in.controller.model.IngredientRequest; -import com.cuoco.application.usecase.model.*; +import com.cuoco.adapter.in.controller.model.RecipeRequest; +import com.cuoco.application.usecase.model.Allergy; +import com.cuoco.application.usecase.model.CookLevel; +import com.cuoco.application.usecase.model.Diet; +import com.cuoco.application.usecase.model.DietaryNeed; +import com.cuoco.application.usecase.model.Filters; +import com.cuoco.application.usecase.model.Ingredient; +import com.cuoco.application.usecase.model.MealType; +import com.cuoco.application.usecase.model.ParametricData; +import com.cuoco.application.usecase.model.PreparationTime; +import com.cuoco.application.usecase.model.Recipe; +import com.cuoco.application.usecase.model.RecipeConfiguration; +import com.cuoco.application.usecase.model.Step; +import com.cuoco.application.usecase.model.Unit; import java.util.List; diff --git a/src/test/java/com/cuoco/factory/gemini/IngredientResponseGeminiModelFactory.java b/src/test/java/com/cuoco/factory/gemini/IngredientResponseGeminiModelFactory.java index 566be09..10ba9bc 100644 --- a/src/test/java/com/cuoco/factory/gemini/IngredientResponseGeminiModelFactory.java +++ b/src/test/java/com/cuoco/factory/gemini/IngredientResponseGeminiModelFactory.java @@ -3,8 +3,6 @@ import com.cuoco.adapter.out.rest.gemini.model.IngredientResponseGeminiModel; import com.cuoco.application.usecase.model.Unit; -import java.util.List; - public class IngredientResponseGeminiModelFactory { public static IngredientResponseGeminiModel create() { diff --git a/src/test/java/com/cuoco/factory/gemini/RecipeResponseGeminiModelFactory.java b/src/test/java/com/cuoco/factory/gemini/RecipeResponseGeminiModelFactory.java index 96a63ea..fc59155 100644 --- a/src/test/java/com/cuoco/factory/gemini/RecipeResponseGeminiModelFactory.java +++ b/src/test/java/com/cuoco/factory/gemini/RecipeResponseGeminiModelFactory.java @@ -1,7 +1,7 @@ package com.cuoco.factory.gemini; -import com.cuoco.adapter.out.rest.gemini.model.RecipeResponseGeminiModel; import com.cuoco.adapter.out.rest.gemini.model.IngredientResponseGeminiModel; +import com.cuoco.adapter.out.rest.gemini.model.RecipeResponseGeminiModel; import com.cuoco.adapter.out.rest.gemini.model.StepResponseGeminiModel; import com.cuoco.application.usecase.model.Unit; diff --git a/src/test/java/com/cuoco/factory/hibernate/RecipeHibernateModelFactory.java b/src/test/java/com/cuoco/factory/hibernate/RecipeHibernateModelFactory.java index 89c4bdb..e1f2253 100644 --- a/src/test/java/com/cuoco/factory/hibernate/RecipeHibernateModelFactory.java +++ b/src/test/java/com/cuoco/factory/hibernate/RecipeHibernateModelFactory.java @@ -1,9 +1,9 @@ package com.cuoco.factory.hibernate; +import com.cuoco.adapter.out.hibernate.model.IngredientHibernateModel; import com.cuoco.adapter.out.hibernate.model.RecipeHibernateModel; import com.cuoco.adapter.out.hibernate.model.RecipeIngredientsHibernateModel; import com.cuoco.adapter.out.hibernate.model.RecipeStepsHibernateModel; -import com.cuoco.adapter.out.hibernate.model.IngredientHibernateModel; import com.cuoco.adapter.out.hibernate.model.UnitHibernateModel; import java.util.List; From 32e32c00e7d41337ab3f49e6baa35f29600813b9 Mon Sep 17 00:00:00 2001 From: Alan Di Giovanni Date: Mon, 14 Jul 2025 23:47:07 -0300 Subject: [PATCH 6/6] test(PC-136): Fixes tests --- ...PrepByIdDatabaseRepositoryAdapterTest.java | 5 --- .../FindOrGenerateRecipeUseCaseTest.java | 8 +++- .../cuoco/factory/domain/RecipeFactory.java | 3 -- .../MealPrepHibernateModelFactory.java | 22 +++++++++ .../RecipeHibernateModelFactory.java | 45 ++++++++++--------- 5 files changed, 53 insertions(+), 30 deletions(-) diff --git a/src/test/java/com/cuoco/adapter/out/hibernate/GetMealPrepByIdDatabaseRepositoryAdapterTest.java b/src/test/java/com/cuoco/adapter/out/hibernate/GetMealPrepByIdDatabaseRepositoryAdapterTest.java index 3d71a02..fe67d1f 100644 --- a/src/test/java/com/cuoco/adapter/out/hibernate/GetMealPrepByIdDatabaseRepositoryAdapterTest.java +++ b/src/test/java/com/cuoco/adapter/out/hibernate/GetMealPrepByIdDatabaseRepositoryAdapterTest.java @@ -29,28 +29,23 @@ class GetMealPrepByIdDatabaseRepositoryAdapterTest { @Test void shouldGetMealPrepByIdSuccessfully() { - // Given Long mealPrepId = 1L; MealPrepHibernateModel mealPrepHibernateModel = MealPrepHibernateModelFactory.create(); when(getMealPrepByIdHibernateRepositoryAdapter.findById(mealPrepId)) .thenReturn(Optional.of(mealPrepHibernateModel)); - // When MealPrep result = getMealPrepByIdDatabaseRepositoryAdapter.execute(mealPrepId); - // Then assertNotNull(result); assertEquals(mealPrepHibernateModel.getId(), result.getId()); } @Test void shouldThrowBadRequestExceptionWhenMealPrepNotFound() { - // Given Long mealPrepId = 999L; when(getMealPrepByIdHibernateRepositoryAdapter.findById(mealPrepId)) .thenReturn(Optional.empty()); - // When & Then assertThrows(BadRequestException.class, () -> { getMealPrepByIdDatabaseRepositoryAdapter.execute(mealPrepId); }); diff --git a/src/test/java/com/cuoco/application/usecase/FindOrGenerateRecipeUseCaseTest.java b/src/test/java/com/cuoco/application/usecase/FindOrGenerateRecipeUseCaseTest.java index e615490..18b72b3 100644 --- a/src/test/java/com/cuoco/application/usecase/FindOrGenerateRecipeUseCaseTest.java +++ b/src/test/java/com/cuoco/application/usecase/FindOrGenerateRecipeUseCaseTest.java @@ -5,6 +5,7 @@ import com.cuoco.application.port.out.CreateRecipeByNameRepository; import com.cuoco.application.port.out.CreateRecipeRepository; import com.cuoco.application.port.out.FindRecipeByNameRepository; +import com.cuoco.application.usecase.domainservice.ParametricDataDomainService; import com.cuoco.application.usecase.domainservice.RecipeDomainService; import com.cuoco.application.usecase.model.Recipe; import com.cuoco.factory.domain.RecipeFactory; @@ -25,6 +26,9 @@ @ExtendWith(MockitoExtension.class) class FindOrGenerateRecipeUseCaseTest { + @Mock + private ParametricDataDomainService parametricDataDomainService; + @Mock private CreateRecipeByNameRepository createRecipeByNameRepository; @@ -42,10 +46,10 @@ class FindOrGenerateRecipeUseCaseTest { @BeforeEach void setUp() { useCase = new FindOrCreateRecipeUseCase( + parametricDataDomainService, createRecipeByNameRepository, findRecipeByNameRepository, - createRecipeRepository, - recipeDomainService + createRecipeRepository ); } diff --git a/src/test/java/com/cuoco/factory/domain/RecipeFactory.java b/src/test/java/com/cuoco/factory/domain/RecipeFactory.java index 3c7074c..9ae5a15 100644 --- a/src/test/java/com/cuoco/factory/domain/RecipeFactory.java +++ b/src/test/java/com/cuoco/factory/domain/RecipeFactory.java @@ -57,7 +57,6 @@ public static Recipe create() { .filters(Filters.builder() .useProfilePreferences(true) .enable(true) - .servings(4) .preparationTime(PreparationTime.builder().id(1).description("30 minutes").build()) .cookLevel(CookLevel.builder().id(1).description("Beginner").build()) .diet(Diet.builder().id(1).description("Vegetarian").build()) @@ -111,7 +110,6 @@ public static Recipe createWithName(String name) { .filters(Filters.builder() .useProfilePreferences(true) .enable(true) - .servings(4) .preparationTime(PreparationTime.builder().id(1).description("30 minutes").build()) .cookLevel(CookLevel.builder().id(1).description("Beginner").build()) .diet(Diet.builder().id(1).description("Vegetarian").build()) @@ -133,7 +131,6 @@ public static Recipe createWithFilters() { Filters filters = Filters.builder() .useProfilePreferences(true) .enable(true) - .servings(2) .preparationTime(PreparationTime.builder().id(1).description("15 minutes").build()) .cookLevel(CookLevel.builder().id(1).description("Easy").build()) .diet(Diet.builder().id(1).description("Vegan").build()) diff --git a/src/test/java/com/cuoco/factory/hibernate/MealPrepHibernateModelFactory.java b/src/test/java/com/cuoco/factory/hibernate/MealPrepHibernateModelFactory.java index 3bfdc7a..c1a7169 100644 --- a/src/test/java/com/cuoco/factory/hibernate/MealPrepHibernateModelFactory.java +++ b/src/test/java/com/cuoco/factory/hibernate/MealPrepHibernateModelFactory.java @@ -1,12 +1,20 @@ package com.cuoco.factory.hibernate; +import com.cuoco.adapter.out.hibernate.model.AllergyHibernateModel; +import com.cuoco.adapter.out.hibernate.model.CookLevelHibernateModel; +import com.cuoco.adapter.out.hibernate.model.DietHibernateModel; +import com.cuoco.adapter.out.hibernate.model.DietaryNeedHibernateModel; import com.cuoco.adapter.out.hibernate.model.IngredientHibernateModel; import com.cuoco.adapter.out.hibernate.model.MealPrepHibernateModel; import com.cuoco.adapter.out.hibernate.model.MealPrepIngredientsHibernateModel; import com.cuoco.adapter.out.hibernate.model.MealPrepStepsHibernateModel; +import com.cuoco.adapter.out.hibernate.model.MealTypeHibernateModel; +import com.cuoco.adapter.out.hibernate.model.PreparationTimeHibernateModel; import com.cuoco.adapter.out.hibernate.model.RecipeHibernateModel; import com.cuoco.adapter.out.hibernate.model.RecipeIngredientsHibernateModel; +import com.cuoco.adapter.out.hibernate.model.RecipeStepsHibernateModel; import com.cuoco.adapter.out.hibernate.model.UnitHibernateModel; +import com.cuoco.application.usecase.model.Step; import java.util.List; @@ -41,6 +49,20 @@ public static MealPrepHibernateModel create() { ) .build() )) + .steps(List.of( + RecipeStepsHibernateModel.builder() + .id(2L) + .title("step 1") + .imageName("image1") + .description("description1") + .build() + )) + .preparationTime(PreparationTimeHibernateModel.builder().id(1).description("description").build()) + .diet(DietHibernateModel.builder().id(1).description("description").build()) + .cookLevel(CookLevelHibernateModel.builder().id(1).description("description").build()) + .dietaryNeeds(List.of(DietaryNeedHibernateModel.builder().id(1).description("description").build())) + .allergies(List.of(AllergyHibernateModel.builder().id(1).description("description").build())) + .mealTypes(List.of(MealTypeHibernateModel.builder().id(1).description("description").build())) .build() )) .ingredients(List.of( diff --git a/src/test/java/com/cuoco/factory/hibernate/RecipeHibernateModelFactory.java b/src/test/java/com/cuoco/factory/hibernate/RecipeHibernateModelFactory.java index e1f2253..0995469 100644 --- a/src/test/java/com/cuoco/factory/hibernate/RecipeHibernateModelFactory.java +++ b/src/test/java/com/cuoco/factory/hibernate/RecipeHibernateModelFactory.java @@ -1,6 +1,12 @@ package com.cuoco.factory.hibernate; +import com.cuoco.adapter.out.hibernate.model.AllergyHibernateModel; +import com.cuoco.adapter.out.hibernate.model.CookLevelHibernateModel; +import com.cuoco.adapter.out.hibernate.model.DietHibernateModel; +import com.cuoco.adapter.out.hibernate.model.DietaryNeedHibernateModel; import com.cuoco.adapter.out.hibernate.model.IngredientHibernateModel; +import com.cuoco.adapter.out.hibernate.model.MealTypeHibernateModel; +import com.cuoco.adapter.out.hibernate.model.PreparationTimeHibernateModel; import com.cuoco.adapter.out.hibernate.model.RecipeHibernateModel; import com.cuoco.adapter.out.hibernate.model.RecipeIngredientsHibernateModel; import com.cuoco.adapter.out.hibernate.model.RecipeStepsHibernateModel; @@ -13,34 +19,33 @@ public class RecipeHibernateModelFactory { public static RecipeHibernateModel create() { return RecipeHibernateModel.builder() .id(1L) - .name("Test Recipe") - .subtitle("Test Subtitle") - .description("Test Description") - .imageUrl("test-image.jpg") - .steps(List.of( - RecipeStepsHibernateModel.builder() - .id(1L) - .number(1) - .title("Step 1") - .description("Description 1") - .imageName("step1.jpg") - .build() - )) + .name("Recipe 1") + .description("description") .ingredients(List.of( RecipeIngredientsHibernateModel.builder() - .id(1L) .ingredient( IngredientHibernateModel.builder() .id(1L) - .name("Test Ingredient") - .unit(UnitHibernateModel.builder().id(1).description("Gramo").symbol("gr").build()) + .name("Harina") + .unit(UnitHibernateModel.builder().id(1).symbol("gr").build()) .build() ) - .quantity(1.0) - .optional(false) .build() - ) - ) + )) + .steps(List.of( + RecipeStepsHibernateModel.builder() + .id(2L) + .title("step 1") + .imageName("image1") + .description("description1") + .build() + )) + .preparationTime(PreparationTimeHibernateModel.builder().id(1).description("description").build()) + .diet(DietHibernateModel.builder().id(1).description("description").build()) + .cookLevel(CookLevelHibernateModel.builder().id(1).description("description").build()) + .dietaryNeeds(List.of(DietaryNeedHibernateModel.builder().id(1).description("description").build())) + .allergies(List.of(AllergyHibernateModel.builder().id(1).description("description").build())) + .mealTypes(List.of(MealTypeHibernateModel.builder().id(1).description("description").build())) .build(); } } \ No newline at end of file