SberMarket / СберМаркет (Купер) - 2
Актуальность: 1 кв 2026
Задача: Требуется реализовать метод AddItemAndOrder gRPC-сервера, который выполняет следующее: network/grpc
Заголовок раздела «Задача: Требуется реализовать метод AddItemAndOrder gRPC-сервера, который выполняет следующее: network/grpc»- Добавляет один товар в корзину пользователя. Если товар с таким
ProductIDуже существует в корзине, необходимо увеличить егоCountна переданное значение; - После добавления товара пересчитывает
Basket.Totalкак суммуCount * Priceпо всем позициям; - Меняет статус корзины на
"ordered"; - Отправляет событие о факте оформления корзины через
CheckoutProducer; - Проверяет с помощью
StockService, что запрашиваемое количество товара доступно; - Запрещает любые изменения корзины, если ее текущий статус уже
"ordered"; - Сохраняет изменения через
BasketRepository.
func (bs *BasketServer) AddItemAndOrder(ctx context.Context, req *AddItemRequest) (*EmptyResponse, error) { basket, err := bs.repo.Load(ctx, req.UserID) if err != nil { return nil, err }
// place your code here
err = bs.repo.Save(ctx, basket) if err != nil { return nil, err }
return &EmptyResponse{}, nil}
// --- internal/service/entity/basket/basket.gotype Basket struct { ID uint64 UserID uint64 Items []BasketItem Status string Total uint64}
// --- internal/service/entity/basket/item.gotype BasketItem struct { BasketID uint64 ProductID uint64 Count uint64 Price uint64}
// ---- internal/gateway/grpc/basket/dependencies.gotype BasketRepository interface { Load(ctx context.Context, userID uint64) (*Basket, error) Save(ctx context.Context, b *Basket) error}
type CheckoutProducer interface { SendMessage(ctx context.Context, basket Basket) error}
// ---- internal/gateway/grpc/basket/server.gotype BasketServer struct { repo BasketRepository producer CheckoutProducer}
// ---- pkg/server/grpc/basket.grpc.pb.gotype BasketServiceServer interface { AddItemAndOrder(context.Context, *AddItemRequest) (*EmptyResponse, error)}
type StockService interface { CheckAvailable(ctx context.Context, productID uint64) (uint64, error)}
type AddItemRequest struct { UserID uint64 ProductID uint64 Price uint64 Count uint64}
type EmptyResponse struct{}Вопросы
Заголовок раздела «Вопросы»- Какие тесты вы бы применяли здесь?
testing/general - Этот функционал реализован только для gRPC-сервера. Как бы вы перестроили архитектуру, чтобы ту же бизнес-логику можно было переиспользовать для HTTP-эндпоинтов и для консьюмера событий без дублирования кода?
architecture/patterns
Задача: Дана таблица t1, все колонки имеют тип INTEGER. Выполняется следующий SQL-запрос. Какой тип индекса подходит для этого запроса лучше всего? Почему? sql/indexes
Заголовок раздела «Задача: Дана таблица t1, все колонки имеют тип INTEGER. Выполняется следующий SQL-запрос. Какой тип индекса подходит для этого запроса лучше всего? Почему? sql/indexes»SELECT*FROM t1 WHERE a >?AND b =?AND c!=?ORDER BY a;