Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

add-controllers commit #66

Closed
wants to merge 1 commit into from
Closed
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
6 changes: 3 additions & 3 deletions src/main/java/ru/practicum/shareit/ShareItApp.java
Original file line number Diff line number Diff line change
@@ -6,8 +6,8 @@
@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);
}

}
18 changes: 18 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,25 @@
package ru.practicum.shareit.booking;

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

import java.time.LocalDateTime;

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

public enum BookingType {
WAITING,
APPROVED,
REJECTED,
CANCELED
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
package ru.practicum.shareit.exceptions;

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

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

@RestControllerAdvice
@Slf4j
public class ErrorHandler {
@ExceptionHandler
@ResponseStatus(HttpStatus.NOT_FOUND)
public ErrorResponse handleNotFoundError(final NotFoundException e) {
log.info("404 {}", e.getMessage());
return new ErrorResponse(e.getMessage());
}

@ExceptionHandler
@ResponseStatus(HttpStatus.CONFLICT)
public ErrorResponse handleConflictError(final ConflictExceptions e) {
log.info("409 {}", e.getMessage());
return new ErrorResponse(e.getMessage());
}

@ExceptionHandler
@ResponseStatus(HttpStatus.BAD_REQUEST)
public ErrorResponse argumentNotValidException(final MethodArgumentNotValidException e) {
log.info("400 {}", e.getMessage());
return new ErrorResponse(e.getBindingResult().getAllErrors().getFirst().getDefaultMessage());
}

@ExceptionHandler
@ResponseStatus(HttpStatus.BAD_REQUEST)
public ErrorResponse constraintViolationException(final ConstraintViolationException e) {
log.info("400 {}", e.getMessage());
return new ErrorResponse(e.getLocalizedMessage());
}

@ExceptionHandler
@ResponseStatus(HttpStatus.BAD_REQUEST)
public ErrorResponse missingRequestHeaderException(final MissingRequestHeaderException e) {
log.info("400 {}", e.getMessage());
return new ErrorResponse(e.getLocalizedMessage());
}
}
16 changes: 16 additions & 0 deletions src/main/java/ru/practicum/shareit/exceptions/ErrorResponse.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
package ru.practicum.shareit.exceptions;

import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;

@Getter
@Setter
@NoArgsConstructor
public class ErrorResponse {
private String message;

public ErrorResponse(String message) {
this.message = message;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
package ru.practicum.shareit.exceptions;

public class NotFoundException extends RuntimeException {
public NotFoundException(final String message) {
super(message);
}
}
49 changes: 47 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,57 @@
package ru.practicum.shareit.item;

import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import jakarta.validation.Valid;
import jakarta.validation.constraints.NotNull;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.http.HttpStatus;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
import ru.practicum.shareit.item.dto.ItemDto;
import ru.practicum.shareit.validation.Marker;

import java.util.List;

/**
* TODO Sprint add-controllers.
*/
@RestController
@RequestMapping("/items")
@Slf4j
@Validated
@RequiredArgsConstructor
public class ItemController {
private final ItemService itemService;

@PostMapping
@ResponseStatus(HttpStatus.CREATED)
@Validated(Marker.AddItem.class)
public ItemDto addItem(@RequestHeader("X-Sharer-User-Id") @Valid @NotNull Long userId, @RequestBody @Valid ItemDto itemDto) {
return itemService.addItem(userId, itemDto);
}

@PatchMapping("/{itemId}")
@ResponseStatus(HttpStatus.OK)
@Validated(Marker.UpdateItem.class)
public ItemDto updateItem(@RequestHeader("X-Sharer-User-Id") @Valid @NotNull Long userId, @RequestBody @Valid ItemDto itemDto, @PathVariable("itemId") long itemId) {
return itemService.updateItem(userId, itemDto, itemId);
}

@GetMapping("/{itemId}")
@ResponseStatus(HttpStatus.OK)
public ItemDto getItemById(@RequestHeader("X-Sharer-User-Id") @Valid @NotNull Long userId, @PathVariable("itemId") long itemId) {
return itemService.getItemById(userId, itemId);
}

@GetMapping
@ResponseStatus(HttpStatus.OK)
public List<ItemDto> getItemsFromUsers(@RequestHeader("X-Sharer-User-Id") @Valid @NotNull Long userId) {
return itemService.getItemsFromUsers(userId);
}

@GetMapping("/search")
@ResponseStatus(HttpStatus.OK)
public List<ItemDto> search(@RequestHeader("X-Sharer-User-Id") @Valid @NotNull Long userId, @RequestParam(name = "text") String text) {
return itemService.search(text, userId);
}
}
20 changes: 20 additions & 0 deletions src/main/java/ru/practicum/shareit/item/ItemRepository.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
package ru.practicum.shareit.item;

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

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

interface ItemRepository {
Item addItem(User user, Item item);

Optional<Item> getItemById(Long itemId);

Item updateItem(Item item, ItemDto itemDto);

List<ItemDto> getItemsFromUsers(Long userId);

List<ItemDto> search(String search);
}
65 changes: 65 additions & 0 deletions src/main/java/ru/practicum/shareit/item/ItemRepositoryImpl.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,65 @@
package ru.practicum.shareit.item;

import lombok.Data;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Repository;
import ru.practicum.shareit.item.dto.ItemDto;
import ru.practicum.shareit.item.mappers.ItemMapper;
import ru.practicum.shareit.item.model.Item;
import ru.practicum.shareit.user.model.User;

import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Optional;
import java.util.stream.Collectors;

@Data
@Repository
@RequiredArgsConstructor
public class ItemRepositoryImpl implements ItemRepository {
private Long count = 0L;
private final Map<Long, Item> items = new HashMap<>();


@Override
public Item addItem(User user, Item item) {
count++;
item.setOwner(user);
item.setId(count);
items.put(count, item);
return item;
}

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

@Override
public Item updateItem(Item item, ItemDto itemDto) {
if (itemDto.getName() != null) {
item.setName(itemDto.getName());
}
if (itemDto.getDescription() != null) {
item.setDescription(itemDto.getDescription());
}
if (itemDto.getAvailable() != null) {
item.setAvailable(itemDto.getAvailable());
}
items.put(item.getId(), item);
return item;
}

@Override
public List<ItemDto> getItemsFromUsers(Long userId) {
return items.values().stream().filter(x -> x.getOwner().getId().equals(userId)).map(ItemMapper::toItemDto).collect(Collectors.toList());
}

@Override
public List<ItemDto> search(String search) {
return items.values().stream().filter(Item::getAvailable)
.filter(x -> x.getName().matches("(?i).*" + search + ".*") || x.getDescription().matches("(?i).*" + search + ".*"))
.map(ItemMapper::toItemDto).collect(Collectors.toList());
}
}
17 changes: 17 additions & 0 deletions src/main/java/ru/practicum/shareit/item/ItemService.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
package ru.practicum.shareit.item;

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

import java.util.List;

interface ItemService {
ItemDto addItem(Long userId, ItemDto itemDto);

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

ItemDto getItemById(Long userId, Long itemId);

List<ItemDto> getItemsFromUsers(Long userId);

List<ItemDto> search(String search, Long userId);
}
57 changes: 57 additions & 0 deletions src/main/java/ru/practicum/shareit/item/ItemServiceImpl.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,57 @@
package ru.practicum.shareit.item;

import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;
import ru.practicum.shareit.exceptions.ConflictExceptions;
import ru.practicum.shareit.exceptions.NotFoundException;
import ru.practicum.shareit.item.dto.ItemDto;
import ru.practicum.shareit.item.mappers.ItemMapper;
import ru.practicum.shareit.item.model.Item;
import ru.practicum.shareit.user.UserService;

import java.util.ArrayList;
import java.util.List;

@Service
@RequiredArgsConstructor
public class ItemServiceImpl implements ItemService {
private final UserService userService;
private final ItemRepository itemRepository;

@Override
public ItemDto addItem(Long userId, ItemDto itemDto) {
Item item = ItemMapper.fromItemDto(itemDto);
return ItemMapper.toItemDto(itemRepository.addItem(userService.getUserById(userId), item));
}

@Override
public ItemDto updateItem(Long userId, ItemDto itemDto, Long itemId) {
getItemById(userId, itemId);
Item item = itemRepository.getItemById(itemId).get();
if (!item.getOwner().getId().equals(userId)) {
throw new ConflictExceptions("Вещь не пренадлежит пользователю с id " + userId);
}
return ItemMapper.toItemDto(itemRepository.updateItem(item, itemDto));
}

@Override
public ItemDto getItemById(Long userId, Long itemId) {
userService.getUserById(userId);
return ItemMapper.toItemDto(itemRepository.getItemById(itemId).orElseThrow(() -> new NotFoundException("Вещь с id " + itemId + " не найдена")));
}

@Override
public List<ItemDto> getItemsFromUsers(Long userId) {
userService.getUserById(userId);
return itemRepository.getItemsFromUsers(userId);
}

@Override
public List<ItemDto> search(String search, Long userId) {
userService.getUserById(userId);
if (search.isEmpty()) {
return new ArrayList<>();
}
return itemRepository.search(search);
}
}
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.NotEmpty;
import jakarta.validation.constraints.NotNull;
import jakarta.validation.constraints.Size;
import jdk.jfr.BooleanFlag;
import lombok.Data;
import lombok.extern.slf4j.Slf4j;
import ru.practicum.shareit.validation.Marker;

/**
* TODO Sprint add-controllers.
*/
@Data
@Slf4j
public class ItemDto {
private Long id;
@NotEmpty(groups = Marker.AddItem.class)
@Size(min = 1, groups = Marker.UpdateItem.class)
private String name;
@NotEmpty(groups = Marker.AddItem.class)
@Size(min = 1, groups = Marker.UpdateItem.class)
private String description;
@BooleanFlag
@NotNull(groups = Marker.AddItem.class)
private Boolean available;
private Long request;
}
25 changes: 25 additions & 0 deletions src/main/java/ru/practicum/shareit/item/mappers/ItemMapper.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
package ru.practicum.shareit.item.mappers;

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


public class ItemMapper {
public static ItemDto toItemDto(Item item) {
ItemDto itemDto = new ItemDto();
itemDto.setId(item.getId());
itemDto.setName(item.getName());
itemDto.setAvailable(item.getAvailable());
itemDto.setDescription(item.getDescription());
itemDto.setRequest(item.getRequest() != null ? item.getRequest().getId() : null);
return itemDto;
}

public static Item fromItemDto(ItemDto itemDto) {
Item item = new Item();
item.setName(itemDto.getName());
item.setDescription(itemDto.getDescription());
item.setAvailable(itemDto.getAvailable());
return item;
}
}
Loading
Loading