BugFix Stream for Article model.

This commit is contained in:
FlorianSpeicher
2025-06-03 21:37:01 +02:00
parent 71524f0bd4
commit 081cb12548
6 changed files with 33 additions and 11 deletions

View File

@@ -3,6 +3,7 @@ package de.htwsaar.webshop.repository;
import de.htwsaar.webshop.repository.entities.Article; import de.htwsaar.webshop.repository.entities.Article;
import lombok.NonNull; import lombok.NonNull;
import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.Query;
import org.springframework.stereotype.Repository; import org.springframework.stereotype.Repository;
import java.util.Optional; import java.util.Optional;

View File

@@ -1,17 +1,18 @@
package de.htwsaar.webshop.repository; 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 de.htwsaar.webshop.repository.entities.Review;
import jakarta.validation.constraints.NotNull; import jakarta.validation.constraints.NotNull;
import jakarta.validation.constraints.Positive; 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 @Repository
public interface ReviewRepository extends JpaRepository<Review, Long> { public interface ReviewRepository extends JpaRepository<Review, Long> {
Stream<Review> streamReviewsByArticleId(@NotNull @Positive Long id); Stream<Review> streamReviewsByArticleId(@NotNull @Positive Long id);
List<Review> getReviewsByArticle_Id(Long articleId); List<Review> getReviewsByArticleId(Long articleId);
} }

View File

@@ -7,7 +7,10 @@ import lombok.AllArgsConstructor;
import lombok.Getter; import lombok.Getter;
import lombok.NoArgsConstructor; import lombok.NoArgsConstructor;
import lombok.Setter; import lombok.Setter;
import lombok.ToString;
import java.util.ArrayList;
import java.util.List;
import java.util.UUID; import java.util.UUID;
@Getter @Getter
@@ -16,6 +19,7 @@ import java.util.UUID;
@NoArgsConstructor @NoArgsConstructor
@Entity @Entity
@Table(name = "Articles") @Table(name = "Articles")
@ToString
public class Article { public class Article {
@Id @Id
@GeneratedValue(strategy = GenerationType.IDENTITY) @GeneratedValue(strategy = GenerationType.IDENTITY)
@@ -46,4 +50,7 @@ public class Article {
@Column(name = "category", nullable = false) @Column(name = "category", nullable = false)
private String category; private String category;
@OneToMany(mappedBy = "article", cascade = CascadeType.ALL, orphanRemoval = true, fetch = FetchType.EAGER)
private List<Review> reviews = new ArrayList<>();
} }

View File

@@ -23,8 +23,8 @@ public class Review {
@Column(name = "content", nullable = false) @Column(name = "content", nullable = false)
private String content; private String content;
@ManyToOne(fetch = FetchType.LAZY) @ManyToOne(fetch = FetchType.EAGER)
@JoinColumn(name = "articleId", referencedColumnName = "id", nullable = false) @JoinColumn(name = "article_id", nullable = false)
private Article article; private Article article;
@PositiveOrZero @PositiveOrZero

View File

@@ -6,6 +6,7 @@ import de.htwsaar.webshop.repository.ReviewRepository;
import de.htwsaar.webshop.repository.entities.Article; import de.htwsaar.webshop.repository.entities.Article;
import de.htwsaar.webshop.repository.entities.Review; import de.htwsaar.webshop.repository.entities.Review;
import de.htwsaar.webshop.service.ArticleService; import de.htwsaar.webshop.service.ArticleService;
import jakarta.transaction.Transactional;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
@@ -56,7 +57,10 @@ public class ArticleServiceImpl implements ArticleService {
} }
@Override @Override
@Transactional
public Article save(Article article) { public Article save(Article article) {
article.setId(null);
article.setUuid(UUID.randomUUID());
return articleRepository.save(article); return articleRepository.save(article);
} }
@@ -64,10 +68,12 @@ public class ArticleServiceImpl implements ArticleService {
public double getRating(Long id) { public double getRating(Long id) {
return reviewRepository.streamReviewsByArticleId(id) return reviewRepository.streamReviewsByArticleId(id)
.mapToInt(Review::getRating) .mapToInt(Review::getRating)
.average().orElse(-1); .average()
.orElse(-1);
} }
@Override @Override
@Transactional
public double getRating(UUID uuid) { public double getRating(UUID uuid) {
return reviewRepository.streamReviewsByArticleId( return reviewRepository.streamReviewsByArticleId(
articleRepository.findArticleByUuid(uuid).orElseThrow().getId() articleRepository.findArticleByUuid(uuid).orElseThrow().getId()
@@ -85,10 +91,17 @@ public class ArticleServiceImpl implements ArticleService {
article.getDiscount100(), article.getDiscount100(),
article.getStock(), article.getStock(),
article.getCategory(), article.getCategory(),
getRating(article.getId()) calculateAverageRating(article.getReviews())
); );
} }
private double calculateAverageRating(List<Review> reviews) {
return reviews.stream()
.mapToInt(Review::getRating)
.average()
.orElse(-1);
}
@Override @Override
public List<ArticleModel> from(List<Article> articles) { public List<ArticleModel> from(List<Article> articles) {
return articles.stream().map(this::from).toList(); return articles.stream().map(this::from).toList();

View File

@@ -36,6 +36,6 @@ public class ReviewServiceImpl implements ReviewService {
@Override @Override
public List<Review> getAllByArticleId(Long articleId) { public List<Review> getAllByArticleId(Long articleId) {
return reviewRepository.getReviewsByArticle_Id(articleId); return reviewRepository.getReviewsByArticleId(articleId);
} }
} }