From 3d7d5d00f10a5cd9a7b5608d11818f82d1192b9f Mon Sep 17 00:00:00 2001 From: Jesse Brault Date: Mon, 29 Jul 2024 17:09:03 -0500 Subject: [PATCH] Added url to ImageView and related. --- .../api/image/ImageController.java | 4 +- .../mealsmadeeasy/api/image/ImageService.java | 3 ++ .../mealsmadeeasy/api/image/ImageUtil.java | 42 ------------------- .../api/image/S3ImageService.java | 37 +++++++++++++++- .../api/image/view/ImageView.java | 9 ++++ .../api/recipe/RecipeServiceImpl.java | 11 +++-- src/main/resources/application.properties | 1 + 7 files changed, 58 insertions(+), 49 deletions(-) delete mode 100644 src/main/java/app/mealsmadeeasy/api/image/ImageUtil.java diff --git a/src/main/java/app/mealsmadeeasy/api/image/ImageController.java b/src/main/java/app/mealsmadeeasy/api/image/ImageController.java index a346d59..67a8d65 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(ImageUtil.toImageView(saved)); + return ResponseEntity.status(201).body(this.imageService.toImageView(saved)); } @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(ImageUtil.toImageView(updated)); + return ResponseEntity.ok(this.imageService.toImageView(updated)); } @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 c61c536..293465d 100644 --- a/src/main/java/app/mealsmadeeasy/api/image/ImageService.java +++ b/src/main/java/app/mealsmadeeasy/api/image/ImageService.java @@ -2,6 +2,7 @@ package app.mealsmadeeasy.api.image; import app.mealsmadeeasy.api.image.spec.ImageCreateInfoSpec; import app.mealsmadeeasy.api.image.spec.ImageUpdateInfoSpec; +import app.mealsmadeeasy.api.image.view.ImageView; import app.mealsmadeeasy.api.user.User; import org.jetbrains.annotations.Nullable; @@ -24,4 +25,6 @@ public interface ImageService { void deleteImage(Image image, User modifier) throws IOException; + ImageView toImageView(Image image); + } diff --git a/src/main/java/app/mealsmadeeasy/api/image/ImageUtil.java b/src/main/java/app/mealsmadeeasy/api/image/ImageUtil.java deleted file mode 100644 index 9ae6785..0000000 --- a/src/main/java/app/mealsmadeeasy/api/image/ImageUtil.java +++ /dev/null @@ -1,42 +0,0 @@ -package app.mealsmadeeasy.api.image; - -import app.mealsmadeeasy.api.image.view.ImageView; -import app.mealsmadeeasy.api.user.User; -import app.mealsmadeeasy.api.user.view.UserInfoView; - -import java.util.HashSet; -import java.util.Set; - -public final class ImageUtil { - - public static ImageView toImageView(Image image) { - final ImageView imageView = new ImageView(); - 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); - } - imageView.setViewers(viewers); - - return imageView; - } - - private ImageUtil() {} - -} diff --git a/src/main/java/app/mealsmadeeasy/api/image/S3ImageService.java b/src/main/java/app/mealsmadeeasy/api/image/S3ImageService.java index e5c69ec..70b19db 100644 --- a/src/main/java/app/mealsmadeeasy/api/image/S3ImageService.java +++ b/src/main/java/app/mealsmadeeasy/api/image/S3ImageService.java @@ -2,9 +2,11 @@ package app.mealsmadeeasy.api.image; import app.mealsmadeeasy.api.image.spec.ImageCreateInfoSpec; import app.mealsmadeeasy.api.image.spec.ImageUpdateInfoSpec; +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; @@ -27,15 +29,18 @@ public class S3ImageService implements ImageService { private final S3Manager s3Manager; private final S3ImageRepository imageRepository; private final String imageBucketName; + private final String baseUrl; public S3ImageService( S3Manager s3Manager, S3ImageRepository imageRepository, - @Value("${app.mealsmadeeasy.api.images.bucketName}") String imageBucketName + @Value("${app.mealsmadeeasy.api.images.bucketName}") String imageBucketName, + @Value("${app.mealsmadeeasy.api.baseUrl}") String baseUrl ) { this.s3Manager = s3Manager; this.imageRepository = imageRepository; this.imageBucketName = imageBucketName; + this.baseUrl = baseUrl; } private String getMimeType(String userFilename) { @@ -179,4 +184,34 @@ public class S3ImageService implements ImageService { this.s3Manager.delete("images", imageEntity.getObjectName()); } + @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); + } + 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 2c8dd10..ca71157 100644 --- a/src/main/java/app/mealsmadeeasy/api/image/view/ImageView.java +++ b/src/main/java/app/mealsmadeeasy/api/image/view/ImageView.java @@ -8,6 +8,7 @@ import java.util.Set; public class ImageView { + private String url; private LocalDateTime created; private @Nullable LocalDateTime modified; private String filename; @@ -18,6 +19,14 @@ public class ImageView { private boolean isPublic; private Set viewers; + public String getUrl() { + return this.url; + } + + public void setUrl(String url) { + this.url = url; + } + public LocalDateTime getCreated() { return this.created; } diff --git a/src/main/java/app/mealsmadeeasy/api/recipe/RecipeServiceImpl.java b/src/main/java/app/mealsmadeeasy/api/recipe/RecipeServiceImpl.java index 1b07b62..3fc00ad 100644 --- a/src/main/java/app/mealsmadeeasy/api/recipe/RecipeServiceImpl.java +++ b/src/main/java/app/mealsmadeeasy/api/recipe/RecipeServiceImpl.java @@ -1,6 +1,6 @@ package app.mealsmadeeasy.api.recipe; -import app.mealsmadeeasy.api.image.ImageUtil; +import app.mealsmadeeasy.api.image.ImageService; import app.mealsmadeeasy.api.image.S3ImageEntity; import app.mealsmadeeasy.api.recipe.spec.RecipeCreateSpec; import app.mealsmadeeasy.api.recipe.spec.RecipeUpdateSpec; @@ -37,9 +37,12 @@ public class RecipeServiceImpl implements RecipeService { } private final RecipeRepository recipeRepository; + private final ImageService imageService; - public RecipeServiceImpl(RecipeRepository recipeRepository) { + + public RecipeServiceImpl(RecipeRepository recipeRepository, ImageService imageService) { this.recipeRepository = recipeRepository; + this.imageService = imageService; } @Override @@ -110,7 +113,7 @@ public class RecipeServiceImpl implements RecipeService { view.setOwnerUsername(recipe.getOwner().getUsername()); view.setStarCount(this.getStarCount(recipe)); view.setViewerCount(this.getViewerCount(recipe.getId())); - view.setMainImage(ImageUtil.toImageView(recipe.getMainImage())); + view.setMainImage(this.imageService.toImageView(recipe.getMainImage())); return view; } @@ -129,7 +132,7 @@ public class RecipeServiceImpl implements RecipeService { view.setOwnerUsername(entity.getOwner().getUsername()); view.setPublic(entity.isPublic()); view.setStarCount(this.getStarCount(entity)); - view.setMainImage(ImageUtil.toImageView(entity.getMainImage())); + view.setMainImage(this.imageService.toImageView(entity.getMainImage())); return view; }); } diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties index a2316b6..d795ca2 100644 --- a/src/main/resources/application.properties +++ b/src/main/resources/application.properties @@ -4,6 +4,7 @@ spring.datasource.url=jdbc:mysql://localhost:55001/meals_made_easy_api spring.datasource.username=meals-made-easy-api-user spring.datasource.password=devpass spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver +app.mealsmadeeasy.api.baseUrl=http://localhost:8080 app.mealsmadeeasy.api.security.access-token-lifetime=60 app.mealsmadeeasy.api.security.refresh-token-lifetime=120 app.mealsmadeeasy.api.minio.endpoint=http://localhost:9000