Skip to content

Commit 1b0aefe

Browse files
committed
fix2
1 parent a7f6b82 commit 1b0aefe

12 files changed

Lines changed: 112 additions & 119 deletions

File tree

gateway/src/main/java/ru/practicum/shareit/booking/dto/BookItemRequestDto.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44

55
import jakarta.validation.constraints.Future;
66
import jakarta.validation.constraints.FutureOrPresent;
7+
import jakarta.validation.constraints.NotNull;
78
import lombok.AllArgsConstructor;
89
import lombok.Getter;
910
import lombok.NoArgsConstructor;
@@ -12,9 +13,14 @@
1213
@NoArgsConstructor
1314
@AllArgsConstructor
1415
public class BookItemRequestDto {
16+
@NotNull
1517
private long itemId;
18+
19+
@NotNull
1620
@FutureOrPresent
1721
private LocalDateTime start;
22+
23+
@NotNull
1824
@Future
1925
private LocalDateTime end;
2026
}
Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
package ru.practicum.shareit.booking.dto;
22

3-
import jakarta.validation.constraints.NotNull;
43
import lombok.AllArgsConstructor;
54
import lombok.Data;
65
import lombok.NoArgsConstructor;
@@ -11,12 +10,7 @@
1110
@NoArgsConstructor
1211
@AllArgsConstructor
1312
public class BookingCreateRequest {
14-
@NotNull(message = "ID вещи обязателен")
1513
private Long itemId;
16-
17-
@NotNull(message = "Дата начала бронирования обязательна")
1814
private LocalDateTime start;
19-
20-
@NotNull(message = "Дата окончания бронирования обязательна")
2115
private LocalDateTime end;
2216
}
Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,8 @@
11
package ru.practicum.shareit.item.dto;
22

3-
import jakarta.validation.constraints.NotBlank;
43
import lombok.Data;
54

65
@Data
76
public class CommentCreateRequest {
8-
@NotBlank(message = "Текст комментария не может быть пустым")
97
private String text;
108
}
Lines changed: 0 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,5 @@
11
package ru.practicum.shareit.item.dto;
22

3-
import jakarta.validation.constraints.NotBlank;
4-
import jakarta.validation.constraints.NotNull;
53
import lombok.AllArgsConstructor;
64
import lombok.Data;
75
import lombok.NoArgsConstructor;
@@ -10,13 +8,8 @@
108
@NoArgsConstructor
119
@AllArgsConstructor
1210
public class ItemCreateRequest {
13-
@NotBlank(message = "Название не может быть пустым")
1411
private String name;
15-
16-
@NotBlank(message = "Описание не может быть пустым")
1712
private String description;
18-
19-
@NotNull(message = "Статус доступности обязателен")
2013
private Boolean available;
2114
private Long requestId;
2215
}

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

