Skip to content
Merged
Show file tree
Hide file tree
Changes from all 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
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
@@ -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;
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package ru.practicum.shareit.booking;
package ru.practicum.shareit.booking.model;

/**
* TODO Sprint add-bookings.
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
package ru.practicum.shareit.exception;

public class DuplicateException extends RuntimeException {
public DuplicateException(String message) {
super(message);
}
}
39 changes: 39 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,39 @@
package ru.practicum.shareit.exception;

import org.springframework.http.HttpStatus;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.ResponseStatus;
import org.springframework.web.bind.annotation.RestControllerAdvice;

@RestControllerAdvice
public class ErrorHandler {
@ExceptionHandler
@ResponseStatus(HttpStatus.CONFLICT)
public ErrorResponse handleDuplicateException(final DuplicateException 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.NOT_FOUND)
public ErrorResponse handleNotFoundException(final NotFoundException e) {
return new ErrorResponse(e.getMessage(), "Ресурс не найден");
}

@ExceptionHandler
@ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR)
public ErrorResponse handleIllegalArgumentException(final IllegalArgumentException e) {
return new ErrorResponse(e.getMessage(), "Ошибка на стороне сервера");
}

@ExceptionHandler
@ResponseStatus(HttpStatus.FORBIDDEN)
public ErrorResponse handleForbiddenException(final ForbiddenException e) {
return new ErrorResponse(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.Getter;
import lombok.RequiredArgsConstructor;

@Getter
@RequiredArgsConstructor
public class ErrorResponse {
private final String error;
private final String description;
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
package ru.practicum.shareit.exception;

public class ForbiddenException extends RuntimeException {
public ForbiddenException(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 IllegalArgumentException extends RuntimeException {
public IllegalArgumentException(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);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
package ru.practicum.shareit.exception;

public class ValidationException extends RuntimeException {
public ValidationException(String message) {
super(message);
}
}
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,62 @@
package ru.practicum.shareit.item.controller;

import lombok.NonNull;
import lombok.RequiredArgsConstructor;
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 java.util.Collection;

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

private final ItemService itemService;

@GetMapping
public Collection<ItemDto> findAllByUserId(@NonNull @RequestHeader("X-Sharer-User-Id") Long userId) {
log.info("Запрос на получение всех вещей пользователя c Id:{}", userId);
return itemService.findAllByUserId(userId);
}

@GetMapping("/{itemId}")
public ItemDto findById(@NonNull @PathVariable Long itemId) {
log.info("Запрос на получение вещи с Id:{}", itemId);
return itemService.findById(itemId);
}

@GetMapping("/search")
public Collection<ItemDto> searchByText(@NonNull @RequestParam("text") String searchText) {
log.info("Запрос на поиск вещи в названии или в описании");
return itemService.searchByText(searchText);
}

@PostMapping
public ItemDto create(@NonNull @RequestHeader("X-Sharer-User-Id") Long userId,
@NonNull @RequestBody ItemDto newItem) {
log.info("Запрос на добавление новой вещи пользователем с Id:{}", userId);
return itemService.create(userId, newItem);
}

@PatchMapping("/{itemId}")
public ItemDto update(@NonNull @RequestHeader("X-Sharer-User-Id") Long ownerId,
@NonNull @PathVariable Long itemId,
@NonNull @RequestBody ItemDto updatedItem) {
log.info("Запрос на обновление вещи с Id:{} пользователем с Id:{}", itemId, ownerId);
return itemService.update(ownerId, itemId, updatedItem);
}

@DeleteMapping("/{itemId}")
public void delete(@NonNull @RequestHeader("X-Sharer-User-Id") Long ownerId,
@NonNull @PathVariable Long itemId) {
log.info("Запрос на удаление вещи с Id:{} пользователем с Id:{}", itemId, ownerId);
itemService.delete(ownerId, itemId);
}
}
20 changes: 20 additions & 0 deletions src/main/java/ru/practicum/shareit/item/dao/ItemRepository.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.model.Item;

import java.util.Collection;
import java.util.Optional;

public interface ItemRepository {
Collection<Item> findAllByUserId(Long userId);

Optional<Item> findById(Long itemId);

Collection<Item> searchByText(String searchText);

Item create(Item item, Long userId);

Item update(Item item);

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

import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Repository;
import ru.practicum.shareit.item.model.Item;

import java.util.*;

@Slf4j
@Repository
public class ItemRepositoryImpl implements ItemRepository {

private final Map<Long, Item> items = new HashMap<>();
private final Map<Long, List<Item>> userItemIndex = new HashMap<>();
private long idCounter = 0L;

@Override
public Collection<Item> findAllByUserId(Long userId) {
return items.values()
.stream()
.filter(item -> item.getOwnerId().equals(userId))
.toList();
}

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

@Override
public Collection<Item> searchByText(String searchText) {
String text = searchText.toLowerCase();
return items.values()
.stream()
.filter(item -> (item.getName().toLowerCase().contains(text))
|| (item.getDescription().toLowerCase().contains(text))
&& (item.getAvailable().equals(true)))
.toList();
}

@Override
public Item create(Item item, Long userId) {
item.setItemId(++idCounter);
item.setOwnerId(userId);
items.put(item.getItemId(), item);
final List<Item> itemsByOwner = userItemIndex.computeIfAbsent(item.getOwnerId(), k -> new ArrayList<>());
itemsByOwner.add(item);
return item;
}

@Override
public Item update(Item item) {
items.put(item.getItemId(), item);
return item;
}

@Override
public void delete(Long itemId) {
items.remove(itemId);
}
}
15 changes: 11 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,14 @@
package ru.practicum.shareit.item.dto;

/**
* TODO Sprint add-controllers.
*/
import lombok.Builder;
import lombok.Data;

@Data
@Builder(toBuilder = true)
public class ItemDto {
}
private Long id;
private String name;
private String description;
private Boolean available;
private Long ownerId;
}
29 changes: 29 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,29 @@
package ru.practicum.shareit.item.mapper;

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

public class ItemMapper {

// Преобразование Item в Dto
public static ItemDto mapToDto(Item item) {
return ItemDto.builder()
.id(item.getItemId())
.name(item.getName())
.description(item.getDescription())
.available(item.getAvailable())
.ownerId(item.getOwnerId())
.build();
}

// Преобразование ItemDto в Item
public static Item mapToItem(ItemDto itemDto) {
return Item.builder()
.itemId(itemDto.getId())
.name(itemDto.getName())
.description(itemDto.getDescription())
.available(itemDto.getAvailable())
.ownerId(itemDto.getOwnerId())
.build();
}
}
12 changes: 11 additions & 1 deletion src/main/java/ru/practicum/shareit/item/model/Item.java
Original file line number Diff line number Diff line change
@@ -1,7 +1,17 @@
package ru.practicum.shareit.item.model;

import lombok.Builder;
import lombok.Data;

/**
* TODO Sprint add-controllers.
*/
@Data
@Builder(toBuilder = true)
public class Item {
}
private Long itemId;
private String name;
private String description;
private Boolean available;
private Long ownerId;
}
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.Collection;

public interface ItemService {
Collection<ItemDto> findAllByUserId(Long userId);

ItemDto findById(Long itemId);

Collection<ItemDto> searchByText(String searchText);

ItemDto create(Long ownerId, ItemDto newItem);

ItemDto update(Long ownerId, Long itemId, ItemDto updatedItem);

void delete(Long ownerID, Long itemId);
}
Loading