## Условие
// Реализовать метод gRPC-сервера, который:// - добавляет товар в корзину;// - оформляет корзину.
// В оформленные корзины (basket.Status=="ordered ") изменения вносить нельзя.// При изменении состава корзины надо пересчитывать basket.Total=sum(count*price);// Все элементы в корзине должны быть уникальны по ключу ProductID.
// Для оформления корзины необходимо:// - сменить ее статус на ordered;// - сообщить возможным потребителям с помощью сообщений в брокер.
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 }
err = bs.repo.Save(ctx, basket) if err != nil { return nil, err }
err = bs.producer.SendMessage(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.pb.gotype BasketServiceServer interface { AddItemAndOrder(context.Context, *AddItemRequest) (*EmptyResponse, error)}
type AddItemRequest struct { UserID uint64 ProductID uint64 Price uint64 Count uint64}
type EmptyResponse struct{}Решение
Заголовок раздела «Решение»Источник: Magnit / Магнит - 5 · 1 кв 2025
← Необходимо написать in-memory кэш. В кэ… · Все задачи · Go · Смерджить два упорядоченных массива в о… →