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
7 changes: 6 additions & 1 deletion pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,10 @@
<artifactId>spring-boot-configuration-processor</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>

<dependency>
<groupId>org.postgresql</groupId>
Expand All @@ -49,7 +53,8 @@
<dependency>
<groupId>com.h2database</groupId>
<artifactId>h2</artifactId>
<scope>test</scope>
<!-- <version>2.2.224</version>--> <!-- Укажите нужную версию -->
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
Expand Down
28 changes: 0 additions & 28 deletions src/main/java/ru/practicum/shareit/booking/Booking.java

This file was deleted.

55 changes: 50 additions & 5 deletions src/main/java/ru/practicum/shareit/booking/BookingController.java
Original file line number Diff line number Diff line change
@@ -1,12 +1,57 @@
package ru.practicum.shareit.booking;

import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import jakarta.validation.Valid;
import lombok.AllArgsConstructor;
import org.springframework.web.bind.annotation.*;
import ru.practicum.shareit.booking.dto.BookingDtoRequest;
import ru.practicum.shareit.booking.dto.BookingDtoResponse;
import ru.practicum.shareit.booking.enumerated.State;
import ru.practicum.shareit.booking.service.BookingService;

import java.util.List;

/**
* TODO Sprint add-bookings.
*/
@RestController
@AllArgsConstructor
@RequestMapping(path = "/bookings")
public class BookingController {

private final BookingService bookingService;
private final String userIdHeader = "X-Sharer-User-Id";

@PostMapping
public BookingDtoResponse createBooking(
@RequestHeader(userIdHeader) Long bookerId,
@Valid @RequestBody BookingDtoRequest bookingDtoRequest) {
return bookingService.createBooking(bookerId, bookingDtoRequest);
}

@PatchMapping("/{bookingId}")
public BookingDtoResponse updateBooking(
@RequestHeader(userIdHeader) Long bookerId,
@RequestParam Boolean approved,
@PathVariable Long bookingId) {
return bookingService.updateBooking(bookerId, bookingId, approved);
}

@GetMapping("/{bookingId}")
public BookingDtoResponse getBookingById(
@RequestHeader(userIdHeader) Long bookerId,
@PathVariable Long bookingId) {
return bookingService.getBookingById(bookerId, bookingId);
}

@GetMapping
public List<BookingDtoResponse> getBookingByUser(
@RequestHeader(userIdHeader) Long bookerId,
@RequestParam(defaultValue = "ALL") State state) {
return bookingService.getBookingByUser(bookerId, state);
}

@GetMapping("/owner")
public List<BookingDtoResponse> getBookingByItemsUser(
@RequestHeader(userIdHeader) Long userOwnerItemId,
@RequestParam(defaultValue = "ALL") State state) {
return bookingService.getBookingByItemsUser(userOwnerItemId, state);
}

}

This file was deleted.

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

import jakarta.validation.constraints.Future;
import jakarta.validation.constraints.FutureOrPresent;
import jakarta.validation.constraints.NotNull;
import lombok.AllArgsConstructor;
import lombok.Data;
import ru.practicum.shareit.booking.enumerated.Status;

import java.time.LocalDateTime;

