github.com/akamai/AkamaiOPEN-edgegrid-golang/v8@v8.1.0/pkg/papi/include_versions.go (about)

     1  package papi
     2  
     3  import (
     4  	"context"
     5  	"errors"
     6  	"fmt"
     7  	"net/http"
     8  	"net/url"
     9  	"strconv"
    10  
    11  	"github.com/akamai/AkamaiOPEN-edgegrid-golang/v8/pkg/edgegriderr"
    12  	validation "github.com/go-ozzo/ozzo-validation/v4"
    13  )
    14  
    15  type (
    16  	// IncludeVersions contains operations available on IncludeVersion resource
    17  	IncludeVersions interface {
    18  		// CreateIncludeVersion creates a new include version based on any previous version
    19  		//
    20  		// See: https://techdocs.akamai.com/property-mgr/reference/post-include-versions
    21  		CreateIncludeVersion(context.Context, CreateIncludeVersionRequest) (*CreateIncludeVersionResponse, error)
    22  
    23  		// GetIncludeVersion polls the state of a specific include version, for example to check its activation status
    24  		//
    25  		// See: https://techdocs.akamai.com/property-mgr/reference/get-include-version
    26  		GetIncludeVersion(context.Context, GetIncludeVersionRequest) (*GetIncludeVersionResponse, error)
    27  
    28  		// ListIncludeVersions lists the include versions, with results limited to the 500 most recent versions
    29  		//
    30  		// See: https://techdocs.akamai.com/property-mgr/reference/get-include-versions
    31  		ListIncludeVersions(context.Context, ListIncludeVersionsRequest) (*ListIncludeVersionsResponse, error)
    32  
    33  		// ListIncludeVersionAvailableCriteria lists available criteria for the include version
    34  		//
    35  		// See: https://techdocs.akamai.com/property-mgr/reference/get-include-available-criteria
    36  		ListIncludeVersionAvailableCriteria(context.Context, ListAvailableCriteriaRequest) (*AvailableCriteriaResponse, error)
    37  
    38  		// ListIncludeVersionAvailableBehaviors lists available behaviors for the include version
    39  		//
    40  		// See: https://techdocs.akamai.com/property-mgr/reference/get-include-available-behaviors
    41  		ListIncludeVersionAvailableBehaviors(context.Context, ListAvailableBehaviorsRequest) (*AvailableBehaviorsResponse, error)
    42  	}
    43  
    44  	// CreateIncludeVersionRequest contains parameters used to create a new include version
    45  	CreateIncludeVersionRequest struct {
    46  		IncludeID string
    47  		IncludeVersionRequest
    48  	}
    49  
    50  	// IncludeVersionRequest contains body parameters used to create a new include version
    51  	IncludeVersionRequest struct {
    52  		CreateFromVersion     int    `json:"createFromVersion"`
    53  		CreateFromVersionEtag string `json:"createFromVersionEtag,omitempty"`
    54  	}
    55  
    56  	// CreateIncludeVersionResponse represents a response object returned by CreateIncludeVersion
    57  	CreateIncludeVersionResponse struct {
    58  		VersionLink string
    59  		Version     int
    60  	}
    61  
    62  	// GetIncludeVersionRequest contains parameters used to get the include version
    63  	GetIncludeVersionRequest struct {
    64  		IncludeID  string
    65  		Version    int
    66  		ContractID string
    67  		GroupID    string
    68  	}
    69  
    70  	// ListIncludeVersionsRequest contains parameters used to list the include versions
    71  	ListIncludeVersionsRequest struct {
    72  		IncludeID  string
    73  		ContractID string
    74  		GroupID    string
    75  	}
    76  
    77  	// GetIncludeVersionResponse represents a response object returned by GetIncludeVersion
    78  	GetIncludeVersionResponse struct {
    79  		IncludeID       string         `json:"includeId"`
    80  		IncludeName     string         `json:"includeName"`
    81  		AccountID       string         `json:"accountId"`
    82  		ContractID      string         `json:"contractId"`
    83  		GroupID         string         `json:"groupId"`
    84  		AssetID         string         `json:"assetId"`
    85  		IncludeType     IncludeType    `json:"includeType"`
    86  		IncludeVersions Versions       `json:"versions"`
    87  		IncludeVersion  IncludeVersion `json:"-"`
    88  	}
    89  
    90  	// ListIncludeVersionsResponse represents a response object returned by ListIncludeVersions
    91  	ListIncludeVersionsResponse struct {
    92  		IncludeID       string      `json:"includeId"`
    93  		IncludeName     string      `json:"includeName"`
    94  		AccountID       string      `json:"accountId"`
    95  		ContractID      string      `json:"contractId"`
    96  		GroupID         string      `json:"groupId"`
    97  		AssetID         string      `json:"assetId"`
    98  		IncludeType     IncludeType `json:"includeType"`
    99  		IncludeVersions Versions    `json:"versions"`
   100  	}
   101  
   102  	// Versions represents IncludeVersions object
   103  	Versions struct {
   104  		Items []IncludeVersion `json:"items"`
   105  	}
   106  
   107  	// IncludeVersion represents an include version object
   108  	IncludeVersion struct {
   109  		UpdatedByUser    string        `json:"updatedByUser"`
   110  		UpdatedDate      string        `json:"updatedDate"`
   111  		ProductionStatus VersionStatus `json:"productionStatus"`
   112  		Etag             string        `json:"etag"`
   113  		ProductID        string        `json:"productId"`
   114  		Note             string        `json:"note,omitempty"`
   115  		RuleFormat       string        `json:"ruleFormat,omitempty"`
   116  		IncludeVersion   int           `json:"includeVersion"`
   117  		StagingStatus    VersionStatus `json:"stagingStatus"`
   118  	}
   119  
   120  	// ListAvailableCriteriaRequest contains parameters used to get available include version criteria
   121  	ListAvailableCriteriaRequest struct {
   122  		IncludeID string
   123  		Version   int
   124  	}
   125  
   126  	// AvailableCriteriaResponse represents a response object returned by ListIncludeVersionAvailableCriteria
   127  	AvailableCriteriaResponse struct {
   128  		ContractID        string            `json:"contractId"`
   129  		GroupID           string            `json:"groupId"`
   130  		ProductID         string            `json:"productId"`
   131  		RuleFormat        string            `json:"ruleFormat"`
   132  		AvailableCriteria AvailableCriteria `json:"criteria"`
   133  	}
   134  
   135  	// AvailableCriteria represents list of available criteria for the include version
   136  	AvailableCriteria struct {
   137  		Items []Criteria `json:"items"`
   138  	}
   139  
   140  	// Criteria represents available criteria object
   141  	Criteria struct {
   142  		Name       string `json:"name"`
   143  		SchemaLink string `json:"schemaLink"`
   144  	}
   145  
   146  	// ListAvailableBehaviorsRequest contains parameters used to get available include version behaviors
   147  	ListAvailableBehaviorsRequest struct {
   148  		IncludeID string
   149  		Version   int
   150  	}
   151  
   152  	// AvailableBehaviorsResponse represents a response object returned by GetIncludeVersionAvailableBehavior
   153  	AvailableBehaviorsResponse struct {
   154  		ContractID         string             `json:"contractId"`
   155  		GroupID            string             `json:"groupId"`
   156  		ProductID          string             `json:"productId"`
   157  		RuleFormat         string             `json:"ruleFormat"`
   158  		AvailableBehaviors AvailableBehaviors `json:"behaviors"`
   159  	}
   160  
   161  	// AvailableBehaviors represents list of available behaviors for the include version
   162  	AvailableBehaviors struct {
   163  		Items []Behavior `json:"items"`
   164  	}
   165  
   166  	// Behavior represents available behavior object
   167  	Behavior struct {
   168  		Name       string `json:"name"`
   169  		SchemaLink string `json:"schemaLink"`
   170  	}
   171  )
   172  
   173  // Validate validates CreateIncludeVersionRequest
   174  func (i CreateIncludeVersionRequest) Validate() error {
   175  	return edgegriderr.ParseValidationErrors(validation.Errors{
   176  		"IncludeID":         validation.Validate(i.IncludeID, validation.Required),
   177  		"CreateFromVersion": validation.Validate(i.CreateFromVersion, validation.Required),
   178  	})
   179  }
   180  
   181  // Validate validates GetIncludeVersionRequest
   182  func (i GetIncludeVersionRequest) Validate() error {
   183  	return edgegriderr.ParseValidationErrors(validation.Errors{
   184  		"IncludeID":  validation.Validate(i.IncludeID, validation.Required),
   185  		"Version":    validation.Validate(i.Version, validation.Required),
   186  		"ContractID": validation.Validate(i.ContractID, validation.Required),
   187  		"GroupID":    validation.Validate(i.GroupID, validation.Required),
   188  	})
   189  }
   190  
   191  // Validate validates ListIncludeVersionsRequest
   192  func (i ListIncludeVersionsRequest) Validate() error {
   193  	return edgegriderr.ParseValidationErrors(validation.Errors{
   194  		"IncludeID":  validation.Validate(i.IncludeID, validation.Required),
   195  		"ContractID": validation.Validate(i.ContractID, validation.Required),
   196  		"GroupID":    validation.Validate(i.GroupID, validation.Required),
   197  	})
   198  }
   199  
   200  // Validate validates ListAvailableCriteriaRequest
   201  func (i ListAvailableCriteriaRequest) Validate() error {
   202  	return edgegriderr.ParseValidationErrors(validation.Errors{
   203  		"IncludeID": validation.Validate(i.IncludeID, validation.Required),
   204  		"Version":   validation.Validate(i.Version, validation.Required),
   205  	})
   206  }
   207  
   208  // Validate validates ListAvailableBehaviorsRequest
   209  func (i ListAvailableBehaviorsRequest) Validate() error {
   210  	return edgegriderr.ParseValidationErrors(validation.Errors{
   211  		"IncludeID": validation.Validate(i.IncludeID, validation.Required),
   212  		"Version":   validation.Validate(i.Version, validation.Required),
   213  	})
   214  }
   215  
   216  var (
   217  	// ErrCreateIncludeVersion is returned in case an error occurs on CreateIncludeVersion operation
   218  	ErrCreateIncludeVersion = errors.New("create an include version")
   219  	// ErrGetIncludeVersion is returned in case an error occurs on GetIncludeVersion operation
   220  	ErrGetIncludeVersion = errors.New("get an include version")
   221  	// ErrListIncludeVersions is returned in case an error occurs on ListIncludeVersions operation
   222  	ErrListIncludeVersions = errors.New("list include versions")
   223  	// ErrListIncludeVersionAvailableCriteria is returned in case an error occurs on ListIncludeVersionAvailableCriteria operation
   224  	ErrListIncludeVersionAvailableCriteria = errors.New("list include version available criteria")
   225  	// ErrListIncludeVersionAvailableBehaviors is returned in case an error occurs on ListIncludeVersionAvailableBehaviors operation
   226  	ErrListIncludeVersionAvailableBehaviors = errors.New("list include version available behaviors")
   227  )
   228  
   229  func (p *papi) CreateIncludeVersion(ctx context.Context, params CreateIncludeVersionRequest) (*CreateIncludeVersionResponse, error) {
   230  	logger := p.Log(ctx)
   231  	logger.Debug("CreateIncludeVersion")
   232  
   233  	if err := params.Validate(); err != nil {
   234  		return nil, fmt.Errorf("%s: %w: %s", ErrCreateIncludeVersion, ErrStructValidation, err)
   235  	}
   236  
   237  	uri := fmt.Sprintf("/papi/v1/includes/%s/versions", params.IncludeID)
   238  
   239  	req, err := http.NewRequestWithContext(ctx, http.MethodPost, uri, nil)
   240  	if err != nil {
   241  		return nil, fmt.Errorf("%w: failed to create request: %s", ErrCreateIncludeVersion, err)
   242  	}
   243  
   244  	var result CreateIncludeVersionResponse
   245  	resp, err := p.Exec(req, &result, params.IncludeVersionRequest)
   246  	if err != nil {
   247  		return nil, fmt.Errorf("%w: request failed: %s", ErrCreateIncludeVersion, err)
   248  	}
   249  
   250  	if resp.StatusCode != http.StatusCreated {
   251  		return nil, fmt.Errorf("%s: %w", ErrCreateIncludeVersion, p.Error(resp))
   252  	}
   253  
   254  	id, err := ResponseLinkParse(result.VersionLink)
   255  	if err != nil {
   256  		return nil, fmt.Errorf("%s: %w: %s", ErrCreateIncludeVersion, ErrInvalidResponseLink, err)
   257  	}
   258  	result.Version, err = strconv.Atoi(id)
   259  	if err != nil {
   260  		return nil, fmt.Errorf("%s: %w: %s", ErrCreateIncludeVersion, ErrInvalidResponseLink, err)
   261  	}
   262  
   263  	return &result, nil
   264  }
   265  
   266  func (p *papi) GetIncludeVersion(ctx context.Context, params GetIncludeVersionRequest) (*GetIncludeVersionResponse, error) {
   267  	logger := p.Log(ctx)
   268  	logger.Debug("GetIncludeVersion")
   269  
   270  	if err := params.Validate(); err != nil {
   271  		return nil, fmt.Errorf("%s: %w: %s", ErrGetIncludeVersion, ErrStructValidation, err)
   272  	}
   273  
   274  	uri, err := url.Parse(fmt.Sprintf("/papi/v1/includes/%s/versions/%d", params.IncludeID, params.Version))
   275  	if err != nil {
   276  		return nil, fmt.Errorf("%w: failed to parse url: %s", ErrGetIncludeVersion, err)
   277  	}
   278  
   279  	q := uri.Query()
   280  	q.Add("contractId", params.ContractID)
   281  	q.Add("groupId", params.GroupID)
   282  	uri.RawQuery = q.Encode()
   283  
   284  	req, err := http.NewRequestWithContext(ctx, http.MethodGet, uri.String(), nil)
   285  	if err != nil {
   286  		return nil, fmt.Errorf("%w: failed to create request: %s", ErrGetIncludeVersion, err)
   287  	}
   288  
   289  	var result GetIncludeVersionResponse
   290  	resp, err := p.Exec(req, &result)
   291  	if err != nil {
   292  		return nil, fmt.Errorf("%w: request failed: %s", ErrGetIncludeVersion, err)
   293  	}
   294  
   295  	if resp.StatusCode != http.StatusOK {
   296  		return nil, fmt.Errorf("%s: %w", ErrGetIncludeVersion, p.Error(resp))
   297  	}
   298  
   299  	if len(result.IncludeVersions.Items) == 0 {
   300  		return nil, fmt.Errorf("%s: %w: IncludeID: %s", ErrGetIncludeVersion, ErrNotFound, params.IncludeID)
   301  	}
   302  	result.IncludeVersion = result.IncludeVersions.Items[0]
   303  
   304  	return &result, nil
   305  }
   306  
   307  func (p *papi) ListIncludeVersions(ctx context.Context, params ListIncludeVersionsRequest) (*ListIncludeVersionsResponse, error) {
   308  	logger := p.Log(ctx)
   309  	logger.Debug("ListIncludeVersions")
   310  
   311  	if err := params.Validate(); err != nil {
   312  		return nil, fmt.Errorf("%s: %w: %s", ErrListIncludeVersions, ErrStructValidation, err)
   313  	}
   314  
   315  	uri, err := url.Parse(fmt.Sprintf("/papi/v1/includes/%s/versions", params.IncludeID))
   316  	if err != nil {
   317  		return nil, fmt.Errorf("%w: failed to parse url: %s", ErrListIncludeVersions, err)
   318  	}
   319  
   320  	q := uri.Query()
   321  	q.Add("contractId", params.ContractID)
   322  	q.Add("groupId", params.GroupID)
   323  	uri.RawQuery = q.Encode()
   324  
   325  	req, err := http.NewRequestWithContext(ctx, http.MethodGet, uri.String(), nil)
   326  	if err != nil {
   327  		return nil, fmt.Errorf("%w: failed to create request: %s", ErrListIncludeVersions, err)
   328  	}
   329  
   330  	var result ListIncludeVersionsResponse
   331  	resp, err := p.Exec(req, &result)
   332  	if err != nil {
   333  		return nil, fmt.Errorf("%w: request failed: %s", ErrListIncludeVersions, err)
   334  	}
   335  
   336  	if resp.StatusCode != http.StatusOK {
   337  		return nil, fmt.Errorf("%s: %w", ErrListIncludeVersions, p.Error(resp))
   338  	}
   339  
   340  	return &result, nil
   341  }
   342  
   343  func (p *papi) ListIncludeVersionAvailableCriteria(ctx context.Context, params ListAvailableCriteriaRequest) (*AvailableCriteriaResponse, error) {
   344  	logger := p.Log(ctx)
   345  	logger.Debug("ListIncludeVersionAvailableCriteria")
   346  
   347  	if err := params.Validate(); err != nil {
   348  		return nil, fmt.Errorf("%s: %w: %s", ErrListIncludeVersionAvailableCriteria, ErrStructValidation, err)
   349  	}
   350  
   351  	uri := fmt.Sprintf("/papi/v1/includes/%s/versions/%d/available-criteria", params.IncludeID, params.Version)
   352  
   353  	req, err := http.NewRequestWithContext(ctx, http.MethodGet, uri, nil)
   354  	if err != nil {
   355  		return nil, fmt.Errorf("%w: failed to create request: %s", ErrListIncludeVersionAvailableCriteria, err)
   356  	}
   357  
   358  	var result AvailableCriteriaResponse
   359  	resp, err := p.Exec(req, &result)
   360  	if err != nil {
   361  		return nil, fmt.Errorf("%w: request failed: %s", ErrListIncludeVersionAvailableCriteria, err)
   362  	}
   363  
   364  	if resp.StatusCode != http.StatusOK {
   365  		return nil, fmt.Errorf("%s: %w", ErrListIncludeVersionAvailableCriteria, p.Error(resp))
   366  	}
   367  
   368  	return &result, nil
   369  }
   370  
   371  func (p *papi) ListIncludeVersionAvailableBehaviors(ctx context.Context, params ListAvailableBehaviorsRequest) (*AvailableBehaviorsResponse, error) {
   372  	logger := p.Log(ctx)
   373  	logger.Debug("ListIncludeVersionAvailableBehaviors")
   374  
   375  	if err := params.Validate(); err != nil {
   376  		return nil, fmt.Errorf("%s: %w: %s", ErrListIncludeVersionAvailableBehaviors, ErrStructValidation, err)
   377  	}
   378  
   379  	uri := fmt.Sprintf("/papi/v1/includes/%s/versions/%d/available-behaviors", params.IncludeID, params.Version)
   380  
   381  	req, err := http.NewRequestWithContext(ctx, http.MethodGet, uri, nil)
   382  	if err != nil {
   383  		return nil, fmt.Errorf("%w: failed to create request: %s", ErrListIncludeVersionAvailableBehaviors, err)
   384  	}
   385  
   386  	var result AvailableBehaviorsResponse
   387  	resp, err := p.Exec(req, &result)
   388  	if err != nil {
   389  		return nil, fmt.Errorf("%w: request failed: %s", ErrListIncludeVersionAvailableBehaviors, err)
   390  	}
   391  
   392  	if resp.StatusCode != http.StatusOK {
   393  		return nil, fmt.Errorf("%s: %w", ErrListIncludeVersionAvailableBehaviors, p.Error(resp))
   394  	}
   395  
   396  	return &result, nil
   397  }