mirror of
https://github.com/3ybactuk/marketplace-go-service-project.git
synced 2025-10-30 14:03:45 +03:00
[hw-3] loms service
This commit is contained in:
56
cart/internal/clients/loms/service.go
Normal file
56
cart/internal/clients/loms/service.go
Normal 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
|
||||
}
|
||||
75
cart/internal/clients/products/service.go
Normal file
75
cart/internal/clients/products/service.go
Normal 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"`
|
||||
}
|
||||
Reference in New Issue
Block a user