Требуется реализовать метод AddItemAndOrder gRPC-сервера, который выполняет следующее:
Условие
Заголовок раздела «Условие»Требуется реализовать метод 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.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{}Решение
Заголовок раздела «Решение»Источник: SberMarket / СберМаркет (Купер) - 2 · 1 кв 2026
← Реализуйте middleware для HTTP-клиента… · Все задачи · Сети и протоколы · Простой круговой балансер: →