generated from yandex-praktikum/java-shareit
-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
1 parent
fcdcc48
commit e9da141
Showing
25 changed files
with
681 additions
and
44 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
44 changes: 44 additions & 0 deletions
44
src/main/java/ru/practicum/shareit/exception/controller/ErrorHandler.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,44 @@ | ||
package ru.practicum.shareit.exception.controller; | ||
|
||
import org.springframework.http.HttpStatus; | ||
import org.springframework.web.bind.MethodArgumentNotValidException; | ||
import org.springframework.web.bind.annotation.ExceptionHandler; | ||
import org.springframework.web.bind.annotation.ResponseStatus; | ||
import org.springframework.web.bind.annotation.RestControllerAdvice; | ||
import ru.practicum.shareit.exception.exceptions.AlreadyExistException; | ||
import ru.practicum.shareit.exception.exceptions.NotFoundException; | ||
import ru.practicum.shareit.exception.exceptions.ValidationException; | ||
import ru.practicum.shareit.exception.model.ErrorResponse; | ||
|
||
@RestControllerAdvice | ||
public class ErrorHandler { | ||
@ExceptionHandler | ||
@ResponseStatus(HttpStatus.NOT_FOUND) | ||
public ErrorResponse handleNotFoundException(final NotFoundException e) { | ||
return new ErrorResponse(e.getMessage()); | ||
} | ||
|
||
@ExceptionHandler | ||
@ResponseStatus(HttpStatus.CONFLICT) | ||
public ErrorResponse handleAlreadyExistException(final AlreadyExistException e) { | ||
return new ErrorResponse(e.getMessage()); | ||
} | ||
|
||
@ExceptionHandler | ||
@ResponseStatus(HttpStatus.BAD_REQUEST) | ||
public ErrorResponse handleValidationException(final ValidationException e) { | ||
return new ErrorResponse(e.getMessage()); | ||
} | ||
|
||
@ExceptionHandler | ||
@ResponseStatus(HttpStatus.BAD_REQUEST) | ||
public ErrorResponse handleMethodArgumentNotValidException(final MethodArgumentNotValidException e) { | ||
return new ErrorResponse(e.getMessage()); | ||
} | ||
|
||
@ExceptionHandler | ||
@ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR) | ||
public ErrorResponse handleThrowable(final Throwable e) { | ||
return new ErrorResponse("Произошла непредвиденная ошибка."); | ||
} | ||
} |
7 changes: 7 additions & 0 deletions
7
src/main/java/ru/practicum/shareit/exception/exceptions/AlreadyExistException.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,7 @@ | ||
package ru.practicum.shareit.exception.exceptions; | ||
|
||
public class AlreadyExistException extends RuntimeException { | ||
public AlreadyExistException(String m) { | ||
super(m); | ||
} | ||
} |
7 changes: 7 additions & 0 deletions
7
src/main/java/ru/practicum/shareit/exception/exceptions/NotFoundException.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,7 @@ | ||
package ru.practicum.shareit.exception.exceptions; | ||
|
||
public class NotFoundException extends RuntimeException { | ||
public NotFoundException(String m) { | ||
super(m); | ||
} | ||
} |
7 changes: 7 additions & 0 deletions
7
src/main/java/ru/practicum/shareit/exception/exceptions/ValidationException.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,7 @@ | ||
package ru.practicum.shareit.exception.exceptions; | ||
|
||
public class ValidationException extends RuntimeException { | ||
public ValidationException(String m) { | ||
super(m); | ||
} | ||
} |
12 changes: 12 additions & 0 deletions
12
src/main/java/ru/practicum/shareit/exception/model/ErrorResponse.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,12 @@ | ||
package ru.practicum.shareit.exception.model; | ||
|
||
import lombok.Getter; | ||
|
||
@Getter | ||
public class ErrorResponse { | ||
private final String error; | ||
|
||
public ErrorResponse(String error) { | ||
this.error = error; | ||
} | ||
} |
12 changes: 0 additions & 12 deletions
12
src/main/java/ru/practicum/shareit/item/ItemController.java
This file was deleted.
Oops, something went wrong.
60 changes: 60 additions & 0 deletions
60
src/main/java/ru/practicum/shareit/item/controller/ItemController.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,60 @@ | ||
package ru.practicum.shareit.item.controller; | ||
|
||
import lombok.extern.slf4j.Slf4j; | ||
import org.springframework.web.bind.annotation.*; | ||
import ru.practicum.shareit.item.dto.ItemDto; | ||
import ru.practicum.shareit.item.service.ItemService; | ||
|
||
import javax.validation.Valid; | ||
import java.util.List; | ||
|
||
@RestController | ||
@RequestMapping("/items") | ||
@Slf4j | ||
public class ItemController { | ||
private final ItemService service; | ||
|
||
public ItemController(ItemService service) { | ||
this.service = service; | ||
} | ||
|
||
@PostMapping | ||
public ItemDto create(@Valid @RequestHeader("X-Sharer-User-Id") int userId, | ||
@RequestBody @Valid ItemDto itemDto) { | ||
log.info("ItemController: обработка запроса от пользователя " + userId + " на добавление вещи + itemDto.toString()"); | ||
return service.create(userId, itemDto); | ||
} | ||
|
||
@PatchMapping("/{itemId}") | ||
public ItemDto update(@RequestHeader("X-Sharer-User-Id") int userId, | ||
@PathVariable int itemId, | ||
@RequestBody ItemDto itemDto) { | ||
log.info("ItemController: обработка запроса на обновление вещи с id {} от пользователя {}", itemId, userId); | ||
return service.update(userId, itemId, itemDto); | ||
} | ||
|
||
@GetMapping("/{itemId}") | ||
public ItemDto findById(@PathVariable int itemId) { | ||
log.info("ItemController: обработка запроса на поиск вещи с id {}", itemId); | ||
return service.findById(itemId); | ||
} | ||
|
||
@GetMapping | ||
public List<ItemDto> findOwnersItems(@RequestHeader("X-Sharer-User-Id") int userId) { | ||
log.info("ItemController: обработка запроса на поиск вещей пользователя с id {}", userId); | ||
return service.findOwnersItems(userId); | ||
} | ||
|
||
@GetMapping("/search") | ||
public List<ItemDto> searchItems(@RequestParam String text) { | ||
log.info("ItemController: обработка запроса на поиск вещей, содержащих в названии или описании фрагмент {}", text); | ||
return service.searchItems(text); | ||
} | ||
|
||
@DeleteMapping("/{itemId}") | ||
public void delete(@RequestHeader("X-Sharer-User-Id") int userId, | ||
@PathVariable int itemId) { | ||
log.info("ItemController: обработка запроса на удаление вещи с id {} от пользователя {}", itemId, userId); | ||
service.delete(userId, itemId); | ||
} | ||
} |
20 changes: 20 additions & 0 deletions
20
src/main/java/ru/practicum/shareit/item/dao/ItemStorage.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,20 @@ | ||
package ru.practicum.shareit.item.dao; | ||
|
||
import ru.practicum.shareit.item.dto.ItemDto; | ||
import ru.practicum.shareit.item.model.Item; | ||
|
||
import java.util.List; | ||
|
||
public interface ItemStorage { | ||
Item create(int userId, ItemDto itemDto); | ||
|
||
Item update(int userId, int itemId, ItemDto itemDto); | ||
|
||
Item findById(int itemId); | ||
|
||
List<Item> findOwnersItems(int userId); | ||
|
||
void delete(int userId, int itemId); | ||
|
||
List<Item> searchItems(String substring); | ||
} |
98 changes: 98 additions & 0 deletions
98
src/main/java/ru/practicum/shareit/item/dao/impl/ItemStorageImpl.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,98 @@ | ||
package ru.practicum.shareit.item.dao.impl; | ||
|
||
import lombok.extern.slf4j.Slf4j; | ||
import org.springframework.stereotype.Repository; | ||
import ru.practicum.shareit.exception.exceptions.NotFoundException; | ||
import ru.practicum.shareit.item.dao.ItemStorage; | ||
import ru.practicum.shareit.item.dto.ItemDto; | ||
import ru.practicum.shareit.item.dto.ItemMapper; | ||
import ru.practicum.shareit.item.model.Item; | ||
|
||
import java.util.ArrayList; | ||
import java.util.HashMap; | ||
import java.util.List; | ||
import java.util.stream.Collectors; | ||
|
||
@Repository | ||
@Slf4j | ||
public class ItemStorageImpl implements ItemStorage { | ||
private final HashMap<Integer, Item> storage = new HashMap<>(); | ||
private final HashMap<Integer, List<Integer>> ownerItems = new HashMap<>(); | ||
private int id = 1; | ||
|
||
@Override | ||
public Item create(int userId, ItemDto itemDto) { | ||
log.info("ItemStorage: обработка запроса на добавление вещи {} от пользователя {}", itemDto.toString(), userId); | ||
Item item = ItemMapper.toItem(itemDto); | ||
item.setId(id); | ||
item.setOwner(userId); | ||
storage.put(id, item); | ||
if (ownerItems.containsKey(userId)) { | ||
ownerItems.get(userId).add(id); | ||
id++; | ||
return item; | ||
} | ||
ownerItems.put(userId, List.of(item.getId())); | ||
id++; | ||
return item; | ||
} | ||
|
||
@Override | ||
public Item update(int userId, int itemId, ItemDto itemDto) { | ||
log.info("ItemStorage: обработка запроса на обновление вещи с id {} от пользователя {}", itemId, userId); | ||
if (!storage.containsKey(itemId) || storage.get(itemId).getOwner() != userId) { | ||
throw new NotFoundException("Вещь с id " + itemId + | ||
" не найдена или не является собственностью пользователя с id " + userId); | ||
} | ||
Item item = storage.get(itemId); | ||
if (itemDto.getName() != null) { | ||
item.setName(itemDto.getName()); | ||
} | ||
if (itemDto.getDescription() != null) { | ||
item.setDescription(itemDto.getDescription()); | ||
} | ||
if (itemDto.getAvailable() != null) { | ||
item.setAvailable(itemDto.getAvailable()); | ||
} | ||
return item; | ||
} | ||
|
||
@Override | ||
public Item findById(int itemId) { | ||
log.info("ItemStorage: обработка запроса на поиск вещи с id {}", itemId); | ||
if (!storage.containsKey(itemId)) { | ||
throw new NotFoundException("Вещь с id " + itemId + " не найдена"); | ||
} | ||
return storage.get(itemId); | ||
} | ||
|
||
@Override | ||
public List<Item> findOwnersItems(int userId) { | ||
log.info("ItemStorage: обработка запроса на поиск вещей пользователя с id {}", userId); | ||
List<Item> itemList = new ArrayList<>(); | ||
for (int itemId : ownerItems.get(userId)) { | ||
itemList.add(storage.get(itemId)); | ||
} | ||
return itemList; | ||
} | ||
|
||
@Override | ||
public List<Item> searchItems(String text) { | ||
log.info("ItemStorage: обработка запроса на поиск вещей, содержащих в названии или описании фрагмент {}", text); | ||
return storage.values().stream() | ||
.filter(Item::getAvailable) | ||
.filter(item -> (item.getName().toLowerCase().contains(text)) || | ||
item.getDescription().toLowerCase().contains(text)) | ||
.collect(Collectors.toList()); | ||
} | ||
|
||
@Override | ||
public void delete(int userId, int itemId) { | ||
log.info("ItemStorage: обработка запроса на удаление вещи с id {} от пользователя {}",itemId, userId); | ||
if (!storage.containsKey(itemId) || storage.get(itemId).getOwner() != userId) { | ||
throw new NotFoundException("Вещь с id " + itemId + " и с владельцем с id " + userId + " не найдена"); | ||
} | ||
storage.remove(itemId); | ||
ownerItems.get(userId).remove(itemId); | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,7 +1,19 @@ | ||
package ru.practicum.shareit.item.dto; | ||
|
||
/** | ||
* TODO Sprint add-controllers. | ||
*/ | ||
import lombok.Builder; | ||
import lombok.Data; | ||
|
||
import javax.validation.constraints.NotBlank; | ||
import javax.validation.constraints.NotNull; | ||
|
||
@Data | ||
@Builder | ||
public class ItemDto { | ||
} | ||
private int id; | ||
@NotBlank | ||
private String name; | ||
@NotBlank | ||
private String description; | ||
@NotNull | ||
private Boolean available; | ||
} |
23 changes: 23 additions & 0 deletions
23
src/main/java/ru/practicum/shareit/item/dto/ItemMapper.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,23 @@ | ||
package ru.practicum.shareit.item.dto; | ||
|
||
import ru.practicum.shareit.item.model.Item; | ||
|
||
public class ItemMapper { | ||
public static ItemDto toItemDto(Item item) { | ||
return ItemDto.builder() | ||
.id(item.getId()) | ||
.name(item.getName()) | ||
.description(item.getDescription()) | ||
.available(item.getAvailable()) | ||
.build(); | ||
} | ||
|
||
public static Item toItem(ItemDto itemDto) { | ||
return Item.builder() | ||
.id(itemDto.getId()) | ||
.name(itemDto.getName()) | ||
.description(itemDto.getDescription()) | ||
.available(itemDto.getAvailable()) | ||
.build(); | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,7 +1,14 @@ | ||
package ru.practicum.shareit.item.model; | ||
|
||
/** | ||
* TODO Sprint add-controllers. | ||
*/ | ||
import lombok.Builder; | ||
import lombok.Data; | ||
|
||
@Data | ||
@Builder | ||
public class Item { | ||
} | ||
private int id; | ||
private String name; | ||
private String description; | ||
private Boolean available; | ||
private int owner; | ||
} |
19 changes: 19 additions & 0 deletions
19
src/main/java/ru/practicum/shareit/item/service/ItemService.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,19 @@ | ||
package ru.practicum.shareit.item.service; | ||
|
||
import ru.practicum.shareit.item.dto.ItemDto; | ||
|
||
import java.util.List; | ||
|
||
public interface ItemService { | ||
ItemDto create(int userId, ItemDto itemDto); | ||
|
||
ItemDto update(int userId, int itemId, ItemDto itemDto); | ||
|
||
ItemDto findById(int itemId); | ||
|
||
List<ItemDto> findOwnersItems(int userId); | ||
|
||
List<ItemDto> searchItems(String substring); | ||
|
||
void delete(int userId, int itemId); | ||
} |
Oops, something went wrong.