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
3 changes: 1 addition & 2 deletions src/main/java/ru/practicum/shareit/ShareItApp.java
Original file line number Diff line number Diff line change
Expand Up @@ -9,5 +9,4 @@ public class ShareItApp {
public static void main(String[] args) {
SpringApplication.run(ShareItApp.class, args);
}

}
}
23 changes: 19 additions & 4 deletions src/main/java/ru/practicum/shareit/booking/Booking.java
Original file line number Diff line number Diff line change
@@ -1,7 +1,22 @@
package ru.practicum.shareit.booking;

/**
* TODO Sprint add-bookings.
*/
import lombok.Data;
import java.time.LocalDateTime;

@Data
public class Booking {
}

public enum Status {
WAITING,
APPROVED,
REJECTED,
CANCELED
}

private Long id;
private LocalDateTime start;
private LocalDateTime end;
private Long itemId;
private Long bookerId;
private Status status;
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
package ru.practicum.shareit.exception;

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

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

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

import jakarta.servlet.http.HttpServletRequest;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.MethodArgumentNotValidException;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RestControllerAdvice;
import ru.practicum.shareit.exception.ConflictException;
import ru.practicum.shareit.exception.NotFoundException;
import ru.practicum.shareit.exception.ValidationException;
import ru.practicum.shareit.response.ErrorResponse;

import java.time.LocalDateTime;

@RestControllerAdvice
public class GlobalExceptionHandler {

@ExceptionHandler(NotFoundException.class)
public ResponseEntity<ErrorResponse> handleNotFound(NotFoundException e, HttpServletRequest request) {
ErrorResponse errorResponse = new ErrorResponse(
LocalDateTime.now(),
HttpStatus.NOT_FOUND.value(),
"Not Found",
e.getMessage(),
request.getRequestURI()
);
return ResponseEntity.status(HttpStatus.NOT_FOUND).body(errorResponse);
}

@ExceptionHandler({ValidationException.class})
public ResponseEntity<ErrorResponse> handleValidation(
ValidationException e, HttpServletRequest request) {
ErrorResponse errorResponse = new ErrorResponse(
LocalDateTime.now(),
HttpStatus.BAD_REQUEST.value(),
"Bad Request",
e.getMessage(),
request.getRequestURI()
);
return ResponseEntity.status(HttpStatus.BAD_REQUEST).body(errorResponse);
}

@ExceptionHandler({ConflictException.class})
public ResponseEntity<ErrorResponse> handleConflict(
ConflictException e, HttpServletRequest request) {
ErrorResponse errorResponse = new ErrorResponse(
LocalDateTime.now(),
HttpStatus.CONFLICT.value(),
"Conflict",
e.getMessage(),
request.getRequestURI()
);
return ResponseEntity.status(HttpStatus.CONFLICT).body(errorResponse);
}

@ExceptionHandler(Exception.class)
public ResponseEntity<ErrorResponse> handleOtherExceptions(Exception e, HttpServletRequest request) {
ErrorResponse errorResponse = new ErrorResponse(
LocalDateTime.now(),
HttpStatus.INTERNAL_SERVER_ERROR.value(),
"Internal Server Error",
"Произошла ошибка: " + e.getMessage(),
request.getRequestURI()
);
return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body(errorResponse);
}

@ExceptionHandler(MethodArgumentNotValidException.class)
public ResponseEntity<ErrorResponse> handleMethodArgumentNotValid(MethodArgumentNotValidException e,
HttpServletRequest request) {
String message = e.getBindingResult().getFieldErrors().stream()
.map(error -> error.getField() + ": " + error.getDefaultMessage())
.findFirst()
.orElse("Ошибка валидации");

ErrorResponse errorResponse = new ErrorResponse(
LocalDateTime.now(),
HttpStatus.BAD_REQUEST.value(),
"Bad Request",
message,
request.getRequestURI()
);

return ResponseEntity.status(HttpStatus.BAD_REQUEST).body(errorResponse);
}
}
52 changes: 46 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,52 @@
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.RequiredArgsConstructor;
import org.springframework.web.bind.annotation.*;
import ru.practicum.shareit.item.dto.ItemDto;
import ru.practicum.shareit.item.mapper.ItemMapper;
import ru.practicum.shareit.item.service.ItemService;

import java.util.List;

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

private final ItemService itemService;

private static final String USER_HEADER = "X-Sharer-User-Id";

@PostMapping
public ItemDto create(@RequestHeader(USER_HEADER) Long userId,
@Valid @RequestBody ItemDto itemDto) {
return ItemMapper.toItemDto(itemService.create(userId, itemDto));
}

@PatchMapping("/{itemId}")
public ItemDto update(@RequestHeader(USER_HEADER) Long userId,
@PathVariable Long itemId,
@RequestBody ItemDto dto) {
return ItemMapper.toItemDto(itemService.update(userId, itemId, dto));
}

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

@GetMapping
public List<ItemDto> getAllByOwner(@RequestHeader(USER_HEADER) Long userId) {
return itemService.getAllByOwner(userId).stream()
.map(ItemMapper::toItemDto)
.toList();
}

@GetMapping("/search")
public List<ItemDto> search(@RequestParam String text) {
return itemService.search(text).stream()
.map(ItemMapper::toItemDto)
.toList();
}
}
22 changes: 18 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,21 @@
package ru.practicum.shareit.item.dto;

/**
* TODO Sprint add-controllers.
*/
import jakarta.validation.constraints.NotBlank;
import jakarta.validation.constraints.NotNull;
import lombok.Builder;
import lombok.Data;

@Data
@Builder
public class ItemDto {
}
private Long id;

@NotNull
@NotBlank
private String name;
@NotNull
private String description;
@NotNull
private Boolean available;
private Long requestId;
}
42 changes: 42 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,42 @@
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 ItemDto.builder()
.id(item.getId())
.name(item.getName())
.description(item.getDescription())
.available(item.getAvailable())
.requestId(item.getRequest() != null ? item.getRequest().getId() : null)
.build();
}

public static Item toItem(ItemDto itemDto, User owner, ItemRequest itemRequest) {
return Item.builder()
.name(itemDto.getName())
.description(itemDto.getDescription())
.available(itemDto.getAvailable())
.ownerId(owner.getId())
.request(itemRequest)
.build();
}

public static Item updateItemFields(Item item, ItemDto itemDto) {
if (itemDto.getDescription() != null) {
item.setDescription(itemDto.getDescription());
}
if (itemDto.getName() != null) {
item.setName(itemDto.getName());
}
if (itemDto.getAvailable() != null) {
item.setAvailable(itemDto.getAvailable());
}
return item;
}
}
17 changes: 13 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,16 @@
package ru.practicum.shareit.item.model;

/**
* TODO Sprint add-controllers.
*/
import lombok.Builder;
import lombok.Data;
import ru.practicum.shareit.request.ItemRequest;

@Data
@Builder
public class Item {
}
private Long id;
private String name;
private String description;
private Boolean available;
private Long ownerId;
private ItemRequest request;
}
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 ru.practicum.shareit.item.model.Item;

import java.util.List;

public interface ItemService {
Item create(Long userId, ItemDto itemDto);

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

Item getItemById(Long itemId);

List<Item> getAllByOwner(Long userId);

List<Item> search(String text);
}
Loading