From 3a2e8cb780fbff72540c45702a9e6fcc9d59a0db Mon Sep 17 00:00:00 2001 From: Just Roma Date: Fri, 27 Jun 2025 15:44:21 +0500 Subject: [PATCH 1/8] add requests --- .../shareit/booking/BookingRepository.java | 2 +- .../ru/practicum/shareit/item/ItemMapper.java | 16 ++--- .../shareit/item/dto/ItemCreateDto.java | 1 + .../practicum/shareit/item/dto/ItemDto.java | 20 +++--- .../ru/practicum/shareit/item/model/Item.java | 5 +- .../shareit/item/service/ItemServiceImpl.java | 10 ++- .../shareit/request/ItemRequest.java | 23 ++++--- .../request/ItemRequestController.java | 40 ++++++++++-- .../shareit/request/ItemRequestMapper.java | 45 +++++++++++++ .../request/ItemRequestRepository.java | 27 ++++++++ .../request/dto/ItemRequestCreateDto.java | 15 +++++ .../shareit/request/dto/ItemRequestDto.java | 21 +++++-- .../request/service/ItemRequestService.java | 17 +++++ .../service/ItemRequestServiceImpl.java | 63 +++++++++++++++++++ .../practicum/shareit/user/dto/UserDto.java | 16 +++-- src/main/resources/schema.sql | 10 +-- 16 files changed, 284 insertions(+), 47 deletions(-) create mode 100644 src/main/java/ru/practicum/shareit/request/ItemRequestMapper.java create mode 100644 src/main/java/ru/practicum/shareit/request/ItemRequestRepository.java create mode 100644 src/main/java/ru/practicum/shareit/request/dto/ItemRequestCreateDto.java create mode 100644 src/main/java/ru/practicum/shareit/request/service/ItemRequestService.java create mode 100644 src/main/java/ru/practicum/shareit/request/service/ItemRequestServiceImpl.java diff --git a/src/main/java/ru/practicum/shareit/booking/BookingRepository.java b/src/main/java/ru/practicum/shareit/booking/BookingRepository.java index 4838242..ddc3094 100644 --- a/src/main/java/ru/practicum/shareit/booking/BookingRepository.java +++ b/src/main/java/ru/practicum/shareit/booking/BookingRepository.java @@ -15,7 +15,7 @@ SELECT EXISTS ( WHERE item_id = :itemId AND booker_id = :userId AND status = 'APPROVED' - AND end_time < CURRENT_TIMESTAMP + AND end_time < CURRENT_TIMESTAMP + INTERVAL '1 seconds' )""", nativeQuery = true) boolean hasUserBookedItem(@Param("userId") Long userId, @Param("itemId") Long itemId); diff --git a/src/main/java/ru/practicum/shareit/item/ItemMapper.java b/src/main/java/ru/practicum/shareit/item/ItemMapper.java index 088edeb..b2ae294 100644 --- a/src/main/java/ru/practicum/shareit/item/ItemMapper.java +++ b/src/main/java/ru/practicum/shareit/item/ItemMapper.java @@ -6,6 +6,8 @@ import ru.practicum.shareit.item.dto.ItemDto; import ru.practicum.shareit.item.dto.ItemUpdateDto; import ru.practicum.shareit.item.model.Item; +import ru.practicum.shareit.request.dto.ItemRequestDto; +import ru.practicum.shareit.user.UserMapper; import ru.practicum.shareit.user.dto.UserDto; import java.util.ArrayList; @@ -14,6 +16,7 @@ @RequiredArgsConstructor @Component public class ItemMapper { + private final UserMapper userMapper; public Item createDtoToModel(ItemCreateDto dto) { return Item.builder() @@ -38,18 +41,17 @@ public ItemDto modelToItemDto(Item item) { .name(item.getName()) .description(item.getDescription()) .available(item.getAvailable()) - .owner(UserDto.builder() - .id(item.getOwner().getId()) - .name(item.getOwner().getName()) - .email(item.getOwner().getEmail()) - .build()) + .owner(userMapper.modelToDto(item.getOwner())) + .request(item.getRequest() != null ? item.getRequest().getId() : null) .build(); } public List listModelToDto(List items) { List list = new ArrayList<>(); - for (Item item : items) { - list.add(modelToItemDto(item)); + if (items != null) { + for (Item item : items) { + list.add(modelToItemDto(item)); + } } return list; } diff --git a/src/main/java/ru/practicum/shareit/item/dto/ItemCreateDto.java b/src/main/java/ru/practicum/shareit/item/dto/ItemCreateDto.java index ed2d63d..a9b9043 100644 --- a/src/main/java/ru/practicum/shareit/item/dto/ItemCreateDto.java +++ b/src/main/java/ru/practicum/shareit/item/dto/ItemCreateDto.java @@ -16,4 +16,5 @@ public class ItemCreateDto { @NotNull private Boolean available; private Long owner; + private Long requestId; } diff --git a/src/main/java/ru/practicum/shareit/item/dto/ItemDto.java b/src/main/java/ru/practicum/shareit/item/dto/ItemDto.java index 378ad89..d946e52 100644 --- a/src/main/java/ru/practicum/shareit/item/dto/ItemDto.java +++ b/src/main/java/ru/practicum/shareit/item/dto/ItemDto.java @@ -1,21 +1,27 @@ package ru.practicum.shareit.item.dto; -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.Getter; -import lombok.Setter; +import lombok.*; +import ru.practicum.shareit.request.dto.ItemRequestDto; import ru.practicum.shareit.user.dto.UserDto; - -@Builder +@AllArgsConstructor +@NoArgsConstructor @Getter @Setter -@AllArgsConstructor +@Builder public class ItemDto { private Long id; private String name; private String description; private Boolean available; private UserDto owner; + private Long request; + public ItemDto(Long id, String name, String description, Boolean available, UserDto owner) { + this.id = id; + this.name = name; + this.description = description; + this.available = available; + this.owner = owner; + } } diff --git a/src/main/java/ru/practicum/shareit/item/model/Item.java b/src/main/java/ru/practicum/shareit/item/model/Item.java index dc6145a..8b96f5f 100644 --- a/src/main/java/ru/practicum/shareit/item/model/Item.java +++ b/src/main/java/ru/practicum/shareit/item/model/Item.java @@ -2,6 +2,7 @@ import jakarta.persistence.*; import lombok.*; +import ru.practicum.shareit.request.ItemRequest; import ru.practicum.shareit.user.User; @AllArgsConstructor @@ -29,5 +30,7 @@ public class Item { @JoinColumn(name = "owner_id") private User owner; - + @ManyToOne(fetch = FetchType.LAZY) + @JoinColumn(name = "request_id") + private ItemRequest request; } diff --git a/src/main/java/ru/practicum/shareit/item/service/ItemServiceImpl.java b/src/main/java/ru/practicum/shareit/item/service/ItemServiceImpl.java index 6638ba9..48dedc0 100644 --- a/src/main/java/ru/practicum/shareit/item/service/ItemServiceImpl.java +++ b/src/main/java/ru/practicum/shareit/item/service/ItemServiceImpl.java @@ -13,6 +13,8 @@ import ru.practicum.shareit.item.model.Item; import ru.practicum.shareit.item.repository.CommentRepository; import ru.practicum.shareit.item.repository.ItemRepository; +import ru.practicum.shareit.request.ItemRequest; +import ru.practicum.shareit.request.ItemRequestRepository; import ru.practicum.shareit.user.User; import ru.practicum.shareit.user.UserRepository; @@ -30,6 +32,7 @@ public class ItemServiceImpl implements ItemService { private final ItemMapper itemMapper; private final CommentMapper commentMapper; private final CommentRepository commentRepository; + private final ItemRequestRepository itemRequestRepository; @Override public CommentDtoReturn createComment(long authorId, long itemId, CommentCreateDto createDto) { @@ -65,7 +68,6 @@ public List findAllByOwnerIdWithBookings(Long ownerId) { if (items.isEmpty()) { throw new NotFoundException("У пользователя с ID " + ownerId + " нет вещей"); } - List itemIds = items.stream() .map(ItemCommentDto::getId) .collect(Collectors.toList()); @@ -76,7 +78,6 @@ public List findAllByOwnerIdWithBookings(Long ownerId) { comment -> comment.getItem().getId(), Collectors.toList() )); - items.forEach(item -> item.setComments(commentsMap.getOrDefault(item.getId(), Collections.emptyList())) ); @@ -88,6 +89,11 @@ public ItemDto createItem(ItemCreateDto createDto, long ownerId) { Item item = itemMapper.createDtoToModel(createDto); User user = checkAndReturnUser(ownerId); item.setOwner(user); + if (createDto.getRequestId() != null) { + ItemRequest itemRequest = itemRequestRepository.findById(createDto.getRequestId()) + .orElseThrow(() -> new NotFoundException("ItemRequest не найден")); + item.setRequest(itemRequest); + } return itemMapper.modelToItemDto(itemRepository.save(item)); } diff --git a/src/main/java/ru/practicum/shareit/request/ItemRequest.java b/src/main/java/ru/practicum/shareit/request/ItemRequest.java index 1bd5ea1..0bcb548 100644 --- a/src/main/java/ru/practicum/shareit/request/ItemRequest.java +++ b/src/main/java/ru/practicum/shareit/request/ItemRequest.java @@ -3,10 +3,15 @@ import jakarta.persistence.*; import lombok.*; +import ru.practicum.shareit.item.dto.ItemDto; +import ru.practicum.shareit.item.model.Item; +import ru.practicum.shareit.user.User; import java.time.LocalDateTime; +import java.util.List; - +@AllArgsConstructor +@NoArgsConstructor @Builder @Getter @Setter @@ -18,16 +23,16 @@ public class ItemRequest { @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; + @Column(nullable = false) private String description; - @Column(name = "requestor", nullable = false) - private Long requestor; + @ManyToOne(fetch = FetchType.EAGER) + @JoinColumn(name = "requestor_id", nullable = false) + private User requestor; - @Column(name = "time_request", nullable = false) - private LocalDateTime dateTimeRequest; + @Column(name = "created", nullable = false) + private LocalDateTime created; - @Override - public int hashCode() { - return getClass().hashCode(); - } + @OneToMany(mappedBy = "request", cascade = CascadeType.ALL) + private List items; } diff --git a/src/main/java/ru/practicum/shareit/request/ItemRequestController.java b/src/main/java/ru/practicum/shareit/request/ItemRequestController.java index 064e2e9..f146749 100644 --- a/src/main/java/ru/practicum/shareit/request/ItemRequestController.java +++ b/src/main/java/ru/practicum/shareit/request/ItemRequestController.java @@ -1,12 +1,42 @@ package ru.practicum.shareit.request; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; +import lombok.RequiredArgsConstructor; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; +import ru.practicum.shareit.request.dto.ItemRequestCreateDto; +import ru.practicum.shareit.request.dto.ItemRequestDto; +import ru.practicum.shareit.request.service.ItemRequestService; -/** - * TODO Sprint add-item-requests. - */ +import java.util.List; + + +@Validated +@RequiredArgsConstructor @RestController @RequestMapping(path = "/requests") public class ItemRequestController { + private final ItemRequestService itemRequestService; + + @PostMapping + public ItemRequestDto createItemRequest(@RequestHeader("X-Sharer-User-Id") Long userId, + @Validated @RequestBody ItemRequestCreateDto createDto) { + return itemRequestService.createItemRequest(userId, createDto); + } + + @GetMapping + public List getItemRequestsByUserId(@RequestHeader("X-Sharer-User-Id") Long userId) { + return itemRequestService.getItemRequestsByUserId(userId); + } + + @GetMapping("/all") + public List getItemRequestsByNotUserId(@RequestHeader("X-Sharer-User-Id") Long userId) { + return itemRequestService.getItemRequestsByNotUserId(userId); + } + + @GetMapping("{requestId}") + public ItemRequestDto getItemRequestById(@RequestHeader("X-Sharer-User-Id") Long userId, + @PathVariable Long requestId) { + return itemRequestService.getItemRequestById(requestId); + } + } diff --git a/src/main/java/ru/practicum/shareit/request/ItemRequestMapper.java b/src/main/java/ru/practicum/shareit/request/ItemRequestMapper.java new file mode 100644 index 0000000..fbbda5c --- /dev/null +++ b/src/main/java/ru/practicum/shareit/request/ItemRequestMapper.java @@ -0,0 +1,45 @@ +package ru.practicum.shareit.request; + +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Component; +import ru.practicum.shareit.item.ItemMapper; +import ru.practicum.shareit.request.dto.ItemRequestCreateDto; +import ru.practicum.shareit.request.dto.ItemRequestDto; +import ru.practicum.shareit.user.UserMapper; + +import java.time.LocalDateTime; +import java.util.ArrayList; +import java.util.List; + +@RequiredArgsConstructor +@Component +public class ItemRequestMapper { + private final UserMapper userMapper; + private final ItemMapper itemMapper; + + public ItemRequest itemRequestCreateDtoToModel(ItemRequestCreateDto createDto) { + return ItemRequest.builder() + .description(createDto.getDescription()) + .created(LocalDateTime.now()) + .build(); + } + + public ItemRequestDto modelToItemRequestDto (ItemRequest itemRequest) { + return ItemRequestDto.builder() + .id(itemRequest.getId()) + .description(itemRequest.getDescription()) + .requestor(userMapper.modelToDto(itemRequest.getRequestor())) + .created(itemRequest.getCreated()) + .items(itemMapper.listModelToDto(itemRequest.getItems())) + .build(); + } + + public List listModelToItemRequestDto(List requests) { + List listDto = new ArrayList<>(); + for (ItemRequest request: requests) { + listDto.add(modelToItemRequestDto(request)); + } + return listDto; + } + +} diff --git a/src/main/java/ru/practicum/shareit/request/ItemRequestRepository.java b/src/main/java/ru/practicum/shareit/request/ItemRequestRepository.java new file mode 100644 index 0000000..8625f97 --- /dev/null +++ b/src/main/java/ru/practicum/shareit/request/ItemRequestRepository.java @@ -0,0 +1,27 @@ +package ru.practicum.shareit.request; + +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.data.jpa.repository.Query; +import org.springframework.data.repository.query.Param; + +import java.util.List; + +public interface ItemRequestRepository extends JpaRepository { + + @Query(""" + SELECT ir + FROM ItemRequest ir + WHERE ir.requestor.id = :requestorId + ORDER BY ir.created DESC + """) + List findAllByRequestorIdSorted(@Param("requestorId") Long requestorId); + + @Query(""" + SELECT ir + FROM ItemRequest ir + WHERE ir.requestor.id <> :requestorId + ORDER BY ir.created DESC + """) + List findAllByRequestorIdNotSorted(@Param("requestorId") Long requestorId); + +} diff --git a/src/main/java/ru/practicum/shareit/request/dto/ItemRequestCreateDto.java b/src/main/java/ru/practicum/shareit/request/dto/ItemRequestCreateDto.java new file mode 100644 index 0000000..9156b56 --- /dev/null +++ b/src/main/java/ru/practicum/shareit/request/dto/ItemRequestCreateDto.java @@ -0,0 +1,15 @@ +package ru.practicum.shareit.request.dto; + + +import jakarta.validation.constraints.NotBlank; +import jakarta.validation.constraints.NotNull; +import lombok.*; + + +@Getter +@Setter +public class ItemRequestCreateDto { + @NotNull + @NotBlank + private String description; +} diff --git a/src/main/java/ru/practicum/shareit/request/dto/ItemRequestDto.java b/src/main/java/ru/practicum/shareit/request/dto/ItemRequestDto.java index a30555e..17ece4b 100644 --- a/src/main/java/ru/practicum/shareit/request/dto/ItemRequestDto.java +++ b/src/main/java/ru/practicum/shareit/request/dto/ItemRequestDto.java @@ -1,14 +1,25 @@ package ru.practicum.shareit.request.dto; - -import lombok.Data; +import com.fasterxml.jackson.annotation.JsonIgnore; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Getter; +import lombok.Setter; +import ru.practicum.shareit.item.dto.ItemDto; +import ru.practicum.shareit.user.dto.UserDto; import java.time.LocalDateTime; +import java.util.List; -@Data +@Builder +@Getter +@Setter +@AllArgsConstructor public class ItemRequestDto { private Long id; private String description; - private Long requestor; - private LocalDateTime dateTimeRequest; + private UserDto requestor; + private LocalDateTime created; + + private List items; } diff --git a/src/main/java/ru/practicum/shareit/request/service/ItemRequestService.java b/src/main/java/ru/practicum/shareit/request/service/ItemRequestService.java new file mode 100644 index 0000000..e72ef78 --- /dev/null +++ b/src/main/java/ru/practicum/shareit/request/service/ItemRequestService.java @@ -0,0 +1,17 @@ +package ru.practicum.shareit.request.service; + +import ru.practicum.shareit.request.dto.ItemRequestCreateDto; +import ru.practicum.shareit.request.dto.ItemRequestDto; + +import java.util.List; + +public interface ItemRequestService { + + ItemRequestDto createItemRequest(long requestorId, ItemRequestCreateDto createDto); + + List getItemRequestsByUserId(long requestorId); + + List getItemRequestsByNotUserId(long requestorId); + + ItemRequestDto getItemRequestById(long itemRequestId); +} diff --git a/src/main/java/ru/practicum/shareit/request/service/ItemRequestServiceImpl.java b/src/main/java/ru/practicum/shareit/request/service/ItemRequestServiceImpl.java new file mode 100644 index 0000000..6db60af --- /dev/null +++ b/src/main/java/ru/practicum/shareit/request/service/ItemRequestServiceImpl.java @@ -0,0 +1,63 @@ +package ru.practicum.shareit.request.service; + +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; +import ru.practicum.shareit.exception.NotFoundException; +import ru.practicum.shareit.request.ItemRequest; +import ru.practicum.shareit.request.ItemRequestMapper; +import ru.practicum.shareit.request.ItemRequestRepository; +import ru.practicum.shareit.request.dto.ItemRequestCreateDto; +import ru.practicum.shareit.request.dto.ItemRequestDto; +import ru.practicum.shareit.user.User; +import ru.practicum.shareit.user.UserRepository; + +import java.util.List; + +@Service +@RequiredArgsConstructor +public class ItemRequestServiceImpl implements ItemRequestService { + private final ItemRequestRepository itemRequestRepository; + private final UserRepository userRepository; + private final ItemRequestMapper itemRequestMapper; + + @Override + public ItemRequestDto createItemRequest(long requestorId, ItemRequestCreateDto createDto) { + User requestor = checkAndReturnUser(requestorId); + ItemRequest itemRequest = itemRequestMapper.itemRequestCreateDtoToModel(createDto); + itemRequest.setRequestor(requestor); + itemRequest = itemRequestRepository.save(itemRequest); + return itemRequestMapper.modelToItemRequestDto(itemRequest); + } + + @Override + public List getItemRequestsByUserId(long requestorId) { + checkAndReturnUser(requestorId); + List requests = itemRequestRepository.findAllByRequestorIdSorted(requestorId); + if (requests.isEmpty()) { + throw new NotFoundException("У пользователя с ID " + requestorId + " нет запросов"); + } + return itemRequestMapper.listModelToItemRequestDto(requests); + } + + @Override + public List getItemRequestsByNotUserId(long requestorId) { + checkAndReturnUser(requestorId); + List requests = itemRequestRepository.findAllByRequestorIdNotSorted(requestorId); + if (requests.isEmpty()) { + throw new NotFoundException("У пользователя с ID " + requestorId + " нет запросов"); + } + return itemRequestMapper.listModelToItemRequestDto(requests); + } + + @Override + public ItemRequestDto getItemRequestById(long itemRequestId) { + ItemRequest itemRequest = itemRequestRepository.findById(itemRequestId) + .orElseThrow(() -> new NotFoundException("ItemRequest не найден")); + return itemRequestMapper.modelToItemRequestDto(itemRequest); + } + + private User checkAndReturnUser(long id) { + return userRepository.findById(id).orElseThrow(() -> new NotFoundException("User не найден")); + } + +} diff --git a/src/main/java/ru/practicum/shareit/user/dto/UserDto.java b/src/main/java/ru/practicum/shareit/user/dto/UserDto.java index babd3d4..aa7700f 100644 --- a/src/main/java/ru/practicum/shareit/user/dto/UserDto.java +++ b/src/main/java/ru/practicum/shareit/user/dto/UserDto.java @@ -1,16 +1,20 @@ package ru.practicum.shareit.user.dto; -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.Data; -import lombok.NoArgsConstructor; +import lombok.*; + -@AllArgsConstructor @NoArgsConstructor -@Data +@Getter +@Setter @Builder public class UserDto { private Long id; private String name; private String email; + + public UserDto(Long id, String name, String email) { + this.id = id; + this.name = name; + this.email = email; + } } diff --git a/src/main/resources/schema.sql b/src/main/resources/schema.sql index 9e5a425..4cd0b8b 100644 --- a/src/main/resources/schema.sql +++ b/src/main/resources/schema.sql @@ -8,10 +8,10 @@ CREATE TABLE IF NOT EXISTS users ( CREATE TABLE IF NOT EXISTS requests ( id INTEGER GENERATED BY DEFAULT AS IDENTITY PRIMARY KEY, - description VARCHAR(255), - requestor INTEGER NOT NULL, - time_request TIMESTAMP WITHOUT TIME ZONE, - FOREIGN KEY (requestor) REFERENCES users(id) ON DELETE CASCADE + description VARCHAR(255) NOT NULL, + requestor_id INTEGER NOT NULL, + created TIMESTAMP WITHOUT TIME ZONE, + FOREIGN KEY (requestor_id) REFERENCES users(id) ON DELETE CASCADE ); CREATE TABLE IF NOT EXISTS items ( @@ -20,6 +20,8 @@ CREATE TABLE IF NOT EXISTS items ( description VARCHAR(255), available boolean NOT NULL, owner_id INTEGER NOT NULL, + request_id INTEGER, + FOREIGN KEY (request_id) REFERENCES requests(id), FOREIGN KEY (owner_id) REFERENCES users(id) ON DELETE CASCADE ); From 9f57bdf8fa531dc0d83f3f6aa9857fc0470f7e93 Mon Sep 17 00:00:00 2001 From: Just Roma Date: Sat, 28 Jun 2025 20:11:47 +0500 Subject: [PATCH 2/8] add shareIt-server and shareIt-gateway --- .run/ShareItGateway.run.xml | 15 +++ .run/ShareItServer.run.xml | 17 +++ docker-compose.yml | 39 ++++++ gateway/Dockerfile | 5 + gateway/pom.xml | 75 +++++++++++ .../ru/practicum/shareit/ShareItGateway.java | 12 ++ .../shareit/booking/BookingClient.java | 63 +++++++++ .../shareit/booking/BookingController.java | 67 ++++++++++ .../shareit/booking/dto/BookingCreateDto.java | 40 ++++++ .../shareit/booking/dto/BookingState.java | 27 ++++ .../practicum/shareit/client/BaseClient.java | 123 ++++++++++++++++++ .../ru/practicum/shareit/item/ItemClient.java | 59 +++++++++ .../shareit/item/ItemController.java | 65 +++++++++ .../shareit/item/dto/CommentCreateDto.java | 0 .../shareit/item/dto/ItemCreateDto.java | 0 .../shareit/item/dto/ItemUpdateDto.java | 0 .../shareit/request/ItemRequestClient.java | 44 +++++++ .../request/ItemRequestController.java | 46 +++++++ .../request/dto/ItemRequestCreateDto.java | 3 +- .../ru/practicum/shareit/user/UserClient.java | 50 +++++++ .../shareit/user/UserController.java | 55 ++++++++ .../shareit/user/dto/UserCreateDto.java | 0 .../shareit/user/dto/UserUpdateDto.java | 0 .../src/main/resources/application.properties | 7 + pom.xml | 110 +++------------- server/Dockerfile | 5 + server/pom.xml | 91 +++++++++++++ .../ru/practicum/shareit/ShareItServer.java | 8 +- .../ru/practicum/shareit/booking/Booking.java | 0 .../shareit/booking/BookingController.java | 5 +- .../shareit/booking/BookingMapper.java | 0 .../shareit/booking/BookingRepository.java | 0 .../shareit/booking/BookingStatus.java | 0 .../shareit/booking/dto/BookingCreateDto.java | 14 ++ .../shareit/booking/dto/BookingDto.java | 0 .../booking/service/BookingService.java | 0 .../booking/service/BookingServiceImpl.java | 0 .../exception/BadRequestException.java | 0 .../shareit/exception/ConflictException.java | 0 .../shareit/exception/ErrorHandler.java | 0 .../shareit/exception/ErrorResponse.java | 0 .../InternalServerErrorException.java | 0 .../shareit/exception/NotFoundException.java | 0 .../exception/ValidationException.java | 0 .../practicum/shareit/item/CommentMapper.java | 0 .../shareit/item/ItemController.java | 24 ++-- .../ru/practicum/shareit/item/ItemMapper.java | 0 .../shareit/item/dto/CommentCreateDto.java | 11 ++ .../shareit/item/dto/CommentDto.java | 0 .../shareit/item/dto/CommentDtoReturn.java | 0 .../shareit/item/dto/ItemCommentDto.java | 0 .../shareit/item/dto/ItemCreateDto.java | 14 ++ .../practicum/shareit/item/dto/ItemDto.java | 0 .../shareit/item/dto/ItemUpdateDto.java | 12 ++ .../practicum/shareit/item/model/Comment.java | 0 .../ru/practicum/shareit/item/model/Item.java | 0 .../item/repository/CommentRepository.java | 0 .../item/repository/ItemRepository.java | 2 +- .../shareit/item/service/ItemService.java | 4 +- .../shareit/item/service/ItemServiceImpl.java | 6 +- .../shareit/request/ItemRequest.java | 0 .../request/ItemRequestController.java | 4 +- .../shareit/request/ItemRequestMapper.java | 0 .../request/ItemRequestRepository.java | 0 .../request/dto/ItemRequestCreateDto.java | 12 ++ .../shareit/request/dto/ItemRequestDto.java | 0 .../request/service/ItemRequestService.java | 0 .../service/ItemRequestServiceImpl.java | 0 .../java/ru/practicum/shareit/user/User.java | 0 .../shareit/user/UserController.java | 8 +- .../ru/practicum/shareit/user/UserMapper.java | 0 .../shareit/user/UserRepository.java | 0 .../shareit/user/dto/UserCreateDto.java | 9 ++ .../practicum/shareit/user/dto/UserDto.java | 0 .../shareit/user/dto/UserUpdateDto.java | 9 ++ .../shareit/user/service/UserService.java | 0 .../shareit/user/service/UserServiceImpl.java | 0 .../main/resources/application.properties | 8 +- {src => server/src}/main/resources/schema.sql | 0 .../ru/practicum/shareit/ShareItTests.java | 0 .../test/resources/application.properties | 0 .../shareit/booking/dto/BookingCreateDto.java | 40 ------ .../shareit/booking/dto/BookingUpdateDto.java | 26 ---- 83 files changed, 1042 insertions(+), 192 deletions(-) create mode 100644 .run/ShareItGateway.run.xml create mode 100644 .run/ShareItServer.run.xml create mode 100644 docker-compose.yml create mode 100644 gateway/Dockerfile create mode 100644 gateway/pom.xml create mode 100644 gateway/src/main/java/ru/practicum/shareit/ShareItGateway.java create mode 100644 gateway/src/main/java/ru/practicum/shareit/booking/BookingClient.java create mode 100644 gateway/src/main/java/ru/practicum/shareit/booking/BookingController.java create mode 100644 gateway/src/main/java/ru/practicum/shareit/booking/dto/BookingCreateDto.java create mode 100644 gateway/src/main/java/ru/practicum/shareit/booking/dto/BookingState.java create mode 100644 gateway/src/main/java/ru/practicum/shareit/client/BaseClient.java create mode 100644 gateway/src/main/java/ru/practicum/shareit/item/ItemClient.java create mode 100644 gateway/src/main/java/ru/practicum/shareit/item/ItemController.java rename {src => gateway/src}/main/java/ru/practicum/shareit/item/dto/CommentCreateDto.java (100%) rename {src => gateway/src}/main/java/ru/practicum/shareit/item/dto/ItemCreateDto.java (100%) rename {src => gateway/src}/main/java/ru/practicum/shareit/item/dto/ItemUpdateDto.java (100%) create mode 100644 gateway/src/main/java/ru/practicum/shareit/request/ItemRequestClient.java create mode 100644 gateway/src/main/java/ru/practicum/shareit/request/ItemRequestController.java rename {src => gateway/src}/main/java/ru/practicum/shareit/request/dto/ItemRequestCreateDto.java (85%) create mode 100644 gateway/src/main/java/ru/practicum/shareit/user/UserClient.java create mode 100644 gateway/src/main/java/ru/practicum/shareit/user/UserController.java rename {src => gateway/src}/main/java/ru/practicum/shareit/user/dto/UserCreateDto.java (100%) rename {src => gateway/src}/main/java/ru/practicum/shareit/user/dto/UserUpdateDto.java (100%) create mode 100644 gateway/src/main/resources/application.properties create mode 100644 server/Dockerfile create mode 100644 server/pom.xml rename src/main/java/ru/practicum/shareit/ShareItApp.java => server/src/main/java/ru/practicum/shareit/ShareItServer.java (57%) rename {src => server/src}/main/java/ru/practicum/shareit/booking/Booking.java (100%) rename {src => server/src}/main/java/ru/practicum/shareit/booking/BookingController.java (90%) rename {src => server/src}/main/java/ru/practicum/shareit/booking/BookingMapper.java (100%) rename {src => server/src}/main/java/ru/practicum/shareit/booking/BookingRepository.java (100%) rename {src => server/src}/main/java/ru/practicum/shareit/booking/BookingStatus.java (100%) create mode 100644 server/src/main/java/ru/practicum/shareit/booking/dto/BookingCreateDto.java rename {src => server/src}/main/java/ru/practicum/shareit/booking/dto/BookingDto.java (100%) rename {src => server/src}/main/java/ru/practicum/shareit/booking/service/BookingService.java (100%) rename {src => server/src}/main/java/ru/practicum/shareit/booking/service/BookingServiceImpl.java (100%) rename {src => server/src}/main/java/ru/practicum/shareit/exception/BadRequestException.java (100%) rename {src => server/src}/main/java/ru/practicum/shareit/exception/ConflictException.java (100%) rename {src => server/src}/main/java/ru/practicum/shareit/exception/ErrorHandler.java (100%) rename {src => server/src}/main/java/ru/practicum/shareit/exception/ErrorResponse.java (100%) rename {src => server/src}/main/java/ru/practicum/shareit/exception/InternalServerErrorException.java (100%) rename {src => server/src}/main/java/ru/practicum/shareit/exception/NotFoundException.java (100%) rename {src => server/src}/main/java/ru/practicum/shareit/exception/ValidationException.java (100%) rename {src => server/src}/main/java/ru/practicum/shareit/item/CommentMapper.java (100%) rename {src => server/src}/main/java/ru/practicum/shareit/item/ItemController.java (51%) rename {src => server/src}/main/java/ru/practicum/shareit/item/ItemMapper.java (100%) create mode 100644 server/src/main/java/ru/practicum/shareit/item/dto/CommentCreateDto.java rename {src => server/src}/main/java/ru/practicum/shareit/item/dto/CommentDto.java (100%) rename {src => server/src}/main/java/ru/practicum/shareit/item/dto/CommentDtoReturn.java (100%) rename {src => server/src}/main/java/ru/practicum/shareit/item/dto/ItemCommentDto.java (100%) create mode 100644 server/src/main/java/ru/practicum/shareit/item/dto/ItemCreateDto.java rename {src => server/src}/main/java/ru/practicum/shareit/item/dto/ItemDto.java (100%) create mode 100644 server/src/main/java/ru/practicum/shareit/item/dto/ItemUpdateDto.java rename {src => server/src}/main/java/ru/practicum/shareit/item/model/Comment.java (100%) rename {src => server/src}/main/java/ru/practicum/shareit/item/model/Item.java (100%) rename {src => server/src}/main/java/ru/practicum/shareit/item/repository/CommentRepository.java (100%) rename {src => server/src}/main/java/ru/practicum/shareit/item/repository/ItemRepository.java (96%) rename {src => server/src}/main/java/ru/practicum/shareit/item/service/ItemService.java (75%) rename {src => server/src}/main/java/ru/practicum/shareit/item/service/ItemServiceImpl.java (95%) rename {src => server/src}/main/java/ru/practicum/shareit/request/ItemRequest.java (100%) rename {src => server/src}/main/java/ru/practicum/shareit/request/ItemRequestController.java (88%) rename {src => server/src}/main/java/ru/practicum/shareit/request/ItemRequestMapper.java (100%) rename {src => server/src}/main/java/ru/practicum/shareit/request/ItemRequestRepository.java (100%) create mode 100644 server/src/main/java/ru/practicum/shareit/request/dto/ItemRequestCreateDto.java rename {src => server/src}/main/java/ru/practicum/shareit/request/dto/ItemRequestDto.java (100%) rename {src => server/src}/main/java/ru/practicum/shareit/request/service/ItemRequestService.java (100%) rename {src => server/src}/main/java/ru/practicum/shareit/request/service/ItemRequestServiceImpl.java (100%) rename {src => server/src}/main/java/ru/practicum/shareit/user/User.java (100%) rename {src => server/src}/main/java/ru/practicum/shareit/user/UserController.java (85%) rename {src => server/src}/main/java/ru/practicum/shareit/user/UserMapper.java (100%) rename {src => server/src}/main/java/ru/practicum/shareit/user/UserRepository.java (100%) create mode 100644 server/src/main/java/ru/practicum/shareit/user/dto/UserCreateDto.java rename {src => server/src}/main/java/ru/practicum/shareit/user/dto/UserDto.java (100%) create mode 100644 server/src/main/java/ru/practicum/shareit/user/dto/UserUpdateDto.java rename {src => server/src}/main/java/ru/practicum/shareit/user/service/UserService.java (100%) rename {src => server/src}/main/java/ru/practicum/shareit/user/service/UserServiceImpl.java (100%) rename {src => server/src}/main/resources/application.properties (85%) rename {src => server/src}/main/resources/schema.sql (100%) rename {src => server/src}/test/java/ru/practicum/shareit/ShareItTests.java (100%) rename {src => server/src}/test/resources/application.properties (100%) delete mode 100644 src/main/java/ru/practicum/shareit/booking/dto/BookingCreateDto.java delete mode 100644 src/main/java/ru/practicum/shareit/booking/dto/BookingUpdateDto.java diff --git a/.run/ShareItGateway.run.xml b/.run/ShareItGateway.run.xml new file mode 100644 index 0000000..32c8129 --- /dev/null +++ b/.run/ShareItGateway.run.xml @@ -0,0 +1,15 @@ + + + + \ No newline at end of file diff --git a/.run/ShareItServer.run.xml b/.run/ShareItServer.run.xml new file mode 100644 index 0000000..66672d1 --- /dev/null +++ b/.run/ShareItServer.run.xml @@ -0,0 +1,17 @@ + + + + \ No newline at end of file diff --git a/docker-compose.yml b/docker-compose.yml new file mode 100644 index 0000000..abe6570 --- /dev/null +++ b/docker-compose.yml @@ -0,0 +1,39 @@ +services: + gateway: + build: gateway + image: shareit-gateway + container_name: shareit-gateway + ports: + - "8080:8080" + depends_on: + - server + environment: + - SHAREIT_SERVER_URL=http://server:9090 + + server: + build: server + image: shareit-server + container_name: shareit-server + ports: + - "9090:9090" + depends_on: + - db + environment: + - SPRING_DATASOURCE_URL=jdbc:postgresql://db:5432/shareit + - SPRING_DATASOURCE_USERNAME=shareit + - SPRING_DATASOURCE_PASSWORD=shareit + + db: + image: postgres:16.1 + container_name: postgres + ports: + - "6541:5432" + environment: + - POSTGRES_PASSWORD=shareit + - POSTGRES_USER=shareit + - POSTGRES_DB=shareit + healthcheck: + test: pg_isready -q -d $$POSTGRES_DB -U $$POSTGRES_USER + timeout: 5s + interval: 5s + retries: 10 \ No newline at end of file diff --git a/gateway/Dockerfile b/gateway/Dockerfile new file mode 100644 index 0000000..0ff1817 --- /dev/null +++ b/gateway/Dockerfile @@ -0,0 +1,5 @@ +FROM eclipse-temurin:21-jre-jammy +VOLUME /tmp +ARG JAR_FILE=target/*.jar +COPY ${JAR_FILE} app.jar +ENTRYPOINT ["sh", "-c", "java ${JAVA_OPTS} -jar /app.jar"] \ No newline at end of file diff --git a/gateway/pom.xml b/gateway/pom.xml new file mode 100644 index 0000000..0a2eaf2 --- /dev/null +++ b/gateway/pom.xml @@ -0,0 +1,75 @@ + + + 4.0.0 + + ru.practicum + shareit + 0.0.1-SNAPSHOT + + + shareit-gateway + 0.0.1-SNAPSHOT + + ShareIt Gateway + + + + org.zalando + logbook-spring-boot-starter + 3.7.2 + + + org.springframework.boot + spring-boot-starter-web + + + + org.springframework.boot + spring-boot-starter-validation + + + + org.springframework.boot + spring-boot-starter-actuator + + + + org.hibernate.validator + hibernate-validator + + + + org.apache.httpcomponents.client5 + httpclient5 + + + + org.springframework.boot + spring-boot-configuration-processor + true + + + + org.projectlombok + lombok + true + + + + org.springframework.boot + spring-boot-starter-test + test + + + + + + + org.springframework.boot + spring-boot-maven-plugin + + + + + \ No newline at end of file diff --git a/gateway/src/main/java/ru/practicum/shareit/ShareItGateway.java b/gateway/src/main/java/ru/practicum/shareit/ShareItGateway.java new file mode 100644 index 0000000..0aa75c3 --- /dev/null +++ b/gateway/src/main/java/ru/practicum/shareit/ShareItGateway.java @@ -0,0 +1,12 @@ +package ru.practicum.shareit; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; + +@SpringBootApplication +public class ShareItGateway { + public static void main(String[] args) { + SpringApplication.run(ShareItGateway.class, args); + } + +} diff --git a/gateway/src/main/java/ru/practicum/shareit/booking/BookingClient.java b/gateway/src/main/java/ru/practicum/shareit/booking/BookingClient.java new file mode 100644 index 0000000..9f7b26b --- /dev/null +++ b/gateway/src/main/java/ru/practicum/shareit/booking/BookingClient.java @@ -0,0 +1,63 @@ +package ru.practicum.shareit.booking; + +import java.util.Map; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.boot.web.client.RestTemplateBuilder; +import org.springframework.http.ResponseEntity; +import org.springframework.http.client.HttpComponentsClientHttpRequestFactory; +import org.springframework.stereotype.Service; +import org.springframework.web.util.DefaultUriBuilderFactory; + +import ru.practicum.shareit.booking.dto.BookingCreateDto; +import ru.practicum.shareit.booking.dto.BookingState; +import ru.practicum.shareit.client.BaseClient; + +@Service +public class BookingClient extends BaseClient { + private static final String API_PREFIX = "/bookings"; + + @Autowired + public BookingClient(@Value("${shareit-server.url}") String serverUrl, RestTemplateBuilder builder) { + super( + builder + .uriTemplateHandler(new DefaultUriBuilderFactory(serverUrl + API_PREFIX)) + .requestFactory(() -> new HttpComponentsClientHttpRequestFactory()) + .build() + ); + } + + public ResponseEntity getBookingByBookerIdWhereTime(long userId, BookingState state, + Integer from, Integer size) { + Map parameters = Map.of( + "state", state.name(), + "from", from, + "size", size + ); + return get("?state={state}&from={from}&size={size}", userId, parameters); + } + + public ResponseEntity getBookingByOwnerIdWhereTime(long userId, BookingState state, + Integer from, Integer size) { + Map parameters = Map.of( + "state", state.name(), + "from", from, + "size", size + ); + return get("/owner?state={state}&from={from}&size={size}", userId, parameters); + } + + + public ResponseEntity setBookingItem(long userId, BookingCreateDto requestDto) { + return post("", userId, requestDto); + } + + public ResponseEntity setBookingStatus (long userId, Long bookingId, boolean approved) { + return patch("/" + bookingId + "?approved=" + approved, userId); + } + + public ResponseEntity getBookingById(long userId, Long bookingId) { + return get("/" + bookingId, userId); + } +} diff --git a/gateway/src/main/java/ru/practicum/shareit/booking/BookingController.java b/gateway/src/main/java/ru/practicum/shareit/booking/BookingController.java new file mode 100644 index 0000000..ed8e307 --- /dev/null +++ b/gateway/src/main/java/ru/practicum/shareit/booking/BookingController.java @@ -0,0 +1,67 @@ +package ru.practicum.shareit.booking; + +import jakarta.validation.Valid; +import jakarta.validation.constraints.Positive; +import jakarta.validation.constraints.PositiveOrZero; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.http.ResponseEntity; +import org.springframework.stereotype.Controller; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; +import ru.practicum.shareit.booking.dto.BookingCreateDto; +import ru.practicum.shareit.booking.dto.BookingState; + + +@Controller +@RequestMapping(path = "/bookings") +@RequiredArgsConstructor +@Slf4j +@Validated +public class BookingController { + private final BookingClient bookingClient; + + @PostMapping + public ResponseEntity setBookingItem(@RequestHeader("X-Sharer-User-Id") long userId, + @RequestBody @Valid BookingCreateDto requestDto) { + log.info("Creating booking {}, userId={}", requestDto, userId); + return bookingClient.setBookingItem(userId, requestDto); + } + + @PatchMapping("/{bookingId}") + public ResponseEntity setBookingStatus(@RequestHeader("X-Sharer-User-Id") long userId, + @PathVariable Long bookingId, @RequestParam boolean approved) { + log.info("set BookingStatus userId {}, bookingId={}, approved={}", userId, bookingId, approved); + return bookingClient.setBookingStatus(userId, bookingId, approved); + } + + @GetMapping("/{bookingId}") + public ResponseEntity getBookingById(@RequestHeader("X-Sharer-User-Id") long userId, + @PathVariable Long bookingId) { + log.info("Get bookingById {}, userId={}", bookingId, userId); + return bookingClient.getBookingById(userId, bookingId); + } + + @GetMapping + public ResponseEntity getBookingByBookerIdWhereTime(@RequestHeader("X-Sharer-User-Id") long userId, + @RequestParam(name = "state", defaultValue = "all") String stateParam, + @PositiveOrZero @RequestParam(name = "from", defaultValue = "0") Integer from, + @Positive @RequestParam(name = "size", defaultValue = "10") Integer size) { + BookingState state = BookingState.from(stateParam) + .orElseThrow(() -> new IllegalArgumentException("Unknown state: " + stateParam)); + log.info("Get booking with state {}, userId={}, from={}, size={}", stateParam, userId, from, size); + return bookingClient.getBookingByBookerIdWhereTime(userId, state, from, size); + } + + @GetMapping("/owner") + public ResponseEntity getBookingByOwnerIdWhereTime(@RequestHeader("X-Sharer-User-Id") long userId, + @RequestParam(name = "state", defaultValue = "all") String stateParam, + @PositiveOrZero @RequestParam(name = "from", defaultValue = "0") Integer from, + @Positive @RequestParam(name = "size", defaultValue = "10") Integer size) { + BookingState state = BookingState.from(stateParam) + .orElseThrow(() -> new IllegalArgumentException("Unknown state: " + stateParam)); + log.info("Get booking with state {}, userId={}, from={}, size={}", stateParam, userId, from, size); + return bookingClient.getBookingByOwnerIdWhereTime(userId, state, from, size); + } + +} diff --git a/gateway/src/main/java/ru/practicum/shareit/booking/dto/BookingCreateDto.java b/gateway/src/main/java/ru/practicum/shareit/booking/dto/BookingCreateDto.java new file mode 100644 index 0000000..bf051b3 --- /dev/null +++ b/gateway/src/main/java/ru/practicum/shareit/booking/dto/BookingCreateDto.java @@ -0,0 +1,40 @@ +package ru.practicum.shareit.booking.dto; + +import java.time.LocalDateTime; +import java.time.temporal.ChronoUnit; + +import jakarta.validation.constraints.AssertTrue; +import jakarta.validation.constraints.Future; +import jakarta.validation.constraints.FutureOrPresent; +import jakarta.validation.constraints.NotNull; +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.NoArgsConstructor; + +@Getter +@NoArgsConstructor +@AllArgsConstructor +public class BookingCreateDto { + @NotNull + private long itemId; + @FutureOrPresent + private LocalDateTime start; + @Future + private LocalDateTime end; + + @AssertTrue(message = "Дата окончания должна быть позже даты начала") + boolean isStartBeforeEnd() { + return start != null && + end != null && + start.isBefore(end); + } + + public void normalizeTimestamps() { + if (start != null) { + start = start.truncatedTo(ChronoUnit.SECONDS); + } + if (end != null) { + end = end.truncatedTo(ChronoUnit.SECONDS); + } + } +} diff --git a/gateway/src/main/java/ru/practicum/shareit/booking/dto/BookingState.java b/gateway/src/main/java/ru/practicum/shareit/booking/dto/BookingState.java new file mode 100644 index 0000000..7bfa164 --- /dev/null +++ b/gateway/src/main/java/ru/practicum/shareit/booking/dto/BookingState.java @@ -0,0 +1,27 @@ +package ru.practicum.shareit.booking.dto; + +import java.util.Optional; + +public enum BookingState { + // Все + ALL, + // Текущие + CURRENT, + // Будущие + FUTURE, + // Завершенные + PAST, + // Отклоненные + REJECTED, + // Ожидающие подтверждения + WAITING; + + public static Optional from(String stringState) { + for (BookingState state : values()) { + if (state.name().equalsIgnoreCase(stringState)) { + return Optional.of(state); + } + } + return Optional.empty(); + } +} diff --git a/gateway/src/main/java/ru/practicum/shareit/client/BaseClient.java b/gateway/src/main/java/ru/practicum/shareit/client/BaseClient.java new file mode 100644 index 0000000..0c1b422 --- /dev/null +++ b/gateway/src/main/java/ru/practicum/shareit/client/BaseClient.java @@ -0,0 +1,123 @@ +package ru.practicum.shareit.client; + +import java.util.List; +import java.util.Map; + +import org.springframework.http.HttpEntity; +import org.springframework.http.HttpHeaders; +import org.springframework.http.HttpMethod; +import org.springframework.http.MediaType; +import org.springframework.http.ResponseEntity; +import org.springframework.lang.Nullable; +import org.springframework.web.client.HttpStatusCodeException; +import org.springframework.web.client.RestTemplate; + +public class BaseClient { + protected final RestTemplate rest; + + public BaseClient(RestTemplate rest) { + this.rest = rest; + } + + protected ResponseEntity get(String path) { + return get(path, null, null); + } + + protected ResponseEntity get(String path, long userId) { + return get(path, userId, null); + } + + protected ResponseEntity get(String path, Long userId, @Nullable Map parameters) { + return makeAndSendRequest(HttpMethod.GET, path, userId, parameters, null); + } + + protected ResponseEntity post(String path, T body) { + return post(path, null, null, body); + } + + protected ResponseEntity post(String path, long userId, T body) { + return post(path, userId, null, body); + } + + protected ResponseEntity post(String path, Long userId, @Nullable Map parameters, T body) { + return makeAndSendRequest(HttpMethod.POST, path, userId, parameters, body); + } + + protected ResponseEntity put(String path, long userId, T body) { + return put(path, userId, null, body); + } + + protected ResponseEntity put(String path, long userId, @Nullable Map parameters, T body) { + return makeAndSendRequest(HttpMethod.PUT, path, userId, parameters, body); + } + + protected ResponseEntity patch(String path, T body) { + return patch(path, null, null, body); + } + + protected ResponseEntity patch(String path, long userId) { + return patch(path, userId, null, null); + } + + protected ResponseEntity patch(String path, long userId, T body) { + return patch(path, userId, null, body); + } + + protected ResponseEntity patch(String path, Long userId, @Nullable Map parameters, T body) { + return makeAndSendRequest(HttpMethod.PATCH, path, userId, parameters, body); + } + + protected ResponseEntity delete(String path) { + return delete(path, null, null); + } + + protected ResponseEntity delete(String path, long userId) { + return delete(path, userId, null); + } + + protected ResponseEntity delete(String path, Long userId, @Nullable Map parameters) { + return makeAndSendRequest(HttpMethod.DELETE, path, userId, parameters, null); + } + + private ResponseEntity makeAndSendRequest(HttpMethod method, String path, + Long userId, @Nullable Map parameters, + @Nullable T body) { + HttpEntity requestEntity = new HttpEntity<>(body, defaultHeaders(userId)); + + ResponseEntity shareitServerResponse; + try { + if (parameters != null) { + shareitServerResponse = rest.exchange(path, method, requestEntity, Object.class, parameters); + } else { + shareitServerResponse = rest.exchange(path, method, requestEntity, Object.class); + } + } catch (HttpStatusCodeException e) { + return ResponseEntity.status(e.getStatusCode()).body(e.getResponseBodyAsByteArray()); + } + return prepareGatewayResponse(shareitServerResponse); + } + + private HttpHeaders defaultHeaders(Long userId) { + HttpHeaders headers = new HttpHeaders(); + headers.setContentType(MediaType.APPLICATION_JSON); + headers.setAccept(List.of(MediaType.APPLICATION_JSON)); + if (userId != null) { + headers.set("X-Sharer-User-Id", String.valueOf(userId)); + } + return headers; + } + + private static ResponseEntity prepareGatewayResponse(ResponseEntity response) { + if (response.getStatusCode().is2xxSuccessful()) { + return response; + } + + ResponseEntity.BodyBuilder responseBuilder = ResponseEntity.status(response.getStatusCode()); + + if (response.hasBody()) { + return responseBuilder.body(response.getBody()); + } + + return responseBuilder.build(); + } +} diff --git a/gateway/src/main/java/ru/practicum/shareit/item/ItemClient.java b/gateway/src/main/java/ru/practicum/shareit/item/ItemClient.java new file mode 100644 index 0000000..f4d321e --- /dev/null +++ b/gateway/src/main/java/ru/practicum/shareit/item/ItemClient.java @@ -0,0 +1,59 @@ +package ru.practicum.shareit.item; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.boot.web.client.RestTemplateBuilder; +import org.springframework.http.ResponseEntity; +import org.springframework.http.client.HttpComponentsClientHttpRequestFactory; +import org.springframework.stereotype.Service; +import org.springframework.web.bind.annotation.RequestHeader; +import org.springframework.web.util.DefaultUriBuilderFactory; +import ru.practicum.shareit.client.BaseClient; + +import ru.practicum.shareit.item.dto.CommentCreateDto; +import ru.practicum.shareit.item.dto.ItemCreateDto; +import ru.practicum.shareit.item.dto.ItemUpdateDto; + +import java.util.Map; + +@Service +public class ItemClient extends BaseClient { + private static final String API_PREFIX = "/items"; + + @Autowired + public ItemClient(@Value("${shareit-server.url}") String serverUrl, RestTemplateBuilder builder) { + super( + builder + .uriTemplateHandler(new DefaultUriBuilderFactory(serverUrl + API_PREFIX)) + .requestFactory(() -> new HttpComponentsClientHttpRequestFactory()) + .build() + ); + } + + public ResponseEntity createComment(long userId, Long itemId, CommentCreateDto createDto) { + return post("/" + itemId + "/comment", userId, createDto); + } + + public ResponseEntity createItem(Long userId, ItemCreateDto createDto) { + return post("", userId, createDto); + } + + public ResponseEntity updateItem(Long userId, Long itemId, ItemUpdateDto updateDto) { + return patch("/" + itemId, userId, updateDto); + } + + public ResponseEntity getByItemIdWithComment(Long userId, Long itemId) { + return get("/" + itemId, userId); + } + + public ResponseEntity allItemByOwnerIdWithComment(Long userId) { + return get("", userId); + } + + public ResponseEntity getItemsByNameOrDescription(Long userId, String text) { + Map parameters = Map.of("text", text); + return get("/search?text={text}", userId, parameters); + } + + +} diff --git a/gateway/src/main/java/ru/practicum/shareit/item/ItemController.java b/gateway/src/main/java/ru/practicum/shareit/item/ItemController.java new file mode 100644 index 0000000..afb90a6 --- /dev/null +++ b/gateway/src/main/java/ru/practicum/shareit/item/ItemController.java @@ -0,0 +1,65 @@ +package ru.practicum.shareit.item; + +import jakarta.validation.Valid; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.http.ResponseEntity; +import org.springframework.stereotype.Controller; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; +import ru.practicum.shareit.item.dto.CommentCreateDto; +import ru.practicum.shareit.item.dto.ItemCreateDto; +import ru.practicum.shareit.item.dto.ItemUpdateDto; + +@Controller +@RequestMapping(path = "/items") +@RequiredArgsConstructor +@Slf4j +@Validated +public class ItemController { + private final ItemClient itemClient; + + @PostMapping("/{itemId}/comment") + public ResponseEntity createComment(@RequestHeader("X-Sharer-User-Id") Long userId, + @PathVariable Long itemId, + @RequestBody @Valid CommentCreateDto createDto) { + log.info("Creating Comment {}, userId={}, itemId={}", createDto, userId, itemId); + return itemClient.createComment(userId, itemId, createDto); + } + + @PostMapping + public ResponseEntity createItem(@RequestHeader("X-Sharer-User-Id") Long userId, + @RequestBody @Valid ItemCreateDto createDto) { + log.info("Creating Item {}, userId={}", createDto, userId); + return itemClient.createItem(userId, createDto); + } + + @PatchMapping("/{itemId}") + public ResponseEntity updateItem(@RequestHeader("X-Sharer-User-Id") Long userId, + @PathVariable Long itemId, + @RequestBody @Valid ItemUpdateDto updateDto) { + log.info("Patch updateItem {}, userId={}, itemId={}", updateDto, userId, itemId); + return itemClient.updateItem(userId, itemId, updateDto); + } + + @GetMapping("/{itemId}") + public ResponseEntity getByItemIdWithComment(@RequestHeader("X-Sharer-User-Id") Long userId, + @PathVariable Long itemId) { + log.info("Get getByItemIdWithComment, userId={}, itemId={}", userId, itemId); + return itemClient.getByItemIdWithComment(userId, itemId); + } + + @GetMapping + public ResponseEntity allItemByOwnerIdWithComment(@RequestHeader("X-Sharer-User-Id") Long userId) { + log.info("Get allItemByOwnerIdWithComment , userId={}", userId); + return itemClient.allItemByOwnerIdWithComment(userId); + } + + @GetMapping("/search") + public ResponseEntity getItemsByNameOrDescription(@RequestHeader("X-Sharer-User-Id") Long userId, + @RequestParam String text) { + log.info("Get getItemsByNameOrDescription, userId={}, text={}", userId, text); + return itemClient.getItemsByNameOrDescription(userId, text); + } + +} diff --git a/src/main/java/ru/practicum/shareit/item/dto/CommentCreateDto.java b/gateway/src/main/java/ru/practicum/shareit/item/dto/CommentCreateDto.java similarity index 100% rename from src/main/java/ru/practicum/shareit/item/dto/CommentCreateDto.java rename to gateway/src/main/java/ru/practicum/shareit/item/dto/CommentCreateDto.java diff --git a/src/main/java/ru/practicum/shareit/item/dto/ItemCreateDto.java b/gateway/src/main/java/ru/practicum/shareit/item/dto/ItemCreateDto.java similarity index 100% rename from src/main/java/ru/practicum/shareit/item/dto/ItemCreateDto.java rename to gateway/src/main/java/ru/practicum/shareit/item/dto/ItemCreateDto.java diff --git a/src/main/java/ru/practicum/shareit/item/dto/ItemUpdateDto.java b/gateway/src/main/java/ru/practicum/shareit/item/dto/ItemUpdateDto.java similarity index 100% rename from src/main/java/ru/practicum/shareit/item/dto/ItemUpdateDto.java rename to gateway/src/main/java/ru/practicum/shareit/item/dto/ItemUpdateDto.java diff --git a/gateway/src/main/java/ru/practicum/shareit/request/ItemRequestClient.java b/gateway/src/main/java/ru/practicum/shareit/request/ItemRequestClient.java new file mode 100644 index 0000000..f052699 --- /dev/null +++ b/gateway/src/main/java/ru/practicum/shareit/request/ItemRequestClient.java @@ -0,0 +1,44 @@ +package ru.practicum.shareit.request; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.boot.web.client.RestTemplateBuilder; +import org.springframework.http.ResponseEntity; +import org.springframework.http.client.HttpComponentsClientHttpRequestFactory; +import org.springframework.stereotype.Service; +import org.springframework.web.client.RestTemplate; +import org.springframework.web.util.DefaultUriBuilderFactory; +import ru.practicum.shareit.client.BaseClient; +import ru.practicum.shareit.request.dto.ItemRequestCreateDto; + +@Service +public class ItemRequestClient extends BaseClient { + private static final String API_PREFIX = "/requests"; + + @Autowired + public ItemRequestClient(@Value("${shareit-server.url}") String serverUrl, RestTemplateBuilder builder) { + super( + builder + .uriTemplateHandler(new DefaultUriBuilderFactory(serverUrl + API_PREFIX)) + .requestFactory(() -> new HttpComponentsClientHttpRequestFactory()) + .build() + ); + } + + public ResponseEntity createItemRequest(Long userId, ItemRequestCreateDto createDto) { + return post("", userId, createDto); + } + + public ResponseEntity getItemRequestsByUserId(Long userId) { + return get("", userId); + } + + public ResponseEntity getItemRequestsByNotUserId(Long userId) { + return get("/all", userId); + } + + public ResponseEntity getItemRequestById(Long userId, Long requestId) { + return get("/" + requestId, userId); + } + +} diff --git a/gateway/src/main/java/ru/practicum/shareit/request/ItemRequestController.java b/gateway/src/main/java/ru/practicum/shareit/request/ItemRequestController.java new file mode 100644 index 0000000..c4131f0 --- /dev/null +++ b/gateway/src/main/java/ru/practicum/shareit/request/ItemRequestController.java @@ -0,0 +1,46 @@ +package ru.practicum.shareit.request; + +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.http.ResponseEntity; +import org.springframework.stereotype.Controller; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; +import ru.practicum.shareit.request.dto.ItemRequestCreateDto; + + +@Controller +@RequestMapping(path = "/requests") +@RequiredArgsConstructor +@Slf4j +@Validated +public class ItemRequestController { + private final ItemRequestClient itemRequestClient; + + @PostMapping + public ResponseEntity createItemRequest(@RequestHeader("X-Sharer-User-Id") Long userId, + @Validated @RequestBody ItemRequestCreateDto createDto) { + log.info("Creating ItemRequest {}, userId={}", createDto, userId); + return itemRequestClient.createItemRequest(userId, createDto); + } + + @GetMapping + public ResponseEntity getItemRequestsByUserId(@RequestHeader("X-Sharer-User-Id") Long userId) { + log.info("Get getItemRequestsByUserId, userId={}", userId); + return itemRequestClient.getItemRequestsByUserId(userId); + } + + @GetMapping("/all") + public ResponseEntity getItemRequestsByNotUserId(@RequestHeader("X-Sharer-User-Id") Long userId) { + log.info("Get getItemRequestsByNotUserId, userId={}", userId); + return itemRequestClient.getItemRequestsByNotUserId(userId); + } + + @GetMapping("/{requestId}") + public ResponseEntity getItemRequestById(@RequestHeader("X-Sharer-User-Id") Long userId, + @PathVariable Long requestId) { + log.info("Get getItemRequestById, userId={}, requestId={}", userId, requestId); + return itemRequestClient.getItemRequestById(userId, requestId); + } + +} diff --git a/src/main/java/ru/practicum/shareit/request/dto/ItemRequestCreateDto.java b/gateway/src/main/java/ru/practicum/shareit/request/dto/ItemRequestCreateDto.java similarity index 85% rename from src/main/java/ru/practicum/shareit/request/dto/ItemRequestCreateDto.java rename to gateway/src/main/java/ru/practicum/shareit/request/dto/ItemRequestCreateDto.java index 9156b56..90c82d7 100644 --- a/src/main/java/ru/practicum/shareit/request/dto/ItemRequestCreateDto.java +++ b/gateway/src/main/java/ru/practicum/shareit/request/dto/ItemRequestCreateDto.java @@ -3,7 +3,8 @@ import jakarta.validation.constraints.NotBlank; import jakarta.validation.constraints.NotNull; -import lombok.*; +import lombok.Getter; +import lombok.Setter; @Getter diff --git a/gateway/src/main/java/ru/practicum/shareit/user/UserClient.java b/gateway/src/main/java/ru/practicum/shareit/user/UserClient.java new file mode 100644 index 0000000..7b93af8 --- /dev/null +++ b/gateway/src/main/java/ru/practicum/shareit/user/UserClient.java @@ -0,0 +1,50 @@ +package ru.practicum.shareit.user; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.boot.web.client.RestTemplateBuilder; +import org.springframework.http.ResponseEntity; +import org.springframework.http.client.HttpComponentsClientHttpRequestFactory; +import org.springframework.stereotype.Service; +import org.springframework.web.util.DefaultUriBuilderFactory; +import ru.practicum.shareit.client.BaseClient; +import ru.practicum.shareit.user.dto.UserCreateDto; +import ru.practicum.shareit.user.dto.UserUpdateDto; + +import java.util.Map; + +@Service +public class UserClient extends BaseClient { + private static final String API_PREFIX = "/users"; + + @Autowired + public UserClient(@Value("${shareit-server.url}") String serverUrl, RestTemplateBuilder builder) { + super( + builder + .uriTemplateHandler(new DefaultUriBuilderFactory(serverUrl + API_PREFIX)) + .requestFactory(() -> new HttpComponentsClientHttpRequestFactory()) + .build() + ); + } + + public ResponseEntity create(UserCreateDto userDto) { + return post("", userDto); + } + + public ResponseEntity update(Long userId, UserUpdateDto userDto) { + return patch("/" + userId, userDto); + } + + public ResponseEntity getUserById(Long userId) { + return get("/" + userId); + } + + public ResponseEntity getAll(Integer size) { + return get("?size={size}", size); + } + + public void deleteUser(Long userId) { + delete("/" + userId); + } + +} diff --git a/gateway/src/main/java/ru/practicum/shareit/user/UserController.java b/gateway/src/main/java/ru/practicum/shareit/user/UserController.java new file mode 100644 index 0000000..f3df2ad --- /dev/null +++ b/gateway/src/main/java/ru/practicum/shareit/user/UserController.java @@ -0,0 +1,55 @@ +package ru.practicum.shareit.user; + +import jakarta.validation.constraints.Positive; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.stereotype.Controller; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; +import ru.practicum.shareit.user.dto.UserCreateDto; +import ru.practicum.shareit.user.dto.UserUpdateDto; + +@Controller +@RequestMapping(path = "/users") +@RequiredArgsConstructor +@Slf4j +@Validated +public class UserController { + private final UserClient userClient; + + + @PostMapping + public ResponseEntity create(@RequestBody @Validated UserCreateDto userDto) { + log.info("Creating user {}", userDto); + return userClient.create(userDto); + } + + @PatchMapping("/{userId}") + public ResponseEntity update(@PathVariable Long userId, + @RequestBody @Validated UserUpdateDto userDto) { + log.info("Update user {}, userId={}", userDto, userId); + return userClient.update(userId, userDto); + } + + @GetMapping("/{userId}") + public ResponseEntity getUserById(@PathVariable Long userId) { + log.info("Get userId {}", userId); + return userClient.getUserById(userId); + } + + @GetMapping() + public ResponseEntity getAll(@Positive @RequestParam(name = "size", defaultValue = "10") Integer size) { + log.info("Get getAll size{}", size); + return userClient.getAll(size); + } + + @ResponseStatus(HttpStatus.OK) + @DeleteMapping("/{userId}") + public void deleteUser(@PathVariable Long userId) { + log.info("Delete User userId{}", userId); + userClient.deleteUser(userId); + } + +} diff --git a/src/main/java/ru/practicum/shareit/user/dto/UserCreateDto.java b/gateway/src/main/java/ru/practicum/shareit/user/dto/UserCreateDto.java similarity index 100% rename from src/main/java/ru/practicum/shareit/user/dto/UserCreateDto.java rename to gateway/src/main/java/ru/practicum/shareit/user/dto/UserCreateDto.java diff --git a/src/main/java/ru/practicum/shareit/user/dto/UserUpdateDto.java b/gateway/src/main/java/ru/practicum/shareit/user/dto/UserUpdateDto.java similarity index 100% rename from src/main/java/ru/practicum/shareit/user/dto/UserUpdateDto.java rename to gateway/src/main/java/ru/practicum/shareit/user/dto/UserUpdateDto.java diff --git a/gateway/src/main/resources/application.properties b/gateway/src/main/resources/application.properties new file mode 100644 index 0000000..2ee0851 --- /dev/null +++ b/gateway/src/main/resources/application.properties @@ -0,0 +1,7 @@ +logging.level.org.springframework.web.client.RestTemplate=DEBUG +#logging.level.org.apache.http=DEBUG +#logging.level.httpclient.wire=DEBUG + +server.port=8080 + +shareit-server.url=http://localhost:9090 \ No newline at end of file diff --git a/pom.xml b/pom.xml index a4e00c4..79cba37 100644 --- a/pom.xml +++ b/pom.xml @@ -11,6 +11,7 @@ ru.practicum shareit + pom 0.0.1-SNAPSHOT ShareIt @@ -19,86 +20,29 @@ 21 - - - org.springframework.boot - spring-boot-starter-jdbc - - - org.springframework.boot - spring-boot-starter-web - - - org.zalando - logbook-spring-boot-starter - 3.7.2 - - - org.springframework.boot - spring-boot-starter-actuator - - - org.springframework.boot - spring-boot-configuration-processor - true - - - - org.postgresql - postgresql - runtime - - - - org.springframework.boot - spring-boot-starter-data-jpa - - - - org.projectlombok - lombok - true - - - - com.h2database - h2 - test - - - org.springframework.boot - spring-boot-starter-test - test - - - org.springframework.boot - spring-boot-starter-validation - - + + gateway + server + - - - src/main/resources - true - - - - - org.springframework.boot - spring-boot-maven-plugin - - - - org.projectlombok - lombok - - - - - + + org.springframework.boot + spring-boot-maven-plugin + + + true + + + + org.projectlombok + lombok + + + + org.apache.maven.plugins maven-surefire-plugin @@ -245,17 +189,5 @@ - - coverage - - - - org.jacoco - jacoco-maven-plugin - - - - - - + \ No newline at end of file diff --git a/server/Dockerfile b/server/Dockerfile new file mode 100644 index 0000000..0ff1817 --- /dev/null +++ b/server/Dockerfile @@ -0,0 +1,5 @@ +FROM eclipse-temurin:21-jre-jammy +VOLUME /tmp +ARG JAR_FILE=target/*.jar +COPY ${JAR_FILE} app.jar +ENTRYPOINT ["sh", "-c", "java ${JAVA_OPTS} -jar /app.jar"] \ No newline at end of file diff --git a/server/pom.xml b/server/pom.xml new file mode 100644 index 0000000..fa64133 --- /dev/null +++ b/server/pom.xml @@ -0,0 +1,91 @@ + + + 4.0.0 + + ru.practicum + shareit + 0.0.1-SNAPSHOT + + + shareit-server + 0.0.1-SNAPSHOT + + ShareIt Server + + + + org.zalando + logbook-spring-boot-starter + 3.7.2 + + + org.springframework.boot + spring-boot-starter-data-jpa + + + + org.springframework.boot + spring-boot-starter-web + + + + org.springframework.boot + spring-boot-starter-actuator + + + + org.postgresql + postgresql + runtime + + + + com.h2database + h2 + runtime + + + + org.springframework.boot + spring-boot-configuration-processor + true + + + + org.projectlombok + lombok + true + + + + org.springframework.boot + spring-boot-starter-test + test + + + + + + + org.springframework.boot + spring-boot-maven-plugin + + + + + + + coverage + + + + org.jacoco + jacoco-maven-plugin + + + + + + + diff --git a/src/main/java/ru/practicum/shareit/ShareItApp.java b/server/src/main/java/ru/practicum/shareit/ShareItServer.java similarity index 57% rename from src/main/java/ru/practicum/shareit/ShareItApp.java rename to server/src/main/java/ru/practicum/shareit/ShareItServer.java index a10a87d..303541d 100644 --- a/src/main/java/ru/practicum/shareit/ShareItApp.java +++ b/server/src/main/java/ru/practicum/shareit/ShareItServer.java @@ -4,10 +4,10 @@ import org.springframework.boot.autoconfigure.SpringBootApplication; @SpringBootApplication -public class ShareItApp { +public class ShareItServer { - public static void main(String[] args) { - SpringApplication.run(ShareItApp.class, args); - } + public static void main(String[] args) { + SpringApplication.run(ShareItServer.class, args); + } } diff --git a/src/main/java/ru/practicum/shareit/booking/Booking.java b/server/src/main/java/ru/practicum/shareit/booking/Booking.java similarity index 100% rename from src/main/java/ru/practicum/shareit/booking/Booking.java rename to server/src/main/java/ru/practicum/shareit/booking/Booking.java diff --git a/src/main/java/ru/practicum/shareit/booking/BookingController.java b/server/src/main/java/ru/practicum/shareit/booking/BookingController.java similarity index 90% rename from src/main/java/ru/practicum/shareit/booking/BookingController.java rename to server/src/main/java/ru/practicum/shareit/booking/BookingController.java index 99fca72..0442956 100644 --- a/src/main/java/ru/practicum/shareit/booking/BookingController.java +++ b/server/src/main/java/ru/practicum/shareit/booking/BookingController.java @@ -1,7 +1,6 @@ package ru.practicum.shareit.booking; import lombok.RequiredArgsConstructor; -import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.*; import ru.practicum.shareit.booking.dto.BookingCreateDto; import ru.practicum.shareit.booking.dto.BookingDto; @@ -10,7 +9,6 @@ import java.util.List; -@Validated @RestController @RequiredArgsConstructor @RequestMapping(path = "/bookings") @@ -20,8 +18,7 @@ public class BookingController { @PostMapping public BookingDto setBookingItem(@RequestHeader("X-Sharer-User-Id") Long userId, - @Validated @RequestBody BookingCreateDto createDto) { - createDto.normalizeTimestamps(); + @RequestBody BookingCreateDto createDto) { return bookingService.setBookingItem(createDto, userId); } diff --git a/src/main/java/ru/practicum/shareit/booking/BookingMapper.java b/server/src/main/java/ru/practicum/shareit/booking/BookingMapper.java similarity index 100% rename from src/main/java/ru/practicum/shareit/booking/BookingMapper.java rename to server/src/main/java/ru/practicum/shareit/booking/BookingMapper.java diff --git a/src/main/java/ru/practicum/shareit/booking/BookingRepository.java b/server/src/main/java/ru/practicum/shareit/booking/BookingRepository.java similarity index 100% rename from src/main/java/ru/practicum/shareit/booking/BookingRepository.java rename to server/src/main/java/ru/practicum/shareit/booking/BookingRepository.java diff --git a/src/main/java/ru/practicum/shareit/booking/BookingStatus.java b/server/src/main/java/ru/practicum/shareit/booking/BookingStatus.java similarity index 100% rename from src/main/java/ru/practicum/shareit/booking/BookingStatus.java rename to server/src/main/java/ru/practicum/shareit/booking/BookingStatus.java diff --git a/server/src/main/java/ru/practicum/shareit/booking/dto/BookingCreateDto.java b/server/src/main/java/ru/practicum/shareit/booking/dto/BookingCreateDto.java new file mode 100644 index 0000000..fd6f1bd --- /dev/null +++ b/server/src/main/java/ru/practicum/shareit/booking/dto/BookingCreateDto.java @@ -0,0 +1,14 @@ +package ru.practicum.shareit.booking.dto; + +import lombok.Data; +import org.springframework.stereotype.Component; + +import java.time.LocalDateTime; + +@Component +@Data +public class BookingCreateDto { + private LocalDateTime start; + private LocalDateTime end; + private Long itemId; +} diff --git a/src/main/java/ru/practicum/shareit/booking/dto/BookingDto.java b/server/src/main/java/ru/practicum/shareit/booking/dto/BookingDto.java similarity index 100% rename from src/main/java/ru/practicum/shareit/booking/dto/BookingDto.java rename to server/src/main/java/ru/practicum/shareit/booking/dto/BookingDto.java diff --git a/src/main/java/ru/practicum/shareit/booking/service/BookingService.java b/server/src/main/java/ru/practicum/shareit/booking/service/BookingService.java similarity index 100% rename from src/main/java/ru/practicum/shareit/booking/service/BookingService.java rename to server/src/main/java/ru/practicum/shareit/booking/service/BookingService.java diff --git a/src/main/java/ru/practicum/shareit/booking/service/BookingServiceImpl.java b/server/src/main/java/ru/practicum/shareit/booking/service/BookingServiceImpl.java similarity index 100% rename from src/main/java/ru/practicum/shareit/booking/service/BookingServiceImpl.java rename to server/src/main/java/ru/practicum/shareit/booking/service/BookingServiceImpl.java diff --git a/src/main/java/ru/practicum/shareit/exception/BadRequestException.java b/server/src/main/java/ru/practicum/shareit/exception/BadRequestException.java similarity index 100% rename from src/main/java/ru/practicum/shareit/exception/BadRequestException.java rename to server/src/main/java/ru/practicum/shareit/exception/BadRequestException.java diff --git a/src/main/java/ru/practicum/shareit/exception/ConflictException.java b/server/src/main/java/ru/practicum/shareit/exception/ConflictException.java similarity index 100% rename from src/main/java/ru/practicum/shareit/exception/ConflictException.java rename to server/src/main/java/ru/practicum/shareit/exception/ConflictException.java diff --git a/src/main/java/ru/practicum/shareit/exception/ErrorHandler.java b/server/src/main/java/ru/practicum/shareit/exception/ErrorHandler.java similarity index 100% rename from src/main/java/ru/practicum/shareit/exception/ErrorHandler.java rename to server/src/main/java/ru/practicum/shareit/exception/ErrorHandler.java diff --git a/src/main/java/ru/practicum/shareit/exception/ErrorResponse.java b/server/src/main/java/ru/practicum/shareit/exception/ErrorResponse.java similarity index 100% rename from src/main/java/ru/practicum/shareit/exception/ErrorResponse.java rename to server/src/main/java/ru/practicum/shareit/exception/ErrorResponse.java diff --git a/src/main/java/ru/practicum/shareit/exception/InternalServerErrorException.java b/server/src/main/java/ru/practicum/shareit/exception/InternalServerErrorException.java similarity index 100% rename from src/main/java/ru/practicum/shareit/exception/InternalServerErrorException.java rename to server/src/main/java/ru/practicum/shareit/exception/InternalServerErrorException.java diff --git a/src/main/java/ru/practicum/shareit/exception/NotFoundException.java b/server/src/main/java/ru/practicum/shareit/exception/NotFoundException.java similarity index 100% rename from src/main/java/ru/practicum/shareit/exception/NotFoundException.java rename to server/src/main/java/ru/practicum/shareit/exception/NotFoundException.java diff --git a/src/main/java/ru/practicum/shareit/exception/ValidationException.java b/server/src/main/java/ru/practicum/shareit/exception/ValidationException.java similarity index 100% rename from src/main/java/ru/practicum/shareit/exception/ValidationException.java rename to server/src/main/java/ru/practicum/shareit/exception/ValidationException.java diff --git a/src/main/java/ru/practicum/shareit/item/CommentMapper.java b/server/src/main/java/ru/practicum/shareit/item/CommentMapper.java similarity index 100% rename from src/main/java/ru/practicum/shareit/item/CommentMapper.java rename to server/src/main/java/ru/practicum/shareit/item/CommentMapper.java diff --git a/src/main/java/ru/practicum/shareit/item/ItemController.java b/server/src/main/java/ru/practicum/shareit/item/ItemController.java similarity index 51% rename from src/main/java/ru/practicum/shareit/item/ItemController.java rename to server/src/main/java/ru/practicum/shareit/item/ItemController.java index 26c15e3..621eac6 100644 --- a/src/main/java/ru/practicum/shareit/item/ItemController.java +++ b/server/src/main/java/ru/practicum/shareit/item/ItemController.java @@ -1,14 +1,12 @@ package ru.practicum.shareit.item; import lombok.RequiredArgsConstructor; -import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.*; import ru.practicum.shareit.item.dto.*; import ru.practicum.shareit.item.service.ItemService; import java.util.List; -@Validated @RestController @RequiredArgsConstructor @RequestMapping("/items") @@ -16,35 +14,37 @@ public class ItemController { private final ItemService itemService; @PostMapping("/{itemId}/comment") - public CommentDtoReturn createComment(@RequestHeader("X-Sharer-User-Id") Long userId, @PathVariable long itemId, - @Validated @RequestBody CommentCreateDto createDto) { + public CommentDtoReturn createComment(@RequestHeader("X-Sharer-User-Id") Long userId, @PathVariable Long itemId, + @RequestBody CommentCreateDto createDto) { return itemService.createComment(userId, itemId, createDto); } @PostMapping public ItemDto createItem(@RequestHeader("X-Sharer-User-Id") Long userId, - @Validated @RequestBody ItemCreateDto createDto) { + @RequestBody ItemCreateDto createDto) { return itemService.createItem(createDto, userId); } @PatchMapping("/{itemId}") - public ItemDto update(@RequestHeader("X-Sharer-User-Id") Long userId, @PathVariable Long itemId, - @Validated @RequestBody ItemUpdateDto updateDto) { - return itemService.update(updateDto, userId, itemId); + public ItemDto updateItem(@RequestHeader("X-Sharer-User-Id") Long userId, @PathVariable Long itemId, + @RequestBody ItemUpdateDto updateDto) { + return itemService.updateItem(updateDto, userId, itemId); } @GetMapping("/{itemId}") - public ItemCommentDto getItemById(@RequestHeader("X-Sharer-User-Id") Long userId, @PathVariable Long itemId) { + public ItemCommentDto getByItemIdWithComment(@RequestHeader("X-Sharer-User-Id") Long userId, + @PathVariable Long itemId) { return itemService.getByItemIdWithComment(userId, itemId); } @GetMapping - public List getItemByOwnerId(@RequestHeader("X-Sharer-User-Id") Long userId) { - return itemService.findAllByOwnerIdWithBookings(userId); + public List allItemByOwnerIdWithComment(@RequestHeader("X-Sharer-User-Id") Long userId) { + return itemService.allItemByOwnerIdWithComment(userId); } @GetMapping("/search") - public List getItemsByNameOrDescription(@RequestParam String text) { + public List getItemsByNameOrDescription(@RequestHeader("X-Sharer-User-Id") Long userId, + @RequestParam String text) { return itemService.getItemsByNameOrDescription(text); } diff --git a/src/main/java/ru/practicum/shareit/item/ItemMapper.java b/server/src/main/java/ru/practicum/shareit/item/ItemMapper.java similarity index 100% rename from src/main/java/ru/practicum/shareit/item/ItemMapper.java rename to server/src/main/java/ru/practicum/shareit/item/ItemMapper.java diff --git a/server/src/main/java/ru/practicum/shareit/item/dto/CommentCreateDto.java b/server/src/main/java/ru/practicum/shareit/item/dto/CommentCreateDto.java new file mode 100644 index 0000000..44fdc20 --- /dev/null +++ b/server/src/main/java/ru/practicum/shareit/item/dto/CommentCreateDto.java @@ -0,0 +1,11 @@ +package ru.practicum.shareit.item.dto; + +import lombok.Getter; +import lombok.Setter; + + +@Getter +@Setter +public class CommentCreateDto { + private String text; +} diff --git a/src/main/java/ru/practicum/shareit/item/dto/CommentDto.java b/server/src/main/java/ru/practicum/shareit/item/dto/CommentDto.java similarity index 100% rename from src/main/java/ru/practicum/shareit/item/dto/CommentDto.java rename to server/src/main/java/ru/practicum/shareit/item/dto/CommentDto.java diff --git a/src/main/java/ru/practicum/shareit/item/dto/CommentDtoReturn.java b/server/src/main/java/ru/practicum/shareit/item/dto/CommentDtoReturn.java similarity index 100% rename from src/main/java/ru/practicum/shareit/item/dto/CommentDtoReturn.java rename to server/src/main/java/ru/practicum/shareit/item/dto/CommentDtoReturn.java diff --git a/src/main/java/ru/practicum/shareit/item/dto/ItemCommentDto.java b/server/src/main/java/ru/practicum/shareit/item/dto/ItemCommentDto.java similarity index 100% rename from src/main/java/ru/practicum/shareit/item/dto/ItemCommentDto.java rename to server/src/main/java/ru/practicum/shareit/item/dto/ItemCommentDto.java diff --git a/server/src/main/java/ru/practicum/shareit/item/dto/ItemCreateDto.java b/server/src/main/java/ru/practicum/shareit/item/dto/ItemCreateDto.java new file mode 100644 index 0000000..d0f78f4 --- /dev/null +++ b/server/src/main/java/ru/practicum/shareit/item/dto/ItemCreateDto.java @@ -0,0 +1,14 @@ +package ru.practicum.shareit.item.dto; + +import lombok.Getter; +import lombok.Setter; + +@Getter +@Setter +public class ItemCreateDto { + private String name; + private String description; + private Boolean available; + private Long owner; + private Long requestId; +} diff --git a/src/main/java/ru/practicum/shareit/item/dto/ItemDto.java b/server/src/main/java/ru/practicum/shareit/item/dto/ItemDto.java similarity index 100% rename from src/main/java/ru/practicum/shareit/item/dto/ItemDto.java rename to server/src/main/java/ru/practicum/shareit/item/dto/ItemDto.java diff --git a/server/src/main/java/ru/practicum/shareit/item/dto/ItemUpdateDto.java b/server/src/main/java/ru/practicum/shareit/item/dto/ItemUpdateDto.java new file mode 100644 index 0000000..81b6409 --- /dev/null +++ b/server/src/main/java/ru/practicum/shareit/item/dto/ItemUpdateDto.java @@ -0,0 +1,12 @@ +package ru.practicum.shareit.item.dto; + +import lombok.Getter; +import lombok.Setter; + +@Getter +@Setter +public class ItemUpdateDto { + private String name; + private String description; + private Boolean available; +} diff --git a/src/main/java/ru/practicum/shareit/item/model/Comment.java b/server/src/main/java/ru/practicum/shareit/item/model/Comment.java similarity index 100% rename from src/main/java/ru/practicum/shareit/item/model/Comment.java rename to server/src/main/java/ru/practicum/shareit/item/model/Comment.java diff --git a/src/main/java/ru/practicum/shareit/item/model/Item.java b/server/src/main/java/ru/practicum/shareit/item/model/Item.java similarity index 100% rename from src/main/java/ru/practicum/shareit/item/model/Item.java rename to server/src/main/java/ru/practicum/shareit/item/model/Item.java diff --git a/src/main/java/ru/practicum/shareit/item/repository/CommentRepository.java b/server/src/main/java/ru/practicum/shareit/item/repository/CommentRepository.java similarity index 100% rename from src/main/java/ru/practicum/shareit/item/repository/CommentRepository.java rename to server/src/main/java/ru/practicum/shareit/item/repository/CommentRepository.java diff --git a/src/main/java/ru/practicum/shareit/item/repository/ItemRepository.java b/server/src/main/java/ru/practicum/shareit/item/repository/ItemRepository.java similarity index 96% rename from src/main/java/ru/practicum/shareit/item/repository/ItemRepository.java rename to server/src/main/java/ru/practicum/shareit/item/repository/ItemRepository.java index 3b7323b..92f1622 100644 --- a/src/main/java/ru/practicum/shareit/item/repository/ItemRepository.java +++ b/server/src/main/java/ru/practicum/shareit/item/repository/ItemRepository.java @@ -47,7 +47,7 @@ public interface ItemRepository extends JpaRepository { JOIN User u ON i.owner.id = u.id WHERE i.owner.id = :ownerId ORDER BY i.id ASC""") - List findAllByOwnerWithBookings(@Param("ownerId") Long ownerId); + List allItemByOwnerIdWithComment(@Param("ownerId") Long ownerId); @Query("SELECT i FROM Item i " + "WHERE i.available = true " + diff --git a/src/main/java/ru/practicum/shareit/item/service/ItemService.java b/server/src/main/java/ru/practicum/shareit/item/service/ItemService.java similarity index 75% rename from src/main/java/ru/practicum/shareit/item/service/ItemService.java rename to server/src/main/java/ru/practicum/shareit/item/service/ItemService.java index 333ccf9..1dc12f5 100644 --- a/src/main/java/ru/practicum/shareit/item/service/ItemService.java +++ b/server/src/main/java/ru/practicum/shareit/item/service/ItemService.java @@ -9,11 +9,11 @@ public interface ItemService { ItemCommentDto getByItemIdWithComment(long userId, long itemId); - List findAllByOwnerIdWithBookings(Long ownerId); + List allItemByOwnerIdWithComment(Long ownerId); ItemDto createItem(ItemCreateDto createDto, long ownerId); - ItemDto update(ItemUpdateDto updateDto, long ownerId, long itemId); + ItemDto updateItem(ItemUpdateDto updateDto, long ownerId, long itemId); List getItemsByNameOrDescription(String text); diff --git a/src/main/java/ru/practicum/shareit/item/service/ItemServiceImpl.java b/server/src/main/java/ru/practicum/shareit/item/service/ItemServiceImpl.java similarity index 95% rename from src/main/java/ru/practicum/shareit/item/service/ItemServiceImpl.java rename to server/src/main/java/ru/practicum/shareit/item/service/ItemServiceImpl.java index 48dedc0..0166ad3 100644 --- a/src/main/java/ru/practicum/shareit/item/service/ItemServiceImpl.java +++ b/server/src/main/java/ru/practicum/shareit/item/service/ItemServiceImpl.java @@ -62,8 +62,8 @@ public ItemCommentDto getByItemIdWithComment(long userId, long itemId) { } @Override - public List findAllByOwnerIdWithBookings(Long ownerId) { - List items = itemRepository.findAllByOwnerWithBookings(ownerId); + public List allItemByOwnerIdWithComment(Long ownerId) { + List items = itemRepository.allItemByOwnerIdWithComment(ownerId); if (items.isEmpty()) { throw new NotFoundException("У пользователя с ID " + ownerId + " нет вещей"); @@ -98,7 +98,7 @@ public ItemDto createItem(ItemCreateDto createDto, long ownerId) { } @Override - public ItemDto update(ItemUpdateDto updateDto, long ownerId, long itemId) { + public ItemDto updateItem(ItemUpdateDto updateDto, long ownerId, long itemId) { User owner = checkAndReturnUser(ownerId); Item item = checkAndReturnItem(itemId); diff --git a/src/main/java/ru/practicum/shareit/request/ItemRequest.java b/server/src/main/java/ru/practicum/shareit/request/ItemRequest.java similarity index 100% rename from src/main/java/ru/practicum/shareit/request/ItemRequest.java rename to server/src/main/java/ru/practicum/shareit/request/ItemRequest.java diff --git a/src/main/java/ru/practicum/shareit/request/ItemRequestController.java b/server/src/main/java/ru/practicum/shareit/request/ItemRequestController.java similarity index 88% rename from src/main/java/ru/practicum/shareit/request/ItemRequestController.java rename to server/src/main/java/ru/practicum/shareit/request/ItemRequestController.java index f146749..f04f9c6 100644 --- a/src/main/java/ru/practicum/shareit/request/ItemRequestController.java +++ b/server/src/main/java/ru/practicum/shareit/request/ItemRequestController.java @@ -1,7 +1,6 @@ package ru.practicum.shareit.request; import lombok.RequiredArgsConstructor; -import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.*; import ru.practicum.shareit.request.dto.ItemRequestCreateDto; import ru.practicum.shareit.request.dto.ItemRequestDto; @@ -10,7 +9,6 @@ import java.util.List; -@Validated @RequiredArgsConstructor @RestController @RequestMapping(path = "/requests") @@ -19,7 +17,7 @@ public class ItemRequestController { @PostMapping public ItemRequestDto createItemRequest(@RequestHeader("X-Sharer-User-Id") Long userId, - @Validated @RequestBody ItemRequestCreateDto createDto) { + @RequestBody ItemRequestCreateDto createDto) { return itemRequestService.createItemRequest(userId, createDto); } diff --git a/src/main/java/ru/practicum/shareit/request/ItemRequestMapper.java b/server/src/main/java/ru/practicum/shareit/request/ItemRequestMapper.java similarity index 100% rename from src/main/java/ru/practicum/shareit/request/ItemRequestMapper.java rename to server/src/main/java/ru/practicum/shareit/request/ItemRequestMapper.java diff --git a/src/main/java/ru/practicum/shareit/request/ItemRequestRepository.java b/server/src/main/java/ru/practicum/shareit/request/ItemRequestRepository.java similarity index 100% rename from src/main/java/ru/practicum/shareit/request/ItemRequestRepository.java rename to server/src/main/java/ru/practicum/shareit/request/ItemRequestRepository.java diff --git a/server/src/main/java/ru/practicum/shareit/request/dto/ItemRequestCreateDto.java b/server/src/main/java/ru/practicum/shareit/request/dto/ItemRequestCreateDto.java new file mode 100644 index 0000000..bf17188 --- /dev/null +++ b/server/src/main/java/ru/practicum/shareit/request/dto/ItemRequestCreateDto.java @@ -0,0 +1,12 @@ +package ru.practicum.shareit.request.dto; + + + +import lombok.*; + + +@Getter +@Setter +public class ItemRequestCreateDto { + private String description; +} diff --git a/src/main/java/ru/practicum/shareit/request/dto/ItemRequestDto.java b/server/src/main/java/ru/practicum/shareit/request/dto/ItemRequestDto.java similarity index 100% rename from src/main/java/ru/practicum/shareit/request/dto/ItemRequestDto.java rename to server/src/main/java/ru/practicum/shareit/request/dto/ItemRequestDto.java diff --git a/src/main/java/ru/practicum/shareit/request/service/ItemRequestService.java b/server/src/main/java/ru/practicum/shareit/request/service/ItemRequestService.java similarity index 100% rename from src/main/java/ru/practicum/shareit/request/service/ItemRequestService.java rename to server/src/main/java/ru/practicum/shareit/request/service/ItemRequestService.java diff --git a/src/main/java/ru/practicum/shareit/request/service/ItemRequestServiceImpl.java b/server/src/main/java/ru/practicum/shareit/request/service/ItemRequestServiceImpl.java similarity index 100% rename from src/main/java/ru/practicum/shareit/request/service/ItemRequestServiceImpl.java rename to server/src/main/java/ru/practicum/shareit/request/service/ItemRequestServiceImpl.java diff --git a/src/main/java/ru/practicum/shareit/user/User.java b/server/src/main/java/ru/practicum/shareit/user/User.java similarity index 100% rename from src/main/java/ru/practicum/shareit/user/User.java rename to server/src/main/java/ru/practicum/shareit/user/User.java diff --git a/src/main/java/ru/practicum/shareit/user/UserController.java b/server/src/main/java/ru/practicum/shareit/user/UserController.java similarity index 85% rename from src/main/java/ru/practicum/shareit/user/UserController.java rename to server/src/main/java/ru/practicum/shareit/user/UserController.java index 9d688ce..2bc3c41 100644 --- a/src/main/java/ru/practicum/shareit/user/UserController.java +++ b/server/src/main/java/ru/practicum/shareit/user/UserController.java @@ -1,7 +1,7 @@ package ru.practicum.shareit.user; import lombok.RequiredArgsConstructor; -import org.springframework.validation.annotation.Validated; +import org.springframework.http.HttpStatus; import org.springframework.web.bind.annotation.*; import ru.practicum.shareit.user.dto.UserCreateDto; import ru.practicum.shareit.user.dto.UserDto; @@ -10,7 +10,6 @@ import java.util.Collection; -@Validated @RestController @RequiredArgsConstructor @RequestMapping("/users") @@ -19,14 +18,14 @@ public class UserController { private final UserMapper userMapper; @PostMapping - public UserDto create(@RequestBody @Validated UserCreateDto userDto) { + public UserDto create(@RequestBody UserCreateDto userDto) { User user = userMapper.createDtoToModel(userDto); return userMapper.modelToDto(userService.create(user)); } @PatchMapping("/{userId}") public UserDto update(@PathVariable Long userId, - @RequestBody @Validated UserUpdateDto userDto) { + @RequestBody UserUpdateDto userDto) { User user = userMapper.updateDtoToModel(userDto, userId); return userMapper.modelToDto(userService.update(user)); } @@ -41,6 +40,7 @@ public Collection getAll() { return userMapper.listModelToDto(userService.getAll()); } + @ResponseStatus(HttpStatus.OK) @DeleteMapping("/{userId}") public void deleteUser(@PathVariable long userId) { userService.deleteUser(userId); diff --git a/src/main/java/ru/practicum/shareit/user/UserMapper.java b/server/src/main/java/ru/practicum/shareit/user/UserMapper.java similarity index 100% rename from src/main/java/ru/practicum/shareit/user/UserMapper.java rename to server/src/main/java/ru/practicum/shareit/user/UserMapper.java diff --git a/src/main/java/ru/practicum/shareit/user/UserRepository.java b/server/src/main/java/ru/practicum/shareit/user/UserRepository.java similarity index 100% rename from src/main/java/ru/practicum/shareit/user/UserRepository.java rename to server/src/main/java/ru/practicum/shareit/user/UserRepository.java diff --git a/server/src/main/java/ru/practicum/shareit/user/dto/UserCreateDto.java b/server/src/main/java/ru/practicum/shareit/user/dto/UserCreateDto.java new file mode 100644 index 0000000..981b1d8 --- /dev/null +++ b/server/src/main/java/ru/practicum/shareit/user/dto/UserCreateDto.java @@ -0,0 +1,9 @@ +package ru.practicum.shareit.user.dto; + +import lombok.Data; + +@Data +public class UserCreateDto { + private String name; + private String email; +} diff --git a/src/main/java/ru/practicum/shareit/user/dto/UserDto.java b/server/src/main/java/ru/practicum/shareit/user/dto/UserDto.java similarity index 100% rename from src/main/java/ru/practicum/shareit/user/dto/UserDto.java rename to server/src/main/java/ru/practicum/shareit/user/dto/UserDto.java diff --git a/server/src/main/java/ru/practicum/shareit/user/dto/UserUpdateDto.java b/server/src/main/java/ru/practicum/shareit/user/dto/UserUpdateDto.java new file mode 100644 index 0000000..7f46bad --- /dev/null +++ b/server/src/main/java/ru/practicum/shareit/user/dto/UserUpdateDto.java @@ -0,0 +1,9 @@ +package ru.practicum.shareit.user.dto; + +import lombok.Data; + +@Data +public class UserUpdateDto { + private String name; + private String email; +} diff --git a/src/main/java/ru/practicum/shareit/user/service/UserService.java b/server/src/main/java/ru/practicum/shareit/user/service/UserService.java similarity index 100% rename from src/main/java/ru/practicum/shareit/user/service/UserService.java rename to server/src/main/java/ru/practicum/shareit/user/service/UserService.java diff --git a/src/main/java/ru/practicum/shareit/user/service/UserServiceImpl.java b/server/src/main/java/ru/practicum/shareit/user/service/UserServiceImpl.java similarity index 100% rename from src/main/java/ru/practicum/shareit/user/service/UserServiceImpl.java rename to server/src/main/java/ru/practicum/shareit/user/service/UserServiceImpl.java diff --git a/src/main/resources/application.properties b/server/src/main/resources/application.properties similarity index 85% rename from src/main/resources/application.properties rename to server/src/main/resources/application.properties index 2201553..5cc3dc7 100644 --- a/src/main/resources/application.properties +++ b/server/src/main/resources/application.properties @@ -1,6 +1,8 @@ + +server.port=9090 + spring.jpa.hibernate.ddl-auto=none spring.jpa.properties.hibernate.format_sql=true - spring.sql.init.mode=always logging.level.org.zalando.logbook= TRACE @@ -12,9 +14,9 @@ logging.level.org.springframework.orm.jpa.JpaTransactionManager=DEBUG spring.datasource.driverClassName=org.postgresql.Driver -spring.datasource.url=jdbc:postgresql://localhost:5432/shareit +spring.datasource.url=jdbc:postgresql://localhost:6541/shareit spring.datasource.username=shareit -spring.datasource.password=12345 +spring.datasource.password=shareit diff --git a/src/main/resources/schema.sql b/server/src/main/resources/schema.sql similarity index 100% rename from src/main/resources/schema.sql rename to server/src/main/resources/schema.sql diff --git a/src/test/java/ru/practicum/shareit/ShareItTests.java b/server/src/test/java/ru/practicum/shareit/ShareItTests.java similarity index 100% rename from src/test/java/ru/practicum/shareit/ShareItTests.java rename to server/src/test/java/ru/practicum/shareit/ShareItTests.java diff --git a/src/test/resources/application.properties b/server/src/test/resources/application.properties similarity index 100% rename from src/test/resources/application.properties rename to server/src/test/resources/application.properties diff --git a/src/main/java/ru/practicum/shareit/booking/dto/BookingCreateDto.java b/src/main/java/ru/practicum/shareit/booking/dto/BookingCreateDto.java deleted file mode 100644 index ffa28b5..0000000 --- a/src/main/java/ru/practicum/shareit/booking/dto/BookingCreateDto.java +++ /dev/null @@ -1,40 +0,0 @@ -package ru.practicum.shareit.booking.dto; - -import jakarta.validation.constraints.AssertTrue; -import jakarta.validation.constraints.Future; -import jakarta.validation.constraints.FutureOrPresent; -import jakarta.validation.constraints.NotNull; -import lombok.Data; -import org.springframework.stereotype.Component; - -import java.time.LocalDateTime; -import java.time.temporal.ChronoUnit; - -@Component -@Data -public class BookingCreateDto { - @NotNull - @FutureOrPresent - private LocalDateTime start; - @NotNull - @Future - private LocalDateTime end; - @NotNull - private Long itemId; - - @AssertTrue(message = "Дата окончания должна быть позже даты начала") - boolean isStartBeforeEnd() { - return start != null && - end != null && - start.isBefore(end); - } - - public void normalizeTimestamps() { - if (start != null) { - start = start.truncatedTo(ChronoUnit.SECONDS); - } - if (end != null) { - end = end.truncatedTo(ChronoUnit.SECONDS); - } - } -} diff --git a/src/main/java/ru/practicum/shareit/booking/dto/BookingUpdateDto.java b/src/main/java/ru/practicum/shareit/booking/dto/BookingUpdateDto.java deleted file mode 100644 index 0673edf..0000000 --- a/src/main/java/ru/practicum/shareit/booking/dto/BookingUpdateDto.java +++ /dev/null @@ -1,26 +0,0 @@ -package ru.practicum.shareit.booking.dto; - -import jakarta.validation.constraints.AssertTrue; -import jakarta.validation.constraints.Null; -import lombok.Data; -import ru.practicum.shareit.booking.BookingStatus; - -import java.time.LocalDateTime; - -@Data -public class BookingUpdateDto { - @Null - private Long id; - private LocalDateTime start; - private LocalDateTime end; - private Long itemId; - private Long booker; - private BookingStatus bookingStatus; - - @AssertTrue(message = "Дата окончания должна быть позже даты начала") - boolean isStartBeforeEnd() { - return start != null && - end != null && - start.isBefore(end); - } -} From 2a99e328b36e10601ed59864b054264e0ee86c52 Mon Sep 17 00:00:00 2001 From: Just Roma Date: Mon, 30 Jun 2025 21:04:56 +0500 Subject: [PATCH 3/8] add all test Repository --- .run/ShareItServer.run.xml | 2 +- .../shareit/booking/BookingClient.java | 7 +- .../src/main/resources/application.properties | 2 + .../shareit/booking/BookingRepository.java | 32 ++++- .../shareit/booking/dto/BookingCreateDto.java | 3 + .../item/repository/ItemRepository.java | 2 - .../request/ItemRequestController.java | 2 +- .../request/ItemRequestRepository.java | 2 +- .../request/service/ItemRequestService.java | 2 +- .../service/ItemRequestServiceImpl.java | 4 +- .../shareit/user/UserController.java | 15 +-- .../shareit/user/service/UserService.java | 12 +- .../shareit/user/service/UserServiceImpl.java | 33 ++--- .../src/main/resources/application.properties | 2 +- .../booking/BookingRepositoryTest.java | 115 ++++++++++++++++++ .../repository/CommentRepositoryTest.java | 92 ++++++++++++++ .../item/repository/ItemRepositoryTest.java | 95 +++++++++++++++ .../request/ItemRequestRepositoryTest.java | 42 +++++++ .../src/test/resources/application.properties | 27 ++++ server/src/test/resources/data.sql | 35 ++++++ 20 files changed, 481 insertions(+), 45 deletions(-) create mode 100644 server/src/test/java/ru/practicum/shareit/booking/BookingRepositoryTest.java create mode 100644 server/src/test/java/ru/practicum/shareit/item/repository/CommentRepositoryTest.java create mode 100644 server/src/test/java/ru/practicum/shareit/item/repository/ItemRepositoryTest.java create mode 100644 server/src/test/java/ru/practicum/shareit/request/ItemRequestRepositoryTest.java create mode 100644 server/src/test/resources/data.sql diff --git a/.run/ShareItServer.run.xml b/.run/ShareItServer.run.xml index 66672d1..5f869f3 100644 --- a/.run/ShareItServer.run.xml +++ b/.run/ShareItServer.run.xml @@ -3,7 +3,7 @@