From 85920629f1ff92e7b7d3816c4b0104dd4507d060 Mon Sep 17 00:00:00 2001 From: Andrej Stelmaschuk Date: Sun, 20 Apr 2025 13:43:01 +0700 Subject: [PATCH 01/46] =?UTF-8?q?feat:=20=D1=81=D0=BF=D1=80=D0=B8=D0=BD?= =?UTF-8?q?=D1=82=2016=20=D0=B4=D0=BE=D0=B1=D0=B0=D0=B2=D0=B8=D1=82=D1=8C?= =?UTF-8?q?=20=D0=B7=D0=B0=D0=BF=D1=80=D0=BE=D1=81=D1=8B=20=D0=BD=D0=B0=20?= =?UTF-8?q?=D0=B2=D0=B5=D1=89=D0=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 3 +- .../item/service/CommentServiceImpl.java | 1 + src/main/resources/application.properties | 2 +- .../ru/practicum/shareit/ShareItAppTest.java | 15 ------ src/test/resources/application.properties | 18 ------- src/test/resources/schema.sql | 51 ------------------- 6 files changed, 4 insertions(+), 86 deletions(-) delete mode 100644 src/test/java/ru/practicum/shareit/ShareItAppTest.java delete mode 100644 src/test/resources/application.properties delete mode 100644 src/test/resources/schema.sql diff --git a/README.md b/README.md index 6ef090e..544554e 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,5 @@ # java-shareit учебный проект -## Спринт №15 +## Спринт №16 +Добавляем запросы на вещи и "шлюз" diff --git a/src/main/java/ru/practicum/shareit/item/service/CommentServiceImpl.java b/src/main/java/ru/practicum/shareit/item/service/CommentServiceImpl.java index 3e26084..2fc576c 100644 --- a/src/main/java/ru/practicum/shareit/item/service/CommentServiceImpl.java +++ b/src/main/java/ru/practicum/shareit/item/service/CommentServiceImpl.java @@ -19,6 +19,7 @@ import java.time.ZoneOffset; @Service +@Transactional(readOnly = true) public class CommentServiceImpl implements CommentService { private final CommentRepository commentRepository; private final BookingRepository bookingRepository; diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties index 5354097..053a4bb 100644 --- a/src/main/resources/application.properties +++ b/src/main/resources/application.properties @@ -13,6 +13,6 @@ logging.level.org.springframework.orm.jpa.JpaTransactionManager=DEBUG #spring.datasource.username #spring.datasource.password spring.datasource.driverClassName=org.postgresql.Driver -spring.datasource.url=jdbc:postgresql://localhost:5432/shareitdb +spring.datasource.url=jdbc:postgresql://192.168.0.102:5432/shareitdb spring.datasource.username=test spring.datasource.password=test \ No newline at end of file diff --git a/src/test/java/ru/practicum/shareit/ShareItAppTest.java b/src/test/java/ru/practicum/shareit/ShareItAppTest.java deleted file mode 100644 index 91aa6f5..0000000 --- a/src/test/java/ru/practicum/shareit/ShareItAppTest.java +++ /dev/null @@ -1,15 +0,0 @@ -package ru.practicum.shareit; - -import org.junit.jupiter.api.Test; -import org.springframework.boot.test.autoconfigure.jdbc.AutoConfigureTestDatabase; -import org.springframework.boot.test.context.SpringBootTest; - -import static org.junit.jupiter.api.Assertions.*; - -@SpringBootTest -@AutoConfigureTestDatabase -class ShareItAppTest { - @Test - void contextLoads() throws Exception { - } -} \ No newline at end of file diff --git a/src/test/resources/application.properties b/src/test/resources/application.properties deleted file mode 100644 index ba4a8ee..0000000 --- a/src/test/resources/application.properties +++ /dev/null @@ -1,18 +0,0 @@ -spring.jpa.hibernate.ddl-auto=none -spring.jpa.properties.hibernate.format_sql=true -spring.sql.init.mode=always - -logging.level.org.springframework.orm.jpa=INFO -logging.level.org.springframework.transaction=INFO -logging.level.org.springframework.transaction.interceptor=TRACE -logging.level.org.springframework.orm.jpa.JpaTransactionManager=DEBUG - -# TODO Append connection to DB -#spring.datasource.driverClassName -#spring.datasource.url -#spring.datasource.username -#spring.datasource.password -spring.datasource.driverClassName=org.postgresql.Driver -spring.datasource.url=jdbc:postgresql://localhost:5432/shareitdb -spring.datasource.username=test -spring.datasource.password=test diff --git a/src/test/resources/schema.sql b/src/test/resources/schema.sql deleted file mode 100644 index bd4ded0..0000000 --- a/src/test/resources/schema.sql +++ /dev/null @@ -1,51 +0,0 @@ -CREATE TABLE IF NOT EXISTS users ( - id BIGINT GENERATED BY DEFAULT AS IDENTITY NOT NULL, - name VARCHAR(255) NOT NULL, - email VARCHAR(255) NOT NULL, - CONSTRAINT pk_user PRIMARY KEY (id), - CONSTRAINT UQ_USER_EMAIL UNIQUE (email) -); - -CREATE TABLE IF NOT EXISTS itemrequests ( - id BIGINT GENERATED BY DEFAULT AS IDENTITY NOT NULL, - description VARCHAR(255) NOT NULL, - user_id BIGINT, - created TIMESTAMP WITHOUT TIME ZONE, - CONSTRAINT pk_itemrequest PRIMARY KEY (id), - CONSTRAINT fk_requests_to_users FOREIGN KEY(user_id) REFERENCES users(id) -); - -CREATE TABLE IF NOT EXISTS items ( - id BIGINT GENERATED BY DEFAULT AS IDENTITY NOT NULL, - name VARCHAR(255) NOT NULL, - description VARCHAR(255), - owner_id BIGINT NOT NULL, - available BOOLEAN, - request_id BIGINT, - CONSTRAINT pk_item PRIMARY KEY (id), - CONSTRAINT fk_items_to_users FOREIGN KEY(owner_id) REFERENCES users(id), - CONSTRAINT fk_items_to_requests FOREIGN KEY(request_id) REFERENCES itemrequests(id) -); - -CREATE TABLE IF NOT EXISTS bookings ( - id BIGINT GENERATED BY DEFAULT AS IDENTITY NOT NULL, - time_start TIMESTAMP WITHOUT TIME ZONE NOT NULL, - time_end TIMESTAMP WITHOUT TIME ZONE NOT NULL, - item_id BIGINT NOT NULL, - booker_id BIGINT NOT NULL, - status VARCHAR(16), - CONSTRAINT pk_buoking PRIMARY KEY (id), - CONSTRAINT fk_buokings_to_items FOREIGN KEY(item_id) REFERENCES items(id), - CONSTRAINT fk_buokings_to_users FOREIGN KEY(booker_id) REFERENCES users(id) -); - -CREATE TABLE IF NOT EXISTS comments ( - id BIGINT GENERATED BY DEFAULT AS IDENTITY NOT NULL, - text VARCHAR(512) NOT NULL, - item_id BIGINT NOT NULL, - author_id BIGINT NOT NULL, - created TIMESTAMP WITHOUT TIME ZONE, - CONSTRAINT pk_comment PRIMARY KEY (id), - CONSTRAINT fk_connemts_to_items FOREIGN KEY(item_id) REFERENCES items(id), - CONSTRAINT fk_connemts_to_users FOREIGN KEY(author_id) REFERENCES users(id) -); \ No newline at end of file From 08cd2f4493a62842c762a3b1094d937bf619b49b Mon Sep 17 00:00:00 2001 From: Andrej Stelmaschuk Date: Sun, 20 Apr 2025 22:33:19 +0700 Subject: [PATCH 02/46] =?UTF-8?q?feat:=20=D0=B4=D0=BE=D0=B1=D0=B0=D0=B2?= =?UTF-8?q?=D0=B8=D1=82=D1=8C=20=D0=BF=D1=80=D0=BE=D1=81=D0=BC=D0=BE=D1=82?= =?UTF-8?q?=D1=80=D1=80=20=D0=B7=D0=B0=D0=BF=D1=80=D0=BE=D1=81=D0=BE=D0=B2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../shareit/request/ItemRequest.java | 4 +- .../request/ItemRequestController.java | 26 ++++++++- .../shareit/request/ItemRequestMapper.java | 28 ++++++++++ .../shareit/request/dto/ItemRequestDto.java | 23 +++++++- .../request/service/ItemRequestService.java | 15 +++++ .../service/ItemRequestServiceImpl.java | 56 +++++++++++++++++++ .../ru/practicum/shareit/user/UserMapper.java | 2 + src/main/resources/application.properties | 2 + src/main/resources/schema.sql | 15 +++++ 9 files changed, 163 insertions(+), 8 deletions(-) create mode 100644 src/main/java/ru/practicum/shareit/request/ItemRequestMapper.java create mode 100644 src/main/java/ru/practicum/shareit/request/service/ItemRequestService.java create mode 100644 src/main/java/ru/practicum/shareit/request/service/ItemRequestServiceImpl.java diff --git a/src/main/java/ru/practicum/shareit/request/ItemRequest.java b/src/main/java/ru/practicum/shareit/request/ItemRequest.java index 4b31d96..862af6c 100644 --- a/src/main/java/ru/practicum/shareit/request/ItemRequest.java +++ b/src/main/java/ru/practicum/shareit/request/ItemRequest.java @@ -31,8 +31,8 @@ public class ItemRequest { private String description; @ManyToOne - @JoinColumn(name = "user_id") - private User requestor; + @JoinColumn(name = "customer_id") + private User customer; @Column(name = "created", nullable = false) private Instant created = Instant.now(); diff --git a/src/main/java/ru/practicum/shareit/request/ItemRequestController.java b/src/main/java/ru/practicum/shareit/request/ItemRequestController.java index 064e2e9..ac9658c 100644 --- a/src/main/java/ru/practicum/shareit/request/ItemRequestController.java +++ b/src/main/java/ru/practicum/shareit/request/ItemRequestController.java @@ -1,12 +1,32 @@ package ru.practicum.shareit.request; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; +import lombok.extern.slf4j.Slf4j; +import org.springframework.http.HttpStatus; +import org.springframework.web.bind.annotation.*; +import ru.practicum.shareit.request.dto.ItemRequestDto; +import ru.practicum.shareit.request.service.ItemRequestService; +import ru.practicum.shareit.user.UserMapper; /** - * TODO Sprint add-item-requests. + * Клас обработки запросов на Вещи */ +@Slf4j @RestController @RequestMapping(path = "/requests") public class ItemRequestController { + private ItemRequestService itemRequestService; + + public ItemRequestController(ItemRequestService itemRequestService) { + this.itemRequestService = itemRequestService; + } + + @PostMapping + @ResponseStatus(HttpStatus.CREATED) + public ItemRequestDto createItemRequest( + @RequestHeader(UserMapper.HEADER_USER_ID) final Long customerId, + @RequestBody final ItemRequestDto itemRequestDto ) throws Exception { + log.info("Пользователь id={} делает заказ : {}", customerId, itemRequestDto.getDescription()); + return itemRequestService.create(customerId, itemRequestDto); + } + } diff --git a/src/main/java/ru/practicum/shareit/request/ItemRequestMapper.java b/src/main/java/ru/practicum/shareit/request/ItemRequestMapper.java new file mode 100644 index 0000000..7dd4e2d --- /dev/null +++ b/src/main/java/ru/practicum/shareit/request/ItemRequestMapper.java @@ -0,0 +1,28 @@ +package ru.practicum.shareit.request; + +import lombok.Data; +import ru.practicum.shareit.request.dto.ItemRequestDto; +import ru.practicum.shareit.user.UserMapper; + +public class ItemRequestMapper { + private ItemRequestMapper() { + } + + public static ItemRequest ToItemRequest(ItemRequestDto requestDto) { + ItemRequest itemRequest = new ItemRequest(); + itemRequest.setId(requestDto.getId()); + itemRequest.setDescription(requestDto.getDescription()); + itemRequest.setCustomer(UserMapper.toUser(requestDto.getCustomer())); + itemRequest.setCreated(requestDto.getCreated()); + return itemRequest; + } + + public static ItemRequestDto ToItemRequestDto(ItemRequest itemRequest) { + ItemRequestDto itemRequestDto = new ItemRequestDto(); + itemRequestDto.setId(itemRequest.getId()); + itemRequestDto.setDescription(itemRequest.getDescription()); + itemRequestDto.setCustomer(UserMapper.toUserDto(itemRequest.getCustomer())); + itemRequestDto.setCreated(itemRequest.getCreated()); + return itemRequestDto; + } +} diff --git a/src/main/java/ru/practicum/shareit/request/dto/ItemRequestDto.java b/src/main/java/ru/practicum/shareit/request/dto/ItemRequestDto.java index 7b3ed54..064611a 100644 --- a/src/main/java/ru/practicum/shareit/request/dto/ItemRequestDto.java +++ b/src/main/java/ru/practicum/shareit/request/dto/ItemRequestDto.java @@ -1,7 +1,24 @@ package ru.practicum.shareit.request.dto; -/** - * TODO Sprint add-item-requests. - */ +import jakarta.validation.constraints.NotBlank; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; +import ru.practicum.shareit.user.User; +import ru.practicum.shareit.user.dto.UserDto; +import ru.practicum.shareit.validator.ValidAction; + +import java.time.Instant; + +@Data +@AllArgsConstructor +@NoArgsConstructor public class ItemRequestDto { + private Long id; + + @NotBlank(message = "Описание запроса не может быть пустым") + private String description; + + private UserDto customer; + private Instant created; } diff --git a/src/main/java/ru/practicum/shareit/request/service/ItemRequestService.java b/src/main/java/ru/practicum/shareit/request/service/ItemRequestService.java new file mode 100644 index 0000000..abbb357 --- /dev/null +++ b/src/main/java/ru/practicum/shareit/request/service/ItemRequestService.java @@ -0,0 +1,15 @@ +package ru.practicum.shareit.request.service; + +import ru.practicum.shareit.request.dto.ItemRequestDto; + +import java.util.List; + +public interface ItemRequestService { + ItemRequestDto create(Long customerId, ItemRequestDto itemRequestDto); + + ItemRequestDto findReqestsId(Long Id); + + List findReqestsByCustomerId(Long CustomerId); + + List findAllReqests(Long CustomerId); +} diff --git a/src/main/java/ru/practicum/shareit/request/service/ItemRequestServiceImpl.java b/src/main/java/ru/practicum/shareit/request/service/ItemRequestServiceImpl.java new file mode 100644 index 0000000..7ff6139 --- /dev/null +++ b/src/main/java/ru/practicum/shareit/request/service/ItemRequestServiceImpl.java @@ -0,0 +1,56 @@ +package ru.practicum.shareit.request.service; + +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; +import ru.practicum.shareit.excepton.NotFoundException; +import ru.practicum.shareit.request.ItemRequest; +import ru.practicum.shareit.request.ItemRequestMapper; +import ru.practicum.shareit.request.dto.ItemRequestDto; +import ru.practicum.shareit.request.repository.ItemRequestRepository; +import ru.practicum.shareit.user.User; +import ru.practicum.shareit.user.UserMapper; +import ru.practicum.shareit.user.repository.UserRepository; + +import java.time.Instant; +import java.util.List; + +@Service +@Transactional(readOnly = true) +public class ItemRequestServiceImpl implements ItemRequestService{ + private ItemRequestRepository itemRequestRepository; + private UserRepository userRepository; + + public ItemRequestServiceImpl(ItemRequestRepository itemRequestRepository, + UserRepository userRepository) { + this.itemRequestRepository = itemRequestRepository; + this.userRepository = userRepository; + } + + @Override + @Transactional + public ItemRequestDto create(Long customerId, ItemRequestDto itemRequestDto) { + User customer = userRepository.findById(customerId) + .orElseThrow(() -> new NotFoundException("Не найден пользователь id=" + customerId)); + + itemRequestDto.setCustomer(UserMapper.toUserDto(customer)); + itemRequestDto.setCreated(Instant.now()); + ItemRequest savedItemRequest = itemRequestRepository.save( + ItemRequestMapper.ToItemRequest(itemRequestDto)); + return ItemRequestMapper.ToItemRequestDto(savedItemRequest); + } + + @Override + public ItemRequestDto findReqestsId(Long Id) { + return null; + } + + @Override + public List findReqestsByCustomerId(Long CustomerId) { + return List.of(); + } + + @Override + public List findAllReqests(Long CustomerId) { + return List.of(); + } +} diff --git a/src/main/java/ru/practicum/shareit/user/UserMapper.java b/src/main/java/ru/practicum/shareit/user/UserMapper.java index e8f9f68..a43a352 100644 --- a/src/main/java/ru/practicum/shareit/user/UserMapper.java +++ b/src/main/java/ru/practicum/shareit/user/UserMapper.java @@ -3,6 +3,8 @@ import ru.practicum.shareit.user.dto.UserDto; public class UserMapper { + public static final String HEADER_USER_ID = "X-Sharer-User-Id"; + private UserMapper() { } diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties index 053a4bb..9681856 100644 --- a/src/main/resources/application.properties +++ b/src/main/resources/application.properties @@ -2,6 +2,8 @@ spring.jpa.hibernate.ddl-auto=none spring.jpa.properties.hibernate.format_sql=true spring.sql.init.mode=always +logging.level.org.zalando.logbook=TRACE + logging.level.org.springframework.orm.jpa=INFO logging.level.org.springframework.transaction=INFO logging.level.org.springframework.transaction.interceptor=TRACE diff --git a/src/main/resources/schema.sql b/src/main/resources/schema.sql index fcc264a..73ddfc5 100644 --- a/src/main/resources/schema.sql +++ b/src/main/resources/schema.sql @@ -1,3 +1,9 @@ +-- DROP TABLE bookings; +-- DROP TABLE comments; +-- DROP TABLE items; +-- DROP TABLE itemrequests; +-- DROP TABLE users; + CREATE TABLE IF NOT EXISTS users ( id BIGINT GENERATED BY DEFAULT AS IDENTITY NOT NULL, name VARCHAR(255) NOT NULL, @@ -48,4 +54,13 @@ CREATE TABLE IF NOT EXISTS comments ( CONSTRAINT pk_comment PRIMARY KEY (id), CONSTRAINT fk_connemts_to_items FOREIGN KEY(item_id) REFERENCES items(id), CONSTRAINT fk_connemts_to_users FOREIGN KEY(author_id) REFERENCES users(id) +); + +CREATE TABLE IF NOT EXISTS itemrequests ( + id BIGINT GENERATED BY DEFAULT AS IDENTITY NOT NULL, + description VARCHAR(512) NOT NULL, + customer_id BIGINT NOT NULL, + created TIMESTAMP WITHOUT TIME ZONE, + CONSTRAINT pk_itemrequests PRIMARY KEY (id), + CONSTRAINT fk_itemrequests_to_users FOREIGN KEY(customer_id) REFERENCES users(id) ); \ No newline at end of file From 0580570a9d10c83a90190fd2e6ff331dc8e526dd Mon Sep 17 00:00:00 2001 From: Andrej Stelmaschuk Date: Sun, 20 Apr 2025 23:38:46 +0700 Subject: [PATCH 03/46] =?UTF-8?q?feat:=20=D0=BF=D1=80=D0=BE=D1=81=D0=BC?= =?UTF-8?q?=D0=BE=D1=82=D1=80=D1=80=20=D0=B7=D0=B0=D0=BF=D1=80=D0=BE=D1=81?= =?UTF-8?q?=D0=BE=D0=B2=20=D0=BF=D0=BE=20=D0=B8=D0=B4=D0=B5=D0=BD=D1=82?= =?UTF-8?q?=D0=B8=D1=84=D0=B8=D0=BA=D0=B0=D1=82=D0=BE=D1=80=D1=83?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ru/practicum/shareit/item/ItemMapper.java | 13 +++-- .../request/ItemRequestController.java | 22 ++++++++- .../request/service/ItemRequestService.java | 2 +- .../service/ItemRequestServiceImpl.java | 8 +++- src/main/resources/schema.sql | 48 ++++++++----------- 5 files changed, 54 insertions(+), 39 deletions(-) diff --git a/src/main/java/ru/practicum/shareit/item/ItemMapper.java b/src/main/java/ru/practicum/shareit/item/ItemMapper.java index 71039d4..f8cbdc6 100644 --- a/src/main/java/ru/practicum/shareit/item/ItemMapper.java +++ b/src/main/java/ru/practicum/shareit/item/ItemMapper.java @@ -41,13 +41,12 @@ public static ItemCommentsDto toItemCommentsDto(Item item) { } public static Item toItem(ItemDto itemDto) { - return new Item( - itemDto.getId(), - itemDto.getName(), - itemDto.getDescription(), - itemDto.getAvailable(), - null - ); + Item item = new Item(); + item.setId(itemDto.getId()); + item.setName(itemDto.getName()); + item.setDescription(itemDto.getDescription()); + item.setAvailable(itemDto.getAvailable()); + return item; } } diff --git a/src/main/java/ru/practicum/shareit/request/ItemRequestController.java b/src/main/java/ru/practicum/shareit/request/ItemRequestController.java index ac9658c..bf59e80 100644 --- a/src/main/java/ru/practicum/shareit/request/ItemRequestController.java +++ b/src/main/java/ru/practicum/shareit/request/ItemRequestController.java @@ -20,6 +20,13 @@ public ItemRequestController(ItemRequestService itemRequestService) { this.itemRequestService = itemRequestService; } + /** + * Создаем новый запрос + * @param customerId - идентификатор заказчика + * @param itemRequestDto - объект описания запроса + * @return - сохраненный запрос + * @throws Exception + */ @PostMapping @ResponseStatus(HttpStatus.CREATED) public ItemRequestDto createItemRequest( @@ -28,5 +35,18 @@ public ItemRequestDto createItemRequest( log.info("Пользователь id={} делает заказ : {}", customerId, itemRequestDto.getDescription()); return itemRequestService.create(customerId, itemRequestDto); } - + + /** + * Поиск запроса по идентификатору + */ + @GetMapping("/{id}") + @ResponseStatus(HttpStatus.OK) + public ItemRequestDto findItemRequest( + @RequestHeader(UserMapper.HEADER_USER_ID) final Long userId, + @PathVariable final Long id) { + log.info("Пользователь id={} просматривает заказ id={}", userId, id); + return itemRequestService.findReqestsById(userId, id); + } + + } diff --git a/src/main/java/ru/practicum/shareit/request/service/ItemRequestService.java b/src/main/java/ru/practicum/shareit/request/service/ItemRequestService.java index abbb357..d49aa06 100644 --- a/src/main/java/ru/practicum/shareit/request/service/ItemRequestService.java +++ b/src/main/java/ru/practicum/shareit/request/service/ItemRequestService.java @@ -7,7 +7,7 @@ public interface ItemRequestService { ItemRequestDto create(Long customerId, ItemRequestDto itemRequestDto); - ItemRequestDto findReqestsId(Long Id); + ItemRequestDto findReqestsById(Long userId, Long id); List findReqestsByCustomerId(Long CustomerId); diff --git a/src/main/java/ru/practicum/shareit/request/service/ItemRequestServiceImpl.java b/src/main/java/ru/practicum/shareit/request/service/ItemRequestServiceImpl.java index 7ff6139..a2f0a90 100644 --- a/src/main/java/ru/practicum/shareit/request/service/ItemRequestServiceImpl.java +++ b/src/main/java/ru/practicum/shareit/request/service/ItemRequestServiceImpl.java @@ -40,8 +40,12 @@ public ItemRequestDto create(Long customerId, ItemRequestDto itemRequestDto) { } @Override - public ItemRequestDto findReqestsId(Long Id) { - return null; + public ItemRequestDto findReqestsById(Long userId, Long id) { + User customer = userRepository.findById(userId) + .orElseThrow(() -> new NotFoundException("Не найден пользователь id=" + userId)); + ItemRequest request = itemRequestRepository.findById(id) + .orElseThrow(() -> new NotFoundException("Не найден запрос id=" + id)); + return ItemRequestMapper.ToItemRequestDto(request); } @Override diff --git a/src/main/resources/schema.sql b/src/main/resources/schema.sql index 73ddfc5..191d306 100644 --- a/src/main/resources/schema.sql +++ b/src/main/resources/schema.sql @@ -1,8 +1,8 @@ --- DROP TABLE bookings; --- DROP TABLE comments; --- DROP TABLE items; --- DROP TABLE itemrequests; --- DROP TABLE users; +DROP TABLE bookings; +DROP TABLE comments; +DROP TABLE items; +DROP TABLE itemrequests; +DROP TABLE users; CREATE TABLE IF NOT EXISTS users ( id BIGINT GENERATED BY DEFAULT AS IDENTITY NOT NULL, @@ -14,11 +14,11 @@ CREATE TABLE IF NOT EXISTS users ( CREATE TABLE IF NOT EXISTS itemrequests ( id BIGINT GENERATED BY DEFAULT AS IDENTITY NOT NULL, - description VARCHAR(255) NOT NULL, - user_id BIGINT, + description VARCHAR(512) NOT NULL, + customer_id BIGINT NOT NULL, created TIMESTAMP WITHOUT TIME ZONE, - CONSTRAINT pk_itemrequest PRIMARY KEY (id), - CONSTRAINT fk_requests_to_users FOREIGN KEY(user_id) REFERENCES users(id) + CONSTRAINT pk_itemrequests PRIMARY KEY (id), + CONSTRAINT fk_itemrequests_to_users FOREIGN KEY(customer_id) REFERENCES users(id) ); CREATE TABLE IF NOT EXISTS items ( @@ -33,18 +33,6 @@ CREATE TABLE IF NOT EXISTS items ( CONSTRAINT fk_items_to_requests FOREIGN KEY(request_id) REFERENCES itemrequests(id) ); -CREATE TABLE IF NOT EXISTS bookings ( - id BIGINT GENERATED BY DEFAULT AS IDENTITY NOT NULL, - time_start TIMESTAMP WITHOUT TIME ZONE NOT NULL, - time_end TIMESTAMP WITHOUT TIME ZONE NOT NULL, - item_id BIGINT NOT NULL, - booker_id BIGINT NOT NULL, - status VARCHAR(16), - CONSTRAINT pk_buoking PRIMARY KEY (id), - CONSTRAINT fk_buokings_to_items FOREIGN KEY(item_id) REFERENCES items(id), - CONSTRAINT fk_buokings_to_users FOREIGN KEY(booker_id) REFERENCES users(id) -); - CREATE TABLE IF NOT EXISTS comments ( id BIGINT GENERATED BY DEFAULT AS IDENTITY NOT NULL, text VARCHAR(512) NOT NULL, @@ -56,11 +44,15 @@ CREATE TABLE IF NOT EXISTS comments ( CONSTRAINT fk_connemts_to_users FOREIGN KEY(author_id) REFERENCES users(id) ); -CREATE TABLE IF NOT EXISTS itemrequests ( +CREATE TABLE IF NOT EXISTS bookings ( id BIGINT GENERATED BY DEFAULT AS IDENTITY NOT NULL, - description VARCHAR(512) NOT NULL, - customer_id BIGINT NOT NULL, - created TIMESTAMP WITHOUT TIME ZONE, - CONSTRAINT pk_itemrequests PRIMARY KEY (id), - CONSTRAINT fk_itemrequests_to_users FOREIGN KEY(customer_id) REFERENCES users(id) -); \ No newline at end of file + time_start TIMESTAMP WITHOUT TIME ZONE NOT NULL, + time_end TIMESTAMP WITHOUT TIME ZONE NOT NULL, + item_id BIGINT NOT NULL, + booker_id BIGINT NOT NULL, + status VARCHAR(16), + CONSTRAINT pk_buoking PRIMARY KEY (id), + CONSTRAINT fk_buokings_to_items FOREIGN KEY(item_id) REFERENCES items(id), + CONSTRAINT fk_buokings_to_users FOREIGN KEY(booker_id) REFERENCES users(id) +); + From de6a871abae456cdf1d1b3bb5912626b3b354249 Mon Sep 17 00:00:00 2001 From: Andrej Stelmaschuk Date: Mon, 21 Apr 2025 21:45:26 +0700 Subject: [PATCH 04/46] =?UTF-8?q?feat:=20=D0=BF=D1=80=D0=B8=D0=B2=D1=8F?= =?UTF-8?q?=D0=B7=D0=BA=D0=B0=20=D0=B2=D0=B5=D1=89=D0=B5=D0=B9=20=D0=BA=20?= =?UTF-8?q?=D0=B7=D0=B0=D0=BF=D1=80=D0=BE=D1=81=D0=B0=D0=BC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ru/practicum/shareit/item/ItemMapper.java | 19 ++++++++++--------- .../shareit/item/dto/ItemCommentsDto.java | 3 ++- .../practicum/shareit/item/dto/ItemDto.java | 5 ++++- .../shareit/request/ItemRequestMapper.java | 8 ++++++-- src/main/resources/application.properties | 8 ++++---- 5 files changed, 26 insertions(+), 17 deletions(-) diff --git a/src/main/java/ru/practicum/shareit/item/ItemMapper.java b/src/main/java/ru/practicum/shareit/item/ItemMapper.java index f8cbdc6..d979254 100644 --- a/src/main/java/ru/practicum/shareit/item/ItemMapper.java +++ b/src/main/java/ru/practicum/shareit/item/ItemMapper.java @@ -3,6 +3,7 @@ import ru.practicum.shareit.item.dto.ItemCommentsDto; import ru.practicum.shareit.item.dto.ItemDto; import ru.practicum.shareit.item.model.Item; +import ru.practicum.shareit.request.ItemRequestMapper; import java.util.List; @@ -15,12 +16,11 @@ public static ItemDto toItemDto(Item item) { itemDto.setId(item.getId()); itemDto.setName(item.getName()); itemDto.setDescription(item.getDescription()); - itemDto.setAvailable(item.getAvailable()); - if (item.getRequest() != null) { - itemDto.setRequest(item.getRequest().getId()); - } else { - itemDto.setRequest(null); + if(item.getRequest() != null) { + itemDto.setRequest(ItemRequestMapper.ToItemRequestDto(item.getRequest())); } + itemDto.setAvailable(item.getAvailable()); + return itemDto; } @@ -30,10 +30,8 @@ public static ItemCommentsDto toItemCommentsDto(Item item) { itemDto.setName(item.getName()); itemDto.setDescription(item.getDescription()); itemDto.setAvailable(item.getAvailable()); - if (item.getRequest() != null) { - itemDto.setRequest(item.getRequest().getId()); - } else { - itemDto.setRequest(null); + if(item.getRequest() != null) { + itemDto.setRequest(ItemRequestMapper.ToItemRequestDto(item.getRequest())); } itemDto.setComments(List.of()); return itemDto; @@ -46,6 +44,9 @@ public static Item toItem(ItemDto itemDto) { item.setName(itemDto.getName()); item.setDescription(itemDto.getDescription()); item.setAvailable(itemDto.getAvailable()); + if(itemDto.getRequest() != null) { + item.setRequest(ItemRequestMapper.ToItemRequest(itemDto.getRequest())); + } return item; } diff --git a/src/main/java/ru/practicum/shareit/item/dto/ItemCommentsDto.java b/src/main/java/ru/practicum/shareit/item/dto/ItemCommentsDto.java index 5113d17..40d3a2d 100644 --- a/src/main/java/ru/practicum/shareit/item/dto/ItemCommentsDto.java +++ b/src/main/java/ru/practicum/shareit/item/dto/ItemCommentsDto.java @@ -3,6 +3,7 @@ import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor; +import ru.practicum.shareit.request.dto.ItemRequestDto; import java.time.Instant; import java.util.List; @@ -16,7 +17,7 @@ public class ItemCommentsDto { private String name; private String description; private Boolean available; - private Long request; + private ItemRequestDto request; private Instant lastBooking; private Instant nextBooking; } diff --git a/src/main/java/ru/practicum/shareit/item/dto/ItemDto.java b/src/main/java/ru/practicum/shareit/item/dto/ItemDto.java index 207dadf..a4a3af0 100644 --- a/src/main/java/ru/practicum/shareit/item/dto/ItemDto.java +++ b/src/main/java/ru/practicum/shareit/item/dto/ItemDto.java @@ -6,6 +6,9 @@ import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor; +import ru.practicum.shareit.request.ItemRequest; +import ru.practicum.shareit.request.ItemRequestMapper; +import ru.practicum.shareit.request.dto.ItemRequestDto; import ru.practicum.shareit.validator.ValidAction; import java.time.Instant; @@ -30,7 +33,7 @@ public class ItemDto { @NotNull(message = "Доступ должен быть определен.", groups = {ValidAction.OnCreate.class}) private Boolean available; - private Long request; + private ItemRequestDto request; private Instant lastBooking; private Instant nextBooking; diff --git a/src/main/java/ru/practicum/shareit/request/ItemRequestMapper.java b/src/main/java/ru/practicum/shareit/request/ItemRequestMapper.java index 7dd4e2d..0e2b781 100644 --- a/src/main/java/ru/practicum/shareit/request/ItemRequestMapper.java +++ b/src/main/java/ru/practicum/shareit/request/ItemRequestMapper.java @@ -12,7 +12,9 @@ public static ItemRequest ToItemRequest(ItemRequestDto requestDto) { ItemRequest itemRequest = new ItemRequest(); itemRequest.setId(requestDto.getId()); itemRequest.setDescription(requestDto.getDescription()); - itemRequest.setCustomer(UserMapper.toUser(requestDto.getCustomer())); + if(requestDto.getCustomer() != null) { + itemRequest.setCustomer(UserMapper.toUser(requestDto.getCustomer())); + } itemRequest.setCreated(requestDto.getCreated()); return itemRequest; } @@ -21,7 +23,9 @@ public static ItemRequestDto ToItemRequestDto(ItemRequest itemRequest) { ItemRequestDto itemRequestDto = new ItemRequestDto(); itemRequestDto.setId(itemRequest.getId()); itemRequestDto.setDescription(itemRequest.getDescription()); - itemRequestDto.setCustomer(UserMapper.toUserDto(itemRequest.getCustomer())); + if(itemRequest.getCustomer() != null) { + itemRequestDto.setCustomer(UserMapper.toUserDto(itemRequest.getCustomer())); + } itemRequestDto.setCreated(itemRequest.getCreated()); return itemRequestDto; } diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties index 9681856..078aa54 100644 --- a/src/main/resources/application.properties +++ b/src/main/resources/application.properties @@ -4,10 +4,10 @@ spring.sql.init.mode=always logging.level.org.zalando.logbook=TRACE -logging.level.org.springframework.orm.jpa=INFO -logging.level.org.springframework.transaction=INFO -logging.level.org.springframework.transaction.interceptor=TRACE -logging.level.org.springframework.orm.jpa.JpaTransactionManager=DEBUG +#logging.level.org.springframework.orm.jpa=INFO +#logging.level.org.springframework.transaction=INFO +#logging.level.org.springframework.transaction.interceptor=TRACE +#logging.level.org.springframework.orm.jpa.JpaTransactionManager=DEBUG # TODO Append connection to DB #spring.datasource.driverClassName From 6abd6e561151a5794502e399a94273e580bb89ee Mon Sep 17 00:00:00 2001 From: Andrej Stelmaschuk Date: Wed, 23 Apr 2025 00:29:55 +0700 Subject: [PATCH 05/46] =?UTF-8?q?feat:=20=D1=80=D0=B5=D0=B0=D0=BB=D0=B8?= =?UTF-8?q?=D0=B7=D0=BE=D0=B2=D0=B0=D0=BD=D0=B0=20=D1=80=D0=B0=D0=B1=D0=BE?= =?UTF-8?q?=D1=82=D0=B0=20=D1=81=20=D0=B7=D0=B0=D0=BF=D1=80=D0=BE=D1=81?= =?UTF-8?q?=D0=B0=D0=BC=D0=B8=20=D0=B2=D0=B5=D1=89=D0=B5=D0=B9.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ru/practicum/shareit/item/ItemMapper.java | 13 ++- .../shareit/item/dto/ItemCommentsDto.java | 2 +- .../practicum/shareit/item/dto/ItemDto.java | 2 +- .../shareit/item/dto/ItemShortDto.java | 17 ++++ .../item/repository/ItemRepository.java | 4 + .../shareit/item/service/ItemServiceImpl.java | 28 ++++++- .../request/ItemRequestController.java | 27 ++++++- .../shareit/request/ItemRequestMapper.java | 6 +- .../shareit/request/dto/ItemRequestDto.java | 2 +- .../request/dto/RequestWithItemsDto.java | 20 +++++ .../repository/ItemRequestRepository.java | 10 +++ .../request/service/ItemRequestService.java | 7 +- .../service/ItemRequestServiceImpl.java | 80 ++++++++++++++++--- 13 files changed, 189 insertions(+), 29 deletions(-) create mode 100644 src/main/java/ru/practicum/shareit/item/dto/ItemShortDto.java create mode 100644 src/main/java/ru/practicum/shareit/request/dto/RequestWithItemsDto.java diff --git a/src/main/java/ru/practicum/shareit/item/ItemMapper.java b/src/main/java/ru/practicum/shareit/item/ItemMapper.java index d979254..8d397c6 100644 --- a/src/main/java/ru/practicum/shareit/item/ItemMapper.java +++ b/src/main/java/ru/practicum/shareit/item/ItemMapper.java @@ -2,6 +2,7 @@ import ru.practicum.shareit.item.dto.ItemCommentsDto; import ru.practicum.shareit.item.dto.ItemDto; +import ru.practicum.shareit.item.dto.ItemShortDto; import ru.practicum.shareit.item.model.Item; import ru.practicum.shareit.request.ItemRequestMapper; @@ -17,7 +18,7 @@ public static ItemDto toItemDto(Item item) { itemDto.setName(item.getName()); itemDto.setDescription(item.getDescription()); if(item.getRequest() != null) { - itemDto.setRequest(ItemRequestMapper.ToItemRequestDto(item.getRequest())); + itemDto.setRequestId(item.getRequest().getId()); } itemDto.setAvailable(item.getAvailable()); @@ -44,10 +45,14 @@ public static Item toItem(ItemDto itemDto) { item.setName(itemDto.getName()); item.setDescription(itemDto.getDescription()); item.setAvailable(itemDto.getAvailable()); - if(itemDto.getRequest() != null) { - item.setRequest(ItemRequestMapper.ToItemRequest(itemDto.getRequest())); - } return item; } + public static ItemShortDto toItemShortDto(Item item) { + ItemShortDto itemDto = new ItemShortDto(); + itemDto.setId(item.getId()); + itemDto.setName(item.getName()); + itemDto.setOwnerId(item.getOwner().getId()); + return itemDto; + } } diff --git a/src/main/java/ru/practicum/shareit/item/dto/ItemCommentsDto.java b/src/main/java/ru/practicum/shareit/item/dto/ItemCommentsDto.java index 40d3a2d..9b09d85 100644 --- a/src/main/java/ru/practicum/shareit/item/dto/ItemCommentsDto.java +++ b/src/main/java/ru/practicum/shareit/item/dto/ItemCommentsDto.java @@ -12,7 +12,6 @@ @AllArgsConstructor @NoArgsConstructor public class ItemCommentsDto { - List comments; private Long id; private String name; private String description; @@ -20,4 +19,5 @@ public class ItemCommentsDto { private ItemRequestDto request; private Instant lastBooking; private Instant nextBooking; + List comments; } diff --git a/src/main/java/ru/practicum/shareit/item/dto/ItemDto.java b/src/main/java/ru/practicum/shareit/item/dto/ItemDto.java index a4a3af0..0a59aa7 100644 --- a/src/main/java/ru/practicum/shareit/item/dto/ItemDto.java +++ b/src/main/java/ru/practicum/shareit/item/dto/ItemDto.java @@ -33,7 +33,7 @@ public class ItemDto { @NotNull(message = "Доступ должен быть определен.", groups = {ValidAction.OnCreate.class}) private Boolean available; - private ItemRequestDto request; + private Long requestId; private Instant lastBooking; private Instant nextBooking; diff --git a/src/main/java/ru/practicum/shareit/item/dto/ItemShortDto.java b/src/main/java/ru/practicum/shareit/item/dto/ItemShortDto.java new file mode 100644 index 0000000..e319990 --- /dev/null +++ b/src/main/java/ru/practicum/shareit/item/dto/ItemShortDto.java @@ -0,0 +1,17 @@ +package ru.practicum.shareit.item.dto; + +import jakarta.validation.constraints.NotBlank; +import jakarta.validation.constraints.Size; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; +import ru.practicum.shareit.validator.ValidAction; + +@Data +@AllArgsConstructor +@NoArgsConstructor +public class ItemShortDto { + private Long id; + private String name; + private Long ownerId; +} diff --git a/src/main/java/ru/practicum/shareit/item/repository/ItemRepository.java b/src/main/java/ru/practicum/shareit/item/repository/ItemRepository.java index d6cf0d1..8d64273 100644 --- a/src/main/java/ru/practicum/shareit/item/repository/ItemRepository.java +++ b/src/main/java/ru/practicum/shareit/item/repository/ItemRepository.java @@ -13,4 +13,8 @@ public interface ItemRepository extends JpaRepository { "WHERE (UPPER(it.name) LIKE UPPER(?1) OR UPPER(it.description) LIKE UPPER(?1))" + "AND it.available = TRUE") List findByNameOrDescriptionContainingIgnoreCase(String textSearch); + + List findAllByRequest_IdEquals(Long requestId); + + List findAllByRequest_IdIn(List requestIds); } diff --git a/src/main/java/ru/practicum/shareit/item/service/ItemServiceImpl.java b/src/main/java/ru/practicum/shareit/item/service/ItemServiceImpl.java index 1a15c03..46941da 100644 --- a/src/main/java/ru/practicum/shareit/item/service/ItemServiceImpl.java +++ b/src/main/java/ru/practicum/shareit/item/service/ItemServiceImpl.java @@ -5,6 +5,7 @@ import ru.practicum.shareit.booking.repository.BookingRepository; import ru.practicum.shareit.excepton.AccessDeniedException; import ru.practicum.shareit.excepton.NotFoundException; +import ru.practicum.shareit.excepton.ValidationException; import ru.practicum.shareit.item.CommentMapper; import ru.practicum.shareit.item.ItemMapper; import ru.practicum.shareit.item.dto.CommentDto; @@ -13,6 +14,8 @@ import ru.practicum.shareit.item.model.Item; import ru.practicum.shareit.item.repository.CommentRepository; import ru.practicum.shareit.item.repository.ItemRepository; +import ru.practicum.shareit.request.ItemRequest; +import ru.practicum.shareit.request.repository.ItemRequestRepository; import ru.practicum.shareit.user.User; import ru.practicum.shareit.user.repository.UserRepository; @@ -26,15 +29,18 @@ public class ItemServiceImpl implements ItemService { private final UserRepository userRepository; private final BookingRepository bookingRepository; private final CommentRepository commentRepository; + private final ItemRequestRepository requestRepository; public ItemServiceImpl(ItemRepository itemRepository, UserRepository userRepository, BookingRepository bookingRepository, - CommentRepository commentRepository) { + CommentRepository commentRepository, + ItemRequestRepository requestRepository) { this.itemRepository = itemRepository; this.userRepository = userRepository; this.bookingRepository = bookingRepository; this.commentRepository = commentRepository; + this.requestRepository = requestRepository; } @Override @@ -44,10 +50,19 @@ public ItemDto addItem(ItemDto itemDto, Long ownerId) { Item newItem = ItemMapper.toItem(itemDto); newItem.setOwner(owner); + Long requestId = itemDto.getRequestId(); + if (requestId != null){ + ItemRequest request = requestRepository.findById(requestId) + .orElseThrow(() -> new ValidationException("Не найден запрос id=" + requestId)); + newItem.setRequest(request); + } else { + newItem.setRequest(null); + } Item savedItem = itemRepository.save(newItem); return ItemMapper.toItemDto(savedItem); } + @Override public ItemDto updateItem(ItemDto updItemDto, Long ownerId) { User owner = userRepository.findById(ownerId) @@ -62,6 +77,14 @@ public ItemDto updateItem(ItemDto updItemDto, Long ownerId) { if (!updItem.getOwner().equals(item.getOwner())) { throw new AccessDeniedException("Редактировать данные может только владелец вещи."); } + Long requestId = updItemDto.getRequestId(); + if (requestId != null){ + ItemRequest request = requestRepository.findById(requestId) + .orElseThrow(() -> new ValidationException("Не найден запрос id=" + requestId)); + item.setRequest(request); + } else { + item.setRequest(null); + } if (updItem.getName() != null) { item.setName(updItem.getName()); @@ -69,9 +92,6 @@ public ItemDto updateItem(ItemDto updItemDto, Long ownerId) { if (updItem.getDescription() != null) { item.setDescription(updItem.getDescription()); } - if (updItem.getRequest() != null) { - item.setRequest(updItem.getRequest()); - } if (updItem.getAvailable() != null) { item.setAvailable(updItem.getAvailable()); } diff --git a/src/main/java/ru/practicum/shareit/request/ItemRequestController.java b/src/main/java/ru/practicum/shareit/request/ItemRequestController.java index bf59e80..cabcb12 100644 --- a/src/main/java/ru/practicum/shareit/request/ItemRequestController.java +++ b/src/main/java/ru/practicum/shareit/request/ItemRequestController.java @@ -4,9 +4,12 @@ import org.springframework.http.HttpStatus; import org.springframework.web.bind.annotation.*; import ru.practicum.shareit.request.dto.ItemRequestDto; +import ru.practicum.shareit.request.dto.RequestWithItemsDto; import ru.practicum.shareit.request.service.ItemRequestService; import ru.practicum.shareit.user.UserMapper; +import java.util.List; + /** * Клас обработки запросов на Вещи */ @@ -41,7 +44,7 @@ public ItemRequestDto createItemRequest( */ @GetMapping("/{id}") @ResponseStatus(HttpStatus.OK) - public ItemRequestDto findItemRequest( + public RequestWithItemsDto findItemRequest( @RequestHeader(UserMapper.HEADER_USER_ID) final Long userId, @PathVariable final Long id) { log.info("Пользователь id={} просматривает заказ id={}", userId, id); @@ -49,4 +52,26 @@ public ItemRequestDto findItemRequest( } + /** + * Поиск пользователем своих запросов + */ + @GetMapping("") + @ResponseStatus(HttpStatus.OK) + public List findRequestsByUserId( + @RequestHeader(UserMapper.HEADER_USER_ID) final Long userId) { + log.info("Пользователь id={} просматривает свои заказы.", userId); + + return itemRequestService.findReqestsByCustomerId(userId); + } + + /** + * Поиск пользователем всех чужих запросов + */ + @GetMapping("/all") + @ResponseStatus(HttpStatus.OK) + public List findAllRequests( + @RequestHeader(UserMapper.HEADER_USER_ID) final Long userId) { + log.info("Пользователь id={} просматривает все заказы.", userId); + return itemRequestService.findAllReqests(userId); + } } diff --git a/src/main/java/ru/practicum/shareit/request/ItemRequestMapper.java b/src/main/java/ru/practicum/shareit/request/ItemRequestMapper.java index 0e2b781..21ca1d7 100644 --- a/src/main/java/ru/practicum/shareit/request/ItemRequestMapper.java +++ b/src/main/java/ru/practicum/shareit/request/ItemRequestMapper.java @@ -12,8 +12,8 @@ public static ItemRequest ToItemRequest(ItemRequestDto requestDto) { ItemRequest itemRequest = new ItemRequest(); itemRequest.setId(requestDto.getId()); itemRequest.setDescription(requestDto.getDescription()); - if(requestDto.getCustomer() != null) { - itemRequest.setCustomer(UserMapper.toUser(requestDto.getCustomer())); + if(requestDto.getRequestor() != null) { + itemRequest.setCustomer(UserMapper.toUser(requestDto.getRequestor())); } itemRequest.setCreated(requestDto.getCreated()); return itemRequest; @@ -24,7 +24,7 @@ public static ItemRequestDto ToItemRequestDto(ItemRequest itemRequest) { itemRequestDto.setId(itemRequest.getId()); itemRequestDto.setDescription(itemRequest.getDescription()); if(itemRequest.getCustomer() != null) { - itemRequestDto.setCustomer(UserMapper.toUserDto(itemRequest.getCustomer())); + itemRequestDto.setRequestor(UserMapper.toUserDto(itemRequest.getCustomer())); } itemRequestDto.setCreated(itemRequest.getCreated()); return itemRequestDto; diff --git a/src/main/java/ru/practicum/shareit/request/dto/ItemRequestDto.java b/src/main/java/ru/practicum/shareit/request/dto/ItemRequestDto.java index 064611a..6706178 100644 --- a/src/main/java/ru/practicum/shareit/request/dto/ItemRequestDto.java +++ b/src/main/java/ru/practicum/shareit/request/dto/ItemRequestDto.java @@ -19,6 +19,6 @@ public class ItemRequestDto { @NotBlank(message = "Описание запроса не может быть пустым") private String description; - private UserDto customer; + private UserDto requestor; private Instant created; } diff --git a/src/main/java/ru/practicum/shareit/request/dto/RequestWithItemsDto.java b/src/main/java/ru/practicum/shareit/request/dto/RequestWithItemsDto.java new file mode 100644 index 0000000..cd12556 --- /dev/null +++ b/src/main/java/ru/practicum/shareit/request/dto/RequestWithItemsDto.java @@ -0,0 +1,20 @@ +package ru.practicum.shareit.request.dto; + +import jakarta.validation.constraints.NotBlank; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; +import ru.practicum.shareit.item.dto.ItemShortDto; +import ru.practicum.shareit.user.dto.UserDto; + +import java.time.Instant; +import java.util.ArrayList; +import java.util.List; + +@Data +@AllArgsConstructor +@NoArgsConstructor +public class RequestWithItemsDto { + private ItemRequestDto requestDto; + private List items = new ArrayList<>(); +} diff --git a/src/main/java/ru/practicum/shareit/request/repository/ItemRequestRepository.java b/src/main/java/ru/practicum/shareit/request/repository/ItemRequestRepository.java index d02c5da..48fdd48 100644 --- a/src/main/java/ru/practicum/shareit/request/repository/ItemRequestRepository.java +++ b/src/main/java/ru/practicum/shareit/request/repository/ItemRequestRepository.java @@ -1,7 +1,17 @@ package ru.practicum.shareit.request.repository; +import org.springframework.data.domain.Sort; import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.data.jpa.repository.Query; import ru.practicum.shareit.request.ItemRequest; +import java.util.List; + public interface ItemRequestRepository extends JpaRepository { + List findAllByCustomer_IdEquals(Long customerId, Sort sort); + + @Query("SELECT ir FROM ItemRequest AS ir " + + "WHERE ir.customer.id <> ?1 " + + "ORDER BY ir.created DESC") + List findAllNotCustomer_Id(Long customerId); } diff --git a/src/main/java/ru/practicum/shareit/request/service/ItemRequestService.java b/src/main/java/ru/practicum/shareit/request/service/ItemRequestService.java index d49aa06..1b2c41c 100644 --- a/src/main/java/ru/practicum/shareit/request/service/ItemRequestService.java +++ b/src/main/java/ru/practicum/shareit/request/service/ItemRequestService.java @@ -1,15 +1,16 @@ package ru.practicum.shareit.request.service; import ru.practicum.shareit.request.dto.ItemRequestDto; +import ru.practicum.shareit.request.dto.RequestWithItemsDto; import java.util.List; public interface ItemRequestService { ItemRequestDto create(Long customerId, ItemRequestDto itemRequestDto); - ItemRequestDto findReqestsById(Long userId, Long id); + RequestWithItemsDto findReqestsById(Long userId, Long id); - List findReqestsByCustomerId(Long CustomerId); + List findReqestsByCustomerId(Long CustomerId); - List findAllReqests(Long CustomerId); + List findAllReqests(Long CustomerId); } diff --git a/src/main/java/ru/practicum/shareit/request/service/ItemRequestServiceImpl.java b/src/main/java/ru/practicum/shareit/request/service/ItemRequestServiceImpl.java index a2f0a90..204b3b4 100644 --- a/src/main/java/ru/practicum/shareit/request/service/ItemRequestServiceImpl.java +++ b/src/main/java/ru/practicum/shareit/request/service/ItemRequestServiceImpl.java @@ -1,29 +1,41 @@ package ru.practicum.shareit.request.service; +import org.springframework.data.domain.Sort; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import ru.practicum.shareit.excepton.NotFoundException; +import ru.practicum.shareit.item.ItemMapper; +import ru.practicum.shareit.item.dto.ItemShortDto; +import ru.practicum.shareit.item.model.Item; +import ru.practicum.shareit.item.repository.ItemRepository; import ru.practicum.shareit.request.ItemRequest; import ru.practicum.shareit.request.ItemRequestMapper; import ru.practicum.shareit.request.dto.ItemRequestDto; +import ru.practicum.shareit.request.dto.RequestWithItemsDto; import ru.practicum.shareit.request.repository.ItemRequestRepository; import ru.practicum.shareit.user.User; import ru.practicum.shareit.user.UserMapper; import ru.practicum.shareit.user.repository.UserRepository; import java.time.Instant; +import java.util.ArrayList; +import java.util.HashMap; import java.util.List; +import java.util.Map; @Service @Transactional(readOnly = true) public class ItemRequestServiceImpl implements ItemRequestService{ - private ItemRequestRepository itemRequestRepository; - private UserRepository userRepository; + private final ItemRequestRepository itemRequestRepository; + private final UserRepository userRepository; + private final ItemRepository itemRepository; public ItemRequestServiceImpl(ItemRequestRepository itemRequestRepository, - UserRepository userRepository) { + UserRepository userRepository, + ItemRepository itemRepository) { this.itemRequestRepository = itemRequestRepository; this.userRepository = userRepository; + this.itemRepository = itemRepository; } @Override @@ -32,7 +44,7 @@ public ItemRequestDto create(Long customerId, ItemRequestDto itemRequestDto) { User customer = userRepository.findById(customerId) .orElseThrow(() -> new NotFoundException("Не найден пользователь id=" + customerId)); - itemRequestDto.setCustomer(UserMapper.toUserDto(customer)); + itemRequestDto.setRequestor(UserMapper.toUserDto(customer)); itemRequestDto.setCreated(Instant.now()); ItemRequest savedItemRequest = itemRequestRepository.save( ItemRequestMapper.ToItemRequest(itemRequestDto)); @@ -40,21 +52,67 @@ public ItemRequestDto create(Long customerId, ItemRequestDto itemRequestDto) { } @Override - public ItemRequestDto findReqestsById(Long userId, Long id) { + public RequestWithItemsDto findReqestsById(Long userId, Long id) { User customer = userRepository.findById(userId) .orElseThrow(() -> new NotFoundException("Не найден пользователь id=" + userId)); ItemRequest request = itemRequestRepository.findById(id) .orElseThrow(() -> new NotFoundException("Не найден запрос id=" + id)); - return ItemRequestMapper.ToItemRequestDto(request); + + RequestWithItemsDto rwi = new RequestWithItemsDto(); + rwi.setRequestDto(ItemRequestMapper.ToItemRequestDto(request)); + List items = itemRepository.findAllByRequest_IdEquals(id).stream() + .map(ItemMapper::toItemShortDto) + .toList(); + rwi.setItems(items); + return rwi; } + /** + * Поиск собственных запросов закзчика + * + * @param customerId - идентификатор заказчика + * @return - спмсок запросов с ответными предложениями вещей + */ @Override - public List findReqestsByCustomerId(Long CustomerId) { - return List.of(); - } + public List findReqestsByCustomerId(Long customerId) { + userRepository.findById(customerId) + .orElseThrow(() -> new NotFoundException("Не найден пользователь id=" + customerId)); + + List reqests = itemRequestRepository.findAllByCustomer_IdEquals( + customerId, Sort.by("created").descending()); + return addItemsToRequests(reqests); + } @Override - public List findAllReqests(Long CustomerId) { - return List.of(); + public List findAllReqests(Long customerId) { + userRepository.findById(customerId) + .orElseThrow(() -> new NotFoundException("Не найден пользователь id=" + customerId)); + + List reqests = itemRequestRepository + .findAllNotCustomer_Id(customerId); + return addItemsToRequests(reqests); + } + + private List addItemsToRequests(List requests) { + List rwiDtos = new ArrayList<>(); + Map rwiDtoMap = new HashMap<>(); + for (int i = 0; i < requests.size(); i++) { + ItemRequest itemRequest = requests.get(i); + RequestWithItemsDto rwiDto = new RequestWithItemsDto(); + rwiDto.setRequestDto(ItemRequestMapper.ToItemRequestDto(itemRequest)); + rwiDtos.add(rwiDto); + rwiDtoMap.put(itemRequest.getId(), rwiDto); + } + + List ids = new ArrayList<>(rwiDtoMap.keySet()); + List items = itemRepository.findAllByRequest_IdIn(ids); + for (Item item : items) { + if (item.getRequest() != null) { + long requestId = item.getRequest().getId(); + rwiDtoMap.get(requestId).getItems().add(ItemMapper.toItemShortDto(item)); + } + } + + return rwiDtos; } } From b105ad1e66ea2feab486f681b88a47a9af799065 Mon Sep 17 00:00:00 2001 From: Andrej Stelmaschuk Date: Wed, 23 Apr 2025 20:30:37 +0700 Subject: [PATCH 06/46] =?UTF-8?q?fix:=20=D1=82=D0=B5=D1=81=D1=82=D1=8B=20P?= =?UTF-8?q?ostman=20-=20OK?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../shareit/advisor/ErrorAdvisor.java | 4 ++-- .../booking/service/BookingServiceImpl.java | 4 ++-- .../ru/practicum/shareit/item/ItemMapper.java | 4 ++-- .../shareit/item/dto/ItemCommentsDto.java | 2 +- .../practicum/shareit/item/dto/ItemDto.java | 3 --- .../shareit/item/dto/ItemShortDto.java | 3 --- .../shareit/item/service/ItemServiceImpl.java | 4 ++-- .../request/ItemRequestController.java | 5 +++-- .../shareit/request/ItemRequestMapper.java | 18 ++++++++++++--- .../shareit/request/dto/ItemRequestDto.java | 2 -- .../request/dto/RequestWithItemsDto.java | 9 ++++---- .../service/ItemRequestServiceImpl.java | 22 +++++++++---------- 12 files changed, 42 insertions(+), 38 deletions(-) diff --git a/src/main/java/ru/practicum/shareit/advisor/ErrorAdvisor.java b/src/main/java/ru/practicum/shareit/advisor/ErrorAdvisor.java index 5a04d0d..bb420cb 100644 --- a/src/main/java/ru/practicum/shareit/advisor/ErrorAdvisor.java +++ b/src/main/java/ru/practicum/shareit/advisor/ErrorAdvisor.java @@ -27,7 +27,7 @@ public class ErrorAdvisor { */ @ExceptionHandler(MethodArgumentNotValidException.class) @ResponseStatus(HttpStatus.BAD_REQUEST) - public List onMethodArgumentNotValidException( + public ErrorMessage onMethodArgumentNotValidException( MethodArgumentNotValidException e ) { final List violations = e.getBindingResult().getFieldErrors().stream() @@ -35,7 +35,7 @@ public List onMethodArgumentNotValidException( + error.getDefaultMessage())) .collect(Collectors.toList()); log.info("400 {}.", e.getMessage()); - return violations; + return violations.get(0); } /** diff --git a/src/main/java/ru/practicum/shareit/booking/service/BookingServiceImpl.java b/src/main/java/ru/practicum/shareit/booking/service/BookingServiceImpl.java index 71d684e..2928f44 100644 --- a/src/main/java/ru/practicum/shareit/booking/service/BookingServiceImpl.java +++ b/src/main/java/ru/practicum/shareit/booking/service/BookingServiceImpl.java @@ -134,11 +134,11 @@ public List findBookingByBooker(Long bookerId, SearchState state) { } else if (state.equals(SearchState.ALL)) { bookings = bookingRepository.findAllByBookerIdOrderByStartDesc(bookerId); } else if (state.equals(SearchState.PAST)) { - bookings = bookingRepository.findByBooker_IdAndEndIsBefore(bookerId, Instant.now(), Sort.by("DESC", "start")); + bookings = bookingRepository.findByBooker_IdAndEndIsBefore(bookerId, Instant.now(), Sort.by("start").descending()); } else if (state.equals(SearchState.CURRENT)) { bookings = bookingRepository.findBookingsByBookerIdCurrent(bookerId, Instant.now()); } else if (state.equals(SearchState.FUTURE)) { - bookings = bookingRepository.findByBooker_IdAndStartIsAfter(bookerId, Instant.now(), Sort.by("DESC", "start")); + bookings = bookingRepository.findByBooker_IdAndStartIsAfter(bookerId, Instant.now(), Sort.by("start").descending()); } return bookings.stream().map(BookingMapper::toBookingDto).toList(); } diff --git a/src/main/java/ru/practicum/shareit/item/ItemMapper.java b/src/main/java/ru/practicum/shareit/item/ItemMapper.java index 8d397c6..1deac40 100644 --- a/src/main/java/ru/practicum/shareit/item/ItemMapper.java +++ b/src/main/java/ru/practicum/shareit/item/ItemMapper.java @@ -17,7 +17,7 @@ public static ItemDto toItemDto(Item item) { itemDto.setId(item.getId()); itemDto.setName(item.getName()); itemDto.setDescription(item.getDescription()); - if(item.getRequest() != null) { + if (item.getRequest() != null) { itemDto.setRequestId(item.getRequest().getId()); } itemDto.setAvailable(item.getAvailable()); @@ -31,7 +31,7 @@ public static ItemCommentsDto toItemCommentsDto(Item item) { itemDto.setName(item.getName()); itemDto.setDescription(item.getDescription()); itemDto.setAvailable(item.getAvailable()); - if(item.getRequest() != null) { + if (item.getRequest() != null) { itemDto.setRequest(ItemRequestMapper.ToItemRequestDto(item.getRequest())); } itemDto.setComments(List.of()); diff --git a/src/main/java/ru/practicum/shareit/item/dto/ItemCommentsDto.java b/src/main/java/ru/practicum/shareit/item/dto/ItemCommentsDto.java index 9b09d85..40d3a2d 100644 --- a/src/main/java/ru/practicum/shareit/item/dto/ItemCommentsDto.java +++ b/src/main/java/ru/practicum/shareit/item/dto/ItemCommentsDto.java @@ -12,6 +12,7 @@ @AllArgsConstructor @NoArgsConstructor public class ItemCommentsDto { + List comments; private Long id; private String name; private String description; @@ -19,5 +20,4 @@ public class ItemCommentsDto { private ItemRequestDto request; private Instant lastBooking; private Instant nextBooking; - List comments; } diff --git a/src/main/java/ru/practicum/shareit/item/dto/ItemDto.java b/src/main/java/ru/practicum/shareit/item/dto/ItemDto.java index 0a59aa7..aa7fc96 100644 --- a/src/main/java/ru/practicum/shareit/item/dto/ItemDto.java +++ b/src/main/java/ru/practicum/shareit/item/dto/ItemDto.java @@ -6,9 +6,6 @@ import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor; -import ru.practicum.shareit.request.ItemRequest; -import ru.practicum.shareit.request.ItemRequestMapper; -import ru.practicum.shareit.request.dto.ItemRequestDto; import ru.practicum.shareit.validator.ValidAction; import java.time.Instant; diff --git a/src/main/java/ru/practicum/shareit/item/dto/ItemShortDto.java b/src/main/java/ru/practicum/shareit/item/dto/ItemShortDto.java index e319990..e2858e5 100644 --- a/src/main/java/ru/practicum/shareit/item/dto/ItemShortDto.java +++ b/src/main/java/ru/practicum/shareit/item/dto/ItemShortDto.java @@ -1,11 +1,8 @@ package ru.practicum.shareit.item.dto; -import jakarta.validation.constraints.NotBlank; -import jakarta.validation.constraints.Size; import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor; -import ru.practicum.shareit.validator.ValidAction; @Data @AllArgsConstructor diff --git a/src/main/java/ru/practicum/shareit/item/service/ItemServiceImpl.java b/src/main/java/ru/practicum/shareit/item/service/ItemServiceImpl.java index 46941da..a070b98 100644 --- a/src/main/java/ru/practicum/shareit/item/service/ItemServiceImpl.java +++ b/src/main/java/ru/practicum/shareit/item/service/ItemServiceImpl.java @@ -51,7 +51,7 @@ public ItemDto addItem(ItemDto itemDto, Long ownerId) { Item newItem = ItemMapper.toItem(itemDto); newItem.setOwner(owner); Long requestId = itemDto.getRequestId(); - if (requestId != null){ + if (requestId != null) { ItemRequest request = requestRepository.findById(requestId) .orElseThrow(() -> new ValidationException("Не найден запрос id=" + requestId)); newItem.setRequest(request); @@ -78,7 +78,7 @@ public ItemDto updateItem(ItemDto updItemDto, Long ownerId) { throw new AccessDeniedException("Редактировать данные может только владелец вещи."); } Long requestId = updItemDto.getRequestId(); - if (requestId != null){ + if (requestId != null) { ItemRequest request = requestRepository.findById(requestId) .orElseThrow(() -> new ValidationException("Не найден запрос id=" + requestId)); item.setRequest(request); diff --git a/src/main/java/ru/practicum/shareit/request/ItemRequestController.java b/src/main/java/ru/practicum/shareit/request/ItemRequestController.java index cabcb12..3f39aba 100644 --- a/src/main/java/ru/practicum/shareit/request/ItemRequestController.java +++ b/src/main/java/ru/practicum/shareit/request/ItemRequestController.java @@ -25,7 +25,8 @@ public ItemRequestController(ItemRequestService itemRequestService) { /** * Создаем новый запрос - * @param customerId - идентификатор заказчика + * + * @param customerId - идентификатор заказчика * @param itemRequestDto - объект описания запроса * @return - сохраненный запрос * @throws Exception @@ -34,7 +35,7 @@ public ItemRequestController(ItemRequestService itemRequestService) { @ResponseStatus(HttpStatus.CREATED) public ItemRequestDto createItemRequest( @RequestHeader(UserMapper.HEADER_USER_ID) final Long customerId, - @RequestBody final ItemRequestDto itemRequestDto ) throws Exception { + @RequestBody final ItemRequestDto itemRequestDto) throws Exception { log.info("Пользователь id={} делает заказ : {}", customerId, itemRequestDto.getDescription()); return itemRequestService.create(customerId, itemRequestDto); } diff --git a/src/main/java/ru/practicum/shareit/request/ItemRequestMapper.java b/src/main/java/ru/practicum/shareit/request/ItemRequestMapper.java index 21ca1d7..291fb6e 100644 --- a/src/main/java/ru/practicum/shareit/request/ItemRequestMapper.java +++ b/src/main/java/ru/practicum/shareit/request/ItemRequestMapper.java @@ -1,7 +1,7 @@ package ru.practicum.shareit.request; -import lombok.Data; import ru.practicum.shareit.request.dto.ItemRequestDto; +import ru.practicum.shareit.request.dto.RequestWithItemsDto; import ru.practicum.shareit.user.UserMapper; public class ItemRequestMapper { @@ -12,7 +12,7 @@ public static ItemRequest ToItemRequest(ItemRequestDto requestDto) { ItemRequest itemRequest = new ItemRequest(); itemRequest.setId(requestDto.getId()); itemRequest.setDescription(requestDto.getDescription()); - if(requestDto.getRequestor() != null) { + if (requestDto.getRequestor() != null) { itemRequest.setCustomer(UserMapper.toUser(requestDto.getRequestor())); } itemRequest.setCreated(requestDto.getCreated()); @@ -23,10 +23,22 @@ public static ItemRequestDto ToItemRequestDto(ItemRequest itemRequest) { ItemRequestDto itemRequestDto = new ItemRequestDto(); itemRequestDto.setId(itemRequest.getId()); itemRequestDto.setDescription(itemRequest.getDescription()); - if(itemRequest.getCustomer() != null) { + if (itemRequest.getCustomer() != null) { itemRequestDto.setRequestor(UserMapper.toUserDto(itemRequest.getCustomer())); } itemRequestDto.setCreated(itemRequest.getCreated()); return itemRequestDto; } + + public static RequestWithItemsDto ToRwiDto(ItemRequest itemRequest) { + RequestWithItemsDto itemRequestDto = new RequestWithItemsDto(); + itemRequestDto.setId(itemRequest.getId()); + itemRequestDto.setDescription(itemRequest.getDescription()); + if (itemRequest.getCustomer() != null) { + itemRequestDto.setRequestor(UserMapper.toUserDto(itemRequest.getCustomer())); + } + itemRequestDto.setCreated(itemRequest.getCreated()); + return itemRequestDto; + } + } diff --git a/src/main/java/ru/practicum/shareit/request/dto/ItemRequestDto.java b/src/main/java/ru/practicum/shareit/request/dto/ItemRequestDto.java index 6706178..fc821a8 100644 --- a/src/main/java/ru/practicum/shareit/request/dto/ItemRequestDto.java +++ b/src/main/java/ru/practicum/shareit/request/dto/ItemRequestDto.java @@ -4,9 +4,7 @@ import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor; -import ru.practicum.shareit.user.User; import ru.practicum.shareit.user.dto.UserDto; -import ru.practicum.shareit.validator.ValidAction; import java.time.Instant; diff --git a/src/main/java/ru/practicum/shareit/request/dto/RequestWithItemsDto.java b/src/main/java/ru/practicum/shareit/request/dto/RequestWithItemsDto.java index cd12556..773796d 100644 --- a/src/main/java/ru/practicum/shareit/request/dto/RequestWithItemsDto.java +++ b/src/main/java/ru/practicum/shareit/request/dto/RequestWithItemsDto.java @@ -1,7 +1,5 @@ package ru.practicum.shareit.request.dto; -import jakarta.validation.constraints.NotBlank; -import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor; import ru.practicum.shareit.item.dto.ItemShortDto; @@ -12,9 +10,12 @@ import java.util.List; @Data -@AllArgsConstructor @NoArgsConstructor public class RequestWithItemsDto { - private ItemRequestDto requestDto; + private Long id; + private String description; + private UserDto requestor; + private Instant created; + private List items = new ArrayList<>(); } diff --git a/src/main/java/ru/practicum/shareit/request/service/ItemRequestServiceImpl.java b/src/main/java/ru/practicum/shareit/request/service/ItemRequestServiceImpl.java index 204b3b4..4af2d73 100644 --- a/src/main/java/ru/practicum/shareit/request/service/ItemRequestServiceImpl.java +++ b/src/main/java/ru/practicum/shareit/request/service/ItemRequestServiceImpl.java @@ -25,7 +25,7 @@ @Service @Transactional(readOnly = true) -public class ItemRequestServiceImpl implements ItemRequestService{ +public class ItemRequestServiceImpl implements ItemRequestService { private final ItemRequestRepository itemRequestRepository; private final UserRepository userRepository; private final ItemRepository itemRepository; @@ -53,25 +53,24 @@ public ItemRequestDto create(Long customerId, ItemRequestDto itemRequestDto) { @Override public RequestWithItemsDto findReqestsById(Long userId, Long id) { - User customer = userRepository.findById(userId) + userRepository.findById(userId) .orElseThrow(() -> new NotFoundException("Не найден пользователь id=" + userId)); ItemRequest request = itemRequestRepository.findById(id) .orElseThrow(() -> new NotFoundException("Не найден запрос id=" + id)); - RequestWithItemsDto rwi = new RequestWithItemsDto(); - rwi.setRequestDto(ItemRequestMapper.ToItemRequestDto(request)); + RequestWithItemsDto rwi = ItemRequestMapper.ToRwiDto(request); List items = itemRepository.findAllByRequest_IdEquals(id).stream() - .map(ItemMapper::toItemShortDto) - .toList(); + .map(ItemMapper::toItemShortDto) + .toList(); rwi.setItems(items); return rwi; } /** - * Поиск собственных запросов закзчика + * Поиск собственных запросов заказчика * * @param customerId - идентификатор заказчика - * @return - спмсок запросов с ответными предложениями вещей + * @return - список запросов с ответными предложениями вещей */ @Override public List findReqestsByCustomerId(Long customerId) { @@ -80,8 +79,8 @@ public List findReqestsByCustomerId(Long customerId) { List reqests = itemRequestRepository.findAllByCustomer_IdEquals( customerId, Sort.by("created").descending()); - return addItemsToRequests(reqests); - } + return addItemsToRequests(reqests); + } @Override public List findAllReqests(Long customerId) { @@ -98,8 +97,7 @@ private List addItemsToRequests(List requests) Map rwiDtoMap = new HashMap<>(); for (int i = 0; i < requests.size(); i++) { ItemRequest itemRequest = requests.get(i); - RequestWithItemsDto rwiDto = new RequestWithItemsDto(); - rwiDto.setRequestDto(ItemRequestMapper.ToItemRequestDto(itemRequest)); + RequestWithItemsDto rwiDto = ItemRequestMapper.ToRwiDto(itemRequest); rwiDtos.add(rwiDto); rwiDtoMap.put(itemRequest.getId(), rwiDto); } From 12e6206b4ef4778ce92476b746db483545936d18 Mon Sep 17 00:00:00 2001 From: Andrej Stelmaschuk Date: Wed, 23 Apr 2025 21:56:56 +0700 Subject: [PATCH 07/46] =?UTF-8?q?feat:=20=D0=BF=D1=80=D0=B8=D0=BB=D0=BE?= =?UTF-8?q?=D0=B6=D0=B5=D0=BD=D0=B8=D0=B5=20=D1=80=D0=B0=D0=B7=D0=B1=D0=B8?= =?UTF-8?q?=D1=82=D0=BE=20=D0=BD=D0=B0=20=D0=BC=D0=BE=D0=B4=D1=83=D0=BB?= =?UTF-8?q?=D0=B8:=20server,=20gateway?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- gateway/Dockerfile | 5 + gateway/pom.xml | 70 ++++++++++ .../ru/practicum/shareit/ShareItGateway.java | 12 ++ .../shareit/booking/BookingClient.java | 48 +++++++ .../shareit/booking/BookingController.java | 55 ++++++++ .../booking/dto/BookItemRequestDto.java | 20 +++ .../shareit/booking/dto/BookingState.java | 27 ++++ .../practicum/shareit/client/BaseClient.java | 121 ++++++++++++++++++ .../src/main/resources/application.properties | 7 + pom.xml | 112 +++------------- server/Dockerfile | 5 + server/pom.xml | 92 +++++++++++++ .../ru/practicum/shareit}/ErrorAdvisor.java | 2 +- .../ru/practicum/shareit}/ErrorMessage.java | 2 +- .../ru/practicum/shareit/ShareItServer.java | 6 +- .../ru/practicum/shareit/booking/Booking.java | 0 .../shareit/booking/BookingController.java | 0 .../shareit/booking/BookingMapper.java | 0 .../shareit/booking/dto/BookingDto.java | 0 .../shareit/booking/enums/BookingStatus.java | 0 .../shareit/booking/enums/SearchState.java | 0 .../booking/repository/BookingRepository.java | 0 .../booking/service/BookingService.java | 0 .../booking/service/BookingServiceImpl.java | 0 .../excepton/AccessDeniedException.java | 0 .../shareit/excepton/ConflictException.java | 0 .../excepton/InternalServerException.java | 0 .../shareit/excepton/NotFoundException.java | 0 .../shareit/excepton/ValidationException.java | 0 .../practicum/shareit/item/CommentMapper.java | 0 .../shareit/item/ItemController.java | 0 .../ru/practicum/shareit/item/ItemMapper.java | 0 .../shareit/item/dto/CommentDto.java | 0 .../shareit/item/dto/ItemCommentsDto.java | 0 .../practicum/shareit/item/dto/ItemDto.java | 0 .../shareit/item/dto/ItemShortDto.java | 0 .../practicum/shareit/item/model/Comment.java | 0 .../ru/practicum/shareit/item/model/Item.java | 0 .../item/repository/CommentRepository.java | 0 .../item/repository/ItemRepository.java | 0 .../shareit/item/service/CommentService.java | 0 .../item/service/CommentServiceImpl.java | 0 .../shareit/item/service/ItemService.java | 0 .../shareit/item/service/ItemServiceImpl.java | 0 .../shareit/request/ItemRequest.java | 0 .../request/ItemRequestController.java | 0 .../shareit/request/ItemRequestMapper.java | 0 .../shareit/request/dto/ItemRequestDto.java | 0 .../request/dto/RequestWithItemsDto.java | 0 .../repository/ItemRequestRepository.java | 0 .../request/service/ItemRequestService.java | 0 .../service/ItemRequestServiceImpl.java | 0 .../java/ru/practicum/shareit/user/User.java | 0 .../shareit/user/UserController.java | 0 .../ru/practicum/shareit/user/UserMapper.java | 0 .../practicum/shareit/user/dto/UserDto.java | 0 .../user/repository/UserRepository.java | 0 .../shareit/user/service/UserService.java | 0 .../shareit/user/service/UserServiceImpl.java | 0 .../shareit/validator/ValidAction.java | 0 .../main/resources/application.properties | 10 +- {src => server/src}/main/resources/schema.sql | 0 62 files changed, 492 insertions(+), 102 deletions(-) create mode 100644 gateway/Dockerfile create mode 100644 gateway/pom.xml create mode 100644 gateway/src/main/java/ru/practicum/shareit/ShareItGateway.java create mode 100644 gateway/src/main/java/ru/practicum/shareit/booking/BookingClient.java create mode 100644 gateway/src/main/java/ru/practicum/shareit/booking/BookingController.java create mode 100644 gateway/src/main/java/ru/practicum/shareit/booking/dto/BookItemRequestDto.java create mode 100644 gateway/src/main/java/ru/practicum/shareit/booking/dto/BookingState.java create mode 100644 gateway/src/main/java/ru/practicum/shareit/client/BaseClient.java create mode 100644 gateway/src/main/resources/application.properties create mode 100644 server/Dockerfile create mode 100644 server/pom.xml rename {src/main/java/ru/practicum/shareit/advisor => server/src/main/java/ru/practicum/shareit}/ErrorAdvisor.java (99%) rename {src/main/java/ru/practicum/shareit/advisor => server/src/main/java/ru/practicum/shareit}/ErrorMessage.java (86%) rename src/main/java/ru/practicum/shareit/ShareItApp.java => server/src/main/java/ru/practicum/shareit/ShareItServer.java (72%) rename {src => server/src}/main/java/ru/practicum/shareit/booking/Booking.java (100%) rename {src => server/src}/main/java/ru/practicum/shareit/booking/BookingController.java (100%) rename {src => server/src}/main/java/ru/practicum/shareit/booking/BookingMapper.java (100%) rename {src => server/src}/main/java/ru/practicum/shareit/booking/dto/BookingDto.java (100%) rename {src => server/src}/main/java/ru/practicum/shareit/booking/enums/BookingStatus.java (100%) rename {src => server/src}/main/java/ru/practicum/shareit/booking/enums/SearchState.java (100%) rename {src => server/src}/main/java/ru/practicum/shareit/booking/repository/BookingRepository.java (100%) rename {src => server/src}/main/java/ru/practicum/shareit/booking/service/BookingService.java (100%) rename {src => server/src}/main/java/ru/practicum/shareit/booking/service/BookingServiceImpl.java (100%) rename {src => server/src}/main/java/ru/practicum/shareit/excepton/AccessDeniedException.java (100%) rename {src => server/src}/main/java/ru/practicum/shareit/excepton/ConflictException.java (100%) rename {src => server/src}/main/java/ru/practicum/shareit/excepton/InternalServerException.java (100%) rename {src => server/src}/main/java/ru/practicum/shareit/excepton/NotFoundException.java (100%) rename {src => server/src}/main/java/ru/practicum/shareit/excepton/ValidationException.java (100%) rename {src => server/src}/main/java/ru/practicum/shareit/item/CommentMapper.java (100%) rename {src => server/src}/main/java/ru/practicum/shareit/item/ItemController.java (100%) rename {src => server/src}/main/java/ru/practicum/shareit/item/ItemMapper.java (100%) rename {src => server/src}/main/java/ru/practicum/shareit/item/dto/CommentDto.java (100%) rename {src => server/src}/main/java/ru/practicum/shareit/item/dto/ItemCommentsDto.java (100%) rename {src => server/src}/main/java/ru/practicum/shareit/item/dto/ItemDto.java (100%) rename {src => server/src}/main/java/ru/practicum/shareit/item/dto/ItemShortDto.java (100%) rename {src => server/src}/main/java/ru/practicum/shareit/item/model/Comment.java (100%) rename {src => server/src}/main/java/ru/practicum/shareit/item/model/Item.java (100%) rename {src => server/src}/main/java/ru/practicum/shareit/item/repository/CommentRepository.java (100%) rename {src => server/src}/main/java/ru/practicum/shareit/item/repository/ItemRepository.java (100%) rename {src => server/src}/main/java/ru/practicum/shareit/item/service/CommentService.java (100%) rename {src => server/src}/main/java/ru/practicum/shareit/item/service/CommentServiceImpl.java (100%) rename {src => server/src}/main/java/ru/practicum/shareit/item/service/ItemService.java (100%) rename {src => server/src}/main/java/ru/practicum/shareit/item/service/ItemServiceImpl.java (100%) rename {src => server/src}/main/java/ru/practicum/shareit/request/ItemRequest.java (100%) rename {src => server/src}/main/java/ru/practicum/shareit/request/ItemRequestController.java (100%) rename {src => server/src}/main/java/ru/practicum/shareit/request/ItemRequestMapper.java (100%) rename {src => server/src}/main/java/ru/practicum/shareit/request/dto/ItemRequestDto.java (100%) rename {src => server/src}/main/java/ru/practicum/shareit/request/dto/RequestWithItemsDto.java (100%) rename {src => server/src}/main/java/ru/practicum/shareit/request/repository/ItemRequestRepository.java (100%) rename {src => server/src}/main/java/ru/practicum/shareit/request/service/ItemRequestService.java (100%) rename {src => server/src}/main/java/ru/practicum/shareit/request/service/ItemRequestServiceImpl.java (100%) rename {src => server/src}/main/java/ru/practicum/shareit/user/User.java (100%) rename {src => server/src}/main/java/ru/practicum/shareit/user/UserController.java (100%) rename {src => server/src}/main/java/ru/practicum/shareit/user/UserMapper.java (100%) rename {src => server/src}/main/java/ru/practicum/shareit/user/dto/UserDto.java (100%) rename {src => server/src}/main/java/ru/practicum/shareit/user/repository/UserRepository.java (100%) rename {src => server/src}/main/java/ru/practicum/shareit/user/service/UserService.java (100%) rename {src => server/src}/main/java/ru/practicum/shareit/user/service/UserServiceImpl.java (100%) rename {src => server/src}/main/java/ru/practicum/shareit/validator/ValidAction.java (100%) rename {src => server/src}/main/resources/application.properties (75%) rename {src => server/src}/main/resources/schema.sql (100%) diff --git a/gateway/Dockerfile b/gateway/Dockerfile new file mode 100644 index 0000000..0ff1817 --- /dev/null +++ b/gateway/Dockerfile @@ -0,0 +1,5 @@ +FROM eclipse-temurin:21-jre-jammy +VOLUME /tmp +ARG JAR_FILE=target/*.jar +COPY ${JAR_FILE} app.jar +ENTRYPOINT ["sh", "-c", "java ${JAVA_OPTS} -jar /app.jar"] \ No newline at end of file diff --git a/gateway/pom.xml b/gateway/pom.xml new file mode 100644 index 0000000..f3394c1 --- /dev/null +++ b/gateway/pom.xml @@ -0,0 +1,70 @@ + + + 4.0.0 + + ru.practicum + shareit + 0.0.1-SNAPSHOT + + + shareit-gateway + 0.0.1-SNAPSHOT + + ShareIt Gateway + + + + org.springframework.boot + spring-boot-starter-web + + + + org.springframework.boot + spring-boot-starter-validation + + + + org.springframework.boot + spring-boot-starter-actuator + + + + org.hibernate.validator + hibernate-validator + + + + org.apache.httpcomponents.client5 + httpclient5 + + + + org.springframework.boot + spring-boot-configuration-processor + true + + + + org.projectlombok + lombok + true + + + + org.springframework.boot + spring-boot-starter-test + test + + + + + + + org.springframework.boot + spring-boot-maven-plugin + + + + + \ No newline at end of file diff --git a/gateway/src/main/java/ru/practicum/shareit/ShareItGateway.java b/gateway/src/main/java/ru/practicum/shareit/ShareItGateway.java new file mode 100644 index 0000000..4cbc16c --- /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); + } + +} \ No newline at end of file diff --git a/gateway/src/main/java/ru/practicum/shareit/booking/BookingClient.java b/gateway/src/main/java/ru/practicum/shareit/booking/BookingClient.java new file mode 100644 index 0000000..916528c --- /dev/null +++ b/gateway/src/main/java/ru/practicum/shareit/booking/BookingClient.java @@ -0,0 +1,48 @@ +package ru.practicum.shareit.booking; + +import java.util.Map; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.boot.web.client.RestTemplateBuilder; +import org.springframework.http.ResponseEntity; +import org.springframework.http.client.HttpComponentsClientHttpRequestFactory; +import org.springframework.stereotype.Service; +import org.springframework.web.util.DefaultUriBuilderFactory; + +import ru.practicum.shareit.booking.dto.BookItemRequestDto; +import ru.practicum.shareit.booking.dto.BookingState; +import ru.practicum.shareit.client.BaseClient; + +@Service +public class BookingClient extends BaseClient { + private static final String API_PREFIX = "/bookings"; + + @Autowired + public BookingClient(@Value("${shareit-server.url}") String serverUrl, RestTemplateBuilder builder) { + super( + builder + .uriTemplateHandler(new DefaultUriBuilderFactory(serverUrl + API_PREFIX)) + .requestFactory(() -> new HttpComponentsClientHttpRequestFactory()) + .build() + ); + } + + public ResponseEntity getBookings(long userId, BookingState state, Integer from, Integer size) { + Map parameters = Map.of( + "state", state.name(), + "from", from, + "size", size + ); + return get("?state={state}&from={from}&size={size}", userId, parameters); + } + + + public ResponseEntity bookItem(long userId, BookItemRequestDto requestDto) { + return post("", userId, requestDto); + } + + public ResponseEntity getBooking(long userId, Long bookingId) { + return get("/" + bookingId, userId); + } +} \ No newline at end of file diff --git a/gateway/src/main/java/ru/practicum/shareit/booking/BookingController.java b/gateway/src/main/java/ru/practicum/shareit/booking/BookingController.java new file mode 100644 index 0000000..7b55542 --- /dev/null +++ b/gateway/src/main/java/ru/practicum/shareit/booking/BookingController.java @@ -0,0 +1,55 @@ +package ru.practicum.shareit.booking; + +import org.springframework.http.ResponseEntity; +import org.springframework.stereotype.Controller; +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 jakarta.validation.Valid; +import jakarta.validation.constraints.Positive; +import jakarta.validation.constraints.PositiveOrZero; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import ru.practicum.shareit.booking.dto.BookItemRequestDto; +import ru.practicum.shareit.booking.dto.BookingState; + + +@Controller +@RequestMapping(path = "/bookings") +@RequiredArgsConstructor +@Slf4j +@Validated +public class BookingController { + private final BookingClient bookingClient; + + @GetMapping + public ResponseEntity getBookings(@RequestHeader("X-Sharer-User-Id") long userId, + @RequestParam(name = "state", defaultValue = "all") String stateParam, + @PositiveOrZero @RequestParam(name = "from", defaultValue = "0") Integer from, + @Positive @RequestParam(name = "size", defaultValue = "10") Integer size) { + BookingState state = BookingState.from(stateParam) + .orElseThrow(() -> new IllegalArgumentException("Unknown state: " + stateParam)); + log.info("Get booking with state {}, userId={}, from={}, size={}", stateParam, userId, from, size); + return bookingClient.getBookings(userId, state, from, size); + } + + @PostMapping + public ResponseEntity bookItem(@RequestHeader("X-Sharer-User-Id") long userId, + @RequestBody @Valid BookItemRequestDto requestDto) { + log.info("Creating booking {}, userId={}", requestDto, userId); + return bookingClient.bookItem(userId, requestDto); + } + + @GetMapping("/{bookingId}") + public ResponseEntity getBooking(@RequestHeader("X-Sharer-User-Id") long userId, + @PathVariable Long bookingId) { + log.info("Get booking {}, userId={}", bookingId, userId); + return bookingClient.getBooking(userId, bookingId); + } +} \ No newline at end of file diff --git a/gateway/src/main/java/ru/practicum/shareit/booking/dto/BookItemRequestDto.java b/gateway/src/main/java/ru/practicum/shareit/booking/dto/BookItemRequestDto.java new file mode 100644 index 0000000..8596ab7 --- /dev/null +++ b/gateway/src/main/java/ru/practicum/shareit/booking/dto/BookItemRequestDto.java @@ -0,0 +1,20 @@ +package ru.practicum.shareit.booking.dto; + +import java.time.LocalDateTime; + +import jakarta.validation.constraints.Future; +import jakarta.validation.constraints.FutureOrPresent; +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.NoArgsConstructor; + +@Getter +@NoArgsConstructor +@AllArgsConstructor +public class BookItemRequestDto { + private long itemId; + @FutureOrPresent + private LocalDateTime start; + @Future + private LocalDateTime end; +} \ No newline at end of file diff --git a/gateway/src/main/java/ru/practicum/shareit/booking/dto/BookingState.java b/gateway/src/main/java/ru/practicum/shareit/booking/dto/BookingState.java new file mode 100644 index 0000000..943af85 --- /dev/null +++ b/gateway/src/main/java/ru/practicum/shareit/booking/dto/BookingState.java @@ -0,0 +1,27 @@ +package ru.practicum.shareit.booking.dto; + +import java.util.Optional; + +public enum BookingState { + // Все + ALL, + // Текущие + CURRENT, + // Будущие + FUTURE, + // Завершенные + PAST, + // Отклоненные + REJECTED, + // Ожидающие подтверждения + WAITING; + + public static Optional from(String stringState) { + for (BookingState state : values()) { + if (state.name().equalsIgnoreCase(stringState)) { + return Optional.of(state); + } + } + return Optional.empty(); + } +} \ No newline at end of file diff --git a/gateway/src/main/java/ru/practicum/shareit/client/BaseClient.java b/gateway/src/main/java/ru/practicum/shareit/client/BaseClient.java new file mode 100644 index 0000000..f9781be --- /dev/null +++ b/gateway/src/main/java/ru/practicum/shareit/client/BaseClient.java @@ -0,0 +1,121 @@ +package ru.practicum.shareit.client; + +import java.util.List; +import java.util.Map; + +import org.springframework.http.HttpEntity; +import org.springframework.http.HttpHeaders; +import org.springframework.http.HttpMethod; +import org.springframework.http.MediaType; +import org.springframework.http.ResponseEntity; +import org.springframework.lang.Nullable; +import org.springframework.web.client.HttpStatusCodeException; +import org.springframework.web.client.RestTemplate; + +public class BaseClient { + protected final RestTemplate rest; + + public BaseClient(RestTemplate rest) { + this.rest = rest; + } + + protected ResponseEntity get(String path) { + return get(path, null, null); + } + + protected ResponseEntity get(String path, long userId) { + return get(path, userId, null); + } + + protected ResponseEntity get(String path, Long userId, @Nullable Map parameters) { + return makeAndSendRequest(HttpMethod.GET, path, userId, parameters, null); + } + + protected ResponseEntity post(String path, T body) { + return post(path, null, null, body); + } + + protected ResponseEntity post(String path, long userId, T body) { + return post(path, userId, null, body); + } + + protected ResponseEntity post(String path, Long userId, @Nullable Map parameters, T body) { + return makeAndSendRequest(HttpMethod.POST, path, userId, parameters, body); + } + + protected ResponseEntity put(String path, long userId, T body) { + return put(path, userId, null, body); + } + + protected ResponseEntity put(String path, long userId, @Nullable Map parameters, T body) { + return makeAndSendRequest(HttpMethod.PUT, path, userId, parameters, body); + } + + protected ResponseEntity patch(String path, T body) { + return patch(path, null, null, body); + } + + protected ResponseEntity patch(String path, long userId) { + return patch(path, userId, null, null); + } + + protected ResponseEntity patch(String path, long userId, T body) { + return patch(path, userId, null, body); + } + + protected ResponseEntity patch(String path, Long userId, @Nullable Map parameters, T body) { + return makeAndSendRequest(HttpMethod.PATCH, path, userId, parameters, body); + } + + protected ResponseEntity delete(String path) { + return delete(path, null, null); + } + + protected ResponseEntity delete(String path, long userId) { + return delete(path, userId, null); + } + + protected ResponseEntity delete(String path, Long userId, @Nullable Map parameters) { + return makeAndSendRequest(HttpMethod.DELETE, path, userId, parameters, null); + } + + private ResponseEntity makeAndSendRequest(HttpMethod method, String path, Long userId, @Nullable Map parameters, @Nullable T body) { + HttpEntity requestEntity = new HttpEntity<>(body, defaultHeaders(userId)); + + ResponseEntity shareitServerResponse; + try { + if (parameters != null) { + shareitServerResponse = rest.exchange(path, method, requestEntity, Object.class, parameters); + } else { + shareitServerResponse = rest.exchange(path, method, requestEntity, Object.class); + } + } catch (HttpStatusCodeException e) { + return ResponseEntity.status(e.getStatusCode()).body(e.getResponseBodyAsByteArray()); + } + return prepareGatewayResponse(shareitServerResponse); + } + + private HttpHeaders defaultHeaders(Long userId) { + HttpHeaders headers = new HttpHeaders(); + headers.setContentType(MediaType.APPLICATION_JSON); + headers.setAccept(List.of(MediaType.APPLICATION_JSON)); + if (userId != null) { + headers.set("X-Sharer-User-Id", String.valueOf(userId)); + } + return headers; + } + + private static ResponseEntity prepareGatewayResponse(ResponseEntity response) { + if (response.getStatusCode().is2xxSuccessful()) { + return response; + } + + ResponseEntity.BodyBuilder responseBuilder = ResponseEntity.status(response.getStatusCode()); + + if (response.hasBody()) { + return responseBuilder.body(response.getBody()); + } + + return responseBuilder.build(); + } +} \ No newline at end of file diff --git a/gateway/src/main/resources/application.properties b/gateway/src/main/resources/application.properties new file mode 100644 index 0000000..2ee0851 --- /dev/null +++ b/gateway/src/main/resources/application.properties @@ -0,0 +1,7 @@ +logging.level.org.springframework.web.client.RestTemplate=DEBUG +#logging.level.org.apache.http=DEBUG +#logging.level.httpclient.wire=DEBUG + +server.port=8080 + +shareit-server.url=http://localhost:9090 \ No newline at end of file diff --git a/pom.xml b/pom.xml index 7585826..5acfe0b 100644 --- a/pom.xml +++ b/pom.xml @@ -11,6 +11,7 @@ ru.practicum shareit + pom 0.0.1-SNAPSHOT ShareIt @@ -19,88 +20,29 @@ 21 - - - org.springframework.boot - spring-boot-starter-web - - - org.springframework.boot - spring-boot-starter-actuator - - - org.springframework.boot - spring-boot-configuration-processor - true - - - - org.postgresql - postgresql - runtime - - - - org.projectlombok - lombok - true - - - - com.h2database - h2 - test - - - org.springframework.boot - spring-boot-starter-test - test - - - org.springframework.boot - spring-boot-starter-validation - - - - org.zalando - logbook-spring-boot-starter - 3.7.2 - - - - org.postgresql - postgresql - - - - org.springframework.boot - spring-boot-starter-data-jpa - - + + server + gateway + - - - src/main/resources - true - - - - - org.springframework.boot - spring-boot-maven-plugin - - - - org.projectlombok - lombok - - - - - + + org.springframework.boot + spring-boot-maven-plugin + + + true + + + + org.projectlombok + lombok + + + + org.apache.maven.plugins maven-surefire-plugin @@ -247,17 +189,5 @@ - - coverage - - - - org.jacoco - jacoco-maven-plugin - - - - - - + \ No newline at end of file diff --git a/server/Dockerfile b/server/Dockerfile new file mode 100644 index 0000000..0ff1817 --- /dev/null +++ b/server/Dockerfile @@ -0,0 +1,5 @@ +FROM eclipse-temurin:21-jre-jammy +VOLUME /tmp +ARG JAR_FILE=target/*.jar +COPY ${JAR_FILE} app.jar +ENTRYPOINT ["sh", "-c", "java ${JAVA_OPTS} -jar /app.jar"] \ No newline at end of file diff --git a/server/pom.xml b/server/pom.xml new file mode 100644 index 0000000..a818223 --- /dev/null +++ b/server/pom.xml @@ -0,0 +1,92 @@ + + + 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 + + + + org.springframework.boot + spring-boot-starter-validation + + + + + + + + org.springframework.boot + spring-boot-maven-plugin + + + + + + + coverage + + + + org.jacoco + jacoco-maven-plugin + + + + + + + \ No newline at end of file diff --git a/src/main/java/ru/practicum/shareit/advisor/ErrorAdvisor.java b/server/src/main/java/ru/practicum/shareit/ErrorAdvisor.java similarity index 99% rename from src/main/java/ru/practicum/shareit/advisor/ErrorAdvisor.java rename to server/src/main/java/ru/practicum/shareit/ErrorAdvisor.java index bb420cb..b9c5a5a 100644 --- a/src/main/java/ru/practicum/shareit/advisor/ErrorAdvisor.java +++ b/server/src/main/java/ru/practicum/shareit/ErrorAdvisor.java @@ -1,4 +1,4 @@ -package ru.practicum.shareit.advisor; +package ru.practicum.shareit; import lombok.extern.slf4j.Slf4j; import org.springframework.http.HttpStatus; diff --git a/src/main/java/ru/practicum/shareit/advisor/ErrorMessage.java b/server/src/main/java/ru/practicum/shareit/ErrorMessage.java similarity index 86% rename from src/main/java/ru/practicum/shareit/advisor/ErrorMessage.java rename to server/src/main/java/ru/practicum/shareit/ErrorMessage.java index 59e7e9b..6d92e26 100644 --- a/src/main/java/ru/practicum/shareit/advisor/ErrorMessage.java +++ b/server/src/main/java/ru/practicum/shareit/ErrorMessage.java @@ -1,4 +1,4 @@ -package ru.practicum.shareit.advisor; +package ru.practicum.shareit; import lombok.AllArgsConstructor; import lombok.Getter; diff --git a/src/main/java/ru/practicum/shareit/ShareItApp.java b/server/src/main/java/ru/practicum/shareit/ShareItServer.java similarity index 72% rename from src/main/java/ru/practicum/shareit/ShareItApp.java rename to server/src/main/java/ru/practicum/shareit/ShareItServer.java index a10a87d..e793b9c 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); } -} +} \ No newline at end of file diff --git a/src/main/java/ru/practicum/shareit/booking/Booking.java b/server/src/main/java/ru/practicum/shareit/booking/Booking.java similarity index 100% rename from src/main/java/ru/practicum/shareit/booking/Booking.java rename to server/src/main/java/ru/practicum/shareit/booking/Booking.java diff --git a/src/main/java/ru/practicum/shareit/booking/BookingController.java b/server/src/main/java/ru/practicum/shareit/booking/BookingController.java similarity index 100% rename from src/main/java/ru/practicum/shareit/booking/BookingController.java rename to server/src/main/java/ru/practicum/shareit/booking/BookingController.java diff --git a/src/main/java/ru/practicum/shareit/booking/BookingMapper.java b/server/src/main/java/ru/practicum/shareit/booking/BookingMapper.java similarity index 100% rename from src/main/java/ru/practicum/shareit/booking/BookingMapper.java rename to server/src/main/java/ru/practicum/shareit/booking/BookingMapper.java diff --git a/src/main/java/ru/practicum/shareit/booking/dto/BookingDto.java b/server/src/main/java/ru/practicum/shareit/booking/dto/BookingDto.java similarity index 100% rename from src/main/java/ru/practicum/shareit/booking/dto/BookingDto.java rename to server/src/main/java/ru/practicum/shareit/booking/dto/BookingDto.java diff --git a/src/main/java/ru/practicum/shareit/booking/enums/BookingStatus.java b/server/src/main/java/ru/practicum/shareit/booking/enums/BookingStatus.java similarity index 100% rename from src/main/java/ru/practicum/shareit/booking/enums/BookingStatus.java rename to server/src/main/java/ru/practicum/shareit/booking/enums/BookingStatus.java diff --git a/src/main/java/ru/practicum/shareit/booking/enums/SearchState.java b/server/src/main/java/ru/practicum/shareit/booking/enums/SearchState.java similarity index 100% rename from src/main/java/ru/practicum/shareit/booking/enums/SearchState.java rename to server/src/main/java/ru/practicum/shareit/booking/enums/SearchState.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 100% rename from src/main/java/ru/practicum/shareit/booking/service/BookingService.java rename to server/src/main/java/ru/practicum/shareit/booking/service/BookingService.java diff --git a/src/main/java/ru/practicum/shareit/booking/service/BookingServiceImpl.java b/server/src/main/java/ru/practicum/shareit/booking/service/BookingServiceImpl.java similarity index 100% rename from src/main/java/ru/practicum/shareit/booking/service/BookingServiceImpl.java rename to server/src/main/java/ru/practicum/shareit/booking/service/BookingServiceImpl.java diff --git a/src/main/java/ru/practicum/shareit/excepton/AccessDeniedException.java b/server/src/main/java/ru/practicum/shareit/excepton/AccessDeniedException.java similarity index 100% rename from src/main/java/ru/practicum/shareit/excepton/AccessDeniedException.java rename to server/src/main/java/ru/practicum/shareit/excepton/AccessDeniedException.java diff --git a/src/main/java/ru/practicum/shareit/excepton/ConflictException.java b/server/src/main/java/ru/practicum/shareit/excepton/ConflictException.java similarity index 100% rename from src/main/java/ru/practicum/shareit/excepton/ConflictException.java rename to server/src/main/java/ru/practicum/shareit/excepton/ConflictException.java diff --git a/src/main/java/ru/practicum/shareit/excepton/InternalServerException.java b/server/src/main/java/ru/practicum/shareit/excepton/InternalServerException.java similarity index 100% rename from src/main/java/ru/practicum/shareit/excepton/InternalServerException.java rename to server/src/main/java/ru/practicum/shareit/excepton/InternalServerException.java diff --git a/src/main/java/ru/practicum/shareit/excepton/NotFoundException.java b/server/src/main/java/ru/practicum/shareit/excepton/NotFoundException.java similarity index 100% rename from src/main/java/ru/practicum/shareit/excepton/NotFoundException.java rename to server/src/main/java/ru/practicum/shareit/excepton/NotFoundException.java diff --git a/src/main/java/ru/practicum/shareit/excepton/ValidationException.java b/server/src/main/java/ru/practicum/shareit/excepton/ValidationException.java similarity index 100% rename from src/main/java/ru/practicum/shareit/excepton/ValidationException.java rename to server/src/main/java/ru/practicum/shareit/excepton/ValidationException.java diff --git a/src/main/java/ru/practicum/shareit/item/CommentMapper.java b/server/src/main/java/ru/practicum/shareit/item/CommentMapper.java similarity index 100% rename from src/main/java/ru/practicum/shareit/item/CommentMapper.java rename to server/src/main/java/ru/practicum/shareit/item/CommentMapper.java diff --git a/src/main/java/ru/practicum/shareit/item/ItemController.java b/server/src/main/java/ru/practicum/shareit/item/ItemController.java similarity index 100% rename from src/main/java/ru/practicum/shareit/item/ItemController.java rename to server/src/main/java/ru/practicum/shareit/item/ItemController.java diff --git a/src/main/java/ru/practicum/shareit/item/ItemMapper.java b/server/src/main/java/ru/practicum/shareit/item/ItemMapper.java similarity index 100% rename from src/main/java/ru/practicum/shareit/item/ItemMapper.java rename to server/src/main/java/ru/practicum/shareit/item/ItemMapper.java diff --git a/src/main/java/ru/practicum/shareit/item/dto/CommentDto.java b/server/src/main/java/ru/practicum/shareit/item/dto/CommentDto.java similarity index 100% rename from src/main/java/ru/practicum/shareit/item/dto/CommentDto.java rename to server/src/main/java/ru/practicum/shareit/item/dto/CommentDto.java diff --git a/src/main/java/ru/practicum/shareit/item/dto/ItemCommentsDto.java b/server/src/main/java/ru/practicum/shareit/item/dto/ItemCommentsDto.java similarity index 100% rename from src/main/java/ru/practicum/shareit/item/dto/ItemCommentsDto.java rename to server/src/main/java/ru/practicum/shareit/item/dto/ItemCommentsDto.java diff --git a/src/main/java/ru/practicum/shareit/item/dto/ItemDto.java b/server/src/main/java/ru/practicum/shareit/item/dto/ItemDto.java similarity index 100% rename from src/main/java/ru/practicum/shareit/item/dto/ItemDto.java rename to server/src/main/java/ru/practicum/shareit/item/dto/ItemDto.java diff --git a/src/main/java/ru/practicum/shareit/item/dto/ItemShortDto.java b/server/src/main/java/ru/practicum/shareit/item/dto/ItemShortDto.java similarity index 100% rename from src/main/java/ru/practicum/shareit/item/dto/ItemShortDto.java rename to server/src/main/java/ru/practicum/shareit/item/dto/ItemShortDto.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/CommentService.java b/server/src/main/java/ru/practicum/shareit/item/service/CommentService.java similarity index 100% rename from src/main/java/ru/practicum/shareit/item/service/CommentService.java rename to server/src/main/java/ru/practicum/shareit/item/service/CommentService.java diff --git a/src/main/java/ru/practicum/shareit/item/service/CommentServiceImpl.java b/server/src/main/java/ru/practicum/shareit/item/service/CommentServiceImpl.java similarity index 100% rename from src/main/java/ru/practicum/shareit/item/service/CommentServiceImpl.java rename to server/src/main/java/ru/practicum/shareit/item/service/CommentServiceImpl.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/ItemRequest.java b/server/src/main/java/ru/practicum/shareit/request/ItemRequest.java similarity index 100% rename from src/main/java/ru/practicum/shareit/request/ItemRequest.java rename to server/src/main/java/ru/practicum/shareit/request/ItemRequest.java diff --git a/src/main/java/ru/practicum/shareit/request/ItemRequestController.java b/server/src/main/java/ru/practicum/shareit/request/ItemRequestController.java similarity index 100% rename from src/main/java/ru/practicum/shareit/request/ItemRequestController.java rename to server/src/main/java/ru/practicum/shareit/request/ItemRequestController.java diff --git a/src/main/java/ru/practicum/shareit/request/ItemRequestMapper.java b/server/src/main/java/ru/practicum/shareit/request/ItemRequestMapper.java similarity index 100% rename from src/main/java/ru/practicum/shareit/request/ItemRequestMapper.java rename to server/src/main/java/ru/practicum/shareit/request/ItemRequestMapper.java diff --git a/src/main/java/ru/practicum/shareit/request/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/RequestWithItemsDto.java b/server/src/main/java/ru/practicum/shareit/request/dto/RequestWithItemsDto.java similarity index 100% rename from src/main/java/ru/practicum/shareit/request/dto/RequestWithItemsDto.java rename to server/src/main/java/ru/practicum/shareit/request/dto/RequestWithItemsDto.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 100% rename from src/main/java/ru/practicum/shareit/request/service/ItemRequestServiceImpl.java rename to server/src/main/java/ru/practicum/shareit/request/service/ItemRequestServiceImpl.java diff --git a/src/main/java/ru/practicum/shareit/user/User.java b/server/src/main/java/ru/practicum/shareit/user/User.java similarity index 100% rename from src/main/java/ru/practicum/shareit/user/User.java rename to server/src/main/java/ru/practicum/shareit/user/User.java diff --git a/src/main/java/ru/practicum/shareit/user/UserController.java b/server/src/main/java/ru/practicum/shareit/user/UserController.java similarity index 100% rename from src/main/java/ru/practicum/shareit/user/UserController.java rename to server/src/main/java/ru/practicum/shareit/user/UserController.java diff --git a/src/main/java/ru/practicum/shareit/user/UserMapper.java b/server/src/main/java/ru/practicum/shareit/user/UserMapper.java similarity index 100% rename from src/main/java/ru/practicum/shareit/user/UserMapper.java rename to server/src/main/java/ru/practicum/shareit/user/UserMapper.java diff --git a/src/main/java/ru/practicum/shareit/user/dto/UserDto.java b/server/src/main/java/ru/practicum/shareit/user/dto/UserDto.java similarity index 100% rename from src/main/java/ru/practicum/shareit/user/dto/UserDto.java rename to server/src/main/java/ru/practicum/shareit/user/dto/UserDto.java diff --git a/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/src/main/java/ru/practicum/shareit/validator/ValidAction.java b/server/src/main/java/ru/practicum/shareit/validator/ValidAction.java similarity index 100% rename from src/main/java/ru/practicum/shareit/validator/ValidAction.java rename to server/src/main/java/ru/practicum/shareit/validator/ValidAction.java diff --git a/src/main/resources/application.properties b/server/src/main/resources/application.properties similarity index 75% rename from src/main/resources/application.properties rename to server/src/main/resources/application.properties index 078aa54..4d0b782 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.format_sql=true spring.sql.init.mode=always @@ -9,12 +11,8 @@ logging.level.org.zalando.logbook=TRACE #logging.level.org.springframework.transaction.interceptor=TRACE #logging.level.org.springframework.orm.jpa.JpaTransactionManager=DEBUG -# TODO Append connection to DB -#spring.datasource.driverClassName -#spring.datasource.url -#spring.datasource.username -#spring.datasource.password spring.datasource.driverClassName=org.postgresql.Driver spring.datasource.url=jdbc:postgresql://192.168.0.102:5432/shareitdb spring.datasource.username=test -spring.datasource.password=test \ No newline at end of file +spring.datasource.password=test + 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 From 4fc8994eece56d101f43a31816787bbb0588af60 Mon Sep 17 00:00:00 2001 From: andrej1307 Date: Thu, 24 Apr 2025 16:20:45 +0700 Subject: [PATCH 08/46] =?UTF-8?q?feat:=20=20=D0=B4=D0=BE=D0=B1=D0=B0=D0=B2?= =?UTF-8?q?=D0=BB=D0=B5=D0=BD=20=D0=BF=D0=B0=D0=BA=D0=B5=D1=82=20user=20?= =?UTF-8?q?=D0=B2=20=D0=BC=D0=BE=D0=B4=D1=83=D0=BB=D1=8C=20gateway?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docker-compose.yml | 39 +++++++++++++++++++ .../practicum/shareit/client/dto/UserDto.java | 21 ++++++++++ .../ru/practicum/shareit/user/UserClient.java | 28 +++++++++++++ .../shareit/validator/ValidAction.java | 10 +++++ .../src/main/resources/application.properties | 14 ++++--- server/src/main/resources/schema.sql | 10 ++--- 6 files changed, 112 insertions(+), 10 deletions(-) create mode 100644 docker-compose.yml create mode 100644 gateway/src/main/java/ru/practicum/shareit/client/dto/UserDto.java create mode 100644 gateway/src/main/java/ru/practicum/shareit/user/UserClient.java create mode 100644 gateway/src/main/java/ru/practicum/shareit/validator/ValidAction.java diff --git a/docker-compose.yml b/docker-compose.yml new file mode 100644 index 0000000..abe6570 --- /dev/null +++ b/docker-compose.yml @@ -0,0 +1,39 @@ +services: + gateway: + build: gateway + image: shareit-gateway + container_name: shareit-gateway + ports: + - "8080:8080" + depends_on: + - server + environment: + - SHAREIT_SERVER_URL=http://server:9090 + + server: + build: server + image: shareit-server + container_name: shareit-server + ports: + - "9090:9090" + depends_on: + - db + environment: + - SPRING_DATASOURCE_URL=jdbc:postgresql://db:5432/shareit + - SPRING_DATASOURCE_USERNAME=shareit + - SPRING_DATASOURCE_PASSWORD=shareit + + db: + image: postgres:16.1 + container_name: postgres + ports: + - "6541:5432" + environment: + - POSTGRES_PASSWORD=shareit + - POSTGRES_USER=shareit + - POSTGRES_DB=shareit + healthcheck: + test: pg_isready -q -d $$POSTGRES_DB -U $$POSTGRES_USER + timeout: 5s + interval: 5s + retries: 10 \ No newline at end of file diff --git a/gateway/src/main/java/ru/practicum/shareit/client/dto/UserDto.java b/gateway/src/main/java/ru/practicum/shareit/client/dto/UserDto.java new file mode 100644 index 0000000..ffbb306 --- /dev/null +++ b/gateway/src/main/java/ru/practicum/shareit/client/dto/UserDto.java @@ -0,0 +1,21 @@ +package ru.practicum.shareit.client.dto; + +import jakarta.validation.constraints.Email; +import jakarta.validation.constraints.NotBlank; +import lombok.AllArgsConstructor; +import lombok.Data; +import ru.practicum.shareit.validator.ValidAction; + +@Data +@AllArgsConstructor +public class UserDto { + private Long id; + + @NotBlank(message = "Имя не может быть пустым", groups = {ValidAction.OnCreate.class}) + private String name; + + @NotBlank(message = "Email не может быть пустым", groups = {ValidAction.OnCreate.class}) + @Email(message = "Email должен удовлетворять правилам формирования почтовых адресов.", + groups = {ValidAction.OnCreate.class, ValidAction.OnUpdate.class}) + private String email; +} diff --git a/gateway/src/main/java/ru/practicum/shareit/user/UserClient.java b/gateway/src/main/java/ru/practicum/shareit/user/UserClient.java new file mode 100644 index 0000000..0679be1 --- /dev/null +++ b/gateway/src/main/java/ru/practicum/shareit/user/UserClient.java @@ -0,0 +1,28 @@ +package ru.practicum.shareit.user; + +import org.springframework.beans.factory.annotation.Value; +import org.springframework.http.ResponseEntity; +import org.springframework.http.client.HttpComponentsClientHttpRequestFactory; +import org.springframework.boot.web.client.RestTemplateBuilder; +import org.springframework.stereotype.Service; +import org.springframework.web.util.DefaultUriBuilderFactory; +import ru.practicum.shareit.booking.dto.BookItemRequestDto; +import ru.practicum.shareit.client.BaseClient; +import ru.practicum.shareit.client.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(() -> new HttpComponentsClientHttpRequestFactory()) + .build() + ); + } + public ResponseEntity addUser(UserDto userDto) { + return post("", userDto); + } +} diff --git a/gateway/src/main/java/ru/practicum/shareit/validator/ValidAction.java b/gateway/src/main/java/ru/practicum/shareit/validator/ValidAction.java new file mode 100644 index 0000000..ff5aae4 --- /dev/null +++ b/gateway/src/main/java/ru/practicum/shareit/validator/ValidAction.java @@ -0,0 +1,10 @@ +package ru.practicum.shareit.validator; + +public interface ValidAction { + + interface OnCreate { + } + + interface OnUpdate { + } +} \ No newline at end of file diff --git a/server/src/main/resources/application.properties b/server/src/main/resources/application.properties index 4d0b782..2f7d22a 100644 --- a/server/src/main/resources/application.properties +++ b/server/src/main/resources/application.properties @@ -1,4 +1,4 @@ -server.port=9090 +server.port=8080 spring.jpa.hibernate.ddl-auto=none spring.jpa.properties.hibernate.format_sql=true @@ -11,8 +11,12 @@ logging.level.org.zalando.logbook=TRACE #logging.level.org.springframework.transaction.interceptor=TRACE #logging.level.org.springframework.orm.jpa.JpaTransactionManager=DEBUG -spring.datasource.driverClassName=org.postgresql.Driver -spring.datasource.url=jdbc:postgresql://192.168.0.102:5432/shareitdb -spring.datasource.username=test -spring.datasource.password=test +#spring.datasource.driverClassName=org.postgresql.Driver +#spring.datasource.url=jdbc:postgresql://192.168.0.102:5432/shareitdb +#spring.datasource.username=test +#spring.datasource.password=test +spring.datasource.driverClassName=org.h2.Driver +spring.datasource.url=jdbc:h2:mem:shareit +spring.datasource.username=shareit +spring.datasource.password=shareit diff --git a/server/src/main/resources/schema.sql b/server/src/main/resources/schema.sql index 191d306..8e5d1e8 100644 --- a/server/src/main/resources/schema.sql +++ b/server/src/main/resources/schema.sql @@ -1,8 +1,8 @@ -DROP TABLE bookings; -DROP TABLE comments; -DROP TABLE items; -DROP TABLE itemrequests; -DROP TABLE users; +-- DROP TABLE bookings; +-- DROP TABLE comments; +-- DROP TABLE items; +-- DROP TABLE itemrequests; +-- DROP TABLE users; CREATE TABLE IF NOT EXISTS users ( id BIGINT GENERATED BY DEFAULT AS IDENTITY NOT NULL, From bd53ca8290b911e247f0ca3bbfc3e5ba11739504 Mon Sep 17 00:00:00 2001 From: Andrej Stelmaschuk Date: Thu, 24 Apr 2025 21:27:20 +0700 Subject: [PATCH 09/46] =?UTF-8?q?feat:=20=D1=80=D0=B5=D0=B0=D0=BB=D0=B8?= =?UTF-8?q?=D0=B7=D0=BE=D0=B2=D0=B0=D0=BD=D0=B0=20=D1=80=D0=B0=D0=B1=D0=BE?= =?UTF-8?q?=D1=82=D0=B0=20=D1=88=D0=BB=D1=8E=D0=B7=D0=B0=20=D1=81=20=D0=BE?= =?UTF-8?q?=D0=B1=D1=8A=D0=B5=D0=BA=D1=82=D0=B0=D0=BC=D0=B8=20User?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../shareit/advisor/ErrorAdvisor.java | 52 ++++++++++ .../shareit/advisor}/ErrorMessage.java | 2 +- .../shareit/booking/BookingClient.java | 5 +- .../shareit/booking/BookingController.java | 15 +-- .../booking/dto/BookItemRequestDto.java | 4 +- .../practicum/shareit/client/BaseClient.java | 40 ++++---- .../ru/practicum/shareit/user/UserClient.java | 22 ++++- .../shareit/user/UserController.java | 95 +++++++++++++++++++ .../shareit/{client => user}/dto/UserDto.java | 2 +- .../shareit/{ => advisor}/ErrorAdvisor.java | 2 +- .../shareit/advisor/ErrorMessage.java | 13 +++ .../src/main/resources/application.properties | 2 +- 12 files changed, 209 insertions(+), 45 deletions(-) create mode 100644 gateway/src/main/java/ru/practicum/shareit/advisor/ErrorAdvisor.java rename {server/src/main/java/ru/practicum/shareit => gateway/src/main/java/ru/practicum/shareit/advisor}/ErrorMessage.java (86%) create mode 100644 gateway/src/main/java/ru/practicum/shareit/user/UserController.java rename gateway/src/main/java/ru/practicum/shareit/{client => user}/dto/UserDto.java (94%) rename server/src/main/java/ru/practicum/shareit/{ => advisor}/ErrorAdvisor.java (99%) create mode 100644 server/src/main/java/ru/practicum/shareit/advisor/ErrorMessage.java diff --git a/gateway/src/main/java/ru/practicum/shareit/advisor/ErrorAdvisor.java b/gateway/src/main/java/ru/practicum/shareit/advisor/ErrorAdvisor.java new file mode 100644 index 0000000..28c58a2 --- /dev/null +++ b/gateway/src/main/java/ru/practicum/shareit/advisor/ErrorAdvisor.java @@ -0,0 +1,52 @@ +package ru.practicum.shareit.advisor; + +import lombok.extern.slf4j.Slf4j; +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 java.util.List; +import java.util.stream.Collectors; + +/** + * Класс обработки исключений при обработке поступивших http запросов + */ +@Slf4j +@RestControllerAdvice +public class ErrorAdvisor { + + /** + * Обработка исключения MethodArgumentNotValidException - при проверке аргумента метода + * + * @param e - исключение + * @return - список нарушений для отображения в теле ответа + */ + @ExceptionHandler(MethodArgumentNotValidException.class) + @ResponseStatus(HttpStatus.BAD_REQUEST) + public ErrorMessage onMethodArgumentNotValidException( + MethodArgumentNotValidException e + ) { + final List violations = e.getBindingResult().getFieldErrors().stream() + .map(error -> new ErrorMessage("[" + error.getField() + "] " + + error.getDefaultMessage())) + .collect(Collectors.toList()); + log.info("400 {}.", e.getMessage()); + return violations.get(0); + } + + /** + * Обработка непредвиденного исключения + * + * @param e - исключение + * @return - сообщение об ошибке + */ + @ExceptionHandler + @ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR) + public ErrorMessage handleException(final Exception e) { + log.warn("Error", e); + return new ErrorMessage(e.getMessage()); + } +} + diff --git a/server/src/main/java/ru/practicum/shareit/ErrorMessage.java b/gateway/src/main/java/ru/practicum/shareit/advisor/ErrorMessage.java similarity index 86% rename from server/src/main/java/ru/practicum/shareit/ErrorMessage.java rename to gateway/src/main/java/ru/practicum/shareit/advisor/ErrorMessage.java index 6d92e26..59e7e9b 100644 --- a/server/src/main/java/ru/practicum/shareit/ErrorMessage.java +++ b/gateway/src/main/java/ru/practicum/shareit/advisor/ErrorMessage.java @@ -1,4 +1,4 @@ -package ru.practicum.shareit; +package ru.practicum.shareit.advisor; import lombok.AllArgsConstructor; import lombok.Getter; diff --git a/gateway/src/main/java/ru/practicum/shareit/booking/BookingClient.java b/gateway/src/main/java/ru/practicum/shareit/booking/BookingClient.java index 916528c..36ae12f 100644 --- a/gateway/src/main/java/ru/practicum/shareit/booking/BookingClient.java +++ b/gateway/src/main/java/ru/practicum/shareit/booking/BookingClient.java @@ -1,7 +1,5 @@ package ru.practicum.shareit.booking; -import java.util.Map; - import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.boot.web.client.RestTemplateBuilder; @@ -9,11 +7,12 @@ import org.springframework.http.client.HttpComponentsClientHttpRequestFactory; import org.springframework.stereotype.Service; import org.springframework.web.util.DefaultUriBuilderFactory; - import ru.practicum.shareit.booking.dto.BookItemRequestDto; import ru.practicum.shareit.booking.dto.BookingState; import ru.practicum.shareit.client.BaseClient; +import java.util.Map; + @Service public class BookingClient extends BaseClient { private static final String API_PREFIX = "/bookings"; diff --git a/gateway/src/main/java/ru/practicum/shareit/booking/BookingController.java b/gateway/src/main/java/ru/practicum/shareit/booking/BookingController.java index 7b55542..2c3c448 100644 --- a/gateway/src/main/java/ru/practicum/shareit/booking/BookingController.java +++ b/gateway/src/main/java/ru/practicum/shareit/booking/BookingController.java @@ -1,21 +1,14 @@ package ru.practicum.shareit.booking; -import org.springframework.http.ResponseEntity; -import org.springframework.stereotype.Controller; -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 jakarta.validation.Valid; import jakarta.validation.constraints.Positive; import jakarta.validation.constraints.PositiveOrZero; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; +import org.springframework.http.ResponseEntity; +import org.springframework.stereotype.Controller; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; import ru.practicum.shareit.booking.dto.BookItemRequestDto; import ru.practicum.shareit.booking.dto.BookingState; diff --git a/gateway/src/main/java/ru/practicum/shareit/booking/dto/BookItemRequestDto.java b/gateway/src/main/java/ru/practicum/shareit/booking/dto/BookItemRequestDto.java index 8596ab7..9a3134e 100644 --- a/gateway/src/main/java/ru/practicum/shareit/booking/dto/BookItemRequestDto.java +++ b/gateway/src/main/java/ru/practicum/shareit/booking/dto/BookItemRequestDto.java @@ -1,13 +1,13 @@ package ru.practicum.shareit.booking.dto; -import java.time.LocalDateTime; - import jakarta.validation.constraints.Future; import jakarta.validation.constraints.FutureOrPresent; import lombok.AllArgsConstructor; import lombok.Getter; import lombok.NoArgsConstructor; +import java.time.LocalDateTime; + @Getter @NoArgsConstructor @AllArgsConstructor diff --git a/gateway/src/main/java/ru/practicum/shareit/client/BaseClient.java b/gateway/src/main/java/ru/practicum/shareit/client/BaseClient.java index f9781be..247e577 100644 --- a/gateway/src/main/java/ru/practicum/shareit/client/BaseClient.java +++ b/gateway/src/main/java/ru/practicum/shareit/client/BaseClient.java @@ -1,17 +1,13 @@ package ru.practicum.shareit.client; -import java.util.List; -import java.util.Map; - -import org.springframework.http.HttpEntity; -import org.springframework.http.HttpHeaders; -import org.springframework.http.HttpMethod; -import org.springframework.http.MediaType; -import org.springframework.http.ResponseEntity; +import org.springframework.http.*; 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; @@ -19,6 +15,20 @@ public BaseClient(RestTemplate rest) { this.rest = rest; } + 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(); + } + protected ResponseEntity get(String path) { return get(path, null, null); } @@ -104,18 +114,4 @@ private HttpHeaders defaultHeaders(Long 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(); - } } \ No newline at end of file diff --git a/gateway/src/main/java/ru/practicum/shareit/user/UserClient.java b/gateway/src/main/java/ru/practicum/shareit/user/UserClient.java index 0679be1..1f86137 100644 --- a/gateway/src/main/java/ru/practicum/shareit/user/UserClient.java +++ b/gateway/src/main/java/ru/practicum/shareit/user/UserClient.java @@ -1,14 +1,13 @@ package ru.practicum.shareit.user; 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.boot.web.client.RestTemplateBuilder; import org.springframework.stereotype.Service; import org.springframework.web.util.DefaultUriBuilderFactory; -import ru.practicum.shareit.booking.dto.BookItemRequestDto; import ru.practicum.shareit.client.BaseClient; -import ru.practicum.shareit.client.dto.UserDto; +import ru.practicum.shareit.user.dto.UserDto; @Service public class UserClient extends BaseClient { @@ -22,7 +21,24 @@ public UserClient(@Value("${shareit-server.url}") String serverUrl, RestTemplate .build() ); } + public ResponseEntity addUser(UserDto userDto) { return post("", userDto); } + + public ResponseEntity findUserByID(Long userId) { + return get("/" + userId, userId); + } + + public ResponseEntity findAllUsers() { + return get(""); + } + + public ResponseEntity updateUser(Long userId, UserDto userDto) { + return patch("/" + userId, userDto); + } + + public void deleteUser(Long userId) { + delete("/" + userId); + } } diff --git a/gateway/src/main/java/ru/practicum/shareit/user/UserController.java b/gateway/src/main/java/ru/practicum/shareit/user/UserController.java new file mode 100644 index 0000000..ed9058e --- /dev/null +++ b/gateway/src/main/java/ru/practicum/shareit/user/UserController.java @@ -0,0 +1,95 @@ +package ru.practicum.shareit.user; + +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.stereotype.Controller; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; +import ru.practicum.shareit.user.dto.UserDto; +import ru.practicum.shareit.validator.ValidAction; + +/** + * Класс обработки http запросов о пользователях. + */ +@Controller +@RequestMapping(path = "/users") +@RequiredArgsConstructor +@Slf4j +@Validated +public class UserController { + private final UserClient userClient; + + /* + public UserController(UserClient userClient) { + this.userClient = userClient; + } + */ + + /** + * Метод добавления нового пользователя. + * + * @param userDto - объект для добавления + * @return - подтверждение добавленного объекта + */ + @PostMapping + @ResponseStatus(HttpStatus.CREATED) + public ResponseEntity addNewUser(@Validated(ValidAction.OnCreate.class) @RequestBody UserDto userDto) { + log.info("Создаем пользователя : {}.", userDto.toString()); + return userClient.addUser(userDto); + } + + /** + * Метод поиска пользователя по идентификатору + * + * @param id - идентификатор + * @return - найденный объект + */ + @GetMapping("/{id}") + @ResponseStatus(HttpStatus.OK) + public ResponseEntity findUser(@PathVariable Long id) { + log.info("Ищем пользователя id={}.", id); + return userClient.findUserByID(id); + } + + /** + * Метод поиска всех пользователей + * + * @return - список пользователей + */ + @GetMapping + @ResponseStatus(HttpStatus.OK) + public ResponseEntity findAllUser() { + log.info("Запрашиваем список всех пользователей."); + return userClient.findAllUsers(); + } + + /** + * Метод обновления информации о пользователе. + * + * @param updUserDto - объект с обновленной информацией о пользователе + * @return - подтверждение обновленного объекта + */ + @PatchMapping("/{id}") + @ResponseStatus(HttpStatus.OK) + public ResponseEntity updateUser(@PathVariable Long id, + @Validated(ValidAction.OnUpdate.class) @RequestBody UserDto updUserDto) { + updUserDto.setId(id); + log.info("Обновляем данные о пользователе : {}", updUserDto); + return userClient.updateUser(id, updUserDto); + } + + /** + * Удаление пользователя по заданному идентификатору + * + * @param id - идентификатор пользователя + */ + @DeleteMapping("/{id}") + @ResponseStatus(HttpStatus.OK) + public void deleteUser(@PathVariable Long id) { + log.info("Удаляем пользователя id={}.", id); + userClient.deleteUser(id); + } +} + diff --git a/gateway/src/main/java/ru/practicum/shareit/client/dto/UserDto.java b/gateway/src/main/java/ru/practicum/shareit/user/dto/UserDto.java similarity index 94% rename from gateway/src/main/java/ru/practicum/shareit/client/dto/UserDto.java rename to gateway/src/main/java/ru/practicum/shareit/user/dto/UserDto.java index ffbb306..a3c7de7 100644 --- a/gateway/src/main/java/ru/practicum/shareit/client/dto/UserDto.java +++ b/gateway/src/main/java/ru/practicum/shareit/user/dto/UserDto.java @@ -1,4 +1,4 @@ -package ru.practicum.shareit.client.dto; +package ru.practicum.shareit.user.dto; import jakarta.validation.constraints.Email; import jakarta.validation.constraints.NotBlank; diff --git a/server/src/main/java/ru/practicum/shareit/ErrorAdvisor.java b/server/src/main/java/ru/practicum/shareit/advisor/ErrorAdvisor.java similarity index 99% rename from server/src/main/java/ru/practicum/shareit/ErrorAdvisor.java rename to server/src/main/java/ru/practicum/shareit/advisor/ErrorAdvisor.java index b9c5a5a..bb420cb 100644 --- a/server/src/main/java/ru/practicum/shareit/ErrorAdvisor.java +++ b/server/src/main/java/ru/practicum/shareit/advisor/ErrorAdvisor.java @@ -1,4 +1,4 @@ -package ru.practicum.shareit; +package ru.practicum.shareit.advisor; import lombok.extern.slf4j.Slf4j; import org.springframework.http.HttpStatus; diff --git a/server/src/main/java/ru/practicum/shareit/advisor/ErrorMessage.java b/server/src/main/java/ru/practicum/shareit/advisor/ErrorMessage.java new file mode 100644 index 0000000..59e7e9b --- /dev/null +++ b/server/src/main/java/ru/practicum/shareit/advisor/ErrorMessage.java @@ -0,0 +1,13 @@ +package ru.practicum.shareit.advisor; + +import lombok.AllArgsConstructor; +import lombok.Getter; + +/** + * Класс сообщения об ошибке выполнения запроса + */ +@Getter +@AllArgsConstructor +public class ErrorMessage { + private String error; +} diff --git a/server/src/main/resources/application.properties b/server/src/main/resources/application.properties index 2f7d22a..20ffdba 100644 --- a/server/src/main/resources/application.properties +++ b/server/src/main/resources/application.properties @@ -1,4 +1,4 @@ -server.port=8080 +server.port=9090 spring.jpa.hibernate.ddl-auto=none spring.jpa.properties.hibernate.format_sql=true From e047f2a376c915820e8d48916f93a820690636d2 Mon Sep 17 00:00:00 2001 From: Andrej Stelmaschuk Date: Thu, 24 Apr 2025 23:43:00 +0700 Subject: [PATCH 10/46] =?UTF-8?q?feat:=20=D1=80=D0=B5=D0=B0=D0=BB=D0=B8?= =?UTF-8?q?=D0=B7=D0=BE=D0=B2=D0=B0=D0=BD=D0=B0=20=D1=80=D0=B0=D0=B1=D0=BE?= =?UTF-8?q?=D1=82=D0=B0=20=D1=88=D0=BB=D1=8E=D0=B7=D0=B0=20=D1=81=20=D0=BE?= =?UTF-8?q?=D0=B1=D1=8A=D0=B5=D0=BA=D1=82=D0=B0=D0=BC=D0=B8=20Item?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ru/practicum/shareit/item/ItemClient.java | 51 +++++++++++++ .../shareit/item/ItemController.java | 76 +++++++++++++++++++ .../practicum/shareit/item/dto/ItemDto.java | 38 ++++++++++ .../shareit/user/UserController.java | 6 -- 4 files changed, 165 insertions(+), 6 deletions(-) create mode 100644 gateway/src/main/java/ru/practicum/shareit/item/ItemClient.java create mode 100644 gateway/src/main/java/ru/practicum/shareit/item/ItemController.java create mode 100644 gateway/src/main/java/ru/practicum/shareit/item/dto/ItemDto.java diff --git a/gateway/src/main/java/ru/practicum/shareit/item/ItemClient.java b/gateway/src/main/java/ru/practicum/shareit/item/ItemClient.java new file mode 100644 index 0000000..ba2c233 --- /dev/null +++ b/gateway/src/main/java/ru/practicum/shareit/item/ItemClient.java @@ -0,0 +1,51 @@ +package ru.practicum.shareit.item; + +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.ItemDto; + +import java.util.Map; + +@Service +public class ItemClient extends BaseClient { + private static final String API_PREFIX = "/items"; + + public ItemClient(@Value("${shareit-server.url}") String serverUrl, RestTemplateBuilder builder) { + super( + builder + .uriTemplateHandler(new DefaultUriBuilderFactory(serverUrl + API_PREFIX)) + .requestFactory(() -> new HttpComponentsClientHttpRequestFactory()) + .build() + ); + } + + public ResponseEntity createItem(Long ownerId, ItemDto itemDto) { + return post("", ownerId, itemDto); + } + + public ResponseEntity findItemById(Long itemId, Long userId) { + return get("/" + itemId, userId); + } + + public ResponseEntity findAllItems(Long userId) { + return get("", userId); + } + + public ResponseEntity searchItemsByText(Long ownerId, String text) { + Map parameters = Map.of("text", text); + return get("/search?text={text}", ownerId, parameters); + } + + public ResponseEntity updateItem(Long id, Long ownerId, ItemDto itemDto) { + return patch("/" + id, ownerId, itemDto); + } + + public void deleteItem(Long id, Long userId) { + delete("/" + id, userId); + } +} diff --git a/gateway/src/main/java/ru/practicum/shareit/item/ItemController.java b/gateway/src/main/java/ru/practicum/shareit/item/ItemController.java new file mode 100644 index 0000000..79e2726 --- /dev/null +++ b/gateway/src/main/java/ru/practicum/shareit/item/ItemController.java @@ -0,0 +1,76 @@ +package ru.practicum.shareit.item; + +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.stereotype.Controller; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; +import ru.practicum.shareit.item.dto.ItemDto; +import ru.practicum.shareit.validator.ValidAction; + +@Controller +@RequestMapping(path = "/items") +@RequiredArgsConstructor +@Slf4j +@Validated +public class ItemController { + private static final String HEADER_USER_ID = "X-Sharer-User-Id"; + private final ItemClient itemClient; + + @PostMapping + @ResponseStatus(HttpStatus.CREATED) + public ResponseEntity createItem( + @RequestHeader(HEADER_USER_ID) final Long ownerId, + @Validated(ValidAction.OnCreate.class) @RequestBody ItemDto itemDto) { + log.info("Пользователь id={} добавляет вещь : {}", ownerId, itemDto.toString()); + return itemClient.createItem(ownerId, itemDto); + } + + @GetMapping("/{id}") + @ResponseStatus(HttpStatus.OK) + public ResponseEntity findItem(@PathVariable Long id, + @RequestHeader(HEADER_USER_ID) Long userId) { + log.info("Польдователь id={} просматривает информацию о вещи id={}.", userId, id); + return itemClient.findItemById(id, userId); + } + + @GetMapping + @ResponseStatus(HttpStatus.OK) + public ResponseEntity findAllItems( + @RequestHeader(HEADER_USER_ID) final Long ownerId) { + log.info("Запрашиваем список вещей владельца id={}", ownerId); + return itemClient.findAllItems(ownerId); + } + + @GetMapping("/search") + @ResponseStatus(HttpStatus.OK) + public ResponseEntity onSearch( + @RequestHeader(HEADER_USER_ID) final Long userId, + @RequestParam(name = "text") String text) { + log.info("Ищем вещи содержащие текст \"{}\" в названии или описании.", text); + return itemClient.searchItemsByText(userId, text); + } + + @PatchMapping("/{id}") + @ResponseStatus(HttpStatus.OK) + public ResponseEntity updateItem( + @RequestHeader(HEADER_USER_ID) final Long ownerId, + @PathVariable Long id, + @RequestBody ItemDto itemDto) { + log.info("Пользователь id={} обновляет сведения об элемете id={} {}", ownerId, id, itemDto); + itemDto.setId(id); + return itemClient.updateItem(id, ownerId, itemDto); + } + + @DeleteMapping("/{id}") + @ResponseStatus(HttpStatus.OK) + public void deleteItem( + @RequestHeader(HEADER_USER_ID) final Long ownerId, + @PathVariable Long id) { + log.info("пользователь id={}. Удаляет вещь id={}", ownerId, id); + itemClient.deleteItem(id, ownerId); + } + +} diff --git a/gateway/src/main/java/ru/practicum/shareit/item/dto/ItemDto.java b/gateway/src/main/java/ru/practicum/shareit/item/dto/ItemDto.java new file mode 100644 index 0000000..3c384b3 --- /dev/null +++ b/gateway/src/main/java/ru/practicum/shareit/item/dto/ItemDto.java @@ -0,0 +1,38 @@ +package ru.practicum.shareit.item.dto; + +import jakarta.validation.constraints.NotBlank; +import jakarta.validation.constraints.NotNull; +import jakarta.validation.constraints.Size; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; +import ru.practicum.shareit.validator.ValidAction; + +import java.time.Instant; + +/** + * Класс описания представления объектов при обмене данными + */ +@Data +@AllArgsConstructor +@NoArgsConstructor +public class ItemDto { + private Long id; + + @NotBlank(message = "Имя не может быть пустым", groups = {ValidAction.OnCreate.class}) + private String name; + + @NotBlank(message = "Описание не может быть пустым", groups = {ValidAction.OnCreate.class}) + @Size(max = 200, message = "Максимальная длина описания - 200 символов.", + groups = {ValidAction.OnCreate.class, ValidAction.OnUpdate.class}) + private String description; + + @NotNull(message = "Доступ должен быть определен.", groups = {ValidAction.OnCreate.class}) + private Boolean available; + + private Long requestId; + + private Instant lastBooking; + private Instant nextBooking; +} + diff --git a/gateway/src/main/java/ru/practicum/shareit/user/UserController.java b/gateway/src/main/java/ru/practicum/shareit/user/UserController.java index ed9058e..56a04d5 100644 --- a/gateway/src/main/java/ru/practicum/shareit/user/UserController.java +++ b/gateway/src/main/java/ru/practicum/shareit/user/UserController.java @@ -21,12 +21,6 @@ public class UserController { private final UserClient userClient; - /* - public UserController(UserClient userClient) { - this.userClient = userClient; - } - */ - /** * Метод добавления нового пользователя. * From 584213f096ccd04a16e12c68aa7f4e7030dcd1d0 Mon Sep 17 00:00:00 2001 From: andrej1307 Date: Fri, 25 Apr 2025 15:03:26 +0700 Subject: [PATCH 11/46] =?UTF-8?q?feat:=20=D1=80=D0=B5=D0=B0=D0=BB=D0=B8?= =?UTF-8?q?=D0=B7=D0=BE=D0=B2=D0=B0=D0=BD=D0=B0=20=D1=80=D0=B0=D0=B1=D0=BE?= =?UTF-8?q?=D1=82=D0=B0=20=D1=88=D0=BB=D1=8E=D0=B7=D0=B0=20=D1=81=20=D0=BE?= =?UTF-8?q?=D0=B1=D1=8A=D0=B5=D0=BA=D1=82=D0=B0=D0=BC=D0=B8=20ItemRequest?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../shareit/request/ItemRequestClient.java | 40 ++++++++++ .../request/ItemRequestController.java | 74 +++++++++++++++++++ .../shareit/request/dto/ItemRequestDto.java | 23 ++++++ 3 files changed, 137 insertions(+) create mode 100644 gateway/src/main/java/ru/practicum/shareit/request/ItemRequestClient.java create mode 100644 gateway/src/main/java/ru/practicum/shareit/request/ItemRequestController.java create mode 100644 gateway/src/main/java/ru/practicum/shareit/request/dto/ItemRequestDto.java diff --git a/gateway/src/main/java/ru/practicum/shareit/request/ItemRequestClient.java b/gateway/src/main/java/ru/practicum/shareit/request/ItemRequestClient.java new file mode 100644 index 0000000..565e5fe --- /dev/null +++ b/gateway/src/main/java/ru/practicum/shareit/request/ItemRequestClient.java @@ -0,0 +1,40 @@ +package ru.practicum.shareit.request; + +import org.springframework.beans.factory.annotation.Value; +import org.springframework.boot.web.client.RestTemplateBuilder; +import org.springframework.http.ResponseEntity; +import org.springframework.http.client.HttpComponentsClientHttpRequestFactory; +import org.springframework.stereotype.Service; +import org.springframework.web.util.DefaultUriBuilderFactory; +import ru.practicum.shareit.client.BaseClient; +import ru.practicum.shareit.request.dto.ItemRequestDto; + +@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(() -> new HttpComponentsClientHttpRequestFactory()) + .build() + ); + } + + public ResponseEntity createRequest(Long customerId, ItemRequestDto itemRequestDto) { + return post("", customerId, itemRequestDto); + } + + public ResponseEntity findRequest(Long customerId, Long itemId) { + return get("/" + itemId, customerId); + } + + public ResponseEntity findRequestsByCustomerId(Long customerId) { + return get("", customerId); + } + + public ResponseEntity findAllRequests(Long customerId) { + return get("/all", customerId); + } +} diff --git a/gateway/src/main/java/ru/practicum/shareit/request/ItemRequestController.java b/gateway/src/main/java/ru/practicum/shareit/request/ItemRequestController.java new file mode 100644 index 0000000..3109331 --- /dev/null +++ b/gateway/src/main/java/ru/practicum/shareit/request/ItemRequestController.java @@ -0,0 +1,74 @@ +package ru.practicum.shareit.request; + +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.stereotype.Controller; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; +import ru.practicum.shareit.request.dto.ItemRequestDto; + +import java.util.List; + +@Controller +@RequestMapping(path = "/requests") +@RequiredArgsConstructor +@Slf4j +@Validated +public class ItemRequestController { + private static final String HEADER_USER_ID = "X-Sharer-User-Id"; + private final ItemRequestClient requestClient; + private final ItemRequestClient itemRequestClient; + + /** + * Создаем новый запрос + * + * @param customerId - идентификатор заказчика + * @param itemRequestDto - объект описания запроса + * @return - сохраненный запрос + * @throws Exception + */ + @PostMapping + @ResponseStatus(HttpStatus.CREATED) + public ResponseEntity createItemRequest( + @RequestHeader(HEADER_USER_ID) final Long customerId, + @RequestBody ItemRequestDto itemRequestDto) throws Exception { + log.info("Пользователь id={} делает заказ : {}", customerId, itemRequestDto.getDescription()); + return itemRequestClient.createRequest(customerId, itemRequestDto); + } + + /** + * Поиск запроса по идентификатору + */ + @GetMapping("/{id}") + @ResponseStatus(HttpStatus.OK) + public ResponseEntity findItemRequest( + @RequestHeader(HEADER_USER_ID) Long userId, + @PathVariable Long id) { + log.info("Пользователь id={} просматривает заказ id={}", userId, id); + return itemRequestClient.findRequest(userId, id); + } + + /** + * Поиск пользователем своих запросов + */ + @GetMapping("") + @ResponseStatus(HttpStatus.OK) + public ResponseEntity findRequestsByUserId( + @RequestHeader(HEADER_USER_ID) Long userId) { + log.info("Пользователь id={} просматривает свои заказы.", userId); + return itemRequestClient.findRequestsByCustomerId(userId); + } + + /** + * Поиск пользователем всех чужих запросов + */ + @GetMapping("/all") + @ResponseStatus(HttpStatus.OK) + public ResponseEntity findAllRequests( + @RequestHeader(HEADER_USER_ID) final Long userId) { + log.info("Пользователь id={} просматривает все заказы.", userId); + return itemRequestClient.findAllRequests(userId); + } +} diff --git a/gateway/src/main/java/ru/practicum/shareit/request/dto/ItemRequestDto.java b/gateway/src/main/java/ru/practicum/shareit/request/dto/ItemRequestDto.java new file mode 100644 index 0000000..045e2a5 --- /dev/null +++ b/gateway/src/main/java/ru/practicum/shareit/request/dto/ItemRequestDto.java @@ -0,0 +1,23 @@ +package ru.practicum.shareit.request.dto; + +import jakarta.validation.constraints.NotBlank; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; +import ru.practicum.shareit.user.dto.UserDto; + +import java.time.Instant; + +@Data +@AllArgsConstructor +@NoArgsConstructor +public class ItemRequestDto { + private Long id; + + @NotBlank(message = "Описание запроса не может быть пустым") + private String description; + + private UserDto requestor; + private Instant created; +} + From ec01591e90c52e69b80eb53ee7110b3e720af78b Mon Sep 17 00:00:00 2001 From: andrej1307 Date: Fri, 25 Apr 2025 16:47:49 +0700 Subject: [PATCH 12/46] =?UTF-8?q?feat:=20=D0=B4=D0=BE=D0=B1=D0=B0=D0=B2?= =?UTF-8?q?=D0=BB=D1=8F=D0=B5=D0=BC=20=D1=84=D1=83=D0=BD=D1=86=D0=B8=D0=B8?= =?UTF-8?q?=20=D0=B4=D0=BB=D1=8F=20=D1=80=D0=B0=D0=B1=D0=BE=D1=82=D1=8B=20?= =?UTF-8?q?=D1=81=20Booking?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../shareit/booking/BookingClient.java | 5 +++ .../shareit/booking/BookingController.java | 43 +++++++++++++++++-- .../shareit/booking/BookingController.java | 2 +- 3 files changed, 45 insertions(+), 5 deletions(-) diff --git a/gateway/src/main/java/ru/practicum/shareit/booking/BookingClient.java b/gateway/src/main/java/ru/practicum/shareit/booking/BookingClient.java index 36ae12f..68e1d72 100644 --- a/gateway/src/main/java/ru/practicum/shareit/booking/BookingClient.java +++ b/gateway/src/main/java/ru/practicum/shareit/booking/BookingClient.java @@ -44,4 +44,9 @@ public ResponseEntity bookItem(long userId, BookItemRequestDto requestDt public ResponseEntity getBooking(long userId, Long bookingId) { return get("/" + bookingId, userId); } + + public ResponseEntity approvedBooking(Long id, Long editorId, Boolean approved) { + Map parameters = Map.of("approved", approved ); + return patch("/" + id, editorId, parameters); + } } \ No newline at end of file diff --git a/gateway/src/main/java/ru/practicum/shareit/booking/BookingController.java b/gateway/src/main/java/ru/practicum/shareit/booking/BookingController.java index 2c3c448..4c09f3e 100644 --- a/gateway/src/main/java/ru/practicum/shareit/booking/BookingController.java +++ b/gateway/src/main/java/ru/practicum/shareit/booking/BookingController.java @@ -5,6 +5,7 @@ import jakarta.validation.constraints.PositiveOrZero; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; +import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; import org.springframework.stereotype.Controller; import org.springframework.validation.annotation.Validated; @@ -19,10 +20,19 @@ @Slf4j @Validated public class BookingController { + private static final String HEADER_USER_ID = "X-Sharer-User-Id"; private final BookingClient bookingClient; + /** + * Ищем бронирования в соответствмм со статусом + * @param userId - идентификатор пользователя + * @param stateParam - статус бронирования + * @param from + * @param size + * @return - результат поиска + */ @GetMapping - public ResponseEntity getBookings(@RequestHeader("X-Sharer-User-Id") long userId, + public ResponseEntity getBookings(@RequestHeader(HEADER_USER_ID) long userId, @RequestParam(name = "state", defaultValue = "all") String stateParam, @PositiveOrZero @RequestParam(name = "from", defaultValue = "0") Integer from, @Positive @RequestParam(name = "size", defaultValue = "10") Integer size) { @@ -32,15 +42,40 @@ public ResponseEntity getBookings(@RequestHeader("X-Sharer-User-Id") lon return bookingClient.getBookings(userId, state, from, size); } + /** + * Бронирование вещии + * @param userId - идентификатор пользователя + * @param requestDto - данные о бронировании + * @return - созданный объект бронирования + */ @PostMapping - public ResponseEntity bookItem(@RequestHeader("X-Sharer-User-Id") long userId, + public ResponseEntity bookItem(@RequestHeader(HEADER_USER_ID) long userId, @RequestBody @Valid BookItemRequestDto requestDto) { - log.info("Creating booking {}, userId={}", requestDto, userId); + log.info("Создаем запрос на бронирование {}, userId={}", requestDto, userId); return bookingClient.bookItem(userId, requestDto); } + /** + * Редактирукм запрос на бронироапние + */ + @PatchMapping("/{id}") + @ResponseStatus(HttpStatus.OK) + public ResponseEntity editBooking( + @RequestHeader(HEADER_USER_ID) final Long editorId, + @PathVariable Long id, + @RequestParam Boolean approved) { + log.info("Пользователь id={} редактирует запрос на бронирование id={}", editorId, id); + return bookingClient.approvedBooking(id, editorId, approved); + } + + /** + * Ищем запрос на бронирование + * @param userId - идентификатор пользователя + * @param bookingId - идентификатор бронирования + * @return - результат поиска + */ @GetMapping("/{bookingId}") - public ResponseEntity getBooking(@RequestHeader("X-Sharer-User-Id") long userId, + public ResponseEntity getBooking(@RequestHeader(HEADER_USER_ID) long userId, @PathVariable Long bookingId) { log.info("Get booking {}, userId={}", bookingId, userId); return bookingClient.getBooking(userId, bookingId); diff --git a/server/src/main/java/ru/practicum/shareit/booking/BookingController.java b/server/src/main/java/ru/practicum/shareit/booking/BookingController.java index 0588ee6..4f219de 100644 --- a/server/src/main/java/ru/practicum/shareit/booking/BookingController.java +++ b/server/src/main/java/ru/practicum/shareit/booking/BookingController.java @@ -68,7 +68,7 @@ public List findBookingByBooker( public List findBookingByOwner( @RequestHeader(HEADER_USER_ID) final Long ownerId, @RequestParam(defaultValue = "ALL") SearchState state) { - log.info("Пользователь id={} просматривает запроcы на вои вещи", ownerId); + log.info("Пользователь id={} просматривает запроcы на вое вещи", ownerId); return bookingService.findBookingsByOwner(ownerId, state); } From ea9bd886653a848fb3cb036462d7b829cc5f5b33 Mon Sep 17 00:00:00 2001 From: Andrej Stelmaschuk Date: Fri, 25 Apr 2025 22:36:41 +0700 Subject: [PATCH 13/46] fix: Gateway + Server - Postman OK --- .../shareit/booking/BookingClient.java | 27 +++++++---- .../shareit/booking/BookingController.java | 46 ++++++++++++++----- .../ru/practicum/shareit/item/ItemClient.java | 5 ++ .../shareit/item/ItemController.java | 13 ++++++ .../shareit/item/dto/CommentDto.java | 19 ++++++++ .../request/ItemRequestController.java | 2 - .../shareit/booking/BookingController.java | 2 +- .../shareit/item/ItemController.java | 16 ++++--- 8 files changed, 100 insertions(+), 30 deletions(-) create mode 100644 gateway/src/main/java/ru/practicum/shareit/item/dto/CommentDto.java diff --git a/gateway/src/main/java/ru/practicum/shareit/booking/BookingClient.java b/gateway/src/main/java/ru/practicum/shareit/booking/BookingClient.java index 68e1d72..8fed5c4 100644 --- a/gateway/src/main/java/ru/practicum/shareit/booking/BookingClient.java +++ b/gateway/src/main/java/ru/practicum/shareit/booking/BookingClient.java @@ -27,26 +27,35 @@ public BookingClient(@Value("${shareit-server.url}") String serverUrl, RestTempl ); } + public ResponseEntity bookItem(long userId, BookItemRequestDto requestDto) { + return post("", userId, requestDto); + } + public ResponseEntity getBookings(long userId, BookingState state, Integer from, Integer size) { Map parameters = Map.of( "state", state.name(), "from", from, - "size", size - ); + "size", size); return get("?state={state}&from={from}&size={size}", userId, parameters); } - - public ResponseEntity bookItem(long userId, BookItemRequestDto requestDto) { - return post("", userId, requestDto); - } - public ResponseEntity getBooking(long userId, Long bookingId) { return get("/" + bookingId, userId); } public ResponseEntity approvedBooking(Long id, Long editorId, Boolean approved) { - Map parameters = Map.of("approved", approved ); - return patch("/" + id, editorId, parameters); + Map parameters = Map.of("approved", approved); + return patch("/" + id + "?approved={approved}", editorId, parameters, null); + } + + public ResponseEntity findBookingsByOwner(Long ownerId, + BookingState state, + Integer from, + Integer size) { + Map parameters = Map.of( + "state", state.name(), + "from", from, + "size", size); + return get("/owner?state={state}&from={from}&size={size}", ownerId, parameters); } } \ No newline at end of file diff --git a/gateway/src/main/java/ru/practicum/shareit/booking/BookingController.java b/gateway/src/main/java/ru/practicum/shareit/booking/BookingController.java index 4c09f3e..5c7d2b1 100644 --- a/gateway/src/main/java/ru/practicum/shareit/booking/BookingController.java +++ b/gateway/src/main/java/ru/practicum/shareit/booking/BookingController.java @@ -1,6 +1,5 @@ package ru.practicum.shareit.booking; -import jakarta.validation.Valid; import jakarta.validation.constraints.Positive; import jakarta.validation.constraints.PositiveOrZero; import lombok.RequiredArgsConstructor; @@ -12,8 +11,11 @@ import org.springframework.web.bind.annotation.*; import ru.practicum.shareit.booking.dto.BookItemRequestDto; import ru.practicum.shareit.booking.dto.BookingState; +import ru.practicum.shareit.validator.ValidAction; - +/** + * Обработка запроса на бронирование вещей + */ @Controller @RequestMapping(path = "/bookings") @RequiredArgsConstructor @@ -24,33 +26,38 @@ public class BookingController { private final BookingClient bookingClient; /** - * Ищем бронирования в соответствмм со статусом - * @param userId - идентификатор пользователя + * Ищем бронирования в соответствии со статусом + * + * @param userId - идентификатор пользователя * @param stateParam - статус бронирования * @param from * @param size * @return - результат поиска */ @GetMapping + @ResponseStatus(HttpStatus.OK) public ResponseEntity getBookings(@RequestHeader(HEADER_USER_ID) long userId, @RequestParam(name = "state", defaultValue = "all") String stateParam, @PositiveOrZero @RequestParam(name = "from", defaultValue = "0") Integer from, @Positive @RequestParam(name = "size", defaultValue = "10") Integer size) { BookingState state = BookingState.from(stateParam) - .orElseThrow(() -> new IllegalArgumentException("Unknown state: " + stateParam)); - log.info("Get booking with state {}, userId={}, from={}, size={}", stateParam, userId, from, size); + .orElseThrow(() -> new IllegalArgumentException("Неизвестный режим: " + stateParam)); + log.info("Ищем запросы state {}, userId={}, from={}, size={}", stateParam, userId, from, size); return bookingClient.getBookings(userId, state, from, size); } /** * Бронирование вещии - * @param userId - идентификатор пользователя + * + * @param userId - идентификатор пользователя * @param requestDto - данные о бронировании * @return - созданный объект бронирования */ @PostMapping + @ResponseStatus(HttpStatus.CREATED) public ResponseEntity bookItem(@RequestHeader(HEADER_USER_ID) long userId, - @RequestBody @Valid BookItemRequestDto requestDto) { + @Validated(ValidAction.OnCreate.class) + @RequestBody BookItemRequestDto requestDto) { log.info("Создаем запрос на бронирование {}, userId={}", requestDto, userId); return bookingClient.bookItem(userId, requestDto); } @@ -60,24 +67,41 @@ public ResponseEntity bookItem(@RequestHeader(HEADER_USER_ID) long userI */ @PatchMapping("/{id}") @ResponseStatus(HttpStatus.OK) - public ResponseEntity editBooking( + public ResponseEntity editBooking( @RequestHeader(HEADER_USER_ID) final Long editorId, @PathVariable Long id, @RequestParam Boolean approved) { - log.info("Пользователь id={} редактирует запрос на бронирование id={}", editorId, id); + log.info("Пользователь id={} редактирует запрос на бронирование id={}, approved={}", + editorId, id, approved); return bookingClient.approvedBooking(id, editorId, approved); } /** * Ищем запрос на бронирование - * @param userId - идентификатор пользователя + * + * @param userId - идентификатор пользователя * @param bookingId - идентификатор бронирования * @return - результат поиска */ + @ResponseStatus(HttpStatus.OK) @GetMapping("/{bookingId}") public ResponseEntity getBooking(@RequestHeader(HEADER_USER_ID) long userId, @PathVariable Long bookingId) { log.info("Get booking {}, userId={}", bookingId, userId); return bookingClient.getBooking(userId, bookingId); } + + @GetMapping("/owner") + @ResponseStatus(HttpStatus.OK) + public ResponseEntity findBookingByOwner( + @RequestHeader(HEADER_USER_ID) final Long ownerId, + @RequestParam(name = "state", defaultValue = "all") String stateParam, + @PositiveOrZero @RequestParam(name = "from", defaultValue = "0") Integer from, + @Positive @RequestParam(name = "size", defaultValue = "10") Integer size) { + BookingState state = BookingState.from(stateParam) + .orElseThrow(() -> new IllegalArgumentException("Неизвестный режим: " + stateParam)); + log.info("Пользователь id={} просматривает запроcы на все свои вещи. state {}, userId={}, from={}, size={}", + ownerId, state, from, size); + return bookingClient.findBookingsByOwner(ownerId, state, from, size); + } } \ No newline at end of file diff --git a/gateway/src/main/java/ru/practicum/shareit/item/ItemClient.java b/gateway/src/main/java/ru/practicum/shareit/item/ItemClient.java index ba2c233..018d504 100644 --- a/gateway/src/main/java/ru/practicum/shareit/item/ItemClient.java +++ b/gateway/src/main/java/ru/practicum/shareit/item/ItemClient.java @@ -7,6 +7,7 @@ import org.springframework.stereotype.Service; import org.springframework.web.util.DefaultUriBuilderFactory; import ru.practicum.shareit.client.BaseClient; +import ru.practicum.shareit.item.dto.CommentDto; import ru.practicum.shareit.item.dto.ItemDto; import java.util.Map; @@ -48,4 +49,8 @@ public ResponseEntity updateItem(Long id, Long ownerId, ItemDto itemDto) public void deleteItem(Long id, Long userId) { delete("/" + id, userId); } + + public ResponseEntity addComment(Long itemId, Long userId, CommentDto commentDto) { + return post("/" + itemId + "/comment", userId, commentDto); + } } diff --git a/gateway/src/main/java/ru/practicum/shareit/item/ItemController.java b/gateway/src/main/java/ru/practicum/shareit/item/ItemController.java index 79e2726..55bc07b 100644 --- a/gateway/src/main/java/ru/practicum/shareit/item/ItemController.java +++ b/gateway/src/main/java/ru/practicum/shareit/item/ItemController.java @@ -7,6 +7,7 @@ import org.springframework.stereotype.Controller; import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.*; +import ru.practicum.shareit.item.dto.CommentDto; import ru.practicum.shareit.item.dto.ItemDto; import ru.practicum.shareit.validator.ValidAction; @@ -73,4 +74,16 @@ public void deleteItem( itemClient.deleteItem(id, ownerId); } + @PostMapping("/{itemId}/comment") + @ResponseStatus(HttpStatus.CREATED) + public ResponseEntity addComment( + @RequestHeader(HEADER_USER_ID) Long userId, + @PathVariable Long itemId, + @RequestBody CommentDto commentDto) { + log.info("Пользователь id={} добавляет комментарий для вещи id={}", userId, itemId); + commentDto.setAuthorId(userId); + commentDto.setItemId(itemId); + return itemClient.addComment(itemId, userId, commentDto); + } + } diff --git a/gateway/src/main/java/ru/practicum/shareit/item/dto/CommentDto.java b/gateway/src/main/java/ru/practicum/shareit/item/dto/CommentDto.java new file mode 100644 index 0000000..11d58d6 --- /dev/null +++ b/gateway/src/main/java/ru/practicum/shareit/item/dto/CommentDto.java @@ -0,0 +1,19 @@ +package ru.practicum.shareit.item.dto; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.time.Instant; + +@Data +@AllArgsConstructor +@NoArgsConstructor +public class CommentDto { + private Long id; + private String text; + private Long authorId; + private String authorName; + private Long itemId; + private Instant created; +} diff --git a/gateway/src/main/java/ru/practicum/shareit/request/ItemRequestController.java b/gateway/src/main/java/ru/practicum/shareit/request/ItemRequestController.java index 3109331..123b737 100644 --- a/gateway/src/main/java/ru/practicum/shareit/request/ItemRequestController.java +++ b/gateway/src/main/java/ru/practicum/shareit/request/ItemRequestController.java @@ -9,8 +9,6 @@ import org.springframework.web.bind.annotation.*; import ru.practicum.shareit.request.dto.ItemRequestDto; -import java.util.List; - @Controller @RequestMapping(path = "/requests") @RequiredArgsConstructor diff --git a/server/src/main/java/ru/practicum/shareit/booking/BookingController.java b/server/src/main/java/ru/practicum/shareit/booking/BookingController.java index 4f219de..dd8c451 100644 --- a/server/src/main/java/ru/practicum/shareit/booking/BookingController.java +++ b/server/src/main/java/ru/practicum/shareit/booking/BookingController.java @@ -68,7 +68,7 @@ public List findBookingByBooker( public List findBookingByOwner( @RequestHeader(HEADER_USER_ID) final Long ownerId, @RequestParam(defaultValue = "ALL") SearchState state) { - log.info("Пользователь id={} просматривает запроcы на вое вещи", ownerId); + log.info("Пользователь id={} просматривает запроcы на все вещи", ownerId); return bookingService.findBookingsByOwner(ownerId, state); } diff --git a/server/src/main/java/ru/practicum/shareit/item/ItemController.java b/server/src/main/java/ru/practicum/shareit/item/ItemController.java index 6030877..8a18e24 100644 --- a/server/src/main/java/ru/practicum/shareit/item/ItemController.java +++ b/server/src/main/java/ru/practicum/shareit/item/ItemController.java @@ -14,12 +14,14 @@ import java.util.Collection; /** - * TODO Sprint add-controllers. + * Класс обработки запросов на работу с вешью */ @Slf4j @RestController @RequestMapping("/items") public class ItemController { + private static final String HEADER_USER_ID = "X-Sharer-User-Id"; + private final ItemService itemService; private final CommentService commentService; @@ -31,7 +33,7 @@ public ItemController(ItemService itemService, CommentService commentService) { @GetMapping @ResponseStatus(HttpStatus.OK) public Collection findAllItems( - @RequestHeader("X-Sharer-User-Id") final Long ownerId) { + @RequestHeader(HEADER_USER_ID) final Long ownerId) { log.info("Запрашиваем список вещей владельца id={}", ownerId); return itemService.getItemsByOwnerId(ownerId); } @@ -39,7 +41,7 @@ public Collection findAllItems( @GetMapping("/{id}") @ResponseStatus(HttpStatus.OK) public ItemCommentsDto findItem(@PathVariable Long id, - @RequestHeader("X-Sharer-User-Id") final Long userId) { + @RequestHeader(HEADER_USER_ID) final Long userId) { log.info("Польдователь id={} просматривает информацию о вещи id={}.", userId, id); return itemService.getItem(id, userId); } @@ -54,7 +56,7 @@ public Collection onSearch(@RequestParam String text) { @PostMapping @ResponseStatus(HttpStatus.CREATED) public ItemDto createItem( - @RequestHeader("X-Sharer-User-Id") final Long ownerId, + @RequestHeader(HEADER_USER_ID) final Long ownerId, @Validated(ValidAction.OnCreate.class) @RequestBody ItemDto itemDto) { log.info("Пользователь id={} добавляет вещь : {}", ownerId, itemDto.toString()); return itemService.addItem(itemDto, ownerId); @@ -63,7 +65,7 @@ public ItemDto createItem( @PatchMapping("/{id}") @ResponseStatus(HttpStatus.OK) public ItemDto updateItem( - @RequestHeader("X-Sharer-User-Id") final Long ownerId, + @RequestHeader(HEADER_USER_ID) final Long ownerId, @PathVariable Long id, @RequestBody ItemDto itemDto) { log.info("Пользователь id={} обновляет сведения об элемете id={} {}", ownerId, id, itemDto); @@ -74,7 +76,7 @@ public ItemDto updateItem( @DeleteMapping("/{id}") @ResponseStatus(HttpStatus.OK) public void deleteItem( - @RequestHeader("X-Sharer-User-Id") final Long ownerId, + @RequestHeader(HEADER_USER_ID) final Long ownerId, @PathVariable Long id) { log.info("пользователь id={}. Удаляет вещь id={}", ownerId, id); itemService.deleteItem(id, ownerId); @@ -90,7 +92,7 @@ public String deleteAllItems() { @PostMapping("/{itemId}/comment") @ResponseStatus(HttpStatus.CREATED) public CommentDto addComment( - @RequestHeader("X-Sharer-User-Id") final Long userId, + @RequestHeader(HEADER_USER_ID) final Long userId, @PathVariable Long itemId, @RequestBody CommentDto commentDto) { log.info("Пользователь id={} добавляет комментарий для вещи id={}", userId, itemId); From 153ebee9f0d0f86129f97de14e421425148fc98d Mon Sep 17 00:00:00 2001 From: Andrej Stelmaschuk Date: Sat, 26 Apr 2025 22:41:17 +0700 Subject: [PATCH 14/46] =?UTF-8?q?feat:=20=D0=BF=D0=B8=D1=88=D0=B5=D0=BC=20?= =?UTF-8?q?=D1=82=D0=B5=D1=81=D1=82=D1=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../user/service/UserServiceImplTest.java | 51 ++++++++++++++++++ .../src/test/resoueces/application.properties | 17 ++++++ server/src/test/resoueces/schema.sql | 52 +++++++++++++++++++ 3 files changed, 120 insertions(+) create mode 100644 server/src/test/java/ru/practicum/shareit/user/service/UserServiceImplTest.java create mode 100644 server/src/test/resoueces/application.properties create mode 100644 server/src/test/resoueces/schema.sql diff --git a/server/src/test/java/ru/practicum/shareit/user/service/UserServiceImplTest.java b/server/src/test/java/ru/practicum/shareit/user/service/UserServiceImplTest.java new file mode 100644 index 0000000..41e08a9 --- /dev/null +++ b/server/src/test/java/ru/practicum/shareit/user/service/UserServiceImplTest.java @@ -0,0 +1,51 @@ +package ru.practicum.shareit.user.service; + +import lombok.RequiredArgsConstructor; +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.transaction.annotation.Transactional; +import ru.practicum.shareit.user.dto.UserDto; + +import static org.hamcrest.CoreMatchers.notNullValue; +import static org.hamcrest.MatcherAssert.assertThat; +import static org.hamcrest.Matchers.equalTo; +import static org.junit.jupiter.api.Assertions.assertNotNull; + +@Transactional +@SpringBootTest +@RequiredArgsConstructor(onConstructor_ = @Autowired) +class UserServiceImplTest { + @Autowired + private final UserService userService; + + @Test + void createUser() { + UserDto userDto = new UserDto(1L, + "User Test create", + "user@test.create"); + UserDto savedUserDto = userService.createUser(userDto); + assertNotNull(savedUserDto, + "Пользователь не соххраняется в репозитории"); + + assertThat(savedUserDto.getId(), notNullValue()); + assertThat(savedUserDto.getEmail(), equalTo(userDto.getEmail())); + assertThat(savedUserDto.getName(), equalTo(userDto.getName())); + } + + @Test + void getUserById() { + } + + @Test + void updateUser() { + } + + @Test + void deleteUser() { + } + + @Test + void getAllUsers() { + } +} \ No newline at end of file diff --git a/server/src/test/resoueces/application.properties b/server/src/test/resoueces/application.properties new file mode 100644 index 0000000..3a1575a --- /dev/null +++ b/server/src/test/resoueces/application.properties @@ -0,0 +1,17 @@ +server.port=9090 + +spring.jpa.hibernate.ddl-auto=none +spring.jpa.properties.hibernate.format_sql=true +spring.sql.init.mode=always + +logging.level.org.zalando.logbook=TRACE + +#logging.level.org.springframework.orm.jpa=INFO +#logging.level.org.springframework.transaction=INFO +#logging.level.org.springframework.transaction.interceptor=TRACE +#logging.level.org.springframework.orm.jpa.JpaTransactionManager=DEBUG + +spring.datasource.driverClassName=org.h2.Driver +spring.datasource.url=jdbc:h2:mem:shareit +spring.datasource.username=shareit +spring.datasource.password=shareit diff --git a/server/src/test/resoueces/schema.sql b/server/src/test/resoueces/schema.sql new file mode 100644 index 0000000..4bb2fa3 --- /dev/null +++ b/server/src/test/resoueces/schema.sql @@ -0,0 +1,52 @@ +CREATE TABLE IF NOT EXISTS users ( + id BIGINT GENERATED BY DEFAULT AS IDENTITY NOT NULL, + name VARCHAR(255) NOT NULL, + email VARCHAR(255) NOT NULL, + CONSTRAINT pk_user PRIMARY KEY (id), + CONSTRAINT UQ_USER_EMAIL UNIQUE (email) +); + +CREATE TABLE IF NOT EXISTS itemrequests ( + id BIGINT GENERATED BY DEFAULT AS IDENTITY NOT NULL, + description VARCHAR(512) NOT NULL, + customer_id BIGINT NOT NULL, + created TIMESTAMP WITHOUT TIME ZONE, + CONSTRAINT pk_itemrequests PRIMARY KEY (id), + CONSTRAINT fk_itemrequests_to_users FOREIGN KEY(customer_id) REFERENCES users(id) +); + +CREATE TABLE IF NOT EXISTS items ( + id BIGINT GENERATED BY DEFAULT AS IDENTITY NOT NULL, + name VARCHAR(255) NOT NULL, + description VARCHAR(255), + owner_id BIGINT NOT NULL, + available BOOLEAN, + request_id BIGINT, + CONSTRAINT pk_item PRIMARY KEY (id), + CONSTRAINT fk_items_to_users FOREIGN KEY(owner_id) REFERENCES users(id), + CONSTRAINT fk_items_to_requests FOREIGN KEY(request_id) REFERENCES itemrequests(id) +); + +CREATE TABLE IF NOT EXISTS comments ( + id BIGINT GENERATED BY DEFAULT AS IDENTITY NOT NULL, + text VARCHAR(512) NOT NULL, + item_id BIGINT NOT NULL, + author_id BIGINT NOT NULL, + created TIMESTAMP WITHOUT TIME ZONE, + CONSTRAINT pk_comment PRIMARY KEY (id), + CONSTRAINT fk_connemts_to_items FOREIGN KEY(item_id) REFERENCES items(id), + CONSTRAINT fk_connemts_to_users FOREIGN KEY(author_id) REFERENCES users(id) +); + +CREATE TABLE IF NOT EXISTS bookings ( + id BIGINT GENERATED BY DEFAULT AS IDENTITY NOT NULL, + time_start TIMESTAMP WITHOUT TIME ZONE NOT NULL, + time_end TIMESTAMP WITHOUT TIME ZONE NOT NULL, + item_id BIGINT NOT NULL, + booker_id BIGINT NOT NULL, + status VARCHAR(16), + CONSTRAINT pk_buoking PRIMARY KEY (id), + CONSTRAINT fk_buokings_to_items FOREIGN KEY(item_id) REFERENCES items(id), + CONSTRAINT fk_buokings_to_users FOREIGN KEY(booker_id) REFERENCES users(id) +); + From 5ba142fc00d53300c8373d42aa86f5b3d0ea0ac8 Mon Sep 17 00:00:00 2001 From: Andrej Stelmaschuk Date: Sun, 27 Apr 2025 14:11:20 +0700 Subject: [PATCH 15/46] =?UTF-8?q?feat:=20=D0=BF=D0=B8=D1=88=D0=B5=D0=BC=20?= =?UTF-8?q?=D1=82=D0=B5=D1=81=D1=82=D1=8B=20UserControllerTest?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../shareit/user/UserControllerTest.java | 37 ++++++++ .../user/service/UserServiceImplTest.java | 87 ++++++++++++++++++- 2 files changed, 121 insertions(+), 3 deletions(-) create mode 100644 server/src/test/java/ru/practicum/shareit/user/UserControllerTest.java diff --git a/server/src/test/java/ru/practicum/shareit/user/UserControllerTest.java b/server/src/test/java/ru/practicum/shareit/user/UserControllerTest.java new file mode 100644 index 0000000..579d7d1 --- /dev/null +++ b/server/src/test/java/ru/practicum/shareit/user/UserControllerTest.java @@ -0,0 +1,37 @@ +package ru.practicum.shareit.user; + +import org.junit.jupiter.api.Test; +import org.springframework.test.web.servlet.MockMvc; +import ru.practicum.shareit.user.service.UserService; + +import static org.junit.jupiter.api.Assertions.*; + +class UserControllerTest { + // private final UserService userService; + + private MockMvc mvc; + + @Test + void findAllUser() { + } + + @Test + void findUser() { + } + + @Test + void addNewUser() { + } + + @Test + void updateUser() { + } + + @Test + void deleteAllUsers() { + } + + @Test + void deleteUser() { + } +} \ No newline at end of file diff --git a/server/src/test/java/ru/practicum/shareit/user/service/UserServiceImplTest.java b/server/src/test/java/ru/practicum/shareit/user/service/UserServiceImplTest.java index 41e08a9..90a00bf 100644 --- a/server/src/test/java/ru/practicum/shareit/user/service/UserServiceImplTest.java +++ b/server/src/test/java/ru/practicum/shareit/user/service/UserServiceImplTest.java @@ -5,18 +5,25 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.transaction.annotation.Transactional; +import ru.practicum.shareit.excepton.NotFoundException; import ru.practicum.shareit.user.dto.UserDto; +import java.util.List; + +import static org.assertj.core.api.AssertionsForClassTypes.assertThat; import static org.hamcrest.CoreMatchers.notNullValue; import static org.hamcrest.MatcherAssert.assertThat; -import static org.hamcrest.Matchers.equalTo; +import static org.hamcrest.Matchers.*; import static org.junit.jupiter.api.Assertions.assertNotNull; +import static org.junit.jupiter.api.Assertions.assertThrows; +/** + * Тестирование сервиса работы с пользователями + */ @Transactional @SpringBootTest @RequiredArgsConstructor(onConstructor_ = @Autowired) class UserServiceImplTest { - @Autowired private final UserService userService; @Test @@ -26,7 +33,7 @@ void createUser() { "user@test.create"); UserDto savedUserDto = userService.createUser(userDto); assertNotNull(savedUserDto, - "Пользователь не соххраняется в репозитории"); + "Пользователь не соххраняется в репозитории :" + userDto.toString()); assertThat(savedUserDto.getId(), notNullValue()); assertThat(savedUserDto.getEmail(), equalTo(userDto.getEmail())); @@ -35,17 +42,91 @@ void createUser() { @Test void getUserById() { + UserDto userDto = new UserDto(1L, + "User Test getById", + "user@get.by.id.test"); + UserDto savedUserDto = userService.createUser(userDto); + assertNotNull(savedUserDto, + "Пользователь не соххраняется в репозитории :" + userDto); + + Long userId = savedUserDto.getId(); + UserDto userDto2 = userService.getUserById(userId); + + assertThat(userDto2) + .usingRecursiveComparison() + .isEqualTo(savedUserDto); } @Test void updateUser() { + UserDto userDto = new UserDto(1L, + "User Test update", + "user@update.test"); + UserDto savedUserDto = userService.createUser(userDto); + assertNotNull(savedUserDto, + "Пользователь не соххраняется в репозитории :" + userDto); + + savedUserDto.setEmail("update@test.update"); + UserDto updatedUserDto = userService.updateUser(savedUserDto); + + assertThat(updatedUserDto, notNullValue()); + assertThat(updatedUserDto) + .usingRecursiveComparison() + .isEqualTo(savedUserDto); + + Long userId = savedUserDto.getId(); + } @Test void deleteUser() { + UserDto userDto = new UserDto(1L, + "User Test update", + "user@update.test"); + UserDto savedUserDto = userService.createUser(userDto); + assertNotNull(savedUserDto, + "Пользователь не соххраняется в репозитории :" + userDto); + + Long userId = savedUserDto.getId(); + userService.deleteUser(userId); + + assertThrows(NotFoundException.class, + () -> { + userService.getUserById(userId); + }, + "Чтение удаленного пользователя должно приводить к исключению."); } @Test void getAllUsers() { + List sourceUsers = List.of( + new UserDto(1L, "User1", "user1@get.all.test"), + new UserDto(2L, "User2", "user2@get.all.test"), + new UserDto(3L, "User3", "user3@get.all.test") + ); + + for (UserDto user : sourceUsers) { + userService.createUser(user); + } + + List targetUsers = userService.getAllUsers().stream().toList(); + + assertThat(targetUsers, notNullValue()); + assertThat(targetUsers, hasSize(sourceUsers.size())); + for (UserDto sourceUser : sourceUsers) { + assertThat(targetUsers, hasItem(allOf( + hasProperty("id", notNullValue()), + hasProperty("name", equalTo(sourceUser.getName())), + hasProperty("email", equalTo(sourceUser.getEmail())) + ))); + } + } + + @Test + void deleteAllUsers() { + getAllUsers(); + List targetUsers = userService.deleteAllUsers().stream().toList(); + assertThat(targetUsers, notNullValue()); + assertThat(targetUsers, hasSize(0)); } } \ No newline at end of file From c9a2cee030496b290ae47cb23b47bc73307b567a Mon Sep 17 00:00:00 2001 From: Andrej Stelmaschuk Date: Sun, 27 Apr 2025 22:32:01 +0700 Subject: [PATCH 16/46] =?UTF-8?q?feat:=20=D0=BF=D0=B8=D1=88=D0=B5=D0=BC=20?= =?UTF-8?q?=D1=82=D0=B5=D1=81=D1=82=D1=8B=20ItemControllerTest?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../practicum/shareit/item/dto/ItemDto.java | 1 + .../practicum/shareit/item/dto/ItemDto.java | 1 + .../practicum/shareit/user/dto/UserDto.java | 2 + .../shareit/item/ItemControllerTest.java | 116 ++++++++++++++++++ .../shareit/item/dto/ItemDtoTest.java | 35 ++++++ .../item/service/ItemServiceImplTest.java | 67 ++++++++++ .../shareit/user/UserControllerTest.java | 115 +++++++++++++++-- .../shareit/user/dto/UserDtoTest.java | 31 +++++ 8 files changed, 360 insertions(+), 8 deletions(-) create mode 100644 server/src/test/java/ru/practicum/shareit/item/ItemControllerTest.java create mode 100644 server/src/test/java/ru/practicum/shareit/item/dto/ItemDtoTest.java create mode 100644 server/src/test/java/ru/practicum/shareit/item/service/ItemServiceImplTest.java create mode 100644 server/src/test/java/ru/practicum/shareit/user/dto/UserDtoTest.java diff --git a/gateway/src/main/java/ru/practicum/shareit/item/dto/ItemDto.java b/gateway/src/main/java/ru/practicum/shareit/item/dto/ItemDto.java index 3c384b3..13af90c 100644 --- a/gateway/src/main/java/ru/practicum/shareit/item/dto/ItemDto.java +++ b/gateway/src/main/java/ru/practicum/shareit/item/dto/ItemDto.java @@ -1,5 +1,6 @@ package ru.practicum.shareit.item.dto; +import com.fasterxml.jackson.annotation.JsonFormat; import jakarta.validation.constraints.NotBlank; import jakarta.validation.constraints.NotNull; import jakarta.validation.constraints.Size; 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 index aa7fc96..97aed6b 100644 --- a/server/src/main/java/ru/practicum/shareit/item/dto/ItemDto.java +++ b/server/src/main/java/ru/practicum/shareit/item/dto/ItemDto.java @@ -1,5 +1,6 @@ package ru.practicum.shareit.item.dto; +import com.fasterxml.jackson.annotation.JsonFormat; import jakarta.validation.constraints.NotBlank; import jakarta.validation.constraints.NotNull; import jakarta.validation.constraints.Size; 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 index a3c7de7..6c91d44 100644 --- a/server/src/main/java/ru/practicum/shareit/user/dto/UserDto.java +++ b/server/src/main/java/ru/practicum/shareit/user/dto/UserDto.java @@ -4,10 +4,12 @@ import jakarta.validation.constraints.NotBlank; import lombok.AllArgsConstructor; import lombok.Data; +import lombok.NoArgsConstructor; import ru.practicum.shareit.validator.ValidAction; @Data @AllArgsConstructor +@NoArgsConstructor public class UserDto { private Long id; diff --git a/server/src/test/java/ru/practicum/shareit/item/ItemControllerTest.java b/server/src/test/java/ru/practicum/shareit/item/ItemControllerTest.java new file mode 100644 index 0000000..197a000 --- /dev/null +++ b/server/src/test/java/ru/practicum/shareit/item/ItemControllerTest.java @@ -0,0 +1,116 @@ +package ru.practicum.shareit.item; + +import com.fasterxml.jackson.databind.ObjectMapper; +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest; +import org.springframework.boot.test.mock.mockito.MockBean; +import org.springframework.http.MediaType; +import org.springframework.test.web.servlet.MockMvc; +import ru.practicum.shareit.item.dto.ItemCommentsDto; +import ru.practicum.shareit.item.dto.ItemDto; +import ru.practicum.shareit.item.service.CommentService; +import ru.practicum.shareit.item.service.ItemService; +import ru.practicum.shareit.user.UserController; + +import java.nio.charset.StandardCharsets; +import java.util.ArrayList; +import java.util.List; + +import static org.hamcrest.Matchers.is; +import static org.junit.jupiter.api.Assertions.*; +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.ArgumentMatchers.anyLong; +import static org.mockito.Mockito.when; +import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; +import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.post; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.jsonPath; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; + +@WebMvcTest(controllers = ItemController.class) +class ItemControllerTest { + private static final String HEADER_USER_ID = "X-Sharer-User-Id"; + + @Autowired + ObjectMapper mapper; + + @MockBean + private ItemService itemService; + + @MockBean + private CommentService commentService; + + @Autowired + private MockMvc mvc; + + @Test + void findAllItems() throws Exception { + List sourceItems = new ArrayList<>(); + int maxItems = 3; + for (int i = 1; i <= maxItems; i++) { + ItemDto itemDto = new ItemDto(); + itemDto.setName("Item_" + i); + itemDto.setDescription("controller test get item_" + i); + itemDto.setAvailable(true); + sourceItems.add(itemDto); + } + + when(itemService.getItemsByOwnerId(anyLong())) + .thenReturn(sourceItems); + + mvc.perform(get("/items") + .header(HEADER_USER_ID, 1L) + .characterEncoding(StandardCharsets.UTF_8) + .contentType(MediaType.APPLICATION_JSON) + .accept(MediaType.APPLICATION_JSON)) + .andExpect(status().isOk()) + .andExpect(jsonPath("$.length()").value(sourceItems.size())); + } + + @Test + void findItemById() throws Exception { + ItemCommentsDto itemDto = new ItemCommentsDto(); + itemDto.setId(1L); + itemDto.setName("Item2"); + itemDto.setDescription("controller test find item by id"); + itemDto.setAvailable(true); + + when(itemService.getItem(anyLong(), anyLong())) + .thenReturn(itemDto); + + mvc.perform(get("/items/1") + .header(HEADER_USER_ID, 1L) + .characterEncoding(StandardCharsets.UTF_8) + .contentType(MediaType.APPLICATION_JSON) + .accept(MediaType.APPLICATION_JSON)) + .andExpect(status().isOk()) + .andExpect(jsonPath("$.id", is(itemDto.getId()), Long.class)) + .andExpect(jsonPath("$.name", is(itemDto.getName()))) + .andExpect(jsonPath("$.description", is(itemDto.getDescription()))); + } + + @Test + void createItem() throws Exception { + ItemDto itemDto = new ItemDto(); + itemDto.setId(1L); + itemDto.setName("Name item"); + itemDto.setDescription("controller test create new item"); + itemDto.setAvailable(true); + + when(itemService.addItem(any(), anyLong())) + .thenReturn(itemDto); + + mvc.perform(post("/items") + .header(HEADER_USER_ID, 1L) + .content(mapper.writeValueAsString(itemDto)) + .characterEncoding(StandardCharsets.UTF_8) + .contentType(MediaType.APPLICATION_JSON) + .accept(MediaType.APPLICATION_JSON)) + .andExpect(status().isCreated()) + .andExpect(jsonPath("$.id", is(itemDto.getId()), Long.class)) + .andExpect(jsonPath("$.name", is(itemDto.getName()))) + .andExpect(jsonPath("$.description", is(itemDto.getDescription()))); + } + + +} \ No newline at end of file diff --git a/server/src/test/java/ru/practicum/shareit/item/dto/ItemDtoTest.java b/server/src/test/java/ru/practicum/shareit/item/dto/ItemDtoTest.java new file mode 100644 index 0000000..8342386 --- /dev/null +++ b/server/src/test/java/ru/practicum/shareit/item/dto/ItemDtoTest.java @@ -0,0 +1,35 @@ +package ru.practicum.shareit.item.dto; + +import lombok.RequiredArgsConstructor; +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.autoconfigure.json.JsonTest; +import org.springframework.boot.test.json.JacksonTester; +import org.springframework.boot.test.json.JsonContent; + +import static org.assertj.core.api.AssertionsForInterfaceTypes.assertThat; + +@JsonTest +@RequiredArgsConstructor(onConstructor_ = @Autowired) +class ItemDtoTest { + private final JacksonTester json; + + @Test + void testItemDto() throws Exception { + ItemDto itemDto = new ItemDto( + 1L, + "Item", + "Test item", + true, + null, + null, + null); + + JsonContent result = json.write(itemDto); + assertThat(result).extractingJsonPathNumberValue("$.id").isEqualTo(1); + assertThat(result).extractingJsonPathStringValue("$.name").isEqualTo("Item"); + assertThat(result).extractingJsonPathStringValue("$.description").isEqualTo("Test item"); + assertThat(result).extractingJsonPathBooleanValue("$.available").isEqualTo(true); + } + +} \ No newline at end of file diff --git a/server/src/test/java/ru/practicum/shareit/item/service/ItemServiceImplTest.java b/server/src/test/java/ru/practicum/shareit/item/service/ItemServiceImplTest.java new file mode 100644 index 0000000..2ca4349 --- /dev/null +++ b/server/src/test/java/ru/practicum/shareit/item/service/ItemServiceImplTest.java @@ -0,0 +1,67 @@ +package ru.practicum.shareit.item.service; + +import lombok.RequiredArgsConstructor; +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.transaction.annotation.Transactional; +import ru.practicum.shareit.item.dto.ItemDto; +import ru.practicum.shareit.user.dto.UserDto; +import ru.practicum.shareit.user.service.UserService; + +import java.util.ArrayList; +import java.util.List; + +import static org.hamcrest.CoreMatchers.notNullValue; +import static org.hamcrest.MatcherAssert.assertThat; +import static org.hamcrest.Matchers.*; +import static org.junit.jupiter.api.Assertions.*; + +@Transactional +@SpringBootTest +@RequiredArgsConstructor(onConstructor_ = @Autowired) +class ItemServiceImplTest { + private final ItemService itemService; + private final UserService userService; + + /** + * Тестируем чтение списка вещей пользователя + */ + @Test + void getItemsByOwnerId() { + // создаем поельзователя - хозяина вещей + UserDto userDto = new UserDto(); + userDto.setName("User1"); + userDto.setEmail("user1@get.items.test"); + UserDto savedUserDto = userService.createUser(userDto); + assertThat(savedUserDto.getId(), notNullValue()); + Long ownerId = savedUserDto.getId(); + + // заполняем список вещей + List sourceItems = new ArrayList<>(); + int maxItems = 3; + for (int i = 1; i <= maxItems; i++) { + ItemDto itemDto = new ItemDto(); + itemDto.setName("Item_" + i); + itemDto.setDescription("getItemms test item_" + i); + itemDto.setAvailable(true); + sourceItems.add(itemDto); + itemService.addItem(itemDto, ownerId); + } + + // Чидаем список вещей + List targetItems = itemService.getItemsByOwnerId(ownerId) + .stream().toList(); + + assertThat(targetItems, notNullValue()); + assertThat(targetItems, hasSize(sourceItems.size())); + for (ItemDto sourceItem : sourceItems) { + assertThat(targetItems, hasItem(allOf( + hasProperty("id", notNullValue()), + hasProperty("name", equalTo(sourceItem.getName())), + hasProperty("description", equalTo(sourceItem.getDescription())) + ))); + } + } + +} \ No newline at end of file diff --git a/server/src/test/java/ru/practicum/shareit/user/UserControllerTest.java b/server/src/test/java/ru/practicum/shareit/user/UserControllerTest.java index 579d7d1..412e9b5 100644 --- a/server/src/test/java/ru/practicum/shareit/user/UserControllerTest.java +++ b/server/src/test/java/ru/practicum/shareit/user/UserControllerTest.java @@ -1,37 +1,136 @@ package ru.practicum.shareit.user; +import com.fasterxml.jackson.databind.ObjectMapper; import org.junit.jupiter.api.Test; +import org.mockito.Mockito; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest; +import org.springframework.boot.test.mock.mockito.MockBean; +import org.springframework.http.MediaType; import org.springframework.test.web.servlet.MockMvc; +import ru.practicum.shareit.user.dto.UserDto; import ru.practicum.shareit.user.service.UserService; -import static org.junit.jupiter.api.Assertions.*; +import java.nio.charset.StandardCharsets; +import java.util.List; +import static org.hamcrest.Matchers.is; +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.ArgumentMatchers.anyLong; +import static org.mockito.Mockito.when; +import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.*; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.jsonPath; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; + +@WebMvcTest(controllers = UserController.class) class UserControllerTest { - // private final UserService userService; + @Autowired + ObjectMapper mapper; + + @MockBean + private final UserService userService; + @Autowired private MockMvc mvc; + @Autowired + public UserControllerTest(UserService userService) { + this.userService = userService; + } + + private UserDto userDto = new UserDto( + 1L, + "User Test", + "user@controller.test"); + @Test - void findAllUser() { + void findAllUser() throws Exception { + List sourceUsers = List.of( + new UserDto(1L, "User1", "user1@controller.test"), + new UserDto(2L, "User2", "user2@controller.test"), + new UserDto(3L, "User3", "user3@controller.test")); + when(userService.getAllUsers()) + .thenReturn(sourceUsers); + + mvc.perform(get("/users") + .characterEncoding(StandardCharsets.UTF_8) + .contentType(MediaType.APPLICATION_JSON) + .accept(MediaType.APPLICATION_JSON)) + .andExpect(status().isOk()) + .andExpect(jsonPath("$.length()").value(3)); } @Test - void findUser() { + void findUser() throws Exception { + when(userService.getUserById(anyLong())) + .thenReturn(userDto); + + mvc.perform(get("/users/1") + .characterEncoding(StandardCharsets.UTF_8) + .contentType(MediaType.APPLICATION_JSON) + .accept(MediaType.APPLICATION_JSON)) + .andExpect(status().isOk()) + .andExpect(jsonPath("$.id", is(userDto.getId()), Long.class)) + .andExpect(jsonPath("$.name", is(userDto.getName()))) + .andExpect(jsonPath("$.email", is(userDto.getEmail()))); } @Test - void addNewUser() { + void addNewUser() throws Exception { + when(userService.createUser(any())) + .thenReturn(userDto); + + mvc.perform(post("/users") + .content(mapper.writeValueAsString(userDto)) + .characterEncoding(StandardCharsets.UTF_8) + .contentType(MediaType.APPLICATION_JSON) + .accept(MediaType.APPLICATION_JSON)) + .andExpect(status().isCreated()) + .andExpect(jsonPath("$.id", is(userDto.getId()), Long.class)) + .andExpect(jsonPath("$.name", is(userDto.getName()))) + .andExpect(jsonPath("$.email", is(userDto.getEmail()))); } @Test - void updateUser() { + void updateUser() throws Exception { + when(userService.updateUser(any())) + .thenReturn(userDto); + + mvc.perform(patch("/users/1") + .content(mapper.writeValueAsString(userDto)) + .characterEncoding(StandardCharsets.UTF_8) + .contentType(MediaType.APPLICATION_JSON) + .accept(MediaType.APPLICATION_JSON)) + .andExpect(status().isOk()) + .andExpect(jsonPath("$.id", is(userDto.getId()), Long.class)) + .andExpect(jsonPath("$.name", is(userDto.getName()))) + .andExpect(jsonPath("$.email", is(userDto.getEmail()))); } @Test - void deleteAllUsers() { + void deleteAllUsers() throws Exception { + when(userService.deleteAllUsers()) + .thenReturn(List.of()); + + mvc.perform(delete("/users") + .characterEncoding(StandardCharsets.UTF_8) + .contentType(MediaType.APPLICATION_JSON) + .accept(MediaType.APPLICATION_JSON)) + .andExpect(status().isOk()); + + Mockito.verify(userService, Mockito.times(1)) + .deleteAllUsers(); } @Test - void deleteUser() { + void deleteUser() throws Exception { + mvc.perform(delete("/users/1") + .characterEncoding(StandardCharsets.UTF_8) + .contentType(MediaType.APPLICATION_JSON) + .accept(MediaType.APPLICATION_JSON)) + .andExpect(status().isOk()); + + Mockito.verify(userService, Mockito.times(1)) + .deleteUser(anyLong()); } } \ No newline at end of file diff --git a/server/src/test/java/ru/practicum/shareit/user/dto/UserDtoTest.java b/server/src/test/java/ru/practicum/shareit/user/dto/UserDtoTest.java new file mode 100644 index 0000000..1ad799a --- /dev/null +++ b/server/src/test/java/ru/practicum/shareit/user/dto/UserDtoTest.java @@ -0,0 +1,31 @@ +package ru.practicum.shareit.user.dto; + +import lombok.RequiredArgsConstructor; +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.autoconfigure.json.JsonTest; +import org.springframework.boot.test.json.JacksonTester; +import org.springframework.boot.test.json.JsonContent; + +import static org.assertj.core.api.AssertionsForInterfaceTypes.assertThat; +import static org.junit.jupiter.api.Assertions.*; + +@JsonTest +@RequiredArgsConstructor(onConstructor_ = @Autowired) +class UserDtoTest { + private final JacksonTester json; + + @Test + void testUserDto() throws Exception { + UserDto userDto = new UserDto( + 1L, + "User", + "user-dto@json.test"); + + JsonContent result = json.write(userDto); + + assertThat(result).extractingJsonPathNumberValue("$.id").isEqualTo(1); + assertThat(result).extractingJsonPathStringValue("$.name").isEqualTo("User"); + assertThat(result).extractingJsonPathStringValue("$.email").isEqualTo("user-dto@json.test"); + } +} From 70e4e8f403ff89cd25b34ab7433467a09c4ab79a Mon Sep 17 00:00:00 2001 From: Andrej Stelmaschuk Date: Mon, 28 Apr 2025 22:38:05 +0700 Subject: [PATCH 17/46] =?UTF-8?q?feat:=20=D0=BF=D0=B8=D1=88=D0=B5=D0=BC=20?= =?UTF-8?q?=D1=82=D0=B5=D1=81=D1=82=D1=8B=20ItemControllerTest=202?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../shareit/item/ItemControllerTest.java | 77 +++++++++++++++++-- 1 file changed, 72 insertions(+), 5 deletions(-) diff --git a/server/src/test/java/ru/practicum/shareit/item/ItemControllerTest.java b/server/src/test/java/ru/practicum/shareit/item/ItemControllerTest.java index 197a000..7884851 100644 --- a/server/src/test/java/ru/practicum/shareit/item/ItemControllerTest.java +++ b/server/src/test/java/ru/practicum/shareit/item/ItemControllerTest.java @@ -2,11 +2,13 @@ import com.fasterxml.jackson.databind.ObjectMapper; import org.junit.jupiter.api.Test; +import org.mockito.Mockito; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest; import org.springframework.boot.test.mock.mockito.MockBean; import org.springframework.http.MediaType; import org.springframework.test.web.servlet.MockMvc; +import ru.practicum.shareit.item.dto.CommentDto; import ru.practicum.shareit.item.dto.ItemCommentsDto; import ru.practicum.shareit.item.dto.ItemDto; import ru.practicum.shareit.item.service.CommentService; @@ -14,6 +16,7 @@ import ru.practicum.shareit.user.UserController; import java.nio.charset.StandardCharsets; +import java.time.Instant; import java.util.ArrayList; import java.util.List; @@ -22,8 +25,7 @@ import static org.mockito.ArgumentMatchers.any; import static org.mockito.ArgumentMatchers.anyLong; import static org.mockito.Mockito.when; -import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; -import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.post; +import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.*; import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.jsonPath; import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; @@ -33,10 +35,8 @@ class ItemControllerTest { @Autowired ObjectMapper mapper; - @MockBean private ItemService itemService; - @MockBean private CommentService commentService; @@ -93,7 +93,7 @@ void findItemById() throws Exception { void createItem() throws Exception { ItemDto itemDto = new ItemDto(); itemDto.setId(1L); - itemDto.setName("Name item"); + itemDto.setName("Name item3"); itemDto.setDescription("controller test create new item"); itemDto.setAvailable(true); @@ -112,5 +112,72 @@ void createItem() throws Exception { .andExpect(jsonPath("$.description", is(itemDto.getDescription()))); } +@Test + void updateItem() throws Exception { + ItemDto itemDto = new ItemDto(); + itemDto.setId(1L); + itemDto.setName("Name item4"); + itemDto.setDescription("controller test update item"); + itemDto.setAvailable(true); + + when(itemService.updateItem(any(), anyLong())) + .thenReturn(itemDto); + mvc.perform(patch("/items/1") + .header(HEADER_USER_ID, 1L) + .content(mapper.writeValueAsString(itemDto)) + .characterEncoding(StandardCharsets.UTF_8) + .contentType(MediaType.APPLICATION_JSON) + .accept(MediaType.APPLICATION_JSON)) + .andExpect(status().isOk()) + .andExpect(jsonPath("$.id", is(itemDto.getId()), Long.class)) + .andExpect(jsonPath("$.name", is(itemDto.getName()))) + .andExpect(jsonPath("$.description", is(itemDto.getDescription()))); + } + + @Test + void deleteItem() throws Exception { + mvc.perform(delete("/items/1") + .header(HEADER_USER_ID, 1L) + .characterEncoding(StandardCharsets.UTF_8) + .contentType(MediaType.APPLICATION_JSON) + .accept(MediaType.APPLICATION_JSON)) + .andExpect(status().isOk()); + + Mockito.verify(itemService, Mockito.times(1)) + .deleteItem(1L, 1L); + } + + @Test + void deleteAllItems() throws Exception { + mvc.perform(delete("/items") + .header(HEADER_USER_ID, 1L) + .characterEncoding(StandardCharsets.UTF_8) + .contentType(MediaType.APPLICATION_JSON) + .accept(MediaType.APPLICATION_JSON)) + .andExpect(status().isOk()); + + Mockito.verify(itemService, Mockito.times(1)) + .deleteAllItems(); + } + @Test + void addComment() throws Exception { + CommentDto commentDto = new CommentDto(); + commentDto.setId(1L); + commentDto.setItemId(1L); + commentDto.setText("comment item"); + commentDto.setAuthorId(2L); + commentDto.setCreated(Instant.now()); + + when(commentService.addComment(any())) + .thenReturn(commentDto); + + mvc.perform(post("/items/1/comment") + .header(HEADER_USER_ID, 2L) + .content(mapper.writeValueAsString(commentDto)) + .characterEncoding(StandardCharsets.UTF_8) + .contentType(MediaType.APPLICATION_JSON) + .accept(MediaType.APPLICATION_JSON)) + .andExpect(status().isCreated()); + } } \ No newline at end of file From 76c34785731d8b84eb6a92b2fda8b5cc0c65fc7f Mon Sep 17 00:00:00 2001 From: Andrej Stelmaschuk Date: Tue, 29 Apr 2025 22:54:56 +0700 Subject: [PATCH 18/46] =?UTF-8?q?feat:=20=D0=BF=D0=B8=D1=88=D0=B5=D0=BC=20?= =?UTF-8?q?=D1=82=D0=B5=D1=81=D1=82=D1=8B=20ItemRequestServiceImplTest?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../shareit/item/ItemControllerTest.java | 45 ++++++-- .../service/ItemRequestServiceImplTest.java | 107 ++++++++++++++++++ .../src/test/resoueces/application.properties | 1 + 3 files changed, 142 insertions(+), 11 deletions(-) create mode 100644 server/src/test/java/ru/practicum/shareit/request/service/ItemRequestServiceImplTest.java diff --git a/server/src/test/java/ru/practicum/shareit/item/ItemControllerTest.java b/server/src/test/java/ru/practicum/shareit/item/ItemControllerTest.java index 7884851..f18f5fb 100644 --- a/server/src/test/java/ru/practicum/shareit/item/ItemControllerTest.java +++ b/server/src/test/java/ru/practicum/shareit/item/ItemControllerTest.java @@ -18,12 +18,12 @@ import java.nio.charset.StandardCharsets; import java.time.Instant; import java.util.ArrayList; +import java.util.Collection; import java.util.List; import static org.hamcrest.Matchers.is; import static org.junit.jupiter.api.Assertions.*; -import static org.mockito.ArgumentMatchers.any; -import static org.mockito.ArgumentMatchers.anyLong; +import static org.mockito.ArgumentMatchers.*; import static org.mockito.Mockito.when; import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.*; import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.jsonPath; @@ -45,15 +45,7 @@ class ItemControllerTest { @Test void findAllItems() throws Exception { - List sourceItems = new ArrayList<>(); - int maxItems = 3; - for (int i = 1; i <= maxItems; i++) { - ItemDto itemDto = new ItemDto(); - itemDto.setName("Item_" + i); - itemDto.setDescription("controller test get item_" + i); - itemDto.setAvailable(true); - sourceItems.add(itemDto); - } + List sourceItems = makeItems(3); when(itemService.getItemsByOwnerId(anyLong())) .thenReturn(sourceItems); @@ -67,6 +59,24 @@ void findAllItems() throws Exception { .andExpect(jsonPath("$.length()").value(sourceItems.size())); } + @Test + public void onSearch() throws Exception { + List sourceItems = makeItems(2); + + when(itemService.searchItemsByText(anyString())) + .thenReturn(sourceItems); + + mvc.perform(get("/items/search") + .header(HEADER_USER_ID, 1L) + .param("text", "test") + .characterEncoding(StandardCharsets.UTF_8) + .contentType(MediaType.APPLICATION_JSON) + .accept(MediaType.APPLICATION_JSON)) + .andExpect(status().isOk()) + .andExpect(jsonPath("$.length()").value(sourceItems.size())); + + } + @Test void findItemById() throws Exception { ItemCommentsDto itemDto = new ItemCommentsDto(); @@ -180,4 +190,17 @@ void addComment() throws Exception { .accept(MediaType.APPLICATION_JSON)) .andExpect(status().isCreated()); } + + private List makeItems(Integer count) { + List sourceItems = new ArrayList<>(); + int maxItems = 3; + for (int i = 1; i <= count; i++) { + ItemDto itemDto = new ItemDto(); + itemDto.setName("Item_" + i); + itemDto.setDescription("controller test item_" + i); + itemDto.setAvailable(true); + sourceItems.add(itemDto); + } + return sourceItems; + } } \ No newline at end of file diff --git a/server/src/test/java/ru/practicum/shareit/request/service/ItemRequestServiceImplTest.java b/server/src/test/java/ru/practicum/shareit/request/service/ItemRequestServiceImplTest.java new file mode 100644 index 0000000..468fe0c --- /dev/null +++ b/server/src/test/java/ru/practicum/shareit/request/service/ItemRequestServiceImplTest.java @@ -0,0 +1,107 @@ +package ru.practicum.shareit.request.service; + +import lombok.RequiredArgsConstructor; +import org.junit.jupiter.api.BeforeAll; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.boot.test.mock.mockito.MockBean; +import org.springframework.transaction.annotation.Transactional; +import ru.practicum.shareit.request.dto.ItemRequestDto; +import ru.practicum.shareit.request.dto.RequestWithItemsDto; +import ru.practicum.shareit.user.User; +import ru.practicum.shareit.user.repository.UserRepository; + +import java.time.Instant; +import java.util.List; +import java.util.Optional; + +import static org.hamcrest.CoreMatchers.notNullValue; +import static org.hamcrest.MatcherAssert.assertThat; +import static org.junit.jupiter.api.Assertions.*; +import static org.mockito.ArgumentMatchers.anyLong; +import static org.mockito.Mockito.when; + +@Transactional +@SpringBootTest +@RequiredArgsConstructor(onConstructor_ = @Autowired) +class ItemRequestServiceImplTest { + private final ItemRequestService itemRequestService; + private final UserRepository userRepository; + + Long userId = 0L; + Long requestId = 0L; + + @Test + void create() { + User newUser = new User(1L, "UserName", "user@request.test"); + User savedUser = userRepository.save(newUser); + assertNotNull(savedUser, + "Пользователь не соххраняется в репозитории."); + userId = savedUser.getId(); + + ItemRequestDto itemRequestDto = new ItemRequestDto(); + itemRequestDto.setDescription("request test description"); + itemRequestDto.setCreated(Instant.now()); + ItemRequestDto savedRequestDto = itemRequestService.create( + userId, + itemRequestDto); + assertNotNull(savedRequestDto, + "Запрос не соххраняется в репозитории."); + requestId = savedRequestDto.getId(); + } + + + @Test + void findReqestsById() { + if (!requestId.equals(0)) { + create(); + } + RequestWithItemsDto rwi = + itemRequestService.findReqestsById(userId, requestId); + assertNotNull(rwi, "Запрос не найден."); + assertEquals( requestId, rwi.getId(), + "Идентификатор запроса не верен."); + } + + @Test + void findReqestsByCustomerId() { + if (!userId.equals(0)) { + create(); + } + ItemRequestDto itemRequestDto = new ItemRequestDto(); + itemRequestDto.setDescription("request test by customer id"); + itemRequestDto.setCreated(Instant.now()); + ItemRequestDto savedRequestDto = itemRequestService.create( + userId, + itemRequestDto); + List rwiList = + itemRequestService.findReqestsByCustomerId(userId); + assertThat(rwiList, notNullValue()); + assertTrue(rwiList.size() > 1); + } + + @Test + void findAllReqests() { + if (!userId.equals(0)) { + create(); + } + ItemRequestDto itemRequestDto = new ItemRequestDto(); + itemRequestDto.setDescription("request test find all"); + itemRequestDto.setCreated(Instant.now()); + ItemRequestDto savedRequestDto = itemRequestService.create( + userId, + itemRequestDto); + + // для поиска "чужих" запросов заведем еще одного пользователя + User newUser = new User(2L, "UserName2", "user2@request.test"); + User savedUser = userRepository.save(newUser); + + // ищем все "чужие запросы" + List rwiList = + itemRequestService.findAllReqests(savedUser.getId()); + assertThat(rwiList, notNullValue()); + assertTrue(rwiList.size() > 1); + } +} \ No newline at end of file diff --git a/server/src/test/resoueces/application.properties b/server/src/test/resoueces/application.properties index 3a1575a..87ac0b4 100644 --- a/server/src/test/resoueces/application.properties +++ b/server/src/test/resoueces/application.properties @@ -11,6 +11,7 @@ logging.level.org.zalando.logbook=TRACE #logging.level.org.springframework.transaction.interceptor=TRACE #logging.level.org.springframework.orm.jpa.JpaTransactionManager=DEBUG +spring.config.activate.on-profile=test spring.datasource.driverClassName=org.h2.Driver spring.datasource.url=jdbc:h2:mem:shareit spring.datasource.username=shareit From 57377029ceb781d522b701b129083cf33c61c310 Mon Sep 17 00:00:00 2001 From: andrej1307 Date: Wed, 30 Apr 2025 15:30:10 +0700 Subject: [PATCH 19/46] =?UTF-8?q?feat:=20=D0=B4=D0=BE=D0=B1=D0=B0=D0=B2?= =?UTF-8?q?=D0=BB=D1=8F=D0=B5=D0=BC=20=D1=82=D0=B5=D1=81=D1=82=D1=8B=20?= =?UTF-8?q?=D0=B4=D0=BB=D1=8F=20Booking?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../shareit/booking/dto/BookingDto.java | 3 + .../shareit/booking/dto/BookingDtoTest.java | 42 ++++++ .../service/BookingServiceImplTest.java | 41 ++++++ .../request/ItemRequestControllerTest.java | 132 ++++++++++++++++++ 4 files changed, 218 insertions(+) create mode 100644 server/src/test/java/ru/practicum/shareit/booking/dto/BookingDtoTest.java create mode 100644 server/src/test/java/ru/practicum/shareit/booking/service/BookingServiceImplTest.java create mode 100644 server/src/test/java/ru/practicum/shareit/request/ItemRequestControllerTest.java diff --git a/server/src/main/java/ru/practicum/shareit/booking/dto/BookingDto.java b/server/src/main/java/ru/practicum/shareit/booking/dto/BookingDto.java index 5a76380..15fc1b6 100644 --- a/server/src/main/java/ru/practicum/shareit/booking/dto/BookingDto.java +++ b/server/src/main/java/ru/practicum/shareit/booking/dto/BookingDto.java @@ -1,5 +1,6 @@ package ru.practicum.shareit.booking.dto; +import com.fasterxml.jackson.annotation.JsonFormat; import jakarta.validation.constraints.NotNull; import lombok.AllArgsConstructor; import lombok.Data; @@ -21,9 +22,11 @@ public class BookingDto { private Long id; @NotNull(message = "Время начала бронирования должно быть задано.", groups = {ValidAction.OnCreate.class}) + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") private LocalDateTime start; @NotNull(message = "Время завершения бронирования должно быть задано.", groups = {ValidAction.OnCreate.class}) + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") private LocalDateTime end; private Long itemId; diff --git a/server/src/test/java/ru/practicum/shareit/booking/dto/BookingDtoTest.java b/server/src/test/java/ru/practicum/shareit/booking/dto/BookingDtoTest.java new file mode 100644 index 0000000..fc657b1 --- /dev/null +++ b/server/src/test/java/ru/practicum/shareit/booking/dto/BookingDtoTest.java @@ -0,0 +1,42 @@ +package ru.practicum.shareit.booking.dto; + +import lombok.RequiredArgsConstructor; +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.autoconfigure.json.JsonTest; +import org.springframework.boot.test.json.JacksonTester; +import org.springframework.boot.test.json.JsonContent; +import ru.practicum.shareit.booking.enums.BookingStatus; +import ru.practicum.shareit.item.dto.ItemDto; +import ru.practicum.shareit.user.dto.UserDto; + +import java.time.LocalDateTime; + +import static org.assertj.core.api.AssertionsForInterfaceTypes.assertThat; +import static org.junit.jupiter.api.Assertions.*; + +@JsonTest +@RequiredArgsConstructor(onConstructor_ = @Autowired) +class BookingDtoTest { + private final JacksonTester json; + + // BookingDto bookingDto = new BookingDto(); + @Test + void testBookingDto() throws Exception{ + BookingDto bookingDto = new BookingDto(); + bookingDto.setId(1L); + bookingDto.setStart(LocalDateTime.now()); + bookingDto.setEnd(LocalDateTime.now().plusDays(1)); + bookingDto.setItemId(1l); + bookingDto.setBookerId(1l); + bookingDto.setStatus(BookingStatus.APPROVED); + + JsonContent result = json.write(bookingDto); + + assertThat(result).extractingJsonPathNumberValue("$.id").isEqualTo(1); + assertThat(result).extractingJsonPathNumberValue("$.itemId").isEqualTo(1); + assertThat(result).extractingJsonPathNumberValue("$.bookerId").isEqualTo(1); + } + + +} \ No newline at end of file diff --git a/server/src/test/java/ru/practicum/shareit/booking/service/BookingServiceImplTest.java b/server/src/test/java/ru/practicum/shareit/booking/service/BookingServiceImplTest.java new file mode 100644 index 0000000..07b6b15 --- /dev/null +++ b/server/src/test/java/ru/practicum/shareit/booking/service/BookingServiceImplTest.java @@ -0,0 +1,41 @@ +package ru.practicum.shareit.booking.service; + +import lombok.RequiredArgsConstructor; +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.transaction.annotation.Transactional; +import ru.practicum.shareit.booking.repository.BookingRepository; +import ru.practicum.shareit.request.service.ItemRequestService; +import ru.practicum.shareit.user.repository.UserRepository; + +import static org.junit.jupiter.api.Assertions.*; + +@Transactional +@SpringBootTest +@RequiredArgsConstructor(onConstructor_ = @Autowired) +class BookingServiceImplTest { + + private final ItemRequestService itemRequestService; + private final UserRepository userRepository; + private final BookingRepository bookingRepository; + @Test + void addBooking() { + } + + @Test + void findBookingById() { + } + + @Test + void approvedBooking() { + } + + @Test + void findBookingsByOwner() { + } + + @Test + void findBookingByBooker() { + } +} \ No newline at end of file diff --git a/server/src/test/java/ru/practicum/shareit/request/ItemRequestControllerTest.java b/server/src/test/java/ru/practicum/shareit/request/ItemRequestControllerTest.java new file mode 100644 index 0000000..f8de434 --- /dev/null +++ b/server/src/test/java/ru/practicum/shareit/request/ItemRequestControllerTest.java @@ -0,0 +1,132 @@ +package ru.practicum.shareit.request; + +import com.fasterxml.jackson.databind.ObjectMapper; +import org.junit.jupiter.api.Test; +import org.mockito.stubbing.OngoingStubbing; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest; +import org.springframework.boot.test.mock.mockito.MockBean; +import org.springframework.http.MediaType; +import org.springframework.test.web.servlet.MockMvc; +import ru.practicum.shareit.item.dto.ItemDto; +import ru.practicum.shareit.request.dto.ItemRequestDto; +import ru.practicum.shareit.request.dto.RequestWithItemsDto; +import ru.practicum.shareit.request.service.ItemRequestService; +import ru.practicum.shareit.user.UserController; +import ru.practicum.shareit.user.dto.UserDto; + +import java.nio.charset.StandardCharsets; +import java.time.Instant; +import java.util.ArrayList; +import java.util.List; + +import static org.hamcrest.Matchers.is; +import static org.junit.jupiter.api.Assertions.*; +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.ArgumentMatchers.anyLong; +import static org.mockito.Mockito.when; +import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.*; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.jsonPath; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; + +@WebMvcTest(controllers = ItemRequestController.class) +class ItemRequestControllerTest { + private static final String HEADER_USER_ID = "X-Sharer-User-Id"; + + @Autowired + ObjectMapper mapper; + + @MockBean + private ItemRequestService itemRequestService; + + @Autowired + private MockMvc mvc; + + @Test + void createItemRequest() throws Exception { + ItemRequestDto itemRequestDto = new ItemRequestDto(); + itemRequestDto.setId(1L); + itemRequestDto.setDescription("description"); + itemRequestDto.setRequestor(new UserDto(1L, "user","user@request.crate.test")); + itemRequestDto.setCreated(Instant.now()); + + when(itemRequestService.create(anyLong(), any())) + .thenReturn(itemRequestDto); + + mvc.perform(post("/requests") + .header(HEADER_USER_ID, 1L) + .content(mapper.writeValueAsString(itemRequestDto)) + .characterEncoding(StandardCharsets.UTF_8) + .contentType(MediaType.APPLICATION_JSON) + .accept(MediaType.APPLICATION_JSON)) + .andExpect(status().isCreated()) + .andExpect(jsonPath("$.id", is(itemRequestDto.getId()), Long.class)) + .andExpect(jsonPath("$.description", is(itemRequestDto.getDescription()))); + + } + + @Test + void findItemRequest() throws Exception{ + RequestWithItemsDto rwi = new RequestWithItemsDto(); + rwi.setId(1L); + rwi.setDescription("description"); + rwi.setRequestor(new UserDto(1L, "user","user@request.crate.test")); + rwi.setCreated(Instant.now()); + when(itemRequestService.findReqestsById(anyLong(), anyLong())) + .thenReturn(rwi); + + mvc.perform(get("/requests/1") + .header(HEADER_USER_ID, 1L) + .characterEncoding(StandardCharsets.UTF_8) + .contentType(MediaType.APPLICATION_JSON) + .accept(MediaType.APPLICATION_JSON)) + .andExpect(status().isOk()) + .andExpect(jsonPath("$.id", is(rwi.getId()), Long.class)) + .andExpect(jsonPath("$.description", is(rwi.getDescription()))); + + } + + @Test + void findRequestsByUserId() throws Exception { + List rwiList =makeRequests(2); + + when(itemRequestService.findReqestsByCustomerId(anyLong())) + .thenReturn(rwiList); + + mvc.perform(get("/requests") + .header(HEADER_USER_ID, 1L) + .characterEncoding(StandardCharsets.UTF_8) + .contentType(MediaType.APPLICATION_JSON) + .accept(MediaType.APPLICATION_JSON)) + .andExpect(status().isOk()); + } + + @Test + void findAllRequests() throws Exception { + List rwiList =makeRequests(3); + + when(itemRequestService.findAllReqests(anyLong())) + .thenReturn(rwiList); + + mvc.perform(get("/requests/all") + .header(HEADER_USER_ID, 2L) + .characterEncoding(StandardCharsets.UTF_8) + .contentType(MediaType.APPLICATION_JSON) + .accept(MediaType.APPLICATION_JSON)) + .andExpect(status().isOk()); + } + + private List makeRequests(Integer count) { + List rwiList = new ArrayList<>(); + int maxItems = 3; + for (int i = 1; i <= count; i++) { + RequestWithItemsDto rwi = new RequestWithItemsDto(); + rwi.setId((long) i); + rwi.setDescription("controller test item_" + i); + rwi.setRequestor(new UserDto(1L, "user","user@request.crate.test")); + rwi.setCreated(Instant.now().plusSeconds(60 * i)); + rwiList.add(rwi); + } + return rwiList; + } +} \ No newline at end of file From 00635838ea7fe595cdf12db8aed2dfe7b129faf7 Mon Sep 17 00:00:00 2001 From: Andrej Stelmaschuk Date: Wed, 30 Apr 2025 19:20:25 +0700 Subject: [PATCH 20/46] =?UTF-8?q?feat:=20=D0=BF=D0=B8=D1=88=D0=B5=D0=BC=20?= =?UTF-8?q?=D1=82=D0=B5=D1=81=D1=82=D1=8B=20BookingServiceImplTest?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../service/BookingServiceImplTest.java | 56 ++++++++++++++++++- .../item/service/ItemServiceImplTest.java | 2 +- 2 files changed, 56 insertions(+), 2 deletions(-) diff --git a/server/src/test/java/ru/practicum/shareit/booking/service/BookingServiceImplTest.java b/server/src/test/java/ru/practicum/shareit/booking/service/BookingServiceImplTest.java index 07b6b15..1ad45fb 100644 --- a/server/src/test/java/ru/practicum/shareit/booking/service/BookingServiceImplTest.java +++ b/server/src/test/java/ru/practicum/shareit/booking/service/BookingServiceImplTest.java @@ -5,10 +5,20 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.transaction.annotation.Transactional; +import ru.practicum.shareit.booking.dto.BookingDto; +import ru.practicum.shareit.booking.enums.BookingStatus; import ru.practicum.shareit.booking.repository.BookingRepository; +import ru.practicum.shareit.item.model.Item; +import ru.practicum.shareit.item.repository.ItemRepository; import ru.practicum.shareit.request.service.ItemRequestService; +import ru.practicum.shareit.user.User; +import ru.practicum.shareit.user.dto.UserDto; import ru.practicum.shareit.user.repository.UserRepository; +import java.time.LocalDateTime; + +import static org.hamcrest.CoreMatchers.notNullValue; +import static org.hamcrest.MatcherAssert.assertThat; import static org.junit.jupiter.api.Assertions.*; @Transactional @@ -19,8 +29,52 @@ class BookingServiceImplTest { private final ItemRequestService itemRequestService; private final UserRepository userRepository; private final BookingRepository bookingRepository; + + Long ownerId = 0L; + Long itemId = 0L; + Long userId = 0L; + Long bookingId = 0L; + @Autowired + private ItemRepository itemRepository; + @Autowired + private BookingServiceImpl bookingServiceImpl; + @Test - void addBooking() { + void addBooking() throws Exception { + User user = new User(); + user.setName("User1"); + user.setEmail("user1@booking.test"); + User owner = userRepository.save(user); + assertThat(owner.getId(), notNullValue()); + ownerId = owner.getId(); + + user = new User(); + user.setName("User2"); + user.setEmail("user2@booking.test"); + User savedUser = userRepository.save(user); + assertThat(savedUser.getId(), notNullValue()); + userId = savedUser.getId(); + + Item item = new Item(); + item.setName("Item1"); + item.setDescription("Item1"); + item.setOwner(owner); + item.setAvailable(true); + item.setRequest(null); + Item savedItem = itemRepository.save(item); + assertThat(savedItem.getId(), notNullValue()); + itemId = savedItem.getId(); + + BookingDto bookingDto = new BookingDto(); + bookingDto.setItemId(itemId); + bookingDto.setBookerId(userId); + bookingDto.setStart(LocalDateTime.of(2025, 05, 12, 10, 10)); + bookingDto.setEnd(LocalDateTime.of(2025, 05, 15, 10, 10)); + bookingDto.setStatus(BookingStatus.WAITING); + + BookingDto savedBookingDto = bookingServiceImpl.addBooking(bookingDto, userId); + assertThat(savedBookingDto.getId(), notNullValue()); + bookingId = savedBookingDto.getId(); } @Test diff --git a/server/src/test/java/ru/practicum/shareit/item/service/ItemServiceImplTest.java b/server/src/test/java/ru/practicum/shareit/item/service/ItemServiceImplTest.java index 2ca4349..d19daaa 100644 --- a/server/src/test/java/ru/practicum/shareit/item/service/ItemServiceImplTest.java +++ b/server/src/test/java/ru/practicum/shareit/item/service/ItemServiceImplTest.java @@ -29,7 +29,7 @@ class ItemServiceImplTest { */ @Test void getItemsByOwnerId() { - // создаем поельзователя - хозяина вещей + // создаем пользователя - хозяина вещей UserDto userDto = new UserDto(); userDto.setName("User1"); userDto.setEmail("user1@get.items.test"); From 9d7f870bf575560c370d81b3775d48ac2fc44434 Mon Sep 17 00:00:00 2001 From: Andrej Stelmaschuk Date: Thu, 1 May 2025 23:37:49 +0700 Subject: [PATCH 21/46] =?UTF-8?q?feat:=20=D0=BF=D0=B8=D1=88=D0=B5=D0=BC=20?= =?UTF-8?q?=D1=82=D0=B5=D1=81=D1=82=D1=8B=20=D0=B4=D0=BB=D1=8F=20=D0=BC?= =?UTF-8?q?=D0=BE=D0=B4=D1=83=D0=BB=D1=8F=20Gateway?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../shareit/item/ItemController.java | 2 +- .../booking/BookingControllerTest.java | 46 +++++ .../shareit/item/ItemControllerTest.java | 157 ++++++++++++++++++ .../request/ItemRequestControllerTest.java | 117 +++++++++++++ .../shareit/user/UserControllerTest.java | 119 +++++++++++++ .../src/test/resources/application.properties | 7 + .../shareit/booking/BookingController.java | 12 +- .../shareit/booking/enums/SearchState.java | 29 +++- .../booking/service/BookingServiceImpl.java | 1 - .../practicum/shareit/ShareItServerTest.java | 16 ++ .../booking/BookingControllerTest.java | 134 +++++++++++++++ .../service/BookingServiceImplTest.java | 98 +++++++++-- .../item/service/CommentServiceImplTest.java | 85 ++++++++++ .../item/service/ItemServiceImplTest.java | 121 ++++++++++++-- .../service/ItemRequestServiceImplTest.java | 16 +- 15 files changed, 912 insertions(+), 48 deletions(-) create mode 100644 gateway/src/test/java/ru/practicum/shareit/booking/BookingControllerTest.java create mode 100644 gateway/src/test/java/ru/practicum/shareit/item/ItemControllerTest.java create mode 100644 gateway/src/test/java/ru/practicum/shareit/request/ItemRequestControllerTest.java create mode 100644 gateway/src/test/java/ru/practicum/shareit/user/UserControllerTest.java create mode 100644 gateway/src/test/resources/application.properties create mode 100644 server/src/test/java/ru/practicum/shareit/ShareItServerTest.java create mode 100644 server/src/test/java/ru/practicum/shareit/booking/BookingControllerTest.java create mode 100644 server/src/test/java/ru/practicum/shareit/item/service/CommentServiceImplTest.java diff --git a/gateway/src/main/java/ru/practicum/shareit/item/ItemController.java b/gateway/src/main/java/ru/practicum/shareit/item/ItemController.java index 55bc07b..21e70c3 100644 --- a/gateway/src/main/java/ru/practicum/shareit/item/ItemController.java +++ b/gateway/src/main/java/ru/practicum/shareit/item/ItemController.java @@ -48,7 +48,7 @@ public ResponseEntity findAllItems( @GetMapping("/search") @ResponseStatus(HttpStatus.OK) public ResponseEntity onSearch( - @RequestHeader(HEADER_USER_ID) final Long userId, + @RequestHeader(HEADER_USER_ID) Long userId, @RequestParam(name = "text") String text) { log.info("Ищем вещи содержащие текст \"{}\" в названии или описании.", text); return itemClient.searchItemsByText(userId, text); diff --git a/gateway/src/test/java/ru/practicum/shareit/booking/BookingControllerTest.java b/gateway/src/test/java/ru/practicum/shareit/booking/BookingControllerTest.java new file mode 100644 index 0000000..2b3641c --- /dev/null +++ b/gateway/src/test/java/ru/practicum/shareit/booking/BookingControllerTest.java @@ -0,0 +1,46 @@ +package ru.practicum.shareit.booking; + +import com.fasterxml.jackson.databind.ObjectMapper; +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest; +import org.springframework.boot.test.mock.mockito.MockBean; +import org.springframework.test.web.servlet.MockMvc; +import ru.practicum.shareit.request.ItemRequestClient; +import ru.practicum.shareit.request.ItemRequestController; + +import static org.junit.jupiter.api.Assertions.*; + +@WebMvcTest(controllers = ItemRequestController.class) +class BookingControllerTest { + private static final String HEADER_USER_ID = "X-Sharer-User-Id"; + + @Autowired + ObjectMapper mapper; + + @MockBean + private ItemRequestClient itemRequestClient; + + @Autowired + private MockMvc mvc; + + @Test + void getBookings() { + } + + @Test + void bookItem() { + } + + @Test + void editBooking() { + } + + @Test + void getBooking() { + } + + @Test + void findBookingByOwner() { + } +} \ No newline at end of file diff --git a/gateway/src/test/java/ru/practicum/shareit/item/ItemControllerTest.java b/gateway/src/test/java/ru/practicum/shareit/item/ItemControllerTest.java new file mode 100644 index 0000000..9d33ad5 --- /dev/null +++ b/gateway/src/test/java/ru/practicum/shareit/item/ItemControllerTest.java @@ -0,0 +1,157 @@ +package ru.practicum.shareit.item; + +import com.fasterxml.jackson.databind.ObjectMapper; +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest; +import org.springframework.boot.test.mock.mockito.MockBean; +import org.springframework.http.HttpStatus; +import org.springframework.http.MediaType; +import org.springframework.http.ResponseEntity; +import org.springframework.test.web.servlet.MockMvc; +import ru.practicum.shareit.item.dto.CommentDto; +import ru.practicum.shareit.item.dto.ItemDto; +import ru.practicum.shareit.user.UserController; + +import java.nio.charset.StandardCharsets; +import java.util.ArrayList; +import java.util.List; + +import static org.hamcrest.Matchers.is; +import static org.junit.jupiter.api.Assertions.*; +import static org.mockito.ArgumentMatchers.*; +import static org.mockito.Mockito.when; +import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.*; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.jsonPath; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; + +@WebMvcTest(controllers = ItemController.class) +class ItemControllerTest { + private static final String HEADER_USER_ID = "X-Sharer-User-Id"; + + @Autowired + ObjectMapper mapper; + + @MockBean + private ItemClient itemClient; + + @Autowired + private MockMvc mvc; + + ItemDto testItemDto = new ItemDto( + 1L, + "Item1", + "Item1", + true, + null, + null, + null); + + @Test + void createItem() throws Exception{ + ResponseEntity response = new ResponseEntity<>( + testItemDto, HttpStatus.CREATED); + when(itemClient.createItem(anyLong(), any())) + .thenReturn(response); + + mvc.perform(post("/items") + .header(HEADER_USER_ID, 1L) + .content(mapper.writeValueAsString(testItemDto)) + .characterEncoding(StandardCharsets.UTF_8) + .contentType(MediaType.APPLICATION_JSON) + .accept(MediaType.APPLICATION_JSON)) + .andExpect(status().isCreated()) + .andExpect(jsonPath("$.name", is(testItemDto.getName()))); + + + } + + @Test + void findItem() throws Exception{ + ResponseEntity response = new ResponseEntity<>( + testItemDto, HttpStatus.OK); + when(itemClient.findItemById(anyLong(), anyLong())) + .thenReturn(response); + + mvc.perform(get("/items/1") + .header(HEADER_USER_ID, 1L) + .characterEncoding(StandardCharsets.UTF_8) + .contentType(MediaType.APPLICATION_JSON) + .accept(MediaType.APPLICATION_JSON)) + .andExpect(status().isOk()) + .andExpect(jsonPath("$.name", is(testItemDto.getName()))); + } + + @Test + void findAllItems() throws Exception{ + List itemDtos = new ArrayList<>(); + itemDtos.add(testItemDto); + ResponseEntity response = new ResponseEntity<>( + itemDtos, HttpStatus.OK); + when(itemClient.findAllItems(anyLong())) + .thenReturn(response); + + mvc.perform(get("/items") + .header(HEADER_USER_ID, 1L) + .characterEncoding(StandardCharsets.UTF_8) + .contentType(MediaType.APPLICATION_JSON) + .accept(MediaType.APPLICATION_JSON)) + .andExpect(status().isOk()) + .andExpect(jsonPath("$").isArray()); + } + + @Test + void onSearch() throws Exception{ + List itemDtos = new ArrayList<>(); + itemDtos.add(testItemDto); + ResponseEntity response = new ResponseEntity<>( + itemDtos, HttpStatus.OK); + when(itemClient.searchItemsByText(anyLong(), anyString())) + .thenReturn(response); + + mvc.perform(get("/items/search?text=Item") + .header(HEADER_USER_ID, 1L) + .characterEncoding(StandardCharsets.UTF_8) + .contentType(MediaType.APPLICATION_JSON) + .accept(MediaType.APPLICATION_JSON)) + .andExpect(status().isOk()) + .andExpect(jsonPath("$").isArray()); + } + + @Test + void updateItem() throws Exception{ + ResponseEntity response = new ResponseEntity<>( + testItemDto, HttpStatus.OK); + when(itemClient.updateItem(anyLong(), anyLong(), any())) + .thenReturn(response); + + mvc.perform(patch("/items/1") + .header(HEADER_USER_ID, 1L) + .content(mapper.writeValueAsString(testItemDto)) + .characterEncoding(StandardCharsets.UTF_8) + .contentType(MediaType.APPLICATION_JSON) + .accept(MediaType.APPLICATION_JSON)) + .andExpect(status().isOk()) + .andExpect(jsonPath("$.name", is(testItemDto.getName()))); + } + + @Test + void addComment() throws Exception{ + CommentDto commentDto = new CommentDto(); + commentDto.setItemId(testItemDto.getId()); + commentDto.setText("Comment text"); + + ResponseEntity response = new ResponseEntity<>( + testItemDto, HttpStatus.CREATED); + when(itemClient.addComment(anyLong(), anyLong(), any())) + .thenReturn(response); + + mvc.perform(post("/items/1/comment") + .header(HEADER_USER_ID, 1L) + .content(mapper.writeValueAsString(commentDto)) + .characterEncoding(StandardCharsets.UTF_8) + .contentType(MediaType.APPLICATION_JSON) + .accept(MediaType.APPLICATION_JSON)) + .andExpect(status().isCreated()); + } +} \ No newline at end of file diff --git a/gateway/src/test/java/ru/practicum/shareit/request/ItemRequestControllerTest.java b/gateway/src/test/java/ru/practicum/shareit/request/ItemRequestControllerTest.java new file mode 100644 index 0000000..3d28c69 --- /dev/null +++ b/gateway/src/test/java/ru/practicum/shareit/request/ItemRequestControllerTest.java @@ -0,0 +1,117 @@ +package ru.practicum.shareit.request; + +import com.fasterxml.jackson.databind.ObjectMapper; +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest; +import org.springframework.boot.test.mock.mockito.MockBean; +import org.springframework.http.HttpStatus; +import org.springframework.http.MediaType; +import org.springframework.http.ResponseEntity; +import org.springframework.test.web.servlet.MockMvc; +import ru.practicum.shareit.item.ItemClient; +import ru.practicum.shareit.item.ItemController; +import ru.practicum.shareit.request.dto.ItemRequestDto; +import ru.practicum.shareit.user.dto.UserDto; + +import java.nio.charset.StandardCharsets; +import java.time.Instant; +import java.util.ArrayList; +import java.util.List; + +import static org.hamcrest.Matchers.is; +import static org.junit.jupiter.api.Assertions.*; +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.ArgumentMatchers.anyLong; +import static org.mockito.Mockito.when; +import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; +import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.post; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.jsonPath; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; + +@WebMvcTest(controllers = ItemRequestController.class) +class ItemRequestControllerTest { + private static final String HEADER_USER_ID = "X-Sharer-User-Id"; + + @Autowired + ObjectMapper mapper; + + @MockBean + private ItemRequestClient itemRequestClient; + + @Autowired + private MockMvc mvc; + + ItemRequestDto itemRequestDto = new ItemRequestDto( + 1L, + "Request text.", + new UserDto(1L, "user", "user@request.test"), + Instant.now()); + + @Test + void createItemRequest() throws Exception { + ResponseEntity response = new ResponseEntity<>( + itemRequestDto, HttpStatus.CREATED); + when(itemRequestClient.createRequest(anyLong(), any())) + .thenReturn(response); + + mvc.perform(post("/requests") + .header(HEADER_USER_ID, 1L) + .content(mapper.writeValueAsString(itemRequestDto)) + .characterEncoding(StandardCharsets.UTF_8) + .contentType(MediaType.APPLICATION_JSON) + .accept(MediaType.APPLICATION_JSON)) + .andExpect(status().isCreated()) + .andExpect(jsonPath("$.description", is(itemRequestDto.getDescription()))); + } + + @Test + void findItemRequest() throws Exception { + ResponseEntity response = new ResponseEntity<>( + itemRequestDto, HttpStatus.OK); + when(itemRequestClient.findRequest(anyLong(), anyLong())) + .thenReturn(response); + + mvc.perform(get("/requests/1") + .header(HEADER_USER_ID, 1L) + .characterEncoding(StandardCharsets.UTF_8) + .contentType(MediaType.APPLICATION_JSON) + .accept(MediaType.APPLICATION_JSON)) + .andExpect(status().isOk()) + .andExpect(jsonPath("$.description", is(itemRequestDto.getDescription()))); + } + + @Test + void findRequestsByUserId() throws Exception { + ResponseEntity response = new ResponseEntity<>( + itemRequestDto, HttpStatus.OK); + when(itemRequestClient.findRequestsByCustomerId(anyLong())) + .thenReturn(response); + + mvc.perform(get("/requests") + .header(HEADER_USER_ID, 1L) + .characterEncoding(StandardCharsets.UTF_8) + .contentType(MediaType.APPLICATION_JSON) + .accept(MediaType.APPLICATION_JSON)) + .andExpect(status().isOk()) + .andExpect(jsonPath("$.description", is(itemRequestDto.getDescription()))); + } + + @Test + void findAllRequests() throws Exception { + List itemRequestDtos = new ArrayList<>(); + itemRequestDtos.add(itemRequestDto); + + ResponseEntity response = new ResponseEntity<>( + itemRequestDtos, HttpStatus.OK); + when(itemRequestClient.findAllRequests(anyLong())) + .thenReturn(response); + + mvc.perform(get("/requests/all") + .header(HEADER_USER_ID, 1L) + .characterEncoding(StandardCharsets.UTF_8) + .contentType(MediaType.APPLICATION_JSON) + .accept(MediaType.APPLICATION_JSON)) + .andExpect(status().isOk()); + } +} \ No newline at end of file diff --git a/gateway/src/test/java/ru/practicum/shareit/user/UserControllerTest.java b/gateway/src/test/java/ru/practicum/shareit/user/UserControllerTest.java new file mode 100644 index 0000000..59945bd --- /dev/null +++ b/gateway/src/test/java/ru/practicum/shareit/user/UserControllerTest.java @@ -0,0 +1,119 @@ +package ru.practicum.shareit.user; + +import com.fasterxml.jackson.databind.ObjectMapper; +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest; +import org.springframework.boot.test.mock.mockito.MockBean; +import org.springframework.http.HttpStatus; +import org.springframework.http.MediaType; +import org.springframework.http.ResponseEntity; +import org.springframework.test.web.servlet.MockMvc; +import ru.practicum.shareit.user.dto.UserDto; + +import java.nio.charset.StandardCharsets; +import java.util.ArrayList; +import java.util.List; + +import static org.hamcrest.Matchers.is; +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.ArgumentMatchers.anyLong; +import static org.mockito.Mockito.when; +import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.*; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.jsonPath; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; + +@WebMvcTest(controllers = UserController.class) +class UserControllerTest { + @Autowired + ObjectMapper mapper; + + @MockBean + private UserClient userClient; + + @Autowired + private MockMvc mvc; + + UserDto testUserDto = new UserDto( + 1L, + "tetUser", + "test_user@gateway.test"); + + @Test + void addNewUser() throws Exception { + ResponseEntity response = new ResponseEntity<>( + testUserDto, HttpStatus.CREATED); + + when(userClient.addUser(any())) + .thenReturn(response); + + mvc.perform(post("/users") + .content(mapper.writeValueAsString(testUserDto)) + .characterEncoding(StandardCharsets.UTF_8) + .contentType(MediaType.APPLICATION_JSON) + .accept(MediaType.APPLICATION_JSON)) + .andExpect(status().isCreated()) + .andExpect(jsonPath("$.id", is(testUserDto.getId()), Long.class)) + .andExpect(jsonPath("$.name", is(testUserDto.getName()))) + .andExpect(jsonPath("$.email", is(testUserDto.getEmail()))); + } + + @Test + void findUser() throws Exception { + ResponseEntity response = new ResponseEntity<>( + testUserDto, HttpStatus.OK); + + when(userClient.findUserByID(anyLong())) + .thenReturn(response); + + mvc.perform(get("/users/1") + .characterEncoding(StandardCharsets.UTF_8) + .contentType(MediaType.APPLICATION_JSON) + .accept(MediaType.APPLICATION_JSON)) + .andExpect(status().isOk()) + .andExpect(jsonPath("$.id", is(testUserDto.getId()), Long.class)) + .andExpect(jsonPath("$.name", is(testUserDto.getName()))) + .andExpect(jsonPath("$.email", is(testUserDto.getEmail()))); + } + + @Test + void findAllUser() throws Exception { + List userDtos = new ArrayList<>(); + userDtos.add(testUserDto); + + ResponseEntity response = new ResponseEntity<>( + userDtos, HttpStatus.OK); + + when(userClient.findAllUsers()) + .thenReturn(response); + + mvc.perform(get("/users") + .characterEncoding(StandardCharsets.UTF_8) + .contentType(MediaType.APPLICATION_JSON) + .accept(MediaType.APPLICATION_JSON)) + .andExpect(status().isOk()) + .andExpect(jsonPath("$").isArray()) + .andExpect(jsonPath("$.length()").value(1)); + + } + + @Test + void updateUser() throws Exception { + ResponseEntity response = new ResponseEntity<>( + testUserDto, HttpStatus.OK); + + when(userClient.updateUser(anyLong(), any())) + .thenReturn(response); + + mvc.perform(patch("/users/1") + .content(mapper.writeValueAsString(testUserDto)) + .characterEncoding(StandardCharsets.UTF_8) + .contentType(MediaType.APPLICATION_JSON) + .accept(MediaType.APPLICATION_JSON)) + .andExpect(status().isOk()) + .andExpect(jsonPath("$.id", is(testUserDto.getId()), Long.class)) + .andExpect(jsonPath("$.name", is(testUserDto.getName()))) + .andExpect(jsonPath("$.email", is(testUserDto.getEmail()))); + } + +} \ No newline at end of file diff --git a/gateway/src/test/resources/application.properties b/gateway/src/test/resources/application.properties new file mode 100644 index 0000000..2ee0851 --- /dev/null +++ b/gateway/src/test/resources/application.properties @@ -0,0 +1,7 @@ +logging.level.org.springframework.web.client.RestTemplate=DEBUG +#logging.level.org.apache.http=DEBUG +#logging.level.httpclient.wire=DEBUG + +server.port=8080 + +shareit-server.url=http://localhost:9090 \ No newline at end of file diff --git a/server/src/main/java/ru/practicum/shareit/booking/BookingController.java b/server/src/main/java/ru/practicum/shareit/booking/BookingController.java index dd8c451..621a012 100644 --- a/server/src/main/java/ru/practicum/shareit/booking/BookingController.java +++ b/server/src/main/java/ru/practicum/shareit/booking/BookingController.java @@ -38,7 +38,7 @@ public BookingDto addBooking( @PatchMapping("/{id}") @ResponseStatus(HttpStatus.OK) public BookingDto editBooking( - @RequestHeader(HEADER_USER_ID) final Long editorId, + @RequestHeader(HEADER_USER_ID) Long editorId, @PathVariable Long id, @RequestParam Boolean approved) { log.info("Пользователь id={} редактирует запрос на бронирование id={}", editorId, id); @@ -58,7 +58,10 @@ public BookingDto findBooking( @ResponseStatus(HttpStatus.OK) public List findBookingByBooker( @RequestHeader(HEADER_USER_ID) final Long bookerId, - @RequestParam(defaultValue = "ALL") SearchState state) { + @RequestParam(name = "state", defaultValue = "all") String stateParam) { + SearchState state = SearchState.from(stateParam) + .orElseThrow(() -> new IllegalArgumentException("Неизвестный режим: " + stateParam)); + log.info("Пользователь id={} просматривает свои запроcы на бронирование", bookerId); return bookingService.findBookingByBooker(bookerId, state); } @@ -67,7 +70,10 @@ public List findBookingByBooker( @ResponseStatus(HttpStatus.OK) public List findBookingByOwner( @RequestHeader(HEADER_USER_ID) final Long ownerId, - @RequestParam(defaultValue = "ALL") SearchState state) { + @RequestParam(name = "state", defaultValue = "all") String stateParam) { + SearchState state = SearchState.from(stateParam) + .orElseThrow(() -> new IllegalArgumentException("Неизвестный режим: " + stateParam)); + log.info("Пользователь id={} просматривает запроcы на все вещи", ownerId); return bookingService.findBookingsByOwner(ownerId, state); } diff --git a/server/src/main/java/ru/practicum/shareit/booking/enums/SearchState.java b/server/src/main/java/ru/practicum/shareit/booking/enums/SearchState.java index e65cfe3..20690e6 100644 --- a/server/src/main/java/ru/practicum/shareit/booking/enums/SearchState.java +++ b/server/src/main/java/ru/practicum/shareit/booking/enums/SearchState.java @@ -1,13 +1,30 @@ package ru.practicum.shareit.booking.enums; +import java.util.Optional; + /** * Описание режимов поиска запросов на бронирование */ public enum SearchState { - ALL, // Все - CURRENT, // Текущие - PAST, // Завершенные - FUTURE, // Будущие - WAITING, // Ожидающие подтверждения - REJECTED, // Отклоненные + // Все + ALL, + // Текущие + CURRENT, + // Будущие + FUTURE, + // Завершенные + PAST, + // Отклоненные + REJECTED, + // Ожидающие подтверждения + WAITING; + + public static Optional from(String stringState) { + for (SearchState state : values()) { + if (state.name().equalsIgnoreCase(stringState)) { + return Optional.of(state); + } + } + return Optional.empty(); + } } diff --git a/server/src/main/java/ru/practicum/shareit/booking/service/BookingServiceImpl.java b/server/src/main/java/ru/practicum/shareit/booking/service/BookingServiceImpl.java index 2928f44..1a6ba2e 100644 --- a/server/src/main/java/ru/practicum/shareit/booking/service/BookingServiceImpl.java +++ b/server/src/main/java/ru/practicum/shareit/booking/service/BookingServiceImpl.java @@ -125,7 +125,6 @@ public List findBookingByBooker(Long bookerId, SearchState state) { userRepository.findById(bookerId) .orElseThrow(() -> new NotFoundException("Не найден пользователь id=" + bookerId)); - List bookings = new ArrayList<>(); if (state.equals(SearchState.REJECTED)) { bookings = bookingRepository.findBookingsByBookerAndStatus(bookerId, BookingStatus.REJECTED); diff --git a/server/src/test/java/ru/practicum/shareit/ShareItServerTest.java b/server/src/test/java/ru/practicum/shareit/ShareItServerTest.java new file mode 100644 index 0000000..7568c07 --- /dev/null +++ b/server/src/test/java/ru/practicum/shareit/ShareItServerTest.java @@ -0,0 +1,16 @@ +package ru.practicum.shareit; + +import org.junit.jupiter.api.Test; +import org.springframework.boot.test.autoconfigure.jdbc.AutoConfigureTestDatabase; +import org.springframework.boot.test.context.SpringBootTest; + +import static org.junit.jupiter.api.Assertions.*; + +@SpringBootTest +@AutoConfigureTestDatabase +class ShareItServerTest { + + @Test + void contextLoads() throws Exception { + } +} \ No newline at end of file diff --git a/server/src/test/java/ru/practicum/shareit/booking/BookingControllerTest.java b/server/src/test/java/ru/practicum/shareit/booking/BookingControllerTest.java new file mode 100644 index 0000000..4991b0e --- /dev/null +++ b/server/src/test/java/ru/practicum/shareit/booking/BookingControllerTest.java @@ -0,0 +1,134 @@ +package ru.practicum.shareit.booking; + +import com.fasterxml.jackson.databind.ObjectMapper; +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest; +import org.springframework.boot.test.mock.mockito.MockBean; +import org.springframework.http.MediaType; +import org.springframework.test.web.servlet.MockMvc; +import ru.practicum.shareit.booking.dto.BookingDto; +import ru.practicum.shareit.booking.enums.BookingStatus; +import ru.practicum.shareit.booking.service.BookingService; +import ru.practicum.shareit.booking.service.BookingServiceImpl; +import ru.practicum.shareit.item.dto.ItemDto; +import ru.practicum.shareit.request.ItemRequestController; +import ru.practicum.shareit.request.service.ItemRequestService; +import ru.practicum.shareit.user.dto.UserDto; + +import java.nio.charset.StandardCharsets; +import java.time.LocalDateTime; +import java.util.ArrayList; +import java.util.List; + +import static org.hamcrest.Matchers.is; +import static org.junit.jupiter.api.Assertions.*; +import static org.mockito.ArgumentMatchers.*; +import static org.mockito.Mockito.when; +import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.*; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.jsonPath; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; + +@WebMvcTest(controllers = BookingController.class) +class BookingControllerTest { + private static final String HEADER_USER_ID = "X-Sharer-User-Id"; + + @Autowired + ObjectMapper mapper; + + @MockBean + private BookingService bookingService; + + private BookingDto testBookingDto = new BookingDto( + 1L, + LocalDateTime.of(2025, 04, 12, 10, 10), + LocalDateTime.of(2025, 04, 15, 10, 10), + 1L, + new ItemDto(1l, "Iteem", "Description", true, null, null,null), + 2L, + new UserDto(2L, "User", "user@booking.controller.test"), + BookingStatus.WAITING ); + + @Autowired + private MockMvc mvc; + + @Test + void addBooking() throws Exception { + when(bookingService.addBooking(any(), anyLong())) + .thenReturn(testBookingDto); + + mvc.perform(post("/bookings") + .header(HEADER_USER_ID, 1L) + .content(mapper.writeValueAsString(testBookingDto)) + .characterEncoding(StandardCharsets.UTF_8) + .contentType(MediaType.APPLICATION_JSON) + .accept(MediaType.APPLICATION_JSON)) + .andExpect(status().isCreated()) + .andExpect(jsonPath("$.id", is(testBookingDto.getId()), Long.class)) + .andExpect(jsonPath("$.bookerId", is(testBookingDto.getBookerId()), Long.class)); + } + + @Test + void editBooking() throws Exception { + when(bookingService.approvedBooking(anyLong(), anyLong(), anyBoolean())) + .thenReturn(testBookingDto); + + mvc.perform(patch("/bookings/1?approved=true") + .header(HEADER_USER_ID, 1L) + .characterEncoding(StandardCharsets.UTF_8) + .contentType(MediaType.APPLICATION_JSON) + .accept(MediaType.APPLICATION_JSON)) + .andExpect(status().isOk()) + .andExpect(jsonPath("$.id", is(testBookingDto.getId()), Long.class)) + .andExpect(jsonPath("$.bookerId", is(testBookingDto.getBookerId()), Long.class)); + + } + + @Test + void findBooking() throws Exception { + when(bookingService.findBookingById(anyLong(), anyLong())) + .thenReturn(testBookingDto); + + mvc.perform(get("/bookings/1") + .header(HEADER_USER_ID, 1L) + .characterEncoding(StandardCharsets.UTF_8) + .contentType(MediaType.APPLICATION_JSON) + .accept(MediaType.APPLICATION_JSON)) + .andExpect(status().isOk()) + .andExpect(jsonPath("$.id", is(testBookingDto.getId()), Long.class)) + .andExpect(jsonPath("$.bookerId", is(testBookingDto.getBookerId()), Long.class)); + + } + + @Test + void findBookingByBooker() throws Exception { + List bookingDtos = new ArrayList<>(); + bookingDtos.add(testBookingDto); + + when(bookingService.findBookingByBooker(anyLong(), any())) + .thenReturn(bookingDtos); + + mvc.perform(get("/bookings?state=ALL") + .header(HEADER_USER_ID, 2L) + .characterEncoding(StandardCharsets.UTF_8) + .contentType(MediaType.APPLICATION_JSON) + .accept(MediaType.APPLICATION_JSON)) + .andExpect(status().isOk()); + } + + @Test + void findBookingByOwner() throws Exception { + List bookingDtos = new ArrayList<>(); + bookingDtos.add(testBookingDto); + + when(bookingService.findBookingsByOwner(anyLong(), any())) + .thenReturn(bookingDtos); + + mvc.perform(get("/bookings/owner?state=ALL") + .header(HEADER_USER_ID, 1L) + .characterEncoding(StandardCharsets.UTF_8) + .contentType(MediaType.APPLICATION_JSON) + .accept(MediaType.APPLICATION_JSON)) + .andExpect(status().isOk()); + } +} \ No newline at end of file diff --git a/server/src/test/java/ru/practicum/shareit/booking/service/BookingServiceImplTest.java b/server/src/test/java/ru/practicum/shareit/booking/service/BookingServiceImplTest.java index 1ad45fb..bfeb1ce 100644 --- a/server/src/test/java/ru/practicum/shareit/booking/service/BookingServiceImplTest.java +++ b/server/src/test/java/ru/practicum/shareit/booking/service/BookingServiceImplTest.java @@ -1,13 +1,18 @@ package ru.practicum.shareit.booking.service; import lombok.RequiredArgsConstructor; +import org.assertj.core.api.AssertionsForClassTypes; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.transaction.annotation.Transactional; import ru.practicum.shareit.booking.dto.BookingDto; import ru.practicum.shareit.booking.enums.BookingStatus; +import ru.practicum.shareit.booking.enums.SearchState; import ru.practicum.shareit.booking.repository.BookingRepository; +import ru.practicum.shareit.excepton.InternalServerException; +import ru.practicum.shareit.excepton.NotFoundException; +import ru.practicum.shareit.excepton.ValidationException; import ru.practicum.shareit.item.model.Item; import ru.practicum.shareit.item.repository.ItemRepository; import ru.practicum.shareit.request.service.ItemRequestService; @@ -16,6 +21,7 @@ import ru.practicum.shareit.user.repository.UserRepository; import java.time.LocalDateTime; +import java.util.List; import static org.hamcrest.CoreMatchers.notNullValue; import static org.hamcrest.MatcherAssert.assertThat; @@ -26,18 +32,15 @@ @RequiredArgsConstructor(onConstructor_ = @Autowired) class BookingServiceImplTest { - private final ItemRequestService itemRequestService; private final UserRepository userRepository; - private final BookingRepository bookingRepository; + private final ItemRepository itemRepository; + private final BookingServiceImpl bookingServiceImpl; Long ownerId = 0L; Long itemId = 0L; Long userId = 0L; Long bookingId = 0L; - @Autowired - private ItemRepository itemRepository; - @Autowired - private BookingServiceImpl bookingServiceImpl; + BookingDto sourceBookingDto; @Test void addBooking() throws Exception { @@ -68,28 +71,93 @@ void addBooking() throws Exception { BookingDto bookingDto = new BookingDto(); bookingDto.setItemId(itemId); bookingDto.setBookerId(userId); - bookingDto.setStart(LocalDateTime.of(2025, 05, 12, 10, 10)); - bookingDto.setEnd(LocalDateTime.of(2025, 05, 15, 10, 10)); + bookingDto.setStart(LocalDateTime.of(2025, 04, 12, 10, 10)); + bookingDto.setEnd(LocalDateTime.of(2025, 04, 15, 10, 10)); bookingDto.setStatus(BookingStatus.WAITING); - BookingDto savedBookingDto = bookingServiceImpl.addBooking(bookingDto, userId); - assertThat(savedBookingDto.getId(), notNullValue()); - bookingId = savedBookingDto.getId(); + sourceBookingDto = bookingServiceImpl.addBooking(bookingDto, userId); + assertThat(sourceBookingDto.getId(), notNullValue()); + bookingId = sourceBookingDto.getId(); } @Test - void findBookingById() { + void findBookingById() throws Exception { + if (bookingId.equals(0L)) { + addBooking(); + } + + BookingDto bookingDto = bookingServiceImpl.findBookingById( + bookingId, userId); + assertThat(bookingDto, notNullValue()); + AssertionsForClassTypes.assertThat(bookingDto) + .usingRecursiveComparison() + .isEqualTo(sourceBookingDto); + + assertThrows(NotFoundException.class, + () -> { + bookingServiceImpl.findBookingById( + 1000L, userId); + }, + "Чтение Несуществующего бронирования должно приводить к исключению."); } @Test - void approvedBooking() { + void approvedBooking() throws Exception { + if (bookingId.equals(0L)) { + addBooking(); + } + + BookingDto bookingDto = bookingServiceImpl.approvedBooking(bookingId, ownerId, true); + assertNotNull(bookingDto); + assertEquals( bookingId, bookingDto.getId()); + + assertThrows(ValidationException.class, + () -> { + bookingServiceImpl.approvedBooking(bookingId, userId, true); + }, + "Изменение статуса бронирования не хозяином должно приводить к исключению."); } @Test - void findBookingsByOwner() { + void findBookingsByOwner() throws Exception { + if (bookingId.equals(0L)) { + addBooking(); + } + List bookingDtoList = bookingServiceImpl.findBookingsByOwner( + ownerId, SearchState.PAST); + assertThat(bookingDtoList, notNullValue()); + assertTrue(bookingDtoList.size() > 0); + + bookingDtoList = bookingServiceImpl.findBookingsByOwner( + ownerId, SearchState.CURRENT); + assertThat(bookingDtoList, notNullValue()); + assertTrue(bookingDtoList.isEmpty()); + + bookingDtoList = bookingServiceImpl.findBookingsByOwner( + ownerId, SearchState.FUTURE); + assertThat(bookingDtoList, notNullValue()); + assertTrue(bookingDtoList.isEmpty()); } @Test - void findBookingByBooker() { + void findBookingByBooker() throws Exception { + if (bookingId.equals(0L)) { + addBooking(); + } + List bookingDtoList = bookingServiceImpl.findBookingByBooker( + userId, SearchState.PAST); + assertThat(bookingDtoList, notNullValue()); + assertTrue(bookingDtoList.size() > 0); + + bookingDtoList = bookingServiceImpl.findBookingByBooker( + userId, SearchState.CURRENT); + assertThat(bookingDtoList, notNullValue()); + assertTrue(bookingDtoList.isEmpty()); + + bookingDtoList = bookingServiceImpl.findBookingByBooker( + userId, SearchState.FUTURE); + assertThat(bookingDtoList, notNullValue()); + assertTrue(bookingDtoList.isEmpty()); + } } \ No newline at end of file diff --git a/server/src/test/java/ru/practicum/shareit/item/service/CommentServiceImplTest.java b/server/src/test/java/ru/practicum/shareit/item/service/CommentServiceImplTest.java new file mode 100644 index 0000000..180e832 --- /dev/null +++ b/server/src/test/java/ru/practicum/shareit/item/service/CommentServiceImplTest.java @@ -0,0 +1,85 @@ +package ru.practicum.shareit.item.service; + +import lombok.RequiredArgsConstructor; +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.transaction.annotation.Transactional; +import ru.practicum.shareit.booking.Booking; +import ru.practicum.shareit.booking.BookingMapper; +import ru.practicum.shareit.booking.dto.BookingDto; +import ru.practicum.shareit.booking.enums.BookingStatus; +import ru.practicum.shareit.booking.repository.BookingRepository; +import ru.practicum.shareit.booking.service.BookingServiceImpl; +import ru.practicum.shareit.item.ItemMapper; +import ru.practicum.shareit.item.dto.CommentDto; +import ru.practicum.shareit.item.model.Item; +import ru.practicum.shareit.item.repository.ItemRepository; +import ru.practicum.shareit.user.User; +import ru.practicum.shareit.user.UserMapper; +import ru.practicum.shareit.user.repository.UserRepository; + +import java.time.Instant; +import java.time.LocalDateTime; +import java.time.ZoneOffset; + +import static org.hamcrest.CoreMatchers.notNullValue; +import static org.hamcrest.MatcherAssert.assertThat; +import static org.junit.jupiter.api.Assertions.*; +import static org.junit.jupiter.api.Assertions.assertEquals; + +@Transactional +@SpringBootTest +@RequiredArgsConstructor(onConstructor_ = @Autowired) +class CommentServiceImplTest { + + private final UserRepository userRepository; + private final ItemRepository itemRepository; + private final BookingRepository bookingRepository; + private final CommentService commentService; + + @Test + void addComment() { + User user = new User(); + user.setName("User1"); + user.setEmail("user1@comment.test"); + User owner = userRepository.save(user); + assertThat(owner.getId(), notNullValue()); + + Item item = new Item(); + item.setName("Item1"); + item.setDescription("Item1"); + item.setOwner(owner); + item.setAvailable(true); + item.setRequest(null); + Item savedItem = itemRepository.save(item); + assertThat(savedItem.getId(), notNullValue()); + + user = new User(); + user.setName("User2"); + user.setEmail("user2@comment.test"); + User booker = userRepository.save(user); + assertThat(booker.getId(), notNullValue()); + + Booking booking = new Booking(); + booking.setItem(item); + booking.setBooker(booker); + booking.setStart((LocalDateTime.of(2025, 04, 12, 10, 10)).toInstant(ZoneOffset.UTC)); + booking.setEnd((LocalDateTime.of(2025, 04, 15, 10, 10)).toInstant(ZoneOffset.UTC)); + booking.setStatus(BookingStatus.APPROVED); + + Booking savedBooking = bookingRepository.save(booking); + assertThat(savedBooking.getId(), notNullValue()); + + CommentDto commentDto = new CommentDto(); + commentDto.setItemId(item.getId()); + commentDto.setText("Text."); + commentDto.setAuthorId(booker.getId()); + commentDto.setCreated(Instant.now()); + + CommentDto commentDto1 = commentService.addComment(commentDto); + assertThat(commentDto1.getId(), notNullValue()); + assertEquals(commentDto1.getText(), commentDto.getText()); + assertEquals(commentDto1.getItemId(), commentDto1.getItemId()); + } +} \ No newline at end of file diff --git a/server/src/test/java/ru/practicum/shareit/item/service/ItemServiceImplTest.java b/server/src/test/java/ru/practicum/shareit/item/service/ItemServiceImplTest.java index d19daaa..1813eba 100644 --- a/server/src/test/java/ru/practicum/shareit/item/service/ItemServiceImplTest.java +++ b/server/src/test/java/ru/practicum/shareit/item/service/ItemServiceImplTest.java @@ -1,15 +1,20 @@ package ru.practicum.shareit.item.service; import lombok.RequiredArgsConstructor; +import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.transaction.annotation.Transactional; +import ru.practicum.shareit.excepton.NotFoundException; +import ru.practicum.shareit.item.dto.ItemCommentsDto; import ru.practicum.shareit.item.dto.ItemDto; +import ru.practicum.shareit.item.model.Item; import ru.practicum.shareit.user.dto.UserDto; import ru.practicum.shareit.user.service.UserService; import java.util.ArrayList; +import java.util.Collection; import java.util.List; import static org.hamcrest.CoreMatchers.notNullValue; @@ -24,30 +29,85 @@ class ItemServiceImplTest { private final ItemService itemService; private final UserService userService; + Long ownerId = 0L; + Long itemId = 0L; + ItemDto testItemDto; + + @BeforeEach + void setUp() { + if (ownerId == 0L) { + // создаем пользователя - хозяина вещей + UserDto userDto = new UserDto(); + userDto.setName("User1"); + userDto.setEmail("user1@items.test"); + UserDto savedUserDto = userService.createUser(userDto); + assertThat(savedUserDto.getId(), notNullValue()); + ownerId = savedUserDto.getId(); + } + itemService.deleteAllItems(); + } + + @Test + void addItem() throws Exception { + ItemDto itemDto = new ItemDto(); + itemDto.setName("Item1"); + itemDto.setDescription("Item1"); + itemDto.setAvailable(true); + itemDto.setRequestId(null); + ItemDto savedItem = itemService.addItem(itemDto, ownerId); + assertThat(savedItem.getId(), notNullValue()); + assertEquals(savedItem.getName(), itemDto.getName()); + assertEquals(savedItem.getDescription(), itemDto.getDescription()); + itemId = savedItem.getId(); + testItemDto = savedItem; + } + + @Test + void updateItem() throws Exception { + if (itemId == 0L) { + addItem(); + } + ItemDto updItemDto = new ItemDto(); + updItemDto.setId(itemId); + updItemDto.setDescription("Item1 uddated"); + + ItemDto itemDto = itemService.updateItem(updItemDto, ownerId); + assertThat(itemDto.getId(), notNullValue()); + assertEquals(itemDto.getDescription(), updItemDto.getDescription()); + } + + @Test + void getItems() throws Exception { + if (itemId == 0L) { + addItem(); + } + ItemCommentsDto icd = itemService.getItem(itemId, ownerId); + assertThat(icd.getId(), notNullValue()); + assertEquals(testItemDto.getId(), icd.getId()); + assertEquals(testItemDto.getName(), icd.getName()); + assertEquals(testItemDto.getDescription(), icd.getDescription()); + } + + @Test + void deleteItem() throws Exception { + if (itemId == 0L) { + addItem(); + } + itemService.deleteItem(itemId, ownerId); + assertThrows(NotFoundException.class, + () -> { + itemService.getItem(itemId, ownerId); + }, + "Чтение удаленной вещи должно приводить к исключению."); + } + /** * Тестируем чтение списка вещей пользователя */ @Test void getItemsByOwnerId() { - // создаем пользователя - хозяина вещей - UserDto userDto = new UserDto(); - userDto.setName("User1"); - userDto.setEmail("user1@get.items.test"); - UserDto savedUserDto = userService.createUser(userDto); - assertThat(savedUserDto.getId(), notNullValue()); - Long ownerId = savedUserDto.getId(); - // заполняем список вещей - List sourceItems = new ArrayList<>(); - int maxItems = 3; - for (int i = 1; i <= maxItems; i++) { - ItemDto itemDto = new ItemDto(); - itemDto.setName("Item_" + i); - itemDto.setDescription("getItemms test item_" + i); - itemDto.setAvailable(true); - sourceItems.add(itemDto); - itemService.addItem(itemDto, ownerId); - } + List sourceItems = makeItems(ownerId, 3); // Чидаем список вещей List targetItems = itemService.getItemsByOwnerId(ownerId) @@ -64,4 +124,29 @@ void getItemsByOwnerId() { } } + @Test + void searchItems() throws Exception { + // заполняем список вещей + List sourceItems = makeItems(ownerId, 3); + + List targetItems = itemService.searchItemsByText("Item_2") + .stream().toList(); + assertNotNull(targetItems); + assertTrue(targetItems.size() > 0); + } + + private List makeItems(Long ownerId, Integer count) { + List sourceItems = new ArrayList<>(); + int maxItems = 3; + for (int i = 1; i <= count; i++) { + ItemDto itemDto = new ItemDto(); + itemDto.setName("Item_" + i); + itemDto.setDescription("Itemms test item_" + i); + itemDto.setAvailable(true); + sourceItems.add(itemDto); + itemService.addItem(itemDto, ownerId); + } + return sourceItems; + } + } \ No newline at end of file diff --git a/server/src/test/java/ru/practicum/shareit/request/service/ItemRequestServiceImplTest.java b/server/src/test/java/ru/practicum/shareit/request/service/ItemRequestServiceImplTest.java index 468fe0c..f8af5f3 100644 --- a/server/src/test/java/ru/practicum/shareit/request/service/ItemRequestServiceImplTest.java +++ b/server/src/test/java/ru/practicum/shareit/request/service/ItemRequestServiceImplTest.java @@ -8,6 +8,8 @@ import org.springframework.boot.test.context.SpringBootTest; import org.springframework.boot.test.mock.mockito.MockBean; import org.springframework.transaction.annotation.Transactional; +import ru.practicum.shareit.excepton.InternalServerException; +import ru.practicum.shareit.excepton.NotFoundException; import ru.practicum.shareit.request.dto.ItemRequestDto; import ru.practicum.shareit.request.dto.RequestWithItemsDto; import ru.practicum.shareit.user.User; @@ -54,8 +56,8 @@ void create() { @Test - void findReqestsById() { - if (!requestId.equals(0)) { + void findReqestsById() throws NotFoundException, InternalServerException, Exception { + if (requestId.equals(0L)) { create(); } RequestWithItemsDto rwi = @@ -63,11 +65,17 @@ void findReqestsById() { assertNotNull(rwi, "Запрос не найден."); assertEquals( requestId, rwi.getId(), "Идентификатор запроса не верен."); + + assertThrows(NotFoundException.class, + () -> { + itemRequestService.findReqestsById(userId, 1000L); + }, + "Чтение Несуществующего запроса должно приводить к исключению."); } @Test void findReqestsByCustomerId() { - if (!userId.equals(0)) { + if (userId.equals(0L)) { create(); } ItemRequestDto itemRequestDto = new ItemRequestDto(); @@ -84,7 +92,7 @@ void findReqestsByCustomerId() { @Test void findAllReqests() { - if (!userId.equals(0)) { + if (userId.equals(0L)) { create(); } ItemRequestDto itemRequestDto = new ItemRequestDto(); From 9ce2f9d329d365c3c4cf5429473c8bce0158299b Mon Sep 17 00:00:00 2001 From: Andrej Stelmaschuk Date: Fri, 2 May 2025 23:38:26 +0700 Subject: [PATCH 22/46] =?UTF-8?q?feat:=20=D1=80=D0=B5=D0=B0=D0=BB=D0=B8?= =?UTF-8?q?=D0=B7=D0=BE=D0=B2=D0=B0=D0=BD=D0=B0=20=D1=80=D0=B0=D0=B1=D0=BE?= =?UTF-8?q?=D1=82=D0=B0=20=D0=BC=D0=BE=D0=B4=D1=83=D0=BB=D0=B5=D0=B9=20Gat?= =?UTF-8?q?eway=20=D0=B8=20Server?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../shareit/booking/dto/BookingDto.java | 38 ++++++ .../shareit/booking/dto/BookingStatus.java | 8 ++ .../practicum/shareit/item/dto/ItemDto.java | 1 - .../src/main/resources/application.properties | 2 - .../booking/BookingControllerTest.java | 111 ++++++++++++++++-- .../shareit/item/ItemControllerTest.java | 25 ++-- .../request/ItemRequestControllerTest.java | 18 +-- .../shareit/user/UserControllerTest.java | 11 +- .../src/test/resources/application.properties | 2 - .../shareit/booking/dto/BookingDto.java | 3 - .../practicum/shareit/item/dto/ItemDto.java | 4 + .../src/main/resources/application.properties | 11 +- server/src/main/resources/schema.sql | 81 +++++++------ .../practicum/shareit/ShareItServerTest.java | 2 - .../booking/BookingControllerTest.java | 10 +- .../shareit/booking/dto/BookingDtoTest.java | 7 +- .../service/BookingServiceImplTest.java | 12 +- .../shareit/item/ItemControllerTest.java | 41 +++---- .../shareit/item/dto/ItemDtoTest.java | 1 + .../item/service/CommentServiceImplTest.java | 6 - .../item/service/ItemServiceImplTest.java | 4 +- .../request/ItemRequestControllerTest.java | 19 ++- .../service/ItemRequestServiceImplTest.java | 8 +- .../shareit/user/UserControllerTest.java | 15 +-- .../shareit/user/dto/UserDtoTest.java | 1 - .../src/test/resoueces/application.properties | 4 - server/src/test/resoueces/schema.sql | 75 ++++++------ 27 files changed, 298 insertions(+), 222 deletions(-) create mode 100644 gateway/src/main/java/ru/practicum/shareit/booking/dto/BookingDto.java create mode 100644 gateway/src/main/java/ru/practicum/shareit/booking/dto/BookingStatus.java diff --git a/gateway/src/main/java/ru/practicum/shareit/booking/dto/BookingDto.java b/gateway/src/main/java/ru/practicum/shareit/booking/dto/BookingDto.java new file mode 100644 index 0000000..abdfa6a --- /dev/null +++ b/gateway/src/main/java/ru/practicum/shareit/booking/dto/BookingDto.java @@ -0,0 +1,38 @@ +package ru.practicum.shareit.booking.dto; + +import jakarta.validation.constraints.NotNull; +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.Setter; +import ru.practicum.shareit.item.dto.ItemDto; +import ru.practicum.shareit.user.dto.UserDto; +import ru.practicum.shareit.validator.ValidAction; + +import java.time.LocalDateTime; + +/** + * DTO класс бронирования + */ +@Setter +@Getter +@NoArgsConstructor +@AllArgsConstructor +public class BookingDto { + private Long id; + + @NotNull(message = "Время начала бронирования должно быть задано.", groups = {ValidAction.OnCreate.class}) + private LocalDateTime start; + + @NotNull(message = "Время завершения бронирования должно быть задано.", groups = {ValidAction.OnCreate.class}) + private LocalDateTime end; + + private Long itemId; + private ItemDto item; + + private Long bookerId; + private UserDto booker; + + private BookingStatus status = BookingStatus.WAITING; +} + diff --git a/gateway/src/main/java/ru/practicum/shareit/booking/dto/BookingStatus.java b/gateway/src/main/java/ru/practicum/shareit/booking/dto/BookingStatus.java new file mode 100644 index 0000000..9a32258 --- /dev/null +++ b/gateway/src/main/java/ru/practicum/shareit/booking/dto/BookingStatus.java @@ -0,0 +1,8 @@ +package ru.practicum.shareit.booking.dto; + +public enum BookingStatus { + WAITING, // новое бронирование + APPROVED, // бронирование подтверждено владельцем + REJECTED, // бронирование отклонено владельцем + CANCELED // бронирование отменено создателем +} diff --git a/gateway/src/main/java/ru/practicum/shareit/item/dto/ItemDto.java b/gateway/src/main/java/ru/practicum/shareit/item/dto/ItemDto.java index 13af90c..3c384b3 100644 --- a/gateway/src/main/java/ru/practicum/shareit/item/dto/ItemDto.java +++ b/gateway/src/main/java/ru/practicum/shareit/item/dto/ItemDto.java @@ -1,6 +1,5 @@ package ru.practicum.shareit.item.dto; -import com.fasterxml.jackson.annotation.JsonFormat; import jakarta.validation.constraints.NotBlank; import jakarta.validation.constraints.NotNull; import jakarta.validation.constraints.Size; diff --git a/gateway/src/main/resources/application.properties b/gateway/src/main/resources/application.properties index 2ee0851..9df4b1d 100644 --- a/gateway/src/main/resources/application.properties +++ b/gateway/src/main/resources/application.properties @@ -1,7 +1,5 @@ logging.level.org.springframework.web.client.RestTemplate=DEBUG #logging.level.org.apache.http=DEBUG #logging.level.httpclient.wire=DEBUG - server.port=8080 - shareit-server.url=http://localhost:9090 \ No newline at end of file diff --git a/gateway/src/test/java/ru/practicum/shareit/booking/BookingControllerTest.java b/gateway/src/test/java/ru/practicum/shareit/booking/BookingControllerTest.java index 2b3641c..688e374 100644 --- a/gateway/src/test/java/ru/practicum/shareit/booking/BookingControllerTest.java +++ b/gateway/src/test/java/ru/practicum/shareit/booking/BookingControllerTest.java @@ -5,13 +5,28 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest; import org.springframework.boot.test.mock.mockito.MockBean; +import org.springframework.http.HttpStatus; +import org.springframework.http.MediaType; +import org.springframework.http.ResponseEntity; import org.springframework.test.web.servlet.MockMvc; -import ru.practicum.shareit.request.ItemRequestClient; -import ru.practicum.shareit.request.ItemRequestController; +import ru.practicum.shareit.booking.dto.BookItemRequestDto; +import ru.practicum.shareit.booking.dto.BookingDto; +import ru.practicum.shareit.booking.dto.BookingStatus; +import ru.practicum.shareit.item.dto.ItemDto; +import ru.practicum.shareit.user.dto.UserDto; -import static org.junit.jupiter.api.Assertions.*; +import java.nio.charset.StandardCharsets; +import java.time.LocalDateTime; +import java.util.List; -@WebMvcTest(controllers = ItemRequestController.class) +import static org.hamcrest.Matchers.is; +import static org.mockito.ArgumentMatchers.*; +import static org.mockito.Mockito.when; +import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.*; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.jsonPath; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; + +@WebMvcTest(controllers = BookingController.class) class BookingControllerTest { private static final String HEADER_USER_ID = "X-Sharer-User-Id"; @@ -19,28 +34,104 @@ class BookingControllerTest { ObjectMapper mapper; @MockBean - private ItemRequestClient itemRequestClient; + private BookingClient bookingClient; @Autowired private MockMvc mvc; + private BookItemRequestDto bookItemRequestDto = new BookItemRequestDto( + 1L, + LocalDateTime.of(2025, 04, 12, 10, 10), + LocalDateTime.of(2025, 04, 15, 10, 10) + ); + + private BookingDto testBookingDto = new BookingDto( + 1L, + LocalDateTime.of(2025, 04, 12, 10, 10), + LocalDateTime.of(2025, 04, 15, 10, 10), + 1L, + new ItemDto(1l, "Iteem", "Description", true, null, null, null), + 2L, + new UserDto(2L, "User", "user@booking.controller.test"), + BookingStatus.WAITING); + @Test - void getBookings() { + void getBookings() throws Exception { + List bookingDtos = List.of(testBookingDto); + ResponseEntity response = new ResponseEntity<>( + bookingDtos, HttpStatus.OK); + when(bookingClient.getBookings(anyLong(), any(), anyInt(), anyInt())) + .thenReturn(response); + + mvc.perform(get("/bookings?state=ALL&from=0&size=10") + .header(HEADER_USER_ID, 2L) + .characterEncoding(StandardCharsets.UTF_8) + .contentType(MediaType.APPLICATION_JSON) + .accept(MediaType.APPLICATION_JSON)) + .andExpect(status().isOk()); } @Test - void bookItem() { + void bookItem() throws Exception { + ResponseEntity response = new ResponseEntity<>( + testBookingDto, HttpStatus.CREATED); + when(bookingClient.bookItem(anyLong(), any())) + .thenReturn(response); + mvc.perform(post("/bookings") + .header(HEADER_USER_ID, 2L) + .content(mapper.writeValueAsString(bookItemRequestDto)) + .characterEncoding(StandardCharsets.UTF_8) + .contentType(MediaType.APPLICATION_JSON) + .accept(MediaType.APPLICATION_JSON)) + .andExpect(status().isCreated()) + .andExpect(jsonPath("$.itemId", is((int) bookItemRequestDto.getItemId()))); } @Test - void editBooking() { + void editBooking() throws Exception { + testBookingDto.setStatus(BookingStatus.APPROVED); + ResponseEntity response = new ResponseEntity<>( + testBookingDto, HttpStatus.OK); + when(bookingClient.approvedBooking(anyLong(), anyLong(), anyBoolean())) + .thenReturn(response); + + mvc.perform(patch("/bookings/1?approved=true") + .header(HEADER_USER_ID, 1L) + .characterEncoding(StandardCharsets.UTF_8) + .contentType(MediaType.APPLICATION_JSON) + .accept(MediaType.APPLICATION_JSON)) + .andExpect(status().isOk()) + .andExpect(jsonPath("$.status", is("APPROVED"))); } @Test - void getBooking() { + void getBooking() throws Exception { + ResponseEntity response = new ResponseEntity<>( + testBookingDto, HttpStatus.OK); + when(bookingClient.getBooking(anyLong(), anyLong())) + .thenReturn(response); + + mvc.perform(get("/bookings/1") + .header(HEADER_USER_ID, 2L) + .characterEncoding(StandardCharsets.UTF_8) + .contentType(MediaType.APPLICATION_JSON) + .accept(MediaType.APPLICATION_JSON)) + .andExpect(status().isOk()); } @Test - void findBookingByOwner() { + void findBookingByOwner() throws Exception { + List bookingDtos = List.of(testBookingDto); + ResponseEntity response = new ResponseEntity<>( + bookingDtos, HttpStatus.OK); + when(bookingClient.findBookingsByOwner(anyLong(), any(), anyInt(), anyInt())) + .thenReturn(response); + + mvc.perform(get("/bookings/owner?state=ALL&from=0&size=10") + .header(HEADER_USER_ID, 1L) + .characterEncoding(StandardCharsets.UTF_8) + .contentType(MediaType.APPLICATION_JSON) + .accept(MediaType.APPLICATION_JSON)) + .andExpect(status().isOk()); } } \ No newline at end of file diff --git a/gateway/src/test/java/ru/practicum/shareit/item/ItemControllerTest.java b/gateway/src/test/java/ru/practicum/shareit/item/ItemControllerTest.java index 9d33ad5..b480a39 100644 --- a/gateway/src/test/java/ru/practicum/shareit/item/ItemControllerTest.java +++ b/gateway/src/test/java/ru/practicum/shareit/item/ItemControllerTest.java @@ -11,14 +11,12 @@ import org.springframework.test.web.servlet.MockMvc; import ru.practicum.shareit.item.dto.CommentDto; import ru.practicum.shareit.item.dto.ItemDto; -import ru.practicum.shareit.user.UserController; import java.nio.charset.StandardCharsets; import java.util.ArrayList; import java.util.List; import static org.hamcrest.Matchers.is; -import static org.junit.jupiter.api.Assertions.*; import static org.mockito.ArgumentMatchers.*; import static org.mockito.Mockito.when; import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.*; @@ -31,13 +29,6 @@ class ItemControllerTest { @Autowired ObjectMapper mapper; - - @MockBean - private ItemClient itemClient; - - @Autowired - private MockMvc mvc; - ItemDto testItemDto = new ItemDto( 1L, "Item1", @@ -46,9 +37,13 @@ class ItemControllerTest { null, null, null); + @MockBean + private ItemClient itemClient; + @Autowired + private MockMvc mvc; @Test - void createItem() throws Exception{ + void createItem() throws Exception { ResponseEntity response = new ResponseEntity<>( testItemDto, HttpStatus.CREATED); when(itemClient.createItem(anyLong(), any())) @@ -67,7 +62,7 @@ void createItem() throws Exception{ } @Test - void findItem() throws Exception{ + void findItem() throws Exception { ResponseEntity response = new ResponseEntity<>( testItemDto, HttpStatus.OK); when(itemClient.findItemById(anyLong(), anyLong())) @@ -83,7 +78,7 @@ void findItem() throws Exception{ } @Test - void findAllItems() throws Exception{ + void findAllItems() throws Exception { List itemDtos = new ArrayList<>(); itemDtos.add(testItemDto); ResponseEntity response = new ResponseEntity<>( @@ -101,7 +96,7 @@ void findAllItems() throws Exception{ } @Test - void onSearch() throws Exception{ + void onSearch() throws Exception { List itemDtos = new ArrayList<>(); itemDtos.add(testItemDto); ResponseEntity response = new ResponseEntity<>( @@ -119,7 +114,7 @@ void onSearch() throws Exception{ } @Test - void updateItem() throws Exception{ + void updateItem() throws Exception { ResponseEntity response = new ResponseEntity<>( testItemDto, HttpStatus.OK); when(itemClient.updateItem(anyLong(), anyLong(), any())) @@ -136,7 +131,7 @@ void updateItem() throws Exception{ } @Test - void addComment() throws Exception{ + void addComment() throws Exception { CommentDto commentDto = new CommentDto(); commentDto.setItemId(testItemDto.getId()); commentDto.setText("Comment text"); diff --git a/gateway/src/test/java/ru/practicum/shareit/request/ItemRequestControllerTest.java b/gateway/src/test/java/ru/practicum/shareit/request/ItemRequestControllerTest.java index 3d28c69..0677565 100644 --- a/gateway/src/test/java/ru/practicum/shareit/request/ItemRequestControllerTest.java +++ b/gateway/src/test/java/ru/practicum/shareit/request/ItemRequestControllerTest.java @@ -9,8 +9,6 @@ import org.springframework.http.MediaType; import org.springframework.http.ResponseEntity; import org.springframework.test.web.servlet.MockMvc; -import ru.practicum.shareit.item.ItemClient; -import ru.practicum.shareit.item.ItemController; import ru.practicum.shareit.request.dto.ItemRequestDto; import ru.practicum.shareit.user.dto.UserDto; @@ -20,7 +18,6 @@ import java.util.List; import static org.hamcrest.Matchers.is; -import static org.junit.jupiter.api.Assertions.*; import static org.mockito.ArgumentMatchers.any; import static org.mockito.ArgumentMatchers.anyLong; import static org.mockito.Mockito.when; @@ -35,18 +32,15 @@ class ItemRequestControllerTest { @Autowired ObjectMapper mapper; - - @MockBean - private ItemRequestClient itemRequestClient; - - @Autowired - private MockMvc mvc; - ItemRequestDto itemRequestDto = new ItemRequestDto( 1L, "Request text.", new UserDto(1L, "user", "user@request.test"), Instant.now()); + @MockBean + private ItemRequestClient itemRequestClient; + @Autowired + private MockMvc mvc; @Test void createItemRequest() throws Exception { @@ -82,7 +76,7 @@ void findItemRequest() throws Exception { } @Test - void findRequestsByUserId() throws Exception { + void findRequestsByUserId() throws Exception { ResponseEntity response = new ResponseEntity<>( itemRequestDto, HttpStatus.OK); when(itemRequestClient.findRequestsByCustomerId(anyLong())) @@ -98,7 +92,7 @@ void findRequestsByUserId() throws Exception { } @Test - void findAllRequests() throws Exception { + void findAllRequests() throws Exception { List itemRequestDtos = new ArrayList<>(); itemRequestDtos.add(itemRequestDto); diff --git a/gateway/src/test/java/ru/practicum/shareit/user/UserControllerTest.java b/gateway/src/test/java/ru/practicum/shareit/user/UserControllerTest.java index 59945bd..b2bf65d 100644 --- a/gateway/src/test/java/ru/practicum/shareit/user/UserControllerTest.java +++ b/gateway/src/test/java/ru/practicum/shareit/user/UserControllerTest.java @@ -27,17 +27,14 @@ class UserControllerTest { @Autowired ObjectMapper mapper; - - @MockBean - private UserClient userClient; - - @Autowired - private MockMvc mvc; - UserDto testUserDto = new UserDto( 1L, "tetUser", "test_user@gateway.test"); + @MockBean + private UserClient userClient; + @Autowired + private MockMvc mvc; @Test void addNewUser() throws Exception { diff --git a/gateway/src/test/resources/application.properties b/gateway/src/test/resources/application.properties index 2ee0851..9df4b1d 100644 --- a/gateway/src/test/resources/application.properties +++ b/gateway/src/test/resources/application.properties @@ -1,7 +1,5 @@ logging.level.org.springframework.web.client.RestTemplate=DEBUG #logging.level.org.apache.http=DEBUG #logging.level.httpclient.wire=DEBUG - server.port=8080 - shareit-server.url=http://localhost:9090 \ No newline at end of file diff --git a/server/src/main/java/ru/practicum/shareit/booking/dto/BookingDto.java b/server/src/main/java/ru/practicum/shareit/booking/dto/BookingDto.java index 15fc1b6..5a76380 100644 --- a/server/src/main/java/ru/practicum/shareit/booking/dto/BookingDto.java +++ b/server/src/main/java/ru/practicum/shareit/booking/dto/BookingDto.java @@ -1,6 +1,5 @@ package ru.practicum.shareit.booking.dto; -import com.fasterxml.jackson.annotation.JsonFormat; import jakarta.validation.constraints.NotNull; import lombok.AllArgsConstructor; import lombok.Data; @@ -22,11 +21,9 @@ public class BookingDto { private Long id; @NotNull(message = "Время начала бронирования должно быть задано.", groups = {ValidAction.OnCreate.class}) - @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") private LocalDateTime start; @NotNull(message = "Время завершения бронирования должно быть задано.", groups = {ValidAction.OnCreate.class}) - @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") private LocalDateTime end; private Long itemId; 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 index 97aed6b..5264e1a 100644 --- a/server/src/main/java/ru/practicum/shareit/item/dto/ItemDto.java +++ b/server/src/main/java/ru/practicum/shareit/item/dto/ItemDto.java @@ -33,6 +33,10 @@ public class ItemDto { private Long requestId; + + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") private Instant lastBooking; + + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") private Instant nextBooking; } diff --git a/server/src/main/resources/application.properties b/server/src/main/resources/application.properties index 20ffdba..e525588 100644 --- a/server/src/main/resources/application.properties +++ b/server/src/main/resources/application.properties @@ -1,9 +1,7 @@ server.port=9090 - spring.jpa.hibernate.ddl-auto=none spring.jpa.properties.hibernate.format_sql=true spring.sql.init.mode=always - logging.level.org.zalando.logbook=TRACE #logging.level.org.springframework.orm.jpa=INFO @@ -11,12 +9,7 @@ logging.level.org.zalando.logbook=TRACE #logging.level.org.springframework.transaction.interceptor=TRACE #logging.level.org.springframework.orm.jpa.JpaTransactionManager=DEBUG -#spring.datasource.driverClassName=org.postgresql.Driver -#spring.datasource.url=jdbc:postgresql://192.168.0.102:5432/shareitdb -#spring.datasource.username=test -#spring.datasource.password=test - -spring.datasource.driverClassName=org.h2.Driver -spring.datasource.url=jdbc:h2:mem:shareit +spring.datasource.driverClassName=org.postgresql.Driver +spring.datasource.url=jdbc:postgresql://localhost:5432/shareit spring.datasource.username=shareit spring.datasource.password=shareit diff --git a/server/src/main/resources/schema.sql b/server/src/main/resources/schema.sql index 8e5d1e8..22295d8 100644 --- a/server/src/main/resources/schema.sql +++ b/server/src/main/resources/schema.sql @@ -1,58 +1,57 @@ --- DROP TABLE bookings; --- DROP TABLE comments; --- DROP TABLE items; --- DROP TABLE itemrequests; --- DROP TABLE users; - -CREATE TABLE IF NOT EXISTS users ( - id BIGINT GENERATED BY DEFAULT AS IDENTITY NOT NULL, - name VARCHAR(255) NOT NULL, - email VARCHAR(255) NOT NULL, +CREATE TABLE IF NOT EXISTS users +( + id BIGINT GENERATED BY DEFAULT AS IDENTITY NOT NULL, + name VARCHAR(255) NOT NULL, + email VARCHAR(255) NOT NULL, CONSTRAINT pk_user PRIMARY KEY (id), CONSTRAINT UQ_USER_EMAIL UNIQUE (email) ); -CREATE TABLE IF NOT EXISTS itemrequests ( - id BIGINT GENERATED BY DEFAULT AS IDENTITY NOT NULL, - description VARCHAR(512) NOT NULL, - customer_id BIGINT NOT NULL, - created TIMESTAMP WITHOUT TIME ZONE, +CREATE TABLE IF NOT EXISTS itemrequests +( + id BIGINT GENERATED BY DEFAULT AS IDENTITY NOT NULL, + description VARCHAR(512) NOT NULL, + customer_id BIGINT NOT NULL, + created TIMESTAMP WITHOUT TIME ZONE, CONSTRAINT pk_itemrequests PRIMARY KEY (id), - CONSTRAINT fk_itemrequests_to_users FOREIGN KEY(customer_id) REFERENCES users(id) + CONSTRAINT fk_itemrequests_to_users FOREIGN KEY (customer_id) REFERENCES users (id) ); -CREATE TABLE IF NOT EXISTS items ( - id BIGINT GENERATED BY DEFAULT AS IDENTITY NOT NULL, - name VARCHAR(255) NOT NULL, +CREATE TABLE IF NOT EXISTS items +( + id BIGINT GENERATED BY DEFAULT AS IDENTITY NOT NULL, + name VARCHAR(255) NOT NULL, description VARCHAR(255), - owner_id BIGINT NOT NULL, - available BOOLEAN, - request_id BIGINT, + owner_id BIGINT NOT NULL, + available BOOLEAN, + request_id BIGINT, CONSTRAINT pk_item PRIMARY KEY (id), - CONSTRAINT fk_items_to_users FOREIGN KEY(owner_id) REFERENCES users(id), - CONSTRAINT fk_items_to_requests FOREIGN KEY(request_id) REFERENCES itemrequests(id) + CONSTRAINT fk_items_to_users FOREIGN KEY (owner_id) REFERENCES users (id), + CONSTRAINT fk_items_to_requests FOREIGN KEY (request_id) REFERENCES itemrequests (id) ); -CREATE TABLE IF NOT EXISTS comments ( - id BIGINT GENERATED BY DEFAULT AS IDENTITY NOT NULL, - text VARCHAR(512) NOT NULL, - item_id BIGINT NOT NULL, - author_id BIGINT NOT NULL, - created TIMESTAMP WITHOUT TIME ZONE, +CREATE TABLE IF NOT EXISTS comments +( + id BIGINT GENERATED BY DEFAULT AS IDENTITY NOT NULL, + text VARCHAR(512) NOT NULL, + item_id BIGINT NOT NULL, + author_id BIGINT NOT NULL, + created TIMESTAMP WITHOUT TIME ZONE, CONSTRAINT pk_comment PRIMARY KEY (id), - CONSTRAINT fk_connemts_to_items FOREIGN KEY(item_id) REFERENCES items(id), - CONSTRAINT fk_connemts_to_users FOREIGN KEY(author_id) REFERENCES users(id) + CONSTRAINT fk_connemts_to_items FOREIGN KEY (item_id) REFERENCES items (id), + CONSTRAINT fk_connemts_to_users FOREIGN KEY (author_id) REFERENCES users (id) ); -CREATE TABLE IF NOT EXISTS bookings ( - id BIGINT GENERATED BY DEFAULT AS IDENTITY NOT NULL, - time_start TIMESTAMP WITHOUT TIME ZONE NOT NULL, - time_end TIMESTAMP WITHOUT TIME ZONE NOT NULL, - item_id BIGINT NOT NULL, - booker_id BIGINT NOT NULL, - status VARCHAR(16), +CREATE TABLE IF NOT EXISTS bookings +( + id BIGINT GENERATED BY DEFAULT AS IDENTITY NOT NULL, + time_start TIMESTAMP WITHOUT TIME ZONE NOT NULL, + time_end TIMESTAMP WITHOUT TIME ZONE NOT NULL, + item_id BIGINT NOT NULL, + booker_id BIGINT NOT NULL, + status VARCHAR(16), CONSTRAINT pk_buoking PRIMARY KEY (id), - CONSTRAINT fk_buokings_to_items FOREIGN KEY(item_id) REFERENCES items(id), - CONSTRAINT fk_buokings_to_users FOREIGN KEY(booker_id) REFERENCES users(id) + CONSTRAINT fk_buokings_to_items FOREIGN KEY (item_id) REFERENCES items (id), + CONSTRAINT fk_buokings_to_users FOREIGN KEY (booker_id) REFERENCES users (id) ); diff --git a/server/src/test/java/ru/practicum/shareit/ShareItServerTest.java b/server/src/test/java/ru/practicum/shareit/ShareItServerTest.java index 7568c07..2119627 100644 --- a/server/src/test/java/ru/practicum/shareit/ShareItServerTest.java +++ b/server/src/test/java/ru/practicum/shareit/ShareItServerTest.java @@ -4,8 +4,6 @@ import org.springframework.boot.test.autoconfigure.jdbc.AutoConfigureTestDatabase; import org.springframework.boot.test.context.SpringBootTest; -import static org.junit.jupiter.api.Assertions.*; - @SpringBootTest @AutoConfigureTestDatabase class ShareItServerTest { diff --git a/server/src/test/java/ru/practicum/shareit/booking/BookingControllerTest.java b/server/src/test/java/ru/practicum/shareit/booking/BookingControllerTest.java index 4991b0e..a3158f7 100644 --- a/server/src/test/java/ru/practicum/shareit/booking/BookingControllerTest.java +++ b/server/src/test/java/ru/practicum/shareit/booking/BookingControllerTest.java @@ -10,10 +10,7 @@ import ru.practicum.shareit.booking.dto.BookingDto; import ru.practicum.shareit.booking.enums.BookingStatus; import ru.practicum.shareit.booking.service.BookingService; -import ru.practicum.shareit.booking.service.BookingServiceImpl; import ru.practicum.shareit.item.dto.ItemDto; -import ru.practicum.shareit.request.ItemRequestController; -import ru.practicum.shareit.request.service.ItemRequestService; import ru.practicum.shareit.user.dto.UserDto; import java.nio.charset.StandardCharsets; @@ -22,7 +19,6 @@ import java.util.List; import static org.hamcrest.Matchers.is; -import static org.junit.jupiter.api.Assertions.*; import static org.mockito.ArgumentMatchers.*; import static org.mockito.Mockito.when; import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.*; @@ -39,15 +35,15 @@ class BookingControllerTest { @MockBean private BookingService bookingService; - private BookingDto testBookingDto = new BookingDto( + private BookingDto testBookingDto = new BookingDto( 1L, LocalDateTime.of(2025, 04, 12, 10, 10), LocalDateTime.of(2025, 04, 15, 10, 10), 1L, - new ItemDto(1l, "Iteem", "Description", true, null, null,null), + new ItemDto(1l, "Iteem", "Description", true, null, null, null), 2L, new UserDto(2L, "User", "user@booking.controller.test"), - BookingStatus.WAITING ); + BookingStatus.WAITING); @Autowired private MockMvc mvc; diff --git a/server/src/test/java/ru/practicum/shareit/booking/dto/BookingDtoTest.java b/server/src/test/java/ru/practicum/shareit/booking/dto/BookingDtoTest.java index fc657b1..3b46d33 100644 --- a/server/src/test/java/ru/practicum/shareit/booking/dto/BookingDtoTest.java +++ b/server/src/test/java/ru/practicum/shareit/booking/dto/BookingDtoTest.java @@ -7,22 +7,19 @@ import org.springframework.boot.test.json.JacksonTester; import org.springframework.boot.test.json.JsonContent; import ru.practicum.shareit.booking.enums.BookingStatus; -import ru.practicum.shareit.item.dto.ItemDto; -import ru.practicum.shareit.user.dto.UserDto; import java.time.LocalDateTime; import static org.assertj.core.api.AssertionsForInterfaceTypes.assertThat; -import static org.junit.jupiter.api.Assertions.*; @JsonTest @RequiredArgsConstructor(onConstructor_ = @Autowired) class BookingDtoTest { private final JacksonTester json; - // BookingDto bookingDto = new BookingDto(); + // BookingDto bookingDto = new BookingDto(); @Test - void testBookingDto() throws Exception{ + void testBookingDto() throws Exception { BookingDto bookingDto = new BookingDto(); bookingDto.setId(1L); bookingDto.setStart(LocalDateTime.now()); diff --git a/server/src/test/java/ru/practicum/shareit/booking/service/BookingServiceImplTest.java b/server/src/test/java/ru/practicum/shareit/booking/service/BookingServiceImplTest.java index bfeb1ce..34459e0 100644 --- a/server/src/test/java/ru/practicum/shareit/booking/service/BookingServiceImplTest.java +++ b/server/src/test/java/ru/practicum/shareit/booking/service/BookingServiceImplTest.java @@ -9,15 +9,11 @@ import ru.practicum.shareit.booking.dto.BookingDto; import ru.practicum.shareit.booking.enums.BookingStatus; import ru.practicum.shareit.booking.enums.SearchState; -import ru.practicum.shareit.booking.repository.BookingRepository; -import ru.practicum.shareit.excepton.InternalServerException; import ru.practicum.shareit.excepton.NotFoundException; import ru.practicum.shareit.excepton.ValidationException; import ru.practicum.shareit.item.model.Item; import ru.practicum.shareit.item.repository.ItemRepository; -import ru.practicum.shareit.request.service.ItemRequestService; import ru.practicum.shareit.user.User; -import ru.practicum.shareit.user.dto.UserDto; import ru.practicum.shareit.user.repository.UserRepository; import java.time.LocalDateTime; @@ -109,7 +105,7 @@ void approvedBooking() throws Exception { BookingDto bookingDto = bookingServiceImpl.approvedBooking(bookingId, ownerId, true); assertNotNull(bookingDto); - assertEquals( bookingId, bookingDto.getId()); + assertEquals(bookingId, bookingDto.getId()); assertThrows(ValidationException.class, () -> { @@ -119,12 +115,12 @@ void approvedBooking() throws Exception { } @Test - void findBookingsByOwner() throws Exception { + void findBookingsByOwner() throws Exception { if (bookingId.equals(0L)) { addBooking(); } List bookingDtoList = bookingServiceImpl.findBookingsByOwner( - ownerId, SearchState.PAST); + ownerId, SearchState.PAST); assertThat(bookingDtoList, notNullValue()); assertTrue(bookingDtoList.size() > 0); @@ -140,7 +136,7 @@ void findBookingsByOwner() throws Exception { } @Test - void findBookingByBooker() throws Exception { + void findBookingByBooker() throws Exception { if (bookingId.equals(0L)) { addBooking(); } diff --git a/server/src/test/java/ru/practicum/shareit/item/ItemControllerTest.java b/server/src/test/java/ru/practicum/shareit/item/ItemControllerTest.java index f18f5fb..a46aff1 100644 --- a/server/src/test/java/ru/practicum/shareit/item/ItemControllerTest.java +++ b/server/src/test/java/ru/practicum/shareit/item/ItemControllerTest.java @@ -13,16 +13,13 @@ import ru.practicum.shareit.item.dto.ItemDto; import ru.practicum.shareit.item.service.CommentService; import ru.practicum.shareit.item.service.ItemService; -import ru.practicum.shareit.user.UserController; import java.nio.charset.StandardCharsets; import java.time.Instant; import java.util.ArrayList; -import java.util.Collection; import java.util.List; import static org.hamcrest.Matchers.is; -import static org.junit.jupiter.api.Assertions.*; import static org.mockito.ArgumentMatchers.*; import static org.mockito.Mockito.when; import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.*; @@ -122,26 +119,26 @@ void createItem() throws Exception { .andExpect(jsonPath("$.description", is(itemDto.getDescription()))); } -@Test + @Test void updateItem() throws Exception { - ItemDto itemDto = new ItemDto(); - itemDto.setId(1L); - itemDto.setName("Name item4"); - itemDto.setDescription("controller test update item"); - itemDto.setAvailable(true); - - when(itemService.updateItem(any(), anyLong())) - .thenReturn(itemDto); - mvc.perform(patch("/items/1") - .header(HEADER_USER_ID, 1L) - .content(mapper.writeValueAsString(itemDto)) - .characterEncoding(StandardCharsets.UTF_8) - .contentType(MediaType.APPLICATION_JSON) - .accept(MediaType.APPLICATION_JSON)) - .andExpect(status().isOk()) - .andExpect(jsonPath("$.id", is(itemDto.getId()), Long.class)) - .andExpect(jsonPath("$.name", is(itemDto.getName()))) - .andExpect(jsonPath("$.description", is(itemDto.getDescription()))); + ItemDto itemDto = new ItemDto(); + itemDto.setId(1L); + itemDto.setName("Name item4"); + itemDto.setDescription("controller test update item"); + itemDto.setAvailable(true); + + when(itemService.updateItem(any(), anyLong())) + .thenReturn(itemDto); + mvc.perform(patch("/items/1") + .header(HEADER_USER_ID, 1L) + .content(mapper.writeValueAsString(itemDto)) + .characterEncoding(StandardCharsets.UTF_8) + .contentType(MediaType.APPLICATION_JSON) + .accept(MediaType.APPLICATION_JSON)) + .andExpect(status().isOk()) + .andExpect(jsonPath("$.id", is(itemDto.getId()), Long.class)) + .andExpect(jsonPath("$.name", is(itemDto.getName()))) + .andExpect(jsonPath("$.description", is(itemDto.getDescription()))); } @Test diff --git a/server/src/test/java/ru/practicum/shareit/item/dto/ItemDtoTest.java b/server/src/test/java/ru/practicum/shareit/item/dto/ItemDtoTest.java index 8342386..dac6e9e 100644 --- a/server/src/test/java/ru/practicum/shareit/item/dto/ItemDtoTest.java +++ b/server/src/test/java/ru/practicum/shareit/item/dto/ItemDtoTest.java @@ -30,6 +30,7 @@ void testItemDto() throws Exception { assertThat(result).extractingJsonPathStringValue("$.name").isEqualTo("Item"); assertThat(result).extractingJsonPathStringValue("$.description").isEqualTo("Test item"); assertThat(result).extractingJsonPathBooleanValue("$.available").isEqualTo(true); + assertThat(result).extractingJsonPathBooleanValue("$.requestId").isEqualTo(null); } } \ No newline at end of file diff --git a/server/src/test/java/ru/practicum/shareit/item/service/CommentServiceImplTest.java b/server/src/test/java/ru/practicum/shareit/item/service/CommentServiceImplTest.java index 180e832..cb0e600 100644 --- a/server/src/test/java/ru/practicum/shareit/item/service/CommentServiceImplTest.java +++ b/server/src/test/java/ru/practicum/shareit/item/service/CommentServiceImplTest.java @@ -6,17 +6,12 @@ import org.springframework.boot.test.context.SpringBootTest; import org.springframework.transaction.annotation.Transactional; import ru.practicum.shareit.booking.Booking; -import ru.practicum.shareit.booking.BookingMapper; -import ru.practicum.shareit.booking.dto.BookingDto; import ru.practicum.shareit.booking.enums.BookingStatus; import ru.practicum.shareit.booking.repository.BookingRepository; -import ru.practicum.shareit.booking.service.BookingServiceImpl; -import ru.practicum.shareit.item.ItemMapper; import ru.practicum.shareit.item.dto.CommentDto; import ru.practicum.shareit.item.model.Item; import ru.practicum.shareit.item.repository.ItemRepository; import ru.practicum.shareit.user.User; -import ru.practicum.shareit.user.UserMapper; import ru.practicum.shareit.user.repository.UserRepository; import java.time.Instant; @@ -25,7 +20,6 @@ import static org.hamcrest.CoreMatchers.notNullValue; import static org.hamcrest.MatcherAssert.assertThat; -import static org.junit.jupiter.api.Assertions.*; import static org.junit.jupiter.api.Assertions.assertEquals; @Transactional diff --git a/server/src/test/java/ru/practicum/shareit/item/service/ItemServiceImplTest.java b/server/src/test/java/ru/practicum/shareit/item/service/ItemServiceImplTest.java index 1813eba..4d08c0a 100644 --- a/server/src/test/java/ru/practicum/shareit/item/service/ItemServiceImplTest.java +++ b/server/src/test/java/ru/practicum/shareit/item/service/ItemServiceImplTest.java @@ -9,12 +9,10 @@ import ru.practicum.shareit.excepton.NotFoundException; import ru.practicum.shareit.item.dto.ItemCommentsDto; import ru.practicum.shareit.item.dto.ItemDto; -import ru.practicum.shareit.item.model.Item; import ru.practicum.shareit.user.dto.UserDto; import ru.practicum.shareit.user.service.UserService; import java.util.ArrayList; -import java.util.Collection; import java.util.List; import static org.hamcrest.CoreMatchers.notNullValue; @@ -130,7 +128,7 @@ void searchItems() throws Exception { List sourceItems = makeItems(ownerId, 3); List targetItems = itemService.searchItemsByText("Item_2") - .stream().toList(); + .stream().toList(); assertNotNull(targetItems); assertTrue(targetItems.size() > 0); } diff --git a/server/src/test/java/ru/practicum/shareit/request/ItemRequestControllerTest.java b/server/src/test/java/ru/practicum/shareit/request/ItemRequestControllerTest.java index f8de434..b8624ee 100644 --- a/server/src/test/java/ru/practicum/shareit/request/ItemRequestControllerTest.java +++ b/server/src/test/java/ru/practicum/shareit/request/ItemRequestControllerTest.java @@ -2,17 +2,14 @@ import com.fasterxml.jackson.databind.ObjectMapper; import org.junit.jupiter.api.Test; -import org.mockito.stubbing.OngoingStubbing; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest; import org.springframework.boot.test.mock.mockito.MockBean; import org.springframework.http.MediaType; import org.springframework.test.web.servlet.MockMvc; -import ru.practicum.shareit.item.dto.ItemDto; import ru.practicum.shareit.request.dto.ItemRequestDto; import ru.practicum.shareit.request.dto.RequestWithItemsDto; import ru.practicum.shareit.request.service.ItemRequestService; -import ru.practicum.shareit.user.UserController; import ru.practicum.shareit.user.dto.UserDto; import java.nio.charset.StandardCharsets; @@ -21,11 +18,11 @@ import java.util.List; import static org.hamcrest.Matchers.is; -import static org.junit.jupiter.api.Assertions.*; import static org.mockito.ArgumentMatchers.any; import static org.mockito.ArgumentMatchers.anyLong; import static org.mockito.Mockito.when; -import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.*; +import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; +import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.post; import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.jsonPath; import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; @@ -47,7 +44,7 @@ void createItemRequest() throws Exception { ItemRequestDto itemRequestDto = new ItemRequestDto(); itemRequestDto.setId(1L); itemRequestDto.setDescription("description"); - itemRequestDto.setRequestor(new UserDto(1L, "user","user@request.crate.test")); + itemRequestDto.setRequestor(new UserDto(1L, "user", "user@request.crate.test")); itemRequestDto.setCreated(Instant.now()); when(itemRequestService.create(anyLong(), any())) @@ -66,11 +63,11 @@ void createItemRequest() throws Exception { } @Test - void findItemRequest() throws Exception{ + void findItemRequest() throws Exception { RequestWithItemsDto rwi = new RequestWithItemsDto(); rwi.setId(1L); rwi.setDescription("description"); - rwi.setRequestor(new UserDto(1L, "user","user@request.crate.test")); + rwi.setRequestor(new UserDto(1L, "user", "user@request.crate.test")); rwi.setCreated(Instant.now()); when(itemRequestService.findReqestsById(anyLong(), anyLong())) .thenReturn(rwi); @@ -88,7 +85,7 @@ void findItemRequest() throws Exception{ @Test void findRequestsByUserId() throws Exception { - List rwiList =makeRequests(2); + List rwiList = makeRequests(2); when(itemRequestService.findReqestsByCustomerId(anyLong())) .thenReturn(rwiList); @@ -103,7 +100,7 @@ void findRequestsByUserId() throws Exception { @Test void findAllRequests() throws Exception { - List rwiList =makeRequests(3); + List rwiList = makeRequests(3); when(itemRequestService.findAllReqests(anyLong())) .thenReturn(rwiList); @@ -123,7 +120,7 @@ private List makeRequests(Integer count) { RequestWithItemsDto rwi = new RequestWithItemsDto(); rwi.setId((long) i); rwi.setDescription("controller test item_" + i); - rwi.setRequestor(new UserDto(1L, "user","user@request.crate.test")); + rwi.setRequestor(new UserDto(1L, "user", "user@request.crate.test")); rwi.setCreated(Instant.now().plusSeconds(60 * i)); rwiList.add(rwi); } diff --git a/server/src/test/java/ru/practicum/shareit/request/service/ItemRequestServiceImplTest.java b/server/src/test/java/ru/practicum/shareit/request/service/ItemRequestServiceImplTest.java index f8af5f3..6376a67 100644 --- a/server/src/test/java/ru/practicum/shareit/request/service/ItemRequestServiceImplTest.java +++ b/server/src/test/java/ru/practicum/shareit/request/service/ItemRequestServiceImplTest.java @@ -1,12 +1,9 @@ package ru.practicum.shareit.request.service; import lombok.RequiredArgsConstructor; -import org.junit.jupiter.api.BeforeAll; -import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; -import org.springframework.boot.test.mock.mockito.MockBean; import org.springframework.transaction.annotation.Transactional; import ru.practicum.shareit.excepton.InternalServerException; import ru.practicum.shareit.excepton.NotFoundException; @@ -17,13 +14,10 @@ import java.time.Instant; import java.util.List; -import java.util.Optional; import static org.hamcrest.CoreMatchers.notNullValue; import static org.hamcrest.MatcherAssert.assertThat; import static org.junit.jupiter.api.Assertions.*; -import static org.mockito.ArgumentMatchers.anyLong; -import static org.mockito.Mockito.when; @Transactional @SpringBootTest @@ -63,7 +57,7 @@ void findReqestsById() throws NotFoundException, InternalServerException, Except RequestWithItemsDto rwi = itemRequestService.findReqestsById(userId, requestId); assertNotNull(rwi, "Запрос не найден."); - assertEquals( requestId, rwi.getId(), + assertEquals(requestId, rwi.getId(), "Идентификатор запроса не верен."); assertThrows(NotFoundException.class, diff --git a/server/src/test/java/ru/practicum/shareit/user/UserControllerTest.java b/server/src/test/java/ru/practicum/shareit/user/UserControllerTest.java index 412e9b5..4012507 100644 --- a/server/src/test/java/ru/practicum/shareit/user/UserControllerTest.java +++ b/server/src/test/java/ru/practicum/shareit/user/UserControllerTest.java @@ -24,25 +24,22 @@ @WebMvcTest(controllers = UserController.class) class UserControllerTest { - @Autowired - ObjectMapper mapper; - @MockBean private final UserService userService; - + @Autowired + ObjectMapper mapper; @Autowired private MockMvc mvc; + private UserDto userDto = new UserDto( + 1L, + "User Test", + "user@controller.test"); @Autowired public UserControllerTest(UserService userService) { this.userService = userService; } - private UserDto userDto = new UserDto( - 1L, - "User Test", - "user@controller.test"); - @Test void findAllUser() throws Exception { List sourceUsers = List.of( diff --git a/server/src/test/java/ru/practicum/shareit/user/dto/UserDtoTest.java b/server/src/test/java/ru/practicum/shareit/user/dto/UserDtoTest.java index 1ad799a..6a86e82 100644 --- a/server/src/test/java/ru/practicum/shareit/user/dto/UserDtoTest.java +++ b/server/src/test/java/ru/practicum/shareit/user/dto/UserDtoTest.java @@ -8,7 +8,6 @@ import org.springframework.boot.test.json.JsonContent; import static org.assertj.core.api.AssertionsForInterfaceTypes.assertThat; -import static org.junit.jupiter.api.Assertions.*; @JsonTest @RequiredArgsConstructor(onConstructor_ = @Autowired) diff --git a/server/src/test/resoueces/application.properties b/server/src/test/resoueces/application.properties index 87ac0b4..bc2dd62 100644 --- a/server/src/test/resoueces/application.properties +++ b/server/src/test/resoueces/application.properties @@ -1,16 +1,12 @@ server.port=9090 - spring.jpa.hibernate.ddl-auto=none spring.jpa.properties.hibernate.format_sql=true spring.sql.init.mode=always - logging.level.org.zalando.logbook=TRACE - #logging.level.org.springframework.orm.jpa=INFO #logging.level.org.springframework.transaction=INFO #logging.level.org.springframework.transaction.interceptor=TRACE #logging.level.org.springframework.orm.jpa.JpaTransactionManager=DEBUG - spring.config.activate.on-profile=test spring.datasource.driverClassName=org.h2.Driver spring.datasource.url=jdbc:h2:mem:shareit diff --git a/server/src/test/resoueces/schema.sql b/server/src/test/resoueces/schema.sql index 4bb2fa3..22295d8 100644 --- a/server/src/test/resoueces/schema.sql +++ b/server/src/test/resoueces/schema.sql @@ -1,52 +1,57 @@ -CREATE TABLE IF NOT EXISTS users ( - id BIGINT GENERATED BY DEFAULT AS IDENTITY NOT NULL, - name VARCHAR(255) NOT NULL, - email VARCHAR(255) NOT NULL, +CREATE TABLE IF NOT EXISTS users +( + id BIGINT GENERATED BY DEFAULT AS IDENTITY NOT NULL, + name VARCHAR(255) NOT NULL, + email VARCHAR(255) NOT NULL, CONSTRAINT pk_user PRIMARY KEY (id), CONSTRAINT UQ_USER_EMAIL UNIQUE (email) ); -CREATE TABLE IF NOT EXISTS itemrequests ( - id BIGINT GENERATED BY DEFAULT AS IDENTITY NOT NULL, - description VARCHAR(512) NOT NULL, - customer_id BIGINT NOT NULL, - created TIMESTAMP WITHOUT TIME ZONE, +CREATE TABLE IF NOT EXISTS itemrequests +( + id BIGINT GENERATED BY DEFAULT AS IDENTITY NOT NULL, + description VARCHAR(512) NOT NULL, + customer_id BIGINT NOT NULL, + created TIMESTAMP WITHOUT TIME ZONE, CONSTRAINT pk_itemrequests PRIMARY KEY (id), - CONSTRAINT fk_itemrequests_to_users FOREIGN KEY(customer_id) REFERENCES users(id) + CONSTRAINT fk_itemrequests_to_users FOREIGN KEY (customer_id) REFERENCES users (id) ); -CREATE TABLE IF NOT EXISTS items ( - id BIGINT GENERATED BY DEFAULT AS IDENTITY NOT NULL, - name VARCHAR(255) NOT NULL, +CREATE TABLE IF NOT EXISTS items +( + id BIGINT GENERATED BY DEFAULT AS IDENTITY NOT NULL, + name VARCHAR(255) NOT NULL, description VARCHAR(255), - owner_id BIGINT NOT NULL, - available BOOLEAN, - request_id BIGINT, + owner_id BIGINT NOT NULL, + available BOOLEAN, + request_id BIGINT, CONSTRAINT pk_item PRIMARY KEY (id), - CONSTRAINT fk_items_to_users FOREIGN KEY(owner_id) REFERENCES users(id), - CONSTRAINT fk_items_to_requests FOREIGN KEY(request_id) REFERENCES itemrequests(id) + CONSTRAINT fk_items_to_users FOREIGN KEY (owner_id) REFERENCES users (id), + CONSTRAINT fk_items_to_requests FOREIGN KEY (request_id) REFERENCES itemrequests (id) ); -CREATE TABLE IF NOT EXISTS comments ( - id BIGINT GENERATED BY DEFAULT AS IDENTITY NOT NULL, - text VARCHAR(512) NOT NULL, - item_id BIGINT NOT NULL, - author_id BIGINT NOT NULL, - created TIMESTAMP WITHOUT TIME ZONE, +CREATE TABLE IF NOT EXISTS comments +( + id BIGINT GENERATED BY DEFAULT AS IDENTITY NOT NULL, + text VARCHAR(512) NOT NULL, + item_id BIGINT NOT NULL, + author_id BIGINT NOT NULL, + created TIMESTAMP WITHOUT TIME ZONE, CONSTRAINT pk_comment PRIMARY KEY (id), - CONSTRAINT fk_connemts_to_items FOREIGN KEY(item_id) REFERENCES items(id), - CONSTRAINT fk_connemts_to_users FOREIGN KEY(author_id) REFERENCES users(id) + CONSTRAINT fk_connemts_to_items FOREIGN KEY (item_id) REFERENCES items (id), + CONSTRAINT fk_connemts_to_users FOREIGN KEY (author_id) REFERENCES users (id) ); -CREATE TABLE IF NOT EXISTS bookings ( - id BIGINT GENERATED BY DEFAULT AS IDENTITY NOT NULL, - time_start TIMESTAMP WITHOUT TIME ZONE NOT NULL, - time_end TIMESTAMP WITHOUT TIME ZONE NOT NULL, - item_id BIGINT NOT NULL, - booker_id BIGINT NOT NULL, - status VARCHAR(16), +CREATE TABLE IF NOT EXISTS bookings +( + id BIGINT GENERATED BY DEFAULT AS IDENTITY NOT NULL, + time_start TIMESTAMP WITHOUT TIME ZONE NOT NULL, + time_end TIMESTAMP WITHOUT TIME ZONE NOT NULL, + item_id BIGINT NOT NULL, + booker_id BIGINT NOT NULL, + status VARCHAR(16), CONSTRAINT pk_buoking PRIMARY KEY (id), - CONSTRAINT fk_buokings_to_items FOREIGN KEY(item_id) REFERENCES items(id), - CONSTRAINT fk_buokings_to_users FOREIGN KEY(booker_id) REFERENCES users(id) + CONSTRAINT fk_buokings_to_items FOREIGN KEY (item_id) REFERENCES items (id), + CONSTRAINT fk_buokings_to_users FOREIGN KEY (booker_id) REFERENCES users (id) ); From babe65aada602a1bbd94ac993954667fe83eef1f Mon Sep 17 00:00:00 2001 From: Andrej Stelmaschuk Date: Sat, 3 May 2025 00:14:45 +0700 Subject: [PATCH 23/46] =?UTF-8?q?fix:=20=D0=B8=D1=81=D0=BF=D1=80=D0=B0?= =?UTF-8?q?=D0=B2=D0=BB=D0=B5=D0=BD=D0=B8=D0=B5=20=D0=BE=D1=88=D0=B8=D0=B1?= =?UTF-8?q?=D0=BE=D0=BA=20=D1=81=D1=82=D0=B8=D0=BB=D1=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../practicum/shareit/booking/BookingControllerTest.java | 2 +- .../main/java/ru/practicum/shareit/item/ItemMapper.java | 2 +- .../ru/practicum/shareit/request/ItemRequestMapper.java | 6 +++--- .../shareit/request/service/ItemRequestService.java | 4 ++-- .../shareit/request/service/ItemRequestServiceImpl.java | 8 ++++---- .../ru/practicum/shareit/booking/dto/BookingDtoTest.java | 4 ++-- 6 files changed, 13 insertions(+), 13 deletions(-) diff --git a/gateway/src/test/java/ru/practicum/shareit/booking/BookingControllerTest.java b/gateway/src/test/java/ru/practicum/shareit/booking/BookingControllerTest.java index 688e374..915cec1 100644 --- a/gateway/src/test/java/ru/practicum/shareit/booking/BookingControllerTest.java +++ b/gateway/src/test/java/ru/practicum/shareit/booking/BookingControllerTest.java @@ -50,7 +50,7 @@ class BookingControllerTest { LocalDateTime.of(2025, 04, 12, 10, 10), LocalDateTime.of(2025, 04, 15, 10, 10), 1L, - new ItemDto(1l, "Iteem", "Description", true, null, null, null), + new ItemDto(1L, "Iteem", "Description", true, null, null, null), 2L, new UserDto(2L, "User", "user@booking.controller.test"), BookingStatus.WAITING); diff --git a/server/src/main/java/ru/practicum/shareit/item/ItemMapper.java b/server/src/main/java/ru/practicum/shareit/item/ItemMapper.java index 1deac40..80a94c3 100644 --- a/server/src/main/java/ru/practicum/shareit/item/ItemMapper.java +++ b/server/src/main/java/ru/practicum/shareit/item/ItemMapper.java @@ -32,7 +32,7 @@ public static ItemCommentsDto toItemCommentsDto(Item item) { itemDto.setDescription(item.getDescription()); itemDto.setAvailable(item.getAvailable()); if (item.getRequest() != null) { - itemDto.setRequest(ItemRequestMapper.ToItemRequestDto(item.getRequest())); + itemDto.setRequest(ItemRequestMapper.toItemRequestDto(item.getRequest())); } itemDto.setComments(List.of()); return itemDto; diff --git a/server/src/main/java/ru/practicum/shareit/request/ItemRequestMapper.java b/server/src/main/java/ru/practicum/shareit/request/ItemRequestMapper.java index 291fb6e..8f91206 100644 --- a/server/src/main/java/ru/practicum/shareit/request/ItemRequestMapper.java +++ b/server/src/main/java/ru/practicum/shareit/request/ItemRequestMapper.java @@ -8,7 +8,7 @@ public class ItemRequestMapper { private ItemRequestMapper() { } - public static ItemRequest ToItemRequest(ItemRequestDto requestDto) { + public static ItemRequest toItemRequest(ItemRequestDto requestDto) { ItemRequest itemRequest = new ItemRequest(); itemRequest.setId(requestDto.getId()); itemRequest.setDescription(requestDto.getDescription()); @@ -19,7 +19,7 @@ public static ItemRequest ToItemRequest(ItemRequestDto requestDto) { return itemRequest; } - public static ItemRequestDto ToItemRequestDto(ItemRequest itemRequest) { + public static ItemRequestDto toItemRequestDto(ItemRequest itemRequest) { ItemRequestDto itemRequestDto = new ItemRequestDto(); itemRequestDto.setId(itemRequest.getId()); itemRequestDto.setDescription(itemRequest.getDescription()); @@ -30,7 +30,7 @@ public static ItemRequestDto ToItemRequestDto(ItemRequest itemRequest) { return itemRequestDto; } - public static RequestWithItemsDto ToRwiDto(ItemRequest itemRequest) { + public static RequestWithItemsDto toRwiDto(ItemRequest itemRequest) { RequestWithItemsDto itemRequestDto = new RequestWithItemsDto(); itemRequestDto.setId(itemRequest.getId()); itemRequestDto.setDescription(itemRequest.getDescription()); diff --git a/server/src/main/java/ru/practicum/shareit/request/service/ItemRequestService.java b/server/src/main/java/ru/practicum/shareit/request/service/ItemRequestService.java index 1b2c41c..85570b4 100644 --- a/server/src/main/java/ru/practicum/shareit/request/service/ItemRequestService.java +++ b/server/src/main/java/ru/practicum/shareit/request/service/ItemRequestService.java @@ -10,7 +10,7 @@ public interface ItemRequestService { RequestWithItemsDto findReqestsById(Long userId, Long id); - List findReqestsByCustomerId(Long CustomerId); + List findReqestsByCustomerId(Long customerId); - List findAllReqests(Long CustomerId); + List findAllReqests(Long customerId); } diff --git a/server/src/main/java/ru/practicum/shareit/request/service/ItemRequestServiceImpl.java b/server/src/main/java/ru/practicum/shareit/request/service/ItemRequestServiceImpl.java index 4af2d73..76c52d1 100644 --- a/server/src/main/java/ru/practicum/shareit/request/service/ItemRequestServiceImpl.java +++ b/server/src/main/java/ru/practicum/shareit/request/service/ItemRequestServiceImpl.java @@ -47,8 +47,8 @@ public ItemRequestDto create(Long customerId, ItemRequestDto itemRequestDto) { itemRequestDto.setRequestor(UserMapper.toUserDto(customer)); itemRequestDto.setCreated(Instant.now()); ItemRequest savedItemRequest = itemRequestRepository.save( - ItemRequestMapper.ToItemRequest(itemRequestDto)); - return ItemRequestMapper.ToItemRequestDto(savedItemRequest); + ItemRequestMapper.toItemRequest(itemRequestDto)); + return ItemRequestMapper.toItemRequestDto(savedItemRequest); } @Override @@ -58,7 +58,7 @@ public RequestWithItemsDto findReqestsById(Long userId, Long id) { ItemRequest request = itemRequestRepository.findById(id) .orElseThrow(() -> new NotFoundException("Не найден запрос id=" + id)); - RequestWithItemsDto rwi = ItemRequestMapper.ToRwiDto(request); + RequestWithItemsDto rwi = ItemRequestMapper.toRwiDto(request); List items = itemRepository.findAllByRequest_IdEquals(id).stream() .map(ItemMapper::toItemShortDto) .toList(); @@ -97,7 +97,7 @@ private List addItemsToRequests(List requests) Map rwiDtoMap = new HashMap<>(); for (int i = 0; i < requests.size(); i++) { ItemRequest itemRequest = requests.get(i); - RequestWithItemsDto rwiDto = ItemRequestMapper.ToRwiDto(itemRequest); + RequestWithItemsDto rwiDto = ItemRequestMapper.toRwiDto(itemRequest); rwiDtos.add(rwiDto); rwiDtoMap.put(itemRequest.getId(), rwiDto); } diff --git a/server/src/test/java/ru/practicum/shareit/booking/dto/BookingDtoTest.java b/server/src/test/java/ru/practicum/shareit/booking/dto/BookingDtoTest.java index 3b46d33..20384db 100644 --- a/server/src/test/java/ru/practicum/shareit/booking/dto/BookingDtoTest.java +++ b/server/src/test/java/ru/practicum/shareit/booking/dto/BookingDtoTest.java @@ -24,8 +24,8 @@ void testBookingDto() throws Exception { bookingDto.setId(1L); bookingDto.setStart(LocalDateTime.now()); bookingDto.setEnd(LocalDateTime.now().plusDays(1)); - bookingDto.setItemId(1l); - bookingDto.setBookerId(1l); + bookingDto.setItemId(1L); + bookingDto.setBookerId(1L); bookingDto.setStatus(BookingStatus.APPROVED); JsonContent result = json.write(bookingDto); From d13777a186b1e9e6613b5cf9837e958da972ee3d Mon Sep 17 00:00:00 2001 From: Andrej Stelmaschuk Date: Sat, 3 May 2025 00:19:42 +0700 Subject: [PATCH 24/46] =?UTF-8?q?fix:=20=D0=B8=D1=81=D0=BF=D1=80=D0=B0?= =?UTF-8?q?=D0=B2=D0=BB=D0=B5=D0=BD=D0=B8=D0=B5=20=D0=BE=D1=88=D0=B8=D0=B1?= =?UTF-8?q?=D0=BE=D0=BA=20=D1=81=D1=82=D0=B8=D0=BB=D1=8F=202?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ru/practicum/shareit/booking/BookingControllerTest.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/server/src/test/java/ru/practicum/shareit/booking/BookingControllerTest.java b/server/src/test/java/ru/practicum/shareit/booking/BookingControllerTest.java index a3158f7..fcf3f45 100644 --- a/server/src/test/java/ru/practicum/shareit/booking/BookingControllerTest.java +++ b/server/src/test/java/ru/practicum/shareit/booking/BookingControllerTest.java @@ -40,7 +40,7 @@ class BookingControllerTest { LocalDateTime.of(2025, 04, 12, 10, 10), LocalDateTime.of(2025, 04, 15, 10, 10), 1L, - new ItemDto(1l, "Iteem", "Description", true, null, null, null), + new ItemDto(1L, "Iteem", "Description", true, null, null, null), 2L, new UserDto(2L, "User", "user@booking.controller.test"), BookingStatus.WAITING); From da751f023252d46fe394386992e526062d66532a Mon Sep 17 00:00:00 2001 From: Andrej Stelmaschuk Date: Sat, 3 May 2025 00:34:36 +0700 Subject: [PATCH 25/46] =?UTF-8?q?fix:=20=D0=B8=D1=81=D0=BF=D1=80=D0=B0?= =?UTF-8?q?=D0=B2=D0=BB=D0=B5=D0=BD=D0=B8=D0=B5=20=D0=BF=D0=BE=D0=B4=D0=BA?= =?UTF-8?q?=D0=BB=D1=8E=D1=87=D0=B5=D0=BD=D0=B8=D1=8F=20=D0=BA=20=D0=B1?= =?UTF-8?q?=D0=B0=D0=B7=D0=B5=20=D0=B4=D0=B0=D0=BD=D0=BD=D1=8B=D1=85?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- server/src/test/resoueces/application.properties | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/server/src/test/resoueces/application.properties b/server/src/test/resoueces/application.properties index bc2dd62..7e613df 100644 --- a/server/src/test/resoueces/application.properties +++ b/server/src/test/resoueces/application.properties @@ -7,8 +7,15 @@ logging.level.org.zalando.logbook=TRACE #logging.level.org.springframework.transaction=INFO #logging.level.org.springframework.transaction.interceptor=TRACE #logging.level.org.springframework.orm.jpa.JpaTransactionManager=DEBUG -spring.config.activate.on-profile=test -spring.datasource.driverClassName=org.h2.Driver -spring.datasource.url=jdbc:h2:mem:shareit + +spring.datasource.driverClassName=org.postgresql.Driver +spring.datasource.url=jdbc:postgresql://localhost:5432/shareit spring.datasource.username=shareit spring.datasource.password=shareit + + +#spring.config.activate.on-profile=test +#spring.datasource.driverClassName=org.h2.Driver +#spring.datasource.url=jdbc:h2:mem:shareit +#spring.datasource.username=shareit +#spring.datasource.password=shareit From 1375b4806dd476bdc339efb2c03d11356f65049b Mon Sep 17 00:00:00 2001 From: Andrej Stelmaschuk Date: Sat, 3 May 2025 10:52:16 +0700 Subject: [PATCH 26/46] =?UTF-8?q?fix:=20=D0=B8=D1=81=D0=BF=D1=80=D0=B0?= =?UTF-8?q?=D0=B2=D0=BB=D0=B5=D0=BD=D0=B8=D0=B5=20=D0=BF=D0=BE=D0=B4=D0=BA?= =?UTF-8?q?=D0=BB=D1=8E=D1=87=D0=B5=D0=BD=D0=B8=D1=8F=20=D0=BA=20=D0=B1?= =?UTF-8?q?=D0=B0=D0=B7=D0=B5=20=D0=B4=D0=B0=D0=BD=D0=BD=D1=8B=D1=85=202?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- server/src/main/resources/application.properties | 6 +++--- server/src/test/resoueces/application.properties | 6 +++--- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/server/src/main/resources/application.properties b/server/src/main/resources/application.properties index e525588..588f85c 100644 --- a/server/src/main/resources/application.properties +++ b/server/src/main/resources/application.properties @@ -10,6 +10,6 @@ logging.level.org.zalando.logbook=TRACE #logging.level.org.springframework.orm.jpa.JpaTransactionManager=DEBUG spring.datasource.driverClassName=org.postgresql.Driver -spring.datasource.url=jdbc:postgresql://localhost:5432/shareit -spring.datasource.username=shareit -spring.datasource.password=shareit +spring.datasource.url=jdbc:postgresql://localhost:5432/shareitdb +spring.datasource.username=test +spring.datasource.password=test diff --git a/server/src/test/resoueces/application.properties b/server/src/test/resoueces/application.properties index 7e613df..068a1fb 100644 --- a/server/src/test/resoueces/application.properties +++ b/server/src/test/resoueces/application.properties @@ -9,9 +9,9 @@ logging.level.org.zalando.logbook=TRACE #logging.level.org.springframework.orm.jpa.JpaTransactionManager=DEBUG spring.datasource.driverClassName=org.postgresql.Driver -spring.datasource.url=jdbc:postgresql://localhost:5432/shareit -spring.datasource.username=shareit -spring.datasource.password=shareit +spring.datasource.url=jdbc:postgresql://localhost:5432/shareitdb +spring.datasource.username=test +spring.datasource.password=test #spring.config.activate.on-profile=test From 27214a1fa25d236e14c4bd84626cb39d4d8b18a6 Mon Sep 17 00:00:00 2001 From: Andrej Stelmaschuk Date: Sat, 3 May 2025 11:12:03 +0700 Subject: [PATCH 27/46] =?UTF-8?q?fix:=20=D0=B8=D1=81=D0=BF=D1=80=D0=B0?= =?UTF-8?q?=D0=B2=D0=BB=D0=B5=D0=BD=D0=B8=D0=B5=20=D0=BF=D0=BE=D0=B4=D0=BA?= =?UTF-8?q?=D0=BB=D1=8E=D1=87=D0=B5=D0=BD=D0=B8=D1=8F=20=D0=BA=20=D0=B1?= =?UTF-8?q?=D0=B0=D0=B7=D0=B5=20=D0=B4=D0=B0=D0=BD=D0=BD=D1=8B=D1=85=203?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/main/resources/application.properties | 20 +++++++++------- .../src/test/resoueces/application.properties | 24 ++++++++----------- 2 files changed, 21 insertions(+), 23 deletions(-) diff --git a/server/src/main/resources/application.properties b/server/src/main/resources/application.properties index 588f85c..71fe316 100644 --- a/server/src/main/resources/application.properties +++ b/server/src/main/resources/application.properties @@ -1,15 +1,17 @@ server.port=9090 + spring.jpa.hibernate.ddl-auto=none spring.jpa.properties.hibernate.format_sql=true spring.sql.init.mode=always -logging.level.org.zalando.logbook=TRACE - -#logging.level.org.springframework.orm.jpa=INFO -#logging.level.org.springframework.transaction=INFO -#logging.level.org.springframework.transaction.interceptor=TRACE -#logging.level.org.springframework.orm.jpa.JpaTransactionManager=DEBUG +#--- spring.datasource.driverClassName=org.postgresql.Driver -spring.datasource.url=jdbc:postgresql://localhost:5432/shareitdb -spring.datasource.username=test -spring.datasource.password=test +spring.datasource.url=jdbc:postgresql://localhost:5432/shareit +spring.datasource.username=shareit +spring.datasource.password=shareit +#--- +#spring.config.activate.on-profile=test +#spring.datasource.driverClassName=org.h2.Driver +#spring.datasource.url=jdbc:h2:mem:shareit +#spring.datasource.username=shareit +#spring.datasource.password=shareit \ No newline at end of file diff --git a/server/src/test/resoueces/application.properties b/server/src/test/resoueces/application.properties index 068a1fb..9a73c19 100644 --- a/server/src/test/resoueces/application.properties +++ b/server/src/test/resoueces/application.properties @@ -1,21 +1,17 @@ server.port=9090 + spring.jpa.hibernate.ddl-auto=none spring.jpa.properties.hibernate.format_sql=true spring.sql.init.mode=always -logging.level.org.zalando.logbook=TRACE -#logging.level.org.springframework.orm.jpa=INFO -#logging.level.org.springframework.transaction=INFO -#logging.level.org.springframework.transaction.interceptor=TRACE -#logging.level.org.springframework.orm.jpa.JpaTransactionManager=DEBUG - -spring.datasource.driverClassName=org.postgresql.Driver -spring.datasource.url=jdbc:postgresql://localhost:5432/shareitdb -spring.datasource.username=test -spring.datasource.password=test - -#spring.config.activate.on-profile=test -#spring.datasource.driverClassName=org.h2.Driver -#spring.datasource.url=jdbc:h2:mem:shareit +#--- +#spring.datasource.driverClassName=org.postgresql.Driver +#spring.datasource.url=jdbc:postgresql://localhost:5432/shareit #spring.datasource.username=shareit #spring.datasource.password=shareit +#--- +spring.config.activate.on-profile=test +spring.datasource.driverClassName=org.h2.Driver +spring.datasource.url=jdbc:h2:mem:shareit +spring.datasource.username=shareit +spring.datasource.password=shareit \ No newline at end of file From d629cc612f37a15011cee47e4fd980fcc1563960 Mon Sep 17 00:00:00 2001 From: Andrej Stelmaschuk Date: Sat, 3 May 2025 12:01:58 +0700 Subject: [PATCH 28/46] =?UTF-8?q?fix:=20=D0=B8=D1=81=D0=BF=D1=80=D0=B0?= =?UTF-8?q?=D0=B2=D0=BB=D0=B5=D0=BD=D0=B8=D0=B5=20=D0=BF=D0=BE=D0=B4=D0=BA?= =?UTF-8?q?=D0=BB=D1=8E=D1=87=D0=B5=D0=BD=D0=B8=D1=8F=20=D0=BA=20=D0=B1?= =?UTF-8?q?=D0=B0=D0=B7=D0=B5=20=D0=B4=D0=B0=D0=BD=D0=BD=D1=8B=D1=85=204?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- server/src/test/resoueces/application.properties | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/server/src/test/resoueces/application.properties b/server/src/test/resoueces/application.properties index 9a73c19..4c44798 100644 --- a/server/src/test/resoueces/application.properties +++ b/server/src/test/resoueces/application.properties @@ -5,13 +5,13 @@ spring.jpa.properties.hibernate.format_sql=true spring.sql.init.mode=always #--- -#spring.datasource.driverClassName=org.postgresql.Driver -#spring.datasource.url=jdbc:postgresql://localhost:5432/shareit +spring.datasource.driverClassName=org.postgresql.Driver +spring.datasource.url=jdbc:postgresql://localhost:5432/shareit +spring.datasource.username=shareit +spring.datasource.password=shareit +#--- +#spring.config.activate.on-profile=test +#spring.datasource.driverClassName=org.h2.Driver +#spring.datasource.url=jdbc:h2:mem:shareit #spring.datasource.username=shareit #spring.datasource.password=shareit -#--- -spring.config.activate.on-profile=test -spring.datasource.driverClassName=org.h2.Driver -spring.datasource.url=jdbc:h2:mem:shareit -spring.datasource.username=shareit -spring.datasource.password=shareit \ No newline at end of file From 2afb091e44c85123481eb3ef9bc53bb6ef7fd5ff Mon Sep 17 00:00:00 2001 From: Andrej Stelmaschuk Date: Sat, 3 May 2025 16:41:56 +0700 Subject: [PATCH 29/46] =?UTF-8?q?fix:=20=D1=82=D0=B0=D0=BD=D1=86=D1=8B=20?= =?UTF-8?q?=D1=81=20=D0=B1=D1=83=D0=B1=D0=BD=D0=BE=D0=BC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- server/src/main/resources/schema.sql | 7 +++++++ .../shareit/user/service/UserServiceImplTest.java | 3 ++- server/src/test/resoueces/schema.sql | 6 ++++++ 3 files changed, 15 insertions(+), 1 deletion(-) diff --git a/server/src/main/resources/schema.sql b/server/src/main/resources/schema.sql index 22295d8..d886586 100644 --- a/server/src/main/resources/schema.sql +++ b/server/src/main/resources/schema.sql @@ -1,3 +1,10 @@ + +DROP TABLE IF EXISTS bookings; +DROP TABLE IF EXISTS comments; +DROP TABLE IF EXISTS items; +DROP TABLE IF EXISTS itemrequests; +DROP TABLE IF EXISTS users; + CREATE TABLE IF NOT EXISTS users ( id BIGINT GENERATED BY DEFAULT AS IDENTITY NOT NULL, diff --git a/server/src/test/java/ru/practicum/shareit/user/service/UserServiceImplTest.java b/server/src/test/java/ru/practicum/shareit/user/service/UserServiceImplTest.java index 90a00bf..058065e 100644 --- a/server/src/test/java/ru/practicum/shareit/user/service/UserServiceImplTest.java +++ b/server/src/test/java/ru/practicum/shareit/user/service/UserServiceImplTest.java @@ -1,6 +1,7 @@ package ru.practicum.shareit.user.service; import lombok.RequiredArgsConstructor; +import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; @@ -40,7 +41,7 @@ void createUser() { assertThat(savedUserDto.getName(), equalTo(userDto.getName())); } - @Test + @Test void getUserById() { UserDto userDto = new UserDto(1L, "User Test getById", diff --git a/server/src/test/resoueces/schema.sql b/server/src/test/resoueces/schema.sql index 22295d8..9ca3517 100644 --- a/server/src/test/resoueces/schema.sql +++ b/server/src/test/resoueces/schema.sql @@ -1,3 +1,9 @@ +DROP TABLE IF EXISTS bookings; +DROP TABLE IF EXISTS comments; +DROP TABLE IF EXISTS items; +DROP TABLE IF EXISTS itemrequests; +DROP TABLE IF EXISTS users; + CREATE TABLE IF NOT EXISTS users ( id BIGINT GENERATED BY DEFAULT AS IDENTITY NOT NULL, From b17036405703bcc9427a42a1172c6279064bc6e1 Mon Sep 17 00:00:00 2001 From: Andrej Stelmaschuk Date: Sat, 3 May 2025 16:45:43 +0700 Subject: [PATCH 30/46] =?UTF-8?q?fix:=20=D1=82=D0=B0=D0=BD=D1=86=D1=8B=20?= =?UTF-8?q?=D1=81=20=D0=B1=D1=83=D0=B1=D0=BD=D0=BE=D0=BC=202?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ru/practicum/shareit/user/service/UserServiceImplTest.java | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/server/src/test/java/ru/practicum/shareit/user/service/UserServiceImplTest.java b/server/src/test/java/ru/practicum/shareit/user/service/UserServiceImplTest.java index 058065e..90a00bf 100644 --- a/server/src/test/java/ru/practicum/shareit/user/service/UserServiceImplTest.java +++ b/server/src/test/java/ru/practicum/shareit/user/service/UserServiceImplTest.java @@ -1,7 +1,6 @@ package ru.practicum.shareit.user.service; import lombok.RequiredArgsConstructor; -import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; @@ -41,7 +40,7 @@ void createUser() { assertThat(savedUserDto.getName(), equalTo(userDto.getName())); } - @Test + @Test void getUserById() { UserDto userDto = new UserDto(1L, "User Test getById", From 5ad04494ce68137d6eae87f9ec231e34cd554ad1 Mon Sep 17 00:00:00 2001 From: Andrej Stelmaschuk Date: Sat, 3 May 2025 19:05:32 +0700 Subject: [PATCH 31/46] =?UTF-8?q?fix:=20=D1=82=D0=B0=D0=BD=D1=86=D1=8B=20?= =?UTF-8?q?=D1=81=20=D0=B1=D1=83=D0=B1=D0=BD=D0=BE=D0=BC=203?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- server/src/test/resoueces/application.properties | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/server/src/test/resoueces/application.properties b/server/src/test/resoueces/application.properties index 4c44798..c2a8449 100644 --- a/server/src/test/resoueces/application.properties +++ b/server/src/test/resoueces/application.properties @@ -5,13 +5,13 @@ spring.jpa.properties.hibernate.format_sql=true spring.sql.init.mode=always #--- -spring.datasource.driverClassName=org.postgresql.Driver -spring.datasource.url=jdbc:postgresql://localhost:5432/shareit -spring.datasource.username=shareit -spring.datasource.password=shareit -#--- -#spring.config.activate.on-profile=test -#spring.datasource.driverClassName=org.h2.Driver -#spring.datasource.url=jdbc:h2:mem:shareit +#spring.datasource.driverClassName=org.postgresql.Driver +#spring.datasource.url=jdbc:postgresql://localhost:5432/shareit #spring.datasource.username=shareit #spring.datasource.password=shareit +#--- +spring.config.activate.on-profile=test +spring.datasource.driverClassName=org.h2.Driver +spring.datasource.url=jdbc:h2:mem:shareit +spring.datasource.username=shareit +spring.datasource.password=shareit From 7a0e4e311dcc6e12526c2e49f298830a7119b44f Mon Sep 17 00:00:00 2001 From: Andrej Stelmaschuk Date: Sat, 3 May 2025 19:19:09 +0700 Subject: [PATCH 32/46] =?UTF-8?q?fix:=20=D1=82=D0=B0=D0=BD=D1=86=D1=8B=20?= =?UTF-8?q?=D1=81=20=D0=B1=D1=83=D0=B1=D0=BD=D0=BE=D0=BC=204?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- server/src/main/resources/application.properties | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/server/src/main/resources/application.properties b/server/src/main/resources/application.properties index 71fe316..22c8cf8 100644 --- a/server/src/main/resources/application.properties +++ b/server/src/main/resources/application.properties @@ -5,13 +5,13 @@ spring.jpa.properties.hibernate.format_sql=true spring.sql.init.mode=always #--- -spring.datasource.driverClassName=org.postgresql.Driver -spring.datasource.url=jdbc:postgresql://localhost:5432/shareit -spring.datasource.username=shareit -spring.datasource.password=shareit +#spring.datasource.driverClassName=org.postgresql.Driver +#spring.datasource.url=jdbc:postgresql://localhost:5432/shareit +#spring.datasource.username=shareit +#spring.datasource.password=shareit #--- #spring.config.activate.on-profile=test -#spring.datasource.driverClassName=org.h2.Driver -#spring.datasource.url=jdbc:h2:mem:shareit -#spring.datasource.username=shareit -#spring.datasource.password=shareit \ No newline at end of file +spring.datasource.driverClassName=org.h2.Driver +spring.datasource.url=jdbc:h2:mem:shareit +spring.datasource.username=shareit +spring.datasource.password=shareit \ No newline at end of file From 6b322a8b7a41633aebaaec8fdae73fc2b6058ab9 Mon Sep 17 00:00:00 2001 From: Andrej Stelmaschuk Date: Sat, 3 May 2025 19:34:02 +0700 Subject: [PATCH 33/46] fix: AutoConfigureTestDatabase --- .../shareit/booking/service/BookingServiceImplTest.java | 4 ++++ .../shareit/item/service/CommentServiceImplTest.java | 4 ++++ .../practicum/shareit/item/service/ItemServiceImplTest.java | 4 ++++ .../shareit/request/service/ItemRequestServiceImplTest.java | 4 ++++ .../practicum/shareit/user/service/UserServiceImplTest.java | 4 ++++ 5 files changed, 20 insertions(+) diff --git a/server/src/test/java/ru/practicum/shareit/booking/service/BookingServiceImplTest.java b/server/src/test/java/ru/practicum/shareit/booking/service/BookingServiceImplTest.java index 34459e0..a331b20 100644 --- a/server/src/test/java/ru/practicum/shareit/booking/service/BookingServiceImplTest.java +++ b/server/src/test/java/ru/practicum/shareit/booking/service/BookingServiceImplTest.java @@ -4,6 +4,8 @@ import org.assertj.core.api.AssertionsForClassTypes; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.autoconfigure.jdbc.AutoConfigureTestDatabase; +import org.springframework.boot.test.autoconfigure.jdbc.JdbcTest; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.transaction.annotation.Transactional; import ru.practicum.shareit.booking.dto.BookingDto; @@ -23,6 +25,8 @@ import static org.hamcrest.MatcherAssert.assertThat; import static org.junit.jupiter.api.Assertions.*; +@JdbcTest +@AutoConfigureTestDatabase @Transactional @SpringBootTest @RequiredArgsConstructor(onConstructor_ = @Autowired) diff --git a/server/src/test/java/ru/practicum/shareit/item/service/CommentServiceImplTest.java b/server/src/test/java/ru/practicum/shareit/item/service/CommentServiceImplTest.java index cb0e600..f16890e 100644 --- a/server/src/test/java/ru/practicum/shareit/item/service/CommentServiceImplTest.java +++ b/server/src/test/java/ru/practicum/shareit/item/service/CommentServiceImplTest.java @@ -3,6 +3,8 @@ import lombok.RequiredArgsConstructor; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.autoconfigure.jdbc.AutoConfigureTestDatabase; +import org.springframework.boot.test.autoconfigure.jdbc.JdbcTest; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.transaction.annotation.Transactional; import ru.practicum.shareit.booking.Booking; @@ -22,6 +24,8 @@ import static org.hamcrest.MatcherAssert.assertThat; import static org.junit.jupiter.api.Assertions.assertEquals; +@JdbcTest +@AutoConfigureTestDatabase @Transactional @SpringBootTest @RequiredArgsConstructor(onConstructor_ = @Autowired) diff --git a/server/src/test/java/ru/practicum/shareit/item/service/ItemServiceImplTest.java b/server/src/test/java/ru/practicum/shareit/item/service/ItemServiceImplTest.java index 4d08c0a..471b88d 100644 --- a/server/src/test/java/ru/practicum/shareit/item/service/ItemServiceImplTest.java +++ b/server/src/test/java/ru/practicum/shareit/item/service/ItemServiceImplTest.java @@ -4,6 +4,8 @@ import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.autoconfigure.jdbc.AutoConfigureTestDatabase; +import org.springframework.boot.test.autoconfigure.jdbc.JdbcTest; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.transaction.annotation.Transactional; import ru.practicum.shareit.excepton.NotFoundException; @@ -20,6 +22,8 @@ import static org.hamcrest.Matchers.*; import static org.junit.jupiter.api.Assertions.*; +@JdbcTest +@AutoConfigureTestDatabase @Transactional @SpringBootTest @RequiredArgsConstructor(onConstructor_ = @Autowired) diff --git a/server/src/test/java/ru/practicum/shareit/request/service/ItemRequestServiceImplTest.java b/server/src/test/java/ru/practicum/shareit/request/service/ItemRequestServiceImplTest.java index 6376a67..cf3ac7d 100644 --- a/server/src/test/java/ru/practicum/shareit/request/service/ItemRequestServiceImplTest.java +++ b/server/src/test/java/ru/practicum/shareit/request/service/ItemRequestServiceImplTest.java @@ -3,6 +3,8 @@ import lombok.RequiredArgsConstructor; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.autoconfigure.jdbc.AutoConfigureTestDatabase; +import org.springframework.boot.test.autoconfigure.jdbc.JdbcTest; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.transaction.annotation.Transactional; import ru.practicum.shareit.excepton.InternalServerException; @@ -19,6 +21,8 @@ import static org.hamcrest.MatcherAssert.assertThat; import static org.junit.jupiter.api.Assertions.*; +@JdbcTest +@AutoConfigureTestDatabase @Transactional @SpringBootTest @RequiredArgsConstructor(onConstructor_ = @Autowired) diff --git a/server/src/test/java/ru/practicum/shareit/user/service/UserServiceImplTest.java b/server/src/test/java/ru/practicum/shareit/user/service/UserServiceImplTest.java index 90a00bf..796e952 100644 --- a/server/src/test/java/ru/practicum/shareit/user/service/UserServiceImplTest.java +++ b/server/src/test/java/ru/practicum/shareit/user/service/UserServiceImplTest.java @@ -3,6 +3,8 @@ import lombok.RequiredArgsConstructor; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.autoconfigure.jdbc.AutoConfigureTestDatabase; +import org.springframework.boot.test.autoconfigure.jdbc.JdbcTest; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.transaction.annotation.Transactional; import ru.practicum.shareit.excepton.NotFoundException; @@ -20,6 +22,8 @@ /** * Тестирование сервиса работы с пользователями */ +@JdbcTest +@AutoConfigureTestDatabase @Transactional @SpringBootTest @RequiredArgsConstructor(onConstructor_ = @Autowired) From 43cb640139f1cdc40f513d7a06864a04d358a536 Mon Sep 17 00:00:00 2001 From: Andrej Stelmaschuk Date: Sat, 3 May 2025 20:25:54 +0700 Subject: [PATCH 34/46] fix: JdbcTest --- .../shareit/booking/service/BookingServiceImplTest.java | 2 -- .../practicum/shareit/item/service/CommentServiceImplTest.java | 2 -- .../ru/practicum/shareit/item/service/ItemServiceImplTest.java | 2 -- .../shareit/request/service/ItemRequestServiceImplTest.java | 2 -- .../ru/practicum/shareit/user/service/UserServiceImplTest.java | 2 -- 5 files changed, 10 deletions(-) diff --git a/server/src/test/java/ru/practicum/shareit/booking/service/BookingServiceImplTest.java b/server/src/test/java/ru/practicum/shareit/booking/service/BookingServiceImplTest.java index a331b20..f26ac94 100644 --- a/server/src/test/java/ru/practicum/shareit/booking/service/BookingServiceImplTest.java +++ b/server/src/test/java/ru/practicum/shareit/booking/service/BookingServiceImplTest.java @@ -4,7 +4,6 @@ import org.assertj.core.api.AssertionsForClassTypes; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.test.autoconfigure.jdbc.AutoConfigureTestDatabase; import org.springframework.boot.test.autoconfigure.jdbc.JdbcTest; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.transaction.annotation.Transactional; @@ -26,7 +25,6 @@ import static org.junit.jupiter.api.Assertions.*; @JdbcTest -@AutoConfigureTestDatabase @Transactional @SpringBootTest @RequiredArgsConstructor(onConstructor_ = @Autowired) diff --git a/server/src/test/java/ru/practicum/shareit/item/service/CommentServiceImplTest.java b/server/src/test/java/ru/practicum/shareit/item/service/CommentServiceImplTest.java index f16890e..1f08c82 100644 --- a/server/src/test/java/ru/practicum/shareit/item/service/CommentServiceImplTest.java +++ b/server/src/test/java/ru/practicum/shareit/item/service/CommentServiceImplTest.java @@ -3,7 +3,6 @@ import lombok.RequiredArgsConstructor; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.test.autoconfigure.jdbc.AutoConfigureTestDatabase; import org.springframework.boot.test.autoconfigure.jdbc.JdbcTest; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.transaction.annotation.Transactional; @@ -25,7 +24,6 @@ import static org.junit.jupiter.api.Assertions.assertEquals; @JdbcTest -@AutoConfigureTestDatabase @Transactional @SpringBootTest @RequiredArgsConstructor(onConstructor_ = @Autowired) diff --git a/server/src/test/java/ru/practicum/shareit/item/service/ItemServiceImplTest.java b/server/src/test/java/ru/practicum/shareit/item/service/ItemServiceImplTest.java index 471b88d..8304183 100644 --- a/server/src/test/java/ru/practicum/shareit/item/service/ItemServiceImplTest.java +++ b/server/src/test/java/ru/practicum/shareit/item/service/ItemServiceImplTest.java @@ -4,7 +4,6 @@ import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.test.autoconfigure.jdbc.AutoConfigureTestDatabase; import org.springframework.boot.test.autoconfigure.jdbc.JdbcTest; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.transaction.annotation.Transactional; @@ -23,7 +22,6 @@ import static org.junit.jupiter.api.Assertions.*; @JdbcTest -@AutoConfigureTestDatabase @Transactional @SpringBootTest @RequiredArgsConstructor(onConstructor_ = @Autowired) diff --git a/server/src/test/java/ru/practicum/shareit/request/service/ItemRequestServiceImplTest.java b/server/src/test/java/ru/practicum/shareit/request/service/ItemRequestServiceImplTest.java index cf3ac7d..f581133 100644 --- a/server/src/test/java/ru/practicum/shareit/request/service/ItemRequestServiceImplTest.java +++ b/server/src/test/java/ru/practicum/shareit/request/service/ItemRequestServiceImplTest.java @@ -3,7 +3,6 @@ import lombok.RequiredArgsConstructor; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.test.autoconfigure.jdbc.AutoConfigureTestDatabase; import org.springframework.boot.test.autoconfigure.jdbc.JdbcTest; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.transaction.annotation.Transactional; @@ -22,7 +21,6 @@ import static org.junit.jupiter.api.Assertions.*; @JdbcTest -@AutoConfigureTestDatabase @Transactional @SpringBootTest @RequiredArgsConstructor(onConstructor_ = @Autowired) diff --git a/server/src/test/java/ru/practicum/shareit/user/service/UserServiceImplTest.java b/server/src/test/java/ru/practicum/shareit/user/service/UserServiceImplTest.java index 796e952..36380fd 100644 --- a/server/src/test/java/ru/practicum/shareit/user/service/UserServiceImplTest.java +++ b/server/src/test/java/ru/practicum/shareit/user/service/UserServiceImplTest.java @@ -3,7 +3,6 @@ import lombok.RequiredArgsConstructor; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.test.autoconfigure.jdbc.AutoConfigureTestDatabase; import org.springframework.boot.test.autoconfigure.jdbc.JdbcTest; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.transaction.annotation.Transactional; @@ -23,7 +22,6 @@ * Тестирование сервиса работы с пользователями */ @JdbcTest -@AutoConfigureTestDatabase @Transactional @SpringBootTest @RequiredArgsConstructor(onConstructor_ = @Autowired) From c71667fe388d20e263cf4d7725cb6464ff3f4fc4 Mon Sep 17 00:00:00 2001 From: Andrej Stelmaschuk Date: Sat, 3 May 2025 20:30:17 +0700 Subject: [PATCH 35/46] fix: H2 --- .../shareit/booking/service/BookingServiceImplTest.java | 2 -- .../practicum/shareit/item/service/CommentServiceImplTest.java | 2 -- .../ru/practicum/shareit/item/service/ItemServiceImplTest.java | 2 -- .../shareit/request/service/ItemRequestServiceImplTest.java | 2 -- .../ru/practicum/shareit/user/service/UserServiceImplTest.java | 2 -- server/src/test/resoueces/application.properties | 2 +- 6 files changed, 1 insertion(+), 11 deletions(-) diff --git a/server/src/test/java/ru/practicum/shareit/booking/service/BookingServiceImplTest.java b/server/src/test/java/ru/practicum/shareit/booking/service/BookingServiceImplTest.java index f26ac94..34459e0 100644 --- a/server/src/test/java/ru/practicum/shareit/booking/service/BookingServiceImplTest.java +++ b/server/src/test/java/ru/practicum/shareit/booking/service/BookingServiceImplTest.java @@ -4,7 +4,6 @@ import org.assertj.core.api.AssertionsForClassTypes; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.test.autoconfigure.jdbc.JdbcTest; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.transaction.annotation.Transactional; import ru.practicum.shareit.booking.dto.BookingDto; @@ -24,7 +23,6 @@ import static org.hamcrest.MatcherAssert.assertThat; import static org.junit.jupiter.api.Assertions.*; -@JdbcTest @Transactional @SpringBootTest @RequiredArgsConstructor(onConstructor_ = @Autowired) diff --git a/server/src/test/java/ru/practicum/shareit/item/service/CommentServiceImplTest.java b/server/src/test/java/ru/practicum/shareit/item/service/CommentServiceImplTest.java index 1f08c82..cb0e600 100644 --- a/server/src/test/java/ru/practicum/shareit/item/service/CommentServiceImplTest.java +++ b/server/src/test/java/ru/practicum/shareit/item/service/CommentServiceImplTest.java @@ -3,7 +3,6 @@ import lombok.RequiredArgsConstructor; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.test.autoconfigure.jdbc.JdbcTest; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.transaction.annotation.Transactional; import ru.practicum.shareit.booking.Booking; @@ -23,7 +22,6 @@ import static org.hamcrest.MatcherAssert.assertThat; import static org.junit.jupiter.api.Assertions.assertEquals; -@JdbcTest @Transactional @SpringBootTest @RequiredArgsConstructor(onConstructor_ = @Autowired) diff --git a/server/src/test/java/ru/practicum/shareit/item/service/ItemServiceImplTest.java b/server/src/test/java/ru/practicum/shareit/item/service/ItemServiceImplTest.java index 8304183..4d08c0a 100644 --- a/server/src/test/java/ru/practicum/shareit/item/service/ItemServiceImplTest.java +++ b/server/src/test/java/ru/practicum/shareit/item/service/ItemServiceImplTest.java @@ -4,7 +4,6 @@ import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.test.autoconfigure.jdbc.JdbcTest; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.transaction.annotation.Transactional; import ru.practicum.shareit.excepton.NotFoundException; @@ -21,7 +20,6 @@ import static org.hamcrest.Matchers.*; import static org.junit.jupiter.api.Assertions.*; -@JdbcTest @Transactional @SpringBootTest @RequiredArgsConstructor(onConstructor_ = @Autowired) diff --git a/server/src/test/java/ru/practicum/shareit/request/service/ItemRequestServiceImplTest.java b/server/src/test/java/ru/practicum/shareit/request/service/ItemRequestServiceImplTest.java index f581133..6376a67 100644 --- a/server/src/test/java/ru/practicum/shareit/request/service/ItemRequestServiceImplTest.java +++ b/server/src/test/java/ru/practicum/shareit/request/service/ItemRequestServiceImplTest.java @@ -3,7 +3,6 @@ import lombok.RequiredArgsConstructor; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.test.autoconfigure.jdbc.JdbcTest; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.transaction.annotation.Transactional; import ru.practicum.shareit.excepton.InternalServerException; @@ -20,7 +19,6 @@ import static org.hamcrest.MatcherAssert.assertThat; import static org.junit.jupiter.api.Assertions.*; -@JdbcTest @Transactional @SpringBootTest @RequiredArgsConstructor(onConstructor_ = @Autowired) diff --git a/server/src/test/java/ru/practicum/shareit/user/service/UserServiceImplTest.java b/server/src/test/java/ru/practicum/shareit/user/service/UserServiceImplTest.java index 36380fd..90a00bf 100644 --- a/server/src/test/java/ru/practicum/shareit/user/service/UserServiceImplTest.java +++ b/server/src/test/java/ru/practicum/shareit/user/service/UserServiceImplTest.java @@ -3,7 +3,6 @@ import lombok.RequiredArgsConstructor; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.test.autoconfigure.jdbc.JdbcTest; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.transaction.annotation.Transactional; import ru.practicum.shareit.excepton.NotFoundException; @@ -21,7 +20,6 @@ /** * Тестирование сервиса работы с пользователями */ -@JdbcTest @Transactional @SpringBootTest @RequiredArgsConstructor(onConstructor_ = @Autowired) diff --git a/server/src/test/resoueces/application.properties b/server/src/test/resoueces/application.properties index c2a8449..285ee96 100644 --- a/server/src/test/resoueces/application.properties +++ b/server/src/test/resoueces/application.properties @@ -10,7 +10,7 @@ spring.sql.init.mode=always #spring.datasource.username=shareit #spring.datasource.password=shareit #--- -spring.config.activate.on-profile=test +#spring.config.activate.on-profile=test spring.datasource.driverClassName=org.h2.Driver spring.datasource.url=jdbc:h2:mem:shareit spring.datasource.username=shareit From e7bd5eb3379fa9eb1bf9927fd0594637dafab466 Mon Sep 17 00:00:00 2001 From: Andrej Stelmaschuk Date: Sat, 3 May 2025 21:51:35 +0700 Subject: [PATCH 36/46] =?UTF-8?q?fix:=20=D0=B4=D0=BE=D0=B1=D0=B0=D0=B2?= =?UTF-8?q?=D0=BB=D0=B5=D0=BD=20=D0=BE=D1=85=D0=B2=D0=B0=D1=82=20=D1=82?= =?UTF-8?q?=D0=B5=D1=81=D1=82=D0=B0=D0=BC=D0=B8=20ShahtitServer?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../shareit/advisor/ErrorAdvisor.java | 11 ++---- .../shareit/excepton/ConflictException.java | 7 ---- .../shareit/item/dto/CommentDto.java | 3 ++ .../practicum/shareit/ShareItServerTest.java | 5 +++ .../service/BookingServiceImplTest.java | 8 ++++ .../shareit/item/dto/CommentDtoTest.java | 38 +++++++++++++++++++ .../item/service/ItemServiceImplTest.java | 14 +++++++ .../service/ItemRequestServiceImplTest.java | 3 +- 8 files changed, 73 insertions(+), 16 deletions(-) delete mode 100644 server/src/main/java/ru/practicum/shareit/excepton/ConflictException.java create mode 100644 server/src/test/java/ru/practicum/shareit/item/dto/CommentDtoTest.java diff --git a/server/src/main/java/ru/practicum/shareit/advisor/ErrorAdvisor.java b/server/src/main/java/ru/practicum/shareit/advisor/ErrorAdvisor.java index bb420cb..01e40ef 100644 --- a/server/src/main/java/ru/practicum/shareit/advisor/ErrorAdvisor.java +++ b/server/src/main/java/ru/practicum/shareit/advisor/ErrorAdvisor.java @@ -7,7 +7,10 @@ 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.excepton.*; +import ru.practicum.shareit.excepton.AccessDeniedException; +import ru.practicum.shareit.excepton.InternalServerException; +import ru.practicum.shareit.excepton.NotFoundException; +import ru.practicum.shareit.excepton.ValidationException; import java.util.List; import java.util.stream.Collectors; @@ -86,12 +89,6 @@ public ErrorMessage onAccessDeniedException(final AccessDeniedException e) { return new ErrorMessage(e.getMessage()); } - @ExceptionHandler - @ResponseStatus(HttpStatus.CONFLICT) - public ErrorMessage onConflictException(final ConflictException e) { - log.warn("409 {}", e.getMessage()); - return new ErrorMessage(e.getMessage()); - } /** * Обработка непредвиденного исключения diff --git a/server/src/main/java/ru/practicum/shareit/excepton/ConflictException.java b/server/src/main/java/ru/practicum/shareit/excepton/ConflictException.java deleted file mode 100644 index 6973755..0000000 --- a/server/src/main/java/ru/practicum/shareit/excepton/ConflictException.java +++ /dev/null @@ -1,7 +0,0 @@ -package ru.practicum.shareit.excepton; - -public class ConflictException extends RuntimeException { - public ConflictException(String message) { - super(message); - } -} 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 index 11d58d6..8c7f64f 100644 --- a/server/src/main/java/ru/practicum/shareit/item/dto/CommentDto.java +++ b/server/src/main/java/ru/practicum/shareit/item/dto/CommentDto.java @@ -1,8 +1,10 @@ package ru.practicum.shareit.item.dto; +import jakarta.validation.constraints.NotBlank; import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor; +import ru.practicum.shareit.validator.ValidAction; import java.time.Instant; @@ -11,6 +13,7 @@ @NoArgsConstructor public class CommentDto { private Long id; + @NotBlank(message = "Текст не может быть пустым", groups = {ValidAction.OnCreate.class}) private String text; private Long authorId; private String authorName; diff --git a/server/src/test/java/ru/practicum/shareit/ShareItServerTest.java b/server/src/test/java/ru/practicum/shareit/ShareItServerTest.java index 2119627..14ed97b 100644 --- a/server/src/test/java/ru/practicum/shareit/ShareItServerTest.java +++ b/server/src/test/java/ru/practicum/shareit/ShareItServerTest.java @@ -11,4 +11,9 @@ class ShareItServerTest { @Test void contextLoads() throws Exception { } + + @Test + public void testMain() { + ShareItServer.main(new String[]{}); + } } \ No newline at end of file diff --git a/server/src/test/java/ru/practicum/shareit/booking/service/BookingServiceImplTest.java b/server/src/test/java/ru/practicum/shareit/booking/service/BookingServiceImplTest.java index 34459e0..905226b 100644 --- a/server/src/test/java/ru/practicum/shareit/booking/service/BookingServiceImplTest.java +++ b/server/src/test/java/ru/practicum/shareit/booking/service/BookingServiceImplTest.java @@ -9,6 +9,7 @@ import ru.practicum.shareit.booking.dto.BookingDto; import ru.practicum.shareit.booking.enums.BookingStatus; import ru.practicum.shareit.booking.enums.SearchState; +import ru.practicum.shareit.excepton.InternalServerException; import ru.practicum.shareit.excepton.NotFoundException; import ru.practicum.shareit.excepton.ValidationException; import ru.practicum.shareit.item.model.Item; @@ -74,6 +75,13 @@ void addBooking() throws Exception { sourceBookingDto = bookingServiceImpl.addBooking(bookingDto, userId); assertThat(sourceBookingDto.getId(), notNullValue()); bookingId = sourceBookingDto.getId(); + + assertThrows(InternalServerException.class, + () -> { + bookingDto.setItemId(null); + bookingServiceImpl.addBooking(bookingDto, userId); + }, + "Некорректные данные должны приводить к исключению."); } @Test diff --git a/server/src/test/java/ru/practicum/shareit/item/dto/CommentDtoTest.java b/server/src/test/java/ru/practicum/shareit/item/dto/CommentDtoTest.java new file mode 100644 index 0000000..74b2297 --- /dev/null +++ b/server/src/test/java/ru/practicum/shareit/item/dto/CommentDtoTest.java @@ -0,0 +1,38 @@ +package ru.practicum.shareit.item.dto; + +import lombok.RequiredArgsConstructor; +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.autoconfigure.json.JsonTest; +import org.springframework.boot.test.json.JacksonTester; +import org.springframework.boot.test.json.JsonContent; + +import java.time.Instant; + +import static org.assertj.core.api.AssertionsForInterfaceTypes.assertThat; + +@JsonTest +@RequiredArgsConstructor(onConstructor_ = @Autowired) +class CommentDtoTest { + private final JacksonTester json; + + @Test + void serialize() throws Exception { + CommentDto commentDto = new CommentDto( + 1L, + "Text", + 1L, + "user1", + 1L, + Instant.now() + ); + + JsonContent result = json.write(commentDto); + assertThat(result).extractingJsonPathNumberValue("$.id").isEqualTo(1); + assertThat(result).extractingJsonPathStringValue("$.text").isEqualTo("Text"); + assertThat(result).extractingJsonPathNumberValue("$.authorId").isEqualTo(1); + assertThat(result).extractingJsonPathStringValue("$.authorName").isEqualTo("user1"); + assertThat(result).extractingJsonPathNumberValue("$.itemId").isEqualTo(1); + + } +} \ No newline at end of file diff --git a/server/src/test/java/ru/practicum/shareit/item/service/ItemServiceImplTest.java b/server/src/test/java/ru/practicum/shareit/item/service/ItemServiceImplTest.java index 4d08c0a..e2e7fa6 100644 --- a/server/src/test/java/ru/practicum/shareit/item/service/ItemServiceImplTest.java +++ b/server/src/test/java/ru/practicum/shareit/item/service/ItemServiceImplTest.java @@ -6,6 +6,7 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.transaction.annotation.Transactional; +import ru.practicum.shareit.excepton.AccessDeniedException; import ru.practicum.shareit.excepton.NotFoundException; import ru.practicum.shareit.item.dto.ItemCommentsDto; import ru.practicum.shareit.item.dto.ItemDto; @@ -30,6 +31,7 @@ class ItemServiceImplTest { Long ownerId = 0L; Long itemId = 0L; ItemDto testItemDto; + Long testUserId = 0L; @BeforeEach void setUp() { @@ -41,6 +43,12 @@ void setUp() { UserDto savedUserDto = userService.createUser(userDto); assertThat(savedUserDto.getId(), notNullValue()); ownerId = savedUserDto.getId(); + + userDto = new UserDto(); + userDto.setName("User2"); + userDto.setEmail("user2@items.test"); + savedUserDto = userService.createUser(userDto); + testUserId = savedUserDto.getId(); } itemService.deleteAllItems(); } @@ -72,6 +80,12 @@ void updateItem() throws Exception { ItemDto itemDto = itemService.updateItem(updItemDto, ownerId); assertThat(itemDto.getId(), notNullValue()); assertEquals(itemDto.getDescription(), updItemDto.getDescription()); + + assertThrows(AccessDeniedException.class, + () -> { + itemService.updateItem(updItemDto, testUserId); + }, + "редактирование не хозяином вещи должно приводить к исключению."); } @Test diff --git a/server/src/test/java/ru/practicum/shareit/request/service/ItemRequestServiceImplTest.java b/server/src/test/java/ru/practicum/shareit/request/service/ItemRequestServiceImplTest.java index 6376a67..06b5cd2 100644 --- a/server/src/test/java/ru/practicum/shareit/request/service/ItemRequestServiceImplTest.java +++ b/server/src/test/java/ru/practicum/shareit/request/service/ItemRequestServiceImplTest.java @@ -5,7 +5,6 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.transaction.annotation.Transactional; -import ru.practicum.shareit.excepton.InternalServerException; import ru.practicum.shareit.excepton.NotFoundException; import ru.practicum.shareit.request.dto.ItemRequestDto; import ru.practicum.shareit.request.dto.RequestWithItemsDto; @@ -50,7 +49,7 @@ void create() { @Test - void findReqestsById() throws NotFoundException, InternalServerException, Exception { + void findReqestsById() throws NotFoundException, Exception { if (requestId.equals(0L)) { create(); } From 428f0ba40e07ac46376dffa001d55b770826996d Mon Sep 17 00:00:00 2001 From: Andrej Stelmaschuk Date: Sat, 3 May 2025 22:49:22 +0700 Subject: [PATCH 37/46] =?UTF-8?q?fix:=20=D0=B4=D0=BE=D0=B1=D0=B0=D0=B2?= =?UTF-8?q?=D0=BB=D0=B5=D0=BD=20=D0=BE=D1=85=D0=B2=D0=B0=D1=82=20=D1=82?= =?UTF-8?q?=D0=B5=D1=81=D1=82=D0=B0=D0=BC=D0=B8=20ShahtitServer=202?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../booking/service/BookingServiceImpl.java | 19 +++------- .../item/service/CommentServiceImpl.java | 12 +----- .../shareit/user/service/UserServiceImpl.java | 14 ++----- .../shareit/item/model/ItemTest.java | 37 +++++++++++++++++++ 4 files changed, 49 insertions(+), 33 deletions(-) create mode 100644 server/src/test/java/ru/practicum/shareit/item/model/ItemTest.java diff --git a/server/src/main/java/ru/practicum/shareit/booking/service/BookingServiceImpl.java b/server/src/main/java/ru/practicum/shareit/booking/service/BookingServiceImpl.java index 1a6ba2e..6bbc7fa 100644 --- a/server/src/main/java/ru/practicum/shareit/booking/service/BookingServiceImpl.java +++ b/server/src/main/java/ru/practicum/shareit/booking/service/BookingServiceImpl.java @@ -45,13 +45,10 @@ public BookingDto addBooking(BookingDto bookingDto, Long userId) { throw new ValidationException("Отсутствуют сведения о заказчике."); } User user = userRepository.findById(userId) - .orElseThrow(() -> - new NotFoundException("Не найден пользователь id=" + userId)); + .orElseThrow(() -> new NotFoundException("Не найден пользователь id=" + userId)); Item item = itemRepository.findById(bookingDto.getItemId()) - .orElseThrow(() -> - new NotFoundException("Не найдена вещ id=" + - bookingDto.getItemId())); + .orElseThrow(() -> new NotFoundException("Не найдена вещ id=" + bookingDto.getItemId())); if (!item.getAvailable()) { throw new ValidationException(ItemMapper.toItemDto(item) + " Недоступна для бронирования."); } @@ -64,16 +61,14 @@ public BookingDto addBooking(BookingDto bookingDto, Long userId) { Booking savedBooking = bookingRepository.save(booking); Long bookingId = savedBooking.getId(); savedBooking = bookingRepository.findById(bookingId) - .orElseThrow(() -> - new InternalServerException("Ошибка при добавлении запроса на бронирование.")); + .orElseThrow(() -> new InternalServerException("Ошибка при добавлении запроса на бронирование.")); return BookingMapper.toBookingDto(savedBooking); } @Override public BookingDto findBookingById(Long bookingId, Long userId) { Booking booking = bookingRepository.findById(bookingId) - .orElseThrow(() -> - new NotFoundException("Не найден запрос на бронирование id=" + bookingId)); + .orElseThrow(() -> new NotFoundException("Не найден запрос на бронирование id=" + bookingId)); if (!booking.getBooker().getId().equals(userId) && !booking.getItem().getOwner().getId().equals(userId)) { throw new AccessDeniedException("Пользователь id=" + userId + " не является автором запроса или хозяином вещи."); @@ -84,8 +79,7 @@ public BookingDto findBookingById(Long bookingId, Long userId) { @Override public BookingDto approvedBooking(Long id, Long editorId, Boolean approved) { Booking booking = bookingRepository.findById(id) - .orElseThrow(() -> - new NotFoundException("Не найден запрос id=" + id)); + .orElseThrow(() -> new NotFoundException("Не найден запрос id=" + id)); if (!booking.getItem().getOwner().getId().equals(editorId)) { throw new ValidationException("Пользователь id=" + editorId + " не является хозяином."); } @@ -101,8 +95,7 @@ public BookingDto approvedBooking(Long id, Long editorId, Boolean approved) { @Override public List findBookingsByOwner(Long ownerId, SearchState state) { userRepository.findById(ownerId) - .orElseThrow(() -> - new NotFoundException("Не найден пользователь id=" + ownerId)); + .orElseThrow(() -> new NotFoundException("Не найден пользователь id=" + ownerId)); List bookings = new ArrayList<>(); if (state.equals(SearchState.ALL)) { bookings = bookingRepository.findAllByItem_OwnerIdOrderByStartDesc(ownerId); diff --git a/server/src/main/java/ru/practicum/shareit/item/service/CommentServiceImpl.java b/server/src/main/java/ru/practicum/shareit/item/service/CommentServiceImpl.java index 2fc576c..5feed22 100644 --- a/server/src/main/java/ru/practicum/shareit/item/service/CommentServiceImpl.java +++ b/server/src/main/java/ru/practicum/shareit/item/service/CommentServiceImpl.java @@ -39,34 +39,26 @@ public CommentDto addComment(CommentDto commentDto) { Long userId = commentDto.getAuthorId(); User user = userRepository.findById(userId) .orElseThrow(() -> new NotFoundException("Пользователь не найден id=" + userId)); - Long itemId = commentDto.getItemId(); Booking booking = bookingRepository.findBookingsByBookerIdAndItemId(userId, itemId); if (booking == null) { - throw new NotFoundException("Пользователь id=" + userId + - " не бронировал вещь id=" + itemId); + throw new NotFoundException("Пользователь id=" + userId + " не бронировал вещь id=" + itemId); } - LocalDateTime now = LocalDateTime.now(); if (LocalDateTime.ofInstant(booking.getEnd(), ZoneOffset.UTC).isAfter(now)) { throw new ValidationException("Комментарий возможен после завершения срока аренды. " + - "Конец аренды : " + LocalDateTime.ofInstant(booking.getEnd(), ZoneOffset.UTC) + - " Текущее время : " + now); + "Конец аренды : " + LocalDateTime.ofInstant(booking.getEnd(), ZoneOffset.UTC) + " Текущее время : " + now); } - Item item = booking.getItem(); if (item.getOwner().getId().equals(userId)) { throw new ValidationException("Хозяину нельзя оставлять комментарий."); } - Comment comment = new Comment(); comment.setAuthor(user); comment.setItem(item); comment.setText(commentDto.getText()); comment.setCreated(Instant.now()); - Comment savedComment = commentRepository.save(comment); return CommentMapper.toDto(savedComment); } - } diff --git a/server/src/main/java/ru/practicum/shareit/user/service/UserServiceImpl.java b/server/src/main/java/ru/practicum/shareit/user/service/UserServiceImpl.java index 0a3ccc1..5192b29 100644 --- a/server/src/main/java/ru/practicum/shareit/user/service/UserServiceImpl.java +++ b/server/src/main/java/ru/practicum/shareit/user/service/UserServiceImpl.java @@ -11,11 +11,7 @@ @Service public class UserServiceImpl implements UserService { - private final UserRepository userRepository; - - public UserServiceImpl(UserRepository userRepository) { - this.userRepository = userRepository; - } + private UserRepository userRepository; @Override public UserDto createUser(UserDto newUserDto) { @@ -26,8 +22,7 @@ public UserDto createUser(UserDto newUserDto) { @Override public UserDto getUserById(Long id) { User user = userRepository.findById(id) - .orElseThrow(() -> - new NotFoundException("Пользователь не найден id=" + id)); + .orElseThrow(() -> new NotFoundException("Пользователь не найден id=" + id)); return UserMapper.toUserDto(user); } @@ -35,8 +30,7 @@ public UserDto getUserById(Long id) { public UserDto updateUser(UserDto updUserDto) { Long id = updUserDto.getId(); User user = userRepository.findById(id) - .orElseThrow(() -> - new NotFoundException("Пользователь не найден id=" + id)); + .orElseThrow(() -> new NotFoundException("Пользователь не найден id=" + id)); if (updUserDto.getName() != null) { user.setName(updUserDto.getName()); } @@ -68,4 +62,4 @@ public Collection deleteAllUsers() { userRepository.deleteAll(); return getAllUsers(); } -} +} \ No newline at end of file diff --git a/server/src/test/java/ru/practicum/shareit/item/model/ItemTest.java b/server/src/test/java/ru/practicum/shareit/item/model/ItemTest.java new file mode 100644 index 0000000..c0a0a36 --- /dev/null +++ b/server/src/test/java/ru/practicum/shareit/item/model/ItemTest.java @@ -0,0 +1,37 @@ +package ru.practicum.shareit.item.model; + +import lombok.RequiredArgsConstructor; +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.autoconfigure.json.JsonTest; +import org.springframework.boot.test.json.JacksonTester; +import org.springframework.boot.test.json.JsonContent; +import ru.practicum.shareit.item.dto.CommentDto; +import ru.practicum.shareit.user.User; + +import static org.assertj.core.api.AssertionsForInterfaceTypes.assertThat; +import static org.junit.jupiter.api.Assertions.*; + +@JsonTest +@RequiredArgsConstructor(onConstructor_ = @Autowired) +class ItemTest { + private final JacksonTester json; + + @Test + void serialize() throws Exception { + Item item = new Item( + 1L, + "Item", + "Item description", + true, + null + ); + JsonContent result = json.write(item); + assertThat(result).extractingJsonPathNumberValue("$.id").isEqualTo(1); + assertThat(result).extractingJsonPathStringValue("$.name").isEqualTo("Item"); + assertThat(result).extractingJsonPathStringValue("$.description").isEqualTo("Item description"); + assertThat(result).extractingJsonPathBooleanValue("$.available").isEqualTo(true); + + } + +} \ No newline at end of file From dc822159400d1dcf1fbdd854929f885a58a74f7a Mon Sep 17 00:00:00 2001 From: Andrej Stelmaschuk Date: Sat, 3 May 2025 22:52:30 +0700 Subject: [PATCH 38/46] =?UTF-8?q?fix:=20=D0=B8=D1=81=D0=BF=D1=80=D0=B0?= =?UTF-8?q?=D0=B2=D0=BB=D0=B5=D0=BD=D0=B8=D0=B5=20=D0=BE=D1=88=D0=B8=D0=B1?= =?UTF-8?q?=D0=BE=D0=BA=20=D1=81=D1=82=D0=B8=D0=BB=D1=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../test/java/ru/practicum/shareit/item/model/ItemTest.java | 3 --- 1 file changed, 3 deletions(-) diff --git a/server/src/test/java/ru/practicum/shareit/item/model/ItemTest.java b/server/src/test/java/ru/practicum/shareit/item/model/ItemTest.java index c0a0a36..74f4034 100644 --- a/server/src/test/java/ru/practicum/shareit/item/model/ItemTest.java +++ b/server/src/test/java/ru/practicum/shareit/item/model/ItemTest.java @@ -6,11 +6,8 @@ import org.springframework.boot.test.autoconfigure.json.JsonTest; import org.springframework.boot.test.json.JacksonTester; import org.springframework.boot.test.json.JsonContent; -import ru.practicum.shareit.item.dto.CommentDto; -import ru.practicum.shareit.user.User; import static org.assertj.core.api.AssertionsForInterfaceTypes.assertThat; -import static org.junit.jupiter.api.Assertions.*; @JsonTest @RequiredArgsConstructor(onConstructor_ = @Autowired) From eb2f77b9313067e90de94230c61366ddb5ba2ea3 Mon Sep 17 00:00:00 2001 From: Andrej Stelmaschuk Date: Sun, 4 May 2025 10:56:04 +0700 Subject: [PATCH 39/46] =?UTF-8?q?fix:=20=D0=B8=D1=81=D0=BF=D1=80=D0=B0?= =?UTF-8?q?=D0=B2=D0=BB=D0=B5=D0=BD=D0=B8=D0=B5=20=D0=BE=D1=88=D0=B8=D0=B1?= =?UTF-8?q?=D0=BE=D0=BA=20UserServiceImpl?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/java/ru/practicum/shareit/ShareItServer.java | 2 -- .../ru/practicum/shareit/advisor/ErrorAdvisor.java | 1 - .../java/ru/practicum/shareit/item/ItemController.java | 1 - .../java/ru/practicum/shareit/item/ItemMapper.java | 2 -- .../java/ru/practicum/shareit/item/dto/ItemDto.java | 10 ---------- .../java/ru/practicum/shareit/item/model/Comment.java | 4 ---- .../shareit/item/service/ItemServiceImpl.java | 3 +-- .../java/ru/practicum/shareit/user/UserController.java | 1 - .../java/ru/practicum/shareit/user/UserMapper.java | 3 +-- .../java/ru/practicum/shareit/user/dto/UserDto.java | 2 -- .../shareit/user/service/UserServiceImpl.java | 4 ++++ .../shareit/user/service/UserServiceImplTest.java | 10 ++++++++-- 12 files changed, 14 insertions(+), 29 deletions(-) diff --git a/server/src/main/java/ru/practicum/shareit/ShareItServer.java b/server/src/main/java/ru/practicum/shareit/ShareItServer.java index e793b9c..ddf75ea 100644 --- a/server/src/main/java/ru/practicum/shareit/ShareItServer.java +++ b/server/src/main/java/ru/practicum/shareit/ShareItServer.java @@ -5,9 +5,7 @@ @SpringBootApplication public class ShareItServer { - public static void main(String[] args) { SpringApplication.run(ShareItServer.class, args); } - } \ No newline at end of file diff --git a/server/src/main/java/ru/practicum/shareit/advisor/ErrorAdvisor.java b/server/src/main/java/ru/practicum/shareit/advisor/ErrorAdvisor.java index 01e40ef..2e63f7e 100644 --- a/server/src/main/java/ru/practicum/shareit/advisor/ErrorAdvisor.java +++ b/server/src/main/java/ru/practicum/shareit/advisor/ErrorAdvisor.java @@ -89,7 +89,6 @@ public ErrorMessage onAccessDeniedException(final AccessDeniedException e) { return new ErrorMessage(e.getMessage()); } - /** * Обработка непредвиденного исключения * diff --git a/server/src/main/java/ru/practicum/shareit/item/ItemController.java b/server/src/main/java/ru/practicum/shareit/item/ItemController.java index 8a18e24..732e463 100644 --- a/server/src/main/java/ru/practicum/shareit/item/ItemController.java +++ b/server/src/main/java/ru/practicum/shareit/item/ItemController.java @@ -100,5 +100,4 @@ public CommentDto addComment( commentDto.setItemId(itemId); return commentService.addComment(commentDto); } - } diff --git a/server/src/main/java/ru/practicum/shareit/item/ItemMapper.java b/server/src/main/java/ru/practicum/shareit/item/ItemMapper.java index 80a94c3..c1915fc 100644 --- a/server/src/main/java/ru/practicum/shareit/item/ItemMapper.java +++ b/server/src/main/java/ru/practicum/shareit/item/ItemMapper.java @@ -21,7 +21,6 @@ public static ItemDto toItemDto(Item item) { itemDto.setRequestId(item.getRequest().getId()); } itemDto.setAvailable(item.getAvailable()); - return itemDto; } @@ -36,7 +35,6 @@ public static ItemCommentsDto toItemCommentsDto(Item item) { } itemDto.setComments(List.of()); return itemDto; - } public static Item toItem(ItemDto itemDto) { 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 index 5264e1a..b58ca06 100644 --- a/server/src/main/java/ru/practicum/shareit/item/dto/ItemDto.java +++ b/server/src/main/java/ru/practicum/shareit/item/dto/ItemDto.java @@ -1,6 +1,5 @@ package ru.practicum.shareit.item.dto; -import com.fasterxml.jackson.annotation.JsonFormat; import jakarta.validation.constraints.NotBlank; import jakarta.validation.constraints.NotNull; import jakarta.validation.constraints.Size; @@ -19,24 +18,15 @@ @NoArgsConstructor public class ItemDto { private Long id; - @NotBlank(message = "Имя не может быть пустым", groups = {ValidAction.OnCreate.class}) private String name; - @NotBlank(message = "Описание не может быть пустым", groups = {ValidAction.OnCreate.class}) @Size(max = 200, message = "Максимальная длина описания - 200 символов.", groups = {ValidAction.OnCreate.class, ValidAction.OnUpdate.class}) private String description; - @NotNull(message = "Доступ должен быть определен.", groups = {ValidAction.OnCreate.class}) private Boolean available; - private Long requestId; - - - @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") private Instant lastBooking; - - @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") private Instant nextBooking; } diff --git a/server/src/main/java/ru/practicum/shareit/item/model/Comment.java b/server/src/main/java/ru/practicum/shareit/item/model/Comment.java index 1e239db..56b050f 100644 --- a/server/src/main/java/ru/practicum/shareit/item/model/Comment.java +++ b/server/src/main/java/ru/practicum/shareit/item/model/Comment.java @@ -19,18 +19,14 @@ public class Comment { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; - @Column(name = "text", nullable = false) private String text; - @ManyToOne @JoinColumn(name = "item_id") private Item item; - @ManyToOne @JoinColumn(name = "author_id") private User author; - @Column(name = "created", nullable = false) private Instant created; } diff --git a/server/src/main/java/ru/practicum/shareit/item/service/ItemServiceImpl.java b/server/src/main/java/ru/practicum/shareit/item/service/ItemServiceImpl.java index a070b98..b1ad790 100644 --- a/server/src/main/java/ru/practicum/shareit/item/service/ItemServiceImpl.java +++ b/server/src/main/java/ru/practicum/shareit/item/service/ItemServiceImpl.java @@ -127,8 +127,7 @@ public ItemCommentsDto getItem(Long itemId, Long userId) { @Override public void deleteItem(Long id, Long ownerId) { Item item = itemRepository.findById(id) - .orElseThrow(() -> - new NotFoundException("Не найдена вещь id=" + id)); + .orElseThrow(() -> new NotFoundException("Не найдена вещь id=" + id)); if (!item.getOwner().getId().equals(ownerId)) { throw new AccessDeniedException("Удалять вещь может только хозяин."); } diff --git a/server/src/main/java/ru/practicum/shareit/user/UserController.java b/server/src/main/java/ru/practicum/shareit/user/UserController.java index 693a519..9148658 100644 --- a/server/src/main/java/ru/practicum/shareit/user/UserController.java +++ b/server/src/main/java/ru/practicum/shareit/user/UserController.java @@ -100,5 +100,4 @@ public void deleteUser(@PathVariable Long id) { log.info("Удаляем пользователя id={}.", id); userService.deleteUser(id); } - } diff --git a/server/src/main/java/ru/practicum/shareit/user/UserMapper.java b/server/src/main/java/ru/practicum/shareit/user/UserMapper.java index a43a352..edfd3e5 100644 --- a/server/src/main/java/ru/practicum/shareit/user/UserMapper.java +++ b/server/src/main/java/ru/practicum/shareit/user/UserMapper.java @@ -20,7 +20,6 @@ public static User toUser(UserDto userDto) { return new User( userDto.getId(), userDto.getName(), - userDto.getEmail() - ); + userDto.getEmail()); } } 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 index 6c91d44..38894ae 100644 --- a/server/src/main/java/ru/practicum/shareit/user/dto/UserDto.java +++ b/server/src/main/java/ru/practicum/shareit/user/dto/UserDto.java @@ -12,10 +12,8 @@ @NoArgsConstructor public class UserDto { private Long id; - @NotBlank(message = "Имя не может быть пустым", groups = {ValidAction.OnCreate.class}) private String name; - @NotBlank(message = "Email не может быть пустым", groups = {ValidAction.OnCreate.class}) @Email(message = "Email должен удовлетворять правилам формирования почтовых адресов.", groups = {ValidAction.OnCreate.class, ValidAction.OnUpdate.class}) diff --git a/server/src/main/java/ru/practicum/shareit/user/service/UserServiceImpl.java b/server/src/main/java/ru/practicum/shareit/user/service/UserServiceImpl.java index 5192b29..44b1a57 100644 --- a/server/src/main/java/ru/practicum/shareit/user/service/UserServiceImpl.java +++ b/server/src/main/java/ru/practicum/shareit/user/service/UserServiceImpl.java @@ -13,6 +13,10 @@ public class UserServiceImpl implements UserService { private UserRepository userRepository; + public UserServiceImpl(UserRepository userRepository) { + this.userRepository = userRepository; + } + @Override public UserDto createUser(UserDto newUserDto) { User user = userRepository.save(UserMapper.toUser(newUserDto)); diff --git a/server/src/test/java/ru/practicum/shareit/user/service/UserServiceImplTest.java b/server/src/test/java/ru/practicum/shareit/user/service/UserServiceImplTest.java index 90a00bf..04f096b 100644 --- a/server/src/test/java/ru/practicum/shareit/user/service/UserServiceImplTest.java +++ b/server/src/test/java/ru/practicum/shareit/user/service/UserServiceImplTest.java @@ -55,6 +55,12 @@ void getUserById() { assertThat(userDto2) .usingRecursiveComparison() .isEqualTo(savedUserDto); + + assertThrows(NotFoundException.class, + () -> { + userService.getUserById(100L); + }, + "Чтение несуществующего пользователя должно приводить к исключению."); } @Test @@ -92,9 +98,9 @@ void deleteUser() { assertThrows(NotFoundException.class, () -> { - userService.getUserById(userId); + userService.deleteUser(1000L); }, - "Чтение удаленного пользователя должно приводить к исключению."); + "Удаление несуществующего пользователя должно приводить к исключению."); } @Test From ed086ce8842b5002063d28fb4eb0af1456c6df26 Mon Sep 17 00:00:00 2001 From: Andrej Stelmaschuk Date: Sun, 4 May 2025 14:26:46 +0700 Subject: [PATCH 40/46] =?UTF-8?q?fix:=20=D1=83=D0=B2=D0=B5=D0=BB=D0=B8?= =?UTF-8?q?=D1=87=D0=B8=D0=B2=D0=B0=D0=B5=D0=BC=20=D0=BF=D0=BE=D0=BA=D1=80?= =?UTF-8?q?=D1=8B=D1=82=D0=B8=D0=B5=20=D1=82=D0=B5=D1=81=D1=82=D0=B0=D0=BC?= =?UTF-8?q?=D0=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../shareit/booking/BookingController.java | 3 -- .../shareit/item/ItemController.java | 4 +- .../shareit/item/dto/ItemShortDto.java | 3 ++ .../ru/practicum/shareit/item/model/Item.java | 4 -- .../item/service/CommentServiceImpl.java | 3 +- .../request/ItemRequestController.java | 18 --------- .../shareit/request/ItemRequestMapper.java | 1 - .../service/ItemRequestServiceImpl.java | 7 ---- .../java/ru/practicum/shareit/user/User.java | 2 - .../shareit/user/UserController.java | 39 +------------------ .../ru/practicum/shareit/user/UserMapper.java | 14 ++----- .../shareit/user/service/UserServiceImpl.java | 7 ++-- .../shareit/item/dto/ItemShortDtoTest.java | 29 ++++++++++++++ .../item/service/CommentServiceImplTest.java | 7 ++++ .../request/ItemRequestControllerTest.java | 3 -- .../service/ItemRequestServiceImplTest.java | 28 ++++++++----- .../user/service/UserServiceImplTest.java | 11 +++--- 17 files changed, 72 insertions(+), 111 deletions(-) create mode 100644 server/src/test/java/ru/practicum/shareit/item/dto/ItemShortDtoTest.java diff --git a/server/src/main/java/ru/practicum/shareit/booking/BookingController.java b/server/src/main/java/ru/practicum/shareit/booking/BookingController.java index 621a012..cafddb1 100644 --- a/server/src/main/java/ru/practicum/shareit/booking/BookingController.java +++ b/server/src/main/java/ru/practicum/shareit/booking/BookingController.java @@ -2,12 +2,10 @@ import lombok.extern.slf4j.Slf4j; import org.springframework.http.HttpStatus; -import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.*; import ru.practicum.shareit.booking.dto.BookingDto; import ru.practicum.shareit.booking.enums.SearchState; import ru.practicum.shareit.booking.service.BookingService; -import ru.practicum.shareit.validator.ValidAction; import java.util.List; @@ -29,7 +27,6 @@ public BookingController(BookingService bookingService) { @ResponseStatus(HttpStatus.CREATED) public BookingDto addBooking( @RequestHeader(HEADER_USER_ID) final Long bookerId, - @Validated(ValidAction.OnCreate.class) @RequestBody BookingDto bookingDto) { log.info("Пользователь id={} cоздает запрос на бронирование : {}", bookerId, bookingDto); return bookingService.addBooking(bookingDto, bookerId); diff --git a/server/src/main/java/ru/practicum/shareit/item/ItemController.java b/server/src/main/java/ru/practicum/shareit/item/ItemController.java index 732e463..758ac97 100644 --- a/server/src/main/java/ru/practicum/shareit/item/ItemController.java +++ b/server/src/main/java/ru/practicum/shareit/item/ItemController.java @@ -2,14 +2,12 @@ import lombok.extern.slf4j.Slf4j; import org.springframework.http.HttpStatus; -import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.*; import ru.practicum.shareit.item.dto.CommentDto; import ru.practicum.shareit.item.dto.ItemCommentsDto; import ru.practicum.shareit.item.dto.ItemDto; import ru.practicum.shareit.item.service.CommentService; import ru.practicum.shareit.item.service.ItemService; -import ru.practicum.shareit.validator.ValidAction; import java.util.Collection; @@ -57,7 +55,7 @@ public Collection onSearch(@RequestParam String text) { @ResponseStatus(HttpStatus.CREATED) public ItemDto createItem( @RequestHeader(HEADER_USER_ID) final Long ownerId, - @Validated(ValidAction.OnCreate.class) @RequestBody ItemDto itemDto) { + @RequestBody ItemDto itemDto) { log.info("Пользователь id={} добавляет вещь : {}", ownerId, itemDto.toString()); return itemService.addItem(itemDto, ownerId); } diff --git a/server/src/main/java/ru/practicum/shareit/item/dto/ItemShortDto.java b/server/src/main/java/ru/practicum/shareit/item/dto/ItemShortDto.java index e2858e5..cfd2cd7 100644 --- a/server/src/main/java/ru/practicum/shareit/item/dto/ItemShortDto.java +++ b/server/src/main/java/ru/practicum/shareit/item/dto/ItemShortDto.java @@ -1,14 +1,17 @@ package ru.practicum.shareit.item.dto; +import jakarta.validation.constraints.NotBlank; import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor; +import ru.practicum.shareit.validator.ValidAction; @Data @AllArgsConstructor @NoArgsConstructor public class ItemShortDto { private Long id; + @NotBlank(message = "Имя не может быть пустым", groups = {ValidAction.OnCreate.class}) private String name; private Long ownerId; } diff --git a/server/src/main/java/ru/practicum/shareit/item/model/Item.java b/server/src/main/java/ru/practicum/shareit/item/model/Item.java index 46c3ab7..eb6a3fd 100644 --- a/server/src/main/java/ru/practicum/shareit/item/model/Item.java +++ b/server/src/main/java/ru/practicum/shareit/item/model/Item.java @@ -28,19 +28,15 @@ public class Item { @NotBlank(message = "Имя не может быть пустым", groups = {ValidAction.OnCreate.class}) @Column(name = "name", nullable = false) private String name; - @Size(max = 255, message = "Максимальная длина описания - 255 символов.", groups = {ValidAction.OnCreate.class, ValidAction.OnUpdate.class}) @Column(name = "description") private String description; - @ManyToOne @JoinColumn(name = "owner_id") private User owner; - @Column(name = "available") private Boolean available; - @ManyToOne @JoinColumn(name = "request_id") private ItemRequest request; diff --git a/server/src/main/java/ru/practicum/shareit/item/service/CommentServiceImpl.java b/server/src/main/java/ru/practicum/shareit/item/service/CommentServiceImpl.java index 5feed22..2e4273e 100644 --- a/server/src/main/java/ru/practicum/shareit/item/service/CommentServiceImpl.java +++ b/server/src/main/java/ru/practicum/shareit/item/service/CommentServiceImpl.java @@ -46,8 +46,7 @@ public CommentDto addComment(CommentDto commentDto) { } LocalDateTime now = LocalDateTime.now(); if (LocalDateTime.ofInstant(booking.getEnd(), ZoneOffset.UTC).isAfter(now)) { - throw new ValidationException("Комментарий возможен после завершения срока аренды. " + - "Конец аренды : " + LocalDateTime.ofInstant(booking.getEnd(), ZoneOffset.UTC) + " Текущее время : " + now); + throw new ValidationException("Комментировать можно после завершения срока аренды. " + LocalDateTime.ofInstant(booking.getEnd(), ZoneOffset.UTC)); } Item item = booking.getItem(); if (item.getOwner().getId().equals(userId)) { diff --git a/server/src/main/java/ru/practicum/shareit/request/ItemRequestController.java b/server/src/main/java/ru/practicum/shareit/request/ItemRequestController.java index 3f39aba..7552266 100644 --- a/server/src/main/java/ru/practicum/shareit/request/ItemRequestController.java +++ b/server/src/main/java/ru/practicum/shareit/request/ItemRequestController.java @@ -23,14 +23,6 @@ public ItemRequestController(ItemRequestService itemRequestService) { this.itemRequestService = itemRequestService; } - /** - * Создаем новый запрос - * - * @param customerId - идентификатор заказчика - * @param itemRequestDto - объект описания запроса - * @return - сохраненный запрос - * @throws Exception - */ @PostMapping @ResponseStatus(HttpStatus.CREATED) public ItemRequestDto createItemRequest( @@ -40,9 +32,6 @@ public ItemRequestDto createItemRequest( return itemRequestService.create(customerId, itemRequestDto); } - /** - * Поиск запроса по идентификатору - */ @GetMapping("/{id}") @ResponseStatus(HttpStatus.OK) public RequestWithItemsDto findItemRequest( @@ -52,10 +41,6 @@ public RequestWithItemsDto findItemRequest( return itemRequestService.findReqestsById(userId, id); } - - /** - * Поиск пользователем своих запросов - */ @GetMapping("") @ResponseStatus(HttpStatus.OK) public List findRequestsByUserId( @@ -65,9 +50,6 @@ public List findRequestsByUserId( return itemRequestService.findReqestsByCustomerId(userId); } - /** - * Поиск пользователем всех чужих запросов - */ @GetMapping("/all") @ResponseStatus(HttpStatus.OK) public List findAllRequests( diff --git a/server/src/main/java/ru/practicum/shareit/request/ItemRequestMapper.java b/server/src/main/java/ru/practicum/shareit/request/ItemRequestMapper.java index 8f91206..17f38a5 100644 --- a/server/src/main/java/ru/practicum/shareit/request/ItemRequestMapper.java +++ b/server/src/main/java/ru/practicum/shareit/request/ItemRequestMapper.java @@ -40,5 +40,4 @@ public static RequestWithItemsDto toRwiDto(ItemRequest itemRequest) { itemRequestDto.setCreated(itemRequest.getCreated()); return itemRequestDto; } - } diff --git a/server/src/main/java/ru/practicum/shareit/request/service/ItemRequestServiceImpl.java b/server/src/main/java/ru/practicum/shareit/request/service/ItemRequestServiceImpl.java index 76c52d1..22a5d05 100644 --- a/server/src/main/java/ru/practicum/shareit/request/service/ItemRequestServiceImpl.java +++ b/server/src/main/java/ru/practicum/shareit/request/service/ItemRequestServiceImpl.java @@ -43,7 +43,6 @@ public ItemRequestServiceImpl(ItemRequestRepository itemRequestRepository, public ItemRequestDto create(Long customerId, ItemRequestDto itemRequestDto) { User customer = userRepository.findById(customerId) .orElseThrow(() -> new NotFoundException("Не найден пользователь id=" + customerId)); - itemRequestDto.setRequestor(UserMapper.toUserDto(customer)); itemRequestDto.setCreated(Instant.now()); ItemRequest savedItemRequest = itemRequestRepository.save( @@ -57,7 +56,6 @@ public RequestWithItemsDto findReqestsById(Long userId, Long id) { .orElseThrow(() -> new NotFoundException("Не найден пользователь id=" + userId)); ItemRequest request = itemRequestRepository.findById(id) .orElseThrow(() -> new NotFoundException("Не найден запрос id=" + id)); - RequestWithItemsDto rwi = ItemRequestMapper.toRwiDto(request); List items = itemRepository.findAllByRequest_IdEquals(id).stream() .map(ItemMapper::toItemShortDto) @@ -68,7 +66,6 @@ public RequestWithItemsDto findReqestsById(Long userId, Long id) { /** * Поиск собственных запросов заказчика - * * @param customerId - идентификатор заказчика * @return - список запросов с ответными предложениями вещей */ @@ -76,7 +73,6 @@ public RequestWithItemsDto findReqestsById(Long userId, Long id) { public List findReqestsByCustomerId(Long customerId) { userRepository.findById(customerId) .orElseThrow(() -> new NotFoundException("Не найден пользователь id=" + customerId)); - List reqests = itemRequestRepository.findAllByCustomer_IdEquals( customerId, Sort.by("created").descending()); return addItemsToRequests(reqests); @@ -86,7 +82,6 @@ public List findReqestsByCustomerId(Long customerId) { public List findAllReqests(Long customerId) { userRepository.findById(customerId) .orElseThrow(() -> new NotFoundException("Не найден пользователь id=" + customerId)); - List reqests = itemRequestRepository .findAllNotCustomer_Id(customerId); return addItemsToRequests(reqests); @@ -101,7 +96,6 @@ private List addItemsToRequests(List requests) rwiDtos.add(rwiDto); rwiDtoMap.put(itemRequest.getId(), rwiDto); } - List ids = new ArrayList<>(rwiDtoMap.keySet()); List items = itemRepository.findAllByRequest_IdIn(ids); for (Item item : items) { @@ -110,7 +104,6 @@ private List addItemsToRequests(List requests) rwiDtoMap.get(requestId).getItems().add(ItemMapper.toItemShortDto(item)); } } - return rwiDtos; } } diff --git a/server/src/main/java/ru/practicum/shareit/user/User.java b/server/src/main/java/ru/practicum/shareit/user/User.java index c0022ff..24c278f 100644 --- a/server/src/main/java/ru/practicum/shareit/user/User.java +++ b/server/src/main/java/ru/practicum/shareit/user/User.java @@ -20,11 +20,9 @@ public class User { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; - @NotBlank(message = "Имя не может быть пустым", groups = {ValidAction.OnCreate.class}) @Column(name = "name", nullable = false) private String name; - @NotBlank(message = "Email не может быть пустым", groups = {ValidAction.OnCreate.class}) @Email(message = "Email должен удовлетворять правилам формирования почтовых адресов.", groups = {ValidAction.OnCreate.class, ValidAction.OnUpdate.class}) diff --git a/server/src/main/java/ru/practicum/shareit/user/UserController.java b/server/src/main/java/ru/practicum/shareit/user/UserController.java index 9148658..08f91d9 100644 --- a/server/src/main/java/ru/practicum/shareit/user/UserController.java +++ b/server/src/main/java/ru/practicum/shareit/user/UserController.java @@ -2,11 +2,9 @@ import lombok.extern.slf4j.Slf4j; import org.springframework.http.HttpStatus; -import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.*; import ru.practicum.shareit.user.dto.UserDto; import ru.practicum.shareit.user.service.UserService; -import ru.practicum.shareit.validator.ValidAction; import java.util.Collection; @@ -24,11 +22,6 @@ public UserController(UserService userService) { this.userService = userService; } - /** - * Метод поиска всех пользователей - * - * @return - список пользователей - */ @GetMapping @ResponseStatus(HttpStatus.OK) public Collection findAllUser() { @@ -36,12 +29,6 @@ public Collection findAllUser() { return userService.getAllUsers(); } - /** - * Метод поиска пользователя по идентификатору - * - * @param id - идентификатор - * @return - найденный объект - */ @GetMapping("/{id}") @ResponseStatus(HttpStatus.OK) public UserDto findUser(@PathVariable Long id) { @@ -49,39 +36,22 @@ public UserDto findUser(@PathVariable Long id) { return userService.getUserById(id); } - /** - * Метод добавления нового пользователя. - * - * @param userDto - объект для добавления - * @return - подтверждение добавленного объекта - */ @PostMapping @ResponseStatus(HttpStatus.CREATED) - public UserDto addNewUser(@Validated(ValidAction.OnCreate.class) @RequestBody UserDto userDto) { + public UserDto addNewUser(@RequestBody UserDto userDto) { log.info("Создаем пользователя : {}.", userDto.toString()); return userService.createUser(userDto); } - /** - * Метод обновления информации о пользователе. - * - * @param updUser - объект с обновленной информацией о пользователе - * @return - подтверждение обновленного объекта - */ @PatchMapping("/{id}") @ResponseStatus(HttpStatus.OK) public UserDto updateUser(@PathVariable Long id, - @Validated(ValidAction.OnUpdate.class) @RequestBody UserDto updUser) { + @RequestBody UserDto updUser) { updUser.setId(id); log.info("Обновляем данные о пользователе : {}", updUser); return userService.updateUser(updUser); } - /** - * Удаление всех пользователей - * - * @return - сообщение о выполнении - */ @DeleteMapping @ResponseStatus(HttpStatus.OK) public Collection deleteAllUsers() { @@ -89,11 +59,6 @@ public Collection deleteAllUsers() { return userService.deleteAllUsers(); } - /** - * Удаление пользователя по заданному идентификатору - * - * @param id - идентификатор пользователя - */ @DeleteMapping("/{id}") @ResponseStatus(HttpStatus.OK) public void deleteUser(@PathVariable Long id) { diff --git a/server/src/main/java/ru/practicum/shareit/user/UserMapper.java b/server/src/main/java/ru/practicum/shareit/user/UserMapper.java index edfd3e5..8422102 100644 --- a/server/src/main/java/ru/practicum/shareit/user/UserMapper.java +++ b/server/src/main/java/ru/practicum/shareit/user/UserMapper.java @@ -5,21 +5,13 @@ public class UserMapper { public static final String HEADER_USER_ID = "X-Sharer-User-Id"; - private UserMapper() { - } + private UserMapper() {} public static UserDto toUserDto(User user) { - return new UserDto( - user.getId(), - user.getName(), - user.getEmail() - ); + return new UserDto(user.getId(), user.getName(), user.getEmail()); } public static User toUser(UserDto userDto) { - return new User( - userDto.getId(), - userDto.getName(), - userDto.getEmail()); + return new User(userDto.getId(), userDto.getName(), userDto.getEmail()); } } diff --git a/server/src/main/java/ru/practicum/shareit/user/service/UserServiceImpl.java b/server/src/main/java/ru/practicum/shareit/user/service/UserServiceImpl.java index 44b1a57..55cdfa6 100644 --- a/server/src/main/java/ru/practicum/shareit/user/service/UserServiceImpl.java +++ b/server/src/main/java/ru/practicum/shareit/user/service/UserServiceImpl.java @@ -8,6 +8,7 @@ import ru.practicum.shareit.user.repository.UserRepository; import java.util.Collection; +import java.util.List; @Service public class UserServiceImpl implements UserService { @@ -56,14 +57,12 @@ public void deleteUser(Long id) { @Override public Collection getAllUsers() { - return userRepository.findAll().stream() - .map(UserMapper::toUserDto) - .toList(); + return userRepository.findAll().stream().map(UserMapper::toUserDto).toList(); } @Override public Collection deleteAllUsers() { userRepository.deleteAll(); - return getAllUsers(); + return List.of(); } } \ No newline at end of file diff --git a/server/src/test/java/ru/practicum/shareit/item/dto/ItemShortDtoTest.java b/server/src/test/java/ru/practicum/shareit/item/dto/ItemShortDtoTest.java new file mode 100644 index 0000000..c71147c --- /dev/null +++ b/server/src/test/java/ru/practicum/shareit/item/dto/ItemShortDtoTest.java @@ -0,0 +1,29 @@ +package ru.practicum.shareit.item.dto; + +import lombok.RequiredArgsConstructor; +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.autoconfigure.json.JsonTest; +import org.springframework.boot.test.json.JacksonTester; +import org.springframework.boot.test.json.JsonContent; + +import static org.assertj.core.api.AssertionsForInterfaceTypes.assertThat; +import static org.junit.jupiter.api.Assertions.*; + +@JsonTest +@RequiredArgsConstructor(onConstructor_ = @Autowired) +class ItemShortDtoTest { + private final JacksonTester json; + + @Test + void testSerialize() throws Exception { + ItemShortDto itemShortDto = new ItemShortDto( + 1L, + "Item", + 1L); + JsonContent result = json.write(itemShortDto); + assertThat(result).extractingJsonPathNumberValue("$.id").isEqualTo(1); + assertThat(result).extractingJsonPathStringValue("$.name").isEqualTo("Item"); + assertThat(result).extractingJsonPathNumberValue("$.ownerId").isEqualTo(1); + } +} \ No newline at end of file diff --git a/server/src/test/java/ru/practicum/shareit/item/service/CommentServiceImplTest.java b/server/src/test/java/ru/practicum/shareit/item/service/CommentServiceImplTest.java index cb0e600..bfa8d1e 100644 --- a/server/src/test/java/ru/practicum/shareit/item/service/CommentServiceImplTest.java +++ b/server/src/test/java/ru/practicum/shareit/item/service/CommentServiceImplTest.java @@ -8,6 +8,7 @@ import ru.practicum.shareit.booking.Booking; import ru.practicum.shareit.booking.enums.BookingStatus; import ru.practicum.shareit.booking.repository.BookingRepository; +import ru.practicum.shareit.excepton.NotFoundException; import ru.practicum.shareit.item.dto.CommentDto; import ru.practicum.shareit.item.model.Item; import ru.practicum.shareit.item.repository.ItemRepository; @@ -21,6 +22,7 @@ import static org.hamcrest.CoreMatchers.notNullValue; import static org.hamcrest.MatcherAssert.assertThat; import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertThrows; @Transactional @SpringBootTest @@ -75,5 +77,10 @@ void addComment() { assertThat(commentDto1.getId(), notNullValue()); assertEquals(commentDto1.getText(), commentDto.getText()); assertEquals(commentDto1.getItemId(), commentDto1.getItemId()); + + commentDto.setAuthorId(savedItem.getId()); + assertThrows(NotFoundException.class, + () -> { commentService.addComment(commentDto); }, + "Коментирование хозяином должно приводить к исключению."); } } \ No newline at end of file diff --git a/server/src/test/java/ru/practicum/shareit/request/ItemRequestControllerTest.java b/server/src/test/java/ru/practicum/shareit/request/ItemRequestControllerTest.java index b8624ee..28ad613 100644 --- a/server/src/test/java/ru/practicum/shareit/request/ItemRequestControllerTest.java +++ b/server/src/test/java/ru/practicum/shareit/request/ItemRequestControllerTest.java @@ -29,13 +29,10 @@ @WebMvcTest(controllers = ItemRequestController.class) class ItemRequestControllerTest { private static final String HEADER_USER_ID = "X-Sharer-User-Id"; - @Autowired ObjectMapper mapper; - @MockBean private ItemRequestService itemRequestService; - @Autowired private MockMvc mvc; diff --git a/server/src/test/java/ru/practicum/shareit/request/service/ItemRequestServiceImplTest.java b/server/src/test/java/ru/practicum/shareit/request/service/ItemRequestServiceImplTest.java index 06b5cd2..d0625f4 100644 --- a/server/src/test/java/ru/practicum/shareit/request/service/ItemRequestServiceImplTest.java +++ b/server/src/test/java/ru/practicum/shareit/request/service/ItemRequestServiceImplTest.java @@ -6,12 +6,16 @@ import org.springframework.boot.test.context.SpringBootTest; import org.springframework.transaction.annotation.Transactional; import ru.practicum.shareit.excepton.NotFoundException; +import ru.practicum.shareit.item.model.Item; +import ru.practicum.shareit.item.repository.ItemRepository; +import ru.practicum.shareit.request.ItemRequestMapper; import ru.practicum.shareit.request.dto.ItemRequestDto; import ru.practicum.shareit.request.dto.RequestWithItemsDto; import ru.practicum.shareit.user.User; import ru.practicum.shareit.user.repository.UserRepository; import java.time.Instant; +import java.util.ArrayList; import java.util.List; import static org.hamcrest.CoreMatchers.notNullValue; @@ -27,6 +31,8 @@ class ItemRequestServiceImplTest { Long userId = 0L; Long requestId = 0L; + @Autowired + private ItemRepository itemRepository; @Test void create() { @@ -74,26 +80,27 @@ void findReqestsByCustomerId() { ItemRequestDto itemRequestDto = new ItemRequestDto(); itemRequestDto.setDescription("request test by customer id"); itemRequestDto.setCreated(Instant.now()); - ItemRequestDto savedRequestDto = itemRequestService.create( - userId, - itemRequestDto); - List rwiList = - itemRequestService.findReqestsByCustomerId(userId); + ItemRequestDto savedRequestDto = itemRequestService.create( userId, itemRequestDto); + List rwiList = itemRequestService.findReqestsByCustomerId(userId); assertThat(rwiList, notNullValue()); assertTrue(rwiList.size() > 1); } @Test - void findAllReqests() { + void findAllReqests() throws NotFoundException, Exception { if (userId.equals(0L)) { create(); } ItemRequestDto itemRequestDto = new ItemRequestDto(); itemRequestDto.setDescription("request test find all"); itemRequestDto.setCreated(Instant.now()); - ItemRequestDto savedRequestDto = itemRequestService.create( - userId, - itemRequestDto); + ItemRequestDto savedRequestDto = itemRequestService.create( userId, itemRequestDto); + + Item item = new Item(1L, "Item", "Description", + userRepository.findById(userId).get(), + true, + ItemRequestMapper.toItemRequest(savedRequestDto)); + item = itemRepository.save(item); // для поиска "чужих" запросов заведем еще одного пользователя User newUser = new User(2L, "UserName2", "user2@request.test"); @@ -105,4 +112,5 @@ void findAllReqests() { assertThat(rwiList, notNullValue()); assertTrue(rwiList.size() > 1); } -} \ No newline at end of file +} + diff --git a/server/src/test/java/ru/practicum/shareit/user/service/UserServiceImplTest.java b/server/src/test/java/ru/practicum/shareit/user/service/UserServiceImplTest.java index 04f096b..140470e 100644 --- a/server/src/test/java/ru/practicum/shareit/user/service/UserServiceImplTest.java +++ b/server/src/test/java/ru/practicum/shareit/user/service/UserServiceImplTest.java @@ -57,9 +57,7 @@ void getUserById() { .isEqualTo(savedUserDto); assertThrows(NotFoundException.class, - () -> { - userService.getUserById(100L); - }, + () -> { userService.getUserById(100L); }, "Чтение несуществующего пользователя должно приводить к исключению."); } @@ -80,8 +78,10 @@ void updateUser() { .usingRecursiveComparison() .isEqualTo(savedUserDto); - Long userId = savedUserDto.getId(); - + savedUserDto.setId(9999L); + assertThrows(NotFoundException.class, + () -> { userService.updateUser(savedUserDto); }, + "Редактирование несуществующего пользователя должно приводить к исключению."); } @Test @@ -130,7 +130,6 @@ void getAllUsers() { @Test void deleteAllUsers() { - getAllUsers(); List targetUsers = userService.deleteAllUsers().stream().toList(); assertThat(targetUsers, notNullValue()); assertThat(targetUsers, hasSize(0)); From bad9a2c320360e6248f4036c41094621d195397d Mon Sep 17 00:00:00 2001 From: Andrej Stelmaschuk Date: Sun, 4 May 2025 14:29:21 +0700 Subject: [PATCH 41/46] =?UTF-8?q?fix:=20=D1=83=D0=B2=D0=B5=D0=BB=D0=B8?= =?UTF-8?q?=D1=87=D0=B8=D0=B2=D0=B0=D0=B5=D0=BC=20=D0=BF=D0=BE=D0=BA=D1=80?= =?UTF-8?q?=D1=8B=D1=82=D0=B8=D0=B5=20=D1=82=D0=B5=D1=81=D1=82=D0=B0=D0=BC?= =?UTF-8?q?=D0=B8=201?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../shareit/request/service/ItemRequestServiceImpl.java | 1 + .../main/java/ru/practicum/shareit/user/UserMapper.java | 3 ++- .../ru/practicum/shareit/item/dto/ItemShortDtoTest.java | 1 - .../shareit/item/service/CommentServiceImplTest.java | 4 +++- .../request/service/ItemRequestServiceImplTest.java | 5 ++--- .../shareit/user/service/UserServiceImplTest.java | 8 ++++++-- 6 files changed, 14 insertions(+), 8 deletions(-) diff --git a/server/src/main/java/ru/practicum/shareit/request/service/ItemRequestServiceImpl.java b/server/src/main/java/ru/practicum/shareit/request/service/ItemRequestServiceImpl.java index 22a5d05..ac6f438 100644 --- a/server/src/main/java/ru/practicum/shareit/request/service/ItemRequestServiceImpl.java +++ b/server/src/main/java/ru/practicum/shareit/request/service/ItemRequestServiceImpl.java @@ -66,6 +66,7 @@ public RequestWithItemsDto findReqestsById(Long userId, Long id) { /** * Поиск собственных запросов заказчика + * * @param customerId - идентификатор заказчика * @return - список запросов с ответными предложениями вещей */ diff --git a/server/src/main/java/ru/practicum/shareit/user/UserMapper.java b/server/src/main/java/ru/practicum/shareit/user/UserMapper.java index 8422102..598576c 100644 --- a/server/src/main/java/ru/practicum/shareit/user/UserMapper.java +++ b/server/src/main/java/ru/practicum/shareit/user/UserMapper.java @@ -5,7 +5,8 @@ public class UserMapper { public static final String HEADER_USER_ID = "X-Sharer-User-Id"; - private UserMapper() {} + private UserMapper() { + } public static UserDto toUserDto(User user) { return new UserDto(user.getId(), user.getName(), user.getEmail()); diff --git a/server/src/test/java/ru/practicum/shareit/item/dto/ItemShortDtoTest.java b/server/src/test/java/ru/practicum/shareit/item/dto/ItemShortDtoTest.java index c71147c..3261101 100644 --- a/server/src/test/java/ru/practicum/shareit/item/dto/ItemShortDtoTest.java +++ b/server/src/test/java/ru/practicum/shareit/item/dto/ItemShortDtoTest.java @@ -8,7 +8,6 @@ import org.springframework.boot.test.json.JsonContent; import static org.assertj.core.api.AssertionsForInterfaceTypes.assertThat; -import static org.junit.jupiter.api.Assertions.*; @JsonTest @RequiredArgsConstructor(onConstructor_ = @Autowired) diff --git a/server/src/test/java/ru/practicum/shareit/item/service/CommentServiceImplTest.java b/server/src/test/java/ru/practicum/shareit/item/service/CommentServiceImplTest.java index bfa8d1e..271ad1e 100644 --- a/server/src/test/java/ru/practicum/shareit/item/service/CommentServiceImplTest.java +++ b/server/src/test/java/ru/practicum/shareit/item/service/CommentServiceImplTest.java @@ -80,7 +80,9 @@ void addComment() { commentDto.setAuthorId(savedItem.getId()); assertThrows(NotFoundException.class, - () -> { commentService.addComment(commentDto); }, + () -> { + commentService.addComment(commentDto); + }, "Коментирование хозяином должно приводить к исключению."); } } \ No newline at end of file diff --git a/server/src/test/java/ru/practicum/shareit/request/service/ItemRequestServiceImplTest.java b/server/src/test/java/ru/practicum/shareit/request/service/ItemRequestServiceImplTest.java index d0625f4..d2bf031 100644 --- a/server/src/test/java/ru/practicum/shareit/request/service/ItemRequestServiceImplTest.java +++ b/server/src/test/java/ru/practicum/shareit/request/service/ItemRequestServiceImplTest.java @@ -15,7 +15,6 @@ import ru.practicum.shareit.user.repository.UserRepository; import java.time.Instant; -import java.util.ArrayList; import java.util.List; import static org.hamcrest.CoreMatchers.notNullValue; @@ -80,7 +79,7 @@ void findReqestsByCustomerId() { ItemRequestDto itemRequestDto = new ItemRequestDto(); itemRequestDto.setDescription("request test by customer id"); itemRequestDto.setCreated(Instant.now()); - ItemRequestDto savedRequestDto = itemRequestService.create( userId, itemRequestDto); + ItemRequestDto savedRequestDto = itemRequestService.create(userId, itemRequestDto); List rwiList = itemRequestService.findReqestsByCustomerId(userId); assertThat(rwiList, notNullValue()); assertTrue(rwiList.size() > 1); @@ -94,7 +93,7 @@ void findAllReqests() throws NotFoundException, Exception { ItemRequestDto itemRequestDto = new ItemRequestDto(); itemRequestDto.setDescription("request test find all"); itemRequestDto.setCreated(Instant.now()); - ItemRequestDto savedRequestDto = itemRequestService.create( userId, itemRequestDto); + ItemRequestDto savedRequestDto = itemRequestService.create(userId, itemRequestDto); Item item = new Item(1L, "Item", "Description", userRepository.findById(userId).get(), diff --git a/server/src/test/java/ru/practicum/shareit/user/service/UserServiceImplTest.java b/server/src/test/java/ru/practicum/shareit/user/service/UserServiceImplTest.java index 140470e..8b30d40 100644 --- a/server/src/test/java/ru/practicum/shareit/user/service/UserServiceImplTest.java +++ b/server/src/test/java/ru/practicum/shareit/user/service/UserServiceImplTest.java @@ -57,7 +57,9 @@ void getUserById() { .isEqualTo(savedUserDto); assertThrows(NotFoundException.class, - () -> { userService.getUserById(100L); }, + () -> { + userService.getUserById(100L); + }, "Чтение несуществующего пользователя должно приводить к исключению."); } @@ -80,7 +82,9 @@ void updateUser() { savedUserDto.setId(9999L); assertThrows(NotFoundException.class, - () -> { userService.updateUser(savedUserDto); }, + () -> { + userService.updateUser(savedUserDto); + }, "Редактирование несуществующего пользователя должно приводить к исключению."); } From f3dcb3730c414081f3e71cdfe1392cb65a8d8bce Mon Sep 17 00:00:00 2001 From: Andrej Stelmaschuk Date: Sun, 4 May 2025 17:12:13 +0700 Subject: [PATCH 42/46] =?UTF-8?q?fix:=20=D1=83=D0=B2=D0=B5=D0=BB=D0=B8?= =?UTF-8?q?=D1=87=D0=B8=D0=B2=D0=B0=D0=B5=D0=BC=20=D0=BF=D0=BE=D0=BA=D1=80?= =?UTF-8?q?=D1=8B=D1=82=D0=B8=D0=B5=20=D1=82=D0=B5=D1=81=D1=82=D0=B0=D0=BC?= =?UTF-8?q?=D0=B8=202?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../shareit/advisor/ErrorAdvisor.java | 51 ------------------- 1 file changed, 51 deletions(-) diff --git a/server/src/main/java/ru/practicum/shareit/advisor/ErrorAdvisor.java b/server/src/main/java/ru/practicum/shareit/advisor/ErrorAdvisor.java index 2e63f7e..137a827 100644 --- a/server/src/main/java/ru/practicum/shareit/advisor/ErrorAdvisor.java +++ b/server/src/main/java/ru/practicum/shareit/advisor/ErrorAdvisor.java @@ -2,8 +2,6 @@ import lombok.extern.slf4j.Slf4j; import org.springframework.http.HttpStatus; -import org.springframework.http.converter.HttpMessageNotReadableException; -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; @@ -12,41 +10,12 @@ import ru.practicum.shareit.excepton.NotFoundException; import ru.practicum.shareit.excepton.ValidationException; -import java.util.List; -import java.util.stream.Collectors; - /** * Класс обработки исключений при обработке поступивших http запросов */ @Slf4j @RestControllerAdvice public class ErrorAdvisor { - - /** - * Обработка исключения MethodArgumentNotValidException - при проверке аргумента метода - * - * @param e - исключение - * @return - список нарушений для отображения в теле ответа - */ - @ExceptionHandler(MethodArgumentNotValidException.class) - @ResponseStatus(HttpStatus.BAD_REQUEST) - public ErrorMessage onMethodArgumentNotValidException( - MethodArgumentNotValidException e - ) { - final List violations = e.getBindingResult().getFieldErrors().stream() - .map(error -> new ErrorMessage("[" + error.getField() + "] " - + error.getDefaultMessage())) - .collect(Collectors.toList()); - log.info("400 {}.", e.getMessage()); - return violations.get(0); - } - - /** - * Метод обработки пользовательского исключения ValidationException - * - * @param exception - исключение проверки данных - * @return - объект для http ответа с сообщением об ошибке - */ @ExceptionHandler(ValidationException.class) @ResponseStatus(HttpStatus.BAD_REQUEST) public ErrorMessage onValidationException(ValidationException exception) { @@ -61,20 +30,6 @@ public ErrorMessage notFoundObject(NotFoundException exception) { return new ErrorMessage(exception.getMessage()); } - /** - * Обработка исключения HttpMessageNotReadableException при поступлении пустого запроса - * - * @param e - исключение генерируемое при отсутствии обязательных данных в теле запроса - * @return - объект для http ответа с сообщением об ошибке - */ - @ExceptionHandler(HttpMessageNotReadableException.class) - @ResponseStatus(HttpStatus.BAD_REQUEST) - public ErrorMessage onHttpMessageNotReadableException( - HttpMessageNotReadableException e) { - log.info("400 {}.", e.getMessage()); - return new ErrorMessage("В запросе отсутствуют необходимые данные." + e.getMessage()); - } - @ExceptionHandler @ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR) public ErrorMessage onInternalException(final InternalServerException e) { @@ -89,12 +44,6 @@ public ErrorMessage onAccessDeniedException(final AccessDeniedException e) { return new ErrorMessage(e.getMessage()); } - /** - * Обработка непредвиденного исключения - * - * @param e - исключение - * @return - сообщение об ошибке - */ @ExceptionHandler @ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR) public ErrorMessage handleException(final Exception e) { From 350bfe71eae6ccc9a00ac7d0e8bcef6f5c4e991c Mon Sep 17 00:00:00 2001 From: Andrej Stelmaschuk Date: Sun, 4 May 2025 17:21:25 +0700 Subject: [PATCH 43/46] =?UTF-8?q?fix:=20=D0=B8=D0=B7=D0=BC=D0=B5=D0=BD?= =?UTF-8?q?=D1=8F=D0=B5=D0=BC=20=D0=BF=D0=B0=D1=80=D0=B0=D0=BC=D0=B5=D1=82?= =?UTF-8?q?=D1=80=D1=8B=20DataSource?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- server/src/main/resources/application.properties | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/server/src/main/resources/application.properties b/server/src/main/resources/application.properties index 22c8cf8..71fe316 100644 --- a/server/src/main/resources/application.properties +++ b/server/src/main/resources/application.properties @@ -5,13 +5,13 @@ spring.jpa.properties.hibernate.format_sql=true spring.sql.init.mode=always #--- -#spring.datasource.driverClassName=org.postgresql.Driver -#spring.datasource.url=jdbc:postgresql://localhost:5432/shareit -#spring.datasource.username=shareit -#spring.datasource.password=shareit +spring.datasource.driverClassName=org.postgresql.Driver +spring.datasource.url=jdbc:postgresql://localhost:5432/shareit +spring.datasource.username=shareit +spring.datasource.password=shareit #--- #spring.config.activate.on-profile=test -spring.datasource.driverClassName=org.h2.Driver -spring.datasource.url=jdbc:h2:mem:shareit -spring.datasource.username=shareit -spring.datasource.password=shareit \ No newline at end of file +#spring.datasource.driverClassName=org.h2.Driver +#spring.datasource.url=jdbc:h2:mem:shareit +#spring.datasource.username=shareit +#spring.datasource.password=shareit \ No newline at end of file From 1e2cab83c3a3cdd2e7be2fc8b5e1eae9b7724625 Mon Sep 17 00:00:00 2001 From: Andrej Stelmaschuk Date: Sun, 4 May 2025 17:26:46 +0700 Subject: [PATCH 44/46] =?UTF-8?q?fix:=20=D0=B8=D0=B7=D0=BC=D0=B5=D0=BD?= =?UTF-8?q?=D1=8F=D0=B5=D0=BC=20=D0=BF=D0=B0=D1=80=D0=B0=D0=BC=D0=B5=D1=82?= =?UTF-8?q?=D1=80=D1=8B=20DataSource=202?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- server/src/main/resources/application.properties | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/server/src/main/resources/application.properties b/server/src/main/resources/application.properties index 71fe316..6a96840 100644 --- a/server/src/main/resources/application.properties +++ b/server/src/main/resources/application.properties @@ -10,8 +10,8 @@ spring.datasource.url=jdbc:postgresql://localhost:5432/shareit spring.datasource.username=shareit spring.datasource.password=shareit #--- -#spring.config.activate.on-profile=test -#spring.datasource.driverClassName=org.h2.Driver -#spring.datasource.url=jdbc:h2:mem:shareit -#spring.datasource.username=shareit -#spring.datasource.password=shareit \ No newline at end of file +spring.config.activate.on-profile=test +spring.datasource.driverClassName=org.h2.Driver +spring.datasource.url=jdbc:h2:mem:shareit +spring.datasource.username=shareit +spring.datasource.password=shareit \ No newline at end of file From 342beb44d9a8b2a2ce145c9f451483802ed3c81a Mon Sep 17 00:00:00 2001 From: Andrej Stelmaschuk Date: Mon, 5 May 2025 23:18:03 +0700 Subject: [PATCH 45/46] =?UTF-8?q?fix:=20=D0=B8=D1=81=D0=BF=D1=80=D0=B0?= =?UTF-8?q?=D0=B2=D0=BB=D0=B5=D0=BD=D0=B8=D0=B5=20=D0=B7=D0=B0=D0=BC=D0=B5?= =?UTF-8?q?=D1=87=D0=B0=D0=BD=D0=B8=D0=B9=20=D1=80=D0=B5=D0=B2=D1=8C=D1=8E?= =?UTF-8?q?=D0=B2=D0=B5=D1=80=D0=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ru/practicum/shareit/advisor/ErrorAdvisor.java | 4 ++-- .../shareit/request/ItemRequestController.java | 1 - .../ru/practicum/shareit/advisor/ErrorAdvisor.java | 10 +++++----- .../ru/practicum/shareit/booking/dto/BookingDto.java | 7 ------- .../java/ru/practicum/shareit/item/dto/CommentDto.java | 1 - .../java/ru/practicum/shareit/item/dto/ItemDto.java | 5 ----- .../ru/practicum/shareit/item/dto/ItemShortDto.java | 1 - .../practicum/shareit/request/dto/ItemRequestDto.java | 3 --- .../shareit/request/dto/RequestWithItemsDto.java | 1 - .../java/ru/practicum/shareit/user/dto/UserDto.java | 2 -- 10 files changed, 7 insertions(+), 28 deletions(-) diff --git a/gateway/src/main/java/ru/practicum/shareit/advisor/ErrorAdvisor.java b/gateway/src/main/java/ru/practicum/shareit/advisor/ErrorAdvisor.java index 28c58a2..ccecd4a 100644 --- a/gateway/src/main/java/ru/practicum/shareit/advisor/ErrorAdvisor.java +++ b/gateway/src/main/java/ru/practicum/shareit/advisor/ErrorAdvisor.java @@ -32,7 +32,7 @@ public ErrorMessage onMethodArgumentNotValidException( .map(error -> new ErrorMessage("[" + error.getField() + "] " + error.getDefaultMessage())) .collect(Collectors.toList()); - log.info("400 {}.", e.getMessage()); + log.error("400 {}.", e.getMessage()); return violations.get(0); } @@ -45,7 +45,7 @@ public ErrorMessage onMethodArgumentNotValidException( @ExceptionHandler @ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR) public ErrorMessage handleException(final Exception e) { - log.warn("Error", e); + log.error("Error", e); return new ErrorMessage(e.getMessage()); } } diff --git a/gateway/src/main/java/ru/practicum/shareit/request/ItemRequestController.java b/gateway/src/main/java/ru/practicum/shareit/request/ItemRequestController.java index 123b737..1bc2bfa 100644 --- a/gateway/src/main/java/ru/practicum/shareit/request/ItemRequestController.java +++ b/gateway/src/main/java/ru/practicum/shareit/request/ItemRequestController.java @@ -16,7 +16,6 @@ @Validated public class ItemRequestController { private static final String HEADER_USER_ID = "X-Sharer-User-Id"; - private final ItemRequestClient requestClient; private final ItemRequestClient itemRequestClient; /** diff --git a/server/src/main/java/ru/practicum/shareit/advisor/ErrorAdvisor.java b/server/src/main/java/ru/practicum/shareit/advisor/ErrorAdvisor.java index 137a827..985d4f0 100644 --- a/server/src/main/java/ru/practicum/shareit/advisor/ErrorAdvisor.java +++ b/server/src/main/java/ru/practicum/shareit/advisor/ErrorAdvisor.java @@ -19,35 +19,35 @@ public class ErrorAdvisor { @ExceptionHandler(ValidationException.class) @ResponseStatus(HttpStatus.BAD_REQUEST) public ErrorMessage onValidationException(ValidationException exception) { - log.info("400 {}.", exception.getMessage()); + log.error("400 {}.", exception.getMessage()); return new ErrorMessage(exception.getMessage()); } @ExceptionHandler(NotFoundException.class) @ResponseStatus(HttpStatus.NOT_FOUND) public ErrorMessage notFoundObject(NotFoundException exception) { - log.info("404 {}.", exception.getMessage()); + log.error("404 {}.", exception.getMessage()); return new ErrorMessage(exception.getMessage()); } @ExceptionHandler @ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR) public ErrorMessage onInternalException(final InternalServerException e) { - log.warn("500 {}", e.getMessage()); + log.error("500 {}", e.getMessage()); return new ErrorMessage(e.getMessage()); } @ExceptionHandler @ResponseStatus(HttpStatus.FORBIDDEN) public ErrorMessage onAccessDeniedException(final AccessDeniedException e) { - log.warn("403 {}", e.getMessage()); + log.error("403 {}", e.getMessage()); return new ErrorMessage(e.getMessage()); } @ExceptionHandler @ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR) public ErrorMessage handleException(final Exception e) { - log.warn("Error", e); + log.error("Error", e); return new ErrorMessage(e.getMessage()); } } diff --git a/server/src/main/java/ru/practicum/shareit/booking/dto/BookingDto.java b/server/src/main/java/ru/practicum/shareit/booking/dto/BookingDto.java index 5a76380..02f4326 100644 --- a/server/src/main/java/ru/practicum/shareit/booking/dto/BookingDto.java +++ b/server/src/main/java/ru/practicum/shareit/booking/dto/BookingDto.java @@ -19,18 +19,11 @@ @AllArgsConstructor public class BookingDto { private Long id; - - @NotNull(message = "Время начала бронирования должно быть задано.", groups = {ValidAction.OnCreate.class}) private LocalDateTime start; - - @NotNull(message = "Время завершения бронирования должно быть задано.", groups = {ValidAction.OnCreate.class}) private LocalDateTime end; - private Long itemId; private ItemDto item; - private Long bookerId; private UserDto booker; - private BookingStatus status = BookingStatus.WAITING; } 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 index 8c7f64f..e2312a4 100644 --- a/server/src/main/java/ru/practicum/shareit/item/dto/CommentDto.java +++ b/server/src/main/java/ru/practicum/shareit/item/dto/CommentDto.java @@ -13,7 +13,6 @@ @NoArgsConstructor public class CommentDto { private Long id; - @NotBlank(message = "Текст не может быть пустым", groups = {ValidAction.OnCreate.class}) private String text; private Long authorId; private String authorName; 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 index b58ca06..8c58408 100644 --- a/server/src/main/java/ru/practicum/shareit/item/dto/ItemDto.java +++ b/server/src/main/java/ru/practicum/shareit/item/dto/ItemDto.java @@ -18,13 +18,8 @@ @NoArgsConstructor public class ItemDto { private Long id; - @NotBlank(message = "Имя не может быть пустым", groups = {ValidAction.OnCreate.class}) private String name; - @NotBlank(message = "Описание не может быть пустым", groups = {ValidAction.OnCreate.class}) - @Size(max = 200, message = "Максимальная длина описания - 200 символов.", - groups = {ValidAction.OnCreate.class, ValidAction.OnUpdate.class}) private String description; - @NotNull(message = "Доступ должен быть определен.", groups = {ValidAction.OnCreate.class}) private Boolean available; private Long requestId; private Instant lastBooking; diff --git a/server/src/main/java/ru/practicum/shareit/item/dto/ItemShortDto.java b/server/src/main/java/ru/practicum/shareit/item/dto/ItemShortDto.java index cfd2cd7..6808d6f 100644 --- a/server/src/main/java/ru/practicum/shareit/item/dto/ItemShortDto.java +++ b/server/src/main/java/ru/practicum/shareit/item/dto/ItemShortDto.java @@ -11,7 +11,6 @@ @NoArgsConstructor public class ItemShortDto { private Long id; - @NotBlank(message = "Имя не может быть пустым", groups = {ValidAction.OnCreate.class}) private String name; private Long ownerId; } diff --git a/server/src/main/java/ru/practicum/shareit/request/dto/ItemRequestDto.java b/server/src/main/java/ru/practicum/shareit/request/dto/ItemRequestDto.java index fc821a8..7b5c06b 100644 --- a/server/src/main/java/ru/practicum/shareit/request/dto/ItemRequestDto.java +++ b/server/src/main/java/ru/practicum/shareit/request/dto/ItemRequestDto.java @@ -13,10 +13,7 @@ @NoArgsConstructor public class ItemRequestDto { private Long id; - - @NotBlank(message = "Описание запроса не может быть пустым") private String description; - private UserDto requestor; private Instant created; } diff --git a/server/src/main/java/ru/practicum/shareit/request/dto/RequestWithItemsDto.java b/server/src/main/java/ru/practicum/shareit/request/dto/RequestWithItemsDto.java index 773796d..fc4c808 100644 --- a/server/src/main/java/ru/practicum/shareit/request/dto/RequestWithItemsDto.java +++ b/server/src/main/java/ru/practicum/shareit/request/dto/RequestWithItemsDto.java @@ -16,6 +16,5 @@ public class RequestWithItemsDto { private String description; private UserDto requestor; private Instant created; - private List items = new ArrayList<>(); } 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 index 38894ae..b83a394 100644 --- a/server/src/main/java/ru/practicum/shareit/user/dto/UserDto.java +++ b/server/src/main/java/ru/practicum/shareit/user/dto/UserDto.java @@ -12,9 +12,7 @@ @NoArgsConstructor public class UserDto { private Long id; - @NotBlank(message = "Имя не может быть пустым", groups = {ValidAction.OnCreate.class}) private String name; - @NotBlank(message = "Email не может быть пустым", groups = {ValidAction.OnCreate.class}) @Email(message = "Email должен удовлетворять правилам формирования почтовых адресов.", groups = {ValidAction.OnCreate.class, ValidAction.OnUpdate.class}) private String email; From 17ac5b82c3878ad9c369cb3a56e75b58c009a2de Mon Sep 17 00:00:00 2001 From: Andrej Stelmaschuk Date: Mon, 5 May 2025 23:20:26 +0700 Subject: [PATCH 46/46] =?UTF-8?q?fix:=20=D0=B8=D1=81=D0=BF=D1=80=D0=B0?= =?UTF-8?q?=D0=B2=D0=BB=D0=B5=D0=BD=D0=B8=D0=B5=20=D0=B7=D0=B0=D0=BC=D0=B5?= =?UTF-8?q?=D1=87=D0=B0=D0=BD=D0=B8=D0=B9=20=D1=80=D0=B5=D0=B2=D1=8C=D1=8E?= =?UTF-8?q?=D0=B2=D0=B5=D1=80=D0=B0=202?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/ru/practicum/shareit/booking/dto/BookingDto.java | 2 -- .../main/java/ru/practicum/shareit/item/dto/CommentDto.java | 2 -- .../src/main/java/ru/practicum/shareit/item/dto/ItemDto.java | 4 ---- .../main/java/ru/practicum/shareit/item/dto/ItemShortDto.java | 2 -- .../java/ru/practicum/shareit/request/dto/ItemRequestDto.java | 1 - .../src/main/java/ru/practicum/shareit/user/dto/UserDto.java | 1 - 6 files changed, 12 deletions(-) diff --git a/server/src/main/java/ru/practicum/shareit/booking/dto/BookingDto.java b/server/src/main/java/ru/practicum/shareit/booking/dto/BookingDto.java index 02f4326..8f79c91 100644 --- a/server/src/main/java/ru/practicum/shareit/booking/dto/BookingDto.java +++ b/server/src/main/java/ru/practicum/shareit/booking/dto/BookingDto.java @@ -1,13 +1,11 @@ package ru.practicum.shareit.booking.dto; -import jakarta.validation.constraints.NotNull; import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor; import ru.practicum.shareit.booking.enums.BookingStatus; import ru.practicum.shareit.item.dto.ItemDto; import ru.practicum.shareit.user.dto.UserDto; -import ru.practicum.shareit.validator.ValidAction; import java.time.LocalDateTime; 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 index e2312a4..11d58d6 100644 --- a/server/src/main/java/ru/practicum/shareit/item/dto/CommentDto.java +++ b/server/src/main/java/ru/practicum/shareit/item/dto/CommentDto.java @@ -1,10 +1,8 @@ package ru.practicum.shareit.item.dto; -import jakarta.validation.constraints.NotBlank; import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor; -import ru.practicum.shareit.validator.ValidAction; import java.time.Instant; 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 index 8c58408..520ece3 100644 --- a/server/src/main/java/ru/practicum/shareit/item/dto/ItemDto.java +++ b/server/src/main/java/ru/practicum/shareit/item/dto/ItemDto.java @@ -1,12 +1,8 @@ package ru.practicum.shareit.item.dto; -import jakarta.validation.constraints.NotBlank; -import jakarta.validation.constraints.NotNull; -import jakarta.validation.constraints.Size; import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor; -import ru.practicum.shareit.validator.ValidAction; import java.time.Instant; diff --git a/server/src/main/java/ru/practicum/shareit/item/dto/ItemShortDto.java b/server/src/main/java/ru/practicum/shareit/item/dto/ItemShortDto.java index 6808d6f..e2858e5 100644 --- a/server/src/main/java/ru/practicum/shareit/item/dto/ItemShortDto.java +++ b/server/src/main/java/ru/practicum/shareit/item/dto/ItemShortDto.java @@ -1,10 +1,8 @@ package ru.practicum.shareit.item.dto; -import jakarta.validation.constraints.NotBlank; import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor; -import ru.practicum.shareit.validator.ValidAction; @Data @AllArgsConstructor diff --git a/server/src/main/java/ru/practicum/shareit/request/dto/ItemRequestDto.java b/server/src/main/java/ru/practicum/shareit/request/dto/ItemRequestDto.java index 7b5c06b..ac43ec6 100644 --- a/server/src/main/java/ru/practicum/shareit/request/dto/ItemRequestDto.java +++ b/server/src/main/java/ru/practicum/shareit/request/dto/ItemRequestDto.java @@ -1,6 +1,5 @@ package ru.practicum.shareit.request.dto; -import jakarta.validation.constraints.NotBlank; import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor; 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 index b83a394..6c16bf8 100644 --- a/server/src/main/java/ru/practicum/shareit/user/dto/UserDto.java +++ b/server/src/main/java/ru/practicum/shareit/user/dto/UserDto.java @@ -1,7 +1,6 @@ package ru.practicum.shareit.user.dto; import jakarta.validation.constraints.Email; -import jakarta.validation.constraints.NotBlank; import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor;