Skip to content

Commit 75b2ec1

Browse files
committed
Add controllers and DTOs for all entities
1 parent 777d701 commit 75b2ec1

43 files changed

Lines changed: 1053 additions & 69 deletions

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

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

Lines changed: 0 additions & 7 deletions
This file was deleted.

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

Lines changed: 0 additions & 12 deletions
This file was deleted.
Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
package ru.practicum.shareit.booking.controller;
2+
3+
import jakarta.validation.Valid;
4+
import lombok.RequiredArgsConstructor;
5+
import org.springframework.web.bind.annotation.*;
6+
import ru.practicum.shareit.booking.dto.BookingDto;
7+
import ru.practicum.shareit.booking.service.BookingService;
8+
9+
/**
10+
* TODO Sprint add-bookings.
11+
*/
12+
13+
@RestController
14+
@RequestMapping(path = "/bookings")
15+
@RequiredArgsConstructor
16+
public class BookingController {
17+
private final BookingService bookingService;
18+
19+
@PostMapping
20+
public BookingDto createBooking(@Valid @RequestBody BookingDto bookingDto,
21+
@RequestHeader("X-Sharer-User-Id") Long bookerId) {
22+
return bookingService.createBooking(bookingDto, bookerId);
23+
}
24+
25+
@PatchMapping("/{bookingId}")
26+
public BookingDto updateBooking(@PathVariable Long bookingId,
27+
@RequestBody BookingDto bookingDto) {
28+
return bookingService.updateBooking(bookingId, bookingDto);
29+
}
30+
31+
@GetMapping("/{bookingId}")
32+
public BookingDto getBookingById(@PathVariable Long bookingId) {
33+
return bookingService.getBookingById(bookingId);
34+
}
35+
}
Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,33 @@
11
package ru.practicum.shareit.booking.dto;
22

