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
5 changes: 5 additions & 0 deletions pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -41,6 +41,11 @@
<scope>runtime</scope>
</dependency>

<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>

<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
Expand Down
6 changes: 6 additions & 0 deletions src/main/java/ru/practicum/shareit/Constants.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
package ru.practicum.shareit;

public class Constants {
public static final String USER_ID_HEADER = "X-Sharer-User-Id";
public static final String ALL = "ALL";
}
7 changes: 0 additions & 7 deletions src/main/java/ru/practicum/shareit/booking/Booking.java

This file was deleted.

58 changes: 56 additions & 2 deletions src/main/java/ru/practicum/shareit/booking/BookingController.java
Original file line number Diff line number Diff line change
@@ -1,12 +1,66 @@
package ru.practicum.shareit.booking;

import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import jakarta.validation.Valid;
import jakarta.validation.constraints.Positive;
import lombok.RequiredArgsConstructor;
import org.springframework.web.bind.annotation.*;
import ru.practicum.shareit.booking.dto.BookingDto;
import ru.practicum.shareit.booking.enums.BookingState;
import ru.practicum.shareit.booking.model.Booking;
import ru.practicum.shareit.booking.service.BookingService;

import java.util.Collection;

import static ru.practicum.shareit.Constants.ALL;
import static ru.practicum.shareit.Constants.USER_ID_HEADER;

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

private final BookingService bookingService;

@PostMapping
public Booking createBooking(@RequestHeader(USER_ID_HEADER) @Positive Long userId,
@Valid @RequestBody BookingDto bookingDto) {

return bookingService.createBooking(userId, bookingDto);
}

@PatchMapping("/{bookingId}")
public Booking updateBookingStatus(
@RequestHeader(USER_ID_HEADER) @Positive Long userId,
@PathVariable @Positive Long bookingId,
@RequestParam Boolean approved) {

return bookingService.updateBookingStatus(userId, bookingId, approved);
}

@GetMapping("/{bookingId}")
public Booking getBooking(
@RequestHeader(USER_ID_HEADER) @Positive Long userId,
@PathVariable @Positive Long bookingId) {

return bookingService.getBooking(userId, bookingId);
}

@GetMapping
public Collection<Booking> findByBookerAndState(
@RequestHeader(USER_ID_HEADER) @Positive Long bookerId,
@RequestParam(defaultValue = ALL) BookingState state) {

return bookingService.findByBookerAndState(bookerId, state);
}

@GetMapping("/owner")
public Collection<Booking> findByOwnerAndState(
@RequestHeader(USER_ID_HEADER) @Positive Long ownerId,
@RequestParam(defaultValue = ALL) BookingState state) {

return bookingService.findByOwnerAndState(ownerId, state);
}
}
16 changes: 16 additions & 0 deletions src/main/java/ru/practicum/shareit/booking/BookingMapper.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
package ru.practicum.shareit.booking;

import ru.practicum.shareit.booking.dto.BookingDto;
import ru.practicum.shareit.booking.model.Booking;

