From 5e25fa8f93310b2421dc8be4e2600e5558cb2162 Mon Sep 17 00:00:00 2001 From: VLADIMIR <78302444+walder86@users.noreply.github.com> Date: Wed, 30 Jul 2025 19:52:41 +0300 Subject: [PATCH 1/3] =?UTF-8?q?add-controllers.=20=D0=94=D0=BE=D0=B1=D0=B0?= =?UTF-8?q?=D0=B2=D0=B8=D1=82=D1=8C=20=D0=B0=D0=BF=D0=B8=20=D0=B4=D0=BB?= =?UTF-8?q?=D1=8F=20=D0=BF=D0=BE=D0=BB=D1=8C=D0=B7=D0=BE=D0=B2=D0=B0=D1=82?= =?UTF-8?q?=D0=B5=D0=BB=D0=B5=D0=B9=20=D0=B8=20=D0=B2=D0=B5=D1=89=D0=B5?= =?UTF-8?q?=D0=B9.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ru/practicum/shareit/booking/Booking.java | 21 +++++ .../exception/AlreadyExistException.java | 7 ++ .../shareit/exception/ErrorHandler.java | 41 +++++++++ .../shareit/exception/ErrorResponse.java | 11 +++ .../shareit/exception/NotAccessException.java | 7 ++ .../shareit/exception/NotFoundException.java | 7 ++ .../shareit/item/ItemController.java | 45 ++++++++-- .../practicum/shareit/item/dto/ItemDto.java | 18 +++- .../shareit/item/mapper/ItemMapper.java | 31 +++++++ .../ru/practicum/shareit/item/model/Item.java | 17 +++- .../item/repository/ItemRepository.java | 20 +++++ .../item/repository/ItemRepositoryImpl.java | 62 +++++++++++++ .../shareit/item/service/ItemService.java | 17 ++++ .../shareit/item/service/ItemServiceImpl.java | 88 +++++++++++++++++++ .../shareit/request/ItemRequest.java | 10 +++ .../java/ru/practicum/shareit/user/User.java | 7 -- .../shareit/user/UserController.java | 33 +++++-- .../practicum/shareit/user/dto/UserDto.java | 18 ++++ .../shareit/user/mapper/UserMapper.java | 22 +++++ .../ru/practicum/shareit/user/model/User.java | 12 +++ .../user/repository/UserRepository.java | 18 ++++ .../user/repository/UserRepositoryImpl.java | 51 +++++++++++ .../shareit/user/service/UserService.java | 14 +++ .../shareit/user/service/UserServiceImpl.java | 63 +++++++++++++ 24 files changed, 617 insertions(+), 23 deletions(-) create mode 100644 src/main/java/ru/practicum/shareit/exception/AlreadyExistException.java create mode 100644 src/main/java/ru/practicum/shareit/exception/ErrorHandler.java create mode 100644 src/main/java/ru/practicum/shareit/exception/ErrorResponse.java create mode 100644 src/main/java/ru/practicum/shareit/exception/NotAccessException.java create mode 100644 src/main/java/ru/practicum/shareit/exception/NotFoundException.java create mode 100644 src/main/java/ru/practicum/shareit/item/mapper/ItemMapper.java create mode 100644 src/main/java/ru/practicum/shareit/item/repository/ItemRepository.java create mode 100644 src/main/java/ru/practicum/shareit/item/repository/ItemRepositoryImpl.java create mode 100644 src/main/java/ru/practicum/shareit/item/service/ItemService.java create mode 100644 src/main/java/ru/practicum/shareit/item/service/ItemServiceImpl.java delete mode 100644 src/main/java/ru/practicum/shareit/user/User.java create mode 100644 src/main/java/ru/practicum/shareit/user/dto/UserDto.java create mode 100644 src/main/java/ru/practicum/shareit/user/mapper/UserMapper.java create mode 100644 src/main/java/ru/practicum/shareit/user/model/User.java create mode 100644 src/main/java/ru/practicum/shareit/user/repository/UserRepository.java create mode 100644 src/main/java/ru/practicum/shareit/user/repository/UserRepositoryImpl.java create mode 100644 src/main/java/ru/practicum/shareit/user/service/UserService.java create mode 100644 src/main/java/ru/practicum/shareit/user/service/UserServiceImpl.java diff --git a/src/main/java/ru/practicum/shareit/booking/Booking.java b/src/main/java/ru/practicum/shareit/booking/Booking.java index 2d9c666..d76494a 100644 --- a/src/main/java/ru/practicum/shareit/booking/Booking.java +++ b/src/main/java/ru/practicum/shareit/booking/Booking.java @@ -1,7 +1,28 @@ package ru.practicum.shareit.booking; +import lombok.Data; +import ru.practicum.shareit.item.model.Item; +import ru.practicum.shareit.user.model.User; + +import java.time.LocalDateTime; + /** * TODO Sprint add-bookings. */ +@Data public class Booking { + private Long id; + private LocalDateTime start; + private LocalDateTime end; + private Item item; + private User booker; + private Status status; + + enum Status { + WAITING, + APPROVED, + REJECTED, + CANCELED + } + } diff --git a/src/main/java/ru/practicum/shareit/exception/AlreadyExistException.java b/src/main/java/ru/practicum/shareit/exception/AlreadyExistException.java new file mode 100644 index 0000000..5378b90 --- /dev/null +++ b/src/main/java/ru/practicum/shareit/exception/AlreadyExistException.java @@ -0,0 +1,7 @@ +package ru.practicum.shareit.exception; + +public class AlreadyExistException extends RuntimeException { + public AlreadyExistException(String message) { + super(message); + } +} diff --git a/src/main/java/ru/practicum/shareit/exception/ErrorHandler.java b/src/main/java/ru/practicum/shareit/exception/ErrorHandler.java new file mode 100644 index 0000000..000fbff --- /dev/null +++ b/src/main/java/ru/practicum/shareit/exception/ErrorHandler.java @@ -0,0 +1,41 @@ +package ru.practicum.shareit.exception; + +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; + +@Slf4j +@RestControllerAdvice +public class ErrorHandler { + + @ExceptionHandler + @ResponseStatus(HttpStatus.BAD_REQUEST) + public ErrorResponse handleValidationException(MethodArgumentNotValidException e) { + log.debug(e.getBindingResult().getAllErrors().getFirst().getDefaultMessage(), e); + return new ErrorResponse(HttpStatus.BAD_REQUEST.value(), e.getBindingResult().getAllErrors().getFirst().getDefaultMessage()); + } + + @ExceptionHandler + @ResponseStatus(HttpStatus.NOT_FOUND) + public ErrorResponse handleValidationException(NotFoundException e) { + log.debug(e.getMessage(), e); + return new ErrorResponse(HttpStatus.BAD_REQUEST.value(), e.getMessage()); + } + + @ExceptionHandler + @ResponseStatus(HttpStatus.CONFLICT) + public ErrorResponse handleValidationException(AlreadyExistException e) { + log.debug(e.getMessage(), e); + return new ErrorResponse(HttpStatus.BAD_REQUEST.value(), e.getMessage()); + } + + @ExceptionHandler + @ResponseStatus(HttpStatus.FORBIDDEN) + public ErrorResponse handleValidationException(NotAccessException e) { + log.debug(e.getMessage(), e); + return new ErrorResponse(HttpStatus.FORBIDDEN.value(), e.getMessage()); + } +} diff --git a/src/main/java/ru/practicum/shareit/exception/ErrorResponse.java b/src/main/java/ru/practicum/shareit/exception/ErrorResponse.java new file mode 100644 index 0000000..d10218a --- /dev/null +++ b/src/main/java/ru/practicum/shareit/exception/ErrorResponse.java @@ -0,0 +1,11 @@ +package ru.practicum.shareit.exception; + +import lombok.AllArgsConstructor; +import lombok.Data; + +@Data +@AllArgsConstructor +public class ErrorResponse { + private Integer statusCode; + private String error; +} diff --git a/src/main/java/ru/practicum/shareit/exception/NotAccessException.java b/src/main/java/ru/practicum/shareit/exception/NotAccessException.java new file mode 100644 index 0000000..0c0873b --- /dev/null +++ b/src/main/java/ru/practicum/shareit/exception/NotAccessException.java @@ -0,0 +1,7 @@ +package ru.practicum.shareit.exception; + +public class NotAccessException extends RuntimeException { + public NotAccessException(String message) { + super(message); + } +} diff --git a/src/main/java/ru/practicum/shareit/exception/NotFoundException.java b/src/main/java/ru/practicum/shareit/exception/NotFoundException.java new file mode 100644 index 0000000..508b545 --- /dev/null +++ b/src/main/java/ru/practicum/shareit/exception/NotFoundException.java @@ -0,0 +1,7 @@ +package ru.practicum.shareit.exception; + +public class NotFoundException extends RuntimeException { + public NotFoundException(String message) { + super(message); + } +} diff --git a/src/main/java/ru/practicum/shareit/item/ItemController.java b/src/main/java/ru/practicum/shareit/item/ItemController.java index bb17668..af398c8 100644 --- a/src/main/java/ru/practicum/shareit/item/ItemController.java +++ b/src/main/java/ru/practicum/shareit/item/ItemController.java @@ -1,12 +1,47 @@ package ru.practicum.shareit.item; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; +import jakarta.validation.Valid; +import lombok.AllArgsConstructor; +import org.springframework.web.bind.annotation.*; +import ru.practicum.shareit.item.dto.ItemDto; +import ru.practicum.shareit.item.service.ItemService; + +import java.util.List; -/** - * TODO Sprint add-controllers. - */ @RestController +@AllArgsConstructor @RequestMapping("/items") public class ItemController { + + private final ItemService itemService; + + @GetMapping + public List getItemsByUserId(@RequestHeader("X-Sharer-User-Id") Long userId) { + return itemService.getItemsByUserId(userId); + } + + @GetMapping("/{itemId}") + public ItemDto getItemById(@PathVariable Long itemId) { + return itemService.getItemById(itemId); + } + + @PostMapping + public ItemDto createItem( + @Valid @RequestBody ItemDto itemDto, + @RequestHeader("X-Sharer-User-Id") Long userId) { + return itemService.createItem(itemDto, userId); + } + + @PatchMapping("/{itemId}") + public ItemDto updateItem( + @RequestBody ItemDto itemDto, + @PathVariable Long itemId, + @RequestHeader("X-Sharer-User-Id") Long userId) { + return itemService.updateItem(itemDto, itemId, userId); + } + + @GetMapping("/search") + public List getItemsSearchByText(@RequestParam String text) { + return itemService.searchItemsByText(text); + } } 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 9319d7d..1b82a99 100644 --- a/src/main/java/ru/practicum/shareit/item/dto/ItemDto.java +++ b/src/main/java/ru/practicum/shareit/item/dto/ItemDto.java @@ -1,7 +1,19 @@ package ru.practicum.shareit.item.dto; -/** - * TODO Sprint add-controllers. - */ +import jakarta.validation.constraints.NotBlank; +import jakarta.validation.constraints.NotNull; +import lombok.AllArgsConstructor; +import lombok.Data; + +@Data +@AllArgsConstructor public class ItemDto { + private Long id; + @NotBlank(message = "Название не может быть пустым") + private String name; + @NotBlank(message = "Описание не может быть пустым") + private String description; + @NotNull(message = "Статус о доступности не может быть пустым") + private Boolean available; + private Long requestId; } diff --git a/src/main/java/ru/practicum/shareit/item/mapper/ItemMapper.java b/src/main/java/ru/practicum/shareit/item/mapper/ItemMapper.java new file mode 100644 index 0000000..0a5a44b --- /dev/null +++ b/src/main/java/ru/practicum/shareit/item/mapper/ItemMapper.java @@ -0,0 +1,31 @@ +package ru.practicum.shareit.item.mapper; + +import ru.practicum.shareit.item.dto.ItemDto; +import ru.practicum.shareit.item.model.Item; +import ru.practicum.shareit.request.ItemRequest; +import ru.practicum.shareit.user.model.User; + +public class ItemMapper { + + public static ItemDto toItemDto(Item item) { + return new ItemDto( + item.getId(), + item.getName(), + item.getDescription(), + item.getAvailable(), + item.getRequest() != null ? item.getRequest().getId() : null + ); + } + + public static Item toItem(Long itemId, ItemDto itemDto, User owner, ItemRequest request) { + return new Item( + itemId, + itemDto.getName(), + itemDto.getDescription(), + itemDto.getAvailable(), + owner, + request + ); + } + +} diff --git a/src/main/java/ru/practicum/shareit/item/model/Item.java b/src/main/java/ru/practicum/shareit/item/model/Item.java index 44eb73d..ba36b4d 100644 --- a/src/main/java/ru/practicum/shareit/item/model/Item.java +++ b/src/main/java/ru/practicum/shareit/item/model/Item.java @@ -1,7 +1,18 @@ package ru.practicum.shareit.item.model; -/** - * TODO Sprint add-controllers. - */ + +import lombok.AllArgsConstructor; +import lombok.Data; +import ru.practicum.shareit.request.ItemRequest; +import ru.practicum.shareit.user.model.User; + +@Data +@AllArgsConstructor public class Item { + private Long id; + private String name; + private String description; + private Boolean available; + private User owner; + private ItemRequest request; } diff --git a/src/main/java/ru/practicum/shareit/item/repository/ItemRepository.java b/src/main/java/ru/practicum/shareit/item/repository/ItemRepository.java new file mode 100644 index 0000000..2cc3102 --- /dev/null +++ b/src/main/java/ru/practicum/shareit/item/repository/ItemRepository.java @@ -0,0 +1,20 @@ +package ru.practicum.shareit.item.repository; + +import ru.practicum.shareit.item.model.Item; + +import java.util.List; + +public interface ItemRepository { + + List getItems(); + + List getItemsByUserId(Long userId); + + Item createItem(Item item); + + Item updateItem(Item item); + + Item getItemById(Long itemId); + + List searchItemsByText(String text); +} diff --git a/src/main/java/ru/practicum/shareit/item/repository/ItemRepositoryImpl.java b/src/main/java/ru/practicum/shareit/item/repository/ItemRepositoryImpl.java new file mode 100644 index 0000000..2125e14 --- /dev/null +++ b/src/main/java/ru/practicum/shareit/item/repository/ItemRepositoryImpl.java @@ -0,0 +1,62 @@ +package ru.practicum.shareit.item.repository; + +import org.springframework.stereotype.Repository; +import ru.practicum.shareit.exception.NotFoundException; +import ru.practicum.shareit.item.model.Item; + +import java.util.*; + +@Repository +public class ItemRepositoryImpl implements ItemRepository { + + private Map items = new HashMap<>(); + + @Override + public List getItems() { + return new ArrayList<>(items.values()); + } + + @Override + public List getItemsByUserId(Long userId) { + return items.values().stream() + .filter(item -> Objects.equals(item.getOwner().getId(), userId)) + .toList(); + } + + @Override + public Item createItem(Item item) { + items.put(item.getId(), item); + return items.get(item.getId()); + } + + @Override + public Item updateItem(Item item) { + items.put(item.getId(), item); + return items.get(item.getId()); + } + + @Override + public Item getItemById(Long itemId) { + return getItemByIdWithCheck(itemId); + } + + @Override + public List searchItemsByText(String text) { + return items.values().stream() + .filter(item -> (containsIgnoreCase(item.getName(), text) || + containsIgnoreCase(item.getDescription(), text)) && item.getAvailable()) + .toList(); + } + + private Boolean containsIgnoreCase(String text, String containsText) { + return text.toLowerCase().contains(containsText.toLowerCase()); + } + + private Item getItemByIdWithCheck(Long itemId) { + Item itemById = items.get(itemId); + if (itemById == null) { + throw new NotFoundException("Вещь с ID = " + itemId + " не найдена."); + } + return itemById; + } +} diff --git a/src/main/java/ru/practicum/shareit/item/service/ItemService.java b/src/main/java/ru/practicum/shareit/item/service/ItemService.java new file mode 100644 index 0000000..f76170f --- /dev/null +++ b/src/main/java/ru/practicum/shareit/item/service/ItemService.java @@ -0,0 +1,17 @@ +package ru.practicum.shareit.item.service; + +import ru.practicum.shareit.item.dto.ItemDto; + +import java.util.List; + +public interface ItemService { + List getItemsByUserId(Long userId); + + ItemDto createItem(ItemDto itemDto, Long userId); + + ItemDto updateItem(ItemDto itemDto, Long itemId, Long userId); + + ItemDto getItemById(Long itemId); + + List searchItemsByText(String text); +} diff --git a/src/main/java/ru/practicum/shareit/item/service/ItemServiceImpl.java b/src/main/java/ru/practicum/shareit/item/service/ItemServiceImpl.java new file mode 100644 index 0000000..f5d61a2 --- /dev/null +++ b/src/main/java/ru/practicum/shareit/item/service/ItemServiceImpl.java @@ -0,0 +1,88 @@ +package ru.practicum.shareit.item.service; + +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; +import ru.practicum.shareit.exception.NotAccessException; +import ru.practicum.shareit.item.dto.ItemDto; +import ru.practicum.shareit.item.mapper.ItemMapper; +import ru.practicum.shareit.item.model.Item; +import ru.practicum.shareit.item.repository.ItemRepository; +import ru.practicum.shareit.user.model.User; +import ru.practicum.shareit.user.repository.UserRepository; + +import java.util.ArrayList; +import java.util.List; +import java.util.Objects; + +@Slf4j +@Service +@AllArgsConstructor +public class ItemServiceImpl implements ItemService { + + private final ItemRepository itemRepository; + private final UserRepository userRepository; + + + @Override + public List getItemsByUserId(Long userId) { + log.info("Поиск вещей пользователя с ID = {}", userId); + userRepository.getUserById(userId); + List itemsByUserId = itemRepository.getItemsByUserId(userId); + return itemsByUserId.stream() + .map(ItemMapper::toItemDto) + .toList(); + } + + @Override + public ItemDto createItem(ItemDto itemDto, Long userId) { + log.info("Создание вещи у пользователя с ID = {}", userId); + User user = userRepository.getUserById(userId); + return ItemMapper.toItemDto( + itemRepository.createItem(ItemMapper.toItem(getNewItemId(), itemDto, user, null))); + } + + @Override + public ItemDto updateItem(ItemDto itemDto, Long itemId, Long userId) { + log.info("Обновление вещи у пользователя с ID = {}", userId); + Item findItem = itemRepository.getItemById(itemId); + checkUser(findItem, userId); + userRepository.getUserById(userId); + findItem.setName(itemDto.getName() != null ? itemDto.getName() : findItem.getName()); + findItem.setDescription(itemDto.getDescription() != null ? itemDto.getDescription() : findItem.getDescription()); + findItem.setAvailable(itemDto.getAvailable() != null ? itemDto.getAvailable() : findItem.getAvailable()); + return ItemMapper.toItemDto(itemRepository.updateItem(findItem)); + } + + @Override + public ItemDto getItemById(Long itemId) { + log.info("Запрос вещи с ID = {}", itemId); + Item item = itemRepository.getItemById(itemId); + return ItemMapper.toItemDto(item); + } + + @Override + public List searchItemsByText(String text) { + log.info("Поиск вещей по тексту \"{}\"", text); + if (text.isBlank()) { + return new ArrayList<>(); + } + return itemRepository.searchItemsByText(text).stream() + .map(ItemMapper::toItemDto) + .toList(); + } + + private void checkUser(Item item, Long userIdFromRequest) { + if (!Objects.equals(item.getOwner().getId(), userIdFromRequest)) { + throw new NotAccessException("Вещь с ID = " + item.getId() + " не принадлежит пользователю с ID = " + userIdFromRequest); + } + } + + private Long getNewItemId() { + return itemRepository.getItems().stream() + .map(Item::getId) + .max(Long::compareTo) + .orElse(0L) + 1; + } + +} diff --git a/src/main/java/ru/practicum/shareit/request/ItemRequest.java b/src/main/java/ru/practicum/shareit/request/ItemRequest.java index 95d6f23..decd8a3 100644 --- a/src/main/java/ru/practicum/shareit/request/ItemRequest.java +++ b/src/main/java/ru/practicum/shareit/request/ItemRequest.java @@ -1,7 +1,17 @@ package ru.practicum.shareit.request; +import lombok.Data; +import ru.practicum.shareit.user.model.User; + +import java.time.LocalDateTime; + /** * TODO Sprint add-item-requests. */ +@Data public class ItemRequest { + private Long id; + private String description; + private User requestor; + private LocalDateTime created; } diff --git a/src/main/java/ru/practicum/shareit/user/User.java b/src/main/java/ru/practicum/shareit/user/User.java deleted file mode 100644 index ae6e7f3..0000000 --- a/src/main/java/ru/practicum/shareit/user/User.java +++ /dev/null @@ -1,7 +0,0 @@ -package ru.practicum.shareit.user; - -/** - * TODO Sprint add-controllers. - */ -public class User { -} diff --git a/src/main/java/ru/practicum/shareit/user/UserController.java b/src/main/java/ru/practicum/shareit/user/UserController.java index 03039b9..421d352 100644 --- a/src/main/java/ru/practicum/shareit/user/UserController.java +++ b/src/main/java/ru/practicum/shareit/user/UserController.java @@ -1,12 +1,35 @@ package ru.practicum.shareit.user; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; +import jakarta.validation.Valid; +import lombok.AllArgsConstructor; +import org.springframework.web.bind.annotation.*; +import ru.practicum.shareit.user.dto.UserDto; +import ru.practicum.shareit.user.service.UserService; -/** - * TODO Sprint add-controllers. - */ @RestController +@AllArgsConstructor @RequestMapping(path = "/users") public class UserController { + + private final UserService userService; + + @GetMapping("/{userId}") + public UserDto getUserById(@PathVariable Long userId) { + return userService.getUserById(userId); + } + + @PostMapping + public UserDto createUser(@Valid @RequestBody UserDto userDto) { + return userService.createUser(userDto); + } + + @PatchMapping("/{userId}") + public UserDto updateUser(@RequestBody UserDto userDto, @PathVariable Long userId) { + return userService.updateUser(userDto, userId); + } + + @DeleteMapping("/{userId}") + public void deleteUser(@PathVariable Long userId) { + userService.deleteUserById(userId); + } } diff --git a/src/main/java/ru/practicum/shareit/user/dto/UserDto.java b/src/main/java/ru/practicum/shareit/user/dto/UserDto.java new file mode 100644 index 0000000..b94bd2e --- /dev/null +++ b/src/main/java/ru/practicum/shareit/user/dto/UserDto.java @@ -0,0 +1,18 @@ +package ru.practicum.shareit.user.dto; + +import jakarta.validation.constraints.Email; +import jakarta.validation.constraints.NotBlank; +import jakarta.validation.constraints.NotNull; +import lombok.AllArgsConstructor; +import lombok.Data; + +@Data +@AllArgsConstructor +public class UserDto { + private Long id; + @NotNull(message = "Имя не может быть пустым") + private String name; + @NotBlank(message = "Почта не может быть пустой") + @Email(message = "Некорректный email") + private String email; +} diff --git a/src/main/java/ru/practicum/shareit/user/mapper/UserMapper.java b/src/main/java/ru/practicum/shareit/user/mapper/UserMapper.java new file mode 100644 index 0000000..f83c72e --- /dev/null +++ b/src/main/java/ru/practicum/shareit/user/mapper/UserMapper.java @@ -0,0 +1,22 @@ +package ru.practicum.shareit.user.mapper; + +import ru.practicum.shareit.user.dto.UserDto; +import ru.practicum.shareit.user.model.User; + +public class UserMapper { + public static UserDto toUserDto(User user) { + return new UserDto( + user.getId(), + user.getName(), + user.getEmail() + ); + } + + public static User toUser(UserDto user, Long userId) { + return new User( + userId, + user.getName(), + user.getEmail() + ); + } +} diff --git a/src/main/java/ru/practicum/shareit/user/model/User.java b/src/main/java/ru/practicum/shareit/user/model/User.java new file mode 100644 index 0000000..ed5e80e --- /dev/null +++ b/src/main/java/ru/practicum/shareit/user/model/User.java @@ -0,0 +1,12 @@ +package ru.practicum.shareit.user.model; + +import lombok.AllArgsConstructor; +import lombok.Data; + +@Data +@AllArgsConstructor +public class User { + private Long id; + private String name; + private String email; +} diff --git a/src/main/java/ru/practicum/shareit/user/repository/UserRepository.java b/src/main/java/ru/practicum/shareit/user/repository/UserRepository.java new file mode 100644 index 0000000..39f3852 --- /dev/null +++ b/src/main/java/ru/practicum/shareit/user/repository/UserRepository.java @@ -0,0 +1,18 @@ +package ru.practicum.shareit.user.repository; + +import ru.practicum.shareit.user.model.User; + +import java.util.List; + +public interface UserRepository { + + List getUsers(); + + User getUserById(Long userId); + + User createUser(User user); + + User updateUser(User user); + + void deleteUserById(Long userId); +} diff --git a/src/main/java/ru/practicum/shareit/user/repository/UserRepositoryImpl.java b/src/main/java/ru/practicum/shareit/user/repository/UserRepositoryImpl.java new file mode 100644 index 0000000..4415935 --- /dev/null +++ b/src/main/java/ru/practicum/shareit/user/repository/UserRepositoryImpl.java @@ -0,0 +1,51 @@ +package ru.practicum.shareit.user.repository; + +import org.springframework.stereotype.Repository; +import ru.practicum.shareit.exception.NotFoundException; +import ru.practicum.shareit.user.model.User; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +@Repository +public class UserRepositoryImpl implements UserRepository { + + private Map users = new HashMap<>(); + + @Override + public List getUsers() { + return new ArrayList<>(users.values()); + } + + @Override + public User getUserById(Long userId) { + return getUserByIdWithCheck(userId); + } + + @Override + public User createUser(User user) { + users.put(user.getId(), user); + return users.get(user.getId()); + } + + @Override + public User updateUser(User user) { + users.put(user.getId(), user); + return users.get(user.getId()); + } + + @Override + public void deleteUserById(Long userId) { + users.remove(userId); + } + + private User getUserByIdWithCheck(Long userId) { + User userById = users.get(userId); + if (userById == null) { + throw new NotFoundException("Пользователь с ID = " + userId + " не найден."); + } + return userById; + } +} diff --git a/src/main/java/ru/practicum/shareit/user/service/UserService.java b/src/main/java/ru/practicum/shareit/user/service/UserService.java new file mode 100644 index 0000000..b1773f8 --- /dev/null +++ b/src/main/java/ru/practicum/shareit/user/service/UserService.java @@ -0,0 +1,14 @@ +package ru.practicum.shareit.user.service; + +import ru.practicum.shareit.user.dto.UserDto; + +public interface UserService { + + UserDto getUserById(Long userId); + + UserDto createUser(UserDto user); + + UserDto updateUser(UserDto user, Long userId); + + void deleteUserById(Long userId); +} diff --git a/src/main/java/ru/practicum/shareit/user/service/UserServiceImpl.java b/src/main/java/ru/practicum/shareit/user/service/UserServiceImpl.java new file mode 100644 index 0000000..a423037 --- /dev/null +++ b/src/main/java/ru/practicum/shareit/user/service/UserServiceImpl.java @@ -0,0 +1,63 @@ +package ru.practicum.shareit.user.service; + +import lombok.AllArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; +import ru.practicum.shareit.exception.AlreadyExistException; +import ru.practicum.shareit.user.dto.UserDto; +import ru.practicum.shareit.user.mapper.UserMapper; +import ru.practicum.shareit.user.model.User; +import ru.practicum.shareit.user.repository.UserRepository; + +@Slf4j +@Service +@AllArgsConstructor +public class UserServiceImpl implements UserService { + + private final UserRepository userRepository; + + @Override + public UserDto getUserById(Long userId) { + log.info("Запрос пользователя с ID = {}", userId); + User userById = userRepository.getUserById(userId); + return UserMapper.toUserDto(userById); + } + + @Override + public UserDto createUser(UserDto userDto) { + log.info("Создание пользователя"); + checkEmail(userDto.getEmail()); + return UserMapper.toUserDto(userRepository.createUser(UserMapper.toUser(userDto, getNewUserId()))); + } + + @Override + public UserDto updateUser(UserDto userDto, Long userId) { + log.info("Обновление пользователя с ID = {}", userId); + User findUser = userRepository.getUserById(userId); + if (userDto.getEmail() != null) checkEmail(userDto.getEmail()); + findUser.setEmail(userDto.getEmail() != null ? userDto.getEmail() : findUser.getEmail()); + findUser.setName(userDto.getName() != null ? userDto.getName() : findUser.getName()); + return UserMapper.toUserDto(userRepository.updateUser(findUser)); + } + + @Override + public void deleteUserById(Long userId) { + log.info("Удаление пользователя с ID = {}", userId); + userRepository.deleteUserById(userId); + } + + private Long getNewUserId() { + return userRepository.getUsers().stream() + .map(User::getId) + .max(Long::compareTo) + .orElse(0L) + 1; + } + + private void checkEmail(String email) { + if (userRepository.getUsers().stream() + .map(User::getEmail) + .anyMatch(email::equals)) { + throw new AlreadyExistException("Пользователь с почтой " + email + " уже существует"); + } + } +} From b11c48b5f399758152b4fff68a3bbfafc8ae0f0e Mon Sep 17 00:00:00 2001 From: "vladimir.vasiliev" Date: Thu, 7 Aug 2025 08:49:01 +0300 Subject: [PATCH 2/3] =?UTF-8?q?add-controllers.=20=D0=A0=D0=B5=D0=B2=D1=8C?= =?UTF-8?q?=D1=8E.=20=D0=98=D1=81=D0=BF=D1=80=D0=B0=D0=B2=D0=B8=D1=82?= =?UTF-8?q?=D1=8C=20=D0=BB=D0=BE=D0=B3=D0=B8=D0=BA=D1=83=20=D0=BF=D1=80?= =?UTF-8?q?=D0=BE=D0=B2=D0=B5=D1=80=D0=BA=D0=B8=20=D1=81=D1=83=D1=89=D0=B5?= =?UTF-8?q?=D1=81=D1=82=D0=B2=D0=BE=D0=B2=D0=B0=D0=BD=D0=B8=D1=8F=20=D0=BE?= =?UTF-8?q?=D0=B1=D1=8A=D0=B5=D0=BA=D1=82=D0=B0.=20=D0=94=D0=BE=D0=BF?= =?UTF-8?q?=D0=BE=D0=BB=D0=BD=D0=B8=D1=82=D1=8C=20=D1=83=D1=81=D0=BB=D0=BE?= =?UTF-8?q?=D0=B2=D0=B8=D1=8F=20=D0=BE=D0=B1=D0=BD=D0=BE=D0=B2=D0=BB=D0=B5?= =?UTF-8?q?=D0=BD=D0=B8=D1=8F=20=D0=BF=D0=BE=D0=BB=D0=B5=D0=B9.=20=D0=A4?= =?UTF-8?q?=D0=BE=D1=80=D0=BC=D0=B8=D1=80=D0=BE=D0=B2=D0=B0=D0=BD=D0=B8?= =?UTF-8?q?=D0=B5=20=D0=BD=D0=BE=D0=B2=D0=BE=D0=B3=D0=BE=20ID=20=D0=B2?= =?UTF-8?q?=D1=8B=D0=BD=D0=B5=D1=81=D1=82=D0=B8=20=D0=B2=20=D1=80=D0=B5?= =?UTF-8?q?=D0=BF=D0=BE=D0=B7=D0=B8=D1=82=D0=BE=D1=80=D0=B8=D0=B9.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../item/repository/ItemRepository.java | 5 ++- .../item/repository/ItemRepositoryImpl.java | 17 ++++---- .../shareit/item/service/ItemServiceImpl.java | 33 ++++++++------- .../user/repository/UserRepository.java | 7 +++- .../user/repository/UserRepositoryImpl.java | 30 +++++++------ .../shareit/user/service/UserServiceImpl.java | 42 +++++++++---------- 6 files changed, 73 insertions(+), 61 deletions(-) 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 2cc3102..d032bf5 100644 --- a/src/main/java/ru/practicum/shareit/item/repository/ItemRepository.java +++ b/src/main/java/ru/practicum/shareit/item/repository/ItemRepository.java @@ -3,6 +3,7 @@ import ru.practicum.shareit.item.model.Item; import java.util.List; +import java.util.Optional; public interface ItemRepository { @@ -14,7 +15,9 @@ public interface ItemRepository { Item updateItem(Item item); - Item getItemById(Long itemId); + Optional getItemById(Long itemId); List searchItemsByText(String text); + + Long getNewItemId(); } diff --git a/src/main/java/ru/practicum/shareit/item/repository/ItemRepositoryImpl.java b/src/main/java/ru/practicum/shareit/item/repository/ItemRepositoryImpl.java index 2125e14..7a20d19 100644 --- a/src/main/java/ru/practicum/shareit/item/repository/ItemRepositoryImpl.java +++ b/src/main/java/ru/practicum/shareit/item/repository/ItemRepositoryImpl.java @@ -1,7 +1,6 @@ package ru.practicum.shareit.item.repository; import org.springframework.stereotype.Repository; -import ru.practicum.shareit.exception.NotFoundException; import ru.practicum.shareit.item.model.Item; import java.util.*; @@ -36,8 +35,8 @@ public Item updateItem(Item item) { } @Override - public Item getItemById(Long itemId) { - return getItemByIdWithCheck(itemId); + public Optional getItemById(Long itemId) { + return Optional.ofNullable(items.get(itemId)); } @Override @@ -52,11 +51,11 @@ private Boolean containsIgnoreCase(String text, String containsText) { return text.toLowerCase().contains(containsText.toLowerCase()); } - private Item getItemByIdWithCheck(Long itemId) { - Item itemById = items.get(itemId); - if (itemById == null) { - throw new NotFoundException("Вещь с ID = " + itemId + " не найдена."); - } - return itemById; + @Override + public Long getNewItemId() { + return getItems().stream() + .map(Item::getId) + .max(Long::compareTo) + .orElse(0L) + 1; } } 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 f5d61a2..9c839fd 100644 --- a/src/main/java/ru/practicum/shareit/item/service/ItemServiceImpl.java +++ b/src/main/java/ru/practicum/shareit/item/service/ItemServiceImpl.java @@ -4,6 +4,7 @@ import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; import ru.practicum.shareit.exception.NotAccessException; +import ru.practicum.shareit.exception.NotFoundException; import ru.practicum.shareit.item.dto.ItemDto; import ru.practicum.shareit.item.mapper.ItemMapper; import ru.practicum.shareit.item.model.Item; @@ -27,7 +28,8 @@ public class ItemServiceImpl implements ItemService { @Override public List getItemsByUserId(Long userId) { log.info("Поиск вещей пользователя с ID = {}", userId); - userRepository.getUserById(userId); + userRepository.getUserById(userId) + .orElseThrow(() -> new NotFoundException("Пользователь с ID = " + userId + " не найден")); List itemsByUserId = itemRepository.getItemsByUserId(userId); return itemsByUserId.stream() .map(ItemMapper::toItemDto) @@ -37,19 +39,26 @@ public List getItemsByUserId(Long userId) { @Override public ItemDto createItem(ItemDto itemDto, Long userId) { log.info("Создание вещи у пользователя с ID = {}", userId); - User user = userRepository.getUserById(userId); + User user = userRepository.getUserById(userId) + .orElseThrow(() -> new NotFoundException("Пользователь с ID = " + userId + " не найден")); return ItemMapper.toItemDto( - itemRepository.createItem(ItemMapper.toItem(getNewItemId(), itemDto, user, null))); + itemRepository.createItem( + ItemMapper.toItem( + itemRepository.getNewItemId(), itemDto, user, null))); } @Override public ItemDto updateItem(ItemDto itemDto, Long itemId, Long userId) { log.info("Обновление вещи у пользователя с ID = {}", userId); - Item findItem = itemRepository.getItemById(itemId); + Item findItem = itemRepository.getItemById(itemId) + .orElseThrow(() -> new NotFoundException("Вещь с ID = " + itemId + " не найдена")); checkUser(findItem, userId); - userRepository.getUserById(userId); - findItem.setName(itemDto.getName() != null ? itemDto.getName() : findItem.getName()); - findItem.setDescription(itemDto.getDescription() != null ? itemDto.getDescription() : findItem.getDescription()); + userRepository.getUserById(userId) + .orElseThrow(() -> new NotFoundException("Пользователь с ID = " + userId + " не найден")); + findItem.setName(itemDto.getName() == null || itemDto.getName().isBlank() ? + findItem.getName() : itemDto.getName()); + findItem.setDescription(itemDto.getDescription() == null || itemDto.getDescription().isBlank() ? + findItem.getDescription() : itemDto.getDescription()); findItem.setAvailable(itemDto.getAvailable() != null ? itemDto.getAvailable() : findItem.getAvailable()); return ItemMapper.toItemDto(itemRepository.updateItem(findItem)); } @@ -57,7 +66,8 @@ public ItemDto updateItem(ItemDto itemDto, Long itemId, Long userId) { @Override public ItemDto getItemById(Long itemId) { log.info("Запрос вещи с ID = {}", itemId); - Item item = itemRepository.getItemById(itemId); + Item item = itemRepository.getItemById(itemId) + .orElseThrow(() -> new NotFoundException("Вещь с ID = " + itemId + " не найдена")); return ItemMapper.toItemDto(item); } @@ -78,11 +88,4 @@ private void checkUser(Item item, Long userIdFromRequest) { } } - private Long getNewItemId() { - return itemRepository.getItems().stream() - .map(Item::getId) - .max(Long::compareTo) - .orElse(0L) + 1; - } - } diff --git a/src/main/java/ru/practicum/shareit/user/repository/UserRepository.java b/src/main/java/ru/practicum/shareit/user/repository/UserRepository.java index 39f3852..e10c5e2 100644 --- a/src/main/java/ru/practicum/shareit/user/repository/UserRepository.java +++ b/src/main/java/ru/practicum/shareit/user/repository/UserRepository.java @@ -3,16 +3,21 @@ import ru.practicum.shareit.user.model.User; import java.util.List; +import java.util.Optional; public interface UserRepository { List getUsers(); - User getUserById(Long userId); + Optional getUserById(Long userId); User createUser(User user); User updateUser(User user); void deleteUserById(Long userId); + + Long getNewUserId(); + + void checkEmail(String email); } diff --git a/src/main/java/ru/practicum/shareit/user/repository/UserRepositoryImpl.java b/src/main/java/ru/practicum/shareit/user/repository/UserRepositoryImpl.java index 4415935..6360fe5 100644 --- a/src/main/java/ru/practicum/shareit/user/repository/UserRepositoryImpl.java +++ b/src/main/java/ru/practicum/shareit/user/repository/UserRepositoryImpl.java @@ -1,13 +1,10 @@ package ru.practicum.shareit.user.repository; import org.springframework.stereotype.Repository; -import ru.practicum.shareit.exception.NotFoundException; +import ru.practicum.shareit.exception.AlreadyExistException; import ru.practicum.shareit.user.model.User; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; +import java.util.*; @Repository public class UserRepositoryImpl implements UserRepository { @@ -20,8 +17,8 @@ public List getUsers() { } @Override - public User getUserById(Long userId) { - return getUserByIdWithCheck(userId); + public Optional getUserById(Long userId) { + return Optional.ofNullable(users.get(userId)); } @Override @@ -41,11 +38,20 @@ public void deleteUserById(Long userId) { users.remove(userId); } - private User getUserByIdWithCheck(Long userId) { - User userById = users.get(userId); - if (userById == null) { - throw new NotFoundException("Пользователь с ID = " + userId + " не найден."); + @Override + public Long getNewUserId() { + return getUsers().stream() + .map(User::getId) + .max(Long::compareTo) + .orElse(0L) + 1; + } + + @Override + public void checkEmail(String email) { + if (getUsers().stream() + .map(User::getEmail) + .anyMatch(email::equals)) { + throw new AlreadyExistException("Пользователь с почтой " + email + " уже существует"); } - return userById; } } diff --git a/src/main/java/ru/practicum/shareit/user/service/UserServiceImpl.java b/src/main/java/ru/practicum/shareit/user/service/UserServiceImpl.java index a423037..7cc45b7 100644 --- a/src/main/java/ru/practicum/shareit/user/service/UserServiceImpl.java +++ b/src/main/java/ru/practicum/shareit/user/service/UserServiceImpl.java @@ -3,7 +3,7 @@ import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; -import ru.practicum.shareit.exception.AlreadyExistException; +import ru.practicum.shareit.exception.NotFoundException; import ru.practicum.shareit.user.dto.UserDto; import ru.practicum.shareit.user.mapper.UserMapper; import ru.practicum.shareit.user.model.User; @@ -19,45 +19,41 @@ public class UserServiceImpl implements UserService { @Override public UserDto getUserById(Long userId) { log.info("Запрос пользователя с ID = {}", userId); - User userById = userRepository.getUserById(userId); + User userById = userRepository.getUserById(userId) + .orElseThrow(() -> new NotFoundException("Пользователь с ID = " + userId + " не найден")); return UserMapper.toUserDto(userById); } @Override public UserDto createUser(UserDto userDto) { log.info("Создание пользователя"); - checkEmail(userDto.getEmail()); - return UserMapper.toUserDto(userRepository.createUser(UserMapper.toUser(userDto, getNewUserId()))); + userRepository.checkEmail(userDto.getEmail()); + return UserMapper.toUserDto( + userRepository.createUser( + UserMapper.toUser( + userDto, userRepository.getNewUserId()))); } @Override public UserDto updateUser(UserDto userDto, Long userId) { log.info("Обновление пользователя с ID = {}", userId); - User findUser = userRepository.getUserById(userId); - if (userDto.getEmail() != null) checkEmail(userDto.getEmail()); - findUser.setEmail(userDto.getEmail() != null ? userDto.getEmail() : findUser.getEmail()); - findUser.setName(userDto.getName() != null ? userDto.getName() : findUser.getName()); + User findUser = userRepository.getUserById(userId) + .orElseThrow(() -> new NotFoundException("Пользователь с ID = " + userId + " не найден")); + if (userDto.getEmail() != null && !userDto.getEmail().equals(findUser.getEmail())) { + userRepository.checkEmail(userDto.getEmail()); + } + findUser.setEmail(userDto.getEmail() == null || userDto.getEmail().isBlank() ? + findUser.getEmail() : userDto.getEmail()); + findUser.setName(userDto.getName() == null || userDto.getName().isBlank() ? + findUser.getName() : userDto.getName()); return UserMapper.toUserDto(userRepository.updateUser(findUser)); } @Override public void deleteUserById(Long userId) { log.info("Удаление пользователя с ID = {}", userId); + userRepository.getUserById(userId) + .orElseThrow(() -> new NotFoundException("Пользователь с ID = " + userId + " не найден")); userRepository.deleteUserById(userId); } - - private Long getNewUserId() { - return userRepository.getUsers().stream() - .map(User::getId) - .max(Long::compareTo) - .orElse(0L) + 1; - } - - private void checkEmail(String email) { - if (userRepository.getUsers().stream() - .map(User::getEmail) - .anyMatch(email::equals)) { - throw new AlreadyExistException("Пользователь с почтой " + email + " уже существует"); - } - } } From b2566a8415ab6ed8e2f69909e08bfc3992e2ee29 Mon Sep 17 00:00:00 2001 From: "vladimir.vasiliev" Date: Thu, 7 Aug 2025 15:18:21 +0300 Subject: [PATCH 3/3] =?UTF-8?q?add-controllers.=20=D0=A0=D0=B5=D0=B2=D1=8C?= =?UTF-8?q?=D1=8E.=20=D0=9C=D0=B5=D1=82=D0=BE=D0=B4=20=D0=BF=D0=BE=20?= =?UTF-8?q?=D0=BF=D0=BE=D0=BB=D1=83=D1=87=D0=B5=D0=BD=D0=B8=D1=8E=20ID=20?= =?UTF-8?q?=D0=B4=D0=BB=D1=8F=20=D0=BD=D0=BE=D0=B2=D0=BE=D0=B9=20=D1=81?= =?UTF-8?q?=D1=83=D1=89=D0=BD=D0=BE=D1=81=D1=82=D0=B8=20=D1=81=D0=B4=D0=B5?= =?UTF-8?q?=D0=BB=D0=B0=D1=82=D1=8C=20=D0=B2=D0=BD=D1=83=D1=82=D1=80=D0=B5?= =?UTF-8?q?=D0=BD=D0=BD=D0=B8=D0=BC.=20=D0=92=D1=8B=D0=BD=D0=B5=D1=81?= =?UTF-8?q?=D1=82=D0=B8=20=D0=BF=D0=BE=D0=BB=D1=83=D1=87=D0=B5=D0=BD=D0=B8?= =?UTF-8?q?=D0=B5=20=D0=BF=D0=BE=D0=BB=D1=8C=D0=B7=D0=BE=D0=B2=D0=B0=D1=82?= =?UTF-8?q?=D0=B5=D0=BB=D1=8F=20=D0=B8=20=D0=B2=D0=B5=D1=89=D0=B8=20=D1=81?= =?UTF-8?q?=20=D0=BF=D1=80=D0=BE=D0=B2=D0=B5=D1=80=D0=BA=D0=BE=D0=B9=20?= =?UTF-8?q?=D0=BD=D0=B0=20=D1=81=D1=83=D1=89=D0=B5=D1=81=D1=82=D0=B2=D0=BE?= =?UTF-8?q?=D0=B2=D0=B0=D0=BD=D0=B8=D0=B5=20=D0=B2=20=D0=BE=D1=82=D0=B4?= =?UTF-8?q?=D0=B5=D0=BB=D1=8C=D0=BD=D1=8B=D0=B9=20=D0=BC=D0=B5=D1=82=D0=BE?= =?UTF-8?q?=D0=B4.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../shareit/item/mapper/ItemMapper.java | 3 +- .../ru/practicum/shareit/item/model/Item.java | 8 +++++ .../item/repository/ItemRepository.java | 3 -- .../item/repository/ItemRepositoryImpl.java | 14 +++------ .../shareit/item/service/ItemServiceImpl.java | 30 ++++++++++--------- .../shareit/user/mapper/UserMapper.java | 3 +- .../ru/practicum/shareit/user/model/User.java | 5 ++++ .../user/repository/UserRepository.java | 2 -- .../user/repository/UserRepositoryImpl.java | 17 +++++------ .../shareit/user/service/UserService.java | 3 ++ .../shareit/user/service/UserServiceImpl.java | 18 ++++++----- 11 files changed, 56 insertions(+), 50 deletions(-) diff --git a/src/main/java/ru/practicum/shareit/item/mapper/ItemMapper.java b/src/main/java/ru/practicum/shareit/item/mapper/ItemMapper.java index 0a5a44b..76264bf 100644 --- a/src/main/java/ru/practicum/shareit/item/mapper/ItemMapper.java +++ b/src/main/java/ru/practicum/shareit/item/mapper/ItemMapper.java @@ -17,9 +17,8 @@ public static ItemDto toItemDto(Item item) { ); } - public static Item toItem(Long itemId, ItemDto itemDto, User owner, ItemRequest request) { + public static Item toItem(ItemDto itemDto, User owner, ItemRequest request) { return new Item( - itemId, itemDto.getName(), itemDto.getDescription(), itemDto.getAvailable(), diff --git a/src/main/java/ru/practicum/shareit/item/model/Item.java b/src/main/java/ru/practicum/shareit/item/model/Item.java index ba36b4d..69e581b 100644 --- a/src/main/java/ru/practicum/shareit/item/model/Item.java +++ b/src/main/java/ru/practicum/shareit/item/model/Item.java @@ -15,4 +15,12 @@ public class Item { private Boolean available; private User owner; private ItemRequest request; + + public Item(String name, String description, Boolean available, User owner, ItemRequest request) { + this.name = name; + this.description = description; + this.available = available; + this.owner = owner; + this.request = request; + } } 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 d032bf5..73c780d 100644 --- a/src/main/java/ru/practicum/shareit/item/repository/ItemRepository.java +++ b/src/main/java/ru/practicum/shareit/item/repository/ItemRepository.java @@ -7,8 +7,6 @@ public interface ItemRepository { - List getItems(); - List getItemsByUserId(Long userId); Item createItem(Item item); @@ -19,5 +17,4 @@ public interface ItemRepository { List searchItemsByText(String text); - Long getNewItemId(); } diff --git a/src/main/java/ru/practicum/shareit/item/repository/ItemRepositoryImpl.java b/src/main/java/ru/practicum/shareit/item/repository/ItemRepositoryImpl.java index 7a20d19..297c005 100644 --- a/src/main/java/ru/practicum/shareit/item/repository/ItemRepositoryImpl.java +++ b/src/main/java/ru/practicum/shareit/item/repository/ItemRepositoryImpl.java @@ -8,12 +8,7 @@ @Repository public class ItemRepositoryImpl implements ItemRepository { - private Map items = new HashMap<>(); - - @Override - public List getItems() { - return new ArrayList<>(items.values()); - } + private final Map items = new HashMap<>(); @Override public List getItemsByUserId(Long userId) { @@ -24,6 +19,7 @@ public List getItemsByUserId(Long userId) { @Override public Item createItem(Item item) { + item.setId(getNewItemId()); items.put(item.getId(), item); return items.get(item.getId()); } @@ -51,10 +47,8 @@ private Boolean containsIgnoreCase(String text, String containsText) { return text.toLowerCase().contains(containsText.toLowerCase()); } - @Override - public Long getNewItemId() { - return getItems().stream() - .map(Item::getId) + private Long getNewItemId() { + return items.keySet().stream() .max(Long::compareTo) .orElse(0L) + 1; } 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 9c839fd..95ddca5 100644 --- a/src/main/java/ru/practicum/shareit/item/service/ItemServiceImpl.java +++ b/src/main/java/ru/practicum/shareit/item/service/ItemServiceImpl.java @@ -10,7 +10,7 @@ import ru.practicum.shareit.item.model.Item; import ru.practicum.shareit.item.repository.ItemRepository; import ru.practicum.shareit.user.model.User; -import ru.practicum.shareit.user.repository.UserRepository; +import ru.practicum.shareit.user.service.UserService; import java.util.ArrayList; import java.util.List; @@ -22,52 +22,54 @@ public class ItemServiceImpl implements ItemService { private final ItemRepository itemRepository; - private final UserRepository userRepository; + private final UserService userService; @Override public List getItemsByUserId(Long userId) { log.info("Поиск вещей пользователя с ID = {}", userId); - userRepository.getUserById(userId) - .orElseThrow(() -> new NotFoundException("Пользователь с ID = " + userId + " не найден")); + userService.getUserWithCheck(userId); List itemsByUserId = itemRepository.getItemsByUserId(userId); return itemsByUserId.stream() .map(ItemMapper::toItemDto) .toList(); } + public Item getItemWithCheck(Long itemId) { + return itemRepository.getItemById(itemId) + .orElseThrow(() -> new NotFoundException("Вещь с ID = " + itemId + " не найдена")); + } + @Override public ItemDto createItem(ItemDto itemDto, Long userId) { log.info("Создание вещи у пользователя с ID = {}", userId); - User user = userRepository.getUserById(userId) - .orElseThrow(() -> new NotFoundException("Пользователь с ID = " + userId + " не найден")); + User user = userService.getUserWithCheck(userId); return ItemMapper.toItemDto( itemRepository.createItem( - ItemMapper.toItem( - itemRepository.getNewItemId(), itemDto, user, null))); + ItemMapper.toItem(itemDto, user, null))); } @Override public ItemDto updateItem(ItemDto itemDto, Long itemId, Long userId) { log.info("Обновление вещи у пользователя с ID = {}", userId); - Item findItem = itemRepository.getItemById(itemId) - .orElseThrow(() -> new NotFoundException("Вещь с ID = " + itemId + " не найдена")); + + Item findItem = getItemWithCheck(itemId); checkUser(findItem, userId); - userRepository.getUserById(userId) - .orElseThrow(() -> new NotFoundException("Пользователь с ID = " + userId + " не найден")); + userService.getUserWithCheck(userId); + findItem.setName(itemDto.getName() == null || itemDto.getName().isBlank() ? findItem.getName() : itemDto.getName()); findItem.setDescription(itemDto.getDescription() == null || itemDto.getDescription().isBlank() ? findItem.getDescription() : itemDto.getDescription()); findItem.setAvailable(itemDto.getAvailable() != null ? itemDto.getAvailable() : findItem.getAvailable()); + return ItemMapper.toItemDto(itemRepository.updateItem(findItem)); } @Override public ItemDto getItemById(Long itemId) { log.info("Запрос вещи с ID = {}", itemId); - Item item = itemRepository.getItemById(itemId) - .orElseThrow(() -> new NotFoundException("Вещь с ID = " + itemId + " не найдена")); + Item item = getItemWithCheck(itemId); return ItemMapper.toItemDto(item); } diff --git a/src/main/java/ru/practicum/shareit/user/mapper/UserMapper.java b/src/main/java/ru/practicum/shareit/user/mapper/UserMapper.java index f83c72e..b1350ed 100644 --- a/src/main/java/ru/practicum/shareit/user/mapper/UserMapper.java +++ b/src/main/java/ru/practicum/shareit/user/mapper/UserMapper.java @@ -12,9 +12,8 @@ public static UserDto toUserDto(User user) { ); } - public static User toUser(UserDto user, Long userId) { + public static User toUser(UserDto user) { return new User( - userId, user.getName(), user.getEmail() ); diff --git a/src/main/java/ru/practicum/shareit/user/model/User.java b/src/main/java/ru/practicum/shareit/user/model/User.java index ed5e80e..c3779e3 100644 --- a/src/main/java/ru/practicum/shareit/user/model/User.java +++ b/src/main/java/ru/practicum/shareit/user/model/User.java @@ -9,4 +9,9 @@ public class User { private Long id; private String name; private String email; + + public User(String name, String email) { + this.name = name; + this.email = email; + } } diff --git a/src/main/java/ru/practicum/shareit/user/repository/UserRepository.java b/src/main/java/ru/practicum/shareit/user/repository/UserRepository.java index e10c5e2..820e66f 100644 --- a/src/main/java/ru/practicum/shareit/user/repository/UserRepository.java +++ b/src/main/java/ru/practicum/shareit/user/repository/UserRepository.java @@ -17,7 +17,5 @@ public interface UserRepository { void deleteUserById(Long userId); - Long getNewUserId(); - void checkEmail(String email); } diff --git a/src/main/java/ru/practicum/shareit/user/repository/UserRepositoryImpl.java b/src/main/java/ru/practicum/shareit/user/repository/UserRepositoryImpl.java index 6360fe5..d52efba 100644 --- a/src/main/java/ru/practicum/shareit/user/repository/UserRepositoryImpl.java +++ b/src/main/java/ru/practicum/shareit/user/repository/UserRepositoryImpl.java @@ -9,7 +9,7 @@ @Repository public class UserRepositoryImpl implements UserRepository { - private Map users = new HashMap<>(); + private final Map users = new HashMap<>(); @Override public List getUsers() { @@ -23,6 +23,7 @@ public Optional getUserById(Long userId) { @Override public User createUser(User user) { + user.setId(getNewUserId()); users.put(user.getId(), user); return users.get(user.getId()); } @@ -38,14 +39,6 @@ public void deleteUserById(Long userId) { users.remove(userId); } - @Override - public Long getNewUserId() { - return getUsers().stream() - .map(User::getId) - .max(Long::compareTo) - .orElse(0L) + 1; - } - @Override public void checkEmail(String email) { if (getUsers().stream() @@ -54,4 +47,10 @@ public void checkEmail(String email) { throw new AlreadyExistException("Пользователь с почтой " + email + " уже существует"); } } + + private Long getNewUserId() { + return users.keySet().stream() + .max(Long::compareTo) + .orElse(0L) + 1; + } } diff --git a/src/main/java/ru/practicum/shareit/user/service/UserService.java b/src/main/java/ru/practicum/shareit/user/service/UserService.java index b1773f8..045ba1a 100644 --- a/src/main/java/ru/practicum/shareit/user/service/UserService.java +++ b/src/main/java/ru/practicum/shareit/user/service/UserService.java @@ -1,11 +1,14 @@ package ru.practicum.shareit.user.service; import ru.practicum.shareit.user.dto.UserDto; +import ru.practicum.shareit.user.model.User; public interface UserService { UserDto getUserById(Long userId); + User getUserWithCheck(Long userId); + UserDto createUser(UserDto user); UserDto updateUser(UserDto user, Long userId); diff --git a/src/main/java/ru/practicum/shareit/user/service/UserServiceImpl.java b/src/main/java/ru/practicum/shareit/user/service/UserServiceImpl.java index 7cc45b7..8cc1711 100644 --- a/src/main/java/ru/practicum/shareit/user/service/UserServiceImpl.java +++ b/src/main/java/ru/practicum/shareit/user/service/UserServiceImpl.java @@ -19,26 +19,29 @@ public class UserServiceImpl implements UserService { @Override public UserDto getUserById(Long userId) { log.info("Запрос пользователя с ID = {}", userId); - User userById = userRepository.getUserById(userId) - .orElseThrow(() -> new NotFoundException("Пользователь с ID = " + userId + " не найден")); + User userById = getUserWithCheck(userId); return UserMapper.toUserDto(userById); } + @Override + public User getUserWithCheck(Long userId) { + return userRepository.getUserById(userId) + .orElseThrow(() -> new NotFoundException("Пользователь с ID = " + userId + " не найден")); + } + @Override public UserDto createUser(UserDto userDto) { log.info("Создание пользователя"); userRepository.checkEmail(userDto.getEmail()); return UserMapper.toUserDto( userRepository.createUser( - UserMapper.toUser( - userDto, userRepository.getNewUserId()))); + UserMapper.toUser(userDto))); } @Override public UserDto updateUser(UserDto userDto, Long userId) { log.info("Обновление пользователя с ID = {}", userId); - User findUser = userRepository.getUserById(userId) - .orElseThrow(() -> new NotFoundException("Пользователь с ID = " + userId + " не найден")); + User findUser = getUserWithCheck(userId); if (userDto.getEmail() != null && !userDto.getEmail().equals(findUser.getEmail())) { userRepository.checkEmail(userDto.getEmail()); } @@ -52,8 +55,7 @@ public UserDto updateUser(UserDto userDto, Long userId) { @Override public void deleteUserById(Long userId) { log.info("Удаление пользователя с ID = {}", userId); - userRepository.getUserById(userId) - .orElseThrow(() -> new NotFoundException("Пользователь с ID = " + userId + " не найден")); + getUserWithCheck(userId); userRepository.deleteUserById(userId); } }