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
22 changes: 22 additions & 0 deletions pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@

<properties>
<java.version>21</java.version>
<maven-checkstyle-plugin.version>3.3.1</maven-checkstyle-plugin.version>
</properties>

<dependencies>
Expand Down Expand Up @@ -82,6 +83,27 @@
</excludes>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-checkstyle-plugin</artifactId>
<version>${maven-checkstyle-plugin.version}</version>

<configuration>
<failOnViolation>true</failOnViolation>
<logViolationsToConsole>true</logViolationsToConsole>
<includeTestSourceDirectory>true</includeTestSourceDirectory>
<configLocation>checkstyle.xml</configLocation>
</configuration>

<executions>
<execution>
<goals>
<goal>check</goal>
</goals>
<phase>compile</phase>
</execution>
</executions>
</plugin>
</plugins>
<pluginManagement>
<plugins>
Expand Down
47 changes: 45 additions & 2 deletions src/main/java/ru/practicum/shareit/item/ItemController.java
Original file line number Diff line number Diff line change
@@ -1,12 +1,55 @@
package ru.practicum.shareit.item;

import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import jakarta.validation.constraints.Positive;
import lombok.RequiredArgsConstructor;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
import ru.practicum.shareit.item.dto.ItemDto;
import ru.practicum.shareit.item.service.ItemService;
import ru.practicum.shareit.validation.OnCreate;
import ru.practicum.shareit.validation.OnUpdate;

import java.util.Collection;

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

private static final String USER_ID_HEADER = "X-Sharer-User-Id";
private final ItemService itemService;

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

@GetMapping("/search")
public Collection<ItemDto> searchItems(@RequestParam String text) {
return itemService.searchItems(text);
}

@GetMapping
public Collection<ItemDto> getItems(@RequestHeader(USER_ID_HEADER) @Positive Long userId) {
return itemService.getItems(userId);
}

@PostMapping
public ItemDto addItem(
@RequestHeader(USER_ID_HEADER) @Positive Long userId,
@RequestBody @Validated(OnCreate.class) ItemDto itemDto) {
return itemService.addItem(userId, itemDto);
}

@PatchMapping("/{itemId}")
public ItemDto updateItem(
@RequestHeader(USER_ID_HEADER) @Positive Long userId,
@PathVariable @Positive Long itemId,
@RequestBody @Validated(OnUpdate.class) ItemDto itemDto) {
return itemService.updateItem(userId, itemId, itemDto);
}

}
24 changes: 24 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,24 @@
package ru.practicum.shareit.item;

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

public class ItemMapper {
public static Item toItem(ItemDto itemDto) {
Item item = new Item();
item.setId(itemDto.getId());
item.setName(itemDto.getName());
item.setDescription(itemDto.getDescription());
item.setIsAvailable(itemDto.getAvailable());
return item;
}

public static ItemDto toItemDto(Item item) {
ItemDto itemDto = new ItemDto();
itemDto.setId(item.getId());
itemDto.setName(item.getName());
itemDto.setDescription(item.getDescription());
itemDto.setAvailable(item.getIsAvailable());
return itemDto;
}
}
18 changes: 18 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,18 @@
package ru.practicum.shareit.item.dao;

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

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

