Skip to content

Commit d8c6537

Browse files
committed
add-bookings. Ревью. Изменить проверки времени на аннотации. Добавить проверку статуса у апи подтверждения брони. Обогатить ответ для апи по получению списка вещей у пользователя. Небольшие корректировки кода.
1 parent b75963f commit d8c6537

File tree

6 files changed

+53
-17
lines changed

6 files changed

+53
-17
lines changed

src/main/java/ru/practicum/shareit/booking/dto/BookingDtoRequest.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
package ru.practicum.shareit.booking.dto;
22

3+
import jakarta.validation.constraints.Future;
4+
import jakarta.validation.constraints.FutureOrPresent;
35
import jakarta.validation.constraints.NotNull;
46
import lombok.AllArgsConstructor;
57
import lombok.Data;
@@ -11,8 +13,10 @@
1113
@AllArgsConstructor
1214
public class BookingDtoRequest {
1315

16+
@FutureOrPresent(message = "Дата начала бронирования не может быть раньше текущего времени")
1417
@NotNull(message = "Дата начала бронирования не может быть пустой")
1518
private LocalDateTime start;
19+
@Future(message = "Дата окончания бронирования не может быть раньше текущего времени")
1620
@NotNull(message = "Дата окончания бронирования не может быть пустой")
1721
private LocalDateTime end;
1822
@NotNull(message = "ID вещи не может быть пустым")

src/main/java/ru/practicum/shareit/booking/service/BookingServiceImpl.java

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,7 @@ public BookingDtoResponse getBookingById(Long userId, Long bookingId) {
4040
Booking booking = getBookingWithCheck(bookingId);
4141
checkBookingUserForGet(userId, booking.getBooker().getId(), booking.getItem().getOwner().getId());
4242
return BookingMapper.toBookingDtoResponse(
43-
getBookingWithCheck(bookingId),
43+
booking,
4444
UserMapper.toUserDto(booking.getBooker()),
4545
ItemMapper.toItemDto(booking.getItem()));
4646
}
@@ -169,33 +169,33 @@ public BookingDtoResponse updateBooking(Long userId, Long bookingId, Boolean app
169169
log.info("Подтверждение бронирования");
170170
Booking booking = getBookingWithCheck(bookingId);
171171
checkBookingUser(userId, booking.getItem().getOwner().getId());
172+
if (!booking.getStatus().equals(Status.WAITING)) {
173+
throw new ValidationException("Статус у бронирования должен быть \"В ожидании подтверждения\"");
174+
}
172175
userService.getUserWithCheck(userId);
173176
if (approved) {
174177
booking.setStatus(Status.APPROVED);
175178
} else {
176-
booking.setStatus(Status.APPROVED);
179+
booking.setStatus(Status.REJECTED);
177180
}
178181
return BookingMapper.toBookingDtoResponse(
179182
bookingRepository.save(booking),
180183
UserMapper.toUserDto(booking.getBooker()),
181184
ItemMapper.toItemDto(booking.getItem()));
182185
}
183186

184-
public Booking getBookingWithCheck(Long bookingId) {
187+
private Booking getBookingWithCheck(Long bookingId) {
185188
return bookingRepository.findById(bookingId)
186189
.orElseThrow(() -> new NotFoundException("Бронирование с ID = " + bookingId + " не найдено"));
187190
}
188191

189192
private void checkDates(LocalDateTime start, LocalDateTime end) {
190-
if (start.isBefore(LocalDateTime.now())) {
191-
throw new ValidationException("Дата начала бронирования не может быть раньше текущего времени");
192-
}
193-
if (end.isBefore(LocalDateTime.now())) {
194-
throw new ValidationException("Дата окончания бронирования не может быть раньше текущего времени");
195-
}
196193
if (start.isEqual(end)) {
197194
throw new ValidationException("Дата начала и дата окончания бронирования не могут быть равны");
198195
}
196+
if (start.isAfter(end)) {
197+
throw new ValidationException("Дата начала бронирования не может быть позже даты окончания бронирования");
198+
}
199199
}
200200

201201
private void checkBookingUser(Long userId, Long ownerItemId) {

src/main/java/ru/practicum/shareit/item/ItemController.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -50,7 +50,7 @@ public List<ItemDto> getItemsSearchByText(@RequestParam String text) {
5050

5151
@PostMapping("/{itemId}/comment")
5252
public CommentDto createCommet(
53-
@RequestBody CommentDto commentDto,
53+
@Valid @RequestBody CommentDto commentDto,
5454
@PathVariable Long itemId,
5555
@RequestHeader(userIdHeader) Long userId) {
5656
return itemService.createComment(itemId, userId, commentDto);

src/main/java/ru/practicum/shareit/item/dto/CommentDto.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package ru.practicum.shareit.item.dto;
22

3+
import jakarta.validation.constraints.NotBlank;
34
import lombok.AllArgsConstructor;
45
import lombok.Data;
56

@@ -9,6 +10,7 @@
910
@AllArgsConstructor
1011
public class CommentDto {
1112
private Long id;
13+
@NotBlank
1214
private String text;
1315
private String authorName;
1416
private LocalDateTime created;

src/main/java/ru/practicum/shareit/item/dto/ItemDto.java

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,11 +4,14 @@
44
import jakarta.validation.constraints.NotNull;
55
import lombok.AllArgsConstructor;
66
import lombok.Data;
7+
import lombok.NoArgsConstructor;
8+
import ru.practicum.shareit.booking.dto.BookingDtoResponse;
79

810
import java.util.List;
911

1012
@Data
1113
@AllArgsConstructor
14+
@NoArgsConstructor
1215
public class ItemDto {
1316
private Long id;
1417
@NotBlank(message = "Название не может быть пустым")
@@ -19,4 +22,14 @@ public class ItemDto {
1922
private Boolean available;
2023

2124
private List<CommentDto> comments;
25+
26+
private List<BookingDtoResponse> bookings;
27+
28+
public ItemDto(Long id, String name, String description, Boolean available, List<CommentDto> comments) {
29+
this.id = id;
30+
this.name = name;
31+
this.description = description;
32+
this.available = available;
33+
this.comments = comments;
34+
}
2235
}

src/main/java/ru/practicum/shareit/item/service/ItemServiceImpl.java

Lines changed: 24 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -24,10 +24,7 @@
2424
import ru.practicum.shareit.user.service.UserService;
2525

2626
import java.time.LocalDateTime;
27-
import java.util.ArrayList;
28-
import java.util.List;
29-
import java.util.Objects;
30-
import java.util.Optional;
27+
import java.util.*;
3128

3229
@Slf4j
3330
@Service
@@ -45,8 +42,13 @@ public List<ItemDto> getItemsByUserId(Long userId) {
4542
log.info("Поиск вещей пользователя с ID = {}", userId);
4643
User user = userService.getUserWithCheck(userId);
4744
List<Item> itemsByUserId = itemRepository.findAllByOwner(user);
45+
Map<Long, List<BookingDtoResponse>> bookingsByIdItem = getMapItemIdAndListBooking(
46+
itemsByUserId.stream()
47+
.map(Item::getId)
48+
.toList());
4849
return itemsByUserId.stream()
4950
.map(ItemMapper::toItemDto)
51+
.peek(item -> item.setBookings(bookingsByIdItem.get(item.getId())))
5052
.toList();
5153
}
5254

@@ -140,9 +142,6 @@ public CommentDto createComment(Long itemId, Long userId, CommentDto commentDto)
140142
User author = userService.getUserWithCheck(userId);
141143
Item item = getItemWithCheck(itemId);
142144
Comment comment = ItemMapper.toComment(commentDto, author, item);
143-
comment.setItem(item);
144-
comment.setAuthor(author);
145-
comment.setCreated(LocalDateTime.now());
146145
return ItemMapper.toCommentDto(commentRepository.save(comment));
147146
}
148147

@@ -152,4 +151,22 @@ private void checkUser(Item item, Long userIdFromRequest) {
152151
}
153152
}
154153

154+
private Map<Long, List<BookingDtoResponse>> getMapItemIdAndListBooking(List<Long> itemIds) {
155+
Map<Long, List<BookingDtoResponse>> map = new HashMap<>();
156+
List<BookingDtoResponse> bookings = bookingRepository.findAllByItemIdInOrderByStartDesc(itemIds).stream()
157+
.map(booking -> BookingMapper.toBookingDtoResponse(
158+
booking,
159+
UserMapper.toUserDto(booking.getBooker()),
160+
ItemMapper.toItemDto(booking.getItem())))
161+
.toList();
162+
bookings.forEach(booking -> {
163+
if (map.containsKey(booking.getItem().getId())) {
164+
map.get(booking.getItem().getId()).add(booking);
165+
} else {
166+
map.put(booking.getItem().getId(), new ArrayList<>(Arrays.asList(booking)));
167+
}
168+
});
169+
return map;
170+
}
171+
155172
}

0 commit comments

Comments
 (0)