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

16th #69

Closed

16th #69

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
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
package ru.practicum.shareit.api;

import lombok.experimental.UtilityClass;

@UtilityClass
public class RequestHttpHeaders {
public static final String USER_ID = "X-Sharer-User-Id";
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
package ru.practicum.shareit.api;

public interface ValidateCreateRequest {
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
package ru.practicum.shareit.api;

public interface ValidateUpdateRequest {
}

This file was deleted.

This file was deleted.

Original file line number Diff line number Diff line change
@@ -0,0 +1,55 @@
package ru.practicum.shareit.booking.client;

import java.util.Map;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.web.client.RestTemplateBuilder;
import org.springframework.http.ResponseEntity;
import org.springframework.http.client.HttpComponentsClientHttpRequestFactory;
import org.springframework.stereotype.Service;
import org.springframework.web.util.DefaultUriBuilderFactory;

import ru.practicum.shareit.booking.dto.BookingSaveDto;
import ru.practicum.shareit.booking.dto.BookingState;
import ru.practicum.shareit.client.BaseClient;

@Service
public class BookingClient extends BaseClient {
private static final String API_PREFIX = "/bookings";
private static final String BOOKING_ID_PATH = "/{bookingId}";
private static final String BOOKING_PATH = BOOKING_ID_PATH + "?approved={approved}";
private static final String ALL_USER_BOOKINGS_PATH = "?state={state}&from={from}&size={size}";
private static final String ALL_USER_ITEMS_BOOKINGS_PATH = "/owner/?state={state}";

@Autowired
public BookingClient(@Value("${shareit-server.url}") String serverUrl, RestTemplateBuilder builder) {
super(builder.uriTemplateHandler(new DefaultUriBuilderFactory(serverUrl + API_PREFIX))
.requestFactory(() -> new HttpComponentsClientHttpRequestFactory())
.build());
}

public ResponseEntity<Object> addBooking(Integer userId, BookingSaveDto bookingSaveDto) {
return post("", userId, bookingSaveDto);
}

public ResponseEntity<Object> manageBooking(Integer userId, Integer bookingId, Boolean approved) {
Map<String, Object> uriVariables = Map.of("bookingId",bookingId,"approved", approved);
return patch(BOOKING_PATH, userId, uriVariables);
}

public ResponseEntity<Object> getBooking(Integer userId, Integer bookingId) {
Map<String, Object> uriVariables = Map.of("bookingId", bookingId);
return get(BOOKING_ID_PATH, userId, uriVariables);
}

public ResponseEntity<Object> getAllUserBookings(Integer userId, BookingState state, Integer from, Integer size) {
Map<String, Object> uriVariables = Map.of("state", state.name(), "from", from, "size", size);
return get(ALL_USER_BOOKINGS_PATH, userId, uriVariables);
}

public ResponseEntity<Object> getAllUserItemsBookings(Integer userId, BookingState state) {
Map<String, Object> uriVariables = Map.of("state", state.name());
return get(ALL_USER_ITEMS_BOOKINGS_PATH, userId, uriVariables);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,68 @@
package ru.practicum.shareit.booking.controller;

import jakarta.validation.Valid;
import jakarta.validation.constraints.Positive;
import jakarta.validation.constraints.PositiveOrZero;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.http.ResponseEntity;
import org.springframework.stereotype.Controller;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
import ru.practicum.shareit.api.RequestHttpHeaders;
import ru.practicum.shareit.booking.client.BookingClient;
import ru.practicum.shareit.booking.dto.BookingSaveDto;
import ru.practicum.shareit.booking.dto.BookingState;
import ru.practicum.shareit.exceptions.NotValidException;


@Controller
@RequestMapping(path = "/bookings")
@RequiredArgsConstructor
@Slf4j
@Validated
public class BookingController {
private final BookingClient bookingClient;

@PostMapping
public ResponseEntity<Object> addBooking(@RequestHeader(RequestHttpHeaders.USER_ID) Integer userId,
@RequestBody @Valid BookingSaveDto bookingSaveDto) {
return bookingClient.addBooking(userId, bookingSaveDto);
}

@PatchMapping("/{bookingId}")
public ResponseEntity<Object> manageBooking(@RequestHeader(RequestHttpHeaders.USER_ID) Integer userId,
@PathVariable Integer bookingId,
@RequestParam Boolean approved) {
return bookingClient.manageBooking(userId, bookingId, approved);
}

@GetMapping("/{bookingId}")
public ResponseEntity<Object> getBooking(@RequestHeader(RequestHttpHeaders.USER_ID) Integer userId,
@PathVariable Integer bookingId) {
return bookingClient.getBooking(userId, bookingId);
}

@GetMapping
public ResponseEntity<Object> getAllUserBookings(@RequestHeader(RequestHttpHeaders.USER_ID) Integer userId,
@RequestParam(defaultValue = "all") String state,
@RequestParam(defaultValue = "0") @PositiveOrZero Integer from,
@RequestParam(defaultValue = "10") @Positive Integer size) {
BookingState bookingState = getBookingState(state);
return bookingClient.getAllUserBookings(userId, bookingState, from, size);
}

@GetMapping("/owner")
public ResponseEntity<Object> getAllUserItemsBookings(@RequestHeader(RequestHttpHeaders.USER_ID) Integer userId,
@RequestParam(defaultValue = "all") String state) {
BookingState bookingState = getBookingState(state);

return bookingClient.getAllUserItemsBookings(userId, bookingState);
}

private BookingState getBookingState(String state) {
return BookingState.from(state)
.orElseThrow(() -> new NotValidException(BookingState.class, state + " not valid"));
}

}

This file was deleted.

Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
package ru.practicum.shareit.booking.dto;

import jakarta.validation.constraints.FutureOrPresent;
import jakarta.validation.constraints.NotNull;
import lombok.AccessLevel;
import lombok.Data;
import lombok.experimental.FieldDefaults;
import ru.practicum.shareit.validation.DateTimeStartBeforeEnd;

import java.time.LocalDateTime;

@Data
@FieldDefaults(level = AccessLevel.PRIVATE)
@DateTimeStartBeforeEnd
public class BookingSaveDto {
@NotNull
Integer itemId;
@FutureOrPresent
LocalDateTime start;
LocalDateTime end;
}
Original file line number Diff line number Diff line change
Expand Up @@ -3,25 +3,20 @@
import java.util.Optional;

public enum BookingState {
// Все
ALL,
// Текущие
CURRENT,
// Будущие
FUTURE,
// Завершенные
PAST,
// Отклоненные
REJECTED,
// Ожидающие подтверждения
WAITING;

public static Optional<BookingState> from(String stringState) {
for (BookingState state : values()) {
if (state.name().equalsIgnoreCase(stringState)) {
return Optional.of(state);
}
}
return Optional.empty();
}
ALL,
CURRENT,
FUTURE,
PAST,
REJECTED,
WAITING;

public static Optional<BookingState> from(String stringState) {
for (BookingState state : values()) {
if (state.name().equalsIgnoreCase(stringState)) {
return Optional.of(state);
}
}
return Optional.empty();
}
}
Loading
Loading