diff --git a/common/pom.xml b/common/pom.xml
new file mode 100644
index 0000000..eb95870
--- /dev/null
+++ b/common/pom.xml
@@ -0,0 +1,44 @@
+
+
+ 4.0.0
+
+ ru.practicum
+ shareit
+ 0.0.1-SNAPSHOT
+
+
+ common
+ 0.0.1-SNAPSHOT
+ jar
+
+
+
+ org.springframework.boot
+ spring-boot-starter-validation
+
+
+ org.projectlombok
+ lombok
+ true
+
+
+ org.springframework.boot
+ spring-boot-starter-test
+ test
+
+
+
+
+
+
+ org.springframework.boot
+ spring-boot-maven-plugin
+
+ true
+
+
+
+
+
\ No newline at end of file
diff --git a/common/src/main/java/ru/practicum/ShareItCommon.java b/common/src/main/java/ru/practicum/ShareItCommon.java
new file mode 100644
index 0000000..09a46b0
--- /dev/null
+++ b/common/src/main/java/ru/practicum/ShareItCommon.java
@@ -0,0 +1,12 @@
+package ru.practicum;
+
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+
+@SpringBootApplication
+public class ShareItCommon {
+ public static void main(String[] args) {
+ SpringApplication.run(ShareItCommon.class, args);
+ }
+
+}
\ No newline at end of file
diff --git a/src/main/java/ru/practicum/shareit/booking/BookingDto.java b/common/src/main/java/ru/practicum/booking/BookingDto.java
similarity index 68%
rename from src/main/java/ru/practicum/shareit/booking/BookingDto.java
rename to common/src/main/java/ru/practicum/booking/BookingDto.java
index c0e95e4..8f1d06d 100644
--- a/src/main/java/ru/practicum/shareit/booking/BookingDto.java
+++ b/common/src/main/java/ru/practicum/booking/BookingDto.java
@@ -1,11 +1,11 @@
-package ru.practicum.shareit.booking;
+package ru.practicum.booking;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
-import ru.practicum.shareit.item.ItemDto;
-import ru.practicum.shareit.user.UserDto;
+import ru.practicum.item.ItemDto;
+import ru.practicum.user.UserDto;
import java.time.LocalDateTime;
@@ -19,5 +19,5 @@ public class BookingDto {
private UserDto booker;
private LocalDateTime start;
private LocalDateTime end;
- private Booking.BookingStatus status;
+ private BookingStatus status;
}
\ No newline at end of file
diff --git a/common/src/main/java/ru/practicum/booking/BookingStatus.java b/common/src/main/java/ru/practicum/booking/BookingStatus.java
new file mode 100644
index 0000000..9ac8c55
--- /dev/null
+++ b/common/src/main/java/ru/practicum/booking/BookingStatus.java
@@ -0,0 +1,8 @@
+package ru.practicum.booking;
+
+public enum BookingStatus {
+ WAITING,
+ APPROVED,
+ REJECTED,
+ CANCELED
+}
\ No newline at end of file
diff --git a/common/src/main/java/ru/practicum/booking/NewBookingRequestDto.java b/common/src/main/java/ru/practicum/booking/NewBookingRequestDto.java
new file mode 100644
index 0000000..97a095e
--- /dev/null
+++ b/common/src/main/java/ru/practicum/booking/NewBookingRequestDto.java
@@ -0,0 +1,33 @@
+package ru.practicum.booking;
+
+import jakarta.validation.constraints.AssertTrue;
+import jakarta.validation.constraints.Future;
+import jakarta.validation.constraints.NotNull;
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.time.LocalDateTime;
+
+@Data
+@Builder
+@NoArgsConstructor
+@AllArgsConstructor
+public class NewBookingRequestDto {
+ @NotNull
+ private Long itemId;
+
+ @NotNull
+ @Future
+ private LocalDateTime start;
+
+ @NotNull
+ @Future
+ private LocalDateTime end;
+
+ @AssertTrue(message = "Выберите корректный срок аренды.")
+ public boolean isEndAfterStart() {
+ return end.isAfter(start);
+ }
+}
\ No newline at end of file
diff --git a/src/main/java/ru/practicum/shareit/item/ItemDto.java b/common/src/main/java/ru/practicum/item/ItemDto.java
similarity index 55%
rename from src/main/java/ru/practicum/shareit/item/ItemDto.java
rename to common/src/main/java/ru/practicum/item/ItemDto.java
index 90fcb2c..9ffdf5c 100644
--- a/src/main/java/ru/practicum/shareit/item/ItemDto.java
+++ b/common/src/main/java/ru/practicum/item/ItemDto.java
@@ -1,11 +1,9 @@
-package ru.practicum.shareit.item;
+package ru.practicum.item;
-import jakarta.validation.constraints.NotBlank;
-import jakarta.validation.constraints.NotNull;
import lombok.Builder;
import lombok.Data;
-import ru.practicum.shareit.booking.BookingDto;
-import ru.practicum.shareit.item.comment.CommentDto;
+import ru.practicum.booking.BookingDto;
+import ru.practicum.item.comment.CommentDto;
import java.util.List;
@@ -13,13 +11,8 @@
@Builder
public class ItemDto {
private Long id;
-
- @NotNull
- @NotBlank
private String name;
- @NotNull
private String description;
- @NotNull
private Boolean available;
private Long requestId;
private BookingDto lastBooking;
diff --git a/common/src/main/java/ru/practicum/item/NewItemRequest.java b/common/src/main/java/ru/practicum/item/NewItemRequest.java
new file mode 100644
index 0000000..b04665e
--- /dev/null
+++ b/common/src/main/java/ru/practicum/item/NewItemRequest.java
@@ -0,0 +1,26 @@
+package ru.practicum.item;
+
+import jakarta.validation.constraints.NotBlank;
+import jakarta.validation.constraints.NotNull;
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+@Data
+@Builder
+@AllArgsConstructor
+@NoArgsConstructor
+public class NewItemRequest {
+
+ @NotBlank
+ private String name;
+
+ @NotBlank
+ private String description;
+
+ @NotNull
+ private Boolean available;
+
+ private Long requestId;
+}
\ No newline at end of file
diff --git a/common/src/main/java/ru/practicum/item/UpdateItemRequest.java b/common/src/main/java/ru/practicum/item/UpdateItemRequest.java
new file mode 100644
index 0000000..8680083
--- /dev/null
+++ b/common/src/main/java/ru/practicum/item/UpdateItemRequest.java
@@ -0,0 +1,16 @@
+package ru.practicum.item;
+
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+@Data
+@Builder
+@NoArgsConstructor
+@AllArgsConstructor
+public class UpdateItemRequest {
+ private String name;
+ private String description;
+ private Boolean available;
+}
\ No newline at end of file
diff --git a/src/main/java/ru/practicum/shareit/item/comment/CommentDto.java b/common/src/main/java/ru/practicum/item/comment/CommentDto.java
similarity index 84%
rename from src/main/java/ru/practicum/shareit/item/comment/CommentDto.java
rename to common/src/main/java/ru/practicum/item/comment/CommentDto.java
index ee2fcb3..517267e 100644
--- a/src/main/java/ru/practicum/shareit/item/comment/CommentDto.java
+++ b/common/src/main/java/ru/practicum/item/comment/CommentDto.java
@@ -1,4 +1,4 @@
-package ru.practicum.shareit.item.comment;
+package ru.practicum.item.comment;
import lombok.Builder;
import lombok.Data;
diff --git a/common/src/main/java/ru/practicum/item/comment/NewCommentRequest.java b/common/src/main/java/ru/practicum/item/comment/NewCommentRequest.java
new file mode 100644
index 0000000..ad6203c
--- /dev/null
+++ b/common/src/main/java/ru/practicum/item/comment/NewCommentRequest.java
@@ -0,0 +1,15 @@
+package ru.practicum.item.comment;
+
+import jakarta.validation.constraints.NotBlank;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+public class NewCommentRequest {
+
+ @NotBlank
+ private String text;
+}
\ No newline at end of file
diff --git a/common/src/main/java/ru/practicum/request/CreateItemRequestDto.java b/common/src/main/java/ru/practicum/request/CreateItemRequestDto.java
new file mode 100644
index 0000000..5be7b66
--- /dev/null
+++ b/common/src/main/java/ru/practicum/request/CreateItemRequestDto.java
@@ -0,0 +1,17 @@
+package ru.practicum.request;
+
+import jakarta.validation.constraints.NotBlank;
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+@Data
+@Builder
+@AllArgsConstructor
+@NoArgsConstructor
+public class CreateItemRequestDto {
+
+ @NotBlank
+ private String description;
+}
\ No newline at end of file
diff --git a/common/src/main/java/ru/practicum/request/ItemRequestDto.java b/common/src/main/java/ru/practicum/request/ItemRequestDto.java
new file mode 100644
index 0000000..bab3fb7
--- /dev/null
+++ b/common/src/main/java/ru/practicum/request/ItemRequestDto.java
@@ -0,0 +1,19 @@
+package ru.practicum.request;
+
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.time.LocalDateTime;
+
+@Data
+@Builder
+@NoArgsConstructor
+@AllArgsConstructor
+public class ItemRequestDto {
+ private Long id;
+ private String description;
+ private Long requesterId;
+ private LocalDateTime created;
+}
\ No newline at end of file
diff --git a/common/src/main/java/ru/practicum/user/NewUserRequest.java b/common/src/main/java/ru/practicum/user/NewUserRequest.java
new file mode 100644
index 0000000..8834aaa
--- /dev/null
+++ b/common/src/main/java/ru/practicum/user/NewUserRequest.java
@@ -0,0 +1,19 @@
+package ru.practicum.user;
+
+import jakarta.validation.constraints.Email;
+import jakarta.validation.constraints.NotBlank;
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+
+@Data
+@Builder
+@AllArgsConstructor
+public class NewUserRequest {
+
+ @NotBlank
+ private String name;
+
+ @Email(message = "Некорректный email")
+ private String email;
+}
\ No newline at end of file
diff --git a/src/main/java/ru/practicum/shareit/user/UserDto.java b/common/src/main/java/ru/practicum/user/UpdateUserRequest.java
similarity index 67%
rename from src/main/java/ru/practicum/shareit/user/UserDto.java
rename to common/src/main/java/ru/practicum/user/UpdateUserRequest.java
index 5a67957..55a69ae 100644
--- a/src/main/java/ru/practicum/shareit/user/UserDto.java
+++ b/common/src/main/java/ru/practicum/user/UpdateUserRequest.java
@@ -1,15 +1,17 @@
-package ru.practicum.shareit.user;
+package ru.practicum.user;
import jakarta.validation.constraints.Email;
+import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
@Data
@Builder
-public class UserDto {
+@AllArgsConstructor
+public class UpdateUserRequest {
private Long id;
+ private String name;
@Email(message = "Некорректный email")
private String email;
- private String name;
}
\ No newline at end of file
diff --git a/common/src/main/java/ru/practicum/user/UserDto.java b/common/src/main/java/ru/practicum/user/UserDto.java
new file mode 100644
index 0000000..6fc0a2a
--- /dev/null
+++ b/common/src/main/java/ru/practicum/user/UserDto.java
@@ -0,0 +1,16 @@
+package ru.practicum.user;
+
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+@Data
+@Builder
+@NoArgsConstructor
+@AllArgsConstructor
+public class UserDto {
+ private Long id;
+ private String email;
+ private String name;
+}
\ No newline at end of file
diff --git a/common/src/main/resources/application.properties b/common/src/main/resources/application.properties
new file mode 100644
index 0000000..e69de29
diff --git a/docker-compose.yml b/docker-compose.yml
new file mode 100644
index 0000000..b768329
--- /dev/null
+++ b/docker-compose.yml
@@ -0,0 +1,40 @@
+version: '3.8'
+
+services:
+ postgres:
+ image: postgres:16
+ environment:
+ POSTGRES_USER: dbuser
+ POSTGRES_PASSWORD: 12345
+ POSTGRES_DB: shareit
+ ports:
+ - "5432:5432"
+ volumes:
+ - pg_data:/var/lib/postgresql/data
+
+ server:
+ build:
+ context: ./server
+ ports:
+ - "9090:9090" # <-- теперь 9090!
+ depends_on:
+ - postgres
+ environment:
+ SPRING_DATASOURCE_URL: jdbc:postgresql://postgres:5432/shareit
+ SPRING_DATASOURCE_USERNAME: dbuser
+ SPRING_DATASOURCE_PASSWORD: 12345
+ SERVER_PORT: 9090 # <-- важно! Или укажи server.port в application.properties
+ TZ: "Asia/Yekaterinburg"
+
+ gateway:
+ build:
+ context: ./gateway
+ ports:
+ - "8080:8080" # <-- оставляем 8080!
+ depends_on:
+ - server
+ environment:
+ SHAREIT_SERVER_URL: http://server:9090 # <-- важно! Ссылаемся на server с новым портом
+
+volumes:
+ pg_data:
diff --git a/gateway/Dockerfile b/gateway/Dockerfile
new file mode 100644
index 0000000..6a005ee
--- /dev/null
+++ b/gateway/Dockerfile
@@ -0,0 +1,7 @@
+FROM openjdk:21-jdk-slim
+
+WORKDIR /app
+
+COPY target/gateway-0.0.1-SNAPSHOT.jar app.jar
+
+ENTRYPOINT ["java", "-jar", "app.jar"]
diff --git a/gateway/pom.xml b/gateway/pom.xml
new file mode 100644
index 0000000..265bcf9
--- /dev/null
+++ b/gateway/pom.xml
@@ -0,0 +1,90 @@
+
+
+ 4.0.0
+
+
+ ru.practicum
+ shareit
+ 0.0.1-SNAPSHOT
+
+
+ gateway
+
+
+ 21
+ 21
+ UTF-8
+
+
+
+
+ ru.practicum
+ common
+ 0.0.1-SNAPSHOT
+
+
+
+ org.springframework.boot
+ spring-boot-starter-web
+
+
+
+ org.springframework.boot
+ spring-boot-starter-validation
+
+
+
+ org.springframework.boot
+ spring-boot-starter-actuator
+
+
+
+ org.hibernate.validator
+ hibernate-validator
+
+
+
+ org.apache.httpcomponents.client5
+ httpclient5
+
+
+
+ org.springframework.boot
+ spring-boot-configuration-processor
+ true
+
+
+
+ org.projectlombok
+ lombok
+ true
+
+
+
+ org.springframework.boot
+ spring-boot-starter-test
+ test
+
+
+
+
+
+
+ org.springframework.boot
+ spring-boot-maven-plugin
+
+ ru.practicum.ShareItGateway
+
+
+
+
+ repackage
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/gateway/src/main/java/ru/practicum/ShareItGateway.java b/gateway/src/main/java/ru/practicum/ShareItGateway.java
new file mode 100644
index 0000000..6fe87bd
--- /dev/null
+++ b/gateway/src/main/java/ru/practicum/ShareItGateway.java
@@ -0,0 +1,20 @@
+package ru.practicum;
+
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration;
+import org.springframework.boot.autoconfigure.orm.jpa.HibernateJpaAutoConfiguration;
+
+//@SpringBootApplication(exclude = {DataSourceAutoConfiguration.class})
+@SpringBootApplication(
+ exclude = {
+ DataSourceAutoConfiguration.class,
+ HibernateJpaAutoConfiguration.class
+ }
+)
+public class ShareItGateway {
+ public static void main(String[] args) {
+ SpringApplication.run(ShareItGateway.class, args);
+ }
+
+}
diff --git a/gateway/src/main/java/ru/practicum/booking/BookingClient.java b/gateway/src/main/java/ru/practicum/booking/BookingClient.java
new file mode 100644
index 0000000..3c88290
--- /dev/null
+++ b/gateway/src/main/java/ru/practicum/booking/BookingClient.java
@@ -0,0 +1,61 @@
+package ru.practicum.booking;
+
+import lombok.extern.slf4j.Slf4j;
+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.client.BaseClient;
+
+import java.util.Map;
+
+@Slf4j
+@Service
+public class BookingClient extends BaseClient {
+
+ private static final String API_PREFIX = "/bookings";
+
+
+ public BookingClient(@Value("${shareit.server.url}") String serverUrl, RestTemplateBuilder builder) {
+ super(
+ builder
+ .uriTemplateHandler(new DefaultUriBuilderFactory(serverUrl + API_PREFIX))
+ .requestFactory(() -> new HttpComponentsClientHttpRequestFactory())
+ .build()
+ );
+
+ }
+
+ public ResponseEntity