Skip to content
Open
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
4 changes: 3 additions & 1 deletion modgy-versions/CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -97,4 +97,6 @@ Api: *<https://github.com/pymanceva/pet-hotel/blob/efed8fb9bbd026f8cab858a21672a
**0.0.24: Добавлены миграции БД**

**0.0.25: Добавлена выдача доступных статусов по id бронирования**
Карточка задачи: *<https://nkiblyk.kaiten.ru/space/167883/boards/card/35887925?filter=eyJrZXkiOiJhbmQiLCJ2YWx1ZSI6W3sia2V5IjoiYW5kIiwidmFsdWUiOlt7ImNvbXBhcmlzb24iOiJlcSIsImtleSI6InRhZyIsInZhbHVlIjo0OTA5MDF9XX1dfQ>*
Карточка задачи: *<https://nkiblyk.kaiten.ru/space/167883/boards/card/35887925?filter=eyJrZXkiOiJhbmQiLCJ2YWx1ZSI6W3sia2V5IjoiYW5kIiwidmFsdWUiOlt7ImNvbXBhcmlzb24iOiJlcSIsImtleSI6InRhZyIsInZhbHVlIjo0OTA5MDF9XX1dfQ>*

**0.0.26: Добавлена проверка условий для смены статусов бронирований**
2 changes: 1 addition & 1 deletion pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@
</parent>
<groupId>ru.modgy</groupId>
<artifactId>Modgy</artifactId>
<version>0.0.25-SNAPSHOT</version>
<version>0.0.26-SNAPSHOT</version>
<name>Modgy</name>
<description>Booking app for pets hotel</description>
<properties>
Expand Down
1 change: 1 addition & 0 deletions specification/pet-hotel-bookings-spec.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -229,6 +229,7 @@ paths:
parameters:
- $ref: '#/components/parameters/requesterHeader'
- $ref: '#/components/parameters/bookingId'
- $ref: '#/components/parameters/date'
requestBody:
content:
application/json:
Expand Down
27 changes: 14 additions & 13 deletions src/main/java/ru/modgy/booking/controller/BookingController.java
Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,7 @@ public BookingDto addBooking(@RequestHeader(UtilityService.REQUESTER_ID_HEADER)
utilityService.checkBossAdminAccess(requesterId);
log.info("BookingController: POST/addBooking, requesterId={}, booking={}", requesterId, newBookingDto);
utilityService.checkBossAdminAccess(requesterId);
return bookingService.addBooking(requesterId, newBookingDto);
return bookingService.addBooking(newBookingDto);
}

