-
Notifications
You must be signed in to change notification settings - Fork 2
Expand file tree
/
Copy pathBookService.java
More file actions
92 lines (81 loc) · 4.61 KB
/
BookService.java
File metadata and controls
92 lines (81 loc) · 4.61 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
package bookShop.service;
import bookShop.model.Book;
import bookShop.model.request.BookRequest;
import bookShop.repository.BookRepository;
import bookShop.exception.BookNotFoundException;
import bookShop.exception.ForbiddenActionException;
import bookShop.exception.BookAlreadyExistsException;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;
import java.util.List;
import lombok.extern.slf4j.Slf4j;
@Slf4j
@Service
@RequiredArgsConstructor
public class BookService {
private final BookRepository bookRepository;
public List<Book> getAllBooks() {
List<Book> books = bookRepository.findAll();
if (books.isEmpty()) throw new BookNotFoundException("Книги не найдены");
return books;
}
public Book getBookById(Long id) {
return bookRepository.findById(id)
.orElseThrow(BookNotFoundException::new);
}
public List<Book> getBooksByTitle(String title) {
title = (title != null) ? title.trim() : null; //Можно еще добавить проверку на ввод пустой строки, возможно при запросе на пустую строку оператор LIKE выдаст все записи
List<Book> books = bookRepository.findByTitleIgnoreCaseLike(title);
if (books.isEmpty()) throw new BookNotFoundException("Книги с указанным названием не найдены");
return books;
}
public List<Book> getBooksByAuthor(String author) {
author = (author != null) ? author.trim() : null; //Можно еще добавить проверку на ввод пустой строки, возможно при запросе на пустую строку оператор LIKE выдаст все записи
List<Book> books = bookRepository.findByAuthorIgnoreCaseLike(author);
if (books.isEmpty()) throw new BookNotFoundException("Книги с указанным автором не найдены");
return books;
}
public Book addBook(BookRequest request) {
log.info("Добавление книги: [{}] [{}]", request.getTitle(), request.getAuthor());
validateBookUnique(request.getTitle(), request.getAuthor());
Book book = Book.builder()
.title(request.getTitle())
.author(request.getAuthor())
.price(request.getPrice())
.copiesAvailable(request.getCopiesAvailable())
.build();
log.info("Книга успешно добавлена: [{}] [{}]", request.getTitle(), request.getAuthor());
return bookRepository.save(book);
}
public Book updateBook(Long id, BookRequest request) {
log.info("Обновление книги [{}]", id);
Book book = bookRepository.findById(id)
.orElseThrow(BookNotFoundException::new);
validateUpdateNotChangeMainFields(book, request);
book.setPrice(request.getPrice());
book.setCopiesAvailable(request.getCopiesAvailable());
log.info("Книга [{}] успешно обновлена", id);
return bookRepository.save(book);
}
public void deleteBook(Long id) {
log.warn("Попытка удаления админом книги [{}]", id);
if (!bookRepository.existsById(id)) { // я бы вообще не делал запрос на существование записи в этом случае, потому что это лишний запрос в бд если книга существует. Лучше просто удалять и либо проверять 0 или 1 вернулось, либо просто игнорировать ответ
throw new BookNotFoundException();
}
bookRepository.deleteById(id);
log.info("Книга [{}] удалена админом", id);
}
private void validateBookUnique(String title, String author) {
if (bookRepository.existsByTitleAndAuthorIgnoreCase(title, author)) {
throw new BookAlreadyExistsException("Книга с таким названием и автором уже существует");
}
}
private void validateUpdateNotChangeMainFields(Book book, BookRequest request) {
if (!book.getTitle().equals(request.getTitle())) {
throw new ForbiddenActionException("Изменение названия книги запрещено");
}
if (!book.getAuthor().equals(request.getAuthor())) {
throw new ForbiddenActionException("Изменение автора книги запрещено");
}
}
}