Skip to content

Commit

Permalink
feat: выполнено тз спринта 13
Browse files Browse the repository at this point in the history
  • Loading branch information
kapetrosyan1 committed Feb 21, 2024
1 parent fcdcc48 commit e9da141
Show file tree
Hide file tree
Showing 25 changed files with 681 additions and 44 deletions.
9 changes: 4 additions & 5 deletions src/main/java/ru/practicum/shareit/ShareItApp.java
Original file line number Diff line number Diff line change
Expand Up @@ -6,8 +6,7 @@
@SpringBootApplication
public class ShareItApp {

public static void main(String[] args) {
SpringApplication.run(ShareItApp.class, args);
}

}
public static void main(String[] args) {
SpringApplication.run(ShareItApp.class, args);
}
}
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("Произошла непредвиденная ошибка.");
}
}
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);
}
}
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);
}
}
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);
}
}
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 src/main/java/ru/practicum/shareit/item/ItemController.java

This file was deleted.

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 src/main/java/ru/practicum/shareit/item/dao/ItemStorage.java
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);
}
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);
}
}
20 changes: 16 additions & 4 deletions src/main/java/ru/practicum/shareit/item/dto/ItemDto.java
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 src/main/java/ru/practicum/shareit/item/dto/ItemMapper.java
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();
}
}
15 changes: 11 additions & 4 deletions src/main/java/ru/practicum/shareit/item/model/Item.java
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 src/main/java/ru/practicum/shareit/item/service/ItemService.java
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);
}
Loading

0 comments on commit e9da141

Please sign in to comment.