Web-сервис обработки уведомлений по заказам СМ

Этот web-сервис предназначен для обработки уведомлений, которые СМ отправляет в ИС партнёра (Домино), с помощью которых передаётся информация о создании, изменении состояния и отмене заказа со стороны СМ. Сервис реализуется в виде Домино web-сервера, при необходимости масштабирования (при увеличении нагрузки) может быть развернут пул из нескольких однородных web-серверов с балансировкой нагрузки через nginx proxy.

Сервис обрабатывает следующие запросы СМ

  1. Создание заказа (order.created). Создаёт документ заказа в БД Домино. Создаёт телеграмм-уведомление для сборщиков и магазина о появлении нового заказа.
  2. Изменение заказа (order.changed). Анализирует изменения, вносит их в документ заказа. Создаёт телеграмм-уведомление для сборщиков и магазина об изменении состава заказа.
  3. Оплата заказа (order.paid). Корректирует цены заказа, закрывает заказ от изменений.
  4. Передача заказа курьеру (order.received). Закрывает заказ от изменений, помечает заказ как отгруженный (остатки списываются с баланса магазина).
  5. Доставка заказа (order.delivered). Закрывает заказ от изменений, помечает заказ как отгруженный (если пока нет этого статуса) и доставленный.
  6. Отмена заказа (order.cancelled). Закрывает заказ от изменений, помечает заказ как отменённый. Создаёт телеграмм-уведомление для сборщиков и магазина об отмене заказа, если заказ ещё не передан курьеру (не отгружен)

При обработке хуков СМ нужно учитывать специфические особенности протокола СМ. Тайм-аут на ответ составляет 5 секунд. Если в течении этого времени не будет ответа или вернётся статус 4хх или 5хх, то у СМ начнут отрабатывать ретраи – сообщение будет отправляться повторно 7 раз с увеличивающимся интервалом. Если и это не поможет (для хука order.created), то система автоматически отменит заказ. Таким образом, может возникнуть ситуация, когда заказ в Домино создан, но СМ не дождался подтверждения и повторно отправил заказ. Web- сервис должен распознать эту ситуацию, и отправить СМ положительный ответ по уже созданному с Домино заказу, а не пытаться создать новый.