diff --git a/pom.xml b/pom.xml index b1ae4fd..970a120 100644 --- a/pom.xml +++ b/pom.xml @@ -70,6 +70,17 @@ provided + + org.mapstruct + mapstruct + 1.5.5.Final + + + + org.mapstruct + mapstruct-processor + 1.5.5.Final + @@ -85,6 +96,11 @@ 3.8.1 + + org.mapstruct + mapstruct-processor + 1.5.5.Final + org.projectlombok lombok @@ -93,7 +109,6 @@ - diff --git a/src/main/java/com/box/library/author/AuthorMapper.java b/src/main/java/com/box/library/author/AuthorMapper.java new file mode 100644 index 0000000..74d6d64 --- /dev/null +++ b/src/main/java/com/box/library/author/AuthorMapper.java @@ -0,0 +1,15 @@ +package com.box.library.author; + +import com.box.library.book.Book; +import com.box.library.request.CreateAuthorRequest; +import com.box.library.request.UpdateAuthorRequest; +import org.mapstruct.Mapper; +import java.util.List; + +@Mapper(componentModel = "spring") +public interface AuthorMapper { + + Author toAuthor(CreateAuthorRequest request, List books); + + Author toAuthor(UpdateAuthorRequest request, List books, Long id); +} diff --git a/src/main/java/com/box/library/author/AuthorService.java b/src/main/java/com/box/library/author/AuthorService.java index 835edbc..1668fc4 100644 --- a/src/main/java/com/box/library/author/AuthorService.java +++ b/src/main/java/com/box/library/author/AuthorService.java @@ -9,7 +9,6 @@ import jakarta.transaction.Transactional; import org.springframework.context.annotation.Lazy; import org.springframework.stereotype.Service; - import java.util.ArrayList; import java.util.HashSet; import java.util.List; @@ -21,10 +20,12 @@ public class AuthorService { private final AuthorRepository repository; private final BookService bookService; + private final AuthorMapper authorMapper; - public AuthorService(AuthorRepository repository, @Lazy BookService bookService) { + public AuthorService(AuthorRepository repository, @Lazy BookService bookService, AuthorMapper authorMapper) { this.repository = repository; this.bookService = bookService; + this.authorMapper = authorMapper; } public List findAllByIds(List ids) { @@ -41,7 +42,7 @@ public Author findById(Long id) { public Author create(CreateAuthorRequest request) { var books = bookService.findAllByIds(request.booksIds()); - var author = new Author(request.name(), books); + var author = authorMapper.toAuthor(request, books); books.forEach(book -> book.getAuthors().add(author)); return repository.save(author); } @@ -53,10 +54,8 @@ public Author update(Long id, UpdateAuthorRequest request) { removeOldBooksAssociations(author, books); addNewBooksAssociations(author, books); - author.setName(request.name()); - author.setBooks(new ArrayList<>(books)); - - return repository.save(author); + var updatedAuthor = authorMapper.toAuthor(request, new ArrayList<>(books), id); + return repository.save(updatedAuthor); } @Transactional diff --git a/src/main/java/com/box/library/book/Book.java b/src/main/java/com/box/library/book/Book.java index 0e755d5..63a2928 100644 --- a/src/main/java/com/box/library/book/Book.java +++ b/src/main/java/com/box/library/book/Book.java @@ -54,5 +54,4 @@ public Book(String title, List authors, String publisher, String ISBN) { this.publisher = publisher; this.ISBN = ISBN; } - } diff --git a/src/main/java/com/box/library/book/BookMapper.java b/src/main/java/com/box/library/book/BookMapper.java new file mode 100644 index 0000000..4c876b0 --- /dev/null +++ b/src/main/java/com/box/library/book/BookMapper.java @@ -0,0 +1,29 @@ +package com.box.library.book; + +import com.box.library.author.Author; +import com.box.library.loan.Loan; +import com.box.library.request.CreateBookRequest; +import com.box.library.request.UpdateBookRequest; +import org.mapstruct.Mapper; +import org.mapstruct.Mapping; +import org.mapstruct.Named; +import java.util.List; + +@Mapper(componentModel = "spring") +public interface BookMapper { + + @Mapping(target="authors", source="authors") + Book toBook(CreateBookRequest request, List authors); + + @Mapping(target="authors", source="authors") + @Mapping(target="id", source="id") + @Mapping(target="status", source="request.status", qualifiedByName = "stringToStatus") + @Mapping(target = "loans", source = "loans") + @Mapping(target="ISBN", source="request.isbn") + Book toBook(UpdateBookRequest request, Long id, List authors, List loans); + + @Named("stringToStatus") + default BookStatus stringToStatus(String status) { + return BookStatus.valueOf(status); + } +} diff --git a/src/main/java/com/box/library/book/BookService.java b/src/main/java/com/box/library/book/BookService.java index 49f84e2..480960e 100644 --- a/src/main/java/com/box/library/book/BookService.java +++ b/src/main/java/com/box/library/book/BookService.java @@ -3,8 +3,10 @@ import com.box.library.author.AuthorService; import com.box.library.exception.BookNotFoundException; import com.box.library.exception.NoFilterProvidedException; +import com.box.library.loan.LoanService; import com.box.library.request.CreateBookRequest; import com.box.library.request.UpdateBookRequest; +import org.springframework.context.annotation.Lazy; import org.springframework.stereotype.Service; import org.springframework.util.StringUtils; @@ -15,15 +17,19 @@ public class BookService { private final BookRepository repository; private final AuthorService authorService; + private final BookMapper bookMapper; + private final LoanService loanService; - public BookService(BookRepository repository, AuthorService authorService) { + public BookService(BookRepository repository, AuthorService authorService, BookMapper bookMaper, @Lazy LoanService loanService) { this.repository = repository; this.authorService = authorService; + this.bookMapper = bookMaper; + this.loanService = loanService; } public Book create(CreateBookRequest request) { var authors = authorService.findAllByIds(request.authorsIds()); - var book = new Book(request.title(), authors, request.publisher(), request.isbn()); + var book = bookMapper.toBook(request, authors); return repository.save(book); } @@ -51,16 +57,11 @@ public void deleteById(Long id) { } public Book update(Long id, UpdateBookRequest request) { - var existingBook = findById(id); var authors = authorService.findAllByIds(request.authorsIds()); + var loans = loanService.findAllByIds(request.loansIds()); + var updatedBook = bookMapper.toBook(request, id, authors, loans); - existingBook.setTitle(request.title()); - existingBook.setAuthors(authors); - existingBook.setISBN(request.isbn()); - existingBook.setPublisher(request.publisher()); - existingBook.setStatus(request.status()); - - return repository.save(existingBook); + return repository.save(updatedBook); } public List findAllByFilter(String author, String title, String isbn, String publisher) { diff --git a/src/main/java/com/box/library/loan/LoanService.java b/src/main/java/com/box/library/loan/LoanService.java index 1fd0b4a..81ed42b 100644 --- a/src/main/java/com/box/library/loan/LoanService.java +++ b/src/main/java/com/box/library/loan/LoanService.java @@ -39,6 +39,8 @@ public List findAll() { return repository.findAll(); } + public List findAllByIds(List ids){return repository.findAllById(ids);} + public List findByCustomerId(Long customerId) { return repository.findByCustomerId(customerId); } diff --git a/src/main/java/com/box/library/request/UpdateBookRequest.java b/src/main/java/com/box/library/request/UpdateBookRequest.java index 3197a9e..a61a4ba 100644 --- a/src/main/java/com/box/library/request/UpdateBookRequest.java +++ b/src/main/java/com/box/library/request/UpdateBookRequest.java @@ -9,7 +9,8 @@ public record UpdateBookRequest(@NotBlank String title, @NotEmpty List authorsIds, + List loansIds, @NotBlank String publisher, @NotBlank String isbn, - @NotNull BookStatus status) { + @NotNull String status) { }