3+
import jakarta.validation.constraints.Future;
4+
import jakarta.validation.constraints.FutureOrPresent;
5+
import jakarta.validation.constraints.NotNull;
6+
import lombok.AllArgsConstructor;
7+
import lombok.Data;
8+
import lombok.NoArgsConstructor;
9+
import ru.practicum.shareit.booking.model.BookingStatus;
10+
11+
import java.time.LocalDateTime;
12+
313
/**
414
* TODO Sprint add-bookings.
515
*/
16+
17+
@Data
18+
@NoArgsConstructor
19+
@AllArgsConstructor
620
public class BookingDto {
21+
@NotNull(message = "Дата начала бронирования обязательна")
22+
@FutureOrPresent(message = "Дата начала должна быть в будущем")
23+
private LocalDateTime start;
24+
25+
@NotNull(message = "Дата окончания бронирования обязательна")
26+
@Future(message = "Дата окончания бронирования должна быть в будущем")
27+
private LocalDateTime end;
28+
29+
@NotNull(message = "ID вещи обязателен")
30+
private Long itemId;
31+
private Long bookerId;
32+
private BookingStatus status;
733
}
Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
package ru.practicum.shareit.booking.dto;
2+
3+
import ru.practicum.shareit.booking.model.Booking;
4+
import ru.practicum.shareit.item.model.Item;
5+
import ru.practicum.shareit.user.model.User;
6+
7+
public class BookingMapper {
8+
public static BookingDto toBookingDto(Booking booking) {
9+
return new BookingDto(
10+
booking.getStart(),
11+
booking.getEnd(),
12+
booking.getItem() != null ? booking.getItem().getId() : null,
13+
booking.getBooker() != null ? booking.getBooker().getId() : null,
14+
booking.getStatus()
15+
);
16+
}
17+
18+
public static Booking fromBookingDto(BookingDto bookingDto, Item item, User booker) {
19+
Booking booking = new Booking();
20+
booking.setStart(bookingDto.getStart());
21+
booking.setEnd(bookingDto.getEnd());
22+
booking.setItem(item);
23+
booking.setBooker(booker);
24+
booking.setStatus(bookingDto.getStatus());
25+
return booking;
26+
}
27+
}
Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
package ru.practicum.shareit.booking.model;
2+
3+
import lombok.AllArgsConstructor;
4+
import lombok.Data;
5+
import lombok.NoArgsConstructor;
6+
import ru.practicum.shareit.item.model.Item;
7+
import ru.practicum.shareit.user.model.User;
8+
9+
import java.time.LocalDateTime;
10+
11+
/**
12+
* TODO Sprint add-bookings.
13+
*/
14+
15+
@Data
16+
@NoArgsConstructor
17+
@AllArgsConstructor
18+
public class Booking {
19+
private Long id;
20+
private LocalDateTime start;
21+
private LocalDateTime end;
22+
private Item item;
23+
private User booker;
24+
private BookingStatus status;
25+
}
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
package ru.practicum.shareit.booking.model;
2+
3+
public enum BookingStatus {
4+
WAITING,
5+
APPROVED,
6+
REJECTED,
7+
CANCELED
8+
}
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
package ru.practicum.shareit.booking.service;
2+
3+
import ru.practicum.shareit.booking.dto.BookingDto;
4+
5+
public interface BookingService {
6+
BookingDto createBooking(BookingDto bookingDto, Long bookerId);
7+
8+
BookingDto updateBooking(Long bookingId, BookingDto bookingDto);
9+
10+
BookingDto getBookingById(Long bookingId);
11+
}
Lines changed: 72 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,72 @@
1+
package ru.practicum.shareit.booking.service;
2+
3+
import lombok.RequiredArgsConstructor;
4+
import org.springframework.stereotype.Service;
5+
import ru.practicum.shareit.booking.model.Booking;
6+
import ru.practicum.shareit.booking.model.BookingStatus;
7+
import ru.practicum.shareit.booking.dto.BookingDto;
8+
import ru.practicum.shareit.booking.dto.BookingMapper;
9+
import ru.practicum.shareit.booking.storage.InMemoryBookingStorage;
10+
import ru.practicum.shareit.exception.NotFoundException;
11+
import ru.practicum.shareit.exception.ValidationException;
12+
import ru.practicum.shareit.exception.AccessDeniedException;
13+
import ru.practicum.shareit.item.model.Item;
14+
import ru.practicum.shareit.item.storage.InMemoryItemStorage;
15+
import ru.practicum.shareit.user.model.User;
16+
import ru.practicum.shareit.user.storage.InMemoryUserStorage;
17+
18+
@Service
19+
@RequiredArgsConstructor
20+
public class BookingServiceImpl implements BookingService {
21+
private final InMemoryBookingStorage bookingStorage;
22+
private final InMemoryUserStorage userStorage;
23+
private final InMemoryItemStorage itemStorage;
24+
25+
@Override
26+
public BookingDto createBooking(BookingDto bookingDto, Long bookerId) {
27+
User booker = userStorage.findById(bookerId)
28+
.orElseThrow(() -> new NotFoundException("Пользователь с id " + bookerId + " не найден"));
29+
30+
Item item = itemStorage.findById(bookingDto.getItemId())
31+
.orElseThrow(() -> new NotFoundException("Вещь с id " + bookingDto.getItemId() + " не найдена"));
32+
33+
if (!Boolean.TRUE.equals(item.getAvailable())) {
34+
throw new ValidationException("Вещь с id " + bookingDto.getItemId() + " недоступна для бронирования");
35+
}
36+
37+
if (item.getOwner().getId().equals(bookerId)) {
38+
throw new AccessDeniedException("Пользователь не может бронировать свою собственную вещь");
39+
}
40+
41+
Booking booking = BookingMapper.fromBookingDto(bookingDto, item, booker);
42+
booking.setStatus(BookingStatus.WAITING);
43+
Booking createdBooking = bookingStorage.create(booking);
44+
return BookingMapper.toBookingDto(createdBooking);
45+
}
46+
47+
@Override
48+
public BookingDto updateBooking(Long bookingId, BookingDto bookingDto) {
49+
Booking existingBooking = bookingStorage.findById(bookingId)
50+
.orElseThrow(() -> new NotFoundException("Бронирование с id " + bookingId + " не найдено"));
51+
52+
if (bookingDto.getStart() != null) {
53+
existingBooking.setStart(bookingDto.getStart());
54+
}
55+
if (bookingDto.getEnd() != null) {
56+
existingBooking.setEnd(bookingDto.getEnd());
57+
}
58+
if (bookingDto.getStatus() != null) {
59+
existingBooking.setStatus(bookingDto.getStatus());
60+
}
61+
62+
Booking updatedBooking = bookingStorage.update(existingBooking);
63+
return BookingMapper.toBookingDto(updatedBooking);
64+
}
65+
66+
@Override
67+
public BookingDto getBookingById(Long bookingId) {
68+
Booking booking = bookingStorage.findById(bookingId)
69+
.orElseThrow(() -> new NotFoundException("Бронирование с id " + bookingId + " не найдено"));
70+
return BookingMapper.toBookingDto(booking);
71+
}
72+
}
Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
package ru.practicum.shareit.booking.storage;
2+
3+
import org.springframework.stereotype.Repository;
4+
import ru.practicum.shareit.booking.model.Booking;
5+
import ru.practicum.shareit.exception.NotFoundException;
6+
7+
import java.util.*;
8+
9+
@Repository
10+
public class InMemoryBookingStorage {
11+
private final Map<Long, Booking> bookings = new HashMap<>();
12+
private long idCounter = 1;
13+
14+
public Booking create(Booking booking) {
15+
long id = idCounter++;
16+
booking.setId(id);
17+
bookings.put(id, booking);
18+
return booking;
19+
}
20+
21+
public Booking update(Booking booking) {
22+
if (!bookings.containsKey(booking.getId())) {
23+
throw new NotFoundException("Бронирование не найдено");
24+
}
25+
26+
bookings.put(booking.getId(), booking);
27+
return booking;
28+
}
29+
30+
public Optional<Booking> findById(Long id) {
31+
return Optional.ofNullable(bookings.get(id));
32+
}
33+
}

0 commit comments

Comments
 (0)