diff --git a/src/main/java/mate/academy/bookstore/dto/ShoppingCartRequestDto.java b/src/main/java/mate/academy/bookstore/dto/ShoppingCartRequestDto.java index a49f07c..d6874c3 100644 --- a/src/main/java/mate/academy/bookstore/dto/ShoppingCartRequestDto.java +++ b/src/main/java/mate/academy/bookstore/dto/ShoppingCartRequestDto.java @@ -1,5 +1,6 @@ package mate.academy.bookstore.dto; +import jakarta.validation.Valid; import jakarta.validation.constraints.NotEmpty; import java.util.Set; import lombok.Data; @@ -7,5 +8,6 @@ @Data public class ShoppingCartRequestDto { @NotEmpty + @Valid private Set cartItems; } diff --git a/src/main/java/mate/academy/bookstore/model/CartItem.java b/src/main/java/mate/academy/bookstore/model/CartItem.java index d0c4854..bdc67f8 100644 --- a/src/main/java/mate/academy/bookstore/model/CartItem.java +++ b/src/main/java/mate/academy/bookstore/model/CartItem.java @@ -20,5 +20,6 @@ public class CartItem { private CartItemKey id; @Column(nullable = false) + @EqualsAndHashCode.Exclude private int quantity; } diff --git a/src/main/java/mate/academy/bookstore/repository/CartItemRepository.java b/src/main/java/mate/academy/bookstore/repository/CartItemRepository.java index 995adbc..f2fc7c9 100644 --- a/src/main/java/mate/academy/bookstore/repository/CartItemRepository.java +++ b/src/main/java/mate/academy/bookstore/repository/CartItemRepository.java @@ -4,5 +4,9 @@ import mate.academy.bookstore.model.CartItemKey; import org.springframework.data.jpa.repository.JpaRepository; +import java.util.List; +import java.util.Set; + public interface CartItemRepository extends JpaRepository { + Set getById_Book_IdIn(List ids); } diff --git a/src/main/java/mate/academy/bookstore/service/BookService.java b/src/main/java/mate/academy/bookstore/service/BookService.java index e94af02..0f71eb6 100644 --- a/src/main/java/mate/academy/bookstore/service/BookService.java +++ b/src/main/java/mate/academy/bookstore/service/BookService.java @@ -18,4 +18,6 @@ public interface BookService { BookDto updateById(Long id, BookRequestDto bookRequestDto); void deleteById(Long id); + + void validateBooksExistence(List booksIds); } diff --git a/src/main/java/mate/academy/bookstore/service/impl/BookServiceImpl.java b/src/main/java/mate/academy/bookstore/service/impl/BookServiceImpl.java index 9b7b0cb..9c24a98 100644 --- a/src/main/java/mate/academy/bookstore/service/impl/BookServiceImpl.java +++ b/src/main/java/mate/academy/bookstore/service/impl/BookServiceImpl.java @@ -90,6 +90,21 @@ public void deleteById(Long id) { bookRepository.deleteById(id); } + public void validateBooksExistence(List booksIds) { + Set existingBooks = bookRepository.findByIdIn(booksIds) + .stream() + .map(Book::getId) + .collect(Collectors.toSet()); + + if (existingBooks.size() != booksIds.size()) { + Set notFoundBooks = new HashSet<>(booksIds); + notFoundBooks.removeAll(existingBooks); + throw new EntityNotFoundException( + localeService.getMessage("exception.notfound.books") + notFoundBooks + ); + } + } + private Book getBookByIdOrThrowException(Long id) { return bookRepository.findById(id) .orElseThrow(() -> new EntityNotFoundException( diff --git a/src/main/java/mate/academy/bookstore/service/impl/ShoppingCartServiceImpl.java b/src/main/java/mate/academy/bookstore/service/impl/ShoppingCartServiceImpl.java index e1358bd..dc9c560 100644 --- a/src/main/java/mate/academy/bookstore/service/impl/ShoppingCartServiceImpl.java +++ b/src/main/java/mate/academy/bookstore/service/impl/ShoppingCartServiceImpl.java @@ -1,36 +1,34 @@ package mate.academy.bookstore.service.impl; -import jakarta.persistence.EntityManager; -import jakarta.persistence.PersistenceContext; +import java.util.List; +import java.util.Set; import java.util.stream.Collectors; import lombok.RequiredArgsConstructor; +import mate.academy.bookstore.dto.CartItemRequestDto; import mate.academy.bookstore.dto.ShoppingCartDto; import mate.academy.bookstore.dto.ShoppingCartRequestDto; import mate.academy.bookstore.exception.EntityNotFoundException; import mate.academy.bookstore.mapper.ShoppingCartMapper; import mate.academy.bookstore.model.Book; +import mate.academy.bookstore.model.CartItem; import mate.academy.bookstore.model.CartItemKey; import mate.academy.bookstore.model.ShoppingCart; import mate.academy.bookstore.model.User; -import mate.academy.bookstore.repository.BookRepository; import mate.academy.bookstore.repository.CartItemRepository; import mate.academy.bookstore.repository.ShoppingCartRepository; +import mate.academy.bookstore.service.BookService; import mate.academy.bookstore.service.LocaleService; import mate.academy.bookstore.service.ShoppingCartService; import org.springframework.stereotype.Service; -import org.springframework.transaction.annotation.Transactional; @Service @RequiredArgsConstructor public class ShoppingCartServiceImpl implements ShoppingCartService { private final ShoppingCartRepository shoppingCartRepository; private final CartItemRepository cartItemRepository; - private final BookRepository bookRepository; private final ShoppingCartMapper shoppingCartMapper; private final LocaleService localeService; - - @PersistenceContext - private EntityManager entityManager; + private final BookService bookService; @Override public void createFor(User user) { @@ -41,8 +39,12 @@ public void createFor(User user) { } @Override - @Transactional public ShoppingCartDto save(ShoppingCartRequestDto dto, User user) { + List newBookIds = dto.getCartItems().stream() + .map(CartItemRequestDto::getBookId) + .toList(); + bookService.validateBooksExistence(newBookIds); + ShoppingCart shoppingCart = shoppingCartMapper.toModel(dto); shoppingCart.setUser(user); shoppingCart.setId(user.getId()); @@ -52,8 +54,10 @@ public ShoppingCartDto save(ShoppingCartRequestDto dto, User user) { .collect(Collectors.toSet()) ); - ShoppingCart savedShoppingCart = shoppingCartRepository.saveAndFlush(shoppingCart); - entityManager.refresh(savedShoppingCart); + ShoppingCart savedShoppingCart = shoppingCartRepository.save(shoppingCart); + Set savedCartItems = cartItemRepository.getById_Book_IdIn(newBookIds); + savedShoppingCart.setCartItems(savedCartItems); + return shoppingCartMapper.toDto(savedShoppingCart); }