Lines changed: 0 additions & 55 deletions
Original file line numberDiff line numberDiff line change
@@ -110,10 +110,8 @@ public List<ItemWithBookingsDto> getItemsByOwner(Long ownerId) {
110110
LocalDateTime now = LocalDateTime.now();
111111
List<Long> itemIds = items.stream().map(Item::getId).collect(Collectors.toList());
112112

113-
// Получаем все APPROVED бронирования для всех вещей владельца
114113
List<Booking> allApprovedBookings = bookingRepository.findAllByItemIdInAndStatusOrderByStartDesc(itemIds, BookingStatus.APPROVED);
115114

116-
// Группируем бронирования по вещам
117115
Map<Long, List<Booking>> bookingsByItem = allApprovedBookings.stream()
118116
.collect(Collectors.groupingBy(b -> b.getItem().getId()));
119117

@@ -123,13 +121,11 @@ public List<ItemWithBookingsDto> getItemsByOwner(Long ownerId) {
123121
for (Long itemId : itemIds) {
124122
List<Booking> itemBookings = bookingsByItem.getOrDefault(itemId, Collections.emptyList());
125123

126-
// Ищем последнее завершённое бронирование (end < now)
127124
Booking last = itemBookings.stream()
128125
.filter(b -> b.getEnd().isBefore(now))
129126
.max(Comparator.comparing(Booking::getEnd))
130127
.orElse(null);
131128

132-
// Ищем следующее будущее бронирование (start > now)
133129
Booking next = itemBookings.stream()
134130
.filter(b -> b.getStart().isAfter(now))
135131
.min(Comparator.comparing(Booking::getStart))
@@ -160,57 +156,6 @@ public List<ItemWithBookingsDto> getItemsByOwner(Long ownerId) {
160156
.collect(Collectors.toList());
161157
}
162158

163-
// @Override
164-
// public List<ItemWithBookingsDto> getItemsByOwner(Long ownerId) {
165-
// if (!userRepository.existsById(ownerId)) {
166-
// throw new NotFoundException("Пользователь не найден");
167-
// }
168-
//
169-
// List<Item> items = itemRepository.findByOwnerId(ownerId);
170-
// if (items.isEmpty()) {
171-
// return Collections.emptyList();
172-
// }
173-
//
174-
// LocalDateTime now = LocalDateTime.now();
175-
// List<Long> itemIds = items.stream().map(Item::getId).collect(Collectors.toList());
176-
//
177-
// List<Booking> lastBookings = bookingRepository.findAllLastBookings(itemIds, now);
178-
// Map<Long, BookingShortDto> lastBookingMap = lastBookings.stream()
179-
// .collect(Collectors.groupingBy(
180-
// b -> b.getItem().getId(),
181-
// Collectors.collectingAndThen(
182-
// Collectors.toList(),
183-
// list -> BookingMapper.toShortDto(list.get(0))
184-
// )
185-
// ));
186-
//
187-
// List<Booking> nextBookings = bookingRepository.findAllNextBookings(itemIds, now);
188-
// Map<Long, BookingShortDto> nextBookingMap = nextBookings.stream()
189-
// .collect(Collectors.groupingBy(
190-
// b -> b.getItem().getId(),
191-
// Collectors.collectingAndThen(
192-
// Collectors.toList(),
193-
// list -> BookingMapper.toShortDto(list.get(0))
194-
// )
195-
// ));
196-
//
197-
// List<Comment> comments = commentRepository.findByItemIdIn(itemIds);
198-
// Map<Long, List<CommentResponseDto>> commentsByItemId = comments.stream()
199-
// .collect(Collectors.groupingBy(
200-
// c -> c.getItem().getId(),
201-
// Collectors.mapping(CommentMapper::toResponseDto, Collectors.toList())
202-
// ));
203-
//
204-
// return items.stream()
205-
// .map(item -> ItemMapper.toWithBookingsDto(
206-
// item,
207-
// lastBookingMap.get(item.getId()),
208-
// nextBookingMap.get(item.getId()),
209-
// commentsByItemId.getOrDefault(item.getId(), Collections.emptyList())
210-
// ))
211-
// .collect(Collectors.toList());
212-
// }
213-
214159
@Override
215160
public List<ItemResponseDto> searchItems(String text) {
216161
if (text == null || text.trim().isEmpty()) {

server/src/main/java/ru/practicum/shareit/item/storage/ItemRepository.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,4 +16,6 @@ public interface ItemRepository extends JpaRepository<Item, Long> {
1616
List<Item> search(@Param("text") String text);
1717

1818
List<Item> findByRequestId(Long requestId);
19+
20+
List<Item> findByRequestIdIn(List<Long> requestIds);
1921
}
Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
package ru.practicum.shareit.request.dto;
22

3-
import jakarta.validation.constraints.NotBlank;
43
import lombok.AllArgsConstructor;
54
import lombok.Data;
65
import lombok.NoArgsConstructor;
@@ -9,6 +8,5 @@
98
@NoArgsConstructor
109
@AllArgsConstructor
1110
public class ItemRequestCreateRequest {
12-
@NotBlank(message = "Описание запроса не может быть пустым")
1311
private String description;
1412
}

server/src/main/java/ru/practicum/shareit/request/service/ItemRequestServiceImpl.java

Lines changed: 30 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,9 @@
1111
import ru.practicum.shareit.user.model.User;
1212
import ru.practicum.shareit.user.storage.UserRepository;
1313

14+
import java.util.Collections;
1415
import java.util.List;
16+
import java.util.Map;
1517
import java.util.stream.Collectors;
1618

1719
@Service
@@ -55,10 +57,22 @@ public List<ItemRequestResponseDto> getOwnRequests(Long userId) {
5557
throw new NotFoundException("Пользователь с id " + userId + " не найден");
5658
}
5759
List<ItemRequest> requests = requestRepository.findByRequestorIdOrderByCreatedDesc(userId);
60+
if (requests.isEmpty()) {
61+
return Collections.emptyList();
62+
}
63+
64+
List<Long> requestIds = requests.stream()
65+
.map(ItemRequest::getId)
66+
.collect(Collectors.toList());
67+
68+
List<Item> items = itemRepository.findByRequestIdIn(requestIds);
69+
Map<Long, List<Item>> itemsByRequestId = items.stream()
70+
.collect(Collectors.groupingBy(item -> item.getRequest().getId()));
71+
5872
return requests.stream()
5973
.map(request -> {
60-
List<Item> items = itemRepository.findByRequestId(request.getId());
61-
return ItemRequestMapper.toResponseDtoWithItems(request, items);
74+
List<Item> itemsForRequest = itemsByRequestId.getOrDefault(request.getId(), Collections.emptyList());
75+
return ItemRequestMapper.toResponseDtoWithItems(request, itemsForRequest);
6276
})
6377
.collect(Collectors.toList());
6478
}
@@ -69,10 +83,22 @@ public List<ItemRequestResponseDto> getOtherRequests(Long userId) {
6983
throw new NotFoundException("Пользователь с id " + userId + " не найден");
7084
}
7185
List<ItemRequest> requests = requestRepository.findByRequestorIdNotOrderByCreatedDesc(userId);
86+
if (requests.isEmpty()) {
87+
return Collections.emptyList();
88+
}
89+
90+
List<Long> requestIds = requests.stream()
91+
.map(ItemRequest::getId)
92+
.collect(Collectors.toList());
93+
94+
List<Item> items = itemRepository.findByRequestIdIn(requestIds);
95+
Map<Long, List<Item>> itemsByRequestId = items.stream()
96+
.collect(Collectors.groupingBy(item -> item.getRequest().getId()));
97+
7298
return requests.stream()
7399
.map(request -> {
74-
List<Item> items = itemRepository.findByRequestId(request.getId());
75-
return ItemRequestMapper.toResponseDtoWithItems(request, items);
100+
List<Item> itemsForRequest = itemsByRequestId.getOrDefault(request.getId(), Collections.emptyList());
101+
return ItemRequestMapper.toResponseDtoWithItems(request, itemsForRequest);
76102
})
77103
.collect(Collectors.toList());
78104
}
Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,5 @@
11
package ru.practicum.shareit.user.dto;
22

3-
import jakarta.validation.constraints.Email;
4-
import jakarta.validation.constraints.NotBlank;
53
import lombok.AllArgsConstructor;
64
import lombok.Data;
75
import lombok.NoArgsConstructor;
@@ -11,10 +9,6 @@
119
@AllArgsConstructor
1210
public class UserCreateRequest {
1311
private Long id;
14-
@NotBlank(message = "Имя не может быть пустым")
1512
private String name;
16-
17-
@NotBlank(message = "Email не может быть пустым")
18-
@Email(message = "Некорректный формат email")
1913
private String email;
2014
}

server/src/test/java/ru/practicum/shareit/booking/service/BookingServiceImplIntegrationTest.java

Lines changed: 35 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -9,14 +9,16 @@
99
import ru.practicum.shareit.booking.dto.BookingCreateRequest;
1010
import ru.practicum.shareit.booking.dto.BookingResponseDto;
1111
import ru.practicum.shareit.booking.dto.BookingState;
12+
import ru.practicum.shareit.booking.model.Booking;
1213
import ru.practicum.shareit.booking.model.BookingStatus;
14+
import ru.practicum.shareit.booking.storage.BookingRepository;
1315
import ru.practicum.shareit.exception.AccessDeniedException;
1416
import ru.practicum.shareit.exception.NotFoundException;
1517
import ru.practicum.shareit.exception.ValidationException;
16-
import ru.practicum.shareit.item.dto.ItemCreateRequest;
17-
import ru.practicum.shareit.item.service.ItemService;
18-
import ru.practicum.shareit.user.dto.UserCreateRequest;
19-
import ru.practicum.shareit.user.service.UserService;
18+
import ru.practicum.shareit.item.model.Item;
19+
import ru.practicum.shareit.item.storage.ItemRepository;
20+
import ru.practicum.shareit.user.model.User;
21+
import ru.practicum.shareit.user.storage.UserRepository;
2022

2123
import java.time.LocalDateTime;
2224
import java.util.List;
@@ -33,25 +35,36 @@ class BookingServiceImplIntegrationTest {
3335
private BookingService bookingService;
3436

3537
@Autowired
36-
private UserService userService;
38+
private UserRepository userRepository;
3739

3840
@Autowired
39-
private ItemService itemService;
41+
private ItemRepository itemRepository;
4042

4143
private Long ownerId;
4244
private Long bookerId;
4345
private Long itemId;
4446

4547
@BeforeEach
4648
void setUp() {
47-
UserCreateRequest ownerRequest = new UserCreateRequest(null, "Владелец", "owner@example.com");
48-
ownerId = userService.createUser(ownerRequest).getId();
49-
50-
ItemCreateRequest itemCreateRequest = new ItemCreateRequest("Молоток", "Тяжелый молоток", true, null);
51-
itemId = itemService.createItem(ownerId, itemCreateRequest).getId();
52-
53-
UserCreateRequest bookerRequest = new UserCreateRequest(null, "Бронирующий", "booker@example.com");
54-
bookerId = userService.createUser(bookerRequest).getId();
49+
User owner = new User();
50+
owner.setName("Владелец");
51+
owner.setEmail("owner@example.com");
52+
owner = userRepository.save(owner);
53+
ownerId = owner.getId();
54+
55+
Item item = new Item();
56+
item.setName("Молоток");
57+
item.setDescription("Тяжелый молоток");
58+
item.setAvailable(true);
59+
item.setOwner(owner);
60+
item = itemRepository.save(item);
61+
itemId = item.getId();
62+
63+
User booker = new User();
64+
booker.setName("Бронирующий");
65+
booker.setEmail("booker@example.com");
66+
booker = userRepository.save(booker);
67+
bookerId = booker.getId();
5568
}
5669

5770
@Test
@@ -88,8 +101,13 @@ void createBooking_ownItem_shouldThrow() {
88101

89102
@Test
90103
void createBooking_itemNotAvailable_shouldThrow() {
91-
ItemCreateRequest itemCreateRequest = new ItemCreateRequest("Молоток", "Тяжелый молоток", false, null);
92-
Long unavailableItemId = itemService.createItem(ownerId, itemCreateRequest).getId();
104+
Item unavailableItem = new Item();
105+
unavailableItem.setName("Недоступная вещь");
106+
unavailableItem.setDescription("Описание");
107+
unavailableItem.setAvailable(false);
108+
unavailableItem.setOwner(userRepository.findById(ownerId).orElseThrow());
109+
unavailableItem = itemRepository.save(unavailableItem);
110+
Long unavailableItemId = unavailableItem.getId();
93111

94112
LocalDateTime now = LocalDateTime.now();
95113
BookingCreateRequest createRequest = new BookingCreateRequest(
@@ -192,4 +210,4 @@ void getOwnerBookings_shouldReturnList() {
192210

193211
assertThat(bookings).hasSize(1);
194212
}
195-
}
213+
}

0 commit comments

Comments
 (0)