Skip to content
Closed
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
56 changes: 50 additions & 6 deletions src/main/java/ru/practicum/shareit/item/ItemController.java
Original file line number Diff line number Diff line change
@@ -1,12 +1,56 @@
package ru.practicum.shareit.item;

import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
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;

/**
* TODO Sprint add-controllers.
*/
import java.util.List;

@Slf4j
@RestController
@RequestMapping("/items")
@RequiredArgsConstructor
public class ItemController {
}
private final ItemService itemService;

@GetMapping
public List<ItemDto> findAllByUser(@RequestHeader("X-Sharer-User-Id") Long userId) {
log.info("GET /items для пользователя {}", userId);
return itemService.findAllByUser(userId);
}

@GetMapping("/{itemId}")
public ItemDto findById(@PathVariable Long itemId) {
log.info("GET /items/{}", itemId);
return itemService.findById(itemId);
}

@PostMapping
public ItemDto create(@RequestHeader("X-Sharer-User-Id") Long userId,
@RequestBody ItemDto itemDto) {
log.info("POST /items для пользователя {}", userId);
return itemService.create(userId, itemDto);
}

@PatchMapping("/{itemId}")
public ItemDto update(@RequestHeader("X-Sharer-User-Id") Long userId,
@PathVariable Long itemId,
@RequestBody ItemDto itemDto) {
log.info("PATCH /items/{} для пользователя {}", itemId, userId);
return itemService.update(userId, itemId, itemDto);
}

@DeleteMapping("/{itemId}")
public void delete(@PathVariable Long itemId) {
log.info("DELETE /items/{}", itemId);
itemService.delete(itemId);
}

@GetMapping("/search")
public List<ItemDto> search(@RequestParam String text) {
log.info("GET /items/search?text={}", text);
return itemService.search(text);
}
}
32 changes: 32 additions & 0 deletions src/main/java/ru/practicum/shareit/item/ItemMapper.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
package ru.practicum.shareit.item;

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

public class ItemMapper {
public static ItemDto toItemDto(Item item) {
if (item == null) {
return null;
}
ItemDto dto = new ItemDto();
dto.setId(item.getId());
dto.setName(item.getName());
dto.setDescription(item.getDescription());
dto.setAvailable(item.getAvailable());
dto.setRequestId(item.getRequestId());
return dto;
}

public static Item toItem(ItemDto itemDto) {
if (itemDto == null) {
return null;
}
Item item = new Item();
item.setId(itemDto.getId());
item.setName(itemDto.getName());
item.setDescription(itemDto.getDescription());
item.setAvailable(itemDto.getAvailable());
item.setRequestId(itemDto.getRequestId());
return item;
}
}
13 changes: 9 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,12 @@
package ru.practicum.shareit.item.dto;

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

@Data
public class ItemDto {
}
private Long id;
private String name;
private String description;
private Boolean available;
private Long requestId;
}
14 changes: 10 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,13 @@
package ru.practicum.shareit.item.model;

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

@Data
public class Item {
}
private Long id;
private String name;
private String description;
private Boolean available;
private Long ownerId;
private Long requestId;
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,56 @@
package ru.practicum.shareit.item.repository;

import org.springframework.stereotype.Repository;
import ru.practicum.shareit.item.model.Item;
import java.util.*;
import java.util.concurrent.atomic.AtomicLong;
import java.util.stream.Collectors;

