diff --git a/docker-compose.yml b/docker-compose.yml new file mode 100644 index 0000000..c4a2d1e --- /dev/null +++ b/docker-compose.yml @@ -0,0 +1,33 @@ +version: '3.8' +services: + gateway: + build: gateway + container_name: shareit_gateway_container + ports: + - "8080:8080" + depends_on: + - server + environment: + - SHAREIT_SERVER_URL=http://server:9090 + + server: + build: server + container_name: shareit_server_container + ports: + - "9090:9090" + depends_on: + - db + environment: + - SPRING_DATASOURCE_URL=jdbc:postgresql://db:5432/shareit + - SPRING_DATASOURCE_USERNAME=shareit + - SPRING_DATASOURCE_PASSWORD=root + + db: + image: postgres:13.7-alpine + container_name: shareit_db_container + ports: + - "6541:5432" + environment: + - POSTGRES_DB=shareit + - POSTGRES_USER=shareit + - POSTGRES_PASSWORD=root diff --git a/gateway/Dockerfile b/gateway/Dockerfile new file mode 100644 index 0000000..6bd71b7 --- /dev/null +++ b/gateway/Dockerfile @@ -0,0 +1,3 @@ +FROM amazoncorretto:11 +COPY target/*.jar app.jar +ENTRYPOINT ["java","-jar","/app.jar"] diff --git a/gateway/pom.xml b/gateway/pom.xml new file mode 100644 index 0000000..05fbcdf --- /dev/null +++ b/gateway/pom.xml @@ -0,0 +1,73 @@ + + + 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.apache.httpcomponents + httpclient + + + + org.springframework.boot + spring-boot-configuration-processor + true + + + + org.projectlombok + lombok + true + + + + org.springframework.boot + spring-boot-starter-test + test + + + org.springframework.data + spring-data-commons + + + com.h2database + h2 + + + + + + + org.springframework.boot + spring-boot-maven-plugin + + + + + diff --git a/gateway/src/main/java/ru/practicum/shareit/ShareItGateway.java b/gateway/src/main/java/ru/practicum/shareit/ShareItGateway.java new file mode 100644 index 0000000..0aa75c3 --- /dev/null +++ b/gateway/src/main/java/ru/practicum/shareit/ShareItGateway.java @@ -0,0 +1,12 @@ +package ru.practicum.shareit; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; + +@SpringBootApplication +public class ShareItGateway { + public static void main(String[] args) { + SpringApplication.run(ShareItGateway.class, args); + } + +} diff --git a/gateway/src/main/java/ru/practicum/shareit/booking/client/BookingClient.java b/gateway/src/main/java/ru/practicum/shareit/booking/client/BookingClient.java new file mode 100644 index 0000000..7f8243f --- /dev/null +++ b/gateway/src/main/java/ru/practicum/shareit/booking/client/BookingClient.java @@ -0,0 +1,51 @@ +package ru.practicum.shareit.booking.client; + +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.BookingRequestDto; +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 getAllBookingsForUser(Long userId, State state, Integer from, Integer size) { + Map parameters = Map.of("state", state, "from", from, "size", size); + return get("?state={state}&from={from}&size={size}", userId, parameters); + } + + public ResponseEntity getBooking(Long userId, Long bookingId) { + return get("/" + bookingId, userId); + } + + public ResponseEntity getAllItemsBookingForUser(Long ownerId, State state, Integer from, Integer size) { + Map parameters = Map.of("state", state.name(), "from", from, "size", size); + return get("/owner?state={state}&from={from}&size={size}", ownerId, parameters); + } + + public ResponseEntity create(Long userId, BookingRequestDto bookingRequestDto) { + return post("", userId, bookingRequestDto); + } + + public ResponseEntity updateStatus(Long userId, Long bookingId, Boolean approved) { + Map parameters = Map.of("approved", approved); + return patch("/" + bookingId + "?approved={approved}", userId, parameters, null); + } + +} diff --git a/gateway/src/main/java/ru/practicum/shareit/booking/controller/BookingController.java b/gateway/src/main/java/ru/practicum/shareit/booking/controller/BookingController.java new file mode 100644 index 0000000..a959fa7 --- /dev/null +++ b/gateway/src/main/java/ru/practicum/shareit/booking/controller/BookingController.java @@ -0,0 +1,75 @@ +package ru.practicum.shareit.booking.controller; + +import lombok.RequiredArgsConstructor; +import org.springframework.http.ResponseEntity; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PatchMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestHeader; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; +import ru.practicum.shareit.booking.client.BookingClient; +import ru.practicum.shareit.booking.dto.BookingRequestDto; +import ru.practicum.shareit.booking.dto.State; +import ru.practicum.shareit.exeption.StateException; +import ru.practicum.shareit.utils.HttpHeaders; + +import javax.validation.Valid; +import javax.validation.constraints.Positive; +import javax.validation.constraints.PositiveOrZero; + +@Validated +@RestController +@RequiredArgsConstructor +@RequestMapping(path = "/bookings") +public class BookingController { + + private final BookingClient bookingClient; + + @GetMapping + public ResponseEntity getAllBookingsForUser(@RequestHeader(name = HttpHeaders.USER_ID_HEADER) Long userId, + @RequestParam(defaultValue = "ALL") String state, + @PositiveOrZero @RequestParam(defaultValue = "0") Integer from, + @Positive @RequestParam(defaultValue = "10") Integer size) { + return bookingClient.getAllBookingsForUser(userId, parseState(state), from, size); + } + + @GetMapping("/{bookingId}") + public ResponseEntity getBooking(@RequestHeader(name = HttpHeaders.USER_ID_HEADER) Long userId, + @PathVariable Long bookingId) { + return bookingClient.getBooking(userId, bookingId); + } + + @GetMapping("/owner") + public ResponseEntity getAllItemsBookingForUser(@RequestHeader(name = HttpHeaders.USER_ID_HEADER) Long userId, + @RequestParam(defaultValue = "ALL") String state, + @PositiveOrZero @RequestParam(defaultValue = "0") Integer from, + @Positive @RequestParam(defaultValue = "10") Integer size) { + return bookingClient.getAllItemsBookingForUser(userId, parseState(state), from, size); + } + + @PostMapping + public ResponseEntity create(@RequestHeader(name = HttpHeaders.USER_ID_HEADER) Long userId, + @Valid @RequestBody BookingRequestDto bookingRequestDto) { + return bookingClient.create(userId, bookingRequestDto); + } + + @PatchMapping("/{bookingId}") + public ResponseEntity updateStatus(@RequestHeader(name = HttpHeaders.USER_ID_HEADER) Long userId, + @PathVariable Long bookingId, @RequestParam Boolean approved) { + return bookingClient.updateStatus(userId, bookingId, approved); + } + + private State parseState(String state) { + try { + return State.valueOf(state); + } catch (IllegalArgumentException e) { + throw new StateException(String.format("Unknown state: %s", state)); + } + } + +} diff --git a/src/main/java/ru/practicum/shareit/booking/dto/BookingItemDto.java b/gateway/src/main/java/ru/practicum/shareit/booking/dto/BookingItemDto.java similarity index 100% rename from src/main/java/ru/practicum/shareit/booking/dto/BookingItemDto.java rename to gateway/src/main/java/ru/practicum/shareit/booking/dto/BookingItemDto.java diff --git a/src/main/java/ru/practicum/shareit/booking/dto/BookingRequestDto.java b/gateway/src/main/java/ru/practicum/shareit/booking/dto/BookingRequestDto.java similarity index 100% rename from src/main/java/ru/practicum/shareit/booking/dto/BookingRequestDto.java rename to gateway/src/main/java/ru/practicum/shareit/booking/dto/BookingRequestDto.java 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..b73dd08 --- /dev/null +++ b/gateway/src/main/java/ru/practicum/shareit/booking/dto/State.java @@ -0,0 +1,10 @@ +package ru.practicum.shareit.booking.dto; + +public enum State { + ALL, + CURRENT, + PAST, + FUTURE, + WAITING, + REJECTED +} diff --git a/gateway/src/main/java/ru/practicum/shareit/booking/dto/Status.java b/gateway/src/main/java/ru/practicum/shareit/booking/dto/Status.java new file mode 100644 index 0000000..672c1d3 --- /dev/null +++ b/gateway/src/main/java/ru/practicum/shareit/booking/dto/Status.java @@ -0,0 +1,7 @@ +package ru.practicum.shareit.booking.dto; + +public enum Status { + WAITING, + APPROVED, + REJECTED +} 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..207326c --- /dev/null +++ b/gateway/src/main/java/ru/practicum/shareit/client/BaseClient.java @@ -0,0 +1,126 @@ +package ru.practicum.shareit.client; + +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; + +import java.util.List; +import java.util.Map; + +public class BaseClient { + protected final RestTemplate rest; + + public BaseClient(RestTemplate rest) { + this.rest = rest; + } + + protected ResponseEntity get(String path) { + return get(path, null, null); + } + + protected ResponseEntity get(String path, long userId) { + return get(path, userId, null); + } + + protected ResponseEntity get(String path, Long userId, @Nullable Map parameters) { + return makeAndSendRequest(HttpMethod.GET, path, userId, parameters, null); + } + + protected ResponseEntity 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, long userId, T body) { + return post(path, userId, null, body); + } + + protected ResponseEntity post(String path, Long userId, @Nullable Map parameters, T body) { + return makeAndSendRequest(HttpMethod.POST, path, userId, parameters, body); + } + + protected ResponseEntity put(String path, long userId, T body) { + return put(path, userId, null, body); + } + + protected ResponseEntity put(String path, long userId, @Nullable Map parameters, T body) { + return makeAndSendRequest(HttpMethod.PUT, path, userId, parameters, body); + } + + protected ResponseEntity patch(String path, T body) { + return patch(path, null, null, body); + } + + protected ResponseEntity patch(String path, long userId) { + return patch(path, userId, null, null); + } + + protected ResponseEntity patch(String path, long userId, T body) { + return patch(path, userId, null, body); + } + + protected ResponseEntity patch(String path, Long userId, @Nullable Map parameters, T body) { + return makeAndSendRequest(HttpMethod.PATCH, path, userId, parameters, body); + } + + protected ResponseEntity delete(String path) { + return delete(path, null, null); + } + + protected ResponseEntity delete(String path, long userId) { + return delete(path, userId, null); + } + + protected ResponseEntity delete(String path, Long userId, @Nullable Map parameters) { + return makeAndSendRequest(HttpMethod.DELETE, path, userId, parameters, null); + } + + private ResponseEntity makeAndSendRequest(HttpMethod method, String path, Long userId, @Nullable Map parameters, @Nullable T body) { + HttpEntity requestEntity = new HttpEntity<>(body, defaultHeaders(userId)); + + ResponseEntity shareitServerResponse; + + try { + if (parameters != null) { + shareitServerResponse = rest.exchange(path, method, requestEntity, Object.class, parameters); + } else { + shareitServerResponse = rest.exchange(path, method, requestEntity, Object.class); + } + } catch (HttpStatusCodeException e) { + return ResponseEntity.status(e.getStatusCode()).body(e.getResponseBodyAsByteArray()); + } + return prepareGatewayResponse(shareitServerResponse); + } + + private HttpHeaders defaultHeaders(Long userId) { + HttpHeaders headers = new HttpHeaders(); + headers.setContentType(MediaType.APPLICATION_JSON); + headers.setAccept(List.of(MediaType.APPLICATION_JSON)); + if (userId != null) { + headers.set("X-Sharer-User-Id", String.valueOf(userId)); + } + return headers; + } + + private static ResponseEntity prepareGatewayResponse(ResponseEntity response) { + if (response.getStatusCode().is2xxSuccessful()) { + return response; + } + + ResponseEntity.BodyBuilder responseBuilder = ResponseEntity.status(response.getStatusCode()); + + if (response.hasBody()) { + return responseBuilder.body(response.getBody()); + } + + return responseBuilder.build(); + } +} diff --git a/gateway/src/main/java/ru/practicum/shareit/errorHandler/ErrorHandler.java b/gateway/src/main/java/ru/practicum/shareit/errorHandler/ErrorHandler.java new file mode 100644 index 0000000..b00a139 --- /dev/null +++ b/gateway/src/main/java/ru/practicum/shareit/errorHandler/ErrorHandler.java @@ -0,0 +1,66 @@ +package ru.practicum.shareit.errorHandler; + +import lombok.extern.slf4j.Slf4j; +import org.springframework.context.support.DefaultMessageSourceResolvable; +import org.springframework.http.HttpStatus; +import org.springframework.web.bind.MethodArgumentNotValidException; +import org.springframework.web.bind.annotation.ExceptionHandler; +import org.springframework.web.bind.annotation.ResponseStatus; +import org.springframework.web.bind.annotation.RestControllerAdvice; +import ru.practicum.shareit.exeption.StateException; + +import javax.validation.ConstraintViolation; +import javax.validation.ConstraintViolationException; +import java.util.List; +import java.util.stream.Collectors; + +@Slf4j +@RestControllerAdvice +public class ErrorHandler { + + @ExceptionHandler + @ResponseStatus(HttpStatus.BAD_REQUEST) + public ErrorResponse handleValidationException(final MethodArgumentNotValidException e) { + List errors = e.getBindingResult() + .getFieldErrors() + .stream() + .map(DefaultMessageSourceResolvable::getDefaultMessage) + .collect(Collectors.toList()); + + String errorMessage = errors.stream().findFirst().orElse(""); + + log.error("Validation error. Status 400! {}", errorMessage, e); + + return new ErrorResponse("Validation error: " + errorMessage); + } + + @ExceptionHandler + @ResponseStatus(HttpStatus.BAD_REQUEST) + public ErrorResponse handleValidationException(final ConstraintViolationException e) { + List errors = e.getConstraintViolations() + .stream() + .map(ConstraintViolation::getMessage) + .collect(Collectors.toList()); + + String errorMessage = errors.stream().findFirst().orElse(""); + + log.error("Validation error. Status 400! {}", errorMessage, e); + + return new ErrorResponse("Validation error: " + errorMessage); + } + + @ExceptionHandler({StateException.class}) + @ResponseStatus(HttpStatus.BAD_REQUEST) + public ErrorResponse handleBadRequestException(final Exception e) { + log.error("Available error. Status 400! {}", e.getMessage(), e); + return new ErrorResponse(e.getMessage()); + } + + @ExceptionHandler + @ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR) + public ErrorResponse handleThrowable(final Exception e) { + log.error("Error. Status 500! {}", e.getMessage(), e); + return new ErrorResponse("Error: " + e.getMessage()); + } + +} diff --git a/src/main/java/ru/practicum/shareit/errorHandler/ErrorResponse.java b/gateway/src/main/java/ru/practicum/shareit/errorHandler/ErrorResponse.java similarity index 100% rename from src/main/java/ru/practicum/shareit/errorHandler/ErrorResponse.java rename to gateway/src/main/java/ru/practicum/shareit/errorHandler/ErrorResponse.java diff --git a/src/main/java/ru/practicum/shareit/exeption/StateException.java b/gateway/src/main/java/ru/practicum/shareit/exeption/StateException.java similarity index 100% rename from src/main/java/ru/practicum/shareit/exeption/StateException.java rename to gateway/src/main/java/ru/practicum/shareit/exeption/StateException.java diff --git a/gateway/src/main/java/ru/practicum/shareit/item/client/ItemClient.java b/gateway/src/main/java/ru/practicum/shareit/item/client/ItemClient.java new file mode 100644 index 0000000..002d6ec --- /dev/null +++ b/gateway/src/main/java/ru/practicum/shareit/item/client/ItemClient.java @@ -0,0 +1,55 @@ +package ru.practicum.shareit.item.client; + +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.CommentRequestDto; +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 findByUserId(Long userId, Integer from, Integer size) { + Map parameters = Map.of("from", from, "size", size); + return get("?from={from}&size={size}", userId, parameters); + } + + public ResponseEntity findById(Long userId, Long itemId) { + return get("/" + itemId, userId); + } + + public ResponseEntity search(String text, Integer from, Integer size) { + Map parameters = Map.of("text", text, "from", from, "size", size); + return get("/search?text={text}&from={from}&size={size}", parameters); + } + + public ResponseEntity create(Long userId, ItemDto itemRequestDto) { + return post("", userId, itemRequestDto); + } + + public ResponseEntity update(Long userId, Long itemId, ItemDto itemRequestDto) { + return patch("/" + itemId, userId, itemRequestDto); + } + + public ResponseEntity createComment(Long userId, Long itemId, CommentRequestDto commentRequestDto) { + return post("/" + itemId + "/comment", userId, commentRequestDto); + } + +} diff --git a/gateway/src/main/java/ru/practicum/shareit/item/controller/ItemController.java b/gateway/src/main/java/ru/practicum/shareit/item/controller/ItemController.java new file mode 100644 index 0000000..46d51c9 --- /dev/null +++ b/gateway/src/main/java/ru/practicum/shareit/item/controller/ItemController.java @@ -0,0 +1,71 @@ +package ru.practicum.shareit.item.controller; + +import lombok.RequiredArgsConstructor; +import org.springframework.http.ResponseEntity; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PatchMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestHeader; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; +import ru.practicum.shareit.item.client.ItemClient; +import ru.practicum.shareit.item.dto.CommentRequestDto; +import ru.practicum.shareit.item.dto.ItemDto; +import ru.practicum.shareit.utils.HttpHeaders; + +import javax.validation.Valid; +import javax.validation.constraints.Positive; +import javax.validation.constraints.PositiveOrZero; + +@Validated +@RestController +@RequiredArgsConstructor +@RequestMapping("/items") +public class ItemController { + + private final ItemClient itemClient; + + @GetMapping + public ResponseEntity findByUserId(@RequestHeader(name = HttpHeaders.USER_ID_HEADER) Long userId, + @PositiveOrZero @RequestParam(defaultValue = "0") Integer from, + @Positive @RequestParam(defaultValue = "10") Integer size) { + return itemClient.findByUserId(userId, from, size); + } + + @GetMapping("/{itemId}") + public ResponseEntity findById(@RequestHeader(name = HttpHeaders.USER_ID_HEADER) Long userId, @PathVariable Long itemId) { + return itemClient.findById(userId, itemId); + } + + @GetMapping("/search") + public ResponseEntity search(@RequestParam("text") String text, + @PositiveOrZero @RequestParam(defaultValue = "0") Integer from, + @Positive @RequestParam(defaultValue = "10") Integer size) { + return itemClient.search(text, from, size); + } + + @PostMapping + public ResponseEntity create(@RequestHeader(name = HttpHeaders.USER_ID_HEADER) Long userId, + @Valid @RequestBody ItemDto itemDto) { + return itemClient.create(userId, itemDto); + } + + @PatchMapping("/{itemId}") + public ResponseEntity update(@RequestHeader(name = HttpHeaders.USER_ID_HEADER) Long userId, + @PathVariable Long itemId, + @RequestBody ItemDto itemDto) { + return itemClient.update(userId, itemId, itemDto); + } + + @PostMapping("/{itemId}/comment") + public ResponseEntity createComment(@RequestHeader(name = HttpHeaders.USER_ID_HEADER) Long userId, + @PathVariable Long itemId, + @Valid @RequestBody CommentRequestDto commentDto) { + return itemClient.createComment(userId, itemId, commentDto); + } + +} diff --git a/src/main/java/ru/practicum/shareit/item/dto/CommentDto.java b/gateway/src/main/java/ru/practicum/shareit/item/dto/CommentDto.java similarity index 100% rename from src/main/java/ru/practicum/shareit/item/dto/CommentDto.java rename to gateway/src/main/java/ru/practicum/shareit/item/dto/CommentDto.java diff --git a/src/main/java/ru/practicum/shareit/item/dto/CommentRequestDto.java b/gateway/src/main/java/ru/practicum/shareit/item/dto/CommentRequestDto.java similarity index 100% rename from src/main/java/ru/practicum/shareit/item/dto/CommentRequestDto.java rename to gateway/src/main/java/ru/practicum/shareit/item/dto/CommentRequestDto.java 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 100% 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 diff --git a/gateway/src/main/java/ru/practicum/shareit/request/client/ItemRequestClient.java b/gateway/src/main/java/ru/practicum/shareit/request/client/ItemRequestClient.java new file mode 100644 index 0000000..fe5065e --- /dev/null +++ b/gateway/src/main/java/ru/practicum/shareit/request/client/ItemRequestClient.java @@ -0,0 +1,43 @@ +package ru.practicum.shareit.request.client; + +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.CreateItemRequestDto; + +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 findAllByUserId(Long userId) { + return get("", userId); + } + + public ResponseEntity findAll(Long userId, Integer from, Integer size) { + Map parameters = Map.of("from", from, "size", size); + return get("/all?from={from}&size={size}", userId, parameters); + } + + public ResponseEntity findById(Long userId, Long requestId) { + return get("/" + requestId, userId); + } + + public ResponseEntity createRequest(Long userId, CreateItemRequestDto createItemRequestDto) { + return post("", userId, createItemRequestDto); + } + +} diff --git a/gateway/src/main/java/ru/practicum/shareit/request/controller/ItemRequestController.java b/gateway/src/main/java/ru/practicum/shareit/request/controller/ItemRequestController.java new file mode 100644 index 0000000..aecad9d --- /dev/null +++ b/gateway/src/main/java/ru/practicum/shareit/request/controller/ItemRequestController.java @@ -0,0 +1,57 @@ +package ru.practicum.shareit.request.controller; + +import lombok.RequiredArgsConstructor; +import org.springframework.http.ResponseEntity; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestHeader; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; +import ru.practicum.shareit.request.client.ItemRequestClient; +import ru.practicum.shareit.request.dto.CreateItemRequestDto; +import ru.practicum.shareit.utils.HttpHeaders; + +import javax.validation.Valid; +import javax.validation.constraints.Positive; +import javax.validation.constraints.PositiveOrZero; + +@Validated +@RestController +@RequiredArgsConstructor +@RequestMapping(path = "/requests") +public class ItemRequestController { + + private static final String DEFAULT_FROM_VALUE = "0"; + private static final String DEFAULT_SIZE_VALUE = "20"; + + private final ItemRequestClient itemRequestClient; + + @GetMapping + public ResponseEntity findAllByUserId(@RequestHeader(HttpHeaders.USER_ID_HEADER) Long userId) { + return itemRequestClient.findAllByUserId(userId); + } + + @GetMapping("/all") + public ResponseEntity findAll(@RequestHeader(HttpHeaders.USER_ID_HEADER) Long userId, + @PositiveOrZero @RequestParam(defaultValue = DEFAULT_FROM_VALUE) int from, + @Positive @RequestParam(defaultValue = DEFAULT_SIZE_VALUE) int size) { + return itemRequestClient.findAll(userId, from, size); + } + + @GetMapping("/{requestId}") + public ResponseEntity findById(@RequestHeader(HttpHeaders.USER_ID_HEADER) Long userId, + @PathVariable Long requestId) { + return itemRequestClient.findById(userId, requestId); + } + + @PostMapping + public ResponseEntity createRequest(@RequestHeader(HttpHeaders.USER_ID_HEADER) Long userId, + @Valid @RequestBody CreateItemRequestDto createItemRequestDto) { + return itemRequestClient.createRequest(userId, createItemRequestDto); + } + +} diff --git a/src/main/java/ru/practicum/shareit/request/dto/CreateItemRequestDto.java b/gateway/src/main/java/ru/practicum/shareit/request/dto/CreateItemRequestDto.java similarity index 100% rename from src/main/java/ru/practicum/shareit/request/dto/CreateItemRequestDto.java rename to gateway/src/main/java/ru/practicum/shareit/request/dto/CreateItemRequestDto.java diff --git a/gateway/src/main/java/ru/practicum/shareit/user/client/UserClient.java b/gateway/src/main/java/ru/practicum/shareit/user/client/UserClient.java new file mode 100644 index 0000000..b0ba143 --- /dev/null +++ b/gateway/src/main/java/ru/practicum/shareit/user/client/UserClient.java @@ -0,0 +1,44 @@ +package ru.practicum.shareit.user.client; + +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; + +@Service +public class UserClient extends BaseClient { + + private static final String API_PREFIX = "/users"; + + public UserClient(@Value("${shareit-server.url}") String serverUrl, RestTemplateBuilder builder) { + super(builder + .uriTemplateHandler(new DefaultUriBuilderFactory(serverUrl + API_PREFIX)) + .requestFactory(HttpComponentsClientHttpRequestFactory::new) + .build()); + } + + public ResponseEntity getAll() { + return get(""); + } + + public ResponseEntity findById(Long userId) { + return get("/" + userId); + } + + public ResponseEntity create(UserDto user) { + return post("", user); + } + + public ResponseEntity update(Long userId, UserDto user) { + return patch("/" + userId, user); + } + + public void delete(Long userId) { + delete("/" + userId); + } + +} diff --git a/gateway/src/main/java/ru/practicum/shareit/user/controller/UserController.java b/gateway/src/main/java/ru/practicum/shareit/user/controller/UserController.java new file mode 100644 index 0000000..0504a03 --- /dev/null +++ b/gateway/src/main/java/ru/practicum/shareit/user/controller/UserController.java @@ -0,0 +1,52 @@ +package ru.practicum.shareit.user.controller; + +import lombok.RequiredArgsConstructor; +import org.springframework.http.ResponseEntity; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.DeleteMapping; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PatchMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; +import ru.practicum.shareit.user.client.UserClient; +import ru.practicum.shareit.user.dto.UserDto; + +import javax.validation.Valid; + +@Validated +@RestController +@RequiredArgsConstructor +@RequestMapping(path = "/users") +public class UserController { + + private final UserClient userClient; + + @GetMapping() + public ResponseEntity getAll() { + return userClient.getAll(); + } + + @GetMapping("/{userId}") + public ResponseEntity findById(@PathVariable Long userId) { + return userClient.findById(userId); + } + + @PostMapping() + public ResponseEntity create(@Valid @RequestBody UserDto user) { + return userClient.create(user); + } + + @PatchMapping("/{userId}") + public ResponseEntity update(@PathVariable Long userId, @RequestBody UserDto user) { + return userClient.update(userId, user); + } + + @DeleteMapping("/{userId}") + public void delete(@PathVariable Long userId) { + userClient.delete(userId); + } + +} 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 100% 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 diff --git a/src/main/java/ru/practicum/shareit/utils/HttpHeaders.java b/gateway/src/main/java/ru/practicum/shareit/utils/HttpHeaders.java similarity index 100% rename from src/main/java/ru/practicum/shareit/utils/HttpHeaders.java rename to gateway/src/main/java/ru/practicum/shareit/utils/HttpHeaders.java diff --git a/gateway/src/main/resources/application.properties b/gateway/src/main/resources/application.properties new file mode 100644 index 0000000..c877be8 --- /dev/null +++ b/gateway/src/main/resources/application.properties @@ -0,0 +1,5 @@ +server.port=8080 + +logging.level.org.springframework.web.client.RestTemplate=DEBUG + +shareit-server.url=http://localhost:9090 diff --git a/pom.xml b/pom.xml index 25bb018..cba4430 100644 --- a/pom.xml +++ b/pom.xml @@ -5,88 +5,43 @@ org.springframework.boot spring-boot-starter-parent - 2.7.2 + 2.7.9 ru.practicum shareit + pom 0.0.1-SNAPSHOT ShareIt - 11 + 11 + 11 + UTF-8 - - - org.springframework.boot - spring-boot-starter-web - - - - org.springframework.boot - spring-boot-starter-data-jpa - - - - org.postgresql - postgresql - 42.3.8 - 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 - - + + gateway + server + - - - src/main/resources - true - - - - - org.springframework.boot - spring-boot-maven-plugin - - - - org.projectlombok - lombok - - - - - + + org.springframework.boot + spring-boot-maven-plugin + + + + org.projectlombok + lombok + + + + org.apache.maven.plugins maven-surefire-plugin @@ -233,17 +188,5 @@ - - coverage - - - - org.jacoco - jacoco-maven-plugin - - - - - diff --git a/server/Dockerfile b/server/Dockerfile new file mode 100644 index 0000000..6bd71b7 --- /dev/null +++ b/server/Dockerfile @@ -0,0 +1,3 @@ +FROM amazoncorretto:11 +COPY target/*.jar app.jar +ENTRYPOINT ["java","-jar","/app.jar"] diff --git a/server/pom.xml b/server/pom.xml new file mode 100644 index 0000000..a508c66 --- /dev/null +++ b/server/pom.xml @@ -0,0 +1,90 @@ + + + 4.0.0 + + ru.practicum + shareit + 0.0.1-SNAPSHOT + + + shareit-server + 0.0.1-SNAPSHOT + + ShareIt Server + + + + org.springframework.boot + spring-boot-starter-data-jpa + + + + org.springframework.boot + spring-boot-starter-web + + + + org.springframework.boot + spring-boot-starter-actuator + + + + org.postgresql + postgresql + runtime + + + + com.h2database + h2 + runtime + + + + org.springframework.boot + spring-boot-configuration-processor + true + + + + org.projectlombok + lombok + true + + + + org.springframework.boot + spring-boot-starter-test + test + + + jakarta.validation + jakarta.validation-api + + + + + + + org.springframework.boot + spring-boot-maven-plugin + + + + + + + coverage + + + + org.jacoco + jacoco-maven-plugin + + + + + + + diff --git a/src/main/java/ru/practicum/shareit/ShareItApp.java b/server/src/main/java/ru/practicum/shareit/ShareItServer.java similarity index 73% rename from src/main/java/ru/practicum/shareit/ShareItApp.java rename to server/src/main/java/ru/practicum/shareit/ShareItServer.java index a00ad56..303541d 100644 --- a/src/main/java/ru/practicum/shareit/ShareItApp.java +++ b/server/src/main/java/ru/practicum/shareit/ShareItServer.java @@ -4,10 +4,10 @@ import org.springframework.boot.autoconfigure.SpringBootApplication; @SpringBootApplication -public class ShareItApp { +public class ShareItServer { public static void main(String[] args) { - SpringApplication.run(ShareItApp.class, args); + SpringApplication.run(ShareItServer.class, args); } } diff --git a/src/main/java/ru/practicum/shareit/booking/controller/BookingController.java b/server/src/main/java/ru/practicum/shareit/booking/controller/BookingController.java similarity index 76% rename from src/main/java/ru/practicum/shareit/booking/controller/BookingController.java rename to server/src/main/java/ru/practicum/shareit/booking/controller/BookingController.java index 3cb2326..d906b3b 100644 --- a/src/main/java/ru/practicum/shareit/booking/controller/BookingController.java +++ b/server/src/main/java/ru/practicum/shareit/booking/controller/BookingController.java @@ -4,7 +4,6 @@ import org.springframework.data.domain.PageRequest; import org.springframework.data.domain.Pageable; import org.springframework.data.domain.Sort; -import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PatchMapping; import org.springframework.web.bind.annotation.PathVariable; @@ -16,15 +15,12 @@ import org.springframework.web.bind.annotation.RestController; import ru.practicum.shareit.booking.dto.BookingDto; import ru.practicum.shareit.booking.dto.BookingRequestDto; +import ru.practicum.shareit.booking.model.State; import ru.practicum.shareit.booking.service.BookingService; import ru.practicum.shareit.utils.HttpHeaders; -import javax.validation.Valid; -import javax.validation.constraints.Positive; -import javax.validation.constraints.PositiveOrZero; import java.util.List; -@Validated @RestController @RequiredArgsConstructor @RequestMapping(path = "/bookings") @@ -34,9 +30,9 @@ public class BookingController { @GetMapping public List getAllBookingsForUser(@RequestHeader(name = HttpHeaders.USER_ID_HEADER) Long userId, - @RequestParam(defaultValue = "ALL") String state, - @PositiveOrZero @RequestParam(defaultValue = "0") Integer from, - @Positive @RequestParam(defaultValue = "10") Integer size) { + @RequestParam(defaultValue = "ALL") State state, + @RequestParam(defaultValue = "0") Integer from, + @RequestParam(defaultValue = "10") Integer size) { Pageable pageable = PageRequest.of(from / size, size, Sort.by("startDate").descending()); return bookingService.getAllBookingsForUser(userId, state, pageable); @@ -50,9 +46,9 @@ public BookingDto getBooking(@RequestHeader(name = HttpHeaders.USER_ID_HEADER) L @GetMapping("/owner") public List getAllItemsBookingForUser(@RequestHeader(name = HttpHeaders.USER_ID_HEADER) Long userId, - @RequestParam(defaultValue = "ALL") String state, - @PositiveOrZero @RequestParam(defaultValue = "0") Integer from, - @Positive @RequestParam(defaultValue = "10") Integer size) { + @RequestParam(defaultValue = "ALL") State state, + @RequestParam(defaultValue = "0") Integer from, + @RequestParam(defaultValue = "10") Integer size) { Pageable pageable = PageRequest.of(from / size, size, Sort.by("startDate").descending()); return bookingService.getAllItemsBookingForUser(userId, state, pageable); @@ -60,7 +56,7 @@ public List getAllItemsBookingForUser(@RequestHeader(name = HttpHead @PostMapping public BookingDto create(@RequestHeader(name = HttpHeaders.USER_ID_HEADER) Long userId, - @Valid @RequestBody BookingRequestDto bookingRequestDto) { + @RequestBody BookingRequestDto bookingRequestDto) { return bookingService.create(userId, bookingRequestDto); } 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/BookingItemDto.java b/server/src/main/java/ru/practicum/shareit/booking/dto/BookingItemDto.java new file mode 100644 index 0000000..cb93186 --- /dev/null +++ b/server/src/main/java/ru/practicum/shareit/booking/dto/BookingItemDto.java @@ -0,0 +1,22 @@ +package ru.practicum.shareit.booking.dto; + +import lombok.Builder; +import lombok.Getter; +import lombok.Setter; + +import java.time.LocalDateTime; + +@Getter +@Setter +@Builder +public class BookingItemDto { + + private Long id; + + private Long bookerId; + + private LocalDateTime start; + + private LocalDateTime end; + +} diff --git a/server/src/main/java/ru/practicum/shareit/booking/dto/BookingRequestDto.java b/server/src/main/java/ru/practicum/shareit/booking/dto/BookingRequestDto.java new file mode 100644 index 0000000..e2de248 --- /dev/null +++ b/server/src/main/java/ru/practicum/shareit/booking/dto/BookingRequestDto.java @@ -0,0 +1,31 @@ +package ru.practicum.shareit.booking.dto; + +import lombok.Builder; +import lombok.EqualsAndHashCode; +import lombok.Getter; +import lombok.Setter; + +import javax.validation.constraints.Future; +import javax.validation.constraints.FutureOrPresent; +import javax.validation.constraints.NotNull; +import java.time.LocalDateTime; + +@Getter +@Setter +@EqualsAndHashCode +@Builder +public class BookingRequestDto { + + private Long id; + + @NotNull + @FutureOrPresent + private LocalDateTime start; + + @Future + @NotNull + private LocalDateTime end; + + private Long itemId; + +} diff --git a/src/main/java/ru/practicum/shareit/booking/mapper/BookingMapper.java b/server/src/main/java/ru/practicum/shareit/booking/mapper/BookingMapper.java similarity index 100% rename from src/main/java/ru/practicum/shareit/booking/mapper/BookingMapper.java rename to server/src/main/java/ru/practicum/shareit/booking/mapper/BookingMapper.java 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 100% 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 diff --git a/src/main/java/ru/practicum/shareit/booking/model/State.java b/server/src/main/java/ru/practicum/shareit/booking/model/State.java similarity index 100% rename from src/main/java/ru/practicum/shareit/booking/model/State.java rename to server/src/main/java/ru/practicum/shareit/booking/model/State.java diff --git a/src/main/java/ru/practicum/shareit/booking/model/Status.java b/server/src/main/java/ru/practicum/shareit/booking/model/Status.java similarity index 100% rename from src/main/java/ru/practicum/shareit/booking/model/Status.java rename to server/src/main/java/ru/practicum/shareit/booking/model/Status.java diff --git a/src/main/java/ru/practicum/shareit/booking/repository/BookingRepository.java b/server/src/main/java/ru/practicum/shareit/booking/repository/BookingRepository.java similarity index 100% rename from src/main/java/ru/practicum/shareit/booking/repository/BookingRepository.java rename to server/src/main/java/ru/practicum/shareit/booking/repository/BookingRepository.java diff --git a/src/main/java/ru/practicum/shareit/booking/service/BookingService.java b/server/src/main/java/ru/practicum/shareit/booking/service/BookingService.java similarity index 67% rename from src/main/java/ru/practicum/shareit/booking/service/BookingService.java rename to server/src/main/java/ru/practicum/shareit/booking/service/BookingService.java index 4eecaac..f240576 100644 --- a/src/main/java/ru/practicum/shareit/booking/service/BookingService.java +++ b/server/src/main/java/ru/practicum/shareit/booking/service/BookingService.java @@ -3,16 +3,17 @@ import org.springframework.data.domain.Pageable; import ru.practicum.shareit.booking.dto.BookingDto; import ru.practicum.shareit.booking.dto.BookingRequestDto; +import ru.practicum.shareit.booking.model.State; import java.util.List; public interface BookingService { - List getAllBookingsForUser(Long userId, String state, Pageable pageable); + List getAllBookingsForUser(Long userId, State state, Pageable pageable); BookingDto getBooking(Long userId, Long bookingId); - List getAllItemsBookingForUser(Long userId, String state, Pageable pageable); + List getAllItemsBookingForUser(Long userId, State state, Pageable pageable); BookingDto create(Long userId, BookingRequestDto bookingRequestDto); diff --git a/src/main/java/ru/practicum/shareit/booking/service/BookingServiceImpl.java b/server/src/main/java/ru/practicum/shareit/booking/service/BookingServiceImpl.java similarity index 93% rename from src/main/java/ru/practicum/shareit/booking/service/BookingServiceImpl.java rename to server/src/main/java/ru/practicum/shareit/booking/service/BookingServiceImpl.java index fde285d..411caf6 100644 --- a/src/main/java/ru/practicum/shareit/booking/service/BookingServiceImpl.java +++ b/server/src/main/java/ru/practicum/shareit/booking/service/BookingServiceImpl.java @@ -14,7 +14,6 @@ import ru.practicum.shareit.exeption.AvailableException; import ru.practicum.shareit.exeption.BookingItemByOwnerException; import ru.practicum.shareit.exeption.NotFoundException; -import ru.practicum.shareit.exeption.StateException; import ru.practicum.shareit.exeption.ValidationException; import ru.practicum.shareit.item.model.Item; import ru.practicum.shareit.item.repository.ItemRepository; @@ -37,15 +36,13 @@ public class BookingServiceImpl implements BookingService { private final BookingRepository bookingRepository; @Override - public List getAllBookingsForUser(Long userId, String state, Pageable pageable) { + public List getAllBookingsForUser(Long userId, State state, Pageable pageable) { userRepository.findById(userId) .orElseThrow(() -> new NotFoundException(String.format("User with id %x not found!", userId))); List bookings = new ArrayList<>(); - State stateVal = parseState(state); - - switch (stateVal) { + switch (state) { case ALL: bookings = bookingRepository.findAllForBooker(userId, pageable); break; @@ -87,7 +84,7 @@ public BookingDto getBooking(Long userId, Long bookingId) { } @Override - public List getAllItemsBookingForUser(Long userId, String state, Pageable pageable) { + public List getAllItemsBookingForUser(Long userId, State state, Pageable pageable) { userRepository.findById(userId) .orElseThrow(() -> new NotFoundException(String.format("User with id %x not found!", userId))); @@ -95,9 +92,7 @@ public List getAllItemsBookingForUser(Long userId, String state, Pag List itemsIds = items.stream().map(Item::getId).collect(Collectors.toList()); List bookings = new ArrayList<>(); - State stateVal = parseState(state); - - switch (stateVal) { + switch (state) { case ALL: bookings = bookingRepository.findAllForItems(itemsIds, pageable); break; @@ -174,12 +169,4 @@ public BookingDto updateStatus(Long userId, Long bookingId, Boolean approved) { return BookingMapper.toDto(bookingRepository.save(booking)); } - private State parseState(String state) { - try { - return State.valueOf(state); - } catch (IllegalArgumentException e) { - throw new StateException(String.format("Unknown state: %s", state)); - } - } - } diff --git a/src/main/java/ru/practicum/shareit/errorHandler/ErrorHandler.java b/server/src/main/java/ru/practicum/shareit/errorHandler/ErrorHandler.java similarity index 94% rename from src/main/java/ru/practicum/shareit/errorHandler/ErrorHandler.java rename to server/src/main/java/ru/practicum/shareit/errorHandler/ErrorHandler.java index 7811cd6..8fb473c 100644 --- a/src/main/java/ru/practicum/shareit/errorHandler/ErrorHandler.java +++ b/server/src/main/java/ru/practicum/shareit/errorHandler/ErrorHandler.java @@ -11,8 +11,6 @@ import ru.practicum.shareit.exeption.AvailableException; import ru.practicum.shareit.exeption.BookingItemByOwnerException; import ru.practicum.shareit.exeption.NotFoundException; -import ru.practicum.shareit.exeption.PageableParamsException; -import ru.practicum.shareit.exeption.StateException; import ru.practicum.shareit.exeption.ValidationException; import javax.validation.ConstraintViolation; @@ -55,8 +53,7 @@ public ErrorResponse handleValidationException(final ConstraintViolationExceptio return new ErrorResponse("Validation error: " + errorMessage); } - @ExceptionHandler({ValidationException.class, AvailableException.class, StateException.class, - PageableParamsException.class}) + @ExceptionHandler({ValidationException.class, AvailableException.class}) @ResponseStatus(HttpStatus.BAD_REQUEST) public ErrorResponse handleBadRequestException(final Exception e) { log.error("Available error. Status 400! {}", e.getMessage(), e); diff --git a/server/src/main/java/ru/practicum/shareit/errorHandler/ErrorResponse.java b/server/src/main/java/ru/practicum/shareit/errorHandler/ErrorResponse.java new file mode 100644 index 0000000..f66402e --- /dev/null +++ b/server/src/main/java/ru/practicum/shareit/errorHandler/ErrorResponse.java @@ -0,0 +1,14 @@ +package ru.practicum.shareit.errorHandler; + +import lombok.Getter; +import lombok.RequiredArgsConstructor; +import lombok.Setter; + +@Getter +@Setter +@RequiredArgsConstructor +public class ErrorResponse { + + private final String error; + +} diff --git a/src/main/java/ru/practicum/shareit/exeption/AccessException.java b/server/src/main/java/ru/practicum/shareit/exeption/AccessException.java similarity index 100% rename from src/main/java/ru/practicum/shareit/exeption/AccessException.java rename to server/src/main/java/ru/practicum/shareit/exeption/AccessException.java diff --git a/src/main/java/ru/practicum/shareit/exeption/AvailableException.java b/server/src/main/java/ru/practicum/shareit/exeption/AvailableException.java similarity index 100% rename from src/main/java/ru/practicum/shareit/exeption/AvailableException.java rename to server/src/main/java/ru/practicum/shareit/exeption/AvailableException.java diff --git a/src/main/java/ru/practicum/shareit/exeption/BookingItemByOwnerException.java b/server/src/main/java/ru/practicum/shareit/exeption/BookingItemByOwnerException.java similarity index 100% rename from src/main/java/ru/practicum/shareit/exeption/BookingItemByOwnerException.java rename to server/src/main/java/ru/practicum/shareit/exeption/BookingItemByOwnerException.java diff --git a/src/main/java/ru/practicum/shareit/exeption/NotFoundException.java b/server/src/main/java/ru/practicum/shareit/exeption/NotFoundException.java similarity index 100% rename from src/main/java/ru/practicum/shareit/exeption/NotFoundException.java rename to server/src/main/java/ru/practicum/shareit/exeption/NotFoundException.java diff --git a/src/main/java/ru/practicum/shareit/exeption/ValidationException.java b/server/src/main/java/ru/practicum/shareit/exeption/ValidationException.java similarity index 100% rename from src/main/java/ru/practicum/shareit/exeption/ValidationException.java rename to server/src/main/java/ru/practicum/shareit/exeption/ValidationException.java diff --git a/src/main/java/ru/practicum/shareit/item/controller/ItemController.java b/server/src/main/java/ru/practicum/shareit/item/controller/ItemController.java similarity index 78% rename from src/main/java/ru/practicum/shareit/item/controller/ItemController.java rename to server/src/main/java/ru/practicum/shareit/item/controller/ItemController.java index 24e5003..00ae402 100644 --- a/src/main/java/ru/practicum/shareit/item/controller/ItemController.java +++ b/server/src/main/java/ru/practicum/shareit/item/controller/ItemController.java @@ -4,7 +4,6 @@ import org.springframework.data.domain.PageRequest; import org.springframework.data.domain.Pageable; import org.springframework.data.domain.Sort; -import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PatchMapping; import org.springframework.web.bind.annotation.PathVariable; @@ -20,12 +19,8 @@ import ru.practicum.shareit.item.service.ItemService; import ru.practicum.shareit.utils.HttpHeaders; -import javax.validation.Valid; -import javax.validation.constraints.Positive; -import javax.validation.constraints.PositiveOrZero; import java.util.List; -@Validated @RestController @RequiredArgsConstructor @RequestMapping("/items") @@ -35,8 +30,8 @@ public class ItemController { @GetMapping() public List findByUserId(@RequestHeader(name = HttpHeaders.USER_ID_HEADER) Long userId, - @PositiveOrZero @RequestParam(defaultValue = "0") Integer from, - @Positive @RequestParam(defaultValue = "10") Integer size) { + @RequestParam(defaultValue = "0") Integer from, + @RequestParam(defaultValue = "10") Integer size) { Pageable pageable = PageRequest.of(from / size, size, Sort.by("id")); return itemService.findByUserId(userId, pageable); @@ -49,8 +44,8 @@ public ItemDto findById(@RequestHeader(name = HttpHeaders.USER_ID_HEADER) Long u @GetMapping("/search") public List search(@RequestParam("text") String text, - @PositiveOrZero @RequestParam(defaultValue = "0") Integer from, - @Positive @RequestParam(defaultValue = "10") Integer size) { + @RequestParam(defaultValue = "0") Integer from, + @RequestParam(defaultValue = "10") Integer size) { Pageable pageable = PageRequest.of(from / size, size, Sort.by("id")); return itemService.search(text, pageable); @@ -58,7 +53,7 @@ public List search(@RequestParam("text") String text, @PostMapping() public ItemDto create(@RequestHeader(name = HttpHeaders.USER_ID_HEADER) Long userId, - @Valid @RequestBody ItemDto itemDto) { + @RequestBody ItemDto itemDto) { return itemService.create(userId, itemDto); } @@ -72,7 +67,7 @@ public ItemDto update(@RequestHeader(name = HttpHeaders.USER_ID_HEADER) Long use @PostMapping("/{itemId}/comment") public CommentDto createComment(@RequestHeader(name = HttpHeaders.USER_ID_HEADER) Long userId, @PathVariable Long itemId, - @Valid @RequestBody CommentRequestDto commentDto) { + @RequestBody CommentRequestDto commentDto) { return itemService.createComment(userId, itemId, commentDto); } diff --git a/server/src/main/java/ru/practicum/shareit/item/dto/CommentDto.java b/server/src/main/java/ru/practicum/shareit/item/dto/CommentDto.java new file mode 100644 index 0000000..a3758f7 --- /dev/null +++ b/server/src/main/java/ru/practicum/shareit/item/dto/CommentDto.java @@ -0,0 +1,22 @@ +package ru.practicum.shareit.item.dto; + +import lombok.Builder; +import lombok.Getter; +import lombok.Setter; + +import java.time.LocalDateTime; + +@Getter +@Setter +@Builder +public class CommentDto { + + private Long id; + + private String text; + + private String authorName; + + private LocalDateTime created; + +} diff --git a/server/src/main/java/ru/practicum/shareit/item/dto/CommentRequestDto.java b/server/src/main/java/ru/practicum/shareit/item/dto/CommentRequestDto.java new file mode 100644 index 0000000..12165a4 --- /dev/null +++ b/server/src/main/java/ru/practicum/shareit/item/dto/CommentRequestDto.java @@ -0,0 +1,21 @@ +package ru.practicum.shareit.item.dto; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.Setter; + +import javax.validation.constraints.NotBlank; + +@Getter +@Setter +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class CommentRequestDto { + + @NotBlank + private String text; + +} 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..21e5862 --- /dev/null +++ b/server/src/main/java/ru/practicum/shareit/item/dto/ItemDto.java @@ -0,0 +1,41 @@ +package ru.practicum.shareit.item.dto; + +import lombok.Builder; +import lombok.EqualsAndHashCode; +import lombok.Getter; +import lombok.Setter; +import ru.practicum.shareit.booking.dto.BookingItemDto; +import ru.practicum.shareit.user.dto.UserDto; + +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.NotNull; +import java.util.List; + +@Getter +@Setter +@EqualsAndHashCode +@Builder +public class ItemDto { + + private Long id; + + @NotBlank + private String name; + + @NotBlank + private String description; + + @NotNull + private Boolean available; + + private UserDto owner; + + private Long requestId; + + private BookingItemDto lastBooking; + + private BookingItemDto nextBooking; + + private List comments; + +} diff --git a/src/main/java/ru/practicum/shareit/item/dto/ItemInRequestDto.java b/server/src/main/java/ru/practicum/shareit/item/dto/ItemInRequestDto.java similarity index 100% rename from src/main/java/ru/practicum/shareit/item/dto/ItemInRequestDto.java rename to server/src/main/java/ru/practicum/shareit/item/dto/ItemInRequestDto.java diff --git a/src/main/java/ru/practicum/shareit/item/mapper/CommentMapper.java b/server/src/main/java/ru/practicum/shareit/item/mapper/CommentMapper.java similarity index 100% rename from src/main/java/ru/practicum/shareit/item/mapper/CommentMapper.java rename to server/src/main/java/ru/practicum/shareit/item/mapper/CommentMapper.java diff --git a/src/main/java/ru/practicum/shareit/item/mapper/ItemMapper.java b/server/src/main/java/ru/practicum/shareit/item/mapper/ItemMapper.java similarity index 100% rename from src/main/java/ru/practicum/shareit/item/mapper/ItemMapper.java rename to server/src/main/java/ru/practicum/shareit/item/mapper/ItemMapper.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 100% rename from src/main/java/ru/practicum/shareit/item/model/Comment.java rename to server/src/main/java/ru/practicum/shareit/item/model/Comment.java diff --git a/src/main/java/ru/practicum/shareit/item/model/Item.java b/server/src/main/java/ru/practicum/shareit/item/model/Item.java similarity index 100% rename from src/main/java/ru/practicum/shareit/item/model/Item.java rename to server/src/main/java/ru/practicum/shareit/item/model/Item.java diff --git a/src/main/java/ru/practicum/shareit/item/repository/CommentRepository.java b/server/src/main/java/ru/practicum/shareit/item/repository/CommentRepository.java similarity index 100% rename from src/main/java/ru/practicum/shareit/item/repository/CommentRepository.java rename to server/src/main/java/ru/practicum/shareit/item/repository/CommentRepository.java diff --git a/src/main/java/ru/practicum/shareit/item/repository/ItemRepository.java b/server/src/main/java/ru/practicum/shareit/item/repository/ItemRepository.java similarity index 100% rename from src/main/java/ru/practicum/shareit/item/repository/ItemRepository.java rename to server/src/main/java/ru/practicum/shareit/item/repository/ItemRepository.java diff --git a/src/main/java/ru/practicum/shareit/item/service/ItemService.java b/server/src/main/java/ru/practicum/shareit/item/service/ItemService.java similarity index 100% rename from src/main/java/ru/practicum/shareit/item/service/ItemService.java rename to server/src/main/java/ru/practicum/shareit/item/service/ItemService.java diff --git a/src/main/java/ru/practicum/shareit/item/service/ItemServiceImpl.java b/server/src/main/java/ru/practicum/shareit/item/service/ItemServiceImpl.java similarity index 100% rename from src/main/java/ru/practicum/shareit/item/service/ItemServiceImpl.java rename to server/src/main/java/ru/practicum/shareit/item/service/ItemServiceImpl.java diff --git a/src/main/java/ru/practicum/shareit/request/controller/ItemRequestController.java b/server/src/main/java/ru/practicum/shareit/request/controller/ItemRequestController.java similarity index 80% rename from src/main/java/ru/practicum/shareit/request/controller/ItemRequestController.java rename to server/src/main/java/ru/practicum/shareit/request/controller/ItemRequestController.java index 98d33b4..941f830 100644 --- a/src/main/java/ru/practicum/shareit/request/controller/ItemRequestController.java +++ b/server/src/main/java/ru/practicum/shareit/request/controller/ItemRequestController.java @@ -3,7 +3,6 @@ import lombok.RequiredArgsConstructor; import org.springframework.data.domain.PageRequest; import org.springframework.data.domain.Sort; -import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.PostMapping; @@ -18,12 +17,8 @@ import ru.practicum.shareit.request.service.ItemRequestService; import ru.practicum.shareit.utils.HttpHeaders; -import javax.validation.Valid; -import javax.validation.constraints.Positive; -import javax.validation.constraints.PositiveOrZero; import java.util.List; -@Validated @RestController @RequiredArgsConstructor @RequestMapping(path = "/requests") @@ -41,8 +36,8 @@ public List findAllByUserId(@RequestHeader(HttpHeaders. @GetMapping("/all") public List findAll(@RequestHeader(HttpHeaders.USER_ID_HEADER) Long userId, - @PositiveOrZero @RequestParam(defaultValue = DEFAULT_FROM_VALUE) int from, - @Positive @RequestParam(defaultValue = DEFAULT_SIZE_VALUE) int size) { + @RequestParam(defaultValue = DEFAULT_FROM_VALUE) int from, + @RequestParam(defaultValue = DEFAULT_SIZE_VALUE) int size) { PageRequest pageable = PageRequest.of(from / size, size, Sort.by("created").descending()); return itemRequestService.findAll(userId, pageable); @@ -56,7 +51,7 @@ public ItemRequestWithItemsDto findById(@RequestHeader(HttpHeaders.USER_ID_HEADE @PostMapping public ItemRequestResponseDto createRequest(@RequestHeader(HttpHeaders.USER_ID_HEADER) Long userId, - @Valid @RequestBody CreateItemRequestDto createItemRequestDto) { + @RequestBody CreateItemRequestDto createItemRequestDto) { return itemRequestService.create(userId, createItemRequestDto); } diff --git a/server/src/main/java/ru/practicum/shareit/request/dto/CreateItemRequestDto.java b/server/src/main/java/ru/practicum/shareit/request/dto/CreateItemRequestDto.java new file mode 100644 index 0000000..8bb3b68 --- /dev/null +++ b/server/src/main/java/ru/practicum/shareit/request/dto/CreateItemRequestDto.java @@ -0,0 +1,25 @@ +package ru.practicum.shareit.request.dto; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.EqualsAndHashCode; +import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.Setter; + +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.NotNull; + +@Getter +@Setter +@Builder +@EqualsAndHashCode +@NoArgsConstructor +@AllArgsConstructor +public class CreateItemRequestDto { + + @NotBlank + @NotNull + private String description; + +} diff --git a/src/main/java/ru/practicum/shareit/request/dto/ItemRequestDto.java b/server/src/main/java/ru/practicum/shareit/request/dto/ItemRequestDto.java similarity index 100% rename from src/main/java/ru/practicum/shareit/request/dto/ItemRequestDto.java rename to server/src/main/java/ru/practicum/shareit/request/dto/ItemRequestDto.java diff --git a/src/main/java/ru/practicum/shareit/request/dto/ItemRequestResponseDto.java b/server/src/main/java/ru/practicum/shareit/request/dto/ItemRequestResponseDto.java similarity index 100% rename from src/main/java/ru/practicum/shareit/request/dto/ItemRequestResponseDto.java rename to server/src/main/java/ru/practicum/shareit/request/dto/ItemRequestResponseDto.java diff --git a/src/main/java/ru/practicum/shareit/request/dto/ItemRequestWithItemsDto.java b/server/src/main/java/ru/practicum/shareit/request/dto/ItemRequestWithItemsDto.java similarity index 100% rename from src/main/java/ru/practicum/shareit/request/dto/ItemRequestWithItemsDto.java rename to server/src/main/java/ru/practicum/shareit/request/dto/ItemRequestWithItemsDto.java diff --git a/src/main/java/ru/practicum/shareit/request/mapper/ItemRequestMapper.java b/server/src/main/java/ru/practicum/shareit/request/mapper/ItemRequestMapper.java similarity index 100% rename from src/main/java/ru/practicum/shareit/request/mapper/ItemRequestMapper.java rename to server/src/main/java/ru/practicum/shareit/request/mapper/ItemRequestMapper.java 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 100% 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 diff --git a/src/main/java/ru/practicum/shareit/request/repository/ItemRequestRepository.java b/server/src/main/java/ru/practicum/shareit/request/repository/ItemRequestRepository.java similarity index 100% rename from src/main/java/ru/practicum/shareit/request/repository/ItemRequestRepository.java rename to server/src/main/java/ru/practicum/shareit/request/repository/ItemRequestRepository.java diff --git a/src/main/java/ru/practicum/shareit/request/service/ItemRequestService.java b/server/src/main/java/ru/practicum/shareit/request/service/ItemRequestService.java similarity index 100% rename from src/main/java/ru/practicum/shareit/request/service/ItemRequestService.java rename to server/src/main/java/ru/practicum/shareit/request/service/ItemRequestService.java diff --git a/src/main/java/ru/practicum/shareit/request/service/ItemRequestServiceImpl.java b/server/src/main/java/ru/practicum/shareit/request/service/ItemRequestServiceImpl.java similarity index 94% rename from src/main/java/ru/practicum/shareit/request/service/ItemRequestServiceImpl.java rename to server/src/main/java/ru/practicum/shareit/request/service/ItemRequestServiceImpl.java index 86526b7..6ad4da6 100644 --- a/src/main/java/ru/practicum/shareit/request/service/ItemRequestServiceImpl.java +++ b/server/src/main/java/ru/practicum/shareit/request/service/ItemRequestServiceImpl.java @@ -36,7 +36,7 @@ public class ItemRequestServiceImpl implements ItemRequestService { private final ItemRequestRepository requestRepository; public List findAllByUserId(Long userId) { - checkExistsAndGetUser(userId); + getUserThrowable(userId); List requests = requestRepository.findItemRequestByRequestorId(userId, Sort.by("created").descending()); @@ -45,7 +45,7 @@ public List findAllByUserId(Long userId) { } public List findAll(Long userId, Pageable pageable) { - checkExistsAndGetUser(userId); + getUserThrowable(userId); List itemRequests = requestRepository.findAllByRequestorIdIsNot(userId, pageable); @@ -53,7 +53,7 @@ public List findAll(Long userId, Pageable pageable) { } public ItemRequestWithItemsDto findById(Long userId, Long requestId) { - checkExistsAndGetUser(userId); + getUserThrowable(userId); ItemRequest itemRequest = requestRepository.findById(requestId) .orElseThrow(() -> new NotFoundException(String.format("Request with id %x not found!", requestId))); @@ -67,7 +67,7 @@ public ItemRequestWithItemsDto findById(Long userId, Long requestId) { @Transactional public ItemRequestResponseDto create(Long userId, CreateItemRequestDto itemRequestDto) { ItemRequest itemRequest = ItemRequestMapper.createItemRequestToItemRequest(itemRequestDto); - User user = checkExistsAndGetUser(userId); + User user = getUserThrowable(userId); itemRequest.setRequestor(user); itemRequest.setCreated(LocalDateTime.now()); @@ -93,7 +93,7 @@ private List getItemsForItemRequestList(List new NotFoundException(String.format("User with id %x not found!", userId))); } diff --git a/src/main/java/ru/practicum/shareit/user/controller/UserController.java b/server/src/main/java/ru/practicum/shareit/user/controller/UserController.java similarity index 89% rename from src/main/java/ru/practicum/shareit/user/controller/UserController.java rename to server/src/main/java/ru/practicum/shareit/user/controller/UserController.java index 49acb41..7e325b5 100644 --- a/src/main/java/ru/practicum/shareit/user/controller/UserController.java +++ b/server/src/main/java/ru/practicum/shareit/user/controller/UserController.java @@ -1,7 +1,6 @@ package ru.practicum.shareit.user.controller; import lombok.RequiredArgsConstructor; -import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.DeleteMapping; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PatchMapping; @@ -13,10 +12,8 @@ import ru.practicum.shareit.user.dto.UserDto; import ru.practicum.shareit.user.service.UserService; -import javax.validation.Valid; import java.util.List; -@Validated @RestController @RequiredArgsConstructor @RequestMapping(path = "/users") @@ -35,7 +32,7 @@ public UserDto findById(@PathVariable Long userId) { } @PostMapping() - public UserDto create(@Valid @RequestBody UserDto user) { + public UserDto create(@RequestBody UserDto user) { return userService.create(user); } 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..6500fa1 --- /dev/null +++ b/server/src/main/java/ru/practicum/shareit/user/dto/UserDto.java @@ -0,0 +1,25 @@ +package ru.practicum.shareit.user.dto; + +import lombok.Builder; +import lombok.EqualsAndHashCode; +import lombok.Getter; +import lombok.Setter; + +import javax.validation.constraints.Email; +import javax.validation.constraints.NotBlank; + +@Getter +@Setter +@EqualsAndHashCode +@Builder +public class UserDto { + + private Long id; + + private String name; + + @Email(message = "Enter incorrect email!") + @NotBlank(message = "Email must not be empty!") + private String email; + +} diff --git a/src/main/java/ru/practicum/shareit/user/mapper/UserMapper.java b/server/src/main/java/ru/practicum/shareit/user/mapper/UserMapper.java similarity index 100% rename from src/main/java/ru/practicum/shareit/user/mapper/UserMapper.java rename to server/src/main/java/ru/practicum/shareit/user/mapper/UserMapper.java 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 100% 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 diff --git a/src/main/java/ru/practicum/shareit/user/repository/UserRepository.java b/server/src/main/java/ru/practicum/shareit/user/repository/UserRepository.java similarity index 100% rename from src/main/java/ru/practicum/shareit/user/repository/UserRepository.java rename to server/src/main/java/ru/practicum/shareit/user/repository/UserRepository.java diff --git a/src/main/java/ru/practicum/shareit/user/service/UserService.java b/server/src/main/java/ru/practicum/shareit/user/service/UserService.java similarity index 100% rename from src/main/java/ru/practicum/shareit/user/service/UserService.java rename to server/src/main/java/ru/practicum/shareit/user/service/UserService.java diff --git a/src/main/java/ru/practicum/shareit/user/service/UserServiceImpl.java b/server/src/main/java/ru/practicum/shareit/user/service/UserServiceImpl.java similarity index 100% rename from src/main/java/ru/practicum/shareit/user/service/UserServiceImpl.java rename to server/src/main/java/ru/practicum/shareit/user/service/UserServiceImpl.java diff --git a/server/src/main/java/ru/practicum/shareit/utils/HttpHeaders.java b/server/src/main/java/ru/practicum/shareit/utils/HttpHeaders.java new file mode 100644 index 0000000..c2908d5 --- /dev/null +++ b/server/src/main/java/ru/practicum/shareit/utils/HttpHeaders.java @@ -0,0 +1,7 @@ +package ru.practicum.shareit.utils; + +public class HttpHeaders { + + public static final String USER_ID_HEADER = "X-Sharer-User-Id"; + +} diff --git a/src/main/resources/application.properties b/server/src/main/resources/application.properties similarity index 97% rename from src/main/resources/application.properties rename to server/src/main/resources/application.properties index f7d148a..c61a97d 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 96% rename from src/test/java/ru/practicum/shareit/booking/BookingControllerTest.java rename to server/src/test/java/ru/practicum/shareit/booking/BookingControllerTest.java index 11f06c5..c727a4c 100644 --- a/src/test/java/ru/practicum/shareit/booking/BookingControllerTest.java +++ b/server/src/test/java/ru/practicum/shareit/booking/BookingControllerTest.java @@ -16,6 +16,7 @@ import ru.practicum.shareit.booking.controller.BookingController; import ru.practicum.shareit.booking.dto.BookingDto; import ru.practicum.shareit.booking.dto.BookingRequestDto; +import ru.practicum.shareit.booking.model.State; import ru.practicum.shareit.booking.model.Status; import ru.practicum.shareit.booking.service.BookingService; import ru.practicum.shareit.item.dto.ItemDto; @@ -86,7 +87,7 @@ void init() { @Test void testGetAllBookingsForUser() throws Exception { Mockito - .when(bookingService.getAllBookingsForUser(Mockito.anyLong(), Mockito.anyString(), Mockito.any(Pageable.class))) + .when(bookingService.getAllBookingsForUser(Mockito.anyLong(), Mockito.any(State.class), Mockito.any(Pageable.class))) .thenReturn(List.of(bookingDto)); mvc.perform(get("/bookings") @@ -97,7 +98,7 @@ void testGetAllBookingsForUser() throws Exception { .andExpect(jsonPath("$[0].item.id").value(bookingDto.getItem().getId())) .andDo(print()); - Mockito.verify(bookingService).getAllBookingsForUser(1L, "ALL", pageRequest); + Mockito.verify(bookingService).getAllBookingsForUser(1L, State.ALL, pageRequest); } @Test @@ -117,7 +118,7 @@ void testGetBooking() throws Exception { @Test void testGetAllItemsBookingForUser() throws Exception { Mockito - .when(bookingService.getAllItemsBookingForUser(Mockito.anyLong(), Mockito.anyString(), + .when(bookingService.getAllItemsBookingForUser(Mockito.anyLong(), Mockito.any(State.class), Mockito.any(Pageable.class))).thenReturn(List.of(bookingDto)); mvc.perform(get("/bookings/owner") @@ -128,7 +129,7 @@ void testGetAllItemsBookingForUser() throws Exception { .andExpect(jsonPath("$[0].item.id").value(bookingDto.getItem().getId())) .andDo(print()); - Mockito.verify(bookingService).getAllItemsBookingForUser(1L, "ALL", pageRequest); + Mockito.verify(bookingService).getAllItemsBookingForUser(1L, State.ALL, pageRequest); } @Test diff --git a/src/test/java/ru/practicum/shareit/booking/BookingMapperTest.java b/server/src/test/java/ru/practicum/shareit/booking/BookingMapperTest.java similarity index 100% rename from src/test/java/ru/practicum/shareit/booking/BookingMapperTest.java rename to server/src/test/java/ru/practicum/shareit/booking/BookingMapperTest.java diff --git a/src/test/java/ru/practicum/shareit/booking/BookingRequestDtoJsonTest.java b/server/src/test/java/ru/practicum/shareit/booking/BookingRequestDtoJsonTest.java similarity index 100% rename from src/test/java/ru/practicum/shareit/booking/BookingRequestDtoJsonTest.java rename to server/src/test/java/ru/practicum/shareit/booking/BookingRequestDtoJsonTest.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 92% rename from src/test/java/ru/practicum/shareit/booking/BookingServiceImplTest.java rename to server/src/test/java/ru/practicum/shareit/booking/BookingServiceImplTest.java index bd472ab..35fc8d9 100644 --- a/src/test/java/ru/practicum/shareit/booking/BookingServiceImplTest.java +++ b/server/src/test/java/ru/practicum/shareit/booking/BookingServiceImplTest.java @@ -21,7 +21,6 @@ import ru.practicum.shareit.exeption.AvailableException; import ru.practicum.shareit.exeption.BookingItemByOwnerException; import ru.practicum.shareit.exeption.NotFoundException; -import ru.practicum.shareit.exeption.StateException; import ru.practicum.shareit.exeption.ValidationException; import ru.practicum.shareit.item.dto.ItemDto; import ru.practicum.shareit.item.model.Item; @@ -94,7 +93,7 @@ void init() { void testGetAllBookingsForUserStatusAll() { bookingService.create(1L, bookingRequestDto); - List bookingList = bookingService.getAllBookingsForUser(1L, State.ALL.name(), pageRequest); + List bookingList = bookingService.getAllBookingsForUser(1L, State.ALL, pageRequest); assertEquals(bookingList.size(), 1); assertEquals(bookingList.get(0).getId(), 1L); @@ -106,7 +105,7 @@ void testGetAllBookingsForUserStatusPast() { bookingService.create(1L, bookingRequestDto); - List bookingList = bookingService.getAllBookingsForUser(1L, State.PAST.name(), pageRequest); + List bookingList = bookingService.getAllBookingsForUser(1L, State.PAST, pageRequest); assertEquals(bookingList.size(), 0); } @@ -117,7 +116,7 @@ void testGetAllBookingsForUserStatusFuture() { bookingService.create(1L, bookingRequestDto); - List bookingList = bookingService.getAllBookingsForUser(1L, State.FUTURE.name(), pageRequest); + List bookingList = bookingService.getAllBookingsForUser(1L, State.FUTURE, pageRequest); assertEquals(bookingList.size(), 1); assertEquals(bookingList.get(0).getId(), 1L); @@ -127,7 +126,7 @@ void testGetAllBookingsForUserStatusFuture() { void testGetAllBookingsForUserStatusCurrent() { bookingService.create(1L, bookingRequestDto); - List bookingList = bookingService.getAllBookingsForUser(1L, State.CURRENT.name(), pageRequest); + List bookingList = bookingService.getAllBookingsForUser(1L, State.CURRENT, pageRequest); assertEquals(bookingList.size(), 1); assertEquals(bookingList.get(0).getId(), 1L); @@ -137,7 +136,7 @@ void testGetAllBookingsForUserStatusCurrent() { void testGetAllBookingsForUserStatusWaiting() { bookingService.create(1L, bookingRequestDto); - List bookingList = bookingService.getAllBookingsForUser(1L, State.WAITING.name(), pageRequest); + List bookingList = bookingService.getAllBookingsForUser(1L, State.WAITING, pageRequest); assertEquals(bookingList.size(), 1); assertEquals(bookingList.get(0).getId(), 1L); @@ -148,28 +147,18 @@ void testGetAllBookingsForUserStatusRejected() { bookingService.create(1L, bookingRequestDto); bookingService.updateStatus(2L, 1L, false); - List bookingList = bookingService.getAllBookingsForUser(1L, State.REJECTED.name(), pageRequest); + List bookingList = bookingService.getAllBookingsForUser(1L, State.REJECTED, pageRequest); assertEquals(bookingList.size(), 1); assertEquals(bookingList.get(0).getId(), 1L); } - @Test - void testGetAllBookingsForUserStateError() { - bookingService.create(1L, bookingRequestDto); - - StateException exception = assertThrows(StateException.class, () -> - bookingService.getAllBookingsForUser(1L, "TEST", pageRequest)); - - assertEquals(exception.getMessage(), "Unknown state: TEST"); - } - @Test void testGetAllBookingsForUserNotFoundUserError() { bookingService.create(1L, bookingRequestDto); NotFoundException exception = assertThrows(NotFoundException.class, () -> - bookingService.getAllBookingsForUser(3L, State.ALL.name(), pageRequest)); + bookingService.getAllBookingsForUser(3L, State.ALL, pageRequest)); assertEquals(exception.getMessage(), String.format("User with id %x not found!", 3L)); } @@ -197,7 +186,7 @@ void testGetBookingNotFoundBookingError() { void testGetAllItemsBookingForUserStatusAll() { bookingService.create(1L, bookingRequestDto); - List bookingList = bookingService.getAllItemsBookingForUser(2L, State.ALL.name(), pageRequest); + List bookingList = bookingService.getAllItemsBookingForUser(2L, State.ALL, pageRequest); assertEquals(bookingList.size(), 1); assertEquals(bookingList.get(0).getId(), 1L); @@ -207,7 +196,7 @@ void testGetAllItemsBookingForUserStatusAll() { void testGetAllItemsBookingUserStatusPast() { bookingService.create(1L, bookingRequestDto); - List bookingList = bookingService.getAllItemsBookingForUser(1L, State.PAST.name(), pageRequest); + List bookingList = bookingService.getAllItemsBookingForUser(1L, State.PAST, pageRequest); assertEquals(bookingList.size(), 0); } @@ -218,7 +207,7 @@ void testGetAllItemsBookingUserStatusFuture() { bookingService.create(1L, bookingRequestDto); - List bookingList = bookingService.getAllItemsBookingForUser(2L, State.FUTURE.name(), pageRequest); + List bookingList = bookingService.getAllItemsBookingForUser(2L, State.FUTURE, pageRequest); assertEquals(bookingList.size(), 1); assertEquals(bookingList.get(0).getId(), 1L); @@ -228,7 +217,7 @@ void testGetAllItemsBookingUserStatusFuture() { void testGetAllItemsBookingUserStatusCurrent() { bookingService.create(1L, bookingRequestDto); - List bookingList = bookingService.getAllItemsBookingForUser(2L, State.CURRENT.name(), pageRequest); + List bookingList = bookingService.getAllItemsBookingForUser(2L, State.CURRENT, pageRequest); assertEquals(bookingList.size(), 1); assertEquals(bookingList.get(0).getId(), 1L); @@ -238,7 +227,7 @@ void testGetAllItemsBookingUserStatusCurrent() { void testGetAllItemsBookingUserStatusWaiting() { bookingService.create(1L, bookingRequestDto); - List bookingList = bookingService.getAllItemsBookingForUser(2L, State.WAITING.name(), pageRequest); + List bookingList = bookingService.getAllItemsBookingForUser(2L, State.WAITING, pageRequest); assertEquals(bookingList.size(), 1); assertEquals(bookingList.get(0).getId(), 1L); @@ -249,7 +238,7 @@ void testGetAllItemsBookingUserStatusRejected() { bookingService.create(1L, bookingRequestDto); bookingService.updateStatus(2L, 1L, false); - List bookingList = bookingService.getAllItemsBookingForUser(2L, State.REJECTED.name(), pageRequest); + List bookingList = bookingService.getAllItemsBookingForUser(2L, State.REJECTED, pageRequest); assertEquals(bookingList.size(), 1); assertEquals(bookingList.get(0).getId(), 1L); @@ -260,7 +249,7 @@ void testGetAllItemsBookingUserNotFoundUserError() { bookingService.create(1L, bookingRequestDto); NotFoundException exception = assertThrows(NotFoundException.class, () -> - bookingService.getAllItemsBookingForUser(3L, State.ALL.name(), pageRequest)); + bookingService.getAllItemsBookingForUser(3L, State.ALL, pageRequest)); assertEquals(exception.getMessage(), String.format("User with id %x not found!", 3L)); } diff --git a/src/test/java/ru/practicum/shareit/comment/CommentMapperTest.java b/server/src/test/java/ru/practicum/shareit/comment/CommentMapperTest.java similarity index 100% rename from src/test/java/ru/practicum/shareit/comment/CommentMapperTest.java rename to server/src/test/java/ru/practicum/shareit/comment/CommentMapperTest.java diff --git a/src/test/java/ru/practicum/shareit/exception/ErrorHandlerTest.java b/server/src/test/java/ru/practicum/shareit/exception/ErrorHandlerTest.java similarity index 79% rename from src/test/java/ru/practicum/shareit/exception/ErrorHandlerTest.java rename to server/src/test/java/ru/practicum/shareit/exception/ErrorHandlerTest.java index e3da6be..c2d5973 100644 --- a/src/test/java/ru/practicum/shareit/exception/ErrorHandlerTest.java +++ b/server/src/test/java/ru/practicum/shareit/exception/ErrorHandlerTest.java @@ -9,8 +9,6 @@ import ru.practicum.shareit.exeption.AvailableException; import ru.practicum.shareit.exeption.BookingItemByOwnerException; import ru.practicum.shareit.exeption.NotFoundException; -import ru.practicum.shareit.exeption.PageableParamsException; -import ru.practicum.shareit.exeption.StateException; import ru.practicum.shareit.exeption.ValidationException; import static org.junit.jupiter.api.Assertions.assertEquals; @@ -48,20 +46,6 @@ void testNotFoundException() { assertEquals(exception.getMessage(), response.getError()); } - @Test - void testPageableParamsException() { - PageableParamsException exception = new PageableParamsException("Invalid from or size values entered"); - ErrorResponse response = errorHandler.handleBadRequestException(exception); - assertEquals(exception.getMessage(), response.getError()); - } - - @Test - void testStateException() { - StateException exception = new StateException("Unknown state"); - ErrorResponse response = errorHandler.handleBadRequestException(exception); - assertEquals(exception.getMessage(), response.getError()); - } - @Test void testValidationException() { ValidationException exception = new ValidationException("The end date must be after the start date"); diff --git a/src/test/java/ru/practicum/shareit/item/CommentMapperTest.java b/server/src/test/java/ru/practicum/shareit/item/CommentMapperTest.java similarity index 100% rename from src/test/java/ru/practicum/shareit/item/CommentMapperTest.java rename to server/src/test/java/ru/practicum/shareit/item/CommentMapperTest.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 100% rename from src/test/java/ru/practicum/shareit/item/ItemControllerTest.java rename to server/src/test/java/ru/practicum/shareit/item/ItemControllerTest.java 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/ItemMapperTest.java b/server/src/test/java/ru/practicum/shareit/item/ItemMapperTest.java similarity index 100% rename from src/test/java/ru/practicum/shareit/item/ItemMapperTest.java rename to server/src/test/java/ru/practicum/shareit/item/ItemMapperTest.java 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 100% rename from src/test/java/ru/practicum/shareit/item/ItemServiceImplTest.java rename to server/src/test/java/ru/practicum/shareit/item/ItemServiceImplTest.java 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/ItemRequestMapperTest.java b/server/src/test/java/ru/practicum/shareit/request/ItemRequestMapperTest.java similarity index 100% rename from src/test/java/ru/practicum/shareit/request/ItemRequestMapperTest.java rename to server/src/test/java/ru/practicum/shareit/request/ItemRequestMapperTest.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/request/ItemRequestWithItemsDtoJsonTest.java b/server/src/test/java/ru/practicum/shareit/request/ItemRequestWithItemsDtoJsonTest.java similarity index 100% rename from src/test/java/ru/practicum/shareit/request/ItemRequestWithItemsDtoJsonTest.java rename to server/src/test/java/ru/practicum/shareit/request/ItemRequestWithItemsDtoJsonTest.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 100% rename from src/test/java/ru/practicum/shareit/user/UserControllerTest.java rename to server/src/test/java/ru/practicum/shareit/user/UserControllerTest.java 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/UserMapperTest.java b/server/src/test/java/ru/practicum/shareit/user/UserMapperTest.java similarity index 100% rename from src/test/java/ru/practicum/shareit/user/UserMapperTest.java rename to server/src/test/java/ru/practicum/shareit/user/UserMapperTest.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 diff --git a/src/main/java/ru/practicum/shareit/exeption/PageableParamsException.java b/src/main/java/ru/practicum/shareit/exeption/PageableParamsException.java deleted file mode 100644 index f7dc475..0000000 --- a/src/main/java/ru/practicum/shareit/exeption/PageableParamsException.java +++ /dev/null @@ -1,9 +0,0 @@ -package ru.practicum.shareit.exeption; - -public class PageableParamsException extends RuntimeException { - - public PageableParamsException(String message) { - super(message); - } - -}