Skip to content
Merged
Show file tree
Hide file tree
Changes from 2 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
21 changes: 21 additions & 0 deletions src/main/java/ru/practicum/shareit/booking/Booking.java
Original file line number Diff line number Diff line change
@@ -1,7 +1,28 @@
package ru.practicum.shareit.booking;

import lombok.Data;
import ru.practicum.shareit.item.model.Item;
import ru.practicum.shareit.user.model.User;

import java.time.LocalDateTime;

/**
* TODO Sprint add-bookings.
*/
@Data
public class Booking {
private Long id;
private LocalDateTime start;
private LocalDateTime end;
private Item item;
private User booker;
private Status status;

enum Status {
WAITING,
APPROVED,
REJECTED,
CANCELED
}

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
package ru.practicum.shareit.exception;

public class AlreadyExistException extends RuntimeException {
public AlreadyExistException(String message) {
super(message);
}
}
41 changes: 41 additions & 0 deletions src/main/java/ru/practicum/shareit/exception/ErrorHandler.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
package ru.practicum.shareit.exception;

import lombok.extern.slf4j.Slf4j;
import org.springframework.http.HttpStatus;
import org.springframework.web.bind.MethodArgumentNotValidException;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.ResponseStatus;
import org.springframework.web.bind.annotation.RestControllerAdvice;

@Slf4j
@RestControllerAdvice
public class ErrorHandler {

@ExceptionHandler
@ResponseStatus(HttpStatus.BAD_REQUEST)
public ErrorResponse handleValidationException(MethodArgumentNotValidException e) {
log.debug(e.getBindingResult().getAllErrors().getFirst().getDefaultMessage(), e);
return new ErrorResponse(HttpStatus.BAD_REQUEST.value(), e.getBindingResult().getAllErrors().getFirst().getDefaultMessage());
}

@ExceptionHandler
@ResponseStatus(HttpStatus.NOT_FOUND)
public ErrorResponse handleValidationException(NotFoundException e) {
log.debug(e.getMessage(), e);
return new ErrorResponse(HttpStatus.BAD_REQUEST.value(), e.getMessage());
}

@ExceptionHandler
@ResponseStatus(HttpStatus.CONFLICT)
public ErrorResponse handleValidationException(AlreadyExistException e) {
log.debug(e.getMessage(), e);
return new ErrorResponse(HttpStatus.BAD_REQUEST.value(), e.getMessage());
}

@ExceptionHandler
@ResponseStatus(HttpStatus.FORBIDDEN)
public ErrorResponse handleValidationException(NotAccessException e) {
log.debug(e.getMessage(), e);
return new ErrorResponse(HttpStatus.FORBIDDEN.value(), e.getMessage());
}
}
11 changes: 11 additions & 0 deletions src/main/java/ru/practicum/shareit/exception/ErrorResponse.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
package ru.practicum.shareit.exception;

import lombok.AllArgsConstructor;
import lombok.Data;

@Data
@AllArgsConstructor
public class ErrorResponse {
private Integer statusCode;
private String error;
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
package ru.practicum.shareit.exception;

public class NotAccessException extends RuntimeException {
public NotAccessException(String message) {
super(message);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
package ru.practicum.shareit.exception;

public class NotFoundException extends RuntimeException {
public NotFoundException(String message) {
super(message);
}
}
45 changes: 40 additions & 5 deletions src/main/java/ru/practicum/shareit/item/ItemController.java
Original file line number Diff line number Diff line change
@@ -1,12 +1,47 @@
package ru.practicum.shareit.item;

import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import jakarta.validation.Valid;
import lombok.AllArgsConstructor;
import org.springframework.web.bind.annotation.*;
import ru.practicum.shareit.item.dto.ItemDto;
import ru.practicum.shareit.item.service.ItemService;

import java.util.List;

/**
* TODO Sprint add-controllers.
*/
@RestController
@AllArgsConstructor
@RequestMapping("/items")
public class ItemController {

private final ItemService itemService;

@GetMapping
public List<ItemDto> getItemsByUserId(@RequestHeader("X-Sharer-User-Id") Long userId) {
return itemService.getItemsByUserId(userId);
}

@GetMapping("/{itemId}")
public ItemDto getItemById(@PathVariable Long itemId) {
return itemService.getItemById(itemId);
}

@PostMapping
public ItemDto createItem(
@Valid @RequestBody ItemDto itemDto,
@RequestHeader("X-Sharer-User-Id") Long userId) {
return itemService.createItem(itemDto, userId);
}

@PatchMapping("/{itemId}")
public ItemDto updateItem(
@RequestBody ItemDto itemDto,
@PathVariable Long itemId,
@RequestHeader("X-Sharer-User-Id") Long userId) {
return itemService.updateItem(itemDto, itemId, userId);
}

@GetMapping("/search")
public List<ItemDto> getItemsSearchByText(@RequestParam String text) {
return itemService.searchItemsByText(text);
}
}
18 changes: 15 additions & 3 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 jakarta.validation.constraints.NotBlank;
import jakarta.validation.constraints.NotNull;
import lombok.AllArgsConstructor;
import lombok.Data;

@Data
@AllArgsConstructor
public class ItemDto {
private Long id;
@NotBlank(message = "Название не может быть пустым")
private String name;
@NotBlank(message = "Описание не может быть пустым")
private String description;
@NotNull(message = "Статус о доступности не может быть пустым")
private Boolean available;
private Long requestId;
}
31 changes: 31 additions & 0 deletions src/main/java/ru/practicum/shareit/item/mapper/ItemMapper.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
package ru.practicum.shareit.item.mapper;

import ru.practicum.shareit.item.dto.ItemDto;
import ru.practicum.shareit.item.model.Item;
import ru.practicum.shareit.request.ItemRequest;
import ru.practicum.shareit.user.model.User;

public class ItemMapper {

public static ItemDto toItemDto(Item item) {
return new ItemDto(
item.getId(),
item.getName(),
item.getDescription(),
item.getAvailable(),
item.getRequest() != null ? item.getRequest().getId() : null
);
}

public static Item toItem(Long itemId, ItemDto itemDto, User owner, ItemRequest request) {
return new Item(
itemId,
itemDto.getName(),
itemDto.getDescription(),
itemDto.getAvailable(),
owner,
request
);
}

}
17 changes: 14 additions & 3 deletions src/main/java/ru/practicum/shareit/item/model/Item.java
Original file line number Diff line number Diff line change
@@ -1,7 +1,18 @@
package ru.practicum.shareit.item.model;

/**
* TODO Sprint add-controllers.
*/

import lombok.AllArgsConstructor;
import lombok.Data;
import ru.practicum.shareit.request.ItemRequest;
import ru.practicum.shareit.user.model.User;

@Data
@AllArgsConstructor
public class Item {
private Long id;
private String name;
private String description;
private Boolean available;
private User owner;
private ItemRequest request;
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
package ru.practicum.shareit.item.repository;

import ru.practicum.shareit.item.model.Item;

import java.util.List;
import java.util.Optional;

public interface ItemRepository {

List<Item> getItems();

List<Item> getItemsByUserId(Long userId);

Item createItem(Item item);

Item updateItem(Item item);

Optional<Item> getItemById(Long itemId);

List<Item> searchItemsByText(String text);

Long getNewItemId();
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,61 @@
package ru.practicum.shareit.item.repository;

import org.springframework.stereotype.Repository;
import ru.practicum.shareit.item.model.Item;

import java.util.*;

@Repository
public class ItemRepositoryImpl implements ItemRepository {

private Map<Long, Item> items = new HashMap<>();

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

добавь final


@Override
public List<Item> getItems() {
return new ArrayList<>(items.values());
}

@Override
public List<Item> getItemsByUserId(Long userId) {
return items.values().stream()
.filter(item -> Objects.equals(item.getOwner().getId(), userId))
.toList();
}

@Override
public Item createItem(Item item) {
items.put(item.getId(), item);
return items.get(item.getId());
}

@Override
public Item updateItem(Item item) {
items.put(item.getId(), item);
return items.get(item.getId());
}

@Override
public Optional<Item> getItemById(Long itemId) {
return Optional.ofNullable(items.get(itemId));
}

@Override
public List<Item> searchItemsByText(String text) {
return items.values().stream()
.filter(item -> (containsIgnoreCase(item.getName(), text) ||
containsIgnoreCase(item.getDescription(), text)) && item.getAvailable())
.toList();
}

private Boolean containsIgnoreCase(String text, String containsText) {
return text.toLowerCase().contains(containsText.toLowerCase());
}

@Override
public Long getNewItemId() {

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

давай этот метод сделаем внутренним и использовать его будем при создании вещи в текущем классе. Как следствие, нужно будет поправить ItemMapper.toItem()

return getItems().stream()
.map(Item::getId)
.max(Long::compareTo)
.orElse(0L) + 1;
}
}
17 changes: 17 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,17 @@
package ru.practicum.shareit.item.service;

import ru.practicum.shareit.item.dto.ItemDto;

import java.util.List;

public interface ItemService {
List<ItemDto> getItemsByUserId(Long userId);

ItemDto createItem(ItemDto itemDto, Long userId);

ItemDto updateItem(ItemDto itemDto, Long itemId, Long userId);

ItemDto getItemById(Long itemId);

List<ItemDto> searchItemsByText(String text);
}
Loading