@Data
@AllArgsConstructor
public class BookingDtoRequest {

@FutureOrPresent(message = "Дата начала бронирования не может быть раньше текущего времени")
@NotNull(message = "Дата начала бронирования не может быть пустой")
private LocalDateTime start;

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

добавь еще аннотацию @FutureOrPresent

@Future(message = "Дата окончания бронирования не может быть раньше текущего времени")
@NotNull(message = "Дата окончания бронирования не может быть пустой")
private LocalDateTime end;

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

а сюда @future

@NotNull(message = "ID вещи не может быть пустым")
private Long itemId;
private Status status;
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
package ru.practicum.shareit.booking.dto;

import lombok.AllArgsConstructor;
import lombok.Data;
import ru.practicum.shareit.booking.enumerated.Status;
import ru.practicum.shareit.item.dto.ItemDto;
import ru.practicum.shareit.user.dto.UserDto;

import java.time.LocalDateTime;

@Data
@AllArgsConstructor
public class BookingDtoResponse {

private Long id;
private LocalDateTime start;
private LocalDateTime end;
private ItemDto item;
private UserDto booker;
private Status status;
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
package ru.practicum.shareit.booking.enumerated;

public enum State {
ALL, CURRENT, PAST, FUTURE, WAITING, REJECTED, UNSUPPORTED_STATUS
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
package ru.practicum.shareit.booking.enumerated;

public enum Status {
WAITING, APPROVED, REJECTED, CANCELED
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
package ru.practicum.shareit.booking.mapper;

import ru.practicum.shareit.booking.dto.BookingDtoRequest;
import ru.practicum.shareit.booking.dto.BookingDtoResponse;
import ru.practicum.shareit.booking.model.Booking;
import ru.practicum.shareit.item.dto.ItemDto;
import ru.practicum.shareit.item.model.Item;
import ru.practicum.shareit.user.dto.UserDto;
import ru.practicum.shareit.user.model.User;

public class BookingMapper {

public static BookingDtoResponse toBookingDtoResponse(Booking booking, UserDto userDto, ItemDto itemDto) {
return new BookingDtoResponse(
booking.getId(),
booking.getStart(),
booking.getEnd(),
itemDto,
userDto,
booking.getStatus()
);
}

public static Booking toBooking(BookingDtoRequest bookingDtoRequest, User booker, Item item) {
return new Booking(
bookingDtoRequest.getStart(),
bookingDtoRequest.getEnd(),
item,
booker,
bookingDtoRequest.getStatus()
);
}
}
44 changes: 44 additions & 0 deletions src/main/java/ru/practicum/shareit/booking/model/Booking.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,44 @@
package ru.practicum.shareit.booking.model;

import jakarta.persistence.*;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import ru.practicum.shareit.booking.enumerated.Status;
import ru.practicum.shareit.item.model.Item;
import ru.practicum.shareit.user.model.User;

import java.time.LocalDateTime;

@Data
@Entity
@NoArgsConstructor
@AllArgsConstructor
@Table(name = "bookings")
public class Booking {

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "id")
private Long id;
@Column(name = "start_date", nullable = false)
private LocalDateTime start;
@Column(name = "end_date", nullable = false)
private LocalDateTime end;
@ManyToOne
@JoinColumn(name = "item_id")
private Item item;
@ManyToOne
@JoinColumn(name = "booker_id")
private User booker;
@Enumerated(EnumType.STRING)
private Status status;

public Booking(LocalDateTime start, LocalDateTime end, Item item, User booker, Status status) {
this.start = start;
this.end = end;
this.item = item;
this.booker = booker;
this.status = status;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
package ru.practicum.shareit.booking.repository;

import org.springframework.data.jpa.repository.JpaRepository;
import ru.practicum.shareit.booking.enumerated.Status;
import ru.practicum.shareit.booking.model.Booking;

import java.time.LocalDateTime;
import java.util.Collection;
import java.util.List;
import java.util.Optional;

public interface BookingRepository extends JpaRepository<Booking, Long> {
List<Booking> findAllByBookerIdOrderByStartDesc(Long bookerId);

Collection<Booking> findAllByBookerIdAndStartIsBeforeAndEndIsAfterOrderByStartDesc(long bookerId, LocalDateTime startBefore, LocalDateTime endAfter);

Collection<Booking> findAllByBookerIdAndEndIsBeforeOrderByStartDesc(long bookerId, LocalDateTime endAfter);

Collection<Booking> findAllByBookerIdAndStartIsAfterOrderByStartDesc(long bookerId, LocalDateTime endAfter);

Collection<Booking> findAllByBookerIdAndStatusOrderByStartDesc(long bookerId, Status status);

List<Booking> findAllByItemIdInOrderByStartDesc(Collection<Long> itemId);

Collection<Booking> findAllByItemIdInAndStartIsBeforeAndEndIsAfterOrderByStartDesc(Collection<Long> itemId, LocalDateTime startBefore, LocalDateTime endAfter);

Collection<Booking> findAllByItemIdInAndEndIsBeforeOrderByStartDesc(Collection<Long> itemId, LocalDateTime endAfter);

Collection<Booking> findAllByItemIdInAndStartIsAfterOrderByStartDesc(Collection<Long> itemId, LocalDateTime endAfter);

Collection<Booking> findAllByItemIdInAndStatusOrderByStartDesc(Collection<Long> itemId, Status status);

boolean existsBookingByItemIdAndBookerIdAndStatusAndEndIsBefore(Long itemId, long bookerId, Status status, LocalDateTime endBefore);

Optional<Booking> findFirstByItemIdAndStartBeforeAndStatusOrderByEndDesc(Long itemId, LocalDateTime startBefore, Status status);

Optional<Booking> findFirstByItemIdAndStartAfterAndStatusOrderByStartAsc(Long itemId, LocalDateTime startAfter, Status status);
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
package ru.practicum.shareit.booking.service;

import ru.practicum.shareit.booking.dto.BookingDtoRequest;
import ru.practicum.shareit.booking.dto.BookingDtoResponse;
import ru.practicum.shareit.booking.enumerated.State;

import java.util.List;

public interface BookingService {

BookingDtoResponse getBookingById(Long userId, Long bookingId);

List<BookingDtoResponse> getBookingByUser(Long bookerId, State state);

List<BookingDtoResponse> getBookingByItemsUser(Long userOwnerItemId, State state);

BookingDtoResponse createBooking(Long userId, BookingDtoRequest bookingDtoRequest);

BookingDtoResponse updateBooking(Long userId, Long bookingId, Boolean approved);
}
Loading