Перейти к содержимому

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.go
type Basket struct {
ID uint64
UserID uint64
Items []BasketItem
Status string
Total uint64
}
// --- internal/service/entity/basket/item.go
type BasketItem struct {
BasketID uint64
ProductID uint64
Count uint64
Price uint64
}
// ---- internal/gateway/grpc/basket/dependencies.go
type 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.go
type BasketServer struct {
repo BasketRepository
producer CheckoutProducer
}
// ---- pkg/server/grpc/basket.grpc.pb.go
type 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;