diff --git a/00-backend/src/main/java/de/htwsaar/webshop/repository/ArticleRepository.java b/00-backend/src/main/java/de/htwsaar/webshop/repository/ArticleRepository.java index 3e99a36..735036d 100644 --- a/00-backend/src/main/java/de/htwsaar/webshop/repository/ArticleRepository.java +++ b/00-backend/src/main/java/de/htwsaar/webshop/repository/ArticleRepository.java @@ -3,6 +3,7 @@ package de.htwsaar.webshop.repository; import de.htwsaar.webshop.repository.entities.Article; import lombok.NonNull; import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.data.jpa.repository.Query; import org.springframework.stereotype.Repository; import java.util.Optional; diff --git a/00-backend/src/main/java/de/htwsaar/webshop/repository/ReviewRepository.java b/00-backend/src/main/java/de/htwsaar/webshop/repository/ReviewRepository.java index 0e8b644..8c3acd6 100644 --- a/00-backend/src/main/java/de/htwsaar/webshop/repository/ReviewRepository.java +++ b/00-backend/src/main/java/de/htwsaar/webshop/repository/ReviewRepository.java @@ -1,17 +1,18 @@ package de.htwsaar.webshop.repository; +import java.util.List; +import java.util.stream.Stream; + +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.stereotype.Repository; + import de.htwsaar.webshop.repository.entities.Review; import jakarta.validation.constraints.NotNull; import jakarta.validation.constraints.Positive; -import org.springframework.data.jpa.repository.JpaRepository; -import org.springframework.stereotype.Repository; - -import java.util.List; -import java.util.stream.Stream; @Repository public interface ReviewRepository extends JpaRepository { Stream streamReviewsByArticleId(@NotNull @Positive Long id); - List getReviewsByArticle_Id(Long articleId); + List getReviewsByArticleId(Long articleId); } diff --git a/00-backend/src/main/java/de/htwsaar/webshop/repository/entities/Article.java b/00-backend/src/main/java/de/htwsaar/webshop/repository/entities/Article.java index 9d185fa..1bfa0f3 100644 --- a/00-backend/src/main/java/de/htwsaar/webshop/repository/entities/Article.java +++ b/00-backend/src/main/java/de/htwsaar/webshop/repository/entities/Article.java @@ -7,7 +7,10 @@ import lombok.AllArgsConstructor; import lombok.Getter; import lombok.NoArgsConstructor; import lombok.Setter; +import lombok.ToString; +import java.util.ArrayList; +import java.util.List; import java.util.UUID; @Getter @@ -16,6 +19,7 @@ import java.util.UUID; @NoArgsConstructor @Entity @Table(name = "Articles") +@ToString public class Article { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) @@ -46,4 +50,7 @@ public class Article { @Column(name = "category", nullable = false) private String category; + + @OneToMany(mappedBy = "article", cascade = CascadeType.ALL, orphanRemoval = true, fetch = FetchType.EAGER) + private List reviews = new ArrayList<>(); } diff --git a/00-backend/src/main/java/de/htwsaar/webshop/repository/entities/Review.java b/00-backend/src/main/java/de/htwsaar/webshop/repository/entities/Review.java index c28d049..03d6a49 100644 --- a/00-backend/src/main/java/de/htwsaar/webshop/repository/entities/Review.java +++ b/00-backend/src/main/java/de/htwsaar/webshop/repository/entities/Review.java @@ -23,8 +23,8 @@ public class Review { @Column(name = "content", nullable = false) private String content; - @ManyToOne(fetch = FetchType.LAZY) - @JoinColumn(name = "articleId", referencedColumnName = "id", nullable = false) + @ManyToOne(fetch = FetchType.EAGER) + @JoinColumn(name = "article_id", nullable = false) private Article article; @PositiveOrZero 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 7232b90..d8fe19c 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 @@ -6,6 +6,7 @@ import de.htwsaar.webshop.repository.ReviewRepository; import de.htwsaar.webshop.repository.entities.Article; import de.htwsaar.webshop.repository.entities.Review; import de.htwsaar.webshop.service.ArticleService; +import jakarta.transaction.Transactional; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; @@ -56,7 +57,10 @@ public class ArticleServiceImpl implements ArticleService { } @Override + @Transactional public Article save(Article article) { + article.setId(null); + article.setUuid(UUID.randomUUID()); return articleRepository.save(article); } @@ -64,10 +68,12 @@ public class ArticleServiceImpl implements ArticleService { public double getRating(Long id) { return reviewRepository.streamReviewsByArticleId(id) .mapToInt(Review::getRating) - .average().orElse(-1); + .average() + .orElse(-1); } @Override + @Transactional public double getRating(UUID uuid) { return reviewRepository.streamReviewsByArticleId( articleRepository.findArticleByUuid(uuid).orElseThrow().getId() @@ -85,10 +91,17 @@ public class ArticleServiceImpl implements ArticleService { article.getDiscount100(), article.getStock(), article.getCategory(), - getRating(article.getId()) + calculateAverageRating(article.getReviews()) ); } + private double calculateAverageRating(List reviews) { + return reviews.stream() + .mapToInt(Review::getRating) + .average() + .orElse(-1); + } + @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/ReviewServiceImpl.java b/00-backend/src/main/java/de/htwsaar/webshop/service/impl/ReviewServiceImpl.java index 34f25ee..896eaab 100644 --- a/00-backend/src/main/java/de/htwsaar/webshop/service/impl/ReviewServiceImpl.java +++ b/00-backend/src/main/java/de/htwsaar/webshop/service/impl/ReviewServiceImpl.java @@ -36,6 +36,6 @@ public class ReviewServiceImpl implements ReviewService { @Override public List getAllByArticleId(Long articleId) { - return reviewRepository.getReviewsByArticle_Id(articleId); + return reviewRepository.getReviewsByArticleId(articleId); } }