Проверку статуса, изменение позиций и пересчёт Total выполняйте в одной транзакции под блокировкой корзины. Checkout использует ту же блокировку.
Создание gRPC‑сервиса для управления корзиной покупок с валидацией
Проверку статуса, изменение позиций и пересчёт Total выполняйте в одной транзакции под блокировкой корзины. Checkout использует ту же блокировку.
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
Условие
Разработать метод gRPC‑сервиса, который:
- добавляет товар в корзину;
- завершает оформление корзины. После того как корзина помечена как оформленная (cart.Status == "order"), любые изменения в ней запрещены. При каждом изменении состава корзины необходимо пересчитывать поле cart.Total как сумму произведений количества на цену (total = Σ count * price). Все позиции в корзине должны быть уникальны по идентификатору товара (ProductId).
Ответ
Проверку статуса, изменение позиций и пересчёт Total выполняйте в одной транзакции под блокировкой корзины. Checkout использует ту же блокировку.
Для AddItem: проверить авторизацию владельца, положительное количество и допустимый ProductId; открыть транзакцию; заблокировать cart; отклонить cart.Status == "order"; получить доверенную цену, выполнить insert/update позиции и пересчитать Total. Уникальный индекс (cart_id, product_id) закрепляет инвариант на уровне БД. Деньги — целые минимальные единицы с проверкой переполнения.
Checkout под тем же lock проверяет состояние и атомарно переводит корзину в order; повтор обрабатывает идемпотентно. Неверный ввод возвращает InvalidArgument, закрытая корзина — FailedPrecondition. Схема protobuf не задана: не стоит выдумывать имена существующих сообщений. Внешнюю оплату нельзя держать внутри долгой DB-транзакции.