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

     1  package appsec
     2  
     3  import (
     4  	"context"
     5  	"fmt"
     6  	"net/http"
     7  
     8  	validation "github.com/go-ozzo/ozzo-validation/v4"
     9  )
    10  
    11  type (
    12  	// The RatePolicyAction interface supports retrieving and modifying the action associated with
    13  	// a specified rate policy, or with all rate policies in a security policy.
    14  	RatePolicyAction interface {
    15  		// GetRatePolicyActions returns a list of all rate policies currently in use with the actions each policy takes when conditions are met.
    16  		//
    17  		// See: https://techdocs.akamai.com/application-security/reference/get-rate-policies-actions
    18  		GetRatePolicyActions(ctx context.Context, params GetRatePolicyActionsRequest) (*GetRatePolicyActionsResponse, error)
    19  
    20  		// GetRatePolicyAction returns a specified rate policy currently in use with the action.
    21  		//
    22  		// See: https://techdocs.akamai.com/application-security/reference/get-rate-policies-actions
    23  		// Deprecated: this method will be removed in a future release. Use GetRatePolicyActions instead.
    24  		GetRatePolicyAction(ctx context.Context, params GetRatePolicyActionRequest) (*GetRatePolicyActionResponse, error)
    25  
    26  		// UpdateRatePolicyAction
    27  		//
    28  		// See: https://techdocs.akamai.com/application-security/reference/put-rate-policy-action
    29  		UpdateRatePolicyAction(ctx context.Context, params UpdateRatePolicyActionRequest) (*UpdateRatePolicyActionResponse, error)
    30  	}
    31  
    32  	// GetRatePolicyActionsRequest is used to retrieve a configuration's rate policies and their associated actions.
    33  	GetRatePolicyActionsRequest struct {
    34  		ConfigID     int    `json:"configId"`
    35  		Version      int    `json:"version"`
    36  		PolicyID     string `json:"policyId"`
    37  		RatePolicyID int    `json:"id"`
    38  		Ipv4Action   string `json:"ipv4Action"`
    39  		Ipv6Action   string `json:"ipv6Action"`
    40  	}
    41  
    42  	// GetRatePolicyActionsResponse is returned from a call to GetRatePolicyActions.
    43  	GetRatePolicyActionsResponse struct {
    44  		RatePolicyActions []struct {
    45  			ID         int    `json:"id"`
    46  			Ipv4Action string `json:"ipv4Action,omitempty"`
    47  			Ipv6Action string `json:"ipv6Action,omitempty"`
    48  		} `json:"ratePolicyActions,omitempty"`
    49  	}
    50  
    51  	// GetRatePolicyActionRequest is used to retrieve a configuration's rate policies and their associated actions.
    52  	// Deprecated: this struct will be removed in a future release.
    53  	GetRatePolicyActionRequest struct {
    54  		ConfigID   int    `json:"configId"`
    55  		Version    int    `json:"version"`
    56  		PolicyID   string `json:"policyId"`
    57  		ID         int    `json:"id"`
    58  		Ipv4Action string `json:"ipv4Action"`
    59  		Ipv6Action string `json:"ipv6Action"`
    60  	}
    61  
    62  	// GetRatePolicyActionResponse is returned from a call to GetRatePolicyAction.
    63  	// Deprecated: this struct will be removed in a future release.
    64  	GetRatePolicyActionResponse struct {
    65  		RatePolicyActions []struct {
    66  			ID         int    `json:"id"`
    67  			Ipv4Action string `json:"ipv4Action,omitempty"`
    68  			Ipv6Action string `json:"ipv6Action,omitempty"`
    69  		} `json:"ratePolicyActions"`
    70  	}
    71  
    72  	// UpdateRatePolicyActionRequest is used to update the actions for a rate policy.
    73  	UpdateRatePolicyActionRequest struct {
    74  		ConfigID     int    `json:"-"`
    75  		Version      int    `json:"-"`
    76  		PolicyID     string `json:"-"`
    77  		RatePolicyID int    `json:"-"`
    78  		Ipv4Action   string `json:"ipv4Action"`
    79  		Ipv6Action   string `json:"ipv6Action"`
    80  	}
    81  
    82  	// UpdateRatePolicyActionResponse is returned from a call to UpdateRatePolicy.
    83  	UpdateRatePolicyActionResponse struct {
    84  		ID         int    `json:"id"`
    85  		Ipv4Action string `json:"ipv4Action"`
    86  		Ipv6Action string `json:"ipv6Action"`
    87  	}
    88  
    89  	// RatePolicyActionPost is used to describe actions that may be taken as part of a rate policy.
    90  	RatePolicyActionPost struct {
    91  		ID         int    `json:"id"`
    92  		Ipv4Action string `json:"ipv4Action"`
    93  		Ipv6Action string `json:"ipv6Action"`
    94  	}
    95  )
    96  
    97  // Validate validates a GetRatePolicyActionRequest.
    98  // Deprecated: this method will be removed in a future release.
    99  func (v GetRatePolicyActionRequest) Validate() error {
   100  	return validation.Errors{
   101  		"ConfigID": validation.Validate(v.ConfigID, validation.Required),
   102  		"Version":  validation.Validate(v.Version, validation.Required),
   103  		"PolicyID": validation.Validate(v.PolicyID, validation.Required),
   104  	}.Filter()
   105  }
   106  
   107  // Validate validates a GetRatePolicyActionsRequest.
   108  func (v GetRatePolicyActionsRequest) Validate() error {
   109  	return validation.Errors{
   110  		"ConfigID": validation.Validate(v.ConfigID, validation.Required),
   111  		"Version":  validation.Validate(v.Version, validation.Required),
   112  		"PolicyID": validation.Validate(v.PolicyID, validation.Required),
   113  	}.Filter()
   114  }
   115  
   116  // Validate validates an UpdateRatePolicyActionRequest.
   117  func (v UpdateRatePolicyActionRequest) Validate() error {
   118  	return validation.Errors{
   119  		"ConfigID":     validation.Validate(v.ConfigID, validation.Required),
   120  		"Version":      validation.Validate(v.Version, validation.Required),
   121  		"PolicyID":     validation.Validate(v.PolicyID, validation.Required),
   122  		"RatePolicyID": validation.Validate(v.RatePolicyID, validation.Required),
   123  	}.Filter()
   124  }
   125  
   126  // Deprecated: this method will be removed in a future release.
   127  func (p *appsec) GetRatePolicyAction(ctx context.Context, params GetRatePolicyActionRequest) (*GetRatePolicyActionResponse, error) {
   128  	logger := p.Log(ctx)
   129  	logger.Debug("GetRatePolicyAction")
   130  
   131  	if err := params.Validate(); err != nil {
   132  		return nil, fmt.Errorf("%w: %s", ErrStructValidation, err.Error())
   133  	}
   134  
   135  	uri := fmt.Sprintf(
   136  		"/appsec/v1/configs/%d/versions/%d/security-policies/%s/rate-policies",
   137  		params.ConfigID,
   138  		params.Version,
   139  		params.PolicyID)
   140  
   141  	req, err := http.NewRequestWithContext(ctx, http.MethodGet, uri, nil)
   142  	if err != nil {
   143  		return nil, fmt.Errorf("failed to create GetRatePolicyAction request: %w", err)
   144  	}
   145  
   146  	var result GetRatePolicyActionResponse
   147  	resp, err := p.Exec(req, &result)
   148  	if err != nil {
   149  		return nil, fmt.Errorf("get rate policy action request failed: %w", err)
   150  	}
   151  	if resp.StatusCode != http.StatusOK {
   152  		return nil, p.Error(resp)
   153  	}
   154  
   155  	return &result, nil
   156  }
   157  
   158  func (p *appsec) GetRatePolicyActions(ctx context.Context, params GetRatePolicyActionsRequest) (*GetRatePolicyActionsResponse, error) {
   159  	logger := p.Log(ctx)
   160  	logger.Debug("GetRatePolicyActions")
   161  
   162  	if err := params.Validate(); err != nil {
   163  		return nil, fmt.Errorf("%w: %s", ErrStructValidation, err.Error())
   164  	}
   165  
   166  	uri := fmt.Sprintf(
   167  		"/appsec/v1/configs/%d/versions/%d/security-policies/%s/rate-policies",
   168  		params.ConfigID,
   169  		params.Version,
   170  		params.PolicyID)
   171  
   172  	req, err := http.NewRequestWithContext(ctx, http.MethodGet, uri, nil)
   173  	if err != nil {
   174  		return nil, fmt.Errorf("failed to create GetRatePolicyActions request: %w", err)
   175  	}
   176  
   177  	var result GetRatePolicyActionsResponse
   178  	resp, err := p.Exec(req, &result)
   179  	if err != nil {
   180  		return nil, fmt.Errorf("get rate policy actions request failed: %w", err)
   181  	}
   182  	if resp.StatusCode != http.StatusOK {
   183  		return nil, p.Error(resp)
   184  	}
   185  
   186  	if params.RatePolicyID != 0 {
   187  		var filteredResult GetRatePolicyActionsResponse
   188  		for _, val := range result.RatePolicyActions {
   189  			if val.ID == params.RatePolicyID {
   190  				filteredResult.RatePolicyActions = append(filteredResult.RatePolicyActions, val)
   191  			}
   192  		}
   193  		return &filteredResult, nil
   194  	}
   195  
   196  	return &result, nil
   197  }
   198  
   199  func (p *appsec) UpdateRatePolicyAction(ctx context.Context, params UpdateRatePolicyActionRequest) (*UpdateRatePolicyActionResponse, error) {
   200  	logger := p.Log(ctx)
   201  	logger.Debug("UpdateRatePolicyAction")
   202  
   203  	if err := params.Validate(); err != nil {
   204  		return nil, fmt.Errorf("%w: %s", ErrStructValidation, err.Error())
   205  	}
   206  
   207  	uri := fmt.Sprintf(
   208  		"/appsec/v1/configs/%d/versions/%d/security-policies/%s/rate-policies/%d",
   209  		params.ConfigID,
   210  		params.Version,
   211  		params.PolicyID,
   212  		params.RatePolicyID,
   213  	)
   214  
   215  	req, err := http.NewRequestWithContext(ctx, http.MethodPut, uri, nil)
   216  	if err != nil {
   217  		return nil, fmt.Errorf("failed to create UpdateRatePolicyAction request: %w", err)
   218  	}
   219  
   220  	var result UpdateRatePolicyActionResponse
   221  	resp, err := p.Exec(req, &result, params)
   222  	if err != nil {
   223  		return nil, fmt.Errorf("update rate policy action request failed: %w", err)
   224  	}
   225  	if resp.StatusCode != http.StatusOK && resp.StatusCode != http.StatusCreated {
   226  		return nil, p.Error(resp)
   227  	}
   228  
   229  	return &result, nil
   230  }