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