diff --git a/src/integrationTest/java/app/mealsmadeeasy/api/recipe/RecipeControllerTests.java b/src/integrationTest/java/app/mealsmadeeasy/api/recipe/RecipeControllerTests.java index 65b794b..69dfa0e 100644 --- a/src/integrationTest/java/app/mealsmadeeasy/api/recipe/RecipeControllerTests.java +++ b/src/integrationTest/java/app/mealsmadeeasy/api/recipe/RecipeControllerTests.java @@ -46,6 +46,9 @@ public class RecipeControllerTests { final RecipeCreateSpec spec = new RecipeCreateSpec(); spec.setSlug(slug); spec.setTitle("Test Recipe"); + spec.setPreparationTime(10); + spec.setCookingTime(20); + spec.setTotalTime(30); spec.setRawText("# Hello, World!"); spec.setPublic(isPublic); return this.recipeService.create(owner, spec); @@ -63,8 +66,13 @@ public class RecipeControllerTests { this.mockMvc.perform(get("/recipes/{username}/{slug}", recipe.getOwner().getUsername(), recipe.getSlug())) .andExpect(status().isOk()) .andExpect(jsonPath("$.id").value(1)) + .andExpect(jsonPath("$.created").exists()) // TODO: better matching of exact LocalDateTime + .andExpect(jsonPath("$.modified").doesNotExist()) .andExpect(jsonPath("$.slug").value(recipe.getSlug())) .andExpect(jsonPath("$.title").value("Test Recipe")) + .andExpect(jsonPath("$.preparationTime").value(recipe.getPreparationTime())) + .andExpect(jsonPath("$.cookingTime").value(recipe.getCookingTime())) + .andExpect(jsonPath("$.totalTime").value(recipe.getTotalTime())) .andExpect(jsonPath("$.text").value("

Hello, World!

")) .andExpect(jsonPath("$.owner.id").value(owner.getId())) .andExpect(jsonPath("$.owner.username").value(owner.getUsername())) @@ -85,9 +93,13 @@ public class RecipeControllerTests { .andExpect(jsonPath("$.content").isArray()) .andExpect(jsonPath("$.content", hasSize(1))) .andExpect(jsonPath("$.content[0].id").value(recipe.getId())) - .andExpect(jsonPath("$.content[0].updated").exists()) + .andExpect(jsonPath("$.content[0].created").exists()) // TODO: better matching of exact LocalDateTime + .andExpect(jsonPath("$.content[0].modified").doesNotExist()) .andExpect(jsonPath("$.content[0].slug").value(recipe.getSlug())) .andExpect(jsonPath("$.content[0].title").value(recipe.getTitle())) + .andExpect(jsonPath("$.content[0].preparationTime").value(recipe.getPreparationTime())) + .andExpect(jsonPath("$.content[0].cookingTime").value(recipe.getCookingTime())) + .andExpect(jsonPath("$.content[0].totalTime").value(recipe.getTotalTime())) .andExpect(jsonPath("$.content[0].owner.id").value(owner.getId())) .andExpect(jsonPath("$.content[0].owner.username").value(owner.getUsername())) .andExpect(jsonPath("$.content[0].isPublic").value(true)) diff --git a/src/integrationTest/java/app/mealsmadeeasy/api/recipe/RecipeRepositoryTests.java b/src/integrationTest/java/app/mealsmadeeasy/api/recipe/RecipeRepositoryTests.java index 521841f..1f66155 100644 --- a/src/integrationTest/java/app/mealsmadeeasy/api/recipe/RecipeRepositoryTests.java +++ b/src/integrationTest/java/app/mealsmadeeasy/api/recipe/RecipeRepositoryTests.java @@ -7,6 +7,7 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.test.annotation.DirtiesContext; +import java.time.LocalDateTime; import java.util.HashSet; import java.util.List; import java.util.Set; @@ -42,6 +43,7 @@ public class RecipeRepositoryTests { @DirtiesContext public void findsAllPublicRecipes() { final RecipeEntity publicRecipe = new RecipeEntity(); + publicRecipe.setCreated(LocalDateTime.now()); publicRecipe.setSlug("public-recipe"); publicRecipe.setPublic(true); publicRecipe.setOwner(this.getOwnerUser()); @@ -57,6 +59,7 @@ public class RecipeRepositoryTests { @DirtiesContext public void doesNotFindNonPublicRecipe() { final RecipeEntity nonPublicRecipe = new RecipeEntity(); + nonPublicRecipe.setCreated(LocalDateTime.now()); nonPublicRecipe.setSlug("non-public-recipe"); nonPublicRecipe.setOwner(this.getOwnerUser()); nonPublicRecipe.setTitle("Non-Public Recipe"); @@ -71,6 +74,7 @@ public class RecipeRepositoryTests { @DirtiesContext public void findsAllForViewer() { final RecipeEntity recipe = new RecipeEntity(); + recipe.setCreated(LocalDateTime.now()); recipe.setSlug("test-recipe"); recipe.setOwner(this.getOwnerUser()); recipe.setTitle("Test Recipe"); @@ -92,6 +96,7 @@ public class RecipeRepositoryTests { @DirtiesContext public void doesNotIncludeNonViewable() { final RecipeEntity recipe = new RecipeEntity(); + recipe.setCreated(LocalDateTime.now()); recipe.setSlug("test-recipe"); recipe.setOwner(this.getOwnerUser()); recipe.setTitle("Test Recipe"); diff --git a/src/integrationTest/java/app/mealsmadeeasy/api/recipe/RecipeServiceTests.java b/src/integrationTest/java/app/mealsmadeeasy/api/recipe/RecipeServiceTests.java index 0351d67..9ec3f9c 100644 --- a/src/integrationTest/java/app/mealsmadeeasy/api/recipe/RecipeServiceTests.java +++ b/src/integrationTest/java/app/mealsmadeeasy/api/recipe/RecipeServiceTests.java @@ -27,6 +27,7 @@ import static org.junit.jupiter.api.Assertions.assertDoesNotThrow; import static org.junit.jupiter.api.Assertions.assertThrows; // TODO: test mainImage included +// TODO: test prep/cooking/total times included @SpringBootTest public class RecipeServiceTests { diff --git a/src/main/java/app/mealsmadeeasy/api/image/ImageController.java b/src/main/java/app/mealsmadeeasy/api/image/ImageController.java index 67a8d65..54f78ad 100644 --- a/src/main/java/app/mealsmadeeasy/api/image/ImageController.java +++ b/src/main/java/app/mealsmadeeasy/api/image/ImageController.java @@ -111,7 +111,7 @@ public class ImageController { image.getSize(), createSpec ); - return ResponseEntity.status(201).body(this.imageService.toImageView(saved)); + return ResponseEntity.status(201).body(this.imageService.toImageView(saved, principal)); } @PostMapping("/{username}/{filename}") @@ -127,7 +127,7 @@ public class ImageController { final User owner = this.userService.getUser(username); final Image image = this.imageService.getByOwnerAndFilename(owner, filename, principal); final Image updated = this.imageService.update(image, principal, this.getImageUpdateSpec(body)); - return ResponseEntity.ok(this.imageService.toImageView(updated)); + return ResponseEntity.ok(this.imageService.toImageView(updated, principal)); } @DeleteMapping("/{username}/{filename}") diff --git a/src/main/java/app/mealsmadeeasy/api/image/ImageService.java b/src/main/java/app/mealsmadeeasy/api/image/ImageService.java index 293465d..3f0b376 100644 --- a/src/main/java/app/mealsmadeeasy/api/image/ImageService.java +++ b/src/main/java/app/mealsmadeeasy/api/image/ImageService.java @@ -25,6 +25,6 @@ public interface ImageService { void deleteImage(Image image, User modifier) throws IOException; - ImageView toImageView(Image image); + ImageView toImageView(Image image, @Nullable User viewer); } diff --git a/src/main/java/app/mealsmadeeasy/api/image/S3ImageService.java b/src/main/java/app/mealsmadeeasy/api/image/S3ImageService.java index 7289d67..d1e2a64 100644 --- a/src/main/java/app/mealsmadeeasy/api/image/S3ImageService.java +++ b/src/main/java/app/mealsmadeeasy/api/image/S3ImageService.java @@ -6,7 +6,6 @@ import app.mealsmadeeasy.api.image.view.ImageView; import app.mealsmadeeasy.api.s3.S3Manager; import app.mealsmadeeasy.api.user.User; import app.mealsmadeeasy.api.user.UserEntity; -import app.mealsmadeeasy.api.user.view.UserInfoView; import org.jetbrains.annotations.Nullable; import org.springframework.beans.factory.annotation.Value; import org.springframework.security.access.prepost.PostAuthorize; @@ -21,7 +20,6 @@ import java.util.regex.Matcher; import java.util.regex.Pattern; @Service -/* TODO: update modified LocalDateTime when updating */ public class S3ImageService implements ImageService { private static final Pattern extensionPattern = Pattern.compile(".+\\.(.+)$"); @@ -186,34 +184,17 @@ public class S3ImageService implements ImageService { this.s3Manager.delete("images", imageEntity.getObjectName()); } + private String getImageUrl(Image image) { + return this.baseUrl + "/images/" + image.getOwner().getUsername() + "/" + image.getUserFilename(); + } + @Override - public ImageView toImageView(Image image) { - final ImageView imageView = new ImageView(); - imageView.setUrl(this.baseUrl + "/images/" + image.getOwner().getUsername() + "/" + image.getUserFilename()); - imageView.setCreated(image.getCreated()); - imageView.setModified(image.getModified()); - imageView.setFilename(image.getUserFilename()); - imageView.setMimeType(image.getMimeType()); - imageView.setAlt(image.getAlt()); - imageView.setCaption(image.getCaption()); - imageView.setIsPublic(image.isPublic()); - - final User owner = image.getOwner(); - final UserInfoView userInfoView = new UserInfoView(); - userInfoView.setId(owner.getId()); - userInfoView.setUsername(owner.getUsername()); - imageView.setOwner(userInfoView); - - final Set viewers = new HashSet<>(); - for (final User viewer : image.getViewers()) { - final UserInfoView viewerView = new UserInfoView(); - viewerView.setId(viewer.getId()); - viewerView.setUsername(viewer.getUsername()); - viewers.add(viewerView); + public ImageView toImageView(Image image, @Nullable User viewer) { + if (viewer != null && image.getOwner().getUsername().equals(viewer.getUsername())) { + return ImageView.from(image, this.getImageUrl(image), true); + } else { + return ImageView.from(image, this.getImageUrl(image), false); } - imageView.setViewers(viewers); - - return imageView; } } diff --git a/src/main/java/app/mealsmadeeasy/api/image/view/ImageView.java b/src/main/java/app/mealsmadeeasy/api/image/view/ImageView.java index d73a32b..949cfe9 100644 --- a/src/main/java/app/mealsmadeeasy/api/image/view/ImageView.java +++ b/src/main/java/app/mealsmadeeasy/api/image/view/ImageView.java @@ -1,14 +1,35 @@ package app.mealsmadeeasy.api.image.view; +import app.mealsmadeeasy.api.image.Image; import app.mealsmadeeasy.api.user.view.UserInfoView; import org.jetbrains.annotations.Nullable; import java.time.LocalDateTime; import java.util.Set; +import java.util.stream.Collectors; -// TODO: get rid of viewers, keep it only for owner view! public class ImageView { + public static ImageView from(Image image, String url, boolean includeViewers) { + final ImageView view = new ImageView(); + view.setUrl(url); + view.setCreated(image.getCreated()); + view.setModified(image.getModified()); + view.setFilename(image.getUserFilename()); + view.setMimeType(image.getMimeType()); + view.setAlt(image.getAlt()); + view.setCaption(image.getCaption()); + view.setOwner(UserInfoView.from(image.getOwner())); + view.setIsPublic(image.isPublic()); + if (includeViewers) { + view.setViewers(image.getViewers().stream() + .map(UserInfoView::from) + .collect(Collectors.toSet()) + ); + } + return view; + } + private String url; private LocalDateTime created; private @Nullable LocalDateTime modified; @@ -18,7 +39,7 @@ public class ImageView { private @Nullable String caption; private UserInfoView owner; private boolean isPublic; - private Set viewers; + private @Nullable Set viewers; public String getUrl() { return this.url; @@ -60,19 +81,19 @@ public class ImageView { this.mimeType = mimeType; } - public String getAlt() { + public @Nullable String getAlt() { return this.alt; } - public void setAlt(String alt) { + public void setAlt(@Nullable String alt) { this.alt = alt; } - public String getCaption() { + public @Nullable String getCaption() { return this.caption; } - public void setCaption(String caption) { + public void setCaption(@Nullable String caption) { this.caption = caption; } @@ -92,11 +113,11 @@ public class ImageView { this.isPublic = isPublic; } - public Set getViewers() { + public @Nullable Set getViewers() { return this.viewers; } - public void setViewers(Set viewers) { + public void setViewers(@Nullable Set viewers) { this.viewers = viewers; } diff --git a/src/main/java/app/mealsmadeeasy/api/recipe/Recipe.java b/src/main/java/app/mealsmadeeasy/api/recipe/Recipe.java index 9dca31f..11b6d02 100644 --- a/src/main/java/app/mealsmadeeasy/api/recipe/Recipe.java +++ b/src/main/java/app/mealsmadeeasy/api/recipe/Recipe.java @@ -15,6 +15,9 @@ public interface Recipe { @Nullable LocalDateTime getModified(); String getSlug(); String getTitle(); + @Nullable Integer getPreparationTime(); + @Nullable Integer getCookingTime(); + @Nullable Integer getTotalTime(); String getRawText(); User getOwner(); Set getStars(); diff --git a/src/main/java/app/mealsmadeeasy/api/recipe/RecipeEntity.java b/src/main/java/app/mealsmadeeasy/api/recipe/RecipeEntity.java index 10c8cb5..f69c1fa 100644 --- a/src/main/java/app/mealsmadeeasy/api/recipe/RecipeEntity.java +++ b/src/main/java/app/mealsmadeeasy/api/recipe/RecipeEntity.java @@ -23,7 +23,7 @@ public final class RecipeEntity implements Recipe { private Long id; @Column(nullable = false) - private LocalDateTime created = LocalDateTime.now(); + private LocalDateTime created; private LocalDateTime modified; @@ -33,6 +33,15 @@ public final class RecipeEntity implements Recipe { @Column(nullable = false) private String title; + @Nullable + private Integer preparationTime; + + @Nullable + private Integer cookingTime; + + @Nullable + private Integer totalTime; + @Lob @Column(name = "raw_text", columnDefinition = "TEXT", nullable = false) @Basic(fetch = FetchType.LAZY) @@ -108,6 +117,33 @@ public final class RecipeEntity implements Recipe { this.title = title; } + @Override + public @Nullable Integer getPreparationTime() { + return this.preparationTime; + } + + public void setPreparationTime(@Nullable Integer preparationTime) { + this.preparationTime = preparationTime; + } + + @Override + public @Nullable Integer getCookingTime() { + return this.cookingTime; + } + + public void setCookingTime(@Nullable Integer cookingTime) { + this.cookingTime = cookingTime; + } + + @Override + public @Nullable Integer getTotalTime() { + return this.totalTime; + } + + public void setTotalTime(@Nullable Integer totalTime) { + this.totalTime = totalTime; + } + @Override public String getRawText() { return this.rawText; diff --git a/src/main/java/app/mealsmadeeasy/api/recipe/RecipeServiceImpl.java b/src/main/java/app/mealsmadeeasy/api/recipe/RecipeServiceImpl.java index 4967dde..bd16fbb 100644 --- a/src/main/java/app/mealsmadeeasy/api/recipe/RecipeServiceImpl.java +++ b/src/main/java/app/mealsmadeeasy/api/recipe/RecipeServiceImpl.java @@ -1,16 +1,18 @@ package app.mealsmadeeasy.api.recipe; +import app.mealsmadeeasy.api.image.Image; import app.mealsmadeeasy.api.image.ImageService; import app.mealsmadeeasy.api.image.S3ImageEntity; +import app.mealsmadeeasy.api.image.view.ImageView; import app.mealsmadeeasy.api.recipe.spec.RecipeCreateSpec; import app.mealsmadeeasy.api.recipe.spec.RecipeUpdateSpec; import app.mealsmadeeasy.api.recipe.view.FullRecipeView; import app.mealsmadeeasy.api.recipe.view.RecipeInfoView; import app.mealsmadeeasy.api.user.User; import app.mealsmadeeasy.api.user.UserEntity; -import app.mealsmadeeasy.api.user.view.UserInfoView; import org.commonmark.parser.Parser; import org.commonmark.renderer.html.HtmlRenderer; +import org.jetbrains.annotations.Contract; import org.jetbrains.annotations.Nullable; import org.jsoup.Jsoup; import org.jsoup.safety.Safelist; @@ -99,22 +101,31 @@ public class RecipeServiceImpl implements RecipeService { return this.recipeRepository.getViewerCount(recipeId); } - private FullRecipeView getFullView(RecipeEntity recipe) { - final FullRecipeView view = new FullRecipeView(); - view.setId(recipe.getId()); - view.setCreated(recipe.getCreated()); - view.setModified(recipe.getModified()); - view.setSlug(recipe.getSlug()); - view.setTitle(recipe.getTitle()); - view.setText(this.getRenderedMarkdown(recipe)); - view.setOwner(UserInfoView.from(recipe.getOwner())); - view.setStarCount(this.getStarCount(recipe)); - view.setViewerCount(this.getViewerCount(recipe.getId())); - if (recipe.getMainImage() != null) { - view.setMainImage(this.imageService.toImageView(recipe.getMainImage())); + @Contract("null, _ -> null") + private @Nullable ImageView getImageView(@Nullable Image image, @Nullable User viewer) { + if (image != null) { + return this.imageService.toImageView(image, viewer); + } else { + return null; } - view.setIsPublic(recipe.isPublic()); - return view; + } + + private FullRecipeView getFullView(RecipeEntity recipe, @Nullable User viewer) { + return FullRecipeView.from( + recipe, + this.getRenderedMarkdown(recipe), + this.getStarCount(recipe), + this.getViewerCount(recipe.getId()), + this.getImageView(recipe.getMainImage(), viewer) + ); + } + + private RecipeInfoView getInfoView(RecipeEntity recipe, @Nullable User viewer) { + return RecipeInfoView.from( + recipe, + this.getStarCount(recipe), + this.getImageView(recipe.getMainImage(), viewer) + ); } @Override @@ -123,7 +134,7 @@ public class RecipeServiceImpl implements RecipeService { final RecipeEntity recipe = this.recipeRepository.findById(id).orElseThrow(() -> new RecipeException( RecipeException.Type.INVALID_ID, "No such Recipe for id: " + id )); - return this.getFullView(recipe); + return this.getFullView(recipe, viewer); } @Override @@ -134,29 +145,14 @@ public class RecipeServiceImpl implements RecipeService { RecipeException.Type.INVALID_USERNAME_OR_SLUG, "No such Recipe for username " + username + " and slug: " + slug )); - return this.getFullView(recipe); + return this.getFullView(recipe, viewer); } @Override public Slice getInfoViewsViewableBy(Pageable pageable, @Nullable User viewer) { - return this.recipeRepository.findAllViewableBy((UserEntity) viewer, pageable).map(entity -> { - final RecipeInfoView view = new RecipeInfoView(); - view.setId(entity.getId()); - if (entity.getModified() != null) { - view.setUpdated(entity.getModified()); - } else { - view.setUpdated(entity.getCreated()); - } - view.setSlug(entity.getSlug()); - view.setTitle(entity.getTitle()); - view.setOwner(UserInfoView.from(entity.getOwner())); - view.setIsPublic(entity.isPublic()); - view.setStarCount(this.getStarCount(entity)); - if (entity.getMainImage() != null) { - view.setMainImage(this.imageService.toImageView(entity.getMainImage())); - } - return view; - }); + return this.recipeRepository.findAllViewableBy((UserEntity) viewer, pageable).map(recipe -> + this.getInfoView(recipe, viewer) + ); } @Override @@ -194,6 +190,18 @@ public class RecipeServiceImpl implements RecipeService { entity.setTitle(spec.getTitle()); didModify = true; } + if (spec.getPreparationTime() != null) { + entity.setPreparationTime(spec.getPreparationTime()); + didModify = true; + } + if (spec.getCookingTime() != null) { + entity.setCookingTime(spec.getCookingTime()); + didModify = true; + } + if (spec.getTotalTime() != null) { + entity.setTotalTime(spec.getTotalTime()); + didModify = true; + } if (spec.getRawText() != null) { entity.setRawText(spec.getRawText()); didModify = true; diff --git a/src/main/java/app/mealsmadeeasy/api/recipe/spec/RecipeCreateSpec.java b/src/main/java/app/mealsmadeeasy/api/recipe/spec/RecipeCreateSpec.java index f45b9f8..2bfb136 100644 --- a/src/main/java/app/mealsmadeeasy/api/recipe/spec/RecipeCreateSpec.java +++ b/src/main/java/app/mealsmadeeasy/api/recipe/spec/RecipeCreateSpec.java @@ -7,6 +7,9 @@ public class RecipeCreateSpec { private String slug; private String title; + private @Nullable Integer preparationTime; + private @Nullable Integer cookingTime; + private @Nullable Integer totalTime; private String rawText; private boolean isPublic; private @Nullable Image mainImage; @@ -27,6 +30,30 @@ public class RecipeCreateSpec { this.title = title; } + public @Nullable Integer getPreparationTime() { + return this.preparationTime; + } + + public void setPreparationTime(@Nullable Integer preparationTime) { + this.preparationTime = preparationTime; + } + + public @Nullable Integer getCookingTime() { + return this.cookingTime; + } + + public void setCookingTime(@Nullable Integer cookingTime) { + this.cookingTime = cookingTime; + } + + public @Nullable Integer getTotalTime() { + return this.totalTime; + } + + public void setTotalTime(@Nullable Integer totalTime) { + this.totalTime = totalTime; + } + public String getRawText() { return this.rawText; } diff --git a/src/main/java/app/mealsmadeeasy/api/recipe/spec/RecipeUpdateSpec.java b/src/main/java/app/mealsmadeeasy/api/recipe/spec/RecipeUpdateSpec.java index fcdb8e6..0c9eb44 100644 --- a/src/main/java/app/mealsmadeeasy/api/recipe/spec/RecipeUpdateSpec.java +++ b/src/main/java/app/mealsmadeeasy/api/recipe/spec/RecipeUpdateSpec.java @@ -7,6 +7,9 @@ public class RecipeUpdateSpec { private @Nullable String slug; private @Nullable String title; + private @Nullable Integer preparationTime; + private @Nullable Integer cookingTime; + private @Nullable Integer totalTime; private @Nullable String rawText; private @Nullable Boolean isPublic; private @Nullable Image mainImage; @@ -27,6 +30,30 @@ public class RecipeUpdateSpec { this.title = title; } + public @Nullable Integer getPreparationTime() { + return this.preparationTime; + } + + public void setPreparationTime(@Nullable Integer preparationTime) { + this.preparationTime = preparationTime; + } + + public @Nullable Integer getCookingTime() { + return this.cookingTime; + } + + public void setCookingTime(@Nullable Integer cookingTime) { + this.cookingTime = cookingTime; + } + + public @Nullable Integer getTotalTime() { + return this.totalTime; + } + + public void setTotalTime(@Nullable Integer totalTime) { + this.totalTime = totalTime; + } + public @Nullable String getRawText() { return this.rawText; } diff --git a/src/main/java/app/mealsmadeeasy/api/recipe/view/FullRecipeView.java b/src/main/java/app/mealsmadeeasy/api/recipe/view/FullRecipeView.java index 6405b7d..c64278f 100644 --- a/src/main/java/app/mealsmadeeasy/api/recipe/view/FullRecipeView.java +++ b/src/main/java/app/mealsmadeeasy/api/recipe/view/FullRecipeView.java @@ -1,6 +1,7 @@ package app.mealsmadeeasy.api.recipe.view; import app.mealsmadeeasy.api.image.view.ImageView; +import app.mealsmadeeasy.api.recipe.Recipe; import app.mealsmadeeasy.api.user.view.UserInfoView; import org.jetbrains.annotations.Nullable; @@ -8,11 +9,39 @@ import java.time.LocalDateTime; public class FullRecipeView { + public static FullRecipeView from( + Recipe recipe, + String renderedText, + int starCount, + int viewerCount, + ImageView mainImage + ) { + final FullRecipeView view = new FullRecipeView(); + view.setId(recipe.getId()); + view.setCreated(recipe.getCreated()); + view.setModified(recipe.getModified()); + view.setSlug(recipe.getSlug()); + view.setTitle(recipe.getTitle()); + view.setPreparationTime(recipe.getPreparationTime()); + view.setCookingTime(recipe.getCookingTime()); + view.setTotalTime(recipe.getTotalTime()); + view.setText(renderedText); + view.setOwner(UserInfoView.from(recipe.getOwner())); + view.setStarCount(starCount); + view.setViewerCount(viewerCount); + view.setMainImage(mainImage); + view.setIsPublic(recipe.isPublic()); + return view; + } + private long id; private LocalDateTime created; private @Nullable LocalDateTime modified; private String slug; private String title; + private @Nullable Integer preparationTime; + private @Nullable Integer cookingTime; + private @Nullable Integer totalTime; private String text; private UserInfoView owner; private int starCount; @@ -60,6 +89,30 @@ public class FullRecipeView { this.title = title; } + public @Nullable Integer getPreparationTime() { + return this.preparationTime; + } + + public void setPreparationTime(@Nullable Integer preparationTime) { + this.preparationTime = preparationTime; + } + + public @Nullable Integer getCookingTime() { + return this.cookingTime; + } + + public void setCookingTime(@Nullable Integer cookingTime) { + this.cookingTime = cookingTime; + } + + public @Nullable Integer getTotalTime() { + return this.totalTime; + } + + public void setTotalTime(@Nullable Integer totalTime) { + this.totalTime = totalTime; + } + public @Nullable String getText() { return this.text; } diff --git a/src/main/java/app/mealsmadeeasy/api/recipe/view/RecipeInfoView.java b/src/main/java/app/mealsmadeeasy/api/recipe/view/RecipeInfoView.java index 9adf458..e39bf33 100644 --- a/src/main/java/app/mealsmadeeasy/api/recipe/view/RecipeInfoView.java +++ b/src/main/java/app/mealsmadeeasy/api/recipe/view/RecipeInfoView.java @@ -1,6 +1,7 @@ package app.mealsmadeeasy.api.recipe.view; import app.mealsmadeeasy.api.image.view.ImageView; +import app.mealsmadeeasy.api.recipe.Recipe; import app.mealsmadeeasy.api.user.view.UserInfoView; import org.jetbrains.annotations.Nullable; @@ -8,10 +9,31 @@ import java.time.LocalDateTime; public final class RecipeInfoView { + public static RecipeInfoView from(Recipe recipe, int starCount, @Nullable ImageView mainImage) { + final RecipeInfoView view = new RecipeInfoView(); + view.setId(recipe.getId()); + view.setCreated(recipe.getCreated()); + view.setModified(recipe.getModified()); + view.setSlug(recipe.getSlug()); + view.setTitle(recipe.getTitle()); + view.setPreparationTime(recipe.getPreparationTime()); + view.setCookingTime(recipe.getCookingTime()); + view.setTotalTime(recipe.getTotalTime()); + view.setOwner(UserInfoView.from(recipe.getOwner())); + view.setIsPublic(recipe.isPublic()); + view.setStarCount(starCount); + view.setMainImage(mainImage); + return view; + } + private long id; - private LocalDateTime updated; + private LocalDateTime created; + private LocalDateTime modified; private String slug; private String title; + private @Nullable Integer preparationTime; + private @Nullable Integer cookingTime; + private @Nullable Integer totalTime; private UserInfoView owner; private boolean isPublic; private int starCount; @@ -25,12 +47,20 @@ public final class RecipeInfoView { this.id = id; } - public LocalDateTime getUpdated() { - return this.updated; + public LocalDateTime getCreated() { + return this.created; } - public void setUpdated(LocalDateTime updated) { - this.updated = updated; + public void setCreated(LocalDateTime created) { + this.created = created; + } + + public LocalDateTime getModified() { + return this.modified; + } + + public void setModified(LocalDateTime modified) { + this.modified = modified; } public String getSlug() { @@ -49,6 +79,30 @@ public final class RecipeInfoView { this.title = title; } + public @Nullable Integer getPreparationTime() { + return this.preparationTime; + } + + public void setPreparationTime(@Nullable Integer preparationTime) { + this.preparationTime = preparationTime; + } + + public @Nullable Integer getCookingTime() { + return this.cookingTime; + } + + public void setCookingTime(@Nullable Integer cookingTime) { + this.cookingTime = cookingTime; + } + + public @Nullable Integer getTotalTime() { + return this.totalTime; + } + + public void setTotalTime(@Nullable Integer totalTime) { + this.totalTime = totalTime; + } + public UserInfoView getOwner() { return this.owner; }