From 903a200dcf8ff388019f2c9b4732d3169593d901 Mon Sep 17 00:00:00 2001 From: Tim <47184194+imgde@users.noreply.github.com> Date: Thu, 8 May 2025 14:46:30 +0200 Subject: [PATCH] Add ImageController, merge ArticleModelFactory into ArticleService --- .../webshop/config/ControllerPathConfig.java | 2 +- .../webshop/config/ParameterConfig.java | 8 +-- .../webshop/controller/ArticleController.java | 9 +-- .../webshop/controller/ImageController.java | 70 +++++++++++++++++++ .../de/htwsaar/webshop/model/ImageModel.java | 13 ++++ .../webshop/repository/ImageRepository.java | 2 +- .../webshop/service/ArticleModelFactory.java | 11 --- .../webshop/service/ArticleService.java | 12 ++++ .../htwsaar/webshop/service/ImageService.java | 18 ++++- .../service/impl/ArticleModelFactoryImpl.java | 48 ------------- .../service/impl/ArticleServiceImpl.java | 45 +++++++++++- .../service/impl/ImageServiceImpl.java | 27 +++++-- 12 files changed, 183 insertions(+), 82 deletions(-) create mode 100644 00-backend/src/main/java/de/htwsaar/webshop/controller/ImageController.java create mode 100644 00-backend/src/main/java/de/htwsaar/webshop/model/ImageModel.java delete mode 100644 00-backend/src/main/java/de/htwsaar/webshop/service/ArticleModelFactory.java delete mode 100644 00-backend/src/main/java/de/htwsaar/webshop/service/impl/ArticleModelFactoryImpl.java diff --git a/00-backend/src/main/java/de/htwsaar/webshop/config/ControllerPathConfig.java b/00-backend/src/main/java/de/htwsaar/webshop/config/ControllerPathConfig.java index fb4b36b..9fd86de 100644 --- a/00-backend/src/main/java/de/htwsaar/webshop/config/ControllerPathConfig.java +++ b/00-backend/src/main/java/de/htwsaar/webshop/config/ControllerPathConfig.java @@ -13,6 +13,6 @@ public class ControllerPathConfig { public static final String ARTICLE_GET_ALL = ARTICLE_BASE + "/all"; //ImageController - private static final String IMAGE_BASE = "/image"; + public static final String IMAGE_BASE = "/image"; public static final String IMAGE_GET_ALL = IMAGE_BASE + "/all"; } \ No newline at end of file diff --git a/00-backend/src/main/java/de/htwsaar/webshop/config/ParameterConfig.java b/00-backend/src/main/java/de/htwsaar/webshop/config/ParameterConfig.java index e77423e..62836f3 100644 --- a/00-backend/src/main/java/de/htwsaar/webshop/config/ParameterConfig.java +++ b/00-backend/src/main/java/de/htwsaar/webshop/config/ParameterConfig.java @@ -5,11 +5,7 @@ public class ParameterConfig { public static final String PARAM_ID = "id"; public static final String PARAM_UUID = "uuid"; - public static final String PARAM_NAME = "name"; - public static final String PARAM_DESCRIPTION = "description"; - public static final String PARAM_PRICE = "price"; - public static final String PARAM_DISCOUNT = "discount"; - public static final String PARAM_CATEGORY = "category"; - public static final String PARAM_STOCK = "stock"; + public static final String PARAM_ARTICLE_ID = "articleId"; + public static final String PARAM_IMAGE_ID = "imageId"; } diff --git a/00-backend/src/main/java/de/htwsaar/webshop/controller/ArticleController.java b/00-backend/src/main/java/de/htwsaar/webshop/controller/ArticleController.java index 108cbf5..e4b9150 100644 --- a/00-backend/src/main/java/de/htwsaar/webshop/controller/ArticleController.java +++ b/00-backend/src/main/java/de/htwsaar/webshop/controller/ArticleController.java @@ -2,7 +2,6 @@ package de.htwsaar.webshop.controller; import de.htwsaar.webshop.model.ArticleModel; import de.htwsaar.webshop.repository.entities.Article; -import de.htwsaar.webshop.service.ArticleModelFactory; import de.htwsaar.webshop.service.ArticleService; import jakarta.servlet.http.HttpServletRequest; import lombok.extern.slf4j.Slf4j; @@ -21,25 +20,23 @@ import static de.htwsaar.webshop.util.LoggerUtil.logRequest; @Slf4j public class ArticleController { private final ArticleService articleService; - private final ArticleModelFactory articleModelFactory; @Autowired - public ArticleController(ArticleService articleService, ArticleModelFactory articleModelFactory) { + public ArticleController(ArticleService articleService) { this.articleService = articleService; - this.articleModelFactory = articleModelFactory; } @RequestMapping(path = ARTICLE_GET_ALL, method = RequestMethod.GET, produces = "application/json") public ResponseEntity> getAll(HttpServletRequest request) { logRequest(request); - return ResponseEntity.ok(articleModelFactory.from(articleService.findAll())); + return ResponseEntity.ok(articleService.from(articleService.findAll())); } @RequestMapping(path = ARTICLE_BASE, method = RequestMethod.GET, produces = "application/json") public ResponseEntity getByUUID(HttpServletRequest request, @RequestParam(value = PARAM_UUID) UUID uuid) { logRequest(request); - return ResponseEntity.ok(articleModelFactory.from(articleService.findByUUID(uuid))); + return ResponseEntity.ok(articleService.from(articleService.findByUUID(uuid))); } @RequestMapping(path = ARTICLE_BASE, method = RequestMethod.POST, produces = "application/json") diff --git a/00-backend/src/main/java/de/htwsaar/webshop/controller/ImageController.java b/00-backend/src/main/java/de/htwsaar/webshop/controller/ImageController.java new file mode 100644 index 0000000..0e7d11c --- /dev/null +++ b/00-backend/src/main/java/de/htwsaar/webshop/controller/ImageController.java @@ -0,0 +1,70 @@ +package de.htwsaar.webshop.controller; + +import de.htwsaar.webshop.model.ImageModel; +import de.htwsaar.webshop.repository.entities.Image; +import de.htwsaar.webshop.service.ImageService; +import de.htwsaar.webshop.service.ValidatorService; +import jakarta.servlet.http.HttpServletRequest; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.*; + +import java.util.List; + +import static de.htwsaar.webshop.config.ControllerPathConfig.*; +import static de.htwsaar.webshop.config.ParameterConfig.*; +import static de.htwsaar.webshop.util.LoggerUtil.logRequest; + +@RestController +@Slf4j +public class ImageController { + private final ImageService imageService; + private final ValidatorService validatorService; + + @Autowired + public ImageController(ImageService imageService, ValidatorService validatorService) { + this.imageService = imageService; + this.validatorService = validatorService; + } + + @RequestMapping(path = IMAGE_GET_ALL, method = RequestMethod.GET, produces = "application/json") + public ResponseEntity> getAll(HttpServletRequest request, + @RequestParam(value = PARAM_ARTICLE_ID) Long articleId) { + logRequest(request); + return ResponseEntity.ok(imageService.from(imageService.getImagesByArticleId(articleId))); + } + + @RequestMapping(path = IMAGE_BASE, method = RequestMethod.GET, produces = "application/json") + public ResponseEntity getFirst(HttpServletRequest request, + @RequestParam(value = PARAM_ARTICLE_ID) Long articleId) { + logRequest(request); + return ResponseEntity.ok(imageService.from(imageService.getImageByArticleId(articleId))); + } + + @RequestMapping(path = IMAGE_BASE, method = RequestMethod.POST, produces = "application/json") + public ResponseEntity add(HttpServletRequest request, + @RequestBody Image image) { + logRequest(request); + + if (validatorService.isInvalid(image)) { + log.warn("[{}] failed Validation, sending bad request", request.getRequestURI()); + return ResponseEntity.badRequest().body(false); + } + + Image a = imageService.save(image); + return ResponseEntity.ok(a != null); + } + + @RequestMapping(path = IMAGE_BASE, method = RequestMethod.DELETE, produces = "application/json") + public ResponseEntity update(HttpServletRequest request, + @RequestParam(value = PARAM_IMAGE_ID) Long imageId, + @RequestBody Image image) { + logRequest(request); + if (imageId == null || imageService.getImageById(imageId) == null) { + return ResponseEntity.badRequest().body(false); + } + image.setId(imageService.getImageById(imageId).getId()); + return ResponseEntity.ok(imageService.save(image) != null); + } +} diff --git a/00-backend/src/main/java/de/htwsaar/webshop/model/ImageModel.java b/00-backend/src/main/java/de/htwsaar/webshop/model/ImageModel.java new file mode 100644 index 0000000..3d5240d --- /dev/null +++ b/00-backend/src/main/java/de/htwsaar/webshop/model/ImageModel.java @@ -0,0 +1,13 @@ +package de.htwsaar.webshop.model; + +import lombok.AllArgsConstructor; +import lombok.Getter; + +import java.util.UUID; + +@Getter +@AllArgsConstructor +public class ImageModel { + UUID articleId; + String uri; +} diff --git a/00-backend/src/main/java/de/htwsaar/webshop/repository/ImageRepository.java b/00-backend/src/main/java/de/htwsaar/webshop/repository/ImageRepository.java index bd0b8e7..d2fd058 100644 --- a/00-backend/src/main/java/de/htwsaar/webshop/repository/ImageRepository.java +++ b/00-backend/src/main/java/de/htwsaar/webshop/repository/ImageRepository.java @@ -11,6 +11,6 @@ import java.util.List; @Repository public interface ImageRepository extends JpaRepository { List findAllByArticleId(@NonNull Long articleId); - Image findImageByArticleId(@NotNull Long articleId); + Image findImageById(Long id); } diff --git a/00-backend/src/main/java/de/htwsaar/webshop/service/ArticleModelFactory.java b/00-backend/src/main/java/de/htwsaar/webshop/service/ArticleModelFactory.java deleted file mode 100644 index bb5d21b..0000000 --- a/00-backend/src/main/java/de/htwsaar/webshop/service/ArticleModelFactory.java +++ /dev/null @@ -1,11 +0,0 @@ -package de.htwsaar.webshop.service; - -import de.htwsaar.webshop.model.ArticleModel; -import de.htwsaar.webshop.repository.entities.Article; - -import java.util.List; - -public interface ArticleModelFactory { - ArticleModel from(Article article); - List from(List
articles); -} diff --git a/00-backend/src/main/java/de/htwsaar/webshop/service/ArticleService.java b/00-backend/src/main/java/de/htwsaar/webshop/service/ArticleService.java index 4d57069..a3f4d2e 100644 --- a/00-backend/src/main/java/de/htwsaar/webshop/service/ArticleService.java +++ b/00-backend/src/main/java/de/htwsaar/webshop/service/ArticleService.java @@ -1,5 +1,6 @@ package de.htwsaar.webshop.service; +import de.htwsaar.webshop.model.ArticleModel; import de.htwsaar.webshop.repository.entities.Article; import java.util.List; @@ -9,7 +10,18 @@ import java.util.UUID; public interface ArticleService { List
findAll(); Article findByUUID(UUID uuid); + Article findByTitle(String title); + Article findById(Long articleId); void delete(Long id); Article save(Article article); double getRating(Long id); + double getRating(UUID uuid); + + ArticleModel from(Article article); + + /** + * @param articles Articles to Map + * @return an unmodifiable {@link List} of {@link ArticleModel}s + */ + List from(List
articles); } diff --git a/00-backend/src/main/java/de/htwsaar/webshop/service/ImageService.java b/00-backend/src/main/java/de/htwsaar/webshop/service/ImageService.java index d1d45e7..72467a8 100644 --- a/00-backend/src/main/java/de/htwsaar/webshop/service/ImageService.java +++ b/00-backend/src/main/java/de/htwsaar/webshop/service/ImageService.java @@ -1,12 +1,24 @@ package de.htwsaar.webshop.service; +import de.htwsaar.webshop.model.ImageModel; import de.htwsaar.webshop.repository.entities.Image; import java.util.List; -@SuppressWarnings("unused") public interface ImageService { - List getImageByItemId(Long itemId); + List getImagesByArticleId(Long articleId); + Image getImageByArticleId(Long imageId); - Image saveImage(Image image); + + Image getImageById(Long imageId); + + Image save(Image image); + + ImageModel from(Image image); + + /** + * @param images Images to Map + * @return an unmodifiable {@link List} of {@link ImageModel}s + */ + List from(List images); } diff --git a/00-backend/src/main/java/de/htwsaar/webshop/service/impl/ArticleModelFactoryImpl.java b/00-backend/src/main/java/de/htwsaar/webshop/service/impl/ArticleModelFactoryImpl.java deleted file mode 100644 index e82208f..0000000 --- a/00-backend/src/main/java/de/htwsaar/webshop/service/impl/ArticleModelFactoryImpl.java +++ /dev/null @@ -1,48 +0,0 @@ -package de.htwsaar.webshop.service.impl; - -import de.htwsaar.webshop.model.ArticleModel; -import de.htwsaar.webshop.repository.entities.Article; -import de.htwsaar.webshop.service.ArticleModelFactory; -import de.htwsaar.webshop.service.ArticleService; -import lombok.extern.slf4j.Slf4j; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Service; - -import java.util.ArrayList; -import java.util.List; - -@Service -@Slf4j -public class ArticleModelFactoryImpl implements ArticleModelFactory { - - private final ArticleService articleService; - - @Autowired - public ArticleModelFactoryImpl(ArticleService articleService) { - this.articleService = articleService; - } - - @Override - public ArticleModel from(Article article) { - return new ArticleModel( - article.getId(), - article.getUuid(), - article.getName(), - article.getDescription(), - article.getPrice100(), - article.getDiscount100(), - article.getStock(), - article.getCategory(), - articleService.getRating(article.getId()) - ); - } - - @Override - public List from(List
articles) { - List articleModels = new ArrayList<>(); - for (Article article : articles) { - articleModels.add(from(article)); - } - return articleModels; - } -} diff --git a/00-backend/src/main/java/de/htwsaar/webshop/service/impl/ArticleServiceImpl.java b/00-backend/src/main/java/de/htwsaar/webshop/service/impl/ArticleServiceImpl.java index 8cf7f9d..ca55c0c 100644 --- a/00-backend/src/main/java/de/htwsaar/webshop/service/impl/ArticleServiceImpl.java +++ b/00-backend/src/main/java/de/htwsaar/webshop/service/impl/ArticleServiceImpl.java @@ -1,5 +1,6 @@ package de.htwsaar.webshop.service.impl; +import de.htwsaar.webshop.model.ArticleModel; import de.htwsaar.webshop.repository.ArticleRepository; import de.htwsaar.webshop.repository.ReviewRepository; import de.htwsaar.webshop.repository.entities.Article; @@ -9,6 +10,7 @@ import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; +import java.util.ArrayList; import java.util.List; import java.util.UUID; @@ -19,7 +21,7 @@ public class ArticleServiceImpl implements ArticleService { private final ReviewRepository reviewRepository; @Autowired - public ArticleServiceImpl(ArticleRepository articleRepository, ReviewRepository reviewRepository) { + public ArticleServiceImpl(ArticleRepository articleRepository, ReviewRepository reviewRepository, ArticleService articleService) { this.articleRepository = articleRepository; this.reviewRepository = reviewRepository; } @@ -34,6 +36,16 @@ public class ArticleServiceImpl implements ArticleService { return articleRepository.findArticleByUuid(uuid).orElse(null); } + @Override + public Article findByTitle(String title) { + return articleRepository.findArticleByName(title).orElse(null); + } + + @Override + public Article findById(Long articleId) { + return articleRepository.findArticleById(articleId).orElse(null); + } + @Override public void delete(Long id) { articleRepository.deleteById(id); @@ -46,6 +58,35 @@ public class ArticleServiceImpl implements ArticleService { @Override public double getRating(Long id) { - return reviewRepository.streamReviewsByArticleId(id).mapToInt(Review::getRating).average().orElse(-1); + return reviewRepository.streamReviewsByArticleId(id) + .mapToInt(Review::getRating) + .average().orElse(-1); + } + + @Override + public double getRating(UUID uuid) { + return reviewRepository.streamReviewsByArticleId( + articleRepository.findArticleByUuid(uuid).orElseThrow().getId() + ).mapToInt(Review::getRating).average().orElse(-1); + } + + @Override + public ArticleModel from(Article article) { + return new ArticleModel( + article.getId(), + article.getUuid(), + article.getName(), + article.getDescription(), + article.getPrice100(), + article.getDiscount100(), + article.getStock(), + article.getCategory(), + getRating(article.getId()) + ); + } + + @Override + public List from(List
articles) { + return articles.stream().map(this::from).toList(); } } diff --git a/00-backend/src/main/java/de/htwsaar/webshop/service/impl/ImageServiceImpl.java b/00-backend/src/main/java/de/htwsaar/webshop/service/impl/ImageServiceImpl.java index de45cb7..e910677 100644 --- a/00-backend/src/main/java/de/htwsaar/webshop/service/impl/ImageServiceImpl.java +++ b/00-backend/src/main/java/de/htwsaar/webshop/service/impl/ImageServiceImpl.java @@ -1,7 +1,9 @@ package de.htwsaar.webshop.service.impl; +import de.htwsaar.webshop.model.ImageModel; import de.htwsaar.webshop.repository.ImageRepository; import de.htwsaar.webshop.repository.entities.Image; +import de.htwsaar.webshop.service.ArticleService; import de.htwsaar.webshop.service.ImageService; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; @@ -13,16 +15,18 @@ import java.util.List; @Slf4j public class ImageServiceImpl implements ImageService { private final ImageRepository imageRepository; + private final ArticleService articleService; @Autowired - public ImageServiceImpl(ImageRepository imageRepository) { + public ImageServiceImpl(ImageRepository imageRepository, ArticleService articleService) { this.imageRepository = imageRepository; + this.articleService = articleService; } @Override - public List getImageByItemId(Long itemId) { - return imageRepository.findAllByArticleId(itemId); + public List getImagesByArticleId(Long articleId) { + return imageRepository.findAllByArticleId(articleId); } @Override @@ -31,7 +35,22 @@ public class ImageServiceImpl implements ImageService { } @Override - public Image saveImage(Image image) { + public Image getImageById(Long imageId) { + return imageRepository.findImageById(imageId); + } + + @Override + public Image save(Image image) { return imageRepository.save(image); } + + @Override + public ImageModel from(Image image) { + return new ImageModel(articleService.findById(image.getArticleId()).getUuid(),image.getUri()); + } + + @Override + public List from(List images) { + return images.stream().map(this::from).toList(); + } }