Спроектируйте и реализуйте сервис управления статусами заказов интернет-магазина цветов. Статусы: «создан», «ожидает оплаты», «оплачен», «доставлен», «завершён», «отменён». Внешняя бизнес-логика не важна: нужен сервис, управляющий переходами между статусами.

Представьте статусы как конечный автомат с явно разрешёнными переходами. Сервис должен атомарно проверять текущий статус, применять переход и записывать историю.

Короткий ответ

Что ответить на собеседовании

Представьте статусы как конечный автомат с явно разрешёнными переходами. Сервис должен атомарно проверять текущий статус, применять переход и записывать историю.

Подробный разбор

Ответ с пояснениями

Представьте статусы как конечный автомат с явно разрешёнными переходами. Сервис должен атомарно проверять текущий статус, применять переход и записывать историю.

Пример правил, требующий согласования бизнеса:

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 выполняются вместе. Отмена оплаченного заказа и возврат — отдельное бизнес-правило, не произвольный переход назад.

ИИ-помощник для собеседований

Хочешь уверенно проходить собеседования?

Попробуй ИИ-помощник для собеседований: слышит вас и собеседника, анализирует экран, подсказывает ответы в реальном времени, работает без VPN и не попадает в захват экрана.

Подробнее