Skip to content

Commit 9942d3a

Browse files
authored
Merge pull request #3 from CrodiYa/add-bookings
Add bookings
2 parents 13e3fda + e1aaadb commit 9942d3a

40 files changed

Lines changed: 778 additions & 266 deletions

pom.xml

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,11 @@
4141
<scope>runtime</scope>
4242
</dependency>
4343

44+
<dependency>
45+
<groupId>org.springframework.boot</groupId>
46+
<artifactId>spring-boot-starter-data-jpa</artifactId>
47+
</dependency>
48+
4449
<dependency>
4550
<groupId>org.projectlombok</groupId>
4651
<artifactId>lombok</artifactId>
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
package ru.practicum.shareit;
2+
3+
public class Constants {
4+
public static final String USER_ID_HEADER = "X-Sharer-User-Id";
5+
public static final String ALL = "ALL";
6+
}

src/main/java/ru/practicum/shareit/booking/Booking.java

Lines changed: 0 additions & 7 deletions
This file was deleted.
Lines changed: 56 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,66 @@
11
package ru.practicum.shareit.booking;
22

3-
import org.springframework.web.bind.annotation.RequestMapping;
4-
import org.springframework.web.bind.annotation.RestController;
3+
import jakarta.validation.Valid;
4+
import jakarta.validation.constraints.Positive;
5+
import lombok.RequiredArgsConstructor;
6+
import org.springframework.web.bind.annotation.*;
7+
import ru.practicum.shareit.booking.dto.BookingDto;
8+
import ru.practicum.shareit.booking.enums.BookingState;
9+
import ru.practicum.shareit.booking.model.Booking;
10+
import ru.practicum.shareit.booking.service.BookingService;
11+
12+
import java.util.Collection;
13+
14+
import static ru.practicum.shareit.Constants.ALL;
15+
import static ru.practicum.shareit.Constants.USER_ID_HEADER;
516