public interface ItemRepository {
Optional<Item> getItem(Long itemId);

Collection<Item> searchItems(String text);

Collection<Item> getItems(Long userId);

Item addItem(Item item);

Optional<Item> updateItem(Item item);
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,78 @@
package ru.practicum.shareit.item.dao;

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

import java.util.*;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.atomic.AtomicLong;

@Repository
public class ItemRepositoryInMemory implements ItemRepository {

private final Map<Long, Item> storage = new ConcurrentHashMap<>();
private final AtomicLong idCounter = new AtomicLong(1L);

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

@Override
public Collection<Item> searchItems(String text) {
return storage.values()
.stream()
.filter(Item::getIsAvailable)
.filter(item ->
item.getName().toLowerCase(Locale.ROOT).contains(text) ||
item.getDescription().toLowerCase(Locale.ROOT).contains(text))
.toList();
}

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

@Override
public Item addItem(Item item) {
Long id = idCounter.getAndIncrement();
item.setId(id);
storage.put(id, item);

return item;
}

@Override
public Optional<Item> updateItem(Item newItem) {
if (!storage.containsKey(newItem.getId())) {
return Optional.empty();
}

Item oldItem = storage.get(newItem.getId());
patchItem(oldItem, newItem);

return Optional.of(oldItem);
}

private void patchItem(Item oldItem, Item newItem) {
String name = newItem.getName();
String description = newItem.getDescription();
Boolean isAvailable = newItem.getIsAvailable();

if (name != null) {
oldItem.setName(name);
}

if (description != null) {
oldItem.setDescription(description);
}

if (isAvailable != null) {
oldItem.setIsAvailable(isAvailable);
}
}
}
21 changes: 21 additions & 0 deletions src/main/java/ru/practicum/shareit/item/dto/ItemDto.java
Original file line number Diff line number Diff line change
@@ -1,7 +1,28 @@
package ru.practicum.shareit.item.dto;

import jakarta.validation.constraints.NotBlank;
import jakarta.validation.constraints.NotNull;
import jakarta.validation.constraints.Size;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import ru.practicum.shareit.validation.OnCreate;
import ru.practicum.shareit.validation.OnUpdate;

/**
* TODO Sprint add-controllers.
*/
@Data
@AllArgsConstructor
@NoArgsConstructor
public class ItemDto {
private Long id;
@Size(groups = OnUpdate.class, min = 1, message = "Название предмета должно быть заполнено")
@NotBlank(groups = OnCreate.class, message = "Название предмета должно быть заполнено")
private String name;
@Size(groups = OnUpdate.class, min = 1, message = "Описание предмета должно быть заполнено")
@NotBlank(groups = OnCreate.class, message = "Описание предмета должно быть заполнено")
private String description;
@NotNull(groups = OnCreate.class, message = "Статус должен быть заполнен")
private Boolean available;
}
12 changes: 12 additions & 0 deletions src/main/java/ru/practicum/shareit/item/model/Item.java
Original file line number Diff line number Diff line change
@@ -1,7 +1,19 @@
package ru.practicum.shareit.item.model;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

/**
* TODO Sprint add-controllers.
*/
@Data
@AllArgsConstructor
@NoArgsConstructor
public class Item {
private Long id;
private String name;
private String description;
private Boolean isAvailable;
private Long ownerId;
}
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.Collection;

public interface ItemService {
ItemDto getItem(Long itemId);

Collection<ItemDto> searchItems(String text);

Collection<ItemDto> getItems(Long userId);

ItemDto addItem(Long userId, ItemDto itemDto);

ItemDto updateItem(Long userId, Long itemId, ItemDto itemDto);
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,92 @@
package ru.practicum.shareit.item.service;

import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;
import ru.practicum.shareit.item.ItemMapper;
import ru.practicum.shareit.item.dao.ItemRepository;
import ru.practicum.shareit.item.dto.ItemDto;
import ru.practicum.shareit.item.model.Item;
import ru.practicum.shareit.user.dao.UserRepository;
import ru.practicum.shareit.validation.NotFoundException;

import java.util.Collection;
import java.util.Collections;
import java.util.Locale;
import java.util.Optional;

@Service
@RequiredArgsConstructor
public class ItemServiceImpl implements ItemService {

private final ItemRepository itemRepository;
private final UserRepository userRepository;

@Override
public ItemDto getItem(Long itemId) {
Optional<Item> maybeItem = itemRepository.getItem(itemId);

if (maybeItem.isPresent()) {
return ItemMapper.toItemDto(maybeItem.get());
}

throw new NotFoundException("Предмет с id " + itemId + " не найден");
}

@Override
public Collection<ItemDto> searchItems(String text) {
if (text == null || text.isBlank()) {
return Collections.emptyList();
}

text = text.toLowerCase(Locale.ROOT);

return itemRepository.searchItems(text)
.stream()
.map(ItemMapper::toItemDto)
.toList();
}

@Override
public Collection<ItemDto> getItems(Long userId) {
throwIfUserNotFound(userId);

Collection<Item> items = itemRepository.getItems(userId);

return items.stream()
.map(ItemMapper::toItemDto)
.toList();
}

@Override
public ItemDto addItem(Long userId, ItemDto itemDto) {
throwIfUserNotFound(userId);

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

return ItemMapper.toItemDto(itemRepository.addItem(item));
}

@Override
public ItemDto updateItem(Long userId, Long itemId, ItemDto itemDto) {
throwIfUserNotFound(userId);

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

Optional<Item> maybeItem = itemRepository.updateItem(item);

if (maybeItem.isPresent()) {
return ItemMapper.toItemDto(maybeItem.get());
}

throw new NotFoundException("Предмет с id " + itemId + " не найден");
}

private void throwIfUserNotFound(Long userId) {
if (!userRepository.contains(userId)) {
throw new NotFoundException("Пользователь с id " + userId + " не найден");
}
}
}
7 changes: 0 additions & 7 deletions src/main/java/ru/practicum/shareit/user/User.java

This file was deleted.

Loading