github.com/akamai/AkamaiOPEN-edgegrid-golang/v2@v2.17.0/pkg/appsec/api_request_constraints.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 ApiRequestConstraints interface supports retrieving, modifying, or removing the action
    13  	// taken when any API request constraint is triggered, or when a specific API request constraint
    14  	// is triggered.
    15  	//
    16  	// https://developer.akamai.com/api/cloud_security/application_security/v1.html#apirequestconstraintsgroup
    17  	ApiRequestConstraints interface {
    18  		// https://developer.akamai.com/api/cloud_security/application_security/v1.html#getapirequestconstraints
    19  		GetApiRequestConstraints(ctx context.Context, params GetApiRequestConstraintsRequest) (*GetApiRequestConstraintsResponse, error)
    20  
    21  		// https://developer.akamai.com/api/cloud_security/application_security/v1.html#putapirequestconstraints
    22  		// https://developer.akamai.com/api/cloud_security/application_security/v1.html#putactionsperapi
    23  		UpdateApiRequestConstraints(ctx context.Context, params UpdateApiRequestConstraintsRequest) (*UpdateApiRequestConstraintsResponse, error)
    24  
    25  		// https://developer.akamai.com/api/cloud_security/application_security/v1.html#putapirequestconstraints
    26  		// https://developer.akamai.com/api/cloud_security/application_security/v1.html#putactionsperapi
    27  		RemoveApiRequestConstraints(ctx context.Context, params RemoveApiRequestConstraintsRequest) (*RemoveApiRequestConstraintsResponse, error)
    28  	}
    29  
    30  	// GetApiRequestConstraintsRequest is used to retrieve the list of APIs with their constraints and associated actions.
    31  	GetApiRequestConstraintsRequest struct {
    32  		ConfigID int    `json:"-"`
    33  		Version  int    `json:"-"`
    34  		PolicyID string `json:"-"`
    35  		ApiID    int    `json:"-"`
    36  	}
    37  
    38  	// GetApiRequestConstraintsResponse is returned from a call to GetApiRequestConstraints.
    39  	GetApiRequestConstraintsResponse struct {
    40  		APIEndpoints []ApiEndpoint `json:"apiEndpoints,omitempty"`
    41  	}
    42  
    43  	// ApiEndpoint describes an API endpoint and its associated action.
    44  	ApiEndpoint struct {
    45  		ID     int    `json:"id"`
    46  		Action string `json:"action"`
    47  	}
    48  
    49  	// UpdateApiRequestConstraintsRequest is used to modify the action taken when an API request contraint is triggered.
    50  	UpdateApiRequestConstraintsRequest struct {
    51  		ConfigID int    `json:"-"`
    52  		Version  int    `json:"-"`
    53  		PolicyID string `json:"-"`
    54  		ApiID    int    `json:"-"`
    55  		Action   string `json:"action"`
    56  	}
    57  
    58  	// UpdateApiRequestConstraintsResponse is returned from a call to UpdateApiRequestConstraints.
    59  	UpdateApiRequestConstraintsResponse struct {
    60  		Action string `json:"action"`
    61  	}
    62  
    63  	// RemoveApiRequestConstraintsRequest is used to remove an API request constraint's action.
    64  	RemoveApiRequestConstraintsRequest struct {
    65  		ConfigID int    `json:"-"`
    66  		Version  int    `json:"-"`
    67  		PolicyID string `json:"-"`
    68  		ApiID    int    `json:"-"`
    69  		Action   string `json:"action"`
    70  	}
    71  
    72  	// RemoveApiRequestConstraintsResponse is returned from a call to RemoveApiRequestConstraints.
    73  	RemoveApiRequestConstraintsResponse struct {
    74  		Action string `json:"action"`
    75  	}
    76  )
    77  
    78  // Validate validates a GetApiRequestConstraintsRequest.
    79  func (v GetApiRequestConstraintsRequest) Validate() error {
    80  	return validation.Errors{
    81  		"ConfigID": validation.Validate(v.ConfigID, validation.Required),
    82  		"Version":  validation.Validate(v.Version, validation.Required),
    83  		"PolicyID": validation.Validate(v.PolicyID, validation.Required),
    84  	}.Filter()
    85  }
    86  
    87  // Validate validates an UpdateApiRequestConstraintsRequest.
    88  func (v UpdateApiRequestConstraintsRequest) Validate() error {
    89  	return validation.Errors{
    90  		"ConfigID": validation.Validate(v.ConfigID, validation.Required),
    91  		"Version":  validation.Validate(v.Version, validation.Required),
    92  		"PolicyID": validation.Validate(v.PolicyID, validation.Required),
    93  	}.Filter()
    94  }
    95  
    96  // Validate validates a RemoveApiRequestConstraintsRequest.
    97  func (v RemoveApiRequestConstraintsRequest) Validate() error {
    98  	return validation.Errors{
    99  		"ConfigID": validation.Validate(v.ConfigID, validation.Required),
   100  		"Version":  validation.Validate(v.Version, validation.Required),
   101  		"PolicyID": validation.Validate(v.PolicyID, validation.Required),
   102  	}.Filter()
   103  }
   104  
   105  func (p *appsec) GetApiRequestConstraints(ctx context.Context, params GetApiRequestConstraintsRequest) (*GetApiRequestConstraintsResponse, error) {
   106  	logger := p.Log(ctx)
   107  	logger.Debug("GetApiRequestConstraints")
   108  
   109  	if err := params.Validate(); err != nil {
   110  		return nil, fmt.Errorf("%w: %s", ErrStructValidation, err.Error())
   111  	}
   112  
   113  	uri := fmt.Sprintf(
   114  		"/appsec/v1/configs/%d/versions/%d/security-policies/%s/api-request-constraints",
   115  		params.ConfigID,
   116  		params.Version,
   117  		params.PolicyID)
   118  
   119  	req, err := http.NewRequestWithContext(ctx, http.MethodGet, uri, nil)
   120  	if err != nil {
   121  		return nil, fmt.Errorf("failed to create GetApiRequestConstraints request: %w", err)
   122  	}
   123  
   124  	var result GetApiRequestConstraintsResponse
   125  	resp, err := p.Exec(req, &result)
   126  	if err != nil {
   127  		return nil, fmt.Errorf("get API request constraints request failed: %w", err)
   128  	}
   129  	if resp.StatusCode != http.StatusOK {
   130  		return nil, p.Error(resp)
   131  	}
   132  
   133  	if params.ApiID != 0 {
   134  		var filteredResult GetApiRequestConstraintsResponse
   135  		for _, val := range result.APIEndpoints {
   136  			if val.ID == params.ApiID {
   137  				filteredResult.APIEndpoints = append(filteredResult.APIEndpoints, val)
   138  			}
   139  		}
   140  		return &filteredResult, nil
   141  	}
   142  
   143  	return &result, nil
   144  }
   145  
   146  func (p *appsec) UpdateApiRequestConstraints(ctx context.Context, params UpdateApiRequestConstraintsRequest) (*UpdateApiRequestConstraintsResponse, error) {
   147  	logger := p.Log(ctx)
   148  	logger.Debug("UpdateApiRequestConstraints")
   149  
   150  	if err := params.Validate(); err != nil {
   151  		return nil, fmt.Errorf("%w: %s", ErrStructValidation, err.Error())
   152  	}
   153  
   154  	var uri string
   155  	if params.ApiID != 0 {
   156  		uri = fmt.Sprintf(
   157  			"/appsec/v1/configs/%d/versions/%d/security-policies/%s/api-request-constraints/%d",
   158  			params.ConfigID,
   159  			params.Version,
   160  			params.PolicyID,
   161  			params.ApiID,
   162  		)
   163  	} else {
   164  		uri = fmt.Sprintf(
   165  			"/appsec/v1/configs/%d/versions/%d/security-policies/%s/api-request-constraints",
   166  			params.ConfigID,
   167  			params.Version,
   168  			params.PolicyID,
   169  		)
   170  	}
   171  
   172  	req, err := http.NewRequestWithContext(ctx, http.MethodPut, uri, nil)
   173  	if err != nil {
   174  		return nil, fmt.Errorf("failed to create UpdateApiRequestConstraints request: %w", err)
   175  	}
   176  
   177  	var result UpdateApiRequestConstraintsResponse
   178  	resp, err := p.Exec(req, &result, params)
   179  	if err != nil {
   180  		return nil, fmt.Errorf("update API request constraints request failed: %w", err)
   181  	}
   182  
   183  	if resp.StatusCode != http.StatusOK && resp.StatusCode != http.StatusCreated {
   184  		return nil, p.Error(resp)
   185  	}
   186  
   187  	return &result, nil
   188  }
   189  
   190  func (p *appsec) RemoveApiRequestConstraints(ctx context.Context, params RemoveApiRequestConstraintsRequest) (*RemoveApiRequestConstraintsResponse, error) {
   191  	logger := p.Log(ctx)
   192  	logger.Debug("RemoveApiRequestConstraints")
   193  
   194  	if err := params.Validate(); err != nil {
   195  		return nil, fmt.Errorf("%w: %s", ErrStructValidation, err.Error())
   196  	}
   197  
   198  	var uri string
   199  	if params.ApiID != 0 {
   200  		uri = fmt.Sprintf(
   201  			"/appsec/v1/configs/%d/versions/%d/security-policies/%s/api-request-constraints/%d",
   202  			params.ConfigID,
   203  			params.Version,
   204  			params.PolicyID,
   205  			params.ApiID,
   206  		)
   207  	} else {
   208  		uri = fmt.Sprintf(
   209  			"/appsec/v1/configs/%d/versions/%d/security-policies/%s/api-request-constraints",
   210  			params.ConfigID,
   211  			params.Version,
   212  			params.PolicyID,
   213  		)
   214  	}
   215  
   216  	req, err := http.NewRequestWithContext(ctx, http.MethodPut, uri, nil)
   217  	if err != nil {
   218  		return nil, fmt.Errorf("failed to create RemoveApiRequestConstraints request: %w", err)
   219  	}
   220  
   221  	var result RemoveApiRequestConstraintsResponse
   222  	resp, err := p.Exec(req, &result, params)
   223  	if err != nil {
   224  		return nil, fmt.Errorf("remove API request constraints request failed: %w", err)
   225  	}
   226  
   227  	if resp.StatusCode != http.StatusOK && resp.StatusCode != http.StatusCreated {
   228  		return nil, p.Error(resp)
   229  	}
   230  
   231  	return &result, nil
   232  }