@Repository
public class InMemoryItemRepository implements ItemRepository {
private final Map<Long, Item> items = new HashMap<>();
private final AtomicLong idGenerator = new AtomicLong(1);

@Override
public List<Item> findAllByOwnerId(Long ownerId) {
return items.values().stream()
.filter(item -> ownerId.equals(item.getOwnerId()))
.collect(Collectors.toList());
}

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

@Override
public Item save(Item item) {
item.setId(idGenerator.getAndIncrement());
items.put(item.getId(), item);
return item;
}

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

@Override
public void delete(Long id) {
items.remove(id);
}

@Override
public List<Item> search(String text) {
if (text == null || text.isBlank()) {
return Collections.emptyList();
}
String lowerText = text.toLowerCase();
return items.values().stream()
.filter(Item::getAvailable)
.filter(item -> (item.getName() != null && item.getName().toLowerCase().contains(lowerText))
|| (item.getDescription() != null && item.getDescription().toLowerCase().contains(lowerText)))
.collect(Collectors.toList());
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
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> findAllByOwnerId(Long ownerId);

Optional<Item> findById(Long id);

Item save(Item item);

Item update(Item item);

void delete(Long id);

List<Item> search(String text);
}
18 changes: 18 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,18 @@
package ru.practicum.shareit.item.service;

import ru.practicum.shareit.item.dto.ItemDto;
import java.util.List;

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

ItemDto findById(Long id);

ItemDto create(Long userId, ItemDto itemDto);

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

void delete(Long id);

List<ItemDto> search(String text);
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,88 @@
package ru.practicum.shareit.item.service;

import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
import ru.practicum.shareit.item.ItemMapper;
import ru.practicum.shareit.item.dto.ItemDto;
import ru.practicum.shareit.item.model.Item;
import ru.practicum.shareit.item.repository.ItemRepository;
import ru.practicum.shareit.user.repository.UserRepository;

import java.util.List;
import java.util.stream.Collectors;

@Slf4j
@Service
@RequiredArgsConstructor
public class ItemServiceImpl implements ItemService {
private final ItemRepository itemRepository;
private final UserRepository userRepository;

@Override
public List<ItemDto> findAllByUser(Long userId) {
log.info("Получение всех вещей пользователя {}", userId);
return itemRepository.findAllByOwnerId(userId).stream()
.map(ItemMapper::toItemDto)
.collect(Collectors.toList());
}

@Override
public ItemDto findById(Long id) {
log.info("Получение вещи с id {}", id);
Item item = itemRepository.findById(id)
.orElseThrow(() -> new RuntimeException("Вещь не найдена"));
return ItemMapper.toItemDto(item);
}

@Override
public ItemDto create(Long userId, ItemDto itemDto) {
log.info("Создание вещи для пользователя {}", userId);
userRepository.findById(userId)
.orElseThrow(() -> new RuntimeException("Пользователь не найден"));

Item item = ItemMapper.toItem(itemDto);
item.setOwnerId(userId);

Item saved = itemRepository.save(item);
return ItemMapper.toItemDto(saved);
}

@Override
public ItemDto update(Long userId, Long itemId, ItemDto itemDto) {
log.info("Обновление вещи {} для пользователя {}", itemId, userId);
Item existing = itemRepository.findById(itemId)
.orElseThrow(() -> new RuntimeException("Вещь не найдена"));

if (!userId.equals(existing.getOwnerId())) {
throw new RuntimeException("Только владелец может редактировать вещь");
}

if (itemDto.getName() != null) {
existing.setName(itemDto.getName());
}
if (itemDto.getDescription() != null) {
existing.setDescription(itemDto.getDescription());
}
if (itemDto.getAvailable() != null) {
existing.setAvailable(itemDto.getAvailable());
}

Item updated = itemRepository.update(existing);
return ItemMapper.toItemDto(updated);
}

@Override
public void delete(Long id) {
log.info("Удаление вещи {}", id);
itemRepository.delete(id);
}

@Override
public List<ItemDto> search(String text) {
log.info("Поиск вещей по тексту: {}", text);
return itemRepository.search(text).stream()
.map(ItemMapper::toItemDto)
.collect(Collectors.toList());
}
}
7 changes: 0 additions & 7 deletions src/main/java/ru/practicum/shareit/user/User.java

This file was deleted.

49 changes: 42 additions & 7 deletions src/main/java/ru/practicum/shareit/user/UserController.java
Original file line number Diff line number Diff line change
@@ -1,12 +1,47 @@
package ru.practicum.shareit.user;

import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.*;
import ru.practicum.shareit.user.dto.UserDto;
import ru.practicum.shareit.user.service.UserService;

/**
* TODO Sprint add-controllers.
*/
import java.util.List;

@Slf4j
@RestController
@RequestMapping(path = "/users")
@RequestMapping("/users")
@RequiredArgsConstructor
public class UserController {
}
private final UserService userService;

@GetMapping
public List<UserDto> findAll() {
log.info("GET /users");
return userService.findAll();
}

@GetMapping("/{id}")
public UserDto findById(@PathVariable Long id) {
log.info("GET /users/{}", id);
return userService.findById(id);
}

@PostMapping
public UserDto create(@RequestBody UserDto userDto) {
log.info("POST /users - создание пользователя");
return userService.create(userDto);
}

@PatchMapping("/{id}")
public UserDto update(@PathVariable Long id, @RequestBody UserDto userDto) {
log.info("PATCH /users/{} - обновление пользователя", id);
return userService.update(id, userDto);
}

@DeleteMapping("/{id}")
public void delete(@PathVariable Long id) {
log.info("DELETE /users/{}", id);
userService.delete(id);
}
}
Loading
Loading