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
13 changes: 13 additions & 0 deletions pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -51,15 +51,28 @@
<artifactId>h2</artifactId>
<scope>test</scope>
</dependency>

<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>

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

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

<dependency>
<groupId>org.postgresql</groupId>
<artifactId>postgresql</artifactId>
<scope>runtime</scope>
</dependency>
</dependencies>

<build>
Expand Down
2 changes: 0 additions & 2 deletions src/main/java/ru/practicum/shareit/ShareItApp.java
Original file line number Diff line number Diff line change
Expand Up @@ -5,9 +5,7 @@

@SpringBootApplication
public class ShareItApp {

public static void main(String[] args) {
SpringApplication.run(ShareItApp.class, args);
}

}
Original file line number Diff line number Diff line change
@@ -1,12 +1,63 @@
package ru.practicum.shareit.booking.controller;

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.model.Booking;
import ru.practicum.shareit.booking.model.BookingState;
import ru.practicum.shareit.booking.service.BookingService;

import java.util.Collection;

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

private final BookingService bookingService;

@PostMapping
public Booking createBooking(@RequestHeader("X-Sharer-User-Id") @Positive Long userId,
@Valid @RequestBody BookingDto bookingDto) {

return bookingService.createBooking(userId, bookingDto);
}

@PatchMapping("/{bookingId}")
public Booking updateBookingStatus(
@RequestHeader("X-Sharer-User-Id") @Positive Long userId,
@PathVariable @Positive Long bookingId,
@RequestParam Boolean approved) {

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

@GetMapping("/{bookingId}")
public Booking getBooking(
@RequestHeader("X-Sharer-User-Id") @Positive Long userId,
@PathVariable @Positive Long bookingId) {

return bookingService.getBooking(userId, bookingId);
}

@GetMapping
public Collection<Booking> findByBookerAndState(
@RequestHeader("X-Sharer-User-Id") @Positive Long bookerId,
@RequestParam (defaultValue = "ALL") BookingState state) {

return bookingService.findByBookerAndState(bookerId, state);
}

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

return bookingService.findByOwnerAndState(ownerId, state);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -6,13 +6,10 @@

@UtilityClass
public class BookingMapper {
public static BookingDto mapToBooking(Booking booking) {
return new BookingDto(
booking.getStart(),
booking.getEnd(),
booking.getItem(),
booking.getBooker(),
booking.getStatus()
);
public static Booking mapToBooking(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,52 @@
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.model.BookingStatus;
import ru.practicum.shareit.booking.model.LastAndNextDate;

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

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

Collection<Booking> findByBookerIdOrderByEndDesc(Long bookerId);

Collection<Booking> findByItemOwnerIdOrderByEndDesc(Long ownerId);

Collection<Booking> findByBookerIdAndStartIsBeforeAndEndIsBeforeOrderByEndDesc(Long bookerId, LocalDateTime now,
LocalDateTime now1);

Collection<Booking> findByBookerIdAndStatusIsOrderByEndDesc(Long bookerId, BookingStatus bookingStatus);

Collection<Booking> findByBookerIdAndEndIsBeforeOrderByEndDesc(Long bookerId, LocalDateTime now);

Collection<Booking> findByBookerIdAndStartIsAfterOrderByEndDesc(Long bookerId, LocalDateTime now);

Collection<Booking> findByItemOwnerIdAndStartIsBeforeAndEndIsBeforeOrderByEndDesc(Long ownerId, LocalDateTime now,
LocalDateTime now1);

Collection<Booking> findByItemOwnerIdAndStatusIsOrderByEndDesc(Long ownerId, BookingStatus bookingStatus);

Collection<Booking> findByItemOwnerIdAndEndIsBeforeOrderByEndDesc(Long ownerId, LocalDateTime now);

Collection<Booking> findByItemOwnerIdAndStartIsAfterOrderByEndDesc(Long ownerId, LocalDateTime now);

boolean existsByItemIdAndBookerIdAndStatusIsAndEndBefore(Long itemId, Long userId, BookingStatus bookingStatus,
LocalDateTime now);

@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);
}
27 changes: 18 additions & 9 deletions src/main/java/ru/practicum/shareit/booking/dto/BookingDto.java
Original file line number Diff line number Diff line change
@@ -1,20 +1,29 @@
package ru.practicum.shareit.booking.dto;

import jakarta.validation.constraints.FutureOrPresent;
import jakarta.validation.constraints.NotNull;
import jakarta.validation.constraints.Positive;
import lombok.AllArgsConstructor;
import ru.practicum.shareit.item.model.Item;
import ru.practicum.shareit.booking.model.BookingStatus;
import ru.practicum.shareit.user.model.User;
import lombok.Getter;
import lombok.Setter;

import java.time.LocalDate;
import java.time.LocalDateTime;

/**
* TODO Sprint add-bookings.
*/
@Setter
@Getter
@AllArgsConstructor
public class BookingDto {
private LocalDate start;
private LocalDate end;
private Item item;
private User booker;
private BookingStatus status;
@NotNull
@Positive
private Long itemId;
@NotNull
@FutureOrPresent
private LocalDateTime start;
@NotNull
@FutureOrPresent
private LocalDateTime end;

}
33 changes: 28 additions & 5 deletions src/main/java/ru/practicum/shareit/booking/model/Booking.java
Original file line number Diff line number Diff line change
@@ -1,22 +1,45 @@
package ru.practicum.shareit.booking.model;

import jakarta.persistence.*;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
import ru.practicum.shareit.item.model.Item;
import ru.practicum.shareit.user.model.User;

import java.time.LocalDate;
import java.time.LocalDateTime;

/**
* TODO Sprint add-bookings.
*/
@Data
@Entity
@AllArgsConstructor
@NoArgsConstructor
@Setter
@Getter
@Table(name = "bookings")
public class Booking {

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private LocalDate start;
private LocalDate end;

@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;
}
10 changes: 10 additions & 0 deletions src/main/java/ru/practicum/shareit/booking/model/BookingState.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
package ru.practicum.shareit.booking.model;

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

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,19 @@
package ru.practicum.shareit.booking.service;

import ru.practicum.shareit.booking.dto.BookingDto;
import ru.practicum.shareit.booking.model.Booking;
import ru.practicum.shareit.booking.model.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
Loading