public class BookingMapper {

public static Booking toBooking(BookingDto bookingDto) {
Booking booking = new Booking();

booking.setStart(bookingDto.getStart());
booking.setEnd(bookingDto.getEnd());

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

import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.Query;
import org.springframework.stereotype.Repository;
import ru.practicum.shareit.booking.model.Booking;
import ru.practicum.shareit.booking.dto.LastAndNextDate;
import ru.practicum.shareit.booking.enums.BookingStatus;

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

@Repository
public interface BookingRepository extends JpaRepository<Booking, Long> {

@Query("""
SELECT
b.item.id as itemId,
MAX(CASE WHEN b.start < CURRENT_TIMESTAMP THEN b.start ELSE NULL END) as lastBooking,
MIN(CASE WHEN b.start > CURRENT_TIMESTAMP THEN b.start ELSE NULL END) as nextBooking
FROM Booking b
WHERE b.item.ownerId = ?1
GROUP BY b.item.id
""")
List<LastAndNextDate> findLastAndNextDatesByOwnerId(Long ownerId);

Boolean existsByItemIdAndBookerIdAndStatusIsAndEndBefore(Long itemId, Long bookerId,
BookingStatus status, LocalDateTime now);

// by booker
List<Booking> findByBookerIdOrderByEndDesc(Long bookerId);

List<Booking> findByBookerIdAndStatusIsOrderByEndDesc(Long bookerId, BookingStatus status);

List<Booking> findByBookerIdAndStartIsBeforeAndEndIsBeforeOrderByEndDesc(Long bookerId,
LocalDateTime start,
LocalDateTime end);

List<Booking> findByBookerIdAndStartIsAfterOrderByEndDesc(Long bookerId, LocalDateTime date);

List<Booking> findByBookerIdAndEndIsBeforeOrderByEndDesc(Long bookerId, LocalDateTime date);

// by owner
List<Booking> findByItemOwnerIdOrderByEndDesc(Long ownerId);

List<Booking> findByItemOwnerIdAndStatusIsOrderByEndDesc(Long ownerId, BookingStatus status);

List<Booking> findByItemOwnerIdAndStartIsBeforeAndEndIsBeforeOrderByEndDesc(Long ownerId,
LocalDateTime start,
LocalDateTime end);

List<Booking> findByItemOwnerIdAndStartIsAfterOrderByEndDesc(Long ownerId, LocalDateTime date);

List<Booking> findByItemOwnerIdAndEndIsBeforeOrderByEndDesc(Long ownerId, LocalDateTime date);
}
20 changes: 17 additions & 3 deletions src/main/java/ru/practicum/shareit/booking/dto/BookingDto.java
Original file line number Diff line number Diff line change
@@ -1,7 +1,21 @@
package ru.practicum.shareit.booking.dto;

/**
* TODO Sprint add-bookings.
*/
import jakarta.validation.constraints.FutureOrPresent;
import jakarta.validation.constraints.NotNull;
import jakarta.validation.constraints.Positive;
import lombok.Data;

import java.time.LocalDateTime;

@Data
public class BookingDto {
@NotNull
@Positive
private Long itemId;
@NotNull
@FutureOrPresent
private LocalDateTime start;
@NotNull
@FutureOrPresent
private LocalDateTime end;
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
package ru.practicum.shareit.booking.dto;

import java.time.LocalDateTime;

public interface LastAndNextDate {
Long getItemId();

LocalDateTime getLastBooking();

LocalDateTime getNextBooking();
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
package ru.practicum.shareit.booking.enums;

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

public enum BookingStatus {
WAITING, REJECTED, APPROVED
}
35 changes: 35 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,35 @@
package ru.practicum.shareit.booking.model;

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

import java.time.LocalDateTime;

@Data
@AllArgsConstructor
@NoArgsConstructor
@Entity
@Table(name = "bookings", schema = "public")
public class Booking {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@Column(name = "start_date")
private LocalDateTime start;
@Column(name = "end_date")
private LocalDateTime end;
@ManyToOne
@JoinColumn(name = "item_id")
private Item item;
@ManyToOne
@JoinColumn(name = "booker_id")
private User booker;
@Column(name = "status")
@Enumerated(EnumType.STRING)
private BookingStatus status;
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
package ru.practicum.shareit.booking.service;

import ru.practicum.shareit.booking.model.Booking;
import ru.practicum.shareit.booking.dto.BookingDto;
import ru.practicum.shareit.booking.enums.BookingState;

import java.util.Collection;

public interface BookingService {
Booking createBooking(Long bookerId, BookingDto bookingDto);

Booking updateBookingStatus(Long userId, Long bookingId, Boolean approved);

Booking getBooking(Long userId, Long bookingId);

Collection<Booking> findByBookerAndState(Long bookerId, BookingState state);

Collection<Booking> findByOwnerAndState(Long ownerId, BookingState state);
}
Loading