Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
52 commits
Select commit Hold shift + click to select a range
596e91e
добавила комментарий для проверки
progingir May 1, 2025
2d1fbec
проект сделан, смотрим на тесты
progingir May 3, 2025
b50804c
исправлен pom.xml файл
progingir May 3, 2025
c91c2af
поменялся docker-compose
progingir May 3, 2025
15f1006
все полетело
progingir May 3, 2025
2534947
пытаюсь удалить двоичные файлы
progingir May 3, 2025
18b251a
что происходит
progingir May 3, 2025
f8a7b6e
спасибо Диме и Ване
progingir May 3, 2025
5f9129a
стиль
progingir May 3, 2025
a102aef
тесты в ноль
progingir May 3, 2025
555d8a0
поправляю тесты
progingir May 3, 2025
94d0e30
последний тест остался!
progingir May 3, 2025
f25d81f
пытаюсь исправить тест
progingir May 3, 2025
4b56d5e
пытаемся
progingir May 3, 2025
72cbf93
правки
progingir May 3, 2025
b241bd1
поменяла вторую реализацию класса
progingir May 3, 2025
f312afd
откат изменений
progingir May 3, 2025
a0a2013
???
progingir May 3, 2025
6404868
aaaa
progingir May 3, 2025
847f3bd
ввввв
progingir May 3, 2025
b1d6e8b
ллялял
progingir May 3, 2025
3df44be
пытаюсь
progingir May 3, 2025
6a7a4d0
все еще пытаюсь
progingir May 3, 2025
1edee0e
откат изменений
progingir May 3, 2025
49afbc8
добавила возврат items
progingir May 4, 2025
19e67fb
пупупу
progingir May 4, 2025
8e8da0a
рефракторинг
progingir May 4, 2025
a2fec6c
поломались тесты от рефракторинга
progingir May 4, 2025
8b83294
добавлены тесты
progingir May 4, 2025
f5d89d5
стиль
progingir May 4, 2025
d99297b
еще тесты
progingir May 4, 2025
c9f7a73
все проходит
progingir May 4, 2025
6347dca
убрала аннотацию и логи
progingir May 4, 2025
e23edca
стиль
progingir May 4, 2025
d97dda9
вынесла в отдельные классы
progingir May 4, 2025
9418c07
вынесла в отдельные классы
progingir May 4, 2025
db6288b
поправила класс
progingir May 4, 2025
fa4774b
убраны аннотации валидации
progingir May 4, 2025
a8c84bb
пробуем
progingir May 4, 2025
e872e45
еще пробуем
progingir May 4, 2025
4934bd6
убрала аннотацию и логи
progingir May 4, 2025
835dcbd
еще убрала
progingir May 4, 2025
64459a3
убрала все логи
progingir May 4, 2025
784b7d5
добавила еще тестов
progingir May 4, 2025
3794681
открыла тесты
progingir May 4, 2025
b737587
добавила еще тесты
progingir May 4, 2025
3aefc49
еще тесты
progingir May 4, 2025
ae7770f
еще тесты
progingir May 4, 2025
370c23a
стиль
progingir May 4, 2025
44aceba
еще тесты
progingir May 4, 2025
b3b840b
тесты
progingir May 4, 2025
22e448d
сейчас 4 утра
progingir May 4, 2025
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -30,4 +30,4 @@ build/
!**/src/test/**/build/

### VS Code ###
.vscode/
.vscode/
5 changes: 0 additions & 5 deletions Dockerfile

This file was deleted.

55 changes: 55 additions & 0 deletions compose.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,55 @@
version: '3.8'
services:
postgres:
image: postgres:16
container_name: postgres
environment:
POSTGRES_DB: shareit
POSTGRES_USER: progingir
POSTGRES_PASSWORD: 12345
ports:
- "5432:5432"
volumes:
- postgres_data:/var/lib/postgresql/data
networks:
- shareit-network

