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) {
}