Repository navigation
Реализовать запросы и тестирование - #4
Conversation
| BookingDtoOut getBooking(long userId, long bookingId); | ||
|
|
||
| List<BookingDtoOut> getAllBookingByUser(long userId, StateOfBooking stateOfBooking); | ||
| List<BookingDtoOut> getAllBookingByUser(long userId, StateOfBooking stateOfBooking, int from, int size); |
There was a problem hiding this comment.
Вместо набора параметров лучше передать Pageable.
Аналогично ниже
| List<Booking> bookings = bookingRepository.findByItemIdAndStatus(item.getId(), StatusOfBooking.APPROVED); | ||
| boolean isConflicting = !bookings.stream().allMatch(booking -> | ||
| !booking.getStart().isBefore(bookingDtoIn.getEnd()) || !booking.getEnd().isAfter(bookingDtoIn.getEnd()) | ||
| booking.getStart().isAfter(bookingDtoIn.getEnd()) || booking.getEnd().isBefore(bookingDtoIn.getStart()) |
There was a problem hiding this comment.
Пусть существующее бронирование происходит с 13:00 до 15:00, а новое с 15:00 до 17:00.
Будет ли пройдена валидация в таком случае?
| this.httpStatus = httpStatus; | ||
| } | ||
|
|
||
| public HttpStatus getHttpStatus() { |
There was a problem hiding this comment.
Можно использовать lombok вместо шаблонного кода.
Аналогично для остальных исключений
| private Boolean available; | ||
| private Long requestId; | ||
|
|
||
| public ItemDtoRequested(Item item) { |
There was a problem hiding this comment.
Dto - это объект из внешнего мира, он ничего не должен знать о модели данных. Преобразование Item в Dto лучше сделать в маппере
| ItemDto getById(long itemId, long userId); | ||
|
|
||
| List<ItemDto> getBySearch(String search); | ||
| List<ItemDto> getBySearch(String search, int from, int size); |
There was a problem hiding this comment.
Вместо набора параметров лучше передать Pageable.
Аналогично ниже
|
|
||
| @Override | ||
| public ItemDto createItem(ItemDto itemDto, Long userId) { | ||
| User owner = UserServiceImpl.getValidatedUser(userRepository, userId); |
There was a problem hiding this comment.
Зачем передавать репозиторий, если в сервисе он уже есть?)
| item.setOwner(owner); | ||
| Long requestId = itemDto.getRequestId(); | ||
| if (requestId != null) { | ||
| ItemRequest request = ItemRequestServiceImpl.getValidatedRequest(requestRepository, requestId); |
There was a problem hiding this comment.
Зачем передавать репозиторий, если в сервисе он уже есть?)
И вообще репозитории передавать в сервисы не нужно. Репозиторий - это вспомогательный объект для выполнения бизнес-функции. Это как прийти к стоматологу, принести все необходимые инструменты и сказать : "нужно вот в этом месте этим инструментом сделать такое-то действие"...)
Аналогично в остальных методах
|
|
||
| RequestDtoWithItemsOut getById(long userId, long requestId); | ||
|
|
||
| List<RequestDtoWithItemsOut> getAllByOwner(long userId, int from, int size); |
There was a problem hiding this comment.
Вместо набора параметров лучше передать Pageable.
Аналогично ниже
|
|
||
| @Override | ||
| public RequestDtoOut createRequest(long userId, RequestDtoIn itemRequestDtoIn) { | ||
| User user = UserServiceImpl.getValidatedUser(userRepository, userId); |
There was a problem hiding this comment.
Передавать репозитории в другие сервисы не нужно
| return dto; | ||
| } | ||
|
|
||
| public static RequestDtoWithItemsOut fromRequestToDtoWithItemsOut(ItemRequest request, List<Item> items) { |
There was a problem hiding this comment.
Нужно передать только те items, которые относятся к данному request, чтобы не перебирать лишние предметы в цикле на 36 строке
|
забыла при создании сменить название коммита "написать тест на конструктор" 853cd1a, по факту там ломбок вместо геттеров и замена на pageable. |
| import ru.practicum.shareit.user.model.User; | ||
| import ru.practicum.shareit.user.repository.UserRepository; | ||
|
|
||
| public class EntityValidator { |
There was a problem hiding this comment.
Этот класс создает сильную связанность между классами, которые его используют. От таких классов лучше избавиться)
В сервисах можно явно использовать repositoru.findById(...).orElseThrow(...);
Или можно в репозитории добавить кастомные методы, которые бросят исключение, если объект не найден
No description provided.