github.com/akamai/AkamaiOPEN-edgegrid-golang/v8@v8.1.0/pkg/cloudlets/v3/policy_version.go (about)

     1  package v3
     2  
     3  import (
     4  	"context"
     5  	"errors"
     6  	"fmt"
     7  	"net/http"
     8  	"net/url"
     9  	"time"
    10  
    11  	"github.com/akamai/AkamaiOPEN-edgegrid-golang/v8/pkg/edgegriderr"
    12  
    13  	validation "github.com/go-ozzo/ozzo-validation/v4"
    14  )
    15  
    16  type (
    17  	// ListPolicyVersions is response returned by ListPolicyVersions
    18  	ListPolicyVersions struct {
    19  		PolicyVersions []ListPolicyVersionsItem `json:"content"`
    20  		Links          []Link                   `json:"links"`
    21  		Page           Page                     `json:"page"`
    22  	}
    23  
    24  	// ListPolicyVersionsItem is a content struct of ListPolicyVersion response
    25  	ListPolicyVersionsItem struct {
    26  		CreatedBy     string     `json:"createdBy"`
    27  		CreatedDate   time.Time  `json:"createdDate"`
    28  		Description   *string    `json:"description"`
    29  		ID            int64      `json:"id"`
    30  		Immutable     bool       `json:"immutable"`
    31  		Links         []Link     `json:"links"`
    32  		ModifiedBy    string     `json:"modifiedBy"`
    33  		ModifiedDate  *time.Time `json:"modifiedDate,omitempty"`
    34  		PolicyID      int64      `json:"policyId"`
    35  		PolicyVersion int64      `json:"version"`
    36  	}
    37  
    38  	// PolicyVersion is response returned by GetPolicyVersion, CreatePolicyVersion or UpdatePolicyVersion
    39  	PolicyVersion struct {
    40  		CreatedBy          string              `json:"createdBy"`
    41  		CreatedDate        time.Time           `json:"createdDate"`
    42  		Description        *string             `json:"description"`
    43  		ID                 int64               `json:"id"`
    44  		Immutable          bool                `json:"immutable"`
    45  		MatchRules         MatchRules          `json:"matchRules"`
    46  		MatchRulesWarnings []MatchRulesWarning `json:"matchRulesWarnings"`
    47  		ModifiedBy         string              `json:"modifiedBy"`
    48  		ModifiedDate       *time.Time          `json:"modifiedDate,omitempty"`
    49  		PolicyID           int64               `json:"policyId"`
    50  		PolicyVersion      int64               `json:"version"`
    51  	}
    52  
    53  	// MatchRulesWarning describes the warnings struct
    54  	MatchRulesWarning struct {
    55  		Detail      string `json:"detail"`
    56  		JSONPointer string `json:"jsonPointer,omitempty"`
    57  		Title       string `json:"title"`
    58  		Type        string `json:"type"`
    59  	}
    60  
    61  	// ListPolicyVersionsRequest describes the parameters needed to list policy versions
    62  	ListPolicyVersionsRequest struct {
    63  		PolicyID int64
    64  		Page     int
    65  		Size     int
    66  	}
    67  
    68  	// GetPolicyVersionRequest describes the parameters needed to get policy version
    69  	GetPolicyVersionRequest struct {
    70  		PolicyID      int64
    71  		PolicyVersion int64
    72  	}
    73  
    74  	// CreatePolicyVersionRequest describes the body of the create policy request
    75  	CreatePolicyVersionRequest struct {
    76  		CreatePolicyVersion
    77  		PolicyID int64
    78  	}
    79  
    80  	// CreatePolicyVersion describes the body of the create policy request
    81  	CreatePolicyVersion struct {
    82  		Description *string    `json:"description,omitempty"`
    83  		MatchRules  MatchRules `json:"matchRules"`
    84  	}
    85  
    86  	// UpdatePolicyVersion describes the body of the update policy version request
    87  	UpdatePolicyVersion struct {
    88  		Description *string    `json:"description,omitempty"`
    89  		MatchRules  MatchRules `json:"matchRules"`
    90  	}
    91  
    92  	// DeletePolicyVersionRequest describes the parameters of the delete policy version request
    93  	DeletePolicyVersionRequest struct {
    94  		PolicyID      int64
    95  		PolicyVersion int64
    96  	}
    97  
    98  	// UpdatePolicyVersionRequest describes the parameters of the update policy version request
    99  	UpdatePolicyVersionRequest struct {
   100  		UpdatePolicyVersion
   101  		PolicyID      int64
   102  		PolicyVersion int64
   103  	}
   104  )
   105  
   106  // Validate validates ListPolicyVersionsRequest
   107  func (c ListPolicyVersionsRequest) Validate() error {
   108  	errs := validation.Errors{
   109  		"PolicyID": validation.Validate(c.PolicyID, validation.Required),
   110  		"Size":     validation.Validate(c.Size, validation.Min(10)),
   111  		"Page":     validation.Validate(c.Page, validation.Min(0)),
   112  	}
   113  	return edgegriderr.ParseValidationErrors(errs)
   114  }
   115  
   116  // Validate validates CreatePolicyVersionRequest
   117  func (c CreatePolicyVersionRequest) Validate() error {
   118  	return edgegriderr.ParseValidationErrors(validation.Errors{
   119  		"PolicyID":    validation.Validate(c.PolicyID, validation.Required),
   120  		"Description": validation.Validate(c.Description, validation.Length(0, 255)),
   121  		"MatchRules":  validation.Validate(c.MatchRules, validation.Length(0, 5000)),
   122  	})
   123  }
   124  
   125  // Validate validates UpdatePolicyVersionRequest
   126  func (c UpdatePolicyVersionRequest) Validate() error {
   127  	return edgegriderr.ParseValidationErrors(validation.Errors{
   128  		"PolicyID":      validation.Validate(c.PolicyID, validation.Required),
   129  		"PolicyVersion": validation.Validate(c.PolicyVersion, validation.Required),
   130  		"Description":   validation.Validate(c.Description, validation.Length(0, 255)),
   131  		"MatchRules":    validation.Validate(c.MatchRules, validation.Length(0, 5000)),
   132  	})
   133  }
   134  
   135  // Validate validates DeletePolicyVersionRequest
   136  func (c DeletePolicyVersionRequest) Validate() error {
   137  	return edgegriderr.ParseValidationErrors(validation.Errors{
   138  		"PolicyID":      validation.Validate(c.PolicyID, validation.Required),
   139  		"PolicyVersion": validation.Validate(c.PolicyVersion, validation.Required),
   140  	})
   141  }
   142  
   143  var (
   144  	// ErrListPolicyVersions is returned when ListPolicyVersions fails
   145  	ErrListPolicyVersions = errors.New("list policy versions")
   146  	// ErrGetPolicyVersion is returned when GetPolicyVersion fails
   147  	ErrGetPolicyVersion = errors.New("get policy versions")
   148  	// ErrCreatePolicyVersion is returned when CreatePolicyVersion fails
   149  	ErrCreatePolicyVersion = errors.New("create policy versions")
   150  	// ErrDeletePolicyVersion is returned when DeletePolicyVersion fails
   151  	ErrDeletePolicyVersion = errors.New("delete policy versions")
   152  	// ErrUpdatePolicyVersion is returned when UpdatePolicyVersion fails
   153  	ErrUpdatePolicyVersion = errors.New("update policy versions")
   154  )
   155  
   156  func (c *cloudlets) ListPolicyVersions(ctx context.Context, params ListPolicyVersionsRequest) (*ListPolicyVersions, error) {
   157  	logger := c.Log(ctx)
   158  	logger.Debug("ListPolicyVersions")
   159  
   160  	if err := params.Validate(); err != nil {
   161  		return nil, fmt.Errorf("%s: %w:\n%s", ErrListPolicyVersions, ErrStructValidation, err)
   162  	}
   163  
   164  	uri, err := url.Parse(fmt.Sprintf("/cloudlets/v3/policies/%d/versions", params.PolicyID))
   165  	if err != nil {
   166  		return nil, fmt.Errorf("%w: failed to parse url: %s", ErrListPolicyVersions, err)
   167  	}
   168  
   169  	q := uri.Query()
   170  	q.Add("page", fmt.Sprintf("%d", params.Page))
   171  	if params.Size != 0 {
   172  		q.Add("size", fmt.Sprintf("%d", params.Size))
   173  	}
   174  	uri.RawQuery = q.Encode()
   175  
   176  	req, err := http.NewRequestWithContext(ctx, http.MethodGet, uri.String(), nil)
   177  	if err != nil {
   178  		return nil, fmt.Errorf("%w: failed to create request: %s", ErrListPolicyVersions, err)
   179  	}
   180  
   181  	var result *ListPolicyVersions
   182  	resp, err := c.Exec(req, &result)
   183  	if err != nil {
   184  		return nil, fmt.Errorf("%w: request failed: %s", ErrListPolicyVersions, err)
   185  	}
   186  
   187  	if resp.StatusCode != http.StatusOK {
   188  		return nil, fmt.Errorf("%s: %w", ErrListPolicyVersions, c.Error(resp))
   189  	}
   190  
   191  	return result, nil
   192  }
   193  
   194  func (c *cloudlets) GetPolicyVersion(ctx context.Context, params GetPolicyVersionRequest) (*PolicyVersion, error) {
   195  	logger := c.Log(ctx)
   196  	logger.Debug("GetPolicyVersion")
   197  
   198  	uri := fmt.Sprintf("/cloudlets/v3/policies/%d/versions/%d", params.PolicyID, params.PolicyVersion)
   199  
   200  	req, err := http.NewRequestWithContext(ctx, http.MethodGet, uri, nil)
   201  	if err != nil {
   202  		return nil, fmt.Errorf("%w: failed to create request: %s", ErrGetPolicyVersion, err)
   203  	}
   204  
   205  	var result PolicyVersion
   206  
   207  	resp, err := c.Exec(req, &result)
   208  	if err != nil {
   209  		return nil, fmt.Errorf("%w: request failed: %s", ErrGetPolicyVersion, err)
   210  	}
   211  
   212  	if resp.StatusCode != http.StatusOK {
   213  		return nil, fmt.Errorf("%s: %w", ErrGetPolicyVersion, c.Error(resp))
   214  	}
   215  
   216  	return &result, nil
   217  }
   218  
   219  func (c *cloudlets) CreatePolicyVersion(ctx context.Context, params CreatePolicyVersionRequest) (*PolicyVersion, error) {
   220  	logger := c.Log(ctx)
   221  	logger.Debug("CreatePolicyVersion")
   222  
   223  	if err := params.Validate(); err != nil {
   224  		return nil, fmt.Errorf("%s: %w:\n%s", ErrCreatePolicyVersion, ErrStructValidation, err)
   225  	}
   226  
   227  	uri := fmt.Sprintf("/cloudlets/v3/policies/%d/versions", params.PolicyID)
   228  
   229  	req, err := http.NewRequestWithContext(ctx, http.MethodPost, uri, nil)
   230  	if err != nil {
   231  		return nil, fmt.Errorf("%w: failed to create request: %s", ErrCreatePolicyVersion, err)
   232  	}
   233  
   234  	var result PolicyVersion
   235  
   236  	resp, err := c.Exec(req, &result, params.CreatePolicyVersion)
   237  	if err != nil {
   238  		return nil, fmt.Errorf("%w: request failed: %s", ErrCreatePolicyVersion, err)
   239  	}
   240  
   241  	if resp.StatusCode != http.StatusCreated {
   242  		return nil, fmt.Errorf("%s: %w", ErrCreatePolicyVersion, c.Error(resp))
   243  	}
   244  
   245  	return &result, nil
   246  }
   247  
   248  func (c *cloudlets) DeletePolicyVersion(ctx context.Context, params DeletePolicyVersionRequest) error {
   249  	logger := c.Log(ctx)
   250  	logger.Debug("DeletePolicyVersion")
   251  
   252  	if err := params.Validate(); err != nil {
   253  		return fmt.Errorf("%s: %w:\n%s", ErrDeletePolicyVersion, ErrStructValidation, err)
   254  	}
   255  
   256  	uri := fmt.Sprintf("/cloudlets/v3/policies/%d/versions/%d", params.PolicyID, params.PolicyVersion)
   257  
   258  	req, err := http.NewRequestWithContext(ctx, http.MethodDelete, uri, nil)
   259  	if err != nil {
   260  		return fmt.Errorf("%w: failed to create request: %s", ErrDeletePolicyVersion, err)
   261  	}
   262  
   263  	resp, err := c.Exec(req, nil)
   264  	if err != nil {
   265  		return fmt.Errorf("%w: request failed: %s", ErrDeletePolicyVersion, err)
   266  	}
   267  
   268  	if resp.StatusCode != http.StatusNoContent {
   269  		return fmt.Errorf("%s: %w", ErrDeletePolicyVersion, c.Error(resp))
   270  	}
   271  
   272  	return nil
   273  }
   274  
   275  func (c *cloudlets) UpdatePolicyVersion(ctx context.Context, params UpdatePolicyVersionRequest) (*PolicyVersion, error) {
   276  	logger := c.Log(ctx)
   277  	logger.Debug("UpdatePolicyVersion")
   278  
   279  	if err := params.Validate(); err != nil {
   280  		return nil, fmt.Errorf("%s: %w:\n%s", ErrUpdatePolicyVersion, ErrStructValidation, err)
   281  	}
   282  
   283  	uri := fmt.Sprintf("/cloudlets/v3/policies/%d/versions/%d", params.PolicyID, params.PolicyVersion)
   284  
   285  	req, err := http.NewRequestWithContext(ctx, http.MethodPut, uri, nil)
   286  	if err != nil {
   287  		return nil, fmt.Errorf("%w: failed to create request: %s", ErrUpdatePolicyVersion, err)
   288  	}
   289  
   290  	var result PolicyVersion
   291  
   292  	resp, err := c.Exec(req, &result, params.UpdatePolicyVersion)
   293  	if err != nil {
   294  		return nil, fmt.Errorf("%w: request failed: %s", ErrUpdatePolicyVersion, err)
   295  	}
   296  
   297  	if resp.StatusCode != http.StatusOK {
   298  		return nil, fmt.Errorf("%s: %w", ErrUpdatePolicyVersion, c.Error(resp))
   299  	}
   300  
   301  	return &result, nil
   302  }