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

Требуется реализовать метод AddItemAndOrder gRPC-сервера, который выполняет следующее:

network · grpcSberMarket / СберМаркет (Купер) - 21 кв 2026не решено

Требуется реализовать метод AddItemAndOrder 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{}

Источник: SberMarket / СберМаркет (Купер) - 2 · 1 кв 2026

← Реализуйте middleware для HTTP-клиента… · Все задачи · Сети и протоколы · Простой круговой балансер: →