github.com/akamai/AkamaiOPEN-edgegrid-golang/v8@v8.1.0/pkg/papi/products.go (about) 1 package papi 2 3 import ( 4 "context" 5 "errors" 6 "fmt" 7 "net/http" 8 9 validation "github.com/go-ozzo/ozzo-validation/v4" 10 ) 11 12 type ( 13 // Products contains operations available on Products resource 14 Products interface { 15 // GetProducts lists all available Products 16 // 17 // See: https://techdocs.akamai.com/property-mgr/reference/get-products 18 GetProducts(context.Context, GetProductsRequest) (*GetProductsResponse, error) 19 } 20 21 // GetProductsRequest contains data required to list products associated to a contract 22 GetProductsRequest struct { 23 ContractID string 24 } 25 26 // GetProductsResponse contains details about all products associated to a contract 27 GetProductsResponse struct { 28 AccountID string `json:"accountId"` 29 ContractID string `json:"contractId"` 30 Products ProductsItems `json:"products"` 31 } 32 33 // ProductsItems contains a list of ProductItem 34 ProductsItems struct { 35 Items []ProductItem `json:"items"` 36 } 37 38 // ProductItem contains product resource data 39 ProductItem struct { 40 ProductName string `json:"productName"` 41 ProductID string `json:"productId"` 42 } 43 ) 44 45 // Validate validates GetProductsRequest 46 func (pr GetProductsRequest) Validate() error { 47 return validation.Errors{ 48 "ContractID": validation.Validate(pr.ContractID, validation.Required), 49 }.Filter() 50 } 51 52 var ( 53 // ErrGetProducts represents error when fetching products fails 54 ErrGetProducts = errors.New("fetching products") 55 ) 56 57 // GetProducts is used to list all products for a given contract 58 func (p *papi) GetProducts(ctx context.Context, params GetProductsRequest) (*GetProductsResponse, error) { 59 if err := params.Validate(); err != nil { 60 return nil, fmt.Errorf("%s: %w: %s", ErrGetProducts, ErrStructValidation, err) 61 } 62 63 logger := p.Log(ctx) 64 logger.Debug("GetProducts") 65 66 getURL := fmt.Sprintf("/papi/v1/products?contractId=%s", params.ContractID) 67 req, err := http.NewRequestWithContext(ctx, http.MethodGet, getURL, nil) 68 if err != nil { 69 return nil, fmt.Errorf("%w: failed to create request: %s", ErrGetProducts, err) 70 } 71 72 var products GetProductsResponse 73 resp, err := p.Exec(req, &products) 74 if err != nil { 75 return nil, fmt.Errorf("%w: request failed: %s", ErrGetProducts, err) 76 } 77 78 if resp.StatusCode != http.StatusOK { 79 return nil, fmt.Errorf("%s: %w", ErrGetProducts, p.Error(resp)) 80 } 81 82 return &products, nil 83 }