shareit-server:
build:
context: ./server
dockerfile: Dockerfile
container_name: shareit-server
ports:
- "9090:9090"
environment:
SPRING_DATASOURCE_URL: jdbc:postgresql://postgres:5432/shareit
SPRING_DATASOURCE_USERNAME: progingir
SPRING_DATASOURCE_PASSWORD: 12345
SPRING_JPA_HIBERNATE_DDL_AUTO: update
SPRING_JPA_SHOW_SQL: true
SPRING_JPA_OPEN_IN_VIEW: false
depends_on:
- postgres
networks:
- shareit-network

shareit-gateway:
build:
context: ./gateway
dockerfile: Dockerfile
container_name: shareit-gateway
ports:
- "8080:8080"
environment:
SHAREIT_SERVER_URL: http://shareit-server:9090
depends_on:
- shareit-server
networks:
- shareit-network

networks:
shareit-network:
driver: bridge

volumes:
postgres_data:
16 changes: 0 additions & 16 deletions docker-compose.yml

This file was deleted.

4 changes: 4 additions & 0 deletions gateway/Dockerfile
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
FROM eclipse-temurin:21-jre-jammy
VOLUME /tmp
ARG JAR_FILE=target/*.jar
ENTRYPOINT ["sh", "-c", "java ${JAVA_OPTS} -jar /app.jar"]
87 changes: 87 additions & 0 deletions gateway/pom.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,87 @@
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>ru.practicum</groupId>
<artifactId>shareit</artifactId>
<version>0.0.1-SNAPSHOT</version>
</parent>
<artifactId>shareit-gateway</artifactId>
<name>shareit-gateway</name>
<description>Gateway for ShareIt application</description>

<properties>
<java.version>21</java.version>
</properties>

<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<exclusions>
<exclusion>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-validation</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<dependency>
<groupId>org.hibernate.validator</groupId>
<artifactId>hibernate-validator</artifactId>
</dependency>
<dependency>
<groupId>org.apache.httpcomponents.client5</groupId>
<artifactId>httpclient5</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-configuration-processor</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>

<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<excludes>
<exclude>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</exclude>
</excludes>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.8.1</version>
<configuration>
<source>17</source>
<target>17</target>
</configuration>
</plugin>
</plugins>
</build>
</project>
12 changes: 12 additions & 0 deletions gateway/src/main/java/ru/practicum/shareit/ShareItGatewayApp.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
package ru.practicum.shareit;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class ShareItGatewayApp {

public static void main(String[] args) {
SpringApplication.run(ShareItGatewayApp.class, args);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,57 @@
package ru.practicum.shareit.booking;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.web.client.RestTemplateBuilder;
import org.springframework.http.ResponseEntity;
import org.springframework.http.client.HttpComponentsClientHttpRequestFactory;
import org.springframework.stereotype.Service;
import org.springframework.web.util.DefaultUriBuilderFactory;
import ru.practicum.shareit.client.BaseClient;
import ru.practicum.shareit.booking.dto.BookingShortDto;

import java.util.HashMap;
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(() -> new HttpComponentsClientHttpRequestFactory())
.build());
}

public ResponseEntity<Object> getBookings(long userId, String state, Integer from, Integer size) {
Map<String, Object> parameters = new HashMap<>();
parameters.put("state", state);
parameters.put("from", from);
parameters.put("size", size);
return get("?state={state}&from={from}&size={size}", userId, parameters);
}

public ResponseEntity<Object> bookItem(long userId, BookingShortDto requestDto) {
return post("", userId, requestDto);
}

public ResponseEntity<Object> getBooking(long userId, Long bookingId) {
return get("/" + bookingId, userId);
}

public ResponseEntity<Object> updateStatus(long userId, Long bookingId, boolean approved) {
Map<String, Object> parameters = new HashMap<>();
parameters.put("bookingId", bookingId);
parameters.put("approved", approved);
return patch("/{bookingId}?approved={approved}", userId, parameters, null);
}

public ResponseEntity<Object> getBookingsByOwnerId(long userId, String state, Integer from, Integer size) {
Map<String, Object> parameters = new HashMap<>();
parameters.put("state", state);
parameters.put("from", from);
parameters.put("size", size);
return get("/owner?state={state}&from={from}&size={size}", userId, parameters);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,54 @@
package ru.practicum.shareit.booking;

import jakarta.validation.Valid;
import jakarta.validation.constraints.Positive;
import jakarta.validation.constraints.PositiveOrZero;
import lombok.RequiredArgsConstructor;
import org.springframework.http.ResponseEntity;
import org.springframework.stereotype.Controller;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
import ru.practicum.shareit.booking.dto.BookingShortDto;

@Controller
@RequestMapping(path = "/bookings")
@RequiredArgsConstructor
@Validated
public class BookingController {
private final BookingClient bookingClient;

@GetMapping
public ResponseEntity<Object> getBookings(@RequestHeader("X-Sharer-User-Id") long userId,
@RequestParam(name = "state", defaultValue = "ALL") String state,
@PositiveOrZero @RequestParam(name = "from", defaultValue = "0") Integer from,
@Positive @RequestParam(name = "size", defaultValue = "10") Integer size) {
return bookingClient.getBookings(userId, state, from, size);
}

@PostMapping
public ResponseEntity<Object> bookItem(@RequestHeader("X-Sharer-User-Id") long userId,
@RequestBody @Valid BookingShortDto requestDto) {
return bookingClient.bookItem(userId, requestDto);
}

@GetMapping("/{bookingId}")
public ResponseEntity<Object> getBooking(@RequestHeader("X-Sharer-User-Id") long userId,
@PathVariable Long bookingId) {
return bookingClient.getBooking(userId, bookingId);
}

@PatchMapping("/{bookingId}")
public ResponseEntity<Object> update(@RequestHeader("X-Sharer-User-Id") Long userId,
@PathVariable long bookingId,
@RequestParam(name = "approved") Boolean approved) {
return bookingClient.updateStatus(userId, bookingId, approved);
}

@GetMapping("/owner")
public ResponseEntity<Object> getAllBookingsByOwnerId(@RequestHeader("X-Sharer-User-Id") long userId,
@RequestParam(name = "state", defaultValue = "ALL") String state,
@PositiveOrZero @RequestParam(name = "from", defaultValue = "0") Integer from,
@Positive @RequestParam(name = "size", defaultValue = "10") Integer size) {
return bookingClient.getBookingsByOwnerId(userId, state, from, size);
}
}
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
package ru.practicum.shareit.booking;

enum BookingStatus {
public enum BookingStatus {
WAITING,
APPROVED,
REJECTED,
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
package ru.practicum.shareit.booking.dto;

import com.fasterxml.jackson.annotation.JsonFormat;
import jakarta.validation.constraints.Future;
import jakarta.validation.constraints.FutureOrPresent;
import jakarta.validation.constraints.NotNull;
import lombok.Data;
import ru.practicum.shareit.booking.BookingStatus;

import java.time.LocalDateTime;

@Data
public class BookingShortDto {
private Long id;

@NotNull(message = "Время начала бронирования не может быть пустым")
@FutureOrPresent(message = "Время начала бронирования не может быть в прошлом")
@JsonFormat(pattern = "yyyy-MM-dd'T'HH:mm:ss")
private LocalDateTime start;

@NotNull(message = "Время окончания бронирования не может быть пустым")
@Future(message = "Время окончания бронирования должно быть в будущем")
@JsonFormat(pattern = "yyyy-MM-dd'T'HH:mm:ss")
private LocalDateTime end;

@NotNull(message = "ID вещи не может быть пустым")
private Long itemId;

private Long bookerId;

private BookingStatus status;
}
Loading