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

     1  package imaging
     2  
     3  import (
     4  	"context"
     5  	"errors"
     6  	"fmt"
     7  	"net/http"
     8  	"net/url"
     9  
    10  	"github.com/akamai/AkamaiOPEN-edgegrid-golang/v8/pkg/edgegriderr"
    11  
    12  	validation "github.com/go-ozzo/ozzo-validation/v4"
    13  )
    14  
    15  type (
    16  	// PolicySets is an Image and Video Manager API interface for PolicySets
    17  	//
    18  	// See: https://techdocs.akamai.com/ivm/reference/api
    19  	PolicySets interface {
    20  		// ListPolicySets lists all PolicySets of specified type for the current account
    21  		ListPolicySets(context.Context, ListPolicySetsRequest) ([]PolicySet, error)
    22  
    23  		// GetPolicySet gets specific PolicySet by PolicySetID
    24  		GetPolicySet(context.Context, GetPolicySetRequest) (*PolicySet, error)
    25  
    26  		// CreatePolicySet creates configuration for an PolicySet
    27  		CreatePolicySet(context.Context, CreatePolicySetRequest) (*PolicySet, error)
    28  
    29  		// UpdatePolicySet creates configuration for an PolicySet
    30  		UpdatePolicySet(context.Context, UpdatePolicySetRequest) (*PolicySet, error)
    31  
    32  		// DeletePolicySet deletes configuration for an PolicySet
    33  		DeletePolicySet(context.Context, DeletePolicySetRequest) error
    34  	}
    35  
    36  	// ListPolicySetsRequest describes the parameters of the ListPolicySets request
    37  	ListPolicySetsRequest struct {
    38  		ContractID string
    39  		Network    Network
    40  	}
    41  
    42  	// GetPolicySetRequest describes the parameters of the get GetPolicySet request
    43  	GetPolicySetRequest struct {
    44  		PolicySetID string
    45  		ContractID  string
    46  		Network     Network
    47  	}
    48  
    49  	// CreatePolicySet describes the body of the CreatePolicySet request
    50  	CreatePolicySet struct {
    51  		Name          string      `json:"name"`
    52  		Region        Region      `json:"region"`
    53  		Type          MediaType   `json:"type"`
    54  		DefaultPolicy PolicyInput `json:"defaultPolicy,omitempty"`
    55  	}
    56  
    57  	// CreatePolicySetRequest describes the parameters of the CreatePolicySet request
    58  	CreatePolicySetRequest struct {
    59  		ContractID string
    60  		CreatePolicySet
    61  	}
    62  
    63  	// UpdatePolicySet describes the body of the UpdatePolicySet request
    64  	UpdatePolicySet struct {
    65  		Name   string `json:"name"`
    66  		Region Region `json:"region"`
    67  	}
    68  
    69  	// UpdatePolicySetRequest describes the parameters of the UpdatePolicySet request
    70  	UpdatePolicySetRequest struct {
    71  		PolicySetID string
    72  		ContractID  string
    73  		UpdatePolicySet
    74  	}
    75  
    76  	// PolicySet is a response returned by CRU operations
    77  	PolicySet struct {
    78  		ID           string   `json:"id"`
    79  		Name         string   `json:"name"`
    80  		Region       Region   `json:"region"`
    81  		Type         string   `json:"type"`
    82  		User         string   `json:"user"`
    83  		Properties   []string `json:"properties"`
    84  		LastModified string   `json:"lastModified"`
    85  	}
    86  
    87  	// DeletePolicySetRequest describes the parameters of the delete PolicySet request
    88  	DeletePolicySetRequest struct {
    89  		PolicySetID string
    90  		ContractID  string
    91  	}
    92  
    93  	// MediaType of media this Policy Set manages
    94  	MediaType string
    95  
    96  	// Network represents the network where policy set is stored
    97  	Network string
    98  
    99  	// Region represents the geographic region which media using this Policy Set is optimized for
   100  	Region string
   101  )
   102  
   103  const (
   104  	// RegionUS represents US region
   105  	RegionUS Region = "US"
   106  	// RegionEMEA represents EMEA region
   107  	RegionEMEA Region = "EMEA"
   108  	// RegionAsia represents Asia region
   109  	RegionAsia Region = "ASIA"
   110  	// RegionAustralia represents Australia region
   111  	RegionAustralia Region = "AUSTRALIA"
   112  	// RegionJapan represents Japan  region
   113  	RegionJapan Region = "JAPAN"
   114  	// RegionChina represents China region
   115  	RegionChina Region = "CHINA"
   116  )
   117  
   118  const (
   119  	// TypeImage represents policy set for Images
   120  	TypeImage MediaType = "IMAGE"
   121  	// TypeVideo represents policy set for Videos
   122  	TypeVideo MediaType = "VIDEO"
   123  )
   124  
   125  const (
   126  	// NetworkStaging represents staging network
   127  	NetworkStaging Network = "staging"
   128  	// NetworkProduction represents production network
   129  	NetworkProduction Network = "production"
   130  	// NetworkBoth represent both staging and production network at the same time
   131  	NetworkBoth Network = ""
   132  )
   133  
   134  var (
   135  	// ErrListPolicySets is returned when ListPolicySets fails
   136  	ErrListPolicySets = errors.New("list policy sets")
   137  	// ErrGetPolicySet is returned when GetPolicySet fails
   138  	ErrGetPolicySet = errors.New("get policy set")
   139  	// ErrCreatePolicySet is returned when CreatePolicySet fails
   140  	ErrCreatePolicySet = errors.New("create policy set")
   141  	// ErrUpdatePolicySet is returned when UpdatePolicySet fails
   142  	ErrUpdatePolicySet = errors.New("update policy set")
   143  	// ErrDeletePolicySet is returned when DeletePolicySet fails
   144  	ErrDeletePolicySet = errors.New("delete policy set")
   145  )
   146  
   147  // Validate validates ListPolicySetsRequest
   148  func (v ListPolicySetsRequest) Validate() error {
   149  	errs := validation.Errors{
   150  		"ContractID": validation.Validate(v.ContractID, validation.Required),
   151  		"Network": validation.Validate(v.Network, validation.In(NetworkStaging, NetworkProduction, NetworkBoth).
   152  			Error(fmt.Sprintf("network has to be '%s', '%s' or empty for both networks at the same time", NetworkStaging, NetworkProduction))),
   153  	}
   154  	return edgegriderr.ParseValidationErrors(errs)
   155  }
   156  
   157  // Validate validates GetPolicySetRequest
   158  func (v GetPolicySetRequest) Validate() error {
   159  	errs := validation.Errors{
   160  		"PolicySetID": validation.Validate(v.PolicySetID, validation.Required),
   161  		"ContractID":  validation.Validate(v.ContractID, validation.Required),
   162  		"Network": validation.Validate(v.Network, validation.In(NetworkStaging, NetworkProduction, NetworkBoth).
   163  			Error(fmt.Sprintf("network has to be '%s', '%s' or empty for both networks at the same time", NetworkStaging, NetworkProduction))),
   164  	}
   165  	return edgegriderr.ParseValidationErrors(errs)
   166  }
   167  
   168  // Validate validates CreatePolicySetRequest
   169  func (v CreatePolicySetRequest) Validate() error {
   170  	errs := validation.Errors{
   171  		"ContractID": validation.Validate(v.ContractID, validation.Required),
   172  		"Name":       validation.Validate(v.Name, validation.Required),
   173  		"Region": validation.Validate(v.Region, validation.Required, validation.In(RegionUS, RegionEMEA, RegionAsia, RegionAustralia, RegionJapan, RegionChina).Error(
   174  			fmt.Sprintf("value '%s' is invalid. Must be one of: '%s', '%s', '%s', '%s', '%s', '%s'", v.Region, RegionUS, RegionEMEA, RegionAsia, RegionAustralia, RegionJapan, RegionChina))),
   175  		"Type": validation.Validate(v.Type, validation.Required, validation.In(TypeImage, TypeVideo).Error(
   176  			fmt.Sprintf("value '%s' is invalid. Must be one of: '%s', '%s'", v.Type, TypeImage, TypeVideo))),
   177  		"DefaultPolicy": validation.Validate(v.DefaultPolicy),
   178  	}
   179  	return edgegriderr.ParseValidationErrors(errs)
   180  }
   181  
   182  // Validate validates UpdatePolicySetRequest
   183  func (v UpdatePolicySetRequest) Validate() error {
   184  	errs := validation.Errors{
   185  		"ContractID": validation.Validate(v.ContractID, validation.Required),
   186  		"Name":       validation.Validate(v.Name, validation.Required),
   187  		"Region": validation.Validate(v.Region, validation.Required, validation.In(RegionUS, RegionEMEA, RegionAsia, RegionAustralia, RegionJapan, RegionChina).Error(
   188  			fmt.Sprintf("value '%s' is invalid. Must be one of: '%s', '%s', '%s', '%s', '%s', '%s'", v.Region, RegionUS, RegionEMEA, RegionAsia, RegionAustralia, RegionJapan, RegionChina))),
   189  	}
   190  	return edgegriderr.ParseValidationErrors(errs)
   191  }
   192  
   193  // Validate validates DeletePolicySetRequest
   194  func (v DeletePolicySetRequest) Validate() error {
   195  	errs := validation.Errors{
   196  		"PolicySetID": validation.Validate(v.PolicySetID, validation.Required),
   197  		"ContractID":  validation.Validate(v.ContractID, validation.Required),
   198  	}
   199  	return edgegriderr.ParseValidationErrors(errs)
   200  }
   201  
   202  func (i *imaging) ListPolicySets(ctx context.Context, params ListPolicySetsRequest) ([]PolicySet, error) {
   203  	logger := i.Log(ctx)
   204  	logger.Debug("ListPolicySets")
   205  
   206  	if err := params.Validate(); err != nil {
   207  		return nil, fmt.Errorf("%s: %w:\n%s", ErrListPolicySets, ErrStructValidation, err)
   208  	}
   209  
   210  	var uri *url.URL
   211  	var err error
   212  	if params.Network != NetworkBoth {
   213  		uri, err = url.Parse(fmt.Sprintf("/imaging/v2/network/%s/policysets/", params.Network))
   214  	} else {
   215  		uri, err = url.Parse("/imaging/v2/policysets/")
   216  	}
   217  	if err != nil {
   218  		return nil, fmt.Errorf("%w: failed to parse url: %s", ErrListPolicySets, err)
   219  	}
   220  
   221  	req, err := http.NewRequestWithContext(ctx, http.MethodGet, uri.String(), nil)
   222  	if err != nil {
   223  		return nil, fmt.Errorf("%w: failed to create request: %s", ErrListPolicySets, err)
   224  	}
   225  
   226  	req.Header.Set("Contract", params.ContractID)
   227  
   228  	var result []PolicySet
   229  	resp, err := i.Exec(req, &result)
   230  	if err != nil {
   231  		return nil, fmt.Errorf("%w: request failed: %s", ErrListPolicySets, err)
   232  	}
   233  
   234  	if resp.StatusCode != http.StatusOK {
   235  		return nil, fmt.Errorf("%s: %w", ErrListPolicySets, i.Error(resp))
   236  	}
   237  
   238  	return result, nil
   239  }
   240  
   241  func (i *imaging) GetPolicySet(ctx context.Context, params GetPolicySetRequest) (*PolicySet, error) {
   242  	logger := i.Log(ctx)
   243  	logger.Debug("GetPolicySet")
   244  
   245  	if err := params.Validate(); err != nil {
   246  		return nil, fmt.Errorf("%s: %w:\n%s", ErrGetPolicySet, ErrStructValidation, err)
   247  	}
   248  
   249  	var uri *url.URL
   250  	var err error
   251  	if params.Network != NetworkBoth {
   252  		uri, err = url.Parse(fmt.Sprintf("/imaging/v2/network/%s/policysets/%s", params.Network, params.PolicySetID))
   253  	} else {
   254  		uri, err = url.Parse(fmt.Sprintf("/imaging/v2/policysets/%s", params.PolicySetID))
   255  	}
   256  	if err != nil {
   257  		return nil, fmt.Errorf("%w: failed to parse url: %s", ErrGetPolicySet, err)
   258  	}
   259  
   260  	req, err := http.NewRequestWithContext(ctx, http.MethodGet, uri.String(), nil)
   261  	if err != nil {
   262  		return nil, fmt.Errorf("%w: failed to create request: %s", ErrGetPolicySet, err)
   263  	}
   264  
   265  	req.Header.Set("Contract", params.ContractID)
   266  
   267  	var result PolicySet
   268  	resp, err := i.Exec(req, &result)
   269  	if err != nil {
   270  		return nil, fmt.Errorf("%w: request failed: %s", ErrGetPolicySet, err)
   271  	}
   272  
   273  	if resp.StatusCode != http.StatusOK {
   274  		return nil, fmt.Errorf("%s: %w", ErrGetPolicySet, i.Error(resp))
   275  	}
   276  
   277  	return &result, nil
   278  }
   279  
   280  func (i *imaging) CreatePolicySet(ctx context.Context, params CreatePolicySetRequest) (*PolicySet, error) {
   281  	logger := i.Log(ctx)
   282  	logger.Debug("CreatePolicySet")
   283  
   284  	if err := params.Validate(); err != nil {
   285  		return nil, fmt.Errorf("%s: %w:\n%s", ErrCreatePolicySet, ErrStructValidation, err)
   286  	}
   287  
   288  	uri := "/imaging/v2/policysets/"
   289  	req, err := http.NewRequestWithContext(ctx, http.MethodPost, uri, nil)
   290  	if err != nil {
   291  		return nil, fmt.Errorf("%w: failed to create request: %s", ErrCreatePolicySet, err)
   292  	}
   293  
   294  	req.Header.Set("Contract", params.ContractID)
   295  
   296  	var result PolicySet
   297  	resp, err := i.Exec(req, &result, params.CreatePolicySet)
   298  	if err != nil {
   299  		return nil, fmt.Errorf("%w: request failed: %s", ErrCreatePolicySet, err)
   300  	}
   301  
   302  	if resp.StatusCode != http.StatusCreated {
   303  		return nil, fmt.Errorf("%s: %w", ErrCreatePolicySet, i.Error(resp))
   304  	}
   305  
   306  	return &result, nil
   307  }
   308  
   309  func (i *imaging) UpdatePolicySet(ctx context.Context, params UpdatePolicySetRequest) (*PolicySet, error) {
   310  	logger := i.Log(ctx)
   311  	logger.Debug("UpdatePolicySet")
   312  
   313  	if err := params.Validate(); err != nil {
   314  		return nil, fmt.Errorf("%s: %w:\n%s", ErrUpdatePolicySet, ErrStructValidation, err)
   315  	}
   316  
   317  	uri, err := url.Parse(fmt.Sprintf("/imaging/v2/policysets/%s", params.PolicySetID))
   318  	if err != nil {
   319  		return nil, fmt.Errorf("%w: failed to parse url: %s", ErrUpdatePolicySet, err)
   320  	}
   321  
   322  	req, err := http.NewRequestWithContext(ctx, http.MethodPut, uri.String(), nil)
   323  	if err != nil {
   324  		return nil, fmt.Errorf("%w: failed to create request: %s", ErrUpdatePolicySet, err)
   325  	}
   326  
   327  	req.Header.Set("Contract", params.ContractID)
   328  
   329  	var result PolicySet
   330  
   331  	resp, err := i.Exec(req, &result, params.UpdatePolicySet)
   332  	if err != nil {
   333  		return nil, fmt.Errorf("%w: request failed: %s", ErrUpdatePolicySet, err)
   334  	}
   335  
   336  	if resp.StatusCode != http.StatusOK {
   337  		return nil, fmt.Errorf("%s: %w", ErrUpdatePolicySet, i.Error(resp))
   338  	}
   339  
   340  	return &result, nil
   341  }
   342  
   343  func (i *imaging) DeletePolicySet(ctx context.Context, params DeletePolicySetRequest) error {
   344  	logger := i.Log(ctx)
   345  	logger.Debug("DeletePolicySet")
   346  
   347  	if err := params.Validate(); err != nil {
   348  		return fmt.Errorf("%s: %w:\n%s", ErrDeletePolicySet, ErrStructValidation, err)
   349  	}
   350  
   351  	uri, err := url.Parse(fmt.Sprintf("/imaging/v2/policysets/%s", params.PolicySetID))
   352  	if err != nil {
   353  		return fmt.Errorf("%w: failed to parse url: %s", ErrDeletePolicySet, err)
   354  	}
   355  
   356  	req, err := http.NewRequestWithContext(ctx, http.MethodDelete, uri.String(), nil)
   357  	if err != nil {
   358  		return fmt.Errorf("%w: failed to create request: %s", ErrDeletePolicySet, err)
   359  	}
   360  
   361  	req.Header.Set("Contract", params.ContractID)
   362  
   363  	resp, err := i.Exec(req, nil)
   364  	if err != nil {
   365  		return fmt.Errorf("%w: request failed: %s", ErrDeletePolicySet, err)
   366  	}
   367  
   368  	if resp.StatusCode != http.StatusNoContent {
   369  		return fmt.Errorf("%s: %w", ErrDeletePolicySet, i.Error(resp))
   370  	}
   371  
   372  	return nil
   373  }