@GetMapping("/{id}")
Expand All @@ -42,18 +42,19 @@ public BookingDto getBookingById(@RequestHeader(UtilityService.REQUESTER_ID_HEAD
utilityService.checkBossAdminAccess(requesterId);
log.info("BookingController: GET/getBookingById, requesterId={}, bookingId={}", requesterId, bookingId);
utilityService.checkBossAdminAccess(requesterId);
return bookingService.getBookingById(requesterId, bookingId);
return bookingService.getBookingById(bookingId);
}

@PatchMapping("/{id}")
public BookingDto updateBooking(@RequestHeader(UtilityService.REQUESTER_ID_HEADER) Long requesterId,
@RequestBody @Valid UpdateBookingDto updateBookingDto,
@PathVariable("id") Long bookingId) {
@PathVariable("id") Long bookingId,
@RequestParam(value = "date", required = false) @DateTimeFormat(pattern = "dd.MM.yyyy") Optional<LocalDate> date) {
utilityService.checkBossAdminAccess(requesterId);
log.info("BookingController: PATCH/updateBooking, requesterId={}, bookingId={}, requestBody={}",
requesterId, bookingId, updateBookingDto);
utilityService.checkBossAdminAccess(requesterId);
return bookingService.updateBooking(requesterId, bookingId, updateBookingDto);
return bookingService.updateBooking(bookingId, date.orElseGet(LocalDate::now), updateBookingDto);
}

@DeleteMapping("/{id}")
Expand All @@ -63,7 +64,7 @@ public void deleteBookingById(@RequestHeader(UtilityService.REQUESTER_ID_HEADER)
utilityService.checkBossAdminAccess(requesterId);
log.info("BookingController: DELETE/deleteBookingById, requesterId={}, bookingId={}", requesterId, bookingId);
utilityService.checkBossAdminAccess(requesterId);
bookingService.deleteBookingById(requesterId, bookingId);
bookingService.deleteBookingById(bookingId);
}

@GetMapping("/rooms/{roomId}/crossingBookingsOfRoomInDates")
Expand All @@ -73,7 +74,7 @@ public List<BookingDto> findCrossingBookingsForRoomInDates(@RequestHeader(Utilit
@RequestParam("checkOutDate") @DateTimeFormat(pattern = "dd.MM.yyyy") LocalDate checkOutDate) {
log.info("BookingController: GET/findBookingsForRoomInDates, requesterId={}, roomId={}", requesterId, roomId);
utilityService.checkBossAdminAccess(requesterId);
return bookingService.findCrossingBookingsForRoomInDates(requesterId, roomId, checkInDate, checkOutDate);
return bookingService.findCrossingBookingsForRoomInDates(roomId, checkInDate, checkOutDate);
}

@GetMapping("/rooms/{roomId}/checkRoomAvailable")
Expand All @@ -83,7 +84,7 @@ public void checkRoomAvailableInDates(@RequestHeader(UtilityService.REQUESTER_ID
@RequestParam("checkOutDate") @DateTimeFormat(pattern = "dd.MM.yyyy") LocalDate checkOutDate) {
log.info("BookingController: GET/checkRoomAvailableInDates, requesterId={}, roomId={}", requesterId, roomId);
utilityService.checkBossAdminAccess(requesterId);
bookingService.checkRoomAvailableInDates(requesterId, roomId, checkInDate, checkOutDate);
bookingService.checkRoomAvailableInDates(roomId, checkInDate, checkOutDate);
}

@GetMapping("/{bookingId}/rooms/{roomId}/checkUpdateRoomAvailable")
Expand All @@ -94,7 +95,7 @@ public void checkUpdateBookingRoomAvailableInDates(@RequestHeader(UtilityService
@RequestParam("checkOutDate") @DateTimeFormat(pattern = "dd.MM.yyyy") LocalDate checkOutDate) {
log.info("BookingController: GET/checkUpdateRoomAvailableInDates, requesterId={}, roomId={}, bookingId={}", requesterId, roomId, bookingId);
utilityService.checkBossAdminAccess(requesterId);
bookingService.checkUpdateBookingRoomAvailableInDates(requesterId, roomId, bookingId, checkInDate, checkOutDate);
bookingService.checkUpdateBookingRoomAvailableInDates(roomId, bookingId, checkInDate, checkOutDate);
}

@GetMapping("/rooms/{roomId}/blockingBookingsInDates")
Expand All @@ -104,7 +105,7 @@ public List<BookingDto> findBlockingBookingsForRoomInDates(@RequestHeader(Utilit
@RequestParam("checkOutDate") @DateTimeFormat(pattern = "dd.MM.yyyy") LocalDate checkOutDate) {
log.info("BookingController: GET/findBlockingBookingsForRoomInDates, requesterId={}, roomId={}", requesterId, roomId);
utilityService.checkBossAdminAccess(requesterId);
return bookingService.findBlockingBookingsForRoomInDates(requesterId, roomId, checkInDate, checkOutDate);
return bookingService.findBlockingBookingsForRoomInDates(roomId, checkInDate, checkOutDate);
}

@GetMapping("/inDates")
Expand All @@ -113,23 +114,23 @@ public List<BookingDto> findAllBookingsInDates(@RequestHeader(UtilityService.REQ
@RequestParam("endDate") @DateTimeFormat(pattern = "dd.MM.yyyy") LocalDate endDate) {
log.info("BookingController: GET/findAllBookingsInDates, requesterId={}", requesterId);
utilityService.checkBossAdminAccess(requesterId);
return bookingService.findAllBookingsInDates(requesterId, startDate, endDate);
return bookingService.findAllBookingsInDates(startDate, endDate);
}

@GetMapping("/allByPet/pets/{petId}")
public List<BookingDto> findAllBookingsByPet(@RequestHeader(UtilityService.REQUESTER_ID_HEADER) Long requesterId,
@PathVariable("petId") Long petId) {
log.info("BookingController: GET/findAllBookingsByPet, requesterId={}, petId={}", requesterId, petId);
utilityService.checkBossAdminAccess(requesterId);
return bookingService.findAllBookingsByPet(requesterId, petId);
return bookingService.findAllBookingsByPet(petId);
}

@GetMapping("/allByOwner/owners/{ownerId}")
public List<BookingDto> findAllBookingsByOwner(@RequestHeader(UtilityService.REQUESTER_ID_HEADER) Long requesterId,
@PathVariable("ownerId") Long ownerId) {
log.info("BookingController: GET/findAllBookingsByOwner, requesterId={}, ownerId={}", requesterId, ownerId);
utilityService.checkBossAdminAccess(requesterId);
return bookingService.findAllBookingsByOwner(requesterId, ownerId);
return bookingService.findAllBookingsByOwner(ownerId);
}

@GetMapping("/{bookingId}/availableStatus")
Expand All @@ -139,6 +140,6 @@ public List<StatusBooking> getAllAvailableStatuses(@RequestHeader(UtilityService
log.info("BookingController: GET/getAllAvailableStatuses, requesterId={}, bookingId={}",
requesterId, bookingId);
utilityService.checkBossAdminAccess(requesterId);
return bookingService.getAllAvailableStatuses(requesterId, bookingId, date.orElseGet(LocalDate::now));
return bookingService.getAllAvailableStatuses(bookingId, date.orElseGet(LocalDate::now));
}
}
37 changes: 13 additions & 24 deletions src/main/java/ru/modgy/booking/service/BookingService.java
Original file line number Diff line number Diff line change
Expand Up @@ -12,124 +12,113 @@ public interface BookingService {
/**
* Добавление нового бронирования (типа бронирование или типа закрытие)
*
* @param userId - id пользователя, направляющего запрос
* @param newBookingDto - данные добавляемого бронирования
* @return данные добавленного бронирования
*/
BookingDto addBooking(Long userId, NewBookingDto newBookingDto);
BookingDto addBooking(NewBookingDto newBookingDto);

/**
* Получение по id информации о бронировании
*
* @param userId - id пользователя, направляющего запрос
* @param bookingId - id запрашиваемого бронирования
* @return данные запрашиваемого бронирования
*/
BookingDto getBookingById(Long userId, Long bookingId);
BookingDto getBookingById(Long bookingId);

/**
* Обновление информации о бронировании
*
* @param userId - id пользователя, направляющего запрос
* @param bookingId - id обновляемого бронирования
* @param today - дата, заданная в качестве текущей
* @param updateBookingDto - обновляемые данные
* @return данные обновленного бронирования
*/
BookingDto updateBooking(Long userId, Long bookingId, UpdateBookingDto updateBookingDto);
BookingDto updateBooking(Long bookingId, LocalDate today, UpdateBookingDto updateBookingDto);

/**
* Удаление по id информации о бронировании
*
* @param userId - id пользователя, направляющего запрос
* @param bookingId - id удаляемого бронирования
*/
void deleteBookingById(Long userId, Long bookingId);
void deleteBookingById(Long bookingId);

/**
* Поиск пересекающихся бронирований. Поиск бронирований, пересекающихся с выбранными датами.
* Например, дата окончания имеющегося в БД бронирования = checkInDate в текущем запросе
* или дата начала имеющегося в БД бронирования = checkOutDate в текущем запросе.
*
* @param userId - id пользователя, направляющего запрос
* @param roomId - id номера, бронирования которого проверяются
* @param checkInDate - дата заезда, по которой ведется поиск пересечений
* @param checkOutDate - дата выезда, по которой ведется поиск пересечений
* @return список пересекающихся бронирований
*/
List<BookingDto> findCrossingBookingsForRoomInDates(Long userId, Long roomId, LocalDate checkInDate, LocalDate checkOutDate);
List<BookingDto> findCrossingBookingsForRoomInDates(Long roomId, LocalDate checkInDate, LocalDate checkOutDate);

/**
* Проверка доступности номера для создания нового бронирования в выбранные даты
*
* @param userId - id пользователя, направляющего запрос
* @param roomId - id номера, бронирования которого проверяются
* @param checkInDate - дата заезда, с которой начинается временной интервал для проверки доступности номера
* @param checkOutDate - дата выезда, на которой заканчивается временной интервал для проверки доступности номера
*
* Если номер недоступен к брони в указанные даты - возвращается исключение ConflictException.
*/
void checkRoomAvailableInDates(Long userId, Long roomId, LocalDate checkInDate, LocalDate checkOutDate);
void checkRoomAvailableInDates(Long roomId, LocalDate checkInDate, LocalDate checkOutDate);

/**
* Проверка доступности номера для редактирования бронирования в выбранные даты
*
* @param userId - id пользователя, направляющего запрос
* @param roomId - id номера, бронирования которого проверяются
* @param bookingId - id бронирования, которое в процессе редактирования
* @param checkInDate - дата заезда, с которой начинается временной интервал для проверки доступности номера
* @param checkOutDate - дата выезда, на которой заканчивается временной интервал для проверки доступности номера
*
* Если номер недоступен к брони в указанные даты - возвращается исключение ConflictException.
*/
void checkUpdateBookingRoomAvailableInDates(Long userId, Long roomId, Long bookingId, LocalDate checkInDate, LocalDate checkOutDate);
void checkUpdateBookingRoomAvailableInDates(Long roomId, Long bookingId, LocalDate checkInDate, LocalDate checkOutDate);

/**
* Поиск блокирующих бронирований, накладывающихся на выбранные даты, которые не позволяют добавить новое бронирование
*
* @param userId - id пользователя, направляющего запрос
* @param roomId - id номера, бронирования которого проверяются
* @param checkInDate - дата заезда, с которой начинается временной интервал для проверки наличия блокирующих бронирований
* @param checkOutDate - дата выезда, на которой заканчивается временной интервал для проверки наличия блокирующих бронирований
* @return список блокирующих бронирований
*/
List<BookingDto> findBlockingBookingsForRoomInDates(Long userId, Long roomId, LocalDate checkInDate, LocalDate checkOutDate);
List<BookingDto> findBlockingBookingsForRoomInDates(Long roomId, LocalDate checkInDate, LocalDate checkOutDate);

/**
* Поиск всех имеющихся бронирований в заданные даты, кроме отмененных.
*
* @param userId - id пользователя, направляющего запрос
* @param startDate - дата начала периода, за который отбираются бронирования
* @param endDate - дата окончания периода, за который отбираются бронирования
* @return список бронирований в указанные даты с любым статусом, кроме "отменено"
*/
List<BookingDto> findAllBookingsInDates(Long userId, LocalDate startDate, LocalDate endDate);
List<BookingDto> findAllBookingsInDates(LocalDate startDate, LocalDate endDate);

/**
* Поиск всех имеющихся бронирований на пребывание конкретного питомца.
*
* @param userId - id пользователя, направляющего запрос
* @param petId - id питомца, чьи бронирования отбираются
* @return список всех имеющихся бронирований на пребывание конкретного питомца
*/
List<BookingDto> findAllBookingsByPet(Long userId, Long petId);
List<BookingDto> findAllBookingsByPet(Long petId);

/**
* Поиск всех имеющихся бронирований на пребывание всех питомцев конкретного клиента.
*
* @param userId - id пользователя, направляющего запрос
* @param ownerId - id клиента, чьи бронирования отбираются
* @return список всех имеющихся бронирований на пребывание всех питомцев конкретного клиента
*/
List<BookingDto> findAllBookingsByOwner(Long userId, Long ownerId);
List<BookingDto> findAllBookingsByOwner(Long ownerId);

/**
* Получение всех доступных для установки статусов для заданного бронирования
* (в том числе тех, для которых требуется выполнение дополнительных условий).
*
* @param userId - id пользователя, направляющего запрос
* @param bookingId - id бронирования, для которого отбираются доступные статусы
* @param date - дата, на которую производится проверка доступности статусов
* @return HashMap, где ключ - допустимый к установке статус, значение - список необходимых для установки условий.
*/
List<StatusBooking> getAllAvailableStatuses(Long userId, Long bookingId, LocalDate date);
List<StatusBooking> getAllAvailableStatuses(Long bookingId, LocalDate date);
}
Loading