From 79339d9a843214eb866f265a7c23b5e6e211a7f9 Mon Sep 17 00:00:00 2001 From: Denis Panasyuk Date: Thu, 12 Feb 2026 18:13:07 +0300 Subject: [PATCH 1/8] =?UTF-8?q?=D0=9D=D0=B0=D0=BF=D0=B8=D1=81=D0=B0=D0=BD?= =?UTF-8?q?=D0=B0=20=D0=BF=D0=B5=D1=80=D0=B2=D0=B0=D1=8F=20=D1=80=D0=B5?= =?UTF-8?q?=D0=B0=D0=BB=D0=B8=D0=B7=D0=B0=D1=86=D0=B8=D1=8F=20=D1=84=D1=83?= =?UTF-8?q?=D0=BD=D0=BA=D1=86=D0=B8=D0=BE=D0=BD=D0=B0=D0=BB=D0=B0=20=D1=84?= =?UTF-8?q?=D0=B7?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ru/practicum/shareit/booking/Booking.java | 15 ++++ .../shareit/booking/BookingMapper.java | 17 ++++ .../shareit/booking/BookingStatus.java | 8 ++ .../shareit/booking/dto/BookingDto.java | 13 ++++ .../shareit/exceptions/NotFoundException.java | 6 ++ .../java/ru/practicum/shareit/item/Item.java | 32 ++++++++ .../shareit/item/ItemController.java | 37 ++++++++- .../ru/practicum/shareit/item/ItemStatus.java | 6 ++ .../shareit/item/dao/InMemoryItemStorage.java | 77 +++++++++++++++++++ .../shareit/item/dao/ItemMapper.java | 18 +++++ .../practicum/shareit/item/dto/ItemDto.java | 11 +++ .../ru/practicum/shareit/item/model/Item.java | 7 -- .../shareit/item/service/ItemService.java | 20 +++++ .../shareit/item/service/ItemServiceImpl.java | 44 +++++++++++ .../shareit/request/ItemRequest.java | 14 ++++ .../shareit/request/ItemRequestMapper.java | 15 ++++ .../shareit/request/dto/ItemRequestDto.java | 11 +++ .../java/ru/practicum/shareit/user/User.java | 14 ++++ .../shareit/user/UserController.java | 40 +++++++++- .../ru/practicum/shareit/user/UserMapper.java | 15 ++++ .../practicum/shareit/user/UserService.java | 18 +++++ .../shareit/user/UserServiceImpl.java | 42 ++++++++++ .../shareit/user/dao/InMemoryUserStorage.java | 69 +++++++++++++++++ .../practicum/shareit/user/dto/UserDto.java | 16 ++++ 24 files changed, 554 insertions(+), 11 deletions(-) create mode 100644 src/main/java/ru/practicum/shareit/booking/BookingMapper.java create mode 100644 src/main/java/ru/practicum/shareit/booking/BookingStatus.java create mode 100644 src/main/java/ru/practicum/shareit/exceptions/NotFoundException.java create mode 100644 src/main/java/ru/practicum/shareit/item/Item.java create mode 100644 src/main/java/ru/practicum/shareit/item/ItemStatus.java create mode 100644 src/main/java/ru/practicum/shareit/item/dao/InMemoryItemStorage.java create mode 100644 src/main/java/ru/practicum/shareit/item/dao/ItemMapper.java delete mode 100644 src/main/java/ru/practicum/shareit/item/model/Item.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 create mode 100644 src/main/java/ru/practicum/shareit/request/ItemRequestMapper.java create mode 100644 src/main/java/ru/practicum/shareit/user/UserMapper.java create mode 100644 src/main/java/ru/practicum/shareit/user/UserService.java create mode 100644 src/main/java/ru/practicum/shareit/user/UserServiceImpl.java create mode 100644 src/main/java/ru/practicum/shareit/user/dao/InMemoryUserStorage.java create mode 100644 src/main/java/ru/practicum/shareit/user/dto/UserDto.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..2ce8160 100644 --- a/src/main/java/ru/practicum/shareit/booking/Booking.java +++ b/src/main/java/ru/practicum/shareit/booking/Booking.java @@ -1,7 +1,22 @@ package ru.practicum.shareit.booking; +import lombok.AllArgsConstructor; +import lombok.Data; +import ru.practicum.shareit.item.Item; +import ru.practicum.shareit.user.User; + +import java.time.LocalDate; + /** * TODO Sprint add-bookings. */ +@Data +@AllArgsConstructor public class Booking { + private Long id; + private LocalDate start; + private LocalDate end; + private Item item; + private User booker; + private BookingStatus status; } diff --git a/src/main/java/ru/practicum/shareit/booking/BookingMapper.java b/src/main/java/ru/practicum/shareit/booking/BookingMapper.java new file mode 100644 index 0000000..6ee5b49 --- /dev/null +++ b/src/main/java/ru/practicum/shareit/booking/BookingMapper.java @@ -0,0 +1,17 @@ +package ru.practicum.shareit.booking; + +import lombok.experimental.UtilityClass; +import ru.practicum.shareit.booking.dto.BookingDto; + +@UtilityClass +public class BookingMapper { + public static BookingDto mapToBooking(Booking booking) { + return new BookingDto( + booking.getStart(), + booking.getEnd(), + booking.getItem(), + booking.getBooker(), + booking.getStatus() + ); + } +} diff --git a/src/main/java/ru/practicum/shareit/booking/BookingStatus.java b/src/main/java/ru/practicum/shareit/booking/BookingStatus.java new file mode 100644 index 0000000..51269e0 --- /dev/null +++ b/src/main/java/ru/practicum/shareit/booking/BookingStatus.java @@ -0,0 +1,8 @@ +package ru.practicum.shareit.booking; + +public enum BookingStatus { + WAITING, + APPROVED, + REJECTED, + CANCELED +} diff --git a/src/main/java/ru/practicum/shareit/booking/dto/BookingDto.java b/src/main/java/ru/practicum/shareit/booking/dto/BookingDto.java index 861de9e..7dd94e6 100644 --- a/src/main/java/ru/practicum/shareit/booking/dto/BookingDto.java +++ b/src/main/java/ru/practicum/shareit/booking/dto/BookingDto.java @@ -1,7 +1,20 @@ package ru.practicum.shareit.booking.dto; +import lombok.AllArgsConstructor; +import ru.practicum.shareit.item.Item; +import ru.practicum.shareit.booking.BookingStatus; +import ru.practicum.shareit.user.User; + +import java.time.LocalDate; + /** * TODO Sprint add-bookings. */ +@AllArgsConstructor public class BookingDto { + private LocalDate start; + private LocalDate end; + private Item item; + private User booker; + private BookingStatus status; } diff --git a/src/main/java/ru/practicum/shareit/exceptions/NotFoundException.java b/src/main/java/ru/practicum/shareit/exceptions/NotFoundException.java new file mode 100644 index 0000000..1f8eb99 --- /dev/null +++ b/src/main/java/ru/practicum/shareit/exceptions/NotFoundException.java @@ -0,0 +1,6 @@ +package ru.practicum.shareit.exceptions; + +public class NotFoundException extends RuntimeException { + public NotFoundException(String s) { + } +} diff --git a/src/main/java/ru/practicum/shareit/item/Item.java b/src/main/java/ru/practicum/shareit/item/Item.java new file mode 100644 index 0000000..8f63b53 --- /dev/null +++ b/src/main/java/ru/practicum/shareit/item/Item.java @@ -0,0 +1,32 @@ +package ru.practicum.shareit.item; + +import jakarta.validation.Valid; +import jakarta.validation.constraints.NotNull; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import ru.practicum.shareit.request.ItemRequest; + +/** + * TODO Sprint add-controllers. + */ +@Data +@Valid +@AllArgsConstructor +public class Item { + @NotNull + private Long id; + private String name; + private String description; + private ItemStatus itemStatus; + private Long owner; + private ItemRequest request; + + public boolean isAvailable() { + return itemStatus == ItemStatus.AVAILABLE; + } + + public ItemRequest getRequest() { + return null; + } +} diff --git a/src/main/java/ru/practicum/shareit/item/ItemController.java b/src/main/java/ru/practicum/shareit/item/ItemController.java index bb17668..9922d6b 100644 --- a/src/main/java/ru/practicum/shareit/item/ItemController.java +++ b/src/main/java/ru/practicum/shareit/item/ItemController.java @@ -1,12 +1,45 @@ package ru.practicum.shareit.item; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; +import jakarta.websocket.server.PathParam; +import lombok.RequiredArgsConstructor; +import org.springframework.web.bind.annotation.*; +import ru.practicum.shareit.item.dto.ItemDto; +import ru.practicum.shareit.item.service.ItemService; + +import java.util.Collection; /** * TODO Sprint add-controllers. */ @RestController @RequestMapping("/items") +@RequiredArgsConstructor public class ItemController { + + private final ItemService itemService; + + @PostMapping + public ItemDto addItem(@RequestBody final Item item, @RequestHeader("X-Sharer-User-Id") long ownerId) { + return itemService.addItem(item, ownerId); + } + + @PatchMapping("/{itemId}") + public ItemDto updateItem(@PathVariable("itemId") final long itemId, @RequestHeader("X-Sharer-User-Id") long ownerId) { + return itemService.updateItem(itemId, ownerId); + } + + @GetMapping("/{itemId}") + public ItemDto getItem(@PathVariable("itemId") final long itemId, @RequestHeader("X-Sharer-User-Id") long ownerId) { + return itemService.getItem(itemId); + } + + @GetMapping + public Collection getAllOwnerItems(@RequestHeader("X-Sharer-User-Id") long ownerId) { + return itemService.getAllOwnerItems(ownerId); + } + + @GetMapping("//search?text={text}") + public Collection getNecessaryItem(@RequestHeader("X-Sharer-User-Id") long ownerId, @RequestParam("text") String text) { + return itemService.getNecessaryItem(text); + } } diff --git a/src/main/java/ru/practicum/shareit/item/ItemStatus.java b/src/main/java/ru/practicum/shareit/item/ItemStatus.java new file mode 100644 index 0000000..ed9c525 --- /dev/null +++ b/src/main/java/ru/practicum/shareit/item/ItemStatus.java @@ -0,0 +1,6 @@ +package ru.practicum.shareit.item; + +public enum ItemStatus { + AVAILABLE, + UNAVAILABLE +} diff --git a/src/main/java/ru/practicum/shareit/item/dao/InMemoryItemStorage.java b/src/main/java/ru/practicum/shareit/item/dao/InMemoryItemStorage.java new file mode 100644 index 0000000..03bceea --- /dev/null +++ b/src/main/java/ru/practicum/shareit/item/dao/InMemoryItemStorage.java @@ -0,0 +1,77 @@ +package ru.practicum.shareit.item.dao; + + +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Repository; +import ru.practicum.shareit.exceptions.NotFoundException; +import ru.practicum.shareit.item.Item; +import ru.practicum.shareit.item.dto.ItemDto; + +import java.util.*; + +import static ru.practicum.shareit.item.dao.ItemMapper.mapToItem; + +@Slf4j +@Repository +public class InMemoryItemStorage { + private static Map items = new HashMap<>(); + + private Long getNextId() { + long currentMaxId = items.keySet() + .stream() + .mapToLong(id -> id) + .max() + .orElse(0); + return ++currentMaxId; + } + + public ItemDto addItem(Item item, long userId) { + item.setId(getNextId()); + item.setOwner(userId); + items.put(item.getId(), item); + return mapToItem(item); + } + + public ItemDto updateItem(long itemId, long userId) { + if (!items.containsKey(itemId)) { + log.warn("Пользователь с указанным id не найден"); + throw new NotFoundException("Пользователь с id = " + itemId + " не найден"); + } + Item item = items.get(itemId); + if (item.getOwner() != userId) { + log.warn("Только владелец может редактировать предмет"); + return null; + } + item.setName(items.get(itemId).getName()); + item.setDescription(items.get(itemId).getDescription()); + return mapToItem(item); + } + + public ItemDto getItem(long itemId) { + if (!items.containsKey(itemId)) { + log.warn("Пользователь с указанным id не найден"); + throw new NotFoundException("Пользователь с id = " + itemId + " не найден"); + } + return mapToItem(items.get(itemId)); + } + + public List getAllOwnerItems(long ownerId) { + List ownerItems = new ArrayList<>(); + for (Item item : items.values()) { + if (item.getOwner() == ownerId) { + ownerItems.add(mapToItem(item)); + } + } + return ownerItems; + } + + public List getNecessaryItem(String text) { + List necessaryItems = new ArrayList<>(); + for (Item item : items.values()) { + if (item.isAvailable() && item.getDescription().contains(text)) { + necessaryItems.add(mapToItem(item)); + } + } + return necessaryItems; + } +} diff --git a/src/main/java/ru/practicum/shareit/item/dao/ItemMapper.java b/src/main/java/ru/practicum/shareit/item/dao/ItemMapper.java new file mode 100644 index 0000000..a95efd6 --- /dev/null +++ b/src/main/java/ru/practicum/shareit/item/dao/ItemMapper.java @@ -0,0 +1,18 @@ +package ru.practicum.shareit.item.dao; + +import lombok.experimental.UtilityClass; +import ru.practicum.shareit.item.Item; +import ru.practicum.shareit.item.dto.ItemDto; + +@UtilityClass +public class ItemMapper { + public static ItemDto mapToItem(Item item) { + return new ItemDto( + item.getId(), + item.getName(), + item.getDescription(), + item.isAvailable(), + item.getRequest() != null ? item.getRequest().getId() : null + ); + } +} 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..66300e9 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,18 @@ package ru.practicum.shareit.item.dto; +import lombok.AllArgsConstructor; +import lombok.Data; +import ru.practicum.shareit.request.ItemRequest; + /** * TODO Sprint add-controllers. */ +@Data +@AllArgsConstructor public class ItemDto { + private Long id; + private String name; + private String description; + private Boolean available; + private Long requestId; } diff --git a/src/main/java/ru/practicum/shareit/item/model/Item.java b/src/main/java/ru/practicum/shareit/item/model/Item.java deleted file mode 100644 index 44eb73d..0000000 --- a/src/main/java/ru/practicum/shareit/item/model/Item.java +++ /dev/null @@ -1,7 +0,0 @@ -package ru.practicum.shareit.item.model; - -/** - * TODO Sprint add-controllers. - */ -public class Item { -} 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..4477768 --- /dev/null +++ b/src/main/java/ru/practicum/shareit/item/service/ItemService.java @@ -0,0 +1,20 @@ +package ru.practicum.shareit.item.service; + +import ru.practicum.shareit.item.Item; +import ru.practicum.shareit.item.dto.ItemDto; + +import java.util.Collection; +import java.util.List; + +public interface ItemService { + + ItemDto addItem(Item item, long userId); + + ItemDto updateItem(long itemId, long userId); + + ItemDto getItem(long itemId); + + List getAllOwnerItems(long ownerId); + + Collection getNecessaryItem(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..5567bad --- /dev/null +++ b/src/main/java/ru/practicum/shareit/item/service/ItemServiceImpl.java @@ -0,0 +1,44 @@ +package ru.practicum.shareit.item.service; + +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; +import ru.practicum.shareit.item.Item; +import ru.practicum.shareit.item.dao.InMemoryItemStorage; +import ru.practicum.shareit.item.dto.ItemDto; + +import java.util.Collection; +import java.util.List; + +@Slf4j +@Service +@RequiredArgsConstructor +public class ItemServiceImpl implements ItemService { + + private final InMemoryItemStorage inMemoryItemStorage; + + @Override + public ItemDto addItem(Item item, long userId) { + return inMemoryItemStorage.addItem(item, userId); + } + + @Override + public ItemDto updateItem(long itemId, long userId) { + return inMemoryItemStorage.updateItem(itemId, userId); + } + + @Override + public ItemDto getItem(long itemId) { + return inMemoryItemStorage.getItem(itemId); + } + + @Override + public List getAllOwnerItems(long ownerId) { + return inMemoryItemStorage.getAllOwnerItems(ownerId); + } + + @Override + public Collection getNecessaryItem(String text) { + return inMemoryItemStorage.getNecessaryItem(text); + } +} diff --git a/src/main/java/ru/practicum/shareit/request/ItemRequest.java b/src/main/java/ru/practicum/shareit/request/ItemRequest.java index 95d6f23..59ab433 100644 --- a/src/main/java/ru/practicum/shareit/request/ItemRequest.java +++ b/src/main/java/ru/practicum/shareit/request/ItemRequest.java @@ -1,7 +1,21 @@ package ru.practicum.shareit.request; +import jakarta.validation.Valid; +import jakarta.validation.constraints.NotNull; +import lombok.Data; +import ru.practicum.shareit.user.User; + +import java.time.LocalDate; + /** * TODO Sprint add-item-requests. */ +@Data +@Valid public class ItemRequest { + @NotNull + private Long id; + private String description; + private User requestor; + private LocalDate created; } 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..46c4b59 --- /dev/null +++ b/src/main/java/ru/practicum/shareit/request/ItemRequestMapper.java @@ -0,0 +1,15 @@ +package ru.practicum.shareit.request; + +import lombok.experimental.UtilityClass; +import ru.practicum.shareit.request.dto.ItemRequestDto; + +@UtilityClass +public class ItemRequestMapper { + public static ItemRequestDto mapToItemRequest(ItemRequest itemRequest) { + return new ItemRequestDto( + itemRequest.getDescription(), + itemRequest.getRequestor(), + itemRequest.getCreated() + ); + } +} 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..d393086 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,18 @@ package ru.practicum.shareit.request.dto; +import lombok.AllArgsConstructor; +import lombok.Data; +import ru.practicum.shareit.user.User; + +import java.time.LocalDate; + /** * TODO Sprint add-item-requests. */ +@Data +@AllArgsConstructor public class ItemRequestDto { + private String description; + private User requestor; + private LocalDate created; } diff --git a/src/main/java/ru/practicum/shareit/user/User.java b/src/main/java/ru/practicum/shareit/user/User.java index ae6e7f3..6f964b3 100644 --- a/src/main/java/ru/practicum/shareit/user/User.java +++ b/src/main/java/ru/practicum/shareit/user/User.java @@ -1,7 +1,21 @@ package ru.practicum.shareit.user; +import jakarta.validation.Valid; +import jakarta.validation.constraints.Email; +import jakarta.validation.constraints.NotNull; +import lombok.AllArgsConstructor; +import lombok.Data; + /** * TODO Sprint add-controllers. */ +@Data +@Valid +@AllArgsConstructor public class User { + private Long id; + private String name; + @Email(message = "Email should be valid") + @NotNull + private String email; } diff --git a/src/main/java/ru/practicum/shareit/user/UserController.java b/src/main/java/ru/practicum/shareit/user/UserController.java index 03039b9..38a3740 100644 --- a/src/main/java/ru/practicum/shareit/user/UserController.java +++ b/src/main/java/ru/practicum/shareit/user/UserController.java @@ -1,12 +1,48 @@ 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.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.web.bind.annotation.*; +import ru.practicum.shareit.user.dto.UserDto; + +import java.util.Collection; + /** * TODO Sprint add-controllers. */ +@Slf4j @RestController @RequestMapping(path = "/users") +@RequiredArgsConstructor public class UserController { + + private final UserServiceImpl userServiceImpl; + + @PostMapping + public UserDto addUser(@Valid @RequestBody final User user) { + return userServiceImpl.addUser(user); + } + + @PatchMapping("/{userId}") + public UserDto updateUser(@RequestBody final Long userId) { + return userServiceImpl.updateUser(userId); + } + + @GetMapping + public Collection getAllUsers() { + return userServiceImpl.getAllUsers(); + } + + @GetMapping("/{id}") + public UserDto getUser(@PathVariable final Long id) { + return userServiceImpl.getUser(id); + } + + @DeleteMapping("/{id}") + public void deleteUser(@PathVariable final Long id) { + log.info("Пользователь с id: {} удален", id); + userServiceImpl.deleteUser(id); + } } diff --git a/src/main/java/ru/practicum/shareit/user/UserMapper.java b/src/main/java/ru/practicum/shareit/user/UserMapper.java new file mode 100644 index 0000000..a44797e --- /dev/null +++ b/src/main/java/ru/practicum/shareit/user/UserMapper.java @@ -0,0 +1,15 @@ +package ru.practicum.shareit.user; + +import lombok.experimental.UtilityClass; +import ru.practicum.shareit.user.dto.UserDto; + +@UtilityClass +public class UserMapper { + public static UserDto mapToUser(User user) { + return new UserDto( + user.getId(), + user.getName(), + user.getEmail() + ); + } +} \ No newline at end of file diff --git a/src/main/java/ru/practicum/shareit/user/UserService.java b/src/main/java/ru/practicum/shareit/user/UserService.java new file mode 100644 index 0000000..e5e93b7 --- /dev/null +++ b/src/main/java/ru/practicum/shareit/user/UserService.java @@ -0,0 +1,18 @@ +package ru.practicum.shareit.user; + +import ru.practicum.shareit.user.dto.UserDto; + +import java.util.Collection; + +public interface UserService { + + UserDto addUser(User user); + + UserDto updateUser(Long id); + + Collection getAllUsers(); + + UserDto getUser(Long id); + + void deleteUser(Long id); +} diff --git a/src/main/java/ru/practicum/shareit/user/UserServiceImpl.java b/src/main/java/ru/practicum/shareit/user/UserServiceImpl.java new file mode 100644 index 0000000..75c298f --- /dev/null +++ b/src/main/java/ru/practicum/shareit/user/UserServiceImpl.java @@ -0,0 +1,42 @@ +package ru.practicum.shareit.user; + +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; +import ru.practicum.shareit.user.dao.InMemoryUserStorage; +import ru.practicum.shareit.user.dto.UserDto; + +import java.util.Collection; + +@Slf4j +@Service +@RequiredArgsConstructor +public class UserServiceImpl implements UserService{ + + private final InMemoryUserStorage inMemoryUserStorage; + + @Override + public UserDto addUser(User user) { + return inMemoryUserStorage.addUser(user); + } + + @Override + public UserDto updateUser(Long id) { + return inMemoryUserStorage.updateUser(id); + } + + @Override + public Collection getAllUsers() { + return inMemoryUserStorage.getAllUsers(); + } + + @Override + public UserDto getUser(Long id) { + return inMemoryUserStorage.getUser(id); + } + + @Override + public void deleteUser(Long id) { + inMemoryUserStorage.deleteUser(id); + } +} diff --git a/src/main/java/ru/practicum/shareit/user/dao/InMemoryUserStorage.java b/src/main/java/ru/practicum/shareit/user/dao/InMemoryUserStorage.java new file mode 100644 index 0000000..c449487 --- /dev/null +++ b/src/main/java/ru/practicum/shareit/user/dao/InMemoryUserStorage.java @@ -0,0 +1,69 @@ +package ru.practicum.shareit.user.dao; + +import jakarta.validation.ValidationException; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Component; +import ru.practicum.shareit.exceptions.NotFoundException; +import ru.practicum.shareit.user.User; +import ru.practicum.shareit.user.dto.UserDto; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import static ru.practicum.shareit.user.UserMapper.mapToUser; + +@Slf4j +@Component +public class InMemoryUserStorage { + private static Map users = new HashMap<>(); + + private Long getNextId() { + long currentMaxId = users.keySet() + .stream() + .mapToLong(id -> id) + .max() + .orElse(0); + return ++currentMaxId; + } + + public UserDto addUser(User user) { + for (User usr : users.values()) { + if (usr.getEmail().equals(user.getEmail())) { + throw new ValidationException("Нельзя добавить пользователя с одинаковыми почтами"); + } + } + user.setId(getNextId()); + users.put(user.getId(), user); + return mapToUser(user); + } + + public UserDto updateUser(Long userId) { + if (!users.containsKey(userId)) { + log.warn("Пользователь с указанным id не найден"); + throw new NotFoundException("Пользователь с id = " + userId + " не найден"); + } + User user = users.get(userId); + user.setEmail(user.getEmail()); + user.setName(user.getName()); + return mapToUser(user); + } + + public List getAllUsers() { + List dtoList = new ArrayList<>(); + for (User user : users.values()) { + dtoList.add(mapToUser(user)); + } + return dtoList; + } + + public UserDto getUser(Long id) { + User user = users.get(id); + return mapToUser(user); + } + + public void deleteUser(Long id) { + users.remove(id); + } +} 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..b4707c7 --- /dev/null +++ b/src/main/java/ru/practicum/shareit/user/dto/UserDto.java @@ -0,0 +1,16 @@ +package ru.practicum.shareit.user.dto; + +import jakarta.validation.Valid; +import jakarta.validation.constraints.Email; +import lombok.AllArgsConstructor; +import lombok.Data; + +@Data +@Valid +@AllArgsConstructor +public class UserDto { + private Long id; + private String name; + @Email(message = "Email should be valid") + private String email; +} From 406ed7650964181742d56c72e0900a5590543887 Mon Sep 17 00:00:00 2001 From: Denis Panasyuk Date: Fri, 20 Feb 2026 17:06:24 +0300 Subject: [PATCH 2/8] =?UTF-8?q?=D0=98=D1=81=D0=BF=D1=80=D0=B0=D0=B2=D0=BB?= =?UTF-8?q?=D0=B5=D0=BD=D1=8B=20=D0=BE=D1=88=D0=B8=D0=B1=D0=BA=D0=B8=20?= =?UTF-8?q?=D0=B2=20=D0=BB=D0=BE=D0=B3=D0=B8=D0=BA=D0=B5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../shareit/exceptions/BadRequestException.java | 0 .../ru/practicum/shareit/exceptions/ErrorHandler.java | 0 .../ru/practicum/shareit/exceptions/ErrorResponse.java | 0 .../shareit/exceptions/InternalServerException.java | 0 .../java/ru/practicum/shareit/exceptions/OnCreate.java | 0 .../java/ru/practicum/shareit/exceptions/OnUpdate.java | 0 .../java/ru/practicum/shareit/item/ItemStatus.java | 6 ------ .../practicum/shareit/user/{ => dao}/UserMapper.java | 10 +++++++++- 8 files changed, 9 insertions(+), 7 deletions(-) create mode 100644 src/main/java/ru/practicum/shareit/exceptions/BadRequestException.java create mode 100644 src/main/java/ru/practicum/shareit/exceptions/ErrorHandler.java create mode 100644 src/main/java/ru/practicum/shareit/exceptions/ErrorResponse.java create mode 100644 src/main/java/ru/practicum/shareit/exceptions/InternalServerException.java create mode 100644 src/main/java/ru/practicum/shareit/exceptions/OnCreate.java create mode 100644 src/main/java/ru/practicum/shareit/exceptions/OnUpdate.java delete mode 100644 src/main/java/ru/practicum/shareit/item/ItemStatus.java rename src/main/java/ru/practicum/shareit/user/{ => dao}/UserMapper.java (56%) diff --git a/src/main/java/ru/practicum/shareit/exceptions/BadRequestException.java b/src/main/java/ru/practicum/shareit/exceptions/BadRequestException.java new file mode 100644 index 0000000..e69de29 diff --git a/src/main/java/ru/practicum/shareit/exceptions/ErrorHandler.java b/src/main/java/ru/practicum/shareit/exceptions/ErrorHandler.java new file mode 100644 index 0000000..e69de29 diff --git a/src/main/java/ru/practicum/shareit/exceptions/ErrorResponse.java b/src/main/java/ru/practicum/shareit/exceptions/ErrorResponse.java new file mode 100644 index 0000000..e69de29 diff --git a/src/main/java/ru/practicum/shareit/exceptions/InternalServerException.java b/src/main/java/ru/practicum/shareit/exceptions/InternalServerException.java new file mode 100644 index 0000000..e69de29 diff --git a/src/main/java/ru/practicum/shareit/exceptions/OnCreate.java b/src/main/java/ru/practicum/shareit/exceptions/OnCreate.java new file mode 100644 index 0000000..e69de29 diff --git a/src/main/java/ru/practicum/shareit/exceptions/OnUpdate.java b/src/main/java/ru/practicum/shareit/exceptions/OnUpdate.java new file mode 100644 index 0000000..e69de29 diff --git a/src/main/java/ru/practicum/shareit/item/ItemStatus.java b/src/main/java/ru/practicum/shareit/item/ItemStatus.java deleted file mode 100644 index ed9c525..0000000 --- a/src/main/java/ru/practicum/shareit/item/ItemStatus.java +++ /dev/null @@ -1,6 +0,0 @@ -package ru.practicum.shareit.item; - -public enum ItemStatus { - AVAILABLE, - UNAVAILABLE -} diff --git a/src/main/java/ru/practicum/shareit/user/UserMapper.java b/src/main/java/ru/practicum/shareit/user/dao/UserMapper.java similarity index 56% rename from src/main/java/ru/practicum/shareit/user/UserMapper.java rename to src/main/java/ru/practicum/shareit/user/dao/UserMapper.java index a44797e..b655dfb 100644 --- a/src/main/java/ru/practicum/shareit/user/UserMapper.java +++ b/src/main/java/ru/practicum/shareit/user/dao/UserMapper.java @@ -5,11 +5,19 @@ @UtilityClass public class UserMapper { - public static UserDto mapToUser(User user) { + public static UserDto toUserDto(User user) { return new UserDto( user.getId(), user.getName(), user.getEmail() ); } + + public static User toUser(UserDto userDto) { + return new User( + userDto.getId(), + userDto.getName(), + userDto.getEmail() + ); + } } \ No newline at end of file From 77b9f916c93672e199a4aba9c53de7990a272252 Mon Sep 17 00:00:00 2001 From: Denis Panasyuk Date: Fri, 20 Feb 2026 17:06:33 +0300 Subject: [PATCH 3/8] =?UTF-8?q?=D0=98=D1=81=D0=BF=D1=80=D0=B0=D0=B2=D0=BB?= =?UTF-8?q?=D0=B5=D0=BD=D1=8B=20=D0=BE=D1=88=D0=B8=D0=B1=D0=BA=D0=B8=20?= =?UTF-8?q?=D0=B2=20=D0=BB=D0=BE=D0=B3=D0=B8=D0=BA=D0=B5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../exceptions/BadRequestException.java | 7 ++ .../shareit/exceptions/ErrorHandler.java | 27 ++++++++ .../shareit/exceptions/ErrorResponse.java | 13 ++++ .../exceptions/InternalServerException.java | 6 ++ .../shareit/exceptions/OnCreate.java | 4 ++ .../shareit/exceptions/OnUpdate.java | 4 ++ .../java/ru/practicum/shareit/item/Item.java | 21 ++---- .../shareit/item/ItemController.java | 29 ++++++--- .../shareit/item/dao/InMemoryItemStorage.java | 65 ++++++++++++------- .../shareit/item/dao/ItemMapper.java | 16 +++-- .../practicum/shareit/item/dto/ItemDto.java | 8 ++- .../shareit/item/service/ItemService.java | 5 +- .../shareit/item/service/ItemServiceImpl.java | 10 ++- .../java/ru/practicum/shareit/user/User.java | 4 -- .../shareit/user/UserController.java | 25 ++++--- .../practicum/shareit/user/UserService.java | 9 +-- .../shareit/user/UserServiceImpl.java | 12 ++-- .../shareit/user/dao/InMemoryUserStorage.java | 47 +++++++++----- .../shareit/user/dao/UserMapper.java | 3 +- 19 files changed, 211 insertions(+), 104 deletions(-) diff --git a/src/main/java/ru/practicum/shareit/exceptions/BadRequestException.java b/src/main/java/ru/practicum/shareit/exceptions/BadRequestException.java index e69de29..e0ee232 100644 --- a/src/main/java/ru/practicum/shareit/exceptions/BadRequestException.java +++ b/src/main/java/ru/practicum/shareit/exceptions/BadRequestException.java @@ -0,0 +1,7 @@ +package ru.practicum.shareit.exceptions; + +public class BadRequestException extends RuntimeException { + public BadRequestException(String message) { + super(message); + } +} diff --git a/src/main/java/ru/practicum/shareit/exceptions/ErrorHandler.java b/src/main/java/ru/practicum/shareit/exceptions/ErrorHandler.java index e69de29..28236c2 100644 --- a/src/main/java/ru/practicum/shareit/exceptions/ErrorHandler.java +++ b/src/main/java/ru/practicum/shareit/exceptions/ErrorHandler.java @@ -0,0 +1,27 @@ +package ru.practicum.shareit.exceptions; + +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 handleValidationExceptions(MethodArgumentNotValidException e) { + log.warn("Ошибка запроса"); + return new ErrorResponse(e.getMessage()); + } + + @ExceptionHandler + @ResponseStatus(HttpStatus.NOT_FOUND) + public ErrorResponse handleNotFoundException(final NotFoundException e) { + log.warn("Объект не найден"); + return new ErrorResponse(e.getMessage()); + } +} diff --git a/src/main/java/ru/practicum/shareit/exceptions/ErrorResponse.java b/src/main/java/ru/practicum/shareit/exceptions/ErrorResponse.java index e69de29..d9693ed 100644 --- a/src/main/java/ru/practicum/shareit/exceptions/ErrorResponse.java +++ b/src/main/java/ru/practicum/shareit/exceptions/ErrorResponse.java @@ -0,0 +1,13 @@ +package ru.practicum.shareit.exceptions; + +import lombok.Getter; + +@Getter +public class ErrorResponse { + private final String error; + + public ErrorResponse(String error) { + this.error = error; + } + +} \ No newline at end of file diff --git a/src/main/java/ru/practicum/shareit/exceptions/InternalServerException.java b/src/main/java/ru/practicum/shareit/exceptions/InternalServerException.java index e69de29..3230b48 100644 --- a/src/main/java/ru/practicum/shareit/exceptions/InternalServerException.java +++ b/src/main/java/ru/practicum/shareit/exceptions/InternalServerException.java @@ -0,0 +1,6 @@ +package ru.practicum.shareit.exceptions; + +public class InternalServerException extends RuntimeException { + public InternalServerException(String s) { + } +} diff --git a/src/main/java/ru/practicum/shareit/exceptions/OnCreate.java b/src/main/java/ru/practicum/shareit/exceptions/OnCreate.java index e69de29..0b138c9 100644 --- a/src/main/java/ru/practicum/shareit/exceptions/OnCreate.java +++ b/src/main/java/ru/practicum/shareit/exceptions/OnCreate.java @@ -0,0 +1,4 @@ +package ru.practicum.shareit.exceptions; + +public interface OnCreate { +} diff --git a/src/main/java/ru/practicum/shareit/exceptions/OnUpdate.java b/src/main/java/ru/practicum/shareit/exceptions/OnUpdate.java index e69de29..3d736c5 100644 --- a/src/main/java/ru/practicum/shareit/exceptions/OnUpdate.java +++ b/src/main/java/ru/practicum/shareit/exceptions/OnUpdate.java @@ -0,0 +1,4 @@ +package ru.practicum.shareit.exceptions; + +public interface OnUpdate { +} diff --git a/src/main/java/ru/practicum/shareit/item/Item.java b/src/main/java/ru/practicum/shareit/item/Item.java index 8f63b53..bdd9484 100644 --- a/src/main/java/ru/practicum/shareit/item/Item.java +++ b/src/main/java/ru/practicum/shareit/item/Item.java @@ -1,32 +1,19 @@ package ru.practicum.shareit.item; -import jakarta.validation.Valid; -import jakarta.validation.constraints.NotNull; import lombok.AllArgsConstructor; -import lombok.Builder; import lombok.Data; -import ru.practicum.shareit.request.ItemRequest; +import lombok.NoArgsConstructor; /** * TODO Sprint add-controllers. */ @Data -@Valid @AllArgsConstructor +@NoArgsConstructor public class Item { - @NotNull private Long id; private String name; private String description; - private ItemStatus itemStatus; - private Long owner; - private ItemRequest request; - - public boolean isAvailable() { - return itemStatus == ItemStatus.AVAILABLE; - } - - public ItemRequest getRequest() { - return null; - } + private Boolean available; + private Long ownerId; } diff --git a/src/main/java/ru/practicum/shareit/item/ItemController.java b/src/main/java/ru/practicum/shareit/item/ItemController.java index 9922d6b..3a0791c 100644 --- a/src/main/java/ru/practicum/shareit/item/ItemController.java +++ b/src/main/java/ru/practicum/shareit/item/ItemController.java @@ -1,8 +1,11 @@ package ru.practicum.shareit.item; -import jakarta.websocket.server.PathParam; import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.*; +import ru.practicum.shareit.exceptions.OnCreate; +import ru.practicum.shareit.exceptions.OnUpdate; import ru.practicum.shareit.item.dto.ItemDto; import ru.practicum.shareit.item.service.ItemService; @@ -11,6 +14,7 @@ /** * TODO Sprint add-controllers. */ +@Slf4j @RestController @RequestMapping("/items") @RequiredArgsConstructor @@ -19,27 +23,36 @@ public class ItemController { private final ItemService itemService; @PostMapping - public ItemDto addItem(@RequestBody final Item item, @RequestHeader("X-Sharer-User-Id") long ownerId) { - return itemService.addItem(item, ownerId); + public ItemDto addItem(@Validated(OnCreate.class) @RequestBody final ItemDto itemDto, + @RequestHeader("X-Sharer-User-Id") Long ownerId) { + log.info("Предмет добавлен"); + return itemService.addItem(itemDto, ownerId); } @PatchMapping("/{itemId}") - public ItemDto updateItem(@PathVariable("itemId") final long itemId, @RequestHeader("X-Sharer-User-Id") long ownerId) { - return itemService.updateItem(itemId, ownerId); + public ItemDto updateItem(@PathVariable("itemId") final long itemId, + @RequestHeader("X-Sharer-User-Id") long ownerId, + @Validated(OnUpdate.class) @RequestBody final ItemDto itemDto) { + itemDto.setId(itemId); + log.info("Предмет обновлен"); + return itemService.updateItem(itemDto, ownerId); } @GetMapping("/{itemId}") - public ItemDto getItem(@PathVariable("itemId") final long itemId, @RequestHeader("X-Sharer-User-Id") long ownerId) { + public ItemDto getItem(@PathVariable("itemId") final long itemId) { + log.info("Предмет выведен"); return itemService.getItem(itemId); } @GetMapping public Collection getAllOwnerItems(@RequestHeader("X-Sharer-User-Id") long ownerId) { + log.info("Список всех предметов владельца выведен"); return itemService.getAllOwnerItems(ownerId); } - @GetMapping("//search?text={text}") - public Collection getNecessaryItem(@RequestHeader("X-Sharer-User-Id") long ownerId, @RequestParam("text") String text) { + @GetMapping("/search") + public Collection getNecessaryItem(@RequestParam String text) { + log.info("Список предметов содержащих " + text + " выведен"); return itemService.getNecessaryItem(text); } } diff --git a/src/main/java/ru/practicum/shareit/item/dao/InMemoryItemStorage.java b/src/main/java/ru/practicum/shareit/item/dao/InMemoryItemStorage.java index 03bceea..11a9aa4 100644 --- a/src/main/java/ru/practicum/shareit/item/dao/InMemoryItemStorage.java +++ b/src/main/java/ru/practicum/shareit/item/dao/InMemoryItemStorage.java @@ -1,6 +1,5 @@ package ru.practicum.shareit.item.dao; - import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Repository; import ru.practicum.shareit.exceptions.NotFoundException; @@ -9,12 +8,14 @@ import java.util.*; -import static ru.practicum.shareit.item.dao.ItemMapper.mapToItem; +import static ru.practicum.shareit.item.dao.ItemMapper.toItem; +import static ru.practicum.shareit.item.dao.ItemMapper.toItemDto; +import static ru.practicum.shareit.user.dao.InMemoryUserStorage.users; @Slf4j @Repository public class InMemoryItemStorage { - private static Map items = new HashMap<>(); + public static Map items = new HashMap<>(); private Long getNextId() { long currentMaxId = items.keySet() @@ -25,41 +26,52 @@ private Long getNextId() { return ++currentMaxId; } - public ItemDto addItem(Item item, long userId) { + public ItemDto addItem(ItemDto itemDto, Long ownerId) { + if (!users.containsKey(ownerId)) { + log.warn("Владелец с указанным id " + ownerId + " не найден"); + throw new NotFoundException("Владелец с id " + ownerId + " не найден"); + } + Item item = toItem(itemDto); + item.setOwnerId(ownerId); item.setId(getNextId()); - item.setOwner(userId); items.put(item.getId(), item); - return mapToItem(item); + return toItemDto(item); } - public ItemDto updateItem(long itemId, long userId) { - if (!items.containsKey(itemId)) { - log.warn("Пользователь с указанным id не найден"); - throw new NotFoundException("Пользователь с id = " + itemId + " не найден"); + public ItemDto updateItem(ItemDto itemDto, long userId) { + if (!users.containsKey(userId)) { + log.warn("Пользователь с указанным id " + userId + " не найден"); + throw new NotFoundException("Пользователь с id " + userId + " не найден"); + } + Item newItem = toItem(itemDto); + newItem.setOwnerId(userId); + Item item = items.get(newItem.getId()); + if (newItem.getName() != null) { + item.setName(newItem.getName()); } - Item item = items.get(itemId); - if (item.getOwner() != userId) { - log.warn("Только владелец может редактировать предмет"); - return null; + if (newItem.getDescription() != null) { + item.setDescription(newItem.getDescription()); } - item.setName(items.get(itemId).getName()); - item.setDescription(items.get(itemId).getDescription()); - return mapToItem(item); + if (newItem.getAvailable() != null) { + item.setAvailable(newItem.getAvailable()); + } + + return toItemDto(item); } public ItemDto getItem(long itemId) { if (!items.containsKey(itemId)) { - log.warn("Пользователь с указанным id не найден"); - throw new NotFoundException("Пользователь с id = " + itemId + " не найден"); + log.warn("Предмет с указанным id " + itemId + " не найден"); + throw new NotFoundException("Предмет с id = " + itemId + " не найден"); } - return mapToItem(items.get(itemId)); + return toItemDto(items.get(itemId)); } public List getAllOwnerItems(long ownerId) { List ownerItems = new ArrayList<>(); for (Item item : items.values()) { - if (item.getOwner() == ownerId) { - ownerItems.add(mapToItem(item)); + if (item.getOwnerId() == ownerId) { + ownerItems.add(toItemDto(item)); } } return ownerItems; @@ -67,9 +79,14 @@ public List getAllOwnerItems(long ownerId) { public List getNecessaryItem(String text) { List necessaryItems = new ArrayList<>(); + if (text == null || text.isBlank()) { + return Collections.emptyList(); + } + text = text.toLowerCase(Locale.ROOT); for (Item item : items.values()) { - if (item.isAvailable() && item.getDescription().contains(text)) { - necessaryItems.add(mapToItem(item)); + if (item.getAvailable() && item.getName().toLowerCase(Locale.ROOT).contains(text) + || item.getDescription().toLowerCase(Locale.ROOT).contains(text)) { + necessaryItems.add(toItemDto(item)); } } return necessaryItems; diff --git a/src/main/java/ru/practicum/shareit/item/dao/ItemMapper.java b/src/main/java/ru/practicum/shareit/item/dao/ItemMapper.java index a95efd6..01af772 100644 --- a/src/main/java/ru/practicum/shareit/item/dao/ItemMapper.java +++ b/src/main/java/ru/practicum/shareit/item/dao/ItemMapper.java @@ -6,13 +6,21 @@ @UtilityClass public class ItemMapper { - public static ItemDto mapToItem(Item item) { + public static ItemDto toItemDto(Item item) { return new ItemDto( item.getId(), item.getName(), item.getDescription(), - item.isAvailable(), - item.getRequest() != null ? item.getRequest().getId() : null + item.getAvailable() ); } -} + + public static Item toItem(ItemDto itemDto) { + Item item = new Item(); + item.setId(itemDto.getId()); + item.setName(itemDto.getName()); + item.setDescription(itemDto.getDescription()); + item.setAvailable(itemDto.getAvailable()); + return item; + } +} \ No newline at end of file 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 66300e9..f63edc5 100644 --- a/src/main/java/ru/practicum/shareit/item/dto/ItemDto.java +++ b/src/main/java/ru/practicum/shareit/item/dto/ItemDto.java @@ -1,8 +1,10 @@ package ru.practicum.shareit.item.dto; +import jakarta.validation.constraints.NotBlank; +import jakarta.validation.constraints.NotNull; import lombok.AllArgsConstructor; import lombok.Data; -import ru.practicum.shareit.request.ItemRequest; +import ru.practicum.shareit.exceptions.OnCreate; /** * TODO Sprint add-controllers. @@ -11,8 +13,10 @@ @AllArgsConstructor public class ItemDto { private Long id; + @NotBlank(groups = OnCreate.class, message = "Название предмета должно быть заполнено") private String name; + @NotBlank(groups = OnCreate.class, message = "Описание предмета должно быть заполнено") private String description; + @NotNull(groups = OnCreate.class, message = "Статус должен быть заполнен") private Boolean available; - private Long requestId; } diff --git a/src/main/java/ru/practicum/shareit/item/service/ItemService.java b/src/main/java/ru/practicum/shareit/item/service/ItemService.java index 4477768..5119e06 100644 --- a/src/main/java/ru/practicum/shareit/item/service/ItemService.java +++ b/src/main/java/ru/practicum/shareit/item/service/ItemService.java @@ -1,6 +1,5 @@ package ru.practicum.shareit.item.service; -import ru.practicum.shareit.item.Item; import ru.practicum.shareit.item.dto.ItemDto; import java.util.Collection; @@ -8,9 +7,9 @@ public interface ItemService { - ItemDto addItem(Item item, long userId); + ItemDto addItem(ItemDto itemDto, Long userId); - ItemDto updateItem(long itemId, long userId); + ItemDto updateItem(ItemDto itemDto, long userId); ItemDto getItem(long itemId); 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 5567bad..2f4d5d5 100644 --- a/src/main/java/ru/practicum/shareit/item/service/ItemServiceImpl.java +++ b/src/main/java/ru/practicum/shareit/item/service/ItemServiceImpl.java @@ -3,14 +3,12 @@ import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; -import ru.practicum.shareit.item.Item; import ru.practicum.shareit.item.dao.InMemoryItemStorage; import ru.practicum.shareit.item.dto.ItemDto; import java.util.Collection; import java.util.List; -@Slf4j @Service @RequiredArgsConstructor public class ItemServiceImpl implements ItemService { @@ -18,13 +16,13 @@ public class ItemServiceImpl implements ItemService { private final InMemoryItemStorage inMemoryItemStorage; @Override - public ItemDto addItem(Item item, long userId) { - return inMemoryItemStorage.addItem(item, userId); + public ItemDto addItem(ItemDto itemDto, Long ownerId) { + return inMemoryItemStorage.addItem(itemDto, ownerId); } @Override - public ItemDto updateItem(long itemId, long userId) { - return inMemoryItemStorage.updateItem(itemId, userId); + public ItemDto updateItem(ItemDto itemDto, long userId) { + return inMemoryItemStorage.updateItem(itemDto, userId); } @Override diff --git a/src/main/java/ru/practicum/shareit/user/User.java b/src/main/java/ru/practicum/shareit/user/User.java index 6f964b3..815b4de 100644 --- a/src/main/java/ru/practicum/shareit/user/User.java +++ b/src/main/java/ru/practicum/shareit/user/User.java @@ -1,8 +1,6 @@ package ru.practicum.shareit.user; -import jakarta.validation.Valid; import jakarta.validation.constraints.Email; -import jakarta.validation.constraints.NotNull; import lombok.AllArgsConstructor; import lombok.Data; @@ -10,12 +8,10 @@ * TODO Sprint add-controllers. */ @Data -@Valid @AllArgsConstructor public class User { private Long id; private String name; @Email(message = "Email should be valid") - @NotNull private String email; } diff --git a/src/main/java/ru/practicum/shareit/user/UserController.java b/src/main/java/ru/practicum/shareit/user/UserController.java index 38a3740..9fa2f29 100644 --- a/src/main/java/ru/practicum/shareit/user/UserController.java +++ b/src/main/java/ru/practicum/shareit/user/UserController.java @@ -21,28 +21,33 @@ public class UserController { private final UserServiceImpl userServiceImpl; @PostMapping - public UserDto addUser(@Valid @RequestBody final User user) { + public UserDto addUser(@Valid @RequestBody final UserDto user) { + log.info("Пользователь добавлен"); return userServiceImpl.addUser(user); } @PatchMapping("/{userId}") - public UserDto updateUser(@RequestBody final Long userId) { - return userServiceImpl.updateUser(userId); + public UserDto updateUser(@PathVariable("userId") final Long userId, @Valid @RequestBody final UserDto userDto) { + userDto.setId(userId); + log.info("Пользователь обновлен"); + return userServiceImpl.updateUser(userDto); } @GetMapping public Collection getAllUsers() { + log.info("Список пользователей выведен"); return userServiceImpl.getAllUsers(); } - @GetMapping("/{id}") - public UserDto getUser(@PathVariable final Long id) { - return userServiceImpl.getUser(id); + @GetMapping("/{userId}") + public UserDto getUser(@PathVariable("userId") final Long userId) { + log.info("Польователь с id " + userId + " выведен"); + return userServiceImpl.getUser(userId); } - @DeleteMapping("/{id}") - public void deleteUser(@PathVariable final Long id) { - log.info("Пользователь с id: {} удален", id); - userServiceImpl.deleteUser(id); + @DeleteMapping("/{userId}") + public void deleteUser(@PathVariable("userId") final Long userId) { + log.info("Пользователь с id " + userId + " удален"); + userServiceImpl.deleteUser(userId); } } diff --git a/src/main/java/ru/practicum/shareit/user/UserService.java b/src/main/java/ru/practicum/shareit/user/UserService.java index e5e93b7..ed0bba4 100644 --- a/src/main/java/ru/practicum/shareit/user/UserService.java +++ b/src/main/java/ru/practicum/shareit/user/UserService.java @@ -2,15 +2,16 @@ import ru.practicum.shareit.user.dto.UserDto; -import java.util.Collection; +import java.util.List; + public interface UserService { - UserDto addUser(User user); + UserDto addUser(UserDto userDto); - UserDto updateUser(Long id); + UserDto updateUser(UserDto userDto); - Collection getAllUsers(); + List getAllUsers(); UserDto getUser(Long id); diff --git a/src/main/java/ru/practicum/shareit/user/UserServiceImpl.java b/src/main/java/ru/practicum/shareit/user/UserServiceImpl.java index 75c298f..ea89636 100644 --- a/src/main/java/ru/practicum/shareit/user/UserServiceImpl.java +++ b/src/main/java/ru/practicum/shareit/user/UserServiceImpl.java @@ -6,7 +6,7 @@ import ru.practicum.shareit.user.dao.InMemoryUserStorage; import ru.practicum.shareit.user.dto.UserDto; -import java.util.Collection; +import java.util.List; @Slf4j @Service @@ -16,17 +16,17 @@ public class UserServiceImpl implements UserService{ private final InMemoryUserStorage inMemoryUserStorage; @Override - public UserDto addUser(User user) { - return inMemoryUserStorage.addUser(user); + public UserDto addUser(UserDto userDto) { + return inMemoryUserStorage.addUser(userDto); } @Override - public UserDto updateUser(Long id) { - return inMemoryUserStorage.updateUser(id); + public UserDto updateUser(UserDto userDto) { + return inMemoryUserStorage.updateUser(userDto); } @Override - public Collection getAllUsers() { + public List getAllUsers() { return inMemoryUserStorage.getAllUsers(); } diff --git a/src/main/java/ru/practicum/shareit/user/dao/InMemoryUserStorage.java b/src/main/java/ru/practicum/shareit/user/dao/InMemoryUserStorage.java index c449487..19c1d62 100644 --- a/src/main/java/ru/practicum/shareit/user/dao/InMemoryUserStorage.java +++ b/src/main/java/ru/practicum/shareit/user/dao/InMemoryUserStorage.java @@ -3,6 +3,7 @@ import jakarta.validation.ValidationException; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Component; +import ru.practicum.shareit.exceptions.BadRequestException; import ru.practicum.shareit.exceptions.NotFoundException; import ru.practicum.shareit.user.User; import ru.practicum.shareit.user.dto.UserDto; @@ -12,12 +13,12 @@ import java.util.List; import java.util.Map; -import static ru.practicum.shareit.user.UserMapper.mapToUser; +import static ru.practicum.shareit.user.dao.UserMapper.*; @Slf4j @Component public class InMemoryUserStorage { - private static Map users = new HashMap<>(); + public static Map users = new HashMap<>(); private Long getNextId() { long currentMaxId = users.keySet() @@ -28,39 +29,55 @@ private Long getNextId() { return ++currentMaxId; } - public UserDto addUser(User user) { + public UserDto addUser(UserDto user) { + if (user.getEmail() == null) { + log.warn("Некорректная почта"); + throw new BadRequestException("некорректный тип почты"); + } for (User usr : users.values()) { if (usr.getEmail().equals(user.getEmail())) { - throw new ValidationException("Нельзя добавить пользователя с одинаковыми почтами"); + log.warn("такая почта уже используется"); + throw new ValidationException("Нельзя добавить существующую почту"); } } user.setId(getNextId()); - users.put(user.getId(), user); - return mapToUser(user); + users.put(user.getId(), toUser(user)); + return user; } - public UserDto updateUser(Long userId) { - if (!users.containsKey(userId)) { + public UserDto updateUser(UserDto userDto) { + for (User usr : users.values()) { + if (usr.getEmail().equals(userDto.getEmail())) { + log.warn("такая почта уже используется"); + throw new ValidationException("Нельзя добавить существующую почту"); + } + } + if (!users.containsKey(userDto.getId())) { log.warn("Пользователь с указанным id не найден"); - throw new NotFoundException("Пользователь с id = " + userId + " не найден"); + throw new NotFoundException("Пользователь с id = " + userDto.getId() + " не найден"); + } + User newUser = toUser(userDto); + User user = users.get(newUser.getId()); + if (newUser.getName() != null) { + user.setName(newUser.getName()); + } + if (newUser.getEmail() != null) { + user.setEmail(newUser.getEmail()); } - User user = users.get(userId); - user.setEmail(user.getEmail()); - user.setName(user.getName()); - return mapToUser(user); + return toUserDto(user); } public List getAllUsers() { List dtoList = new ArrayList<>(); for (User user : users.values()) { - dtoList.add(mapToUser(user)); + dtoList.add(toUserDto(user)); } return dtoList; } public UserDto getUser(Long id) { User user = users.get(id); - return mapToUser(user); + return toUserDto(user); } public void deleteUser(Long id) { diff --git a/src/main/java/ru/practicum/shareit/user/dao/UserMapper.java b/src/main/java/ru/practicum/shareit/user/dao/UserMapper.java index b655dfb..6051b1a 100644 --- a/src/main/java/ru/practicum/shareit/user/dao/UserMapper.java +++ b/src/main/java/ru/practicum/shareit/user/dao/UserMapper.java @@ -1,6 +1,7 @@ -package ru.practicum.shareit.user; +package ru.practicum.shareit.user.dao; import lombok.experimental.UtilityClass; +import ru.practicum.shareit.user.User; import ru.practicum.shareit.user.dto.UserDto; @UtilityClass From c27e7fd89b314837580ad9be2576367447ebab94 Mon Sep 17 00:00:00 2001 From: Denis Panasyuk Date: Fri, 20 Feb 2026 17:11:23 +0300 Subject: [PATCH 4/8] =?UTF-8?q?=D0=98=D1=81=D0=BF=D1=80=D0=B0=D0=B2=D0=BB?= =?UTF-8?q?=D0=B5=D0=BD=20checkstyle?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/ru/practicum/shareit/item/service/ItemServiceImpl.java | 1 - 1 file changed, 1 deletion(-) 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 2f4d5d5..97e781b 100644 --- a/src/main/java/ru/practicum/shareit/item/service/ItemServiceImpl.java +++ b/src/main/java/ru/practicum/shareit/item/service/ItemServiceImpl.java @@ -1,7 +1,6 @@ package ru.practicum.shareit.item.service; import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; import ru.practicum.shareit.item.dao.InMemoryItemStorage; import ru.practicum.shareit.item.dto.ItemDto; From 66f6daed8136f8b98fe545a3af49b82c821f36bb Mon Sep 17 00:00:00 2001 From: Denis Panasyuk Date: Fri, 20 Feb 2026 17:15:55 +0300 Subject: [PATCH 5/8] =?UTF-8?q?=D0=98=D1=81=D0=BF=D1=80=D0=B0=D0=B2=D0=BB?= =?UTF-8?q?=D0=B5=D0=BD=20checkstyle?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ru/practicum/shareit/item/service/ItemServiceImpl.java | 1 - src/main/java/ru/practicum/shareit/user/UserServiceImpl.java | 3 +-- 2 files changed, 1 insertion(+), 3 deletions(-) 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 97e781b..9f99a21 100644 --- a/src/main/java/ru/practicum/shareit/item/service/ItemServiceImpl.java +++ b/src/main/java/ru/practicum/shareit/item/service/ItemServiceImpl.java @@ -11,7 +11,6 @@ @Service @RequiredArgsConstructor public class ItemServiceImpl implements ItemService { - private final InMemoryItemStorage inMemoryItemStorage; @Override diff --git a/src/main/java/ru/practicum/shareit/user/UserServiceImpl.java b/src/main/java/ru/practicum/shareit/user/UserServiceImpl.java index ea89636..fb5d9b1 100644 --- a/src/main/java/ru/practicum/shareit/user/UserServiceImpl.java +++ b/src/main/java/ru/practicum/shareit/user/UserServiceImpl.java @@ -11,8 +11,7 @@ @Slf4j @Service @RequiredArgsConstructor -public class UserServiceImpl implements UserService{ - +public class UserServiceImpl implements UserService { private final InMemoryUserStorage inMemoryUserStorage; @Override From 6bbe53e1a23624864b31f4b5905d7a845b5b92dd Mon Sep 17 00:00:00 2001 From: Denis Panasyuk Date: Fri, 20 Feb 2026 17:19:19 +0300 Subject: [PATCH 6/8] =?UTF-8?q?=D0=98=D1=81=D0=BF=D1=80=D0=B0=D0=B2=D0=BB?= =?UTF-8?q?=D0=B5=D0=BD=20checkstyle?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/ru/practicum/shareit/item/dao/InMemoryItemStorage.java | 2 +- .../java/ru/practicum/shareit/user/dao/InMemoryUserStorage.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/ru/practicum/shareit/item/dao/InMemoryItemStorage.java b/src/main/java/ru/practicum/shareit/item/dao/InMemoryItemStorage.java index 11a9aa4..25de642 100644 --- a/src/main/java/ru/practicum/shareit/item/dao/InMemoryItemStorage.java +++ b/src/main/java/ru/practicum/shareit/item/dao/InMemoryItemStorage.java @@ -15,7 +15,7 @@ @Slf4j @Repository public class InMemoryItemStorage { - public static Map items = new HashMap<>(); + public static final Map items = new HashMap<>(); private Long getNextId() { long currentMaxId = items.keySet() diff --git a/src/main/java/ru/practicum/shareit/user/dao/InMemoryUserStorage.java b/src/main/java/ru/practicum/shareit/user/dao/InMemoryUserStorage.java index 19c1d62..4d859bf 100644 --- a/src/main/java/ru/practicum/shareit/user/dao/InMemoryUserStorage.java +++ b/src/main/java/ru/practicum/shareit/user/dao/InMemoryUserStorage.java @@ -18,7 +18,7 @@ @Slf4j @Component public class InMemoryUserStorage { - public static Map users = new HashMap<>(); + public static final Map users = new HashMap<>(); private Long getNextId() { long currentMaxId = users.keySet() From ca53f6e01cffe793589868aaa1e4745f6f19c419 Mon Sep 17 00:00:00 2001 From: Denis Panasyuk Date: Fri, 20 Feb 2026 18:36:40 +0300 Subject: [PATCH 7/8] =?UTF-8?q?=D0=98=D1=81=D0=BF=D1=80=D0=B0=D0=B2=D0=BB?= =?UTF-8?q?=D0=B5=D0=BD=20checkstyle?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../shareit/item/dao/InMemoryItemStorage.java | 11 +++++++---- .../shareit/user/dao/InMemoryUserStorage.java | 6 +++++- 2 files changed, 12 insertions(+), 5 deletions(-) diff --git a/src/main/java/ru/practicum/shareit/item/dao/InMemoryItemStorage.java b/src/main/java/ru/practicum/shareit/item/dao/InMemoryItemStorage.java index 25de642..7c2ecf2 100644 --- a/src/main/java/ru/practicum/shareit/item/dao/InMemoryItemStorage.java +++ b/src/main/java/ru/practicum/shareit/item/dao/InMemoryItemStorage.java @@ -1,21 +1,24 @@ package ru.practicum.shareit.item.dao; +import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Repository; import ru.practicum.shareit.exceptions.NotFoundException; import ru.practicum.shareit.item.Item; import ru.practicum.shareit.item.dto.ItemDto; +import ru.practicum.shareit.user.dao.InMemoryUserStorage; import java.util.*; import static ru.practicum.shareit.item.dao.ItemMapper.toItem; import static ru.practicum.shareit.item.dao.ItemMapper.toItemDto; -import static ru.practicum.shareit.user.dao.InMemoryUserStorage.users; @Slf4j @Repository +@RequiredArgsConstructor public class InMemoryItemStorage { - public static final Map items = new HashMap<>(); + private final Map items = new HashMap<>(); + private final InMemoryUserStorage inMemoryUserStorage; private Long getNextId() { long currentMaxId = items.keySet() @@ -27,7 +30,7 @@ private Long getNextId() { } public ItemDto addItem(ItemDto itemDto, Long ownerId) { - if (!users.containsKey(ownerId)) { + if (!inMemoryUserStorage.getUsers().containsKey(ownerId)) { log.warn("Владелец с указанным id " + ownerId + " не найден"); throw new NotFoundException("Владелец с id " + ownerId + " не найден"); } @@ -39,7 +42,7 @@ public ItemDto addItem(ItemDto itemDto, Long ownerId) { } public ItemDto updateItem(ItemDto itemDto, long userId) { - if (!users.containsKey(userId)) { + if (!inMemoryUserStorage.getUsers().containsKey(userId)) { log.warn("Пользователь с указанным id " + userId + " не найден"); throw new NotFoundException("Пользователь с id " + userId + " не найден"); } diff --git a/src/main/java/ru/practicum/shareit/user/dao/InMemoryUserStorage.java b/src/main/java/ru/practicum/shareit/user/dao/InMemoryUserStorage.java index 4d859bf..aee4bb5 100644 --- a/src/main/java/ru/practicum/shareit/user/dao/InMemoryUserStorage.java +++ b/src/main/java/ru/practicum/shareit/user/dao/InMemoryUserStorage.java @@ -18,7 +18,7 @@ @Slf4j @Component public class InMemoryUserStorage { - public static final Map users = new HashMap<>(); + private final Map users = new HashMap<>(); private Long getNextId() { long currentMaxId = users.keySet() @@ -83,4 +83,8 @@ public UserDto getUser(Long id) { public void deleteUser(Long id) { users.remove(id); } + + public Map getUsers() { + return users; + } } From e78c4f133127f0b6582e6cad3eec1e134eb2079e Mon Sep 17 00:00:00 2001 From: Denis Panasyuk Date: Sun, 22 Feb 2026 23:35:34 +0300 Subject: [PATCH 8/8] =?UTF-8?q?=D0=92=D0=BD=D0=B5=D1=81=D0=B5=D0=BD=D1=8B?= =?UTF-8?q?=20=D0=BF=D1=80=D0=B0=D0=B2=D0=BA=D0=B8=20=D1=81=D0=BE=D0=B3?= =?UTF-8?q?=D0=BB=D0=B0=D1=81=D0=BD=D0=BE=20=D0=B7=D0=B0=D0=BC=D0=B5=D1=87?= =?UTF-8?q?=D0=B0=D0=BD=D0=B8=D1=8F=D0=BC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../{ => controller}/BookingController.java | 2 +- .../booking/{ => dao}/BookingMapper.java | 3 +- .../shareit/booking/dto/BookingDto.java | 6 +- .../shareit/booking/{ => model}/Booking.java | 6 +- .../booking/{ => model}/BookingStatus.java | 2 +- .../shareit/exceptions/ErrorHandler.java | 7 ++ .../shareit/exceptions/OnCreate.java | 4 - .../shareit/exceptions/OnUpdate.java | 4 - .../item/{ => controller}/ItemController.java | 6 +- .../shareit/item/dao/InMemoryItemStorage.java | 44 ++++------- .../shareit/item/dao/ItemMapper.java | 2 +- .../practicum/shareit/item/dto/ItemDto.java | 2 +- .../shareit/item/{ => model}/Item.java | 2 +- .../shareit/item/service/ItemServiceImpl.java | 44 +++++++++-- .../ItemRequestController.java | 2 +- .../request/{ => dao}/ItemRequestMapper.java | 3 +- .../shareit/request/dto/ItemRequestDto.java | 2 +- .../request/{ => model}/ItemRequest.java | 4 +- .../shareit/user/UserServiceImpl.java | 41 ---------- .../user/{ => controller}/UserController.java | 3 +- .../shareit/user/dao/InMemoryUserStorage.java | 56 ++++---------- .../shareit/user/dao/UserMapper.java | 2 +- .../shareit/user/{ => model}/User.java | 2 +- .../user/{ => service}/UserService.java | 2 +- .../shareit/user/service/UserServiceImpl.java | 75 +++++++++++++++++++ .../shareit/validation/OnCreate.java | 4 + .../shareit/validation/OnUpdate.java | 4 + 27 files changed, 180 insertions(+), 154 deletions(-) rename src/main/java/ru/practicum/shareit/booking/{ => controller}/BookingController.java (83%) rename src/main/java/ru/practicum/shareit/booking/{ => dao}/BookingMapper.java (82%) rename src/main/java/ru/practicum/shareit/booking/{ => model}/Booking.java (71%) rename src/main/java/ru/practicum/shareit/booking/{ => model}/BookingStatus.java (65%) delete mode 100644 src/main/java/ru/practicum/shareit/exceptions/OnCreate.java delete mode 100644 src/main/java/ru/practicum/shareit/exceptions/OnUpdate.java rename src/main/java/ru/practicum/shareit/item/{ => controller}/ItemController.java (93%) rename src/main/java/ru/practicum/shareit/item/{ => model}/Item.java (88%) rename src/main/java/ru/practicum/shareit/request/{ => controller}/ItemRequestController.java (84%) rename src/main/java/ru/practicum/shareit/request/{ => dao}/ItemRequestMapper.java (80%) rename src/main/java/ru/practicum/shareit/request/{ => model}/ItemRequest.java (79%) delete mode 100644 src/main/java/ru/practicum/shareit/user/UserServiceImpl.java rename src/main/java/ru/practicum/shareit/user/{ => controller}/UserController.java (93%) rename src/main/java/ru/practicum/shareit/user/{ => model}/User.java (88%) rename src/main/java/ru/practicum/shareit/user/{ => service}/UserService.java (86%) create mode 100644 src/main/java/ru/practicum/shareit/user/service/UserServiceImpl.java create mode 100644 src/main/java/ru/practicum/shareit/validation/OnCreate.java create mode 100644 src/main/java/ru/practicum/shareit/validation/OnUpdate.java diff --git a/src/main/java/ru/practicum/shareit/booking/BookingController.java b/src/main/java/ru/practicum/shareit/booking/controller/BookingController.java similarity index 83% rename from src/main/java/ru/practicum/shareit/booking/BookingController.java rename to src/main/java/ru/practicum/shareit/booking/controller/BookingController.java index b94493d..427a4b6 100644 --- a/src/main/java/ru/practicum/shareit/booking/BookingController.java +++ b/src/main/java/ru/practicum/shareit/booking/controller/BookingController.java @@ -1,4 +1,4 @@ -package ru.practicum.shareit.booking; +package ru.practicum.shareit.booking.controller; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; diff --git a/src/main/java/ru/practicum/shareit/booking/BookingMapper.java b/src/main/java/ru/practicum/shareit/booking/dao/BookingMapper.java similarity index 82% rename from src/main/java/ru/practicum/shareit/booking/BookingMapper.java rename to src/main/java/ru/practicum/shareit/booking/dao/BookingMapper.java index 6ee5b49..80e814a 100644 --- a/src/main/java/ru/practicum/shareit/booking/BookingMapper.java +++ b/src/main/java/ru/practicum/shareit/booking/dao/BookingMapper.java @@ -1,7 +1,8 @@ -package ru.practicum.shareit.booking; +package ru.practicum.shareit.booking.dao; import lombok.experimental.UtilityClass; import ru.practicum.shareit.booking.dto.BookingDto; +import ru.practicum.shareit.booking.model.Booking; @UtilityClass public class BookingMapper { diff --git a/src/main/java/ru/practicum/shareit/booking/dto/BookingDto.java b/src/main/java/ru/practicum/shareit/booking/dto/BookingDto.java index 7dd94e6..2f99f25 100644 --- a/src/main/java/ru/practicum/shareit/booking/dto/BookingDto.java +++ b/src/main/java/ru/practicum/shareit/booking/dto/BookingDto.java @@ -1,9 +1,9 @@ package ru.practicum.shareit.booking.dto; import lombok.AllArgsConstructor; -import ru.practicum.shareit.item.Item; -import ru.practicum.shareit.booking.BookingStatus; -import ru.practicum.shareit.user.User; +import ru.practicum.shareit.item.model.Item; +import ru.practicum.shareit.booking.model.BookingStatus; +import ru.practicum.shareit.user.model.User; import java.time.LocalDate; diff --git a/src/main/java/ru/practicum/shareit/booking/Booking.java b/src/main/java/ru/practicum/shareit/booking/model/Booking.java similarity index 71% rename from src/main/java/ru/practicum/shareit/booking/Booking.java rename to src/main/java/ru/practicum/shareit/booking/model/Booking.java index 2ce8160..090f6c9 100644 --- a/src/main/java/ru/practicum/shareit/booking/Booking.java +++ b/src/main/java/ru/practicum/shareit/booking/model/Booking.java @@ -1,9 +1,9 @@ -package ru.practicum.shareit.booking; +package ru.practicum.shareit.booking.model; import lombok.AllArgsConstructor; import lombok.Data; -import ru.practicum.shareit.item.Item; -import ru.practicum.shareit.user.User; +import ru.practicum.shareit.item.model.Item; +import ru.practicum.shareit.user.model.User; import java.time.LocalDate; diff --git a/src/main/java/ru/practicum/shareit/booking/BookingStatus.java b/src/main/java/ru/practicum/shareit/booking/model/BookingStatus.java similarity index 65% rename from src/main/java/ru/practicum/shareit/booking/BookingStatus.java rename to src/main/java/ru/practicum/shareit/booking/model/BookingStatus.java index 51269e0..4eb25ea 100644 --- a/src/main/java/ru/practicum/shareit/booking/BookingStatus.java +++ b/src/main/java/ru/practicum/shareit/booking/model/BookingStatus.java @@ -1,4 +1,4 @@ -package ru.practicum.shareit.booking; +package ru.practicum.shareit.booking.model; public enum BookingStatus { WAITING, diff --git a/src/main/java/ru/practicum/shareit/exceptions/ErrorHandler.java b/src/main/java/ru/practicum/shareit/exceptions/ErrorHandler.java index 28236c2..ef558d3 100644 --- a/src/main/java/ru/practicum/shareit/exceptions/ErrorHandler.java +++ b/src/main/java/ru/practicum/shareit/exceptions/ErrorHandler.java @@ -24,4 +24,11 @@ public ErrorResponse handleNotFoundException(final NotFoundException e) { log.warn("Объект не найден"); return new ErrorResponse(e.getMessage()); } + + @ExceptionHandler + @ResponseStatus(HttpStatus.NOT_FOUND) + public ErrorResponse handleInternalServerException(final InternalServerException e) { + log.warn("Ошибка сервера"); + return new ErrorResponse(e.getMessage()); + } } diff --git a/src/main/java/ru/practicum/shareit/exceptions/OnCreate.java b/src/main/java/ru/practicum/shareit/exceptions/OnCreate.java deleted file mode 100644 index 0b138c9..0000000 --- a/src/main/java/ru/practicum/shareit/exceptions/OnCreate.java +++ /dev/null @@ -1,4 +0,0 @@ -package ru.practicum.shareit.exceptions; - -public interface OnCreate { -} diff --git a/src/main/java/ru/practicum/shareit/exceptions/OnUpdate.java b/src/main/java/ru/practicum/shareit/exceptions/OnUpdate.java deleted file mode 100644 index 3d736c5..0000000 --- a/src/main/java/ru/practicum/shareit/exceptions/OnUpdate.java +++ /dev/null @@ -1,4 +0,0 @@ -package ru.practicum.shareit.exceptions; - -public interface OnUpdate { -} diff --git a/src/main/java/ru/practicum/shareit/item/ItemController.java b/src/main/java/ru/practicum/shareit/item/controller/ItemController.java similarity index 93% rename from src/main/java/ru/practicum/shareit/item/ItemController.java rename to src/main/java/ru/practicum/shareit/item/controller/ItemController.java index 3a0791c..b6fdcf2 100644 --- a/src/main/java/ru/practicum/shareit/item/ItemController.java +++ b/src/main/java/ru/practicum/shareit/item/controller/ItemController.java @@ -1,11 +1,11 @@ -package ru.practicum.shareit.item; +package ru.practicum.shareit.item.controller; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.*; -import ru.practicum.shareit.exceptions.OnCreate; -import ru.practicum.shareit.exceptions.OnUpdate; +import ru.practicum.shareit.validation.OnCreate; +import ru.practicum.shareit.validation.OnUpdate; import ru.practicum.shareit.item.dto.ItemDto; import ru.practicum.shareit.item.service.ItemService; diff --git a/src/main/java/ru/practicum/shareit/item/dao/InMemoryItemStorage.java b/src/main/java/ru/practicum/shareit/item/dao/InMemoryItemStorage.java index 7c2ecf2..4cfb451 100644 --- a/src/main/java/ru/practicum/shareit/item/dao/InMemoryItemStorage.java +++ b/src/main/java/ru/practicum/shareit/item/dao/InMemoryItemStorage.java @@ -4,21 +4,16 @@ import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Repository; import ru.practicum.shareit.exceptions.NotFoundException; -import ru.practicum.shareit.item.Item; -import ru.practicum.shareit.item.dto.ItemDto; -import ru.practicum.shareit.user.dao.InMemoryUserStorage; +import ru.practicum.shareit.item.model.Item; import java.util.*; -import static ru.practicum.shareit.item.dao.ItemMapper.toItem; -import static ru.practicum.shareit.item.dao.ItemMapper.toItemDto; @Slf4j @Repository @RequiredArgsConstructor public class InMemoryItemStorage { private final Map items = new HashMap<>(); - private final InMemoryUserStorage inMemoryUserStorage; private Long getNextId() { long currentMaxId = items.keySet() @@ -29,25 +24,13 @@ private Long getNextId() { return ++currentMaxId; } - public ItemDto addItem(ItemDto itemDto, Long ownerId) { - if (!inMemoryUserStorage.getUsers().containsKey(ownerId)) { - log.warn("Владелец с указанным id " + ownerId + " не найден"); - throw new NotFoundException("Владелец с id " + ownerId + " не найден"); - } - Item item = toItem(itemDto); - item.setOwnerId(ownerId); + public Item addItem(Item item) { item.setId(getNextId()); items.put(item.getId(), item); - return toItemDto(item); + return item; } - public ItemDto updateItem(ItemDto itemDto, long userId) { - if (!inMemoryUserStorage.getUsers().containsKey(userId)) { - log.warn("Пользователь с указанным id " + userId + " не найден"); - throw new NotFoundException("Пользователь с id " + userId + " не найден"); - } - Item newItem = toItem(itemDto); - newItem.setOwnerId(userId); + public Item updateItem(Item newItem) { Item item = items.get(newItem.getId()); if (newItem.getName() != null) { item.setName(newItem.getName()); @@ -58,30 +41,29 @@ public ItemDto updateItem(ItemDto itemDto, long userId) { if (newItem.getAvailable() != null) { item.setAvailable(newItem.getAvailable()); } - - return toItemDto(item); + return item; } - public ItemDto getItem(long itemId) { + public Item getItem(long itemId) { if (!items.containsKey(itemId)) { log.warn("Предмет с указанным id " + itemId + " не найден"); throw new NotFoundException("Предмет с id = " + itemId + " не найден"); } - return toItemDto(items.get(itemId)); + return items.get(itemId); } - public List getAllOwnerItems(long ownerId) { - List ownerItems = new ArrayList<>(); + public List getAllOwnerItems(long ownerId) { + List ownerItems = new ArrayList<>(); for (Item item : items.values()) { if (item.getOwnerId() == ownerId) { - ownerItems.add(toItemDto(item)); + ownerItems.add(item); } } return ownerItems; } - public List getNecessaryItem(String text) { - List necessaryItems = new ArrayList<>(); + public List getNecessaryItem(String text) { + List necessaryItems = new ArrayList<>(); if (text == null || text.isBlank()) { return Collections.emptyList(); } @@ -89,7 +71,7 @@ public List getNecessaryItem(String text) { for (Item item : items.values()) { if (item.getAvailable() && item.getName().toLowerCase(Locale.ROOT).contains(text) || item.getDescription().toLowerCase(Locale.ROOT).contains(text)) { - necessaryItems.add(toItemDto(item)); + necessaryItems.add(item); } } return necessaryItems; diff --git a/src/main/java/ru/practicum/shareit/item/dao/ItemMapper.java b/src/main/java/ru/practicum/shareit/item/dao/ItemMapper.java index 01af772..689a5aa 100644 --- a/src/main/java/ru/practicum/shareit/item/dao/ItemMapper.java +++ b/src/main/java/ru/practicum/shareit/item/dao/ItemMapper.java @@ -1,7 +1,7 @@ package ru.practicum.shareit.item.dao; import lombok.experimental.UtilityClass; -import ru.practicum.shareit.item.Item; +import ru.practicum.shareit.item.model.Item; import ru.practicum.shareit.item.dto.ItemDto; @UtilityClass 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 f63edc5..4c141ef 100644 --- a/src/main/java/ru/practicum/shareit/item/dto/ItemDto.java +++ b/src/main/java/ru/practicum/shareit/item/dto/ItemDto.java @@ -4,7 +4,7 @@ import jakarta.validation.constraints.NotNull; import lombok.AllArgsConstructor; import lombok.Data; -import ru.practicum.shareit.exceptions.OnCreate; +import ru.practicum.shareit.validation.OnCreate; /** * TODO Sprint add-controllers. diff --git a/src/main/java/ru/practicum/shareit/item/Item.java b/src/main/java/ru/practicum/shareit/item/model/Item.java similarity index 88% rename from src/main/java/ru/practicum/shareit/item/Item.java rename to src/main/java/ru/practicum/shareit/item/model/Item.java index bdd9484..68193d0 100644 --- a/src/main/java/ru/practicum/shareit/item/Item.java +++ b/src/main/java/ru/practicum/shareit/item/model/Item.java @@ -1,4 +1,4 @@ -package ru.practicum.shareit.item; +package ru.practicum.shareit.item.model; import lombok.AllArgsConstructor; import lombok.Data; 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 9f99a21..762aaee 100644 --- a/src/main/java/ru/practicum/shareit/item/service/ItemServiceImpl.java +++ b/src/main/java/ru/practicum/shareit/item/service/ItemServiceImpl.java @@ -1,40 +1,70 @@ package ru.practicum.shareit.item.service; import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; +import ru.practicum.shareit.exceptions.NotFoundException; import ru.practicum.shareit.item.dao.InMemoryItemStorage; import ru.practicum.shareit.item.dto.ItemDto; +import ru.practicum.shareit.item.model.Item; +import ru.practicum.shareit.user.dao.InMemoryUserStorage; -import java.util.Collection; +import java.util.ArrayList; import java.util.List; +import static ru.practicum.shareit.item.dao.ItemMapper.toItem; +import static ru.practicum.shareit.item.dao.ItemMapper.toItemDto; + +@Slf4j @Service @RequiredArgsConstructor public class ItemServiceImpl implements ItemService { private final InMemoryItemStorage inMemoryItemStorage; + private final InMemoryUserStorage inMemoryUserStorage; @Override public ItemDto addItem(ItemDto itemDto, Long ownerId) { - return inMemoryItemStorage.addItem(itemDto, ownerId); + if (!inMemoryUserStorage.getUsers().containsKey(ownerId)) { + log.warn("Владелец с указанным id " + ownerId + " не найден"); + throw new NotFoundException("Владелец с id " + ownerId + " не найден"); + } + Item item = toItem(itemDto); + item.setOwnerId(ownerId); + return toItemDto(inMemoryItemStorage.addItem(item)); } @Override public ItemDto updateItem(ItemDto itemDto, long userId) { - return inMemoryItemStorage.updateItem(itemDto, userId); + if (!inMemoryUserStorage.getUsers().containsKey(userId)) { + log.warn("Пользователь с указанным id " + userId + " не найден"); + throw new NotFoundException("Пользователь с id " + userId + " не найден"); + } + + Item newItem = toItem(itemDto); + newItem.setOwnerId(userId); + return toItemDto(inMemoryItemStorage.updateItem(newItem)); } @Override public ItemDto getItem(long itemId) { - return inMemoryItemStorage.getItem(itemId); + return toItemDto(inMemoryItemStorage.getItem(itemId)); } @Override public List getAllOwnerItems(long ownerId) { - return inMemoryItemStorage.getAllOwnerItems(ownerId); + List itemDtoList = new ArrayList<>(); + for (Item item : inMemoryItemStorage.getAllOwnerItems(ownerId)) { + itemDtoList.add(toItemDto(item)); + } + return itemDtoList; } @Override - public Collection getNecessaryItem(String text) { - return inMemoryItemStorage.getNecessaryItem(text); + public List getNecessaryItem(String text) { + List itemDtoList = new ArrayList<>(); + for (Item item : inMemoryItemStorage.getNecessaryItem(text)) { + itemDtoList.add(toItemDto(item)); + } + return itemDtoList; } } diff --git a/src/main/java/ru/practicum/shareit/request/ItemRequestController.java b/src/main/java/ru/practicum/shareit/request/controller/ItemRequestController.java similarity index 84% rename from src/main/java/ru/practicum/shareit/request/ItemRequestController.java rename to src/main/java/ru/practicum/shareit/request/controller/ItemRequestController.java index 064e2e9..02e6a98 100644 --- a/src/main/java/ru/practicum/shareit/request/ItemRequestController.java +++ b/src/main/java/ru/practicum/shareit/request/controller/ItemRequestController.java @@ -1,4 +1,4 @@ -package ru.practicum.shareit.request; +package ru.practicum.shareit.request.controller; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; diff --git a/src/main/java/ru/practicum/shareit/request/ItemRequestMapper.java b/src/main/java/ru/practicum/shareit/request/dao/ItemRequestMapper.java similarity index 80% rename from src/main/java/ru/practicum/shareit/request/ItemRequestMapper.java rename to src/main/java/ru/practicum/shareit/request/dao/ItemRequestMapper.java index 46c4b59..a9eeb20 100644 --- a/src/main/java/ru/practicum/shareit/request/ItemRequestMapper.java +++ b/src/main/java/ru/practicum/shareit/request/dao/ItemRequestMapper.java @@ -1,7 +1,8 @@ -package ru.practicum.shareit.request; +package ru.practicum.shareit.request.dao; import lombok.experimental.UtilityClass; import ru.practicum.shareit.request.dto.ItemRequestDto; +import ru.practicum.shareit.request.model.ItemRequest; @UtilityClass public class ItemRequestMapper { 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 d393086..e86b372 100644 --- a/src/main/java/ru/practicum/shareit/request/dto/ItemRequestDto.java +++ b/src/main/java/ru/practicum/shareit/request/dto/ItemRequestDto.java @@ -2,7 +2,7 @@ import lombok.AllArgsConstructor; import lombok.Data; -import ru.practicum.shareit.user.User; +import ru.practicum.shareit.user.model.User; import java.time.LocalDate; diff --git a/src/main/java/ru/practicum/shareit/request/ItemRequest.java b/src/main/java/ru/practicum/shareit/request/model/ItemRequest.java similarity index 79% rename from src/main/java/ru/practicum/shareit/request/ItemRequest.java rename to src/main/java/ru/practicum/shareit/request/model/ItemRequest.java index 59ab433..f66db0d 100644 --- a/src/main/java/ru/practicum/shareit/request/ItemRequest.java +++ b/src/main/java/ru/practicum/shareit/request/model/ItemRequest.java @@ -1,9 +1,9 @@ -package ru.practicum.shareit.request; +package ru.practicum.shareit.request.model; import jakarta.validation.Valid; import jakarta.validation.constraints.NotNull; import lombok.Data; -import ru.practicum.shareit.user.User; +import ru.practicum.shareit.user.model.User; import java.time.LocalDate; diff --git a/src/main/java/ru/practicum/shareit/user/UserServiceImpl.java b/src/main/java/ru/practicum/shareit/user/UserServiceImpl.java deleted file mode 100644 index fb5d9b1..0000000 --- a/src/main/java/ru/practicum/shareit/user/UserServiceImpl.java +++ /dev/null @@ -1,41 +0,0 @@ -package ru.practicum.shareit.user; - -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; -import ru.practicum.shareit.user.dao.InMemoryUserStorage; -import ru.practicum.shareit.user.dto.UserDto; - -import java.util.List; - -@Slf4j -@Service -@RequiredArgsConstructor -public class UserServiceImpl implements UserService { - private final InMemoryUserStorage inMemoryUserStorage; - - @Override - public UserDto addUser(UserDto userDto) { - return inMemoryUserStorage.addUser(userDto); - } - - @Override - public UserDto updateUser(UserDto userDto) { - return inMemoryUserStorage.updateUser(userDto); - } - - @Override - public List getAllUsers() { - return inMemoryUserStorage.getAllUsers(); - } - - @Override - public UserDto getUser(Long id) { - return inMemoryUserStorage.getUser(id); - } - - @Override - public void deleteUser(Long id) { - inMemoryUserStorage.deleteUser(id); - } -} diff --git a/src/main/java/ru/practicum/shareit/user/UserController.java b/src/main/java/ru/practicum/shareit/user/controller/UserController.java similarity index 93% rename from src/main/java/ru/practicum/shareit/user/UserController.java rename to src/main/java/ru/practicum/shareit/user/controller/UserController.java index 9fa2f29..1c1e928 100644 --- a/src/main/java/ru/practicum/shareit/user/UserController.java +++ b/src/main/java/ru/practicum/shareit/user/controller/UserController.java @@ -1,9 +1,10 @@ -package ru.practicum.shareit.user; +package ru.practicum.shareit.user.controller; import jakarta.validation.Valid; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.web.bind.annotation.*; +import ru.practicum.shareit.user.service.UserServiceImpl; import ru.practicum.shareit.user.dto.UserDto; import java.util.Collection; diff --git a/src/main/java/ru/practicum/shareit/user/dao/InMemoryUserStorage.java b/src/main/java/ru/practicum/shareit/user/dao/InMemoryUserStorage.java index aee4bb5..18c3226 100644 --- a/src/main/java/ru/practicum/shareit/user/dao/InMemoryUserStorage.java +++ b/src/main/java/ru/practicum/shareit/user/dao/InMemoryUserStorage.java @@ -1,22 +1,18 @@ package ru.practicum.shareit.user.dao; -import jakarta.validation.ValidationException; +import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Component; -import ru.practicum.shareit.exceptions.BadRequestException; -import ru.practicum.shareit.exceptions.NotFoundException; -import ru.practicum.shareit.user.User; -import ru.practicum.shareit.user.dto.UserDto; +import org.springframework.stereotype.Repository; +import ru.practicum.shareit.user.model.User; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; -import static ru.practicum.shareit.user.dao.UserMapper.*; - @Slf4j -@Component +@Repository +@RequiredArgsConstructor public class InMemoryUserStorage { private final Map users = new HashMap<>(); @@ -29,34 +25,13 @@ private Long getNextId() { return ++currentMaxId; } - public UserDto addUser(UserDto user) { - if (user.getEmail() == null) { - log.warn("Некорректная почта"); - throw new BadRequestException("некорректный тип почты"); - } - for (User usr : users.values()) { - if (usr.getEmail().equals(user.getEmail())) { - log.warn("такая почта уже используется"); - throw new ValidationException("Нельзя добавить существующую почту"); - } - } + public User addUser(User user) { user.setId(getNextId()); - users.put(user.getId(), toUser(user)); + users.put(user.getId(), user); return user; } - public UserDto updateUser(UserDto userDto) { - for (User usr : users.values()) { - if (usr.getEmail().equals(userDto.getEmail())) { - log.warn("такая почта уже используется"); - throw new ValidationException("Нельзя добавить существующую почту"); - } - } - if (!users.containsKey(userDto.getId())) { - log.warn("Пользователь с указанным id не найден"); - throw new NotFoundException("Пользователь с id = " + userDto.getId() + " не найден"); - } - User newUser = toUser(userDto); + public User updateUser(User newUser) { User user = users.get(newUser.getId()); if (newUser.getName() != null) { user.setName(newUser.getName()); @@ -64,20 +39,15 @@ public UserDto updateUser(UserDto userDto) { if (newUser.getEmail() != null) { user.setEmail(newUser.getEmail()); } - return toUserDto(user); + return user; } - public List getAllUsers() { - List dtoList = new ArrayList<>(); - for (User user : users.values()) { - dtoList.add(toUserDto(user)); - } - return dtoList; + public List getAllUsers() { + return new ArrayList<>(users.values()); } - public UserDto getUser(Long id) { - User user = users.get(id); - return toUserDto(user); + public User getUser(Long id) { + return users.get(id); } public void deleteUser(Long id) { diff --git a/src/main/java/ru/practicum/shareit/user/dao/UserMapper.java b/src/main/java/ru/practicum/shareit/user/dao/UserMapper.java index 6051b1a..45441cb 100644 --- a/src/main/java/ru/practicum/shareit/user/dao/UserMapper.java +++ b/src/main/java/ru/practicum/shareit/user/dao/UserMapper.java @@ -1,7 +1,7 @@ package ru.practicum.shareit.user.dao; import lombok.experimental.UtilityClass; -import ru.practicum.shareit.user.User; +import ru.practicum.shareit.user.model.User; import ru.practicum.shareit.user.dto.UserDto; @UtilityClass diff --git a/src/main/java/ru/practicum/shareit/user/User.java b/src/main/java/ru/practicum/shareit/user/model/User.java similarity index 88% rename from src/main/java/ru/practicum/shareit/user/User.java rename to src/main/java/ru/practicum/shareit/user/model/User.java index 815b4de..2db2df6 100644 --- a/src/main/java/ru/practicum/shareit/user/User.java +++ b/src/main/java/ru/practicum/shareit/user/model/User.java @@ -1,4 +1,4 @@ -package ru.practicum.shareit.user; +package ru.practicum.shareit.user.model; import jakarta.validation.constraints.Email; import lombok.AllArgsConstructor; diff --git a/src/main/java/ru/practicum/shareit/user/UserService.java b/src/main/java/ru/practicum/shareit/user/service/UserService.java similarity index 86% rename from src/main/java/ru/practicum/shareit/user/UserService.java rename to src/main/java/ru/practicum/shareit/user/service/UserService.java index ed0bba4..ccb07e8 100644 --- a/src/main/java/ru/practicum/shareit/user/UserService.java +++ b/src/main/java/ru/practicum/shareit/user/service/UserService.java @@ -1,4 +1,4 @@ -package ru.practicum.shareit.user; +package ru.practicum.shareit.user.service; import ru.practicum.shareit.user.dto.UserDto; 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..2a83d52 --- /dev/null +++ b/src/main/java/ru/practicum/shareit/user/service/UserServiceImpl.java @@ -0,0 +1,75 @@ +package ru.practicum.shareit.user.service; + +import jakarta.validation.ValidationException; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; +import ru.practicum.shareit.exceptions.BadRequestException; +import ru.practicum.shareit.exceptions.NotFoundException; +import ru.practicum.shareit.user.dao.InMemoryUserStorage; +import ru.practicum.shareit.user.dto.UserDto; +import ru.practicum.shareit.user.model.User; + +import java.util.ArrayList; +import java.util.List; + +import static ru.practicum.shareit.user.dao.UserMapper.toUser; +import static ru.practicum.shareit.user.dao.UserMapper.toUserDto; + +@Slf4j +@Service +@RequiredArgsConstructor +public class UserServiceImpl implements UserService { + private final InMemoryUserStorage inMemoryUserStorage; + + @Override + public UserDto addUser(UserDto userDto) { + User user = toUser(userDto); + if (user.getEmail() == null) { + log.warn("Некорректная почта"); + throw new BadRequestException("некорректный тип почты"); + } + for (User usr : inMemoryUserStorage.getUsers().values()) { + if (usr.getEmail().equals(user.getEmail())) { + log.warn("такая почта уже используется"); + throw new ValidationException("Нельзя добавить существующую почту"); + } + } + return toUserDto(inMemoryUserStorage.addUser((user))); + } + + @Override + public UserDto updateUser(UserDto userDto) { + for (User usr : inMemoryUserStorage.getUsers().values()) { + if (usr.getEmail().equals(userDto.getEmail())) { + log.warn("такая почта уже используется"); + throw new ValidationException("Нельзя добавить существующую почту"); + } + } + if (!inMemoryUserStorage.getUsers().containsKey(userDto.getId())) { + log.warn("Пользователь с указанным id не найден"); + throw new NotFoundException("Пользователь с id = " + userDto.getId() + " не найден"); + } + User newUser = toUser(userDto); + return toUserDto(inMemoryUserStorage.updateUser(newUser)); + } + + @Override + public List getAllUsers() { + List dtoList = new ArrayList<>(); + for (User user : inMemoryUserStorage.getAllUsers()) { + dtoList.add(toUserDto(user)); + } + return dtoList; + } + + @Override + public UserDto getUser(Long id) { + return toUserDto(inMemoryUserStorage.getUser(id)); + } + + @Override + public void deleteUser(Long id) { + inMemoryUserStorage.deleteUser(id); + } +} diff --git a/src/main/java/ru/practicum/shareit/validation/OnCreate.java b/src/main/java/ru/practicum/shareit/validation/OnCreate.java new file mode 100644 index 0000000..5f99494 --- /dev/null +++ b/src/main/java/ru/practicum/shareit/validation/OnCreate.java @@ -0,0 +1,4 @@ +package ru.practicum.shareit.validation; + +public interface OnCreate { +} diff --git a/src/main/java/ru/practicum/shareit/validation/OnUpdate.java b/src/main/java/ru/practicum/shareit/validation/OnUpdate.java new file mode 100644 index 0000000..39f429a --- /dev/null +++ b/src/main/java/ru/practicum/shareit/validation/OnUpdate.java @@ -0,0 +1,4 @@ +package ru.practicum.shareit.validation; + +public interface OnUpdate { +}