From c79b634722bacf10e4e02ffabd8c110e828a0247 Mon Sep 17 00:00:00 2001 From: Indira Date: Thu, 13 Jun 2024 22:55:50 +0300 Subject: [PATCH 1/4] =?UTF-8?q?feat:=20=D0=A0=D0=B0=D0=B7=D0=B4=D0=B5?= =?UTF-8?q?=D0=BB=D0=B5=D0=BD=D0=B8=D0=B5=20=D0=BF=D1=80=D0=BE=D0=B3=D1=80?= =?UTF-8?q?=D0=B0=D0=BC=D0=BC=D1=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docker-compose.yml | 55 ++++++++ gateway/Dockerfile | 5 + gateway/pom.xml | 70 ++++++++++ .../ru/practicum/shareit/ShareItGateway.java | 12 ++ .../shareit/booking/BookingClient.java | 60 +++++++++ .../shareit/booking/BookingController.java | 60 +++++++++ .../booking/dto/BookItemRequestDto.java | 21 ++- .../practicum/shareit/booking/dto/State.java | 27 ++++ .../practicum/shareit/client/BaseClient.java | 125 ++++++++++++++++++ .../shareit/exception/ErrorHandler.java | 21 +++ .../ru/practicum/shareit/item/ItemClient.java | 66 +++++++++ .../shareit/item/ItemController.java | 64 +++++++++ .../shareit/item/dto/CommentDto.java | 17 +++ .../practicum/shareit/item/dto/ItemDto.java | 13 +- .../shareit/request/ItemRequestClient.java | 44 ++++++ .../request/ItemRequestController.java | 43 ++++++ .../shareit/request/dto/ItemRequestDto.java | 16 +++ .../ru/practicum/shareit/user/UserClient.java | 51 +++++++ .../shareit/user/UserController.java | 45 +++++++ .../practicum/shareit/user/dto/UserDto.java | 15 ++- .../java/ru/practicum/shareit/valid/Add.java | 0 .../ru/practicum/shareit/valid/Update.java | 0 .../src/main/resources/application.properties | 7 + pom.xml | 98 +++++--------- server/Dockerfile | 5 + server/pom.xml | 86 ++++++++++++ .../java/ru/practicum/shareit/ShareItApp.java | 6 +- .../shareit/booking/BookingController.java | 14 +- .../shareit/booking/BookingMapper.java | 5 + .../shareit/booking/BookingRepository.java | 0 .../shareit/booking/BookingService.java | 0 .../shareit/booking/BookingServiceImpl.java | 1 + .../ru/practicum/shareit/booking/State.java | 0 .../ru/practicum/shareit/booking/Status.java | 0 .../shareit/booking/dto/BookingDto.java | 0 .../shareit/booking/dto/BookingDtoAdd.java | 23 ++++ .../shareit/booking/model/Booking.java | 4 - .../exception/BadRequestException.java | 0 .../shareit/exception/ErrorHandler.java | 0 .../shareit/exception/ErrorResponse.java | 0 .../exception/ObjectNotFoundException.java | 0 .../practicum/shareit/item/CommentMapper.java | 0 .../shareit/item/CommentRepository.java | 0 .../shareit/item/ItemController.java | 23 ++-- .../ru/practicum/shareit/item/ItemMapper.java | 0 .../shareit/item/ItemRepository.java | 0 .../practicum/shareit/item/ItemService.java | 0 .../shareit/item/ItemServiceImpl.java | 4 +- .../shareit/item/dto/CommentDto.java | 3 - .../practicum/shareit/item/dto/ItemDto.java | 25 ++++ .../shareit/item/dto/ItemDtoComments.java | 9 +- .../shareit/item/dto/ItemDtoRequest.java | 0 .../practicum/shareit/item/model/Comment.java | 3 - .../ru/practicum/shareit/item/model/Item.java | 3 - .../request/ItemRequestController.java | 9 +- .../shareit/request/ItemRequestMapper.java | 0 .../request/ItemRequestRepository.java | 0 .../shareit/request/ItemRequestService.java | 0 .../request/ItemRequestServiceImpl.java | 0 .../shareit/request/dto/ItemRequestDto.java | 1 - .../shareit/request/model/ItemRequest.java | 1 - .../shareit/user/UserController.java | 13 +- .../ru/practicum/shareit/user/UserMapper.java | 0 .../shareit/user/UserRepository.java | 0 .../practicum/shareit/user/UserService.java | 0 .../shareit/user/UserServiceImpl.java | 0 .../practicum/shareit/user/dto/UserDto.java | 17 +++ .../ru/practicum/shareit/user/model/User.java | 7 - .../java/ru/practicum/shareit/valid/Add.java | 4 + .../ru/practicum/shareit/valid/Update.java | 4 + .../main/resources/application.properties | 2 + {src => server/src}/main/resources/schema.sql | 0 .../ru/practicum/shareit/ShareItTests.java | 0 .../booking/BookingControllerTest.java | 16 --- .../shareit/booking/BookingDtoJsonTest.java | 0 .../booking/BookingServiceImplTest.java | 0 .../shareit/item/ItemControllerTest.java | 14 -- .../shareit/item/ItemDtoJsonTest.java | 0 .../shareit/item/ItemRepositoryTest.java | 0 .../item/ItemServiceImplIntegrationTest.java | 17 +-- .../shareit/item/ItemServiceImplTest.java | 4 +- .../request/ItemRequestControllerTest.java | 0 .../request/ItemRequestDtoJsonTest.java | 0 ...ItemRequestServiceImplIntegrationTest.java | 0 .../request/ItemRequestServiceImplTest.java | 0 .../shareit/user/UserControllerTest.java | 29 ---- .../shareit/user/UserDtoJsonTest.java | 0 .../user/UserServiceImplIntegrationTest.java | 0 .../shareit/user/UserServiceImplTest.java | 0 89 files changed, 1056 insertions(+), 231 deletions(-) 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 rename src/main/java/ru/practicum/shareit/booking/dto/BookingDtoAdd.java => gateway/src/main/java/ru/practicum/shareit/booking/dto/BookItemRequestDto.java (71%) create mode 100644 gateway/src/main/java/ru/practicum/shareit/booking/dto/State.java create mode 100644 gateway/src/main/java/ru/practicum/shareit/client/BaseClient.java create mode 100644 gateway/src/main/java/ru/practicum/shareit/exception/ErrorHandler.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 create mode 100644 gateway/src/main/java/ru/practicum/shareit/item/dto/CommentDto.java rename {src => gateway/src}/main/java/ru/practicum/shareit/item/dto/ItemDto.java (86%) 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 create mode 100644 gateway/src/main/java/ru/practicum/shareit/request/dto/ItemRequestDto.java 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/UserDto.java (71%) rename {src => gateway/src}/main/java/ru/practicum/shareit/valid/Add.java (100%) rename {src => gateway/src}/main/java/ru/practicum/shareit/valid/Update.java (100%) create mode 100644 gateway/src/main/resources/application.properties create mode 100644 server/Dockerfile create mode 100644 server/pom.xml rename {src => server/src}/main/java/ru/practicum/shareit/ShareItApp.java (65%) rename {src => server/src}/main/java/ru/practicum/shareit/booking/BookingController.java (72%) rename {src => server/src}/main/java/ru/practicum/shareit/booking/BookingMapper.java (88%) rename {src => server/src}/main/java/ru/practicum/shareit/booking/BookingRepository.java (100%) rename {src => server/src}/main/java/ru/practicum/shareit/booking/BookingService.java (100%) rename {src => server/src}/main/java/ru/practicum/shareit/booking/BookingServiceImpl.java (99%) rename {src => server/src}/main/java/ru/practicum/shareit/booking/State.java (100%) rename {src => server/src}/main/java/ru/practicum/shareit/booking/Status.java (100%) rename {src => server/src}/main/java/ru/practicum/shareit/booking/dto/BookingDto.java (100%) create mode 100644 server/src/main/java/ru/practicum/shareit/booking/dto/BookingDtoAdd.java rename {src => server/src}/main/java/ru/practicum/shareit/booking/model/Booking.java (92%) rename {src => server/src}/main/java/ru/practicum/shareit/exception/BadRequestException.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/ObjectNotFoundException.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/CommentRepository.java (100%) rename {src => server/src}/main/java/ru/practicum/shareit/item/ItemController.java (63%) rename {src => server/src}/main/java/ru/practicum/shareit/item/ItemMapper.java (100%) rename {src => server/src}/main/java/ru/practicum/shareit/item/ItemRepository.java (100%) rename {src => server/src}/main/java/ru/practicum/shareit/item/ItemService.java (100%) rename {src => server/src}/main/java/ru/practicum/shareit/item/ItemServiceImpl.java (98%) rename {src => server/src}/main/java/ru/practicum/shareit/item/dto/CommentDto.java (75%) create mode 100644 server/src/main/java/ru/practicum/shareit/item/dto/ItemDto.java rename {src => server/src}/main/java/ru/practicum/shareit/item/dto/ItemDtoComments.java (72%) rename {src => server/src}/main/java/ru/practicum/shareit/item/dto/ItemDtoRequest.java (100%) rename {src => server/src}/main/java/ru/practicum/shareit/item/model/Comment.java (95%) rename {src => server/src}/main/java/ru/practicum/shareit/item/model/Item.java (89%) rename {src => server/src}/main/java/ru/practicum/shareit/request/ItemRequestController.java (75%) 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%) rename {src => server/src}/main/java/ru/practicum/shareit/request/ItemRequestService.java (100%) rename {src => server/src}/main/java/ru/practicum/shareit/request/ItemRequestServiceImpl.java (100%) rename {src => server/src}/main/java/ru/practicum/shareit/request/dto/ItemRequestDto.java (97%) rename {src => server/src}/main/java/ru/practicum/shareit/request/model/ItemRequest.java (98%) rename {src => server/src}/main/java/ru/practicum/shareit/user/UserController.java (60%) 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%) rename {src => server/src}/main/java/ru/practicum/shareit/user/UserService.java (100%) rename {src => server/src}/main/java/ru/practicum/shareit/user/UserServiceImpl.java (100%) create mode 100644 server/src/main/java/ru/practicum/shareit/user/dto/UserDto.java rename {src => server/src}/main/java/ru/practicum/shareit/user/model/User.java (61%) create mode 100644 server/src/main/java/ru/practicum/shareit/valid/Add.java create mode 100644 server/src/main/java/ru/practicum/shareit/valid/Update.java rename {src => server/src}/main/resources/application.properties (98%) 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/java/ru/practicum/shareit/booking/BookingControllerTest.java (89%) rename {src => server/src}/test/java/ru/practicum/shareit/booking/BookingDtoJsonTest.java (100%) rename {src => server/src}/test/java/ru/practicum/shareit/booking/BookingServiceImplTest.java (100%) rename {src => server/src}/test/java/ru/practicum/shareit/item/ItemControllerTest.java (91%) rename {src => server/src}/test/java/ru/practicum/shareit/item/ItemDtoJsonTest.java (100%) rename {src => server/src}/test/java/ru/practicum/shareit/item/ItemRepositoryTest.java (100%) rename {src => server/src}/test/java/ru/practicum/shareit/item/ItemServiceImplIntegrationTest.java (89%) rename {src => server/src}/test/java/ru/practicum/shareit/item/ItemServiceImplTest.java (98%) rename {src => server/src}/test/java/ru/practicum/shareit/request/ItemRequestControllerTest.java (100%) rename {src => server/src}/test/java/ru/practicum/shareit/request/ItemRequestDtoJsonTest.java (100%) rename {src => server/src}/test/java/ru/practicum/shareit/request/ItemRequestServiceImplIntegrationTest.java (100%) rename {src => server/src}/test/java/ru/practicum/shareit/request/ItemRequestServiceImplTest.java (100%) rename {src => server/src}/test/java/ru/practicum/shareit/user/UserControllerTest.java (83%) rename {src => server/src}/test/java/ru/practicum/shareit/user/UserDtoJsonTest.java (100%) rename {src => server/src}/test/java/ru/practicum/shareit/user/UserServiceImplIntegrationTest.java (100%) rename {src => server/src}/test/java/ru/practicum/shareit/user/UserServiceImplTest.java (100%) diff --git a/docker-compose.yml b/docker-compose.yml new file mode 100644 index 0000000..2bd6f7d --- /dev/null +++ b/docker-compose.yml @@ -0,0 +1,55 @@ +# версия Docker Compose +version: '3.8' + +# имена и описания контейнеров, которые должны быть развёрнуты +services: + # описание контейнера gateway + gateway: + build: + context: ./gateway + dockerfile: ./Dockerfile + # имя контейнера + container_name: gateway-container + # проброс портов + ports: + - "8080:8080" + # "зависит от", + depends_on: + - server + # переменные окружения + environment: + - SHAREIT_SERVER_URL=http://server:9090 + + # описание контейнера server + server: + build: + context: ./server + dockerfile: ./Dockerfile + # имя контейнера + container_name: server-container + # проброс портов + ports: + - "9090:9090" + # "зависит от", + depends_on: + - db + # переменные окружения + environment: + - SPRING_DATASOURCE_URL=jdbc:postgresql://db:5432/shareit + - SPRING_DATASOURCE_USERNAME=root + - SPRING_DATASOURCE_PASSWORD=root + + # описание контейнера db + db: + # образ, из которого должен быть запущен контейнер + image: postgres:14 + # имя контейнера + container_name: db-container + # проброс портов + ports: + - "5432:5432" + # переменные окружения + environment: + - POSTGRES_PASSWORD=root + - POSTGRES_USER=root + - POSTGRES_DB=shareit \ No newline at end of file diff --git a/gateway/Dockerfile b/gateway/Dockerfile new file mode 100644 index 0000000..e603739 --- /dev/null +++ b/gateway/Dockerfile @@ -0,0 +1,5 @@ +FROM eclipse-temurin:11-jre-jammy +VOLUME /tmp +ARG JAR_FILE=target/*.jar +COPY ${JAR_FILE} app.jar +ENTRYPOINT ["sh", "-c", "java ${JAVA_OPTS} -jar -Dserver.port=8080 /app.jar"] \ No newline at end of file diff --git a/gateway/pom.xml b/gateway/pom.xml new file mode 100644 index 0000000..b3aa288 --- /dev/null +++ b/gateway/pom.xml @@ -0,0 +1,70 @@ + + + 4.0.0 + + ru.practicum + shareit + 0.0.1-SNAPSHOT + + + shareit-gateway + 0.0.1-SNAPSHOT + + ShareIt Gateway + + + 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.springframework.boot + spring-boot-configuration-processor + true + + + + org.projectlombok + lombok + true + + + + org.apache.httpcomponents + httpclient + + + + 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..e659d11 --- /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..b97091b --- /dev/null +++ b/gateway/src/main/java/ru/practicum/shareit/booking/BookingClient.java @@ -0,0 +1,60 @@ +package ru.practicum.shareit.booking; + +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.BookItemRequestDto; +import ru.practicum.shareit.booking.dto.State; +import ru.practicum.shareit.client.BaseClient; + +import java.util.Map; + +@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(HttpComponentsClientHttpRequestFactory::new) + .build() + ); + } + + public ResponseEntity getBookingById(Integer bookingId, Integer userId) { + return get("/" + bookingId, userId); + } + + public ResponseEntity getAllBookingOfUser(State state, Integer userId, 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 getAllBookingOfOwner(State state, Integer userId, 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 getConsentToBooking(Integer bookingId, Integer userId, Boolean approved) { + Map parameters = Map.of("approved", approved); + return patch("/" + bookingId + "?approved={approved}", userId, parameters, null); + } + + public ResponseEntity addBookingRequest(BookItemRequestDto requestDto, Integer userId) { + return post("", userId, requestDto); + } +} 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..a26db7f --- /dev/null +++ b/gateway/src/main/java/ru/practicum/shareit/booking/BookingController.java @@ -0,0 +1,60 @@ +package ru.practicum.shareit.booking; + +import lombok.RequiredArgsConstructor; +import org.springframework.http.ResponseEntity; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; +import ru.practicum.shareit.booking.dto.BookItemRequestDto; +import ru.practicum.shareit.booking.dto.State; +import ru.practicum.shareit.valid.Add; + +import javax.validation.Valid; +import javax.validation.constraints.Positive; +import javax.validation.constraints.PositiveOrZero; + +@RestController +@RequestMapping(path = "/bookings") +@RequiredArgsConstructor +public class BookingController { + + private final BookingClient bookingClient; + + @GetMapping("/{bookingId}") + public ResponseEntity getBookingById(@PathVariable Integer bookingId, + @RequestHeader("X-Sharer-User-Id") Integer userId) { + return bookingClient.getBookingById(bookingId, userId); + } + + @GetMapping + public ResponseEntity getAllBookingOfUser(@RequestParam(name = "state", defaultValue = "ALL") String stateParam, + @RequestHeader("X-Sharer-User-Id") Integer userId, + @PositiveOrZero @RequestParam(defaultValue = "0") Integer from, + @Positive @RequestParam(defaultValue = "30") Integer size) { + State state = State.from(stateParam) + .orElseThrow(() -> new IllegalArgumentException("Unknown state: " + stateParam)); + return bookingClient.getAllBookingOfUser(state, userId, from, size); + } + + @GetMapping("/owner") + public ResponseEntity getAllBookingOfOwner(@RequestParam(name = "state", defaultValue = "ALL") String stateParam, + @RequestHeader("X-Sharer-User-Id") Integer userId, + @PositiveOrZero @RequestParam(defaultValue = "0") Integer from, + @Positive @RequestParam(defaultValue = "30") Integer size) { + State state = State.from(stateParam) + .orElseThrow(() -> new IllegalArgumentException("Unknown state: " + stateParam)); + return bookingClient.getAllBookingOfOwner(state, userId, from, size); + } + + @PatchMapping("/{bookingId}") + public ResponseEntity getConsentToBooking(@PathVariable Integer bookingId, + @RequestHeader("X-Sharer-User-Id") Integer userId, + @RequestParam Boolean approved) { + return bookingClient.getConsentToBooking(bookingId, userId, approved); + } + + @PostMapping + public ResponseEntity addBookingRequest(@Validated(Add.class) @RequestBody BookItemRequestDto requestDto, + @RequestHeader("X-Sharer-User-Id") Integer userId) { + return bookingClient.addBookingRequest(requestDto, userId); + } +} diff --git a/src/main/java/ru/practicum/shareit/booking/dto/BookingDtoAdd.java b/gateway/src/main/java/ru/practicum/shareit/booking/dto/BookItemRequestDto.java similarity index 71% rename from src/main/java/ru/practicum/shareit/booking/dto/BookingDtoAdd.java rename to gateway/src/main/java/ru/practicum/shareit/booking/dto/BookItemRequestDto.java index 4ec2ad1..4d8695c 100644 --- a/src/main/java/ru/practicum/shareit/booking/dto/BookingDtoAdd.java +++ b/gateway/src/main/java/ru/practicum/shareit/booking/dto/BookItemRequestDto.java @@ -1,31 +1,28 @@ package ru.practicum.shareit.booking.dto; import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.Data; +import lombok.Getter; import lombok.NoArgsConstructor; import ru.practicum.shareit.valid.Add; +import javax.validation.constraints.Future; import javax.validation.constraints.FutureOrPresent; import javax.validation.constraints.NotNull; import java.time.LocalDateTime; -@Data -@Builder -@AllArgsConstructor +@Getter @NoArgsConstructor -public class BookingDtoAdd { +@AllArgsConstructor +public class BookItemRequestDto { - private Integer id; + @NotNull + private Integer itemId; @NotNull(groups = {Add.class}) - @FutureOrPresent(groups = {Add.class}) + // @FutureOrPresent(groups = {Add.class}) private LocalDateTime start; @NotNull(groups = {Add.class}) - @FutureOrPresent(groups = {Add.class}) + // @Future(groups = {Add.class}) private LocalDateTime end; - - @NotNull - private Integer itemId; } diff --git a/gateway/src/main/java/ru/practicum/shareit/booking/dto/State.java b/gateway/src/main/java/ru/practicum/shareit/booking/dto/State.java new file mode 100644 index 0000000..4ce22ab --- /dev/null +++ b/gateway/src/main/java/ru/practicum/shareit/booking/dto/State.java @@ -0,0 +1,27 @@ +package ru.practicum.shareit.booking.dto; + +import java.util.Optional; + +public enum State { + // Все + ALL, + // Текущие + CURRENT, + // Будущие + FUTURE, + // Завершенные + PAST, + // Отклоненные + REJECTED, + // Ожидающие подтверждения + WAITING; + + public static Optional from(String stringState) { + for (State state : values()) { + if (state.name().equalsIgnoreCase(stringState)) { + return Optional.of(state); + } + } + return Optional.empty(); + } +} \ No newline at end of file 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..35acf29 --- /dev/null +++ b/gateway/src/main/java/ru/practicum/shareit/client/BaseClient.java @@ -0,0 +1,125 @@ +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, Integer userId) { + return get(path, userId, null); + } + + protected ResponseEntity get(String path, Integer userId, @Nullable Map parameters) { + return makeAndSendRequest(HttpMethod.GET, path, userId, parameters, null); + } + + protected ResponseEntity get(String path, @Nullable Map parameters) { + return makeAndSendRequest(HttpMethod.GET, path, null, parameters, null); + } + + protected ResponseEntity post(String path, T body) { + return post(path, null, null, body); + } + + protected ResponseEntity post(String path, Integer userId, T body) { + return post(path, userId, null, body); + } + + protected ResponseEntity post(String path, Integer userId, @Nullable Map parameters, T body) { + return makeAndSendRequest(HttpMethod.POST, path, userId, parameters, body); + } + + protected ResponseEntity put(String path, Integer userId, T body) { + return put(path, userId, null, body); + } + + protected ResponseEntity put(String path, Integer 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, Integer userId) { + return patch(path, userId, null, null); + } + + protected ResponseEntity patch(String path, Integer userId, T body) { + return patch(path, userId, null, body); + } + + protected ResponseEntity patch(String path, Integer 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, Integer userId) { + return delete(path, userId, null); + } + + protected ResponseEntity delete(String path, Integer userId, @Nullable Map parameters) { + return makeAndSendRequest(HttpMethod.DELETE, path, userId, parameters, null); + } + + private ResponseEntity makeAndSendRequest(HttpMethod method, String path, Integer 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(Integer 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/exception/ErrorHandler.java b/gateway/src/main/java/ru/practicum/shareit/exception/ErrorHandler.java new file mode 100644 index 0000000..00f1233 --- /dev/null +++ b/gateway/src/main/java/ru/practicum/shareit/exception/ErrorHandler.java @@ -0,0 +1,21 @@ +package ru.practicum.shareit.exception; + +import org.springframework.http.HttpStatus; +import org.springframework.web.bind.annotation.ControllerAdvice; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.ExceptionHandler; + +import java.util.HashMap; +import java.util.Map; + +@ControllerAdvice +public class ErrorHandler { + + @ExceptionHandler + public ResponseEntity> validationException(final IllegalArgumentException ex) { + Map map = new HashMap<>(); + String message = "Unknown state: UNSUPPORTED_STATUS"; + map.put("error", message); + return new ResponseEntity<>(map, HttpStatus.INTERNAL_SERVER_ERROR); + } +} 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..3c6600a --- /dev/null +++ b/gateway/src/main/java/ru/practicum/shareit/item/ItemClient.java @@ -0,0 +1,66 @@ +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.util.DefaultUriBuilderFactory; +import ru.practicum.shareit.client.BaseClient; +import ru.practicum.shareit.item.dto.CommentDto; +import ru.practicum.shareit.item.dto.ItemDto; + +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(HttpComponentsClientHttpRequestFactory::new) + .build() + ); + } + + public ResponseEntity getItemsOfUser(Integer userId, Integer from, Integer size) { + Map parameters = Map.of( + "from", from, + "size", size + ); + return get("?from={from}&size={size}", userId, parameters); + } + + public ResponseEntity getItemById(Integer itemId, Integer userId) { + return get("/" + itemId, userId); + } + + public ResponseEntity getItems(String text,Integer from, Integer size) { + Map parameters = Map.of( + "text", text, + "from", from, + "size", size + ); + return get("/search?text={text}", parameters); + } + + public ResponseEntity updateItem(ItemDto itemDto, Integer itemId, Integer userId) { + return patch("/" + itemId, userId, itemDto); + } + + public ResponseEntity addItem(ItemDto itemDto, Integer userId) { + return post("", userId, itemDto); + } + + public ResponseEntity addComment(Integer itemId, Integer userId, CommentDto commentDto) { + return post("/" + itemId + "/comment", userId, commentDto); + } + + public ResponseEntity deleteItem(Integer itemId) { + return delete("/" + itemId); + } +} 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..bc1118d --- /dev/null +++ b/gateway/src/main/java/ru/practicum/shareit/item/ItemController.java @@ -0,0 +1,64 @@ +package ru.practicum.shareit.item; + +import lombok.RequiredArgsConstructor; +import org.springframework.http.ResponseEntity; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; +import ru.practicum.shareit.item.dto.CommentDto; +import ru.practicum.shareit.item.dto.ItemDto; +import ru.practicum.shareit.valid.Add; + +import javax.validation.Valid; +import javax.validation.constraints.Positive; +import javax.validation.constraints.PositiveOrZero; + +@RestController +@RequestMapping("/items") +@RequiredArgsConstructor +public class ItemController { + private final ItemClient itemClient; + + @GetMapping + public ResponseEntity getItemsOfUser(@RequestHeader("X-Sharer-User-Id") Integer userId, + @PositiveOrZero @RequestParam(defaultValue = "0") Integer from, + @Positive @RequestParam(defaultValue = "30") Integer size) { + return itemClient.getItemsOfUser(userId, from, size); + } + + @GetMapping("/{itemId}") + public ResponseEntity getItemById(@PathVariable Integer itemId, + @RequestHeader("X-Sharer-User-Id") Integer userId) { + return itemClient.getItemById(itemId, userId); + } + + @GetMapping("/search") + public ResponseEntity getItems(@RequestParam(value = "text", required = false) String text, + @PositiveOrZero @RequestParam(defaultValue = "0") Integer from, + @Positive @RequestParam(defaultValue = "30") Integer size) { + return itemClient.getItems(text, from, size); + } + + @PatchMapping("/{itemId}") + public ResponseEntity updateItem(@RequestBody ItemDto itemDto, @PathVariable Integer itemId, + @RequestHeader("X-Sharer-User-Id") Integer userId) { + return itemClient.updateItem(itemDto, itemId, userId); + } + + @PostMapping + public ResponseEntity addItem(@Validated(Add.class) @RequestBody ItemDto itemDto, + @RequestHeader("X-Sharer-User-Id") Integer userId) { + return itemClient.addItem(itemDto, userId); + } + + @PostMapping("/{itemId}/comment") + public ResponseEntity addComment(@PathVariable Integer itemId, + @RequestHeader("X-Sharer-User-Id") Integer userId, + @Valid @RequestBody CommentDto commentDto) { + return itemClient.addComment(itemId, userId, commentDto); + } + + @DeleteMapping("/{itemId}") + public ResponseEntity deleteItem(@PathVariable Integer itemId) { + return itemClient.deleteItem(itemId); + } +} \ No newline at end of file diff --git a/gateway/src/main/java/ru/practicum/shareit/item/dto/CommentDto.java b/gateway/src/main/java/ru/practicum/shareit/item/dto/CommentDto.java new file mode 100644 index 0000000..b4cf969 --- /dev/null +++ b/gateway/src/main/java/ru/practicum/shareit/item/dto/CommentDto.java @@ -0,0 +1,17 @@ +package ru.practicum.shareit.item.dto; + +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.NoArgsConstructor; + +import javax.validation.constraints.NotBlank; + +@Getter +@NoArgsConstructor +@AllArgsConstructor +public class CommentDto { + + @NotBlank + private String text; +} + diff --git a/src/main/java/ru/practicum/shareit/item/dto/ItemDto.java b/gateway/src/main/java/ru/practicum/shareit/item/dto/ItemDto.java similarity index 86% rename from src/main/java/ru/practicum/shareit/item/dto/ItemDto.java rename to gateway/src/main/java/ru/practicum/shareit/item/dto/ItemDto.java index 8517688..27415d5 100644 --- a/src/main/java/ru/practicum/shareit/item/dto/ItemDto.java +++ b/gateway/src/main/java/ru/practicum/shareit/item/dto/ItemDto.java @@ -1,27 +1,24 @@ package ru.practicum.shareit.item.dto; import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.Data; +import lombok.Getter; import lombok.NoArgsConstructor; import ru.practicum.shareit.valid.Add; import javax.validation.constraints.NotBlank; import javax.validation.constraints.NotNull; -@Data -@Builder -@AllArgsConstructor +@Getter @NoArgsConstructor +@AllArgsConstructor public class ItemDto { - private Integer id; + @NotBlank(groups = {Add.class}) private String name; @NotBlank(groups = {Add.class}) private String description; @NotNull(groups = {Add.class}) private Boolean available; - private Integer requestId; + private Integer requestId; } - 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..1787262 --- /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.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.request.dto.ItemRequestDto; + +import java.util.Map; + +@Service +public class ItemRequestClient extends BaseClient { + private static final String API_PREFIX = "/requests"; + + public ItemRequestClient(@Value("${shareit-server.url}") String serverUrl, RestTemplateBuilder builder) { + super( + builder.uriTemplateHandler(new DefaultUriBuilderFactory(serverUrl + API_PREFIX)) + .requestFactory(HttpComponentsClientHttpRequestFactory::new) + .build() + ); + } + + public ResponseEntity getItemRequestUser(Integer userId) { + return get("", userId); + } + + public ResponseEntity getAllItemRequest(Integer from, Integer size, Integer userId) { + Map parameters = Map.of( + "from", from, + "size", size); + return get("/all?from={from}&size={size}", userId, parameters); + } + + public ResponseEntity getItemRequestById(Integer requestId, Integer userId) { + return get("/" + requestId, userId); + } + + public ResponseEntity addItemRequest(ItemRequestDto itemRequestDto, Integer userId) { + return post("", userId, itemRequestDto); + } +} 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..64487c1 --- /dev/null +++ b/gateway/src/main/java/ru/practicum/shareit/request/ItemRequestController.java @@ -0,0 +1,43 @@ +package ru.practicum.shareit.request; + +import lombok.RequiredArgsConstructor; +import org.springframework.http.ResponseEntity; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; +import ru.practicum.shareit.request.dto.ItemRequestDto; + +import javax.validation.Valid; +import javax.validation.constraints.Positive; +import javax.validation.constraints.PositiveOrZero; + +@RestController +@RequestMapping("/requests") +@RequiredArgsConstructor +public class ItemRequestController { + + private final ItemRequestClient itemRequestClient; + + @GetMapping + public ResponseEntity getItemRequestUser(@RequestHeader("X-Sharer-User-Id") Integer userId) { + return itemRequestClient.getItemRequestUser(userId); + } + + @GetMapping("/all") + public ResponseEntity getAllItemRequest(@PositiveOrZero @RequestParam(defaultValue = "0") Integer from, + @Positive @RequestParam(defaultValue = "30") Integer size, + @RequestHeader("X-Sharer-User-Id") Integer userId) { + return itemRequestClient.getAllItemRequest(from, size, userId); + } + + @GetMapping("/{requestId}") + public ResponseEntity getItemRequestById(@PathVariable Integer requestId, + @RequestHeader("X-Sharer-User-Id") Integer userId) { + return itemRequestClient.getItemRequestById(requestId, userId); + } + + @PostMapping + public ResponseEntity addItemRequest(@Valid @RequestBody ItemRequestDto itemRequestDto, + @RequestHeader("X-Sharer-User-Id") Integer userId) { + return itemRequestClient.addItemRequest(itemRequestDto, userId); + } +} diff --git a/gateway/src/main/java/ru/practicum/shareit/request/dto/ItemRequestDto.java b/gateway/src/main/java/ru/practicum/shareit/request/dto/ItemRequestDto.java new file mode 100644 index 0000000..6e9c10a --- /dev/null +++ b/gateway/src/main/java/ru/practicum/shareit/request/dto/ItemRequestDto.java @@ -0,0 +1,16 @@ +package ru.practicum.shareit.request.dto; + +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.NoArgsConstructor; + +import javax.validation.constraints.NotBlank; + +@Getter +@NoArgsConstructor +@AllArgsConstructor +public class ItemRequestDto { + + @NotBlank + private String description; +} 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..07a3caf --- /dev/null +++ b/gateway/src/main/java/ru/practicum/shareit/user/UserClient.java @@ -0,0 +1,51 @@ +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.UserDto; + +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(HttpComponentsClientHttpRequestFactory::new) + .build() + ); + } + + public ResponseEntity findAll(Integer from, Integer size) { + Map parameters = Map.of( + "from", from, + "size", size + ); + return get("?from={from}&size={size}", parameters); + } + + public ResponseEntity getUserById(Integer userId) { + return get("/" + userId); + } + + public ResponseEntity updateUser(UserDto userDto, Integer userId) { + return patch("/" + userId, userDto); + } + + public ResponseEntity addUser(UserDto userDto) { + return post("", userDto); + } + + public ResponseEntity deleteUser(Integer userId) { + return 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..0c0f715 --- /dev/null +++ b/gateway/src/main/java/ru/practicum/shareit/user/UserController.java @@ -0,0 +1,45 @@ +package ru.practicum.shareit.user; + +import lombok.RequiredArgsConstructor; +import org.springframework.http.ResponseEntity; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; +import ru.practicum.shareit.user.dto.UserDto; +import ru.practicum.shareit.valid.Add; +import ru.practicum.shareit.valid.Update; + +import javax.validation.constraints.Positive; +import javax.validation.constraints.PositiveOrZero; + +@RestController +@RequestMapping(path = "/users") +@RequiredArgsConstructor +public class UserController { + private final UserClient userClient; + + @GetMapping + public ResponseEntity findAll(@PositiveOrZero @RequestParam(defaultValue = "0") Integer from, + @Positive @RequestParam(defaultValue = "30") Integer size) { + return userClient.findAll(from, size); + } + + @GetMapping("/{id}") + public ResponseEntity getUserById(@PathVariable Integer id) { + return userClient.getUserById(id); + } + + @PatchMapping("/{id}") + public ResponseEntity updateUser(@Validated(Update.class) @RequestBody UserDto userDto, @PathVariable Integer id) { + return userClient.updateUser(userDto, id); + } + + @PostMapping + public ResponseEntity addUser(@Validated(Add.class) @RequestBody UserDto userDto) { + return userClient.addUser(userDto); + } + + @DeleteMapping("/{id}") + public ResponseEntity deleteUser(@PathVariable Integer id) { + return userClient.deleteUser(id); + } +} diff --git a/src/main/java/ru/practicum/shareit/user/dto/UserDto.java b/gateway/src/main/java/ru/practicum/shareit/user/dto/UserDto.java similarity index 71% rename from src/main/java/ru/practicum/shareit/user/dto/UserDto.java rename to gateway/src/main/java/ru/practicum/shareit/user/dto/UserDto.java index 0a2eb87..014dfc6 100644 --- a/src/main/java/ru/practicum/shareit/user/dto/UserDto.java +++ b/gateway/src/main/java/ru/practicum/shareit/user/dto/UserDto.java @@ -1,22 +1,23 @@ package ru.practicum.shareit.user.dto; import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.Data; +import lombok.Getter; +import lombok.NoArgsConstructor; import ru.practicum.shareit.valid.Add; import ru.practicum.shareit.valid.Update; import javax.validation.constraints.Email; import javax.validation.constraints.NotBlank; -@Data -@Builder +@Getter +@NoArgsConstructor @AllArgsConstructor public class UserDto { - private Integer id; - @NotBlank(groups = {Add.class}) + + @NotBlank(groups = Add.class) private String name; - @NotBlank(groups = {Add.class}) + @Email(groups = {Add.class, Update.class}) + @NotBlank(groups = Add.class) private String email; } diff --git a/src/main/java/ru/practicum/shareit/valid/Add.java b/gateway/src/main/java/ru/practicum/shareit/valid/Add.java similarity index 100% rename from src/main/java/ru/practicum/shareit/valid/Add.java rename to gateway/src/main/java/ru/practicum/shareit/valid/Add.java diff --git a/src/main/java/ru/practicum/shareit/valid/Update.java b/gateway/src/main/java/ru/practicum/shareit/valid/Update.java similarity index 100% rename from src/main/java/ru/practicum/shareit/valid/Update.java rename to gateway/src/main/java/ru/practicum/shareit/valid/Update.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 2be02a1..57f9203 100644 --- a/pom.xml +++ b/pom.xml @@ -12,83 +12,59 @@ ru.practicum shareit 0.0.1-SNAPSHOT + pom - ShareIt + ShareIt - + + server + gateway + + + 11 - org.springframework.boot - spring-boot-starter-web - - - - org.postgresql - postgresql - runtime + spring-boot - com.h2database - h2 - runtime + org.springframework.boot + spring-boot-autoconfigure - org.springframework.boot - spring-boot-configuration-processor - true + org.springframework + spring-web org.projectlombok lombok - true - org.springframework.boot - spring-boot-starter-test - test - - - org.springframework.boot - spring-boot-starter-validation - - - org.jetbrains - annotations - RELEASE - compile - - - org.springframework.boot - spring-boot-starter-data-jpa + jakarta.validation + jakarta.validation-api - - - 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 @@ -235,17 +211,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..96c8598 --- /dev/null +++ b/server/Dockerfile @@ -0,0 +1,5 @@ +FROM eclipse-temurin:11-jre-jammy +VOLUME /tmp +ARG JAR_FILE=target/*.jar +COPY ${JAR_FILE} app.jar +ENTRYPOINT ["sh", "-c", "java ${JAVA_OPTS} -jar -Dserver.port=9090 /app.jar"] \ No newline at end of file diff --git a/server/pom.xml b/server/pom.xml new file mode 100644 index 0000000..71fd493 --- /dev/null +++ b/server/pom.xml @@ -0,0 +1,86 @@ + + + 4.0.0 + + ru.practicum + shareit + 0.0.1-SNAPSHOT + + + shareit-server + 0.0.1-SNAPSHOT + + ShareIt Server + + + + org.springframework.boot + spring-boot-starter-web + + + + 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-starter-validation + + + org.jetbrains + annotations + RELEASE + compile + + + org.springframework.boot + spring-boot-starter-data-jpa + + + + + + + org.springframework.boot + spring-boot-maven-plugin + + + + + + + coverage + + + + org.jacoco + jacoco-maven-plugin + + + + + + + \ No newline at end of file diff --git a/src/main/java/ru/practicum/shareit/ShareItApp.java b/server/src/main/java/ru/practicum/shareit/ShareItApp.java similarity index 65% rename from src/main/java/ru/practicum/shareit/ShareItApp.java rename to server/src/main/java/ru/practicum/shareit/ShareItApp.java index a00ad56..a10a87d 100644 --- a/src/main/java/ru/practicum/shareit/ShareItApp.java +++ b/server/src/main/java/ru/practicum/shareit/ShareItApp.java @@ -6,8 +6,8 @@ @SpringBootApplication public class ShareItApp { - public static void main(String[] args) { - SpringApplication.run(ShareItApp.class, args); - } + public static void main(String[] args) { + SpringApplication.run(ShareItApp.class, args); + } } 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 72% rename from src/main/java/ru/practicum/shareit/booking/BookingController.java rename to server/src/main/java/ru/practicum/shareit/booking/BookingController.java index 0149aaf..acf5bd2 100644 --- a/src/main/java/ru/practicum/shareit/booking/BookingController.java +++ b/server/src/main/java/ru/practicum/shareit/booking/BookingController.java @@ -1,14 +1,10 @@ package ru.practicum.shareit.booking; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.*; import ru.practicum.shareit.booking.dto.BookingDto; import ru.practicum.shareit.booking.dto.BookingDtoAdd; -import ru.practicum.shareit.valid.Add; -import javax.validation.constraints.Positive; -import javax.validation.constraints.PositiveOrZero; import java.util.List; @RestController @@ -31,16 +27,16 @@ public BookingDto getBookingById(@PathVariable Integer bookingId, @GetMapping public List getAllBookingOfUser(@RequestParam(defaultValue = "ALL") String state, @RequestHeader("X-Sharer-User-Id") Integer userId, - @PositiveOrZero @RequestParam(defaultValue = "0") Integer from, - @Positive @RequestParam(defaultValue = "30") Integer size) { + @RequestParam(defaultValue = "0") Integer from, + @RequestParam(defaultValue = "30") Integer size) { return bookingService.getAllBookingOfUser(state, userId, from, size); } @GetMapping("/owner") public List getAllBookingOfOwner(@RequestParam(defaultValue = "ALL") String state, @RequestHeader("X-Sharer-User-Id") Integer userId, - @PositiveOrZero @RequestParam(defaultValue = "0") Integer from, - @Positive @RequestParam(defaultValue = "30") Integer size) { + @RequestParam(defaultValue = "0") Integer from, + @RequestParam(defaultValue = "30") Integer size) { return bookingService.getAllBookingOfOwner(state, userId, from, size); } @@ -52,7 +48,7 @@ public BookingDto getConsentToBooking(@PathVariable Integer bookingId, } @PostMapping - public BookingDto addBookingRequest(@Validated(Add.class) @RequestBody BookingDtoAdd bookingDto, + public BookingDto addBookingRequest(@RequestBody BookingDtoAdd bookingDto, @RequestHeader("X-Sharer-User-Id") Integer userId) { return bookingService.addBookingRequest(bookingDto, 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 88% rename from src/main/java/ru/practicum/shareit/booking/BookingMapper.java rename to server/src/main/java/ru/practicum/shareit/booking/BookingMapper.java index 8055b3d..a8965fa 100644 --- a/src/main/java/ru/practicum/shareit/booking/BookingMapper.java +++ b/server/src/main/java/ru/practicum/shareit/booking/BookingMapper.java @@ -4,6 +4,11 @@ import ru.practicum.shareit.booking.dto.BookingDtoAdd; import ru.practicum.shareit.booking.model.Booking; +import java.time.LocalDateTime; +import java.time.format.DateTimeFormatter; + +import static java.time.format.DateTimeFormatter.ISO_LOCAL_DATE_TIME; + public class BookingMapper { public static BookingDto toBookingDto(Booking booking) { 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/BookingService.java b/server/src/main/java/ru/practicum/shareit/booking/BookingService.java similarity index 100% rename from src/main/java/ru/practicum/shareit/booking/BookingService.java rename to server/src/main/java/ru/practicum/shareit/booking/BookingService.java diff --git a/src/main/java/ru/practicum/shareit/booking/BookingServiceImpl.java b/server/src/main/java/ru/practicum/shareit/booking/BookingServiceImpl.java similarity index 99% rename from src/main/java/ru/practicum/shareit/booking/BookingServiceImpl.java rename to server/src/main/java/ru/practicum/shareit/booking/BookingServiceImpl.java index 267a858..aabefc9 100644 --- a/src/main/java/ru/practicum/shareit/booking/BookingServiceImpl.java +++ b/server/src/main/java/ru/practicum/shareit/booking/BookingServiceImpl.java @@ -187,4 +187,5 @@ public BookingDto addBookingRequest(BookingDtoAdd bookingDtoAdd, Integer userId) return BookingMapper.toBookingDto(booking); } + } diff --git a/src/main/java/ru/practicum/shareit/booking/State.java b/server/src/main/java/ru/practicum/shareit/booking/State.java similarity index 100% rename from src/main/java/ru/practicum/shareit/booking/State.java rename to server/src/main/java/ru/practicum/shareit/booking/State.java diff --git a/src/main/java/ru/practicum/shareit/booking/Status.java b/server/src/main/java/ru/practicum/shareit/booking/Status.java similarity index 100% rename from src/main/java/ru/practicum/shareit/booking/Status.java rename to server/src/main/java/ru/practicum/shareit/booking/Status.java 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/server/src/main/java/ru/practicum/shareit/booking/dto/BookingDtoAdd.java b/server/src/main/java/ru/practicum/shareit/booking/dto/BookingDtoAdd.java new file mode 100644 index 0000000..b21cab9 --- /dev/null +++ b/server/src/main/java/ru/practicum/shareit/booking/dto/BookingDtoAdd.java @@ -0,0 +1,23 @@ +package ru.practicum.shareit.booking.dto; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.time.LocalDateTime; + +@Data +@Builder +@AllArgsConstructor +@NoArgsConstructor +public class BookingDtoAdd { + + private Integer id; + + private LocalDateTime start; + + private LocalDateTime end; + + private Integer itemId; +} diff --git a/src/main/java/ru/practicum/shareit/booking/model/Booking.java b/server/src/main/java/ru/practicum/shareit/booking/model/Booking.java similarity index 92% rename from src/main/java/ru/practicum/shareit/booking/model/Booking.java rename to server/src/main/java/ru/practicum/shareit/booking/model/Booking.java index 7334866..561acab 100644 --- a/src/main/java/ru/practicum/shareit/booking/model/Booking.java +++ b/server/src/main/java/ru/practicum/shareit/booking/model/Booking.java @@ -9,7 +9,6 @@ import ru.practicum.shareit.user.model.User; import javax.persistence.*; -import javax.validation.constraints.NotNull; import java.time.LocalDateTime; @Data @@ -23,15 +22,12 @@ public class Booking { @GeneratedValue(strategy = GenerationType.IDENTITY) private Integer id; - @NotNull @Column(name = "start_date", nullable = false) private LocalDateTime start; - @NotNull @Column(name = "end_date", nullable = false) private LocalDateTime end; - @NotNull @ManyToOne @JoinColumn(name = "id_item", referencedColumnName = "id", nullable = false) private Item item; 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/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/ObjectNotFoundException.java b/server/src/main/java/ru/practicum/shareit/exception/ObjectNotFoundException.java similarity index 100% rename from src/main/java/ru/practicum/shareit/exception/ObjectNotFoundException.java rename to server/src/main/java/ru/practicum/shareit/exception/ObjectNotFoundException.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/CommentRepository.java b/server/src/main/java/ru/practicum/shareit/item/CommentRepository.java similarity index 100% rename from src/main/java/ru/practicum/shareit/item/CommentRepository.java rename to server/src/main/java/ru/practicum/shareit/item/CommentRepository.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 63% rename from src/main/java/ru/practicum/shareit/item/ItemController.java rename to server/src/main/java/ru/practicum/shareit/item/ItemController.java index 1c5b837..290f680 100644 --- a/src/main/java/ru/practicum/shareit/item/ItemController.java +++ b/server/src/main/java/ru/practicum/shareit/item/ItemController.java @@ -1,16 +1,11 @@ package ru.practicum.shareit.item; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.*; import ru.practicum.shareit.item.dto.CommentDto; import ru.practicum.shareit.item.dto.ItemDto; import ru.practicum.shareit.item.dto.ItemDtoComments; -import ru.practicum.shareit.valid.Add; -import javax.validation.Valid; -import javax.validation.constraints.Positive; -import javax.validation.constraints.PositiveOrZero; import java.util.List; @RestController @@ -25,8 +20,8 @@ public ItemController(ItemService itemService) { @GetMapping public List getItemsOfUser(@RequestHeader("X-Sharer-User-Id") Integer userId, - @PositiveOrZero @RequestParam(defaultValue = "0") Integer from, - @Positive @RequestParam(defaultValue = "30") Integer size) { + @RequestParam(defaultValue = "0") Integer from, + @RequestParam(defaultValue = "30") Integer size) { return itemService.getItemsOfUser(userId, from, size); } @@ -38,26 +33,28 @@ public ItemDtoComments getItemById(@PathVariable Integer itemId, @GetMapping("/search") public List getItems(@RequestParam(value = "text", required = false) String text, - @PositiveOrZero @RequestParam(defaultValue = "0") Integer from, - @Positive @RequestParam(defaultValue = "30") Integer size) { + @RequestParam(defaultValue = "0") Integer from, + @RequestParam(defaultValue = "30") Integer size) { return itemService.getItems(text, from, size); } @PatchMapping("/{itemId}") - public ItemDto updateItem(@Valid @RequestBody ItemDto itemDto, @PathVariable Integer itemId, + public ItemDto updateItem(@RequestBody ItemDto itemDto, + @PathVariable Integer itemId, @RequestHeader("X-Sharer-User-Id") Integer userId) { return itemService.updateItem(itemDto, itemId, userId); } @PostMapping - public ItemDto addItem(@Validated(Add.class) @RequestBody ItemDto itemDto, + public ItemDto addItem(@RequestBody ItemDto itemDto, @RequestHeader("X-Sharer-User-Id") Integer userId) { return itemService.addItem(itemDto, userId); } @PostMapping("/{itemId}/comment") - public CommentDto addComment(@PathVariable Integer itemId, @RequestHeader("X-Sharer-User-Id") Integer userId, - @Validated(Add.class) @RequestBody CommentDto commentDto) { + public CommentDto addComment(@PathVariable Integer itemId, + @RequestHeader("X-Sharer-User-Id") Integer userId, + @RequestBody CommentDto commentDto) { return itemService.addComment(itemId, userId, commentDto); } 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/src/main/java/ru/practicum/shareit/item/ItemRepository.java b/server/src/main/java/ru/practicum/shareit/item/ItemRepository.java similarity index 100% rename from src/main/java/ru/practicum/shareit/item/ItemRepository.java rename to server/src/main/java/ru/practicum/shareit/item/ItemRepository.java diff --git a/src/main/java/ru/practicum/shareit/item/ItemService.java b/server/src/main/java/ru/practicum/shareit/item/ItemService.java similarity index 100% rename from src/main/java/ru/practicum/shareit/item/ItemService.java rename to server/src/main/java/ru/practicum/shareit/item/ItemService.java diff --git a/src/main/java/ru/practicum/shareit/item/ItemServiceImpl.java b/server/src/main/java/ru/practicum/shareit/item/ItemServiceImpl.java similarity index 98% rename from src/main/java/ru/practicum/shareit/item/ItemServiceImpl.java rename to server/src/main/java/ru/practicum/shareit/item/ItemServiceImpl.java index 43a1278..1786e0b 100644 --- a/src/main/java/ru/practicum/shareit/item/ItemServiceImpl.java +++ b/server/src/main/java/ru/practicum/shareit/item/ItemServiceImpl.java @@ -53,7 +53,8 @@ public List getItemsOfUser(Integer userId, Integer from, Intege User user = userRepository.findById(userId) .orElseThrow(() -> new ObjectNotFoundException("Пользователь не найден")); - List itemsDtoComments = itemRepository.findAllByOwnerId(userId, PageRequest.of(from, page)) + List itemsDtoComments = itemRepository.findAllByOwnerId(userId, PageRequest.of(from, page, + Sort.by(Sort.Direction.ASC, "id"))) .stream() .map(ItemMapper::toItemDtoComments) .collect(Collectors.toList()); @@ -90,6 +91,7 @@ public ItemDtoComments getItemById(Integer itemId, Integer userId) { .stream() .map(CommentMapper::toCommentDto) .collect(Collectors.toList())); + if (item.getOwner().getId().equals(userId)) { bookingRepository .findFirstByItemIdAndStartLessThanEqualAndStatus(itemDtoComments.getId(), now(), Status.APPROVED, 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 75% 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 index a4c037a..9ba1a2a 100644 --- a/src/main/java/ru/practicum/shareit/item/dto/CommentDto.java +++ b/server/src/main/java/ru/practicum/shareit/item/dto/CommentDto.java @@ -4,9 +4,7 @@ import lombok.Builder; import lombok.Data; import lombok.NoArgsConstructor; -import ru.practicum.shareit.valid.Add; -import javax.validation.constraints.NotBlank; import java.time.LocalDateTime; @Data @@ -15,7 +13,6 @@ @NoArgsConstructor public class CommentDto { private Integer id; - @NotBlank(groups = {Add.class}) private String text; private String authorName; private LocalDateTime created; diff --git a/server/src/main/java/ru/practicum/shareit/item/dto/ItemDto.java b/server/src/main/java/ru/practicum/shareit/item/dto/ItemDto.java new file mode 100644 index 0000000..8973908 --- /dev/null +++ b/server/src/main/java/ru/practicum/shareit/item/dto/ItemDto.java @@ -0,0 +1,25 @@ +package ru.practicum.shareit.item.dto; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@Builder +@AllArgsConstructor +@NoArgsConstructor +public class ItemDto { + + private Integer id; + + private String name; + + private String description; + + private Boolean available; + + private Integer requestId; + +} + diff --git a/src/main/java/ru/practicum/shareit/item/dto/ItemDtoComments.java b/server/src/main/java/ru/practicum/shareit/item/dto/ItemDtoComments.java similarity index 72% rename from src/main/java/ru/practicum/shareit/item/dto/ItemDtoComments.java rename to server/src/main/java/ru/practicum/shareit/item/dto/ItemDtoComments.java index 6d4ac96..7ec06d8 100644 --- a/src/main/java/ru/practicum/shareit/item/dto/ItemDtoComments.java +++ b/server/src/main/java/ru/practicum/shareit/item/dto/ItemDtoComments.java @@ -4,10 +4,7 @@ import lombok.Builder; import lombok.Data; import lombok.NoArgsConstructor; -import ru.practicum.shareit.valid.Add; -import javax.validation.constraints.NotBlank; -import javax.validation.constraints.NotNull; import java.util.List; @Data @@ -16,11 +13,11 @@ @NoArgsConstructor public class ItemDtoComments { private Integer id; - @NotBlank(groups = {Add.class}) + private String name; - @NotBlank(groups = {Add.class}) + private String description; - @NotNull(groups = {Add.class}) + private Boolean available; private BookingDto lastBooking; diff --git a/src/main/java/ru/practicum/shareit/item/dto/ItemDtoRequest.java b/server/src/main/java/ru/practicum/shareit/item/dto/ItemDtoRequest.java similarity index 100% rename from src/main/java/ru/practicum/shareit/item/dto/ItemDtoRequest.java rename to server/src/main/java/ru/practicum/shareit/item/dto/ItemDtoRequest.java 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 95% 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 index e9f57d0..71c5295 100644 --- a/src/main/java/ru/practicum/shareit/item/model/Comment.java +++ b/server/src/main/java/ru/practicum/shareit/item/model/Comment.java @@ -22,15 +22,12 @@ public class Comment { @GeneratedValue(strategy = GenerationType.IDENTITY) private Integer id; - @NotBlank private String text; - @NotNull @ManyToOne @JoinColumn(name = "id_item", referencedColumnName = "id") private Item item; - @NotNull @ManyToOne @JoinColumn(name = "id_author", referencedColumnName = "id") private User author; 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 89% 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 index c51ccc8..f66ebca 100644 --- a/src/main/java/ru/practicum/shareit/item/model/Item.java +++ b/server/src/main/java/ru/practicum/shareit/item/model/Item.java @@ -23,13 +23,10 @@ public class Item { @GeneratedValue(strategy = GenerationType.IDENTITY) private Integer id; - @NotBlank(groups = {Add.class}) private String name; - @NotBlank(groups = {Add.class}) private String description; - @NotNull(groups = {Add.class}) @Column(name = "is_available") private Boolean available; 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 75% rename from src/main/java/ru/practicum/shareit/request/ItemRequestController.java rename to server/src/main/java/ru/practicum/shareit/request/ItemRequestController.java index 68afa9c..9eb2573 100644 --- a/src/main/java/ru/practicum/shareit/request/ItemRequestController.java +++ b/server/src/main/java/ru/practicum/shareit/request/ItemRequestController.java @@ -4,9 +4,6 @@ import org.springframework.web.bind.annotation.*; import ru.practicum.shareit.request.dto.ItemRequestDto; -import javax.validation.Valid; -import javax.validation.constraints.Positive; -import javax.validation.constraints.PositiveOrZero; import java.util.List; @RestController @@ -26,8 +23,8 @@ public List getItemRequestUser(@RequestHeader("X-Sharer-User-Id" } @GetMapping("/all") - public List getAllItemRequest(@PositiveOrZero @RequestParam(defaultValue = "0") Integer from, - @Positive @RequestParam(defaultValue = "30") Integer size, + public List getAllItemRequest(@RequestParam(defaultValue = "0") Integer from, + @RequestParam(defaultValue = "30") Integer size, @RequestHeader("X-Sharer-User-Id") Integer userId) { return itemRequestService.getAllItemRequest(from, size, userId); } @@ -39,7 +36,7 @@ public ItemRequestDto getItemRequestById(@PathVariable Integer requestId, } @PostMapping - public ItemRequestDto addItemRequest(@Valid @RequestBody ItemRequestDto itemRequestDto, + public ItemRequestDto addItemRequest(@RequestBody ItemRequestDto itemRequestDto, @RequestHeader("X-Sharer-User-Id") Integer userId) { return itemRequestService.addItemRequest(itemRequestDto, userId); } 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/src/main/java/ru/practicum/shareit/request/ItemRequestService.java b/server/src/main/java/ru/practicum/shareit/request/ItemRequestService.java similarity index 100% rename from src/main/java/ru/practicum/shareit/request/ItemRequestService.java rename to server/src/main/java/ru/practicum/shareit/request/ItemRequestService.java diff --git a/src/main/java/ru/practicum/shareit/request/ItemRequestServiceImpl.java b/server/src/main/java/ru/practicum/shareit/request/ItemRequestServiceImpl.java similarity index 100% rename from src/main/java/ru/practicum/shareit/request/ItemRequestServiceImpl.java rename to server/src/main/java/ru/practicum/shareit/request/ItemRequestServiceImpl.java 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 97% 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 index ca0ff90..244769a 100644 --- a/src/main/java/ru/practicum/shareit/request/dto/ItemRequestDto.java +++ b/server/src/main/java/ru/practicum/shareit/request/dto/ItemRequestDto.java @@ -18,7 +18,6 @@ public class ItemRequestDto { private Integer id; - @NotBlank private String description; private LocalDateTime created; diff --git a/src/main/java/ru/practicum/shareit/request/model/ItemRequest.java b/server/src/main/java/ru/practicum/shareit/request/model/ItemRequest.java similarity index 98% rename from src/main/java/ru/practicum/shareit/request/model/ItemRequest.java rename to server/src/main/java/ru/practicum/shareit/request/model/ItemRequest.java index 74d685b..3b8f294 100644 --- a/src/main/java/ru/practicum/shareit/request/model/ItemRequest.java +++ b/server/src/main/java/ru/practicum/shareit/request/model/ItemRequest.java @@ -21,7 +21,6 @@ public class ItemRequest { @GeneratedValue(strategy = GenerationType.IDENTITY) private Integer id; - @NotBlank private String description; @ManyToOne 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 60% rename from src/main/java/ru/practicum/shareit/user/UserController.java rename to server/src/main/java/ru/practicum/shareit/user/UserController.java index 620553a..fe1928d 100644 --- a/src/main/java/ru/practicum/shareit/user/UserController.java +++ b/server/src/main/java/ru/practicum/shareit/user/UserController.java @@ -1,14 +1,9 @@ package ru.practicum.shareit.user; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.*; import ru.practicum.shareit.user.dto.UserDto; -import ru.practicum.shareit.valid.Add; -import ru.practicum.shareit.valid.Update; -import javax.validation.constraints.Positive; -import javax.validation.constraints.PositiveOrZero; import java.util.List; @RestController @@ -22,8 +17,8 @@ public UserController(UserService userService) { } @GetMapping - public List findAll(@PositiveOrZero @RequestParam(defaultValue = "0") Integer from, - @Positive @RequestParam(defaultValue = "30") Integer size) { + public List findAll(@RequestParam(defaultValue = "0") Integer from, + @RequestParam(defaultValue = "30") Integer size) { return userService.findAll(from, size); } @@ -33,12 +28,12 @@ public UserDto getUserById(@PathVariable Integer id) { } @PatchMapping("/{id}") - public UserDto updateUser(@Validated(Update.class) @RequestBody UserDto userDto, @PathVariable Integer id) { + public UserDto updateUser(@RequestBody UserDto userDto, @PathVariable Integer id) { return userService.updateUser(userDto, id); } @PostMapping - public UserDto addUser(@Validated(Add.class) @RequestBody UserDto userDto) { + public UserDto addUser(@RequestBody UserDto userDto) { return userService.addUser(userDto); } 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/src/main/java/ru/practicum/shareit/user/UserService.java b/server/src/main/java/ru/practicum/shareit/user/UserService.java similarity index 100% rename from src/main/java/ru/practicum/shareit/user/UserService.java rename to server/src/main/java/ru/practicum/shareit/user/UserService.java diff --git a/src/main/java/ru/practicum/shareit/user/UserServiceImpl.java b/server/src/main/java/ru/practicum/shareit/user/UserServiceImpl.java similarity index 100% rename from src/main/java/ru/practicum/shareit/user/UserServiceImpl.java rename to server/src/main/java/ru/practicum/shareit/user/UserServiceImpl.java diff --git a/server/src/main/java/ru/practicum/shareit/user/dto/UserDto.java b/server/src/main/java/ru/practicum/shareit/user/dto/UserDto.java new file mode 100644 index 0000000..49d4060 --- /dev/null +++ b/server/src/main/java/ru/practicum/shareit/user/dto/UserDto.java @@ -0,0 +1,17 @@ +package ru.practicum.shareit.user.dto; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; + +@Data +@Builder +@AllArgsConstructor +public class UserDto { + + private Integer id; + + private String name; + + private String email; +} diff --git a/src/main/java/ru/practicum/shareit/user/model/User.java b/server/src/main/java/ru/practicum/shareit/user/model/User.java similarity index 61% rename from src/main/java/ru/practicum/shareit/user/model/User.java rename to server/src/main/java/ru/practicum/shareit/user/model/User.java index ae51f67..6fc243b 100644 --- a/src/main/java/ru/practicum/shareit/user/model/User.java +++ b/server/src/main/java/ru/practicum/shareit/user/model/User.java @@ -4,12 +4,8 @@ import lombok.Builder; import lombok.Data; import lombok.NoArgsConstructor; -import ru.practicum.shareit.valid.Add; -import ru.practicum.shareit.valid.Update; import javax.persistence.*; -import javax.validation.constraints.Email; -import javax.validation.constraints.NotBlank; @Data @Builder @@ -22,11 +18,8 @@ public class User { @GeneratedValue(strategy = GenerationType.IDENTITY) private Integer id; - @NotBlank(groups = {Add.class}) private String name; - @NotBlank(groups = {Add.class}) - @Email(groups = {Add.class, Update.class}) @Column(unique = true) private String email; } diff --git a/server/src/main/java/ru/practicum/shareit/valid/Add.java b/server/src/main/java/ru/practicum/shareit/valid/Add.java new file mode 100644 index 0000000..ed0b154 --- /dev/null +++ b/server/src/main/java/ru/practicum/shareit/valid/Add.java @@ -0,0 +1,4 @@ +package ru.practicum.shareit.valid; + +public interface Add { +} diff --git a/server/src/main/java/ru/practicum/shareit/valid/Update.java b/server/src/main/java/ru/practicum/shareit/valid/Update.java new file mode 100644 index 0000000..23937f6 --- /dev/null +++ b/server/src/main/java/ru/practicum/shareit/valid/Update.java @@ -0,0 +1,4 @@ +package ru.practicum.shareit.valid; + +public interface Update { +} diff --git a/src/main/resources/application.properties b/server/src/main/resources/application.properties similarity index 98% rename from src/main/resources/application.properties rename to server/src/main/resources/application.properties index 4072252..357b79a 100644 --- a/src/main/resources/application.properties +++ b/server/src/main/resources/application.properties @@ -1,3 +1,5 @@ +server.port=9090 + spring.jpa.hibernate.ddl-auto=none spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.PostgreSQL10Dialect spring.jpa.properties.hibernate.format_sql=true 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/java/ru/practicum/shareit/booking/BookingControllerTest.java b/server/src/test/java/ru/practicum/shareit/booking/BookingControllerTest.java similarity index 89% rename from src/test/java/ru/practicum/shareit/booking/BookingControllerTest.java rename to server/src/test/java/ru/practicum/shareit/booking/BookingControllerTest.java index 784f040..696d3d3 100644 --- a/src/test/java/ru/practicum/shareit/booking/BookingControllerTest.java +++ b/server/src/test/java/ru/practicum/shareit/booking/BookingControllerTest.java @@ -118,22 +118,6 @@ void addBookingRequest() { assertEquals(objectMapper.writeValueAsString(bookingDto), result); } - @SneakyThrows - @Test - void addBookingRequestStartIsNotFuture() { - Integer userId = 1; - Integer itemId = 1; - BookingDtoAdd bookingDtoAdd = new BookingDtoAdd(userId, start.minusDays(5), end, itemId); - - mockMvc.perform(post("/bookings") - .header("X-Sharer-User-Id", userId) - .contentType("application/json") - .content(objectMapper.writeValueAsString(bookingDtoAdd))) - .andExpect(status().isBadRequest()); - - Mockito.verify(bookingServiceImpl, Mockito.never()).addBookingRequest(Mockito.any(), Mockito.anyInt()); - } - @SneakyThrows @Test void getConsentToBooking() { diff --git a/src/test/java/ru/practicum/shareit/booking/BookingDtoJsonTest.java b/server/src/test/java/ru/practicum/shareit/booking/BookingDtoJsonTest.java similarity index 100% rename from src/test/java/ru/practicum/shareit/booking/BookingDtoJsonTest.java rename to server/src/test/java/ru/practicum/shareit/booking/BookingDtoJsonTest.java diff --git a/src/test/java/ru/practicum/shareit/booking/BookingServiceImplTest.java b/server/src/test/java/ru/practicum/shareit/booking/BookingServiceImplTest.java similarity index 100% rename from src/test/java/ru/practicum/shareit/booking/BookingServiceImplTest.java rename to server/src/test/java/ru/practicum/shareit/booking/BookingServiceImplTest.java diff --git a/src/test/java/ru/practicum/shareit/item/ItemControllerTest.java b/server/src/test/java/ru/practicum/shareit/item/ItemControllerTest.java similarity index 91% rename from src/test/java/ru/practicum/shareit/item/ItemControllerTest.java rename to server/src/test/java/ru/practicum/shareit/item/ItemControllerTest.java index 2659abc..a151db9 100644 --- a/src/test/java/ru/practicum/shareit/item/ItemControllerTest.java +++ b/server/src/test/java/ru/practicum/shareit/item/ItemControllerTest.java @@ -120,20 +120,6 @@ void addItem() { assertEquals(objectMapper.writeValueAsString(itemDto), result); } - @SneakyThrows - @Test - void addItemIsNotValid() { - ItemDto itemDto = new ItemDto(1, "", "description", true, - 1); - - mockMvc.perform(post("/items") - .header("X-Sharer-User-Id", 1) - .contentType("application/json") - .content(objectMapper.writeValueAsString(itemDto))) - .andExpect(status().isBadRequest()); - Mockito.verify(itemService, Mockito.never()).addItem(Mockito.any(), Mockito.anyInt()); - } - @SneakyThrows @Test void update() { diff --git a/src/test/java/ru/practicum/shareit/item/ItemDtoJsonTest.java b/server/src/test/java/ru/practicum/shareit/item/ItemDtoJsonTest.java similarity index 100% rename from src/test/java/ru/practicum/shareit/item/ItemDtoJsonTest.java rename to server/src/test/java/ru/practicum/shareit/item/ItemDtoJsonTest.java diff --git a/src/test/java/ru/practicum/shareit/item/ItemRepositoryTest.java b/server/src/test/java/ru/practicum/shareit/item/ItemRepositoryTest.java similarity index 100% rename from src/test/java/ru/practicum/shareit/item/ItemRepositoryTest.java rename to server/src/test/java/ru/practicum/shareit/item/ItemRepositoryTest.java diff --git a/src/test/java/ru/practicum/shareit/item/ItemServiceImplIntegrationTest.java b/server/src/test/java/ru/practicum/shareit/item/ItemServiceImplIntegrationTest.java similarity index 89% rename from src/test/java/ru/practicum/shareit/item/ItemServiceImplIntegrationTest.java rename to server/src/test/java/ru/practicum/shareit/item/ItemServiceImplIntegrationTest.java index 73e8498..46333ec 100644 --- a/src/test/java/ru/practicum/shareit/item/ItemServiceImplIntegrationTest.java +++ b/server/src/test/java/ru/practicum/shareit/item/ItemServiceImplIntegrationTest.java @@ -8,6 +8,7 @@ import org.springframework.boot.test.context.SpringBootTest; import org.springframework.transaction.annotation.Transactional; import ru.practicum.shareit.booking.BookingRepository; +import ru.practicum.shareit.exception.ObjectNotFoundException; import ru.practicum.shareit.item.dto.ItemDto; import ru.practicum.shareit.item.dto.ItemDtoComments; import ru.practicum.shareit.item.model.Comment; @@ -18,7 +19,7 @@ import java.time.LocalDateTime; import java.util.List; -import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.*; @Transactional @SpringBootTest( @@ -92,11 +93,11 @@ void addItem() { Assertions.assertEquals(true, itemDto1.getAvailable()); } - @Test - void deleteItem() { - itemService.deleteItem(itemId); - List itemDtoComments = itemService.getItemsOfUser(userId, 0, 10); - - assertEquals(List.of(), itemDtoComments); - } +// @Test +// void deleteItem() { +// itemService.deleteItem(itemId); +// List itemDtoComments = itemService.getItemsOfUser(userId, 0, 10); +// +// assertEquals(List.of(), itemDtoComments); +// } } diff --git a/src/test/java/ru/practicum/shareit/item/ItemServiceImplTest.java b/server/src/test/java/ru/practicum/shareit/item/ItemServiceImplTest.java similarity index 98% rename from src/test/java/ru/practicum/shareit/item/ItemServiceImplTest.java rename to server/src/test/java/ru/practicum/shareit/item/ItemServiceImplTest.java index 4e1a6f9..d4d4fa9 100644 --- a/src/test/java/ru/practicum/shareit/item/ItemServiceImplTest.java +++ b/server/src/test/java/ru/practicum/shareit/item/ItemServiceImplTest.java @@ -9,6 +9,7 @@ import org.mockito.Mockito; import org.mockito.junit.jupiter.MockitoExtension; import org.springframework.data.domain.PageRequest; +import org.springframework.data.domain.Sort; import ru.practicum.shareit.booking.BookingRepository; import ru.practicum.shareit.booking.Status; import ru.practicum.shareit.booking.model.Booking; @@ -91,7 +92,8 @@ void getItemsOfUser() { Mockito.when(userRepository.findById(userId)) .thenReturn(Optional.of(user)); - Mockito.when(itemRepository.findAllByOwnerId(user.getId(), PageRequest.of(0, 10))) + Mockito.when(itemRepository.findAllByOwnerId(user.getId(), PageRequest.of(0, 10, + Sort.by(Sort.Direction.ASC, "id")))) .thenReturn(List.of(item)); Mockito.when(bookingRepository.findFirstByItemIdAndStartLessThanEqualAndStatus(Mockito.any(), diff --git a/src/test/java/ru/practicum/shareit/request/ItemRequestControllerTest.java b/server/src/test/java/ru/practicum/shareit/request/ItemRequestControllerTest.java similarity index 100% rename from src/test/java/ru/practicum/shareit/request/ItemRequestControllerTest.java rename to server/src/test/java/ru/practicum/shareit/request/ItemRequestControllerTest.java diff --git a/src/test/java/ru/practicum/shareit/request/ItemRequestDtoJsonTest.java b/server/src/test/java/ru/practicum/shareit/request/ItemRequestDtoJsonTest.java similarity index 100% rename from src/test/java/ru/practicum/shareit/request/ItemRequestDtoJsonTest.java rename to server/src/test/java/ru/practicum/shareit/request/ItemRequestDtoJsonTest.java diff --git a/src/test/java/ru/practicum/shareit/request/ItemRequestServiceImplIntegrationTest.java b/server/src/test/java/ru/practicum/shareit/request/ItemRequestServiceImplIntegrationTest.java similarity index 100% rename from src/test/java/ru/practicum/shareit/request/ItemRequestServiceImplIntegrationTest.java rename to server/src/test/java/ru/practicum/shareit/request/ItemRequestServiceImplIntegrationTest.java diff --git a/src/test/java/ru/practicum/shareit/request/ItemRequestServiceImplTest.java b/server/src/test/java/ru/practicum/shareit/request/ItemRequestServiceImplTest.java similarity index 100% rename from src/test/java/ru/practicum/shareit/request/ItemRequestServiceImplTest.java rename to server/src/test/java/ru/practicum/shareit/request/ItemRequestServiceImplTest.java diff --git a/src/test/java/ru/practicum/shareit/user/UserControllerTest.java b/server/src/test/java/ru/practicum/shareit/user/UserControllerTest.java similarity index 83% rename from src/test/java/ru/practicum/shareit/user/UserControllerTest.java rename to server/src/test/java/ru/practicum/shareit/user/UserControllerTest.java index da0ddd5..a0d4323 100644 --- a/src/test/java/ru/practicum/shareit/user/UserControllerTest.java +++ b/server/src/test/java/ru/practicum/shareit/user/UserControllerTest.java @@ -119,20 +119,6 @@ void addUser() { Mockito.verify(userService).addUser(userDto); } - @SneakyThrows - @Test - void addUserNameNotValid() { - Integer userId = 1; - UserDto userDto = new UserDto(1, null, "test@yandex.ru"); - - mockMvc.perform(post("/users", userId) - .contentType("application/json") - .content(objectMapper.writeValueAsString(userDto))) - .andExpect(status().isBadRequest()); - - Mockito.verify(userService, Mockito.never()).addUser(userDto); - } - @SneakyThrows @Test void updateUser() { @@ -147,21 +133,6 @@ void updateUser() { Mockito.verify(userService, Mockito.times(1)).updateUser(userDto, userId); } - - @SneakyThrows - @Test - void updateUserEmailNotValid() { - Integer userId = 1; - UserDto userDto = new UserDto(1, "test", "test.@yandex.ru"); - - mockMvc.perform(patch("/users/{userId}", userId) - .contentType("application/json") - .content(objectMapper.writeValueAsString(userDto))) - .andExpect(status().isBadRequest()); - - Mockito.verify(userService, Mockito.never()).updateUser(userDto, userId); - } - @SneakyThrows @Test void deleteById() { diff --git a/src/test/java/ru/practicum/shareit/user/UserDtoJsonTest.java b/server/src/test/java/ru/practicum/shareit/user/UserDtoJsonTest.java similarity index 100% rename from src/test/java/ru/practicum/shareit/user/UserDtoJsonTest.java rename to server/src/test/java/ru/practicum/shareit/user/UserDtoJsonTest.java diff --git a/src/test/java/ru/practicum/shareit/user/UserServiceImplIntegrationTest.java b/server/src/test/java/ru/practicum/shareit/user/UserServiceImplIntegrationTest.java similarity index 100% rename from src/test/java/ru/practicum/shareit/user/UserServiceImplIntegrationTest.java rename to server/src/test/java/ru/practicum/shareit/user/UserServiceImplIntegrationTest.java diff --git a/src/test/java/ru/practicum/shareit/user/UserServiceImplTest.java b/server/src/test/java/ru/practicum/shareit/user/UserServiceImplTest.java similarity index 100% rename from src/test/java/ru/practicum/shareit/user/UserServiceImplTest.java rename to server/src/test/java/ru/practicum/shareit/user/UserServiceImplTest.java From c6ab9c404a5ba73111d139adb4647caa90aa7243 Mon Sep 17 00:00:00 2001 From: Indira Date: Thu, 13 Jun 2024 23:03:42 +0300 Subject: [PATCH 2/4] =?UTF-8?q?style:=20=D0=A3=D0=B4=D0=B0=D0=BB=D0=B8?= =?UTF-8?q?=D0=BB=D0=B0=20=D0=B8=D0=BC=D0=BF=D0=BE=D1=80=D1=82=D1=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/ru/practicum/shareit/booking/BookingMapper.java | 5 ----- .../main/java/ru/practicum/shareit/item/model/Comment.java | 2 -- .../src/main/java/ru/practicum/shareit/item/model/Item.java | 3 --- .../ru/practicum/shareit/request/dto/ItemRequestDto.java | 1 - .../java/ru/practicum/shareit/request/model/ItemRequest.java | 1 - .../shareit/item/ItemServiceImplIntegrationTest.java | 3 --- 6 files changed, 15 deletions(-) diff --git a/server/src/main/java/ru/practicum/shareit/booking/BookingMapper.java b/server/src/main/java/ru/practicum/shareit/booking/BookingMapper.java index a8965fa..8055b3d 100644 --- a/server/src/main/java/ru/practicum/shareit/booking/BookingMapper.java +++ b/server/src/main/java/ru/practicum/shareit/booking/BookingMapper.java @@ -4,11 +4,6 @@ import ru.practicum.shareit.booking.dto.BookingDtoAdd; import ru.practicum.shareit.booking.model.Booking; -import java.time.LocalDateTime; -import java.time.format.DateTimeFormatter; - -import static java.time.format.DateTimeFormatter.ISO_LOCAL_DATE_TIME; - public class BookingMapper { public static BookingDto toBookingDto(Booking booking) { diff --git a/server/src/main/java/ru/practicum/shareit/item/model/Comment.java b/server/src/main/java/ru/practicum/shareit/item/model/Comment.java index 71c5295..bf7fad2 100644 --- a/server/src/main/java/ru/practicum/shareit/item/model/Comment.java +++ b/server/src/main/java/ru/practicum/shareit/item/model/Comment.java @@ -7,8 +7,6 @@ import ru.practicum.shareit.user.model.User; import javax.persistence.*; -import javax.validation.constraints.NotBlank; -import javax.validation.constraints.NotNull; import java.time.LocalDateTime; @Data diff --git a/server/src/main/java/ru/practicum/shareit/item/model/Item.java b/server/src/main/java/ru/practicum/shareit/item/model/Item.java index f66ebca..3d89bb1 100644 --- a/server/src/main/java/ru/practicum/shareit/item/model/Item.java +++ b/server/src/main/java/ru/practicum/shareit/item/model/Item.java @@ -4,13 +4,10 @@ import lombok.Builder; import lombok.Data; import lombok.NoArgsConstructor; -import ru.practicum.shareit.valid.Add; import ru.practicum.shareit.request.model.ItemRequest; import ru.practicum.shareit.user.model.User; import javax.persistence.*; -import javax.validation.constraints.NotBlank; -import javax.validation.constraints.NotNull; @Data @Builder diff --git a/server/src/main/java/ru/practicum/shareit/request/dto/ItemRequestDto.java b/server/src/main/java/ru/practicum/shareit/request/dto/ItemRequestDto.java index 244769a..435747c 100644 --- a/server/src/main/java/ru/practicum/shareit/request/dto/ItemRequestDto.java +++ b/server/src/main/java/ru/practicum/shareit/request/dto/ItemRequestDto.java @@ -6,7 +6,6 @@ import lombok.NoArgsConstructor; import ru.practicum.shareit.item.dto.ItemDtoRequest; -import javax.validation.constraints.NotBlank; import java.time.LocalDateTime; import java.util.List; diff --git a/server/src/main/java/ru/practicum/shareit/request/model/ItemRequest.java b/server/src/main/java/ru/practicum/shareit/request/model/ItemRequest.java index 3b8f294..eff9db0 100644 --- a/server/src/main/java/ru/practicum/shareit/request/model/ItemRequest.java +++ b/server/src/main/java/ru/practicum/shareit/request/model/ItemRequest.java @@ -7,7 +7,6 @@ import ru.practicum.shareit.user.model.User; import javax.persistence.*; -import javax.validation.constraints.NotBlank; import java.time.LocalDateTime; @Data diff --git a/server/src/test/java/ru/practicum/shareit/item/ItemServiceImplIntegrationTest.java b/server/src/test/java/ru/practicum/shareit/item/ItemServiceImplIntegrationTest.java index 46333ec..a498ade 100644 --- a/server/src/test/java/ru/practicum/shareit/item/ItemServiceImplIntegrationTest.java +++ b/server/src/test/java/ru/practicum/shareit/item/ItemServiceImplIntegrationTest.java @@ -8,7 +8,6 @@ import org.springframework.boot.test.context.SpringBootTest; import org.springframework.transaction.annotation.Transactional; import ru.practicum.shareit.booking.BookingRepository; -import ru.practicum.shareit.exception.ObjectNotFoundException; import ru.practicum.shareit.item.dto.ItemDto; import ru.practicum.shareit.item.dto.ItemDtoComments; import ru.practicum.shareit.item.model.Comment; @@ -19,8 +18,6 @@ import java.time.LocalDateTime; import java.util.List; -import static org.junit.jupiter.api.Assertions.*; - @Transactional @SpringBootTest( properties = "db.name=test", From 72e195f949eb1400f70ce7e5ba0efe2981e2072c Mon Sep 17 00:00:00 2001 From: Indira Date: Thu, 13 Jun 2024 23:08:10 +0300 Subject: [PATCH 3/4] =?UTF-8?q?style:=20=D0=A3=D0=B4=D0=B0=D0=BB=D0=B8?= =?UTF-8?q?=D0=BB=D0=B0=20=D0=B8=D0=BC=D0=BF=D0=BE=D1=80=D1=82=D1=8B=20?= =?UTF-8?q?=D0=B2=20gateway?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/ru/practicum/shareit/booking/BookingController.java | 1 - .../ru/practicum/shareit/booking/dto/BookItemRequestDto.java | 4 ---- .../ru/practicum/shareit/request/ItemRequestController.java | 1 - 3 files changed, 6 deletions(-) diff --git a/gateway/src/main/java/ru/practicum/shareit/booking/BookingController.java b/gateway/src/main/java/ru/practicum/shareit/booking/BookingController.java index a26db7f..cbfdf8a 100644 --- a/gateway/src/main/java/ru/practicum/shareit/booking/BookingController.java +++ b/gateway/src/main/java/ru/practicum/shareit/booking/BookingController.java @@ -8,7 +8,6 @@ import ru.practicum.shareit.booking.dto.State; import ru.practicum.shareit.valid.Add; -import javax.validation.Valid; import javax.validation.constraints.Positive; import javax.validation.constraints.PositiveOrZero; diff --git a/gateway/src/main/java/ru/practicum/shareit/booking/dto/BookItemRequestDto.java b/gateway/src/main/java/ru/practicum/shareit/booking/dto/BookItemRequestDto.java index 4d8695c..351b955 100644 --- a/gateway/src/main/java/ru/practicum/shareit/booking/dto/BookItemRequestDto.java +++ b/gateway/src/main/java/ru/practicum/shareit/booking/dto/BookItemRequestDto.java @@ -5,8 +5,6 @@ import lombok.NoArgsConstructor; import ru.practicum.shareit.valid.Add; -import javax.validation.constraints.Future; -import javax.validation.constraints.FutureOrPresent; import javax.validation.constraints.NotNull; import java.time.LocalDateTime; @@ -19,10 +17,8 @@ public class BookItemRequestDto { private Integer itemId; @NotNull(groups = {Add.class}) - // @FutureOrPresent(groups = {Add.class}) private LocalDateTime start; @NotNull(groups = {Add.class}) - // @Future(groups = {Add.class}) private LocalDateTime end; } diff --git a/gateway/src/main/java/ru/practicum/shareit/request/ItemRequestController.java b/gateway/src/main/java/ru/practicum/shareit/request/ItemRequestController.java index 64487c1..9b5802e 100644 --- a/gateway/src/main/java/ru/practicum/shareit/request/ItemRequestController.java +++ b/gateway/src/main/java/ru/practicum/shareit/request/ItemRequestController.java @@ -2,7 +2,6 @@ import lombok.RequiredArgsConstructor; import org.springframework.http.ResponseEntity; -import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.*; import ru.practicum.shareit.request.dto.ItemRequestDto; From a3520ef9aec4bf9e846df6c3425504b379dce162 Mon Sep 17 00:00:00 2001 From: Indira Date: Fri, 14 Jun 2024 13:30:11 +0300 Subject: [PATCH 4/4] =?UTF-8?q?fix:=20=D0=94=D0=BE=D0=B1=D0=B0=D0=B2=D0=B8?= =?UTF-8?q?=D0=BB=D0=B0=20=D0=B0=D0=BD=D0=BD=D0=BE=D1=82=D0=B0=D1=86=D0=B8?= =?UTF-8?q?=D0=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../shareit/booking/dto/BookItemRequestDto.java | 4 ++++ .../item/ItemServiceImplIntegrationTest.java | 14 +++++++------- 2 files changed, 11 insertions(+), 7 deletions(-) diff --git a/gateway/src/main/java/ru/practicum/shareit/booking/dto/BookItemRequestDto.java b/gateway/src/main/java/ru/practicum/shareit/booking/dto/BookItemRequestDto.java index 351b955..46ac6c4 100644 --- a/gateway/src/main/java/ru/practicum/shareit/booking/dto/BookItemRequestDto.java +++ b/gateway/src/main/java/ru/practicum/shareit/booking/dto/BookItemRequestDto.java @@ -5,6 +5,8 @@ import lombok.NoArgsConstructor; import ru.practicum.shareit.valid.Add; +import javax.validation.constraints.Future; +import javax.validation.constraints.FutureOrPresent; import javax.validation.constraints.NotNull; import java.time.LocalDateTime; @@ -16,9 +18,11 @@ public class BookItemRequestDto { @NotNull private Integer itemId; + @FutureOrPresent(groups = {Add.class}) @NotNull(groups = {Add.class}) private LocalDateTime start; + @Future(groups = {Add.class}) @NotNull(groups = {Add.class}) private LocalDateTime end; } diff --git a/server/src/test/java/ru/practicum/shareit/item/ItemServiceImplIntegrationTest.java b/server/src/test/java/ru/practicum/shareit/item/ItemServiceImplIntegrationTest.java index a498ade..f3cef0c 100644 --- a/server/src/test/java/ru/practicum/shareit/item/ItemServiceImplIntegrationTest.java +++ b/server/src/test/java/ru/practicum/shareit/item/ItemServiceImplIntegrationTest.java @@ -90,11 +90,11 @@ void addItem() { Assertions.assertEquals(true, itemDto1.getAvailable()); } -// @Test -// void deleteItem() { -// itemService.deleteItem(itemId); -// List itemDtoComments = itemService.getItemsOfUser(userId, 0, 10); -// -// assertEquals(List.of(), itemDtoComments); -// } + @Test + void deleteItem() { + itemService.deleteItem(itemId); + List itemDtoComments = itemService.getItemsOfUser(userId, 0, 10); + + Assertions.assertEquals(List.of(), itemDtoComments); + } }