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  }