Система предоставляет пользователю возможность поиска и покупки билетов. При покупке билетов пользователю начисляются баллы, которые он может использовать для оплаты.
Описание в формате OpenAPI.
Если метод требует получения данных из нескольких источников, то в случае недоступности одного не критичного источника, то недостающие данные возвращаются как некоторый fallback ответ, а остальные данные подставляются из успешного запроса.
Например, метод GET /api/v1/flights
в случае недоступности Flight Service должен вернуть 500 ошибку, т.к. данные,
получаемые из этого сервиса критичные. Аналогично для метода GET /api/v1/privilege
и Bonus Service.
Для методов GET /api/v1/tickets
и GET /api/v1/tickets/{{ticketUid}}
в случае недоступности Ticket Service запрос
должен вернуть 500 ошибку, а в случае недоступности Flight Service, поля fromAirport
, toAirport
, date
возвращаются
как fallback значения.
Аналогично для метода GET /api/v1/me
, в случае недоступности Flight Service или Bonus Service, пользователю
возвращается fallback ответ.
- Запрос к Flight Service для проверки, что такой рейс существует. Если Flight Service недоступен, то запрос завершается с ошибкой.
- Выполняется запрос к Ticket Service на создание записи о билете. Если сервис недоступен, то запрос завершается с ошибкой.
- Если при покупке билета указан флаг
paidFromBalance
, то в Bonus Service выполняется запрос на списание бонусов. Иначе, выполнится запрос на пополнение бонусного счета на 10% от стоимости заказа. В любом случае в Bonus Service будет создана запись в таблицеprivilege_history
. - Если запрос к Bonus Service завершился неудачей (500 ошибка или сервис недоступен), то выполняется откат операции создания заказа в Ticket Service.
- Выполняется запрос к Ticket Service для обновления статуса билета. Если этот сервис недоступен, то весь запрос завершается ошибкой.
- После этого выполняется запрос к Bonus Service на откат изменений в бонусном счете. Если этот сервис недоступен, то пользователю все равно отдается информация, что операция завершилась успешно, а на Gateway Service запрос ставится в очередь и повторяется пока не завершится успехом (timeout 10 секунд).
В тестовом сценарии выключается Bonus Service, необходимо в переменную serviceName
в
в [classroom.yml] прописать его название в Heroku.
Создать данные для тестов:
airport:
– id: 1
name: Шереметьево
city: Москва
country: Россия
- id: 2
name: Пулково
city: Санкт-Петербург
coutry: Россия
flight:
- id: 1
flight_number: "AFL031"
datetime: "2021-10-08 20:00"
from_airport_id: 1
to_airport_id: 2
price: 1500