617
/**
718
* TODO Sprint add-bookings.
819
*/
920
@RestController
1021
@RequestMapping(path = "/bookings")
22+
@RequiredArgsConstructor
1123
public class BookingController {
24+
25+
private final BookingService bookingService;
26+
27+
@PostMapping
28+
public Booking createBooking(@RequestHeader(USER_ID_HEADER) @Positive Long userId,
29+
@Valid @RequestBody BookingDto bookingDto) {
30+
31+
return bookingService.createBooking(userId, bookingDto);
32+
}
33+
34+
@PatchMapping("/{bookingId}")
35+
public Booking updateBookingStatus(
36+
@RequestHeader(USER_ID_HEADER) @Positive Long userId,
37+
@PathVariable @Positive Long bookingId,
38+
@RequestParam Boolean approved) {
39+
40+
return bookingService.updateBookingStatus(userId, bookingId, approved);
41+
}
42+
43+
@GetMapping("/{bookingId}")
44+
public Booking getBooking(
45+
@RequestHeader(USER_ID_HEADER) @Positive Long userId,
46+
@PathVariable @Positive Long bookingId) {
47+
48+
return bookingService.getBooking(userId, bookingId);
49+
}
50+
51+
@GetMapping
52+
public Collection<Booking> findByBookerAndState(
53+
@RequestHeader(USER_ID_HEADER) @Positive Long bookerId,
54+
@RequestParam(defaultValue = ALL) BookingState state) {
55+
56+
return bookingService.findByBookerAndState(bookerId, state);
57+
}
58+
59+
@GetMapping("/owner")
60+
public Collection<Booking> findByOwnerAndState(
61+
@RequestHeader(USER_ID_HEADER) @Positive Long ownerId,
62+
@RequestParam(defaultValue = ALL) BookingState state) {
63+
64+
return bookingService.findByOwnerAndState(ownerId, state);
65+
}
1266
}
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
package ru.practicum.shareit.booking;
2+
3+
import ru.practicum.shareit.booking.dto.BookingDto;
4+
import ru.practicum.shareit.booking.model.Booking;
5+
6+
public class BookingMapper {
7+
8+
public static Booking toBooking(BookingDto bookingDto) {
9+
Booking booking = new Booking();
10+
11+
booking.setStart(bookingDto.getStart());
12+
booking.setEnd(bookingDto.getEnd());
13+
14+
return booking;
15+
}
16+
}
Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,55 @@
1+
package ru.practicum.shareit.booking.dao;
2+
3+
import org.springframework.data.jpa.repository.JpaRepository;
4+
import org.springframework.data.jpa.repository.Query;
5+
import org.springframework.stereotype.Repository;
6+
import ru.practicum.shareit.booking.model.Booking;
7+
import ru.practicum.shareit.booking.dto.LastAndNextDate;
8+
import ru.practicum.shareit.booking.enums.BookingStatus;
9+
10+
import java.time.LocalDateTime;
11+
import java.util.List;
12+
13+
@Repository
14+
public interface BookingRepository extends JpaRepository<Booking, Long> {
15+
16+
@Query("""
17+
SELECT
18+
b.item.id as itemId,
19+
MAX(CASE WHEN b.start < CURRENT_TIMESTAMP THEN b.start ELSE NULL END) as lastBooking,
20+
MIN(CASE WHEN b.start > CURRENT_TIMESTAMP THEN b.start ELSE NULL END) as nextBooking
21+
FROM Booking b
22+
WHERE b.item.ownerId = ?1
23+
GROUP BY b.item.id
24+
""")
25+
List<LastAndNextDate> findLastAndNextDatesByOwnerId(Long ownerId);
26+
27+
Boolean existsByItemIdAndBookerIdAndStatusIsAndEndBefore(Long itemId, Long bookerId,
28+
BookingStatus status, LocalDateTime now);
29+
30+
// by booker
31+
List<Booking> findByBookerIdOrderByEndDesc(Long bookerId);
32+
33+
List<Booking> findByBookerIdAndStatusIsOrderByEndDesc(Long bookerId, BookingStatus status);
34+
35+
List<Booking> findByBookerIdAndStartIsBeforeAndEndIsBeforeOrderByEndDesc(Long bookerId,
36+
LocalDateTime start,
37+
LocalDateTime end);
38+
39+
List<Booking> findByBookerIdAndStartIsAfterOrderByEndDesc(Long bookerId, LocalDateTime date);
40+
41+
List<Booking> findByBookerIdAndEndIsBeforeOrderByEndDesc(Long bookerId, LocalDateTime date);
42+
43+
// by owner
44+
List<Booking> findByItemOwnerIdOrderByEndDesc(Long ownerId);
45+
46+
List<Booking> findByItemOwnerIdAndStatusIsOrderByEndDesc(Long ownerId, BookingStatus status);
47+
48+
List<Booking> findByItemOwnerIdAndStartIsBeforeAndEndIsBeforeOrderByEndDesc(Long ownerId,
49+
LocalDateTime start,
50+
LocalDateTime end);
51+
52+
List<Booking> findByItemOwnerIdAndStartIsAfterOrderByEndDesc(Long ownerId, LocalDateTime date);
53+
54+
List<Booking> findByItemOwnerIdAndEndIsBeforeOrderByEndDesc(Long ownerId, LocalDateTime date);
55+
}
Lines changed: 17 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,21 @@
11
package ru.practicum.shareit.booking.dto;
22

3-
/**
4-
* TODO Sprint add-bookings.
5-
*/
3+
import jakarta.validation.constraints.FutureOrPresent;
4+
import jakarta.validation.constraints.NotNull;
5+
import jakarta.validation.constraints.Positive;
6+
import lombok.Data;
7+
8+
import java.time.LocalDateTime;
9+
10+
@Data
611
public class BookingDto {
12+
@NotNull
13+
@Positive
14+
private Long itemId;
15+
@NotNull
16+
@FutureOrPresent
17+
private LocalDateTime start;
18+
@NotNull
19+
@FutureOrPresent
20+
private LocalDateTime end;
721
}
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
package ru.practicum.shareit.booking.dto;
2+
3+
import java.time.LocalDateTime;
4+
5+
public interface LastAndNextDate {
6+
Long getItemId();
7+
8+
LocalDateTime getLastBooking();
9+
10+
LocalDateTime getNextBooking();
11+
}
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
package ru.practicum.shareit.booking.enums;
2+
3+
public enum BookingState {
4+
ALL, CURRENT, PAST, FUTURE, WAITING, REJECTED
5+
}
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
package ru.practicum.shareit.booking.enums;
2+
3+
public enum BookingStatus {
4+
WAITING, REJECTED, APPROVED
5+
}

0 commit comments

Comments
 (0)