Added url to ImageView and related.

This commit is contained in:
Jesse Brault 2024-07-29 17:09:03 -05:00
parent 67b5452d82
commit 3d7d5d00f1
7 changed files with 58 additions and 49 deletions

View File

@ -111,7 +111,7 @@ public class ImageController {
image.getSize(), image.getSize(),
createSpec createSpec
); );
return ResponseEntity.status(201).body(ImageUtil.toImageView(saved)); return ResponseEntity.status(201).body(this.imageService.toImageView(saved));
} }
@PostMapping("/{username}/{filename}") @PostMapping("/{username}/{filename}")
@ -127,7 +127,7 @@ public class ImageController {
final User owner = this.userService.getUser(username); final User owner = this.userService.getUser(username);
final Image image = this.imageService.getByOwnerAndFilename(owner, filename, principal); final Image image = this.imageService.getByOwnerAndFilename(owner, filename, principal);
final Image updated = this.imageService.update(image, principal, this.getImageUpdateSpec(body)); 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}") @DeleteMapping("/{username}/{filename}")

View File

@ -2,6 +2,7 @@ package app.mealsmadeeasy.api.image;
import app.mealsmadeeasy.api.image.spec.ImageCreateInfoSpec; import app.mealsmadeeasy.api.image.spec.ImageCreateInfoSpec;
import app.mealsmadeeasy.api.image.spec.ImageUpdateInfoSpec; import app.mealsmadeeasy.api.image.spec.ImageUpdateInfoSpec;
import app.mealsmadeeasy.api.image.view.ImageView;
import app.mealsmadeeasy.api.user.User; import app.mealsmadeeasy.api.user.User;
import org.jetbrains.annotations.Nullable; import org.jetbrains.annotations.Nullable;
@ -24,4 +25,6 @@ public interface ImageService {
void deleteImage(Image image, User modifier) throws IOException; void deleteImage(Image image, User modifier) throws IOException;
ImageView toImageView(Image image);
} }

View File

@ -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<UserInfoView> 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() {}
}

View File

@ -2,9 +2,11 @@ package app.mealsmadeeasy.api.image;
import app.mealsmadeeasy.api.image.spec.ImageCreateInfoSpec; import app.mealsmadeeasy.api.image.spec.ImageCreateInfoSpec;
import app.mealsmadeeasy.api.image.spec.ImageUpdateInfoSpec; import app.mealsmadeeasy.api.image.spec.ImageUpdateInfoSpec;
import app.mealsmadeeasy.api.image.view.ImageView;
import app.mealsmadeeasy.api.s3.S3Manager; import app.mealsmadeeasy.api.s3.S3Manager;
import app.mealsmadeeasy.api.user.User; import app.mealsmadeeasy.api.user.User;
import app.mealsmadeeasy.api.user.UserEntity; import app.mealsmadeeasy.api.user.UserEntity;
import app.mealsmadeeasy.api.user.view.UserInfoView;
import org.jetbrains.annotations.Nullable; import org.jetbrains.annotations.Nullable;
import org.springframework.beans.factory.annotation.Value; import org.springframework.beans.factory.annotation.Value;
import org.springframework.security.access.prepost.PostAuthorize; import org.springframework.security.access.prepost.PostAuthorize;
@ -27,15 +29,18 @@ public class S3ImageService implements ImageService {
private final S3Manager s3Manager; private final S3Manager s3Manager;
private final S3ImageRepository imageRepository; private final S3ImageRepository imageRepository;
private final String imageBucketName; private final String imageBucketName;
private final String baseUrl;
public S3ImageService( public S3ImageService(
S3Manager s3Manager, S3Manager s3Manager,
S3ImageRepository imageRepository, 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.s3Manager = s3Manager;
this.imageRepository = imageRepository; this.imageRepository = imageRepository;
this.imageBucketName = imageBucketName; this.imageBucketName = imageBucketName;
this.baseUrl = baseUrl;
} }
private String getMimeType(String userFilename) { private String getMimeType(String userFilename) {
@ -179,4 +184,34 @@ public class S3ImageService implements ImageService {
this.s3Manager.delete("images", imageEntity.getObjectName()); 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<UserInfoView> 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;
}
} }

View File

@ -8,6 +8,7 @@ import java.util.Set;
public class ImageView { public class ImageView {
private String url;
private LocalDateTime created; private LocalDateTime created;
private @Nullable LocalDateTime modified; private @Nullable LocalDateTime modified;
private String filename; private String filename;
@ -18,6 +19,14 @@ public class ImageView {
private boolean isPublic; private boolean isPublic;
private Set<UserInfoView> viewers; private Set<UserInfoView> viewers;
public String getUrl() {
return this.url;
}
public void setUrl(String url) {
this.url = url;
}
public LocalDateTime getCreated() { public LocalDateTime getCreated() {
return this.created; return this.created;
} }

View File

@ -1,6 +1,6 @@
package app.mealsmadeeasy.api.recipe; 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.image.S3ImageEntity;
import app.mealsmadeeasy.api.recipe.spec.RecipeCreateSpec; import app.mealsmadeeasy.api.recipe.spec.RecipeCreateSpec;
import app.mealsmadeeasy.api.recipe.spec.RecipeUpdateSpec; import app.mealsmadeeasy.api.recipe.spec.RecipeUpdateSpec;
@ -37,9 +37,12 @@ public class RecipeServiceImpl implements RecipeService {
} }
private final RecipeRepository recipeRepository; private final RecipeRepository recipeRepository;
private final ImageService imageService;
public RecipeServiceImpl(RecipeRepository recipeRepository) {
public RecipeServiceImpl(RecipeRepository recipeRepository, ImageService imageService) {
this.recipeRepository = recipeRepository; this.recipeRepository = recipeRepository;
this.imageService = imageService;
} }
@Override @Override
@ -110,7 +113,7 @@ public class RecipeServiceImpl implements RecipeService {
view.setOwnerUsername(recipe.getOwner().getUsername()); view.setOwnerUsername(recipe.getOwner().getUsername());
view.setStarCount(this.getStarCount(recipe)); view.setStarCount(this.getStarCount(recipe));
view.setViewerCount(this.getViewerCount(recipe.getId())); view.setViewerCount(this.getViewerCount(recipe.getId()));
view.setMainImage(ImageUtil.toImageView(recipe.getMainImage())); view.setMainImage(this.imageService.toImageView(recipe.getMainImage()));
return view; return view;
} }
@ -129,7 +132,7 @@ public class RecipeServiceImpl implements RecipeService {
view.setOwnerUsername(entity.getOwner().getUsername()); view.setOwnerUsername(entity.getOwner().getUsername());
view.setPublic(entity.isPublic()); view.setPublic(entity.isPublic());
view.setStarCount(this.getStarCount(entity)); view.setStarCount(this.getStarCount(entity));
view.setMainImage(ImageUtil.toImageView(entity.getMainImage())); view.setMainImage(this.imageService.toImageView(entity.getMainImage()));
return view; return view;
}); });
} }

View File

@ -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.username=meals-made-easy-api-user
spring.datasource.password=devpass spring.datasource.password=devpass
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver 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.access-token-lifetime=60
app.mealsmadeeasy.api.security.refresh-token-lifetime=120 app.mealsmadeeasy.api.security.refresh-token-lifetime=120
app.mealsmadeeasy.api.minio.endpoint=http://localhost:9000 app.mealsmadeeasy.api.minio.endpoint=http://localhost:9000