Представьте статусы как конечный автомат с явно разрешёнными переходами. Сервис должен атомарно проверять текущий статус, применять переход и записывать историю.
Спроектируйте и реализуйте сервис управления статусами заказов интернет-магазина цветов. Статусы: «создан», «ожидает оплаты», «оплачен», «доставлен», «завершён», «отменён». Внешняя бизнес-логика не важна: нужен сервис, управляющий переходами между статусами.
Представьте статусы как конечный автомат с явно разрешёнными переходами. Сервис должен атомарно проверять текущий статус, применять переход и записывать историю.
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
Представьте статусы как конечный автомат с явно разрешёнными переходами. Сервис должен атомарно проверять текущий статус, применять переход и записывать историю.
Пример правил, требующий согласования бизнеса:
allowed = {
'created': {'awaiting_payment', 'cancelled'},
'awaiting_payment': {'paid', 'cancelled'},
'paid': {'delivered'},
'delivered': {'completed'},
'completed': set(),
'cancelled': set(),
}
def next_status(current, target):
if current == target:
return current
if target not in allowed[current]:
raise ValueError('Transition is not allowed')
return target
Храните order_id, status, version и историю с автором перехода. Endpoint проверяет права, expected_version и idempotency key; конфликт версий возвращает 409. Проверка и UPDATE выполняются вместе. Отмена оплаченного заказа и возврат — отдельное бизнес-правило, не произвольный переход назад.