[hw-3] loms service

This commit is contained in:
Никита Шубин
2025-06-20 10:11:59 +00:00
parent c8e056bc99
commit b88dfe6db5
73 changed files with 8837 additions and 52 deletions

View File

@@ -0,0 +1,56 @@
package loms
import (
"context"
"fmt"
"route256/cart/internal/domain/entity"
"route256/cart/internal/domain/model"
pbLoms "route256/pkg/api/loms/v1"
)
type Service struct {
grpcClient pbLoms.LOMSClient
}
func NewLomsService(grpcClient pbLoms.LOMSClient) *Service {
return &Service{
grpcClient: grpcClient,
}
}
func (s *Service) OrderCreate(ctx context.Context, cart *model.Cart) (int64, error) {
items := make([]*pbLoms.OrderItem, len(cart.Items))
for i, item := range cart.Items {
items[i] = &pbLoms.OrderItem{
Sku: int64(item.Product.Sku),
Count: item.Count,
}
}
req := &pbLoms.OrderCreateRequest{
UserId: int64(cart.UserID),
Items: items,
}
resp, err := s.grpcClient.OrderCreate(ctx, req)
if err != nil {
return 0, fmt.Errorf("grpcClient.OrderCreate: %w", err)
}
return resp.OrderId, nil
}
func (s *Service) StocksInfo(ctx context.Context, sku entity.Sku) (uint32, error) {
req := &pbLoms.StocksInfoRequest{
Sku: int64(sku),
}
resp, err := s.grpcClient.StocksInfo(ctx, req)
if err != nil {
return 0, fmt.Errorf("grpcClient.StocksInfo: %w", err)
}
return resp.Count, nil
}

View File

@@ -0,0 +1,75 @@
package products
import (
"context"
"encoding/json"
"errors"
"fmt"
"net/http"
"time"
"route256/cart/internal/domain/entity"
"route256/cart/internal/domain/model"
)
type ProductService struct {
httpClient http.Client
token string
address string
}
func NewProductService(httpClient http.Client, token string, address string) *ProductService {
return &ProductService{
httpClient: httpClient,
token: token,
address: address,
}
}
func (s *ProductService) GetProductBySku(ctx context.Context, sku entity.Sku) (*model.Product, error) {
ctx, cancel := context.WithTimeout(ctx, 5*time.Second)
defer cancel()
req, err := http.NewRequestWithContext(
ctx,
http.MethodGet,
fmt.Sprintf("http://%s/product/%d", s.address, sku),
http.NoBody,
)
if err != nil {
return nil, fmt.Errorf("http.NewRequestWithContext: %w", err)
}
req.Header.Add("X-API-KEY", s.token)
response, err := s.httpClient.Do(req)
if err != nil {
return nil, fmt.Errorf("httpClient.Do: %w", err)
}
defer response.Body.Close()
if response.StatusCode == http.StatusNotFound {
return nil, model.ErrProductNotFound
}
if response.StatusCode != http.StatusOK {
return nil, errors.New("status not ok")
}
resp := &GetProductResponse{}
if err := json.NewDecoder(response.Body).Decode(resp); err != nil {
return nil, fmt.Errorf("json.NewDecoder: %w", err)
}
return &model.Product{
Name: resp.Name,
Price: resp.Price,
Sku: entity.Sku(resp.Sku),
}, nil
}
type GetProductResponse struct {
Name string `json:"name"`
Price int32 `json:"price"`
Sku int64 `json:"sku"`
}