Skip to content

Latest commit

 

History

History

v2

Folders and files

NameName
Last commit message
Last commit date

parent directory

..
 
 
 
 
 
 

Hotels Booking System

Система предоставляет пользователю сервис поиска и бронирования отелей на интересующие даты. В зависимости от количества заказов система лояльности дает скидку пользователю на новые бронирования.

Описание в формате OpenAPI.

Деградация функциональности

Если метод требует получения данных из нескольких источников, то в случае недоступности одного не критичного источника, то недостающие данные возвращаются как некоторый fallback ответ, а остальные данные подставляются из успешного запроса.

Например, метод GET /api/v1/hotels в случае недоступности Reservation Service должен вернуть 500 ошибку, т.к. данные, получаемые из этого сервиса критичные. Аналогично для метода GET /api/v1/loyalty и сервиса Loyalty Service.

Для методов GET /api/v1/reservations и GET /api/v1/reservations/{{reservationUid}} в случае недоступности Reservation Service запрос должен вернуть 500 ошибку, а в случае недоступности Payment Service, поле payment должно вернуться пустое.

Аналогично для метода GET /api/v1/me, в случае недоступности Payment Service или Loyalty Service, пользователю возвращается fallback ответ.

Бронирование отеля
  1. Запрос к Reservation Service для проверки, что такой отель существует. Если Reservation Service недоступен, то запрос завершается с ошибокой.
  2. Выполняется запрос к Payment Service для создания оплате. Если сервис недоступен, то запрос завершается с ошибкой.
  3. Выполняется запрос к Loyalty Service для увеличения счетчика бронирований и, возможно, как следствие этого, изменения статуса клента.
  4. Если запрос к Loyalty Service завершился неудачей (500 ошибка или сервис недоступен), то выполняется откат операции оплаты в Ticket Service.
Отмена бронирования
  1. Выполняется запрос к Payment Service для отмены оплаты (устанавливается статус CANCELED). Если этот сервис недоступен, то весь запрос завершается с ошибкой.
  2. После этого выполняется запрос к Loyalty Service для уменьшения счетчика бронирований и, возможно, если счетчик стал ниже уровня, понижения статуса пользователя. Если этот сервис недоступен, то пользователю все равно отдается информация что операция завершилась успешно, а на Gateway Service запрос ставится в очередь и повторяется пока не завершится успехом (timeout 10 секунд).

Данные для тестов

В тестовом сценарии выключается Loyalty Service, необходимо в переменную serviceName в в [classroom.yml] прописать его название в Heroku.

Создать данные для тестов:

hotels:
  – id: 1
    hotelUid: "049161bb-badd-4fa8-9d90-87c9a82b0668"
    name: "Ararat Park Hyatt Moscow"
    country: "Россия"
    city: "Москва"
    address: "Неглинная ул., 4"
    stars: 5,
    price: 10000

loyalty:
  - id: 1
    username: "Test Max"
    reservation_count: 25
    status: "GOLD"
    discount: 10