Создание gRPC‑сервиса для управления корзиной покупок с валидацией

Проверку статуса, изменение позиций и пересчёт Total выполняйте в одной транзакции под блокировкой корзины. Checkout использует ту же блокировку.

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

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

Проверку статуса, изменение позиций и пересчёт 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-транзакции.

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

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

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

Подробнее