github.com/akamai/AkamaiOPEN-edgegrid-golang/v2@v2.17.0/pkg/appsec/eval_rule.go (about)

     1  package appsec
     2  
     3  import (
     4  	"context"
     5  	"encoding/json"
     6  	"fmt"
     7  	"net/http"
     8  
     9  	validation "github.com/go-ozzo/ozzo-validation/v4"
    10  )
    11  
    12  type (
    13  	// The EvalRule interface supports retrieving and modifying the rules available for
    14  	// evaluation and their actions, or the action of a specific rule.
    15  	//
    16  	// https://developer.akamai.com/api/cloud_security/application_security/v1.html#evalrule
    17  	EvalRule interface {
    18  		// https://developer.akamai.com/api/cloud_security/application_security/v1.html#getevalrules
    19  		GetEvalRules(ctx context.Context, params GetEvalRulesRequest) (*GetEvalRulesResponse, error)
    20  
    21  		// https://developer.akamai.com/api/cloud_security/application_security/v1.html#getevalrule
    22  		GetEvalRule(ctx context.Context, params GetEvalRuleRequest) (*GetEvalRuleResponse, error)
    23  
    24  		// https://developer.akamai.com/api/cloud_security/application_security/v1.html#putevalrule
    25  		UpdateEvalRule(ctx context.Context, params UpdateEvalRuleRequest) (*UpdateEvalRuleResponse, error)
    26  	}
    27  
    28  	// GetEvalRulesRequest is used to retrieve the rules available for evaluation and their actions.
    29  	GetEvalRulesRequest struct {
    30  		ConfigID int    `json:"-"`
    31  		Version  int    `json:"-"`
    32  		PolicyID string `json:"-"`
    33  		RuleID   int    `json:"-"`
    34  	}
    35  
    36  	// GetEvalRulesResponse is returned from a call to GetEvalRules.
    37  	GetEvalRulesResponse struct {
    38  		Rules []struct {
    39  			ID                 int                     `json:"id,omitempty"`
    40  			Action             string                  `json:"action,omitempty"`
    41  			ConditionException *RuleConditionException `json:"conditionException,omitempty"`
    42  		} `json:"evalRuleActions,omitempty"`
    43  	}
    44  
    45  	// GetEvalRuleRequest is used to retrieve a rule available for evaluation and its action.
    46  	GetEvalRuleRequest struct {
    47  		ConfigID int    `json:"-"`
    48  		Version  int    `json:"-"`
    49  		PolicyID string `json:"-"`
    50  		RuleID   int    `json:"ruleId"`
    51  	}
    52  
    53  	// GetEvalRuleResponse is returned from a call to GetEvalRule.
    54  	GetEvalRuleResponse struct {
    55  		Action             string                  `json:"action,omitempty"`
    56  		ConditionException *RuleConditionException `json:"conditionException,omitempty"`
    57  	}
    58  
    59  	// UpdateEvalRuleRequest is used to modify a rule available for evaluation and its action.
    60  	UpdateEvalRuleRequest struct {
    61  		ConfigID       int             `json:"-"`
    62  		Version        int             `json:"-"`
    63  		PolicyID       string          `json:"-"`
    64  		RuleID         int             `json:"-"`
    65  		Action         string          `json:"action"`
    66  		JsonPayloadRaw json.RawMessage `json:"conditionException,omitempty"`
    67  	}
    68  
    69  	// UpdateEvalRuleResponse is returned from a call to UpdateEvalRule.
    70  	UpdateEvalRuleResponse struct {
    71  		Action             string                  `json:"action,omitempty"`
    72  		ConditionException *RuleConditionException `json:"conditionException,omitempty"`
    73  	}
    74  )
    75  
    76  // IsEmptyConditionException checks whether the ConditionException field is empty.
    77  func (r *GetEvalRuleResponse) IsEmptyConditionException() bool {
    78  	return r.ConditionException == nil
    79  }
    80  
    81  // Validate validates a GetEvalRuleRequest.
    82  func (v GetEvalRuleRequest) Validate() error {
    83  	return validation.Errors{
    84  		"ConfigID": validation.Validate(v.ConfigID, validation.Required),
    85  		"Version":  validation.Validate(v.Version, validation.Required),
    86  		"PolicyID": validation.Validate(v.PolicyID, validation.Required),
    87  		"RuleID":   validation.Validate(v.RuleID, validation.Required),
    88  	}.Filter()
    89  }
    90  
    91  // Validate validates a GetEvalRulesRequest.
    92  func (v GetEvalRulesRequest) Validate() error {
    93  	return validation.Errors{
    94  		"ConfigID": validation.Validate(v.ConfigID, validation.Required),
    95  		"Version":  validation.Validate(v.Version, validation.Required),
    96  		"PolicyID": validation.Validate(v.PolicyID, validation.Required),
    97  	}.Filter()
    98  }
    99  
   100  // Validate validates an UpdateEvalRuleRequest.
   101  func (v UpdateEvalRuleRequest) Validate() error {
   102  	return validation.Errors{
   103  		"ConfigID": validation.Validate(v.ConfigID, validation.Required),
   104  		"Version":  validation.Validate(v.Version, validation.Required),
   105  		"PolicyID": validation.Validate(v.PolicyID, validation.Required),
   106  		"RuleID":   validation.Validate(v.RuleID, validation.Required),
   107  	}.Filter()
   108  }
   109  
   110  func (p *appsec) GetEvalRule(ctx context.Context, params GetEvalRuleRequest) (*GetEvalRuleResponse, error) {
   111  	logger := p.Log(ctx)
   112  	logger.Debug("GetEvalRule")
   113  
   114  	if err := params.Validate(); err != nil {
   115  		return nil, fmt.Errorf("%w: %s", ErrStructValidation, err.Error())
   116  	}
   117  
   118  	uri := fmt.Sprintf(
   119  		"/appsec/v1/configs/%d/versions/%d/security-policies/%s/eval-rules/%d?includeConditionException=true",
   120  		params.ConfigID,
   121  		params.Version,
   122  		params.PolicyID,
   123  		params.RuleID)
   124  
   125  	req, err := http.NewRequestWithContext(ctx, http.MethodGet, uri, nil)
   126  	if err != nil {
   127  		return nil, fmt.Errorf("failed to create GetEvalRule request: %w", err)
   128  	}
   129  
   130  	var result GetEvalRuleResponse
   131  	resp, err := p.Exec(req, &result)
   132  	if err != nil {
   133  		return nil, fmt.Errorf("get eval rule request failed: %w", err)
   134  	}
   135  	if resp.StatusCode != http.StatusOK {
   136  		return nil, p.Error(resp)
   137  	}
   138  
   139  	return &result, nil
   140  }
   141  
   142  func (p *appsec) GetEvalRules(ctx context.Context, params GetEvalRulesRequest) (*GetEvalRulesResponse, error) {
   143  	logger := p.Log(ctx)
   144  	logger.Debug("GetEvalRules")
   145  
   146  	if err := params.Validate(); err != nil {
   147  		return nil, fmt.Errorf("%w: %s", ErrStructValidation, err.Error())
   148  	}
   149  
   150  	uri := fmt.Sprintf(
   151  		"/appsec/v1/configs/%d/versions/%d/security-policies/%s/eval-rules?includeConditionException=true",
   152  		params.ConfigID,
   153  		params.Version,
   154  		params.PolicyID)
   155  
   156  	req, err := http.NewRequestWithContext(ctx, http.MethodGet, uri, nil)
   157  	if err != nil {
   158  		return nil, fmt.Errorf("failed to create GetEvalRules request: %w", err)
   159  	}
   160  
   161  	var result GetEvalRulesResponse
   162  	resp, err := p.Exec(req, &result)
   163  	if err != nil {
   164  		return nil, fmt.Errorf("get eval rules request failed: %w", err)
   165  	}
   166  	if resp.StatusCode != http.StatusOK {
   167  		return nil, p.Error(resp)
   168  	}
   169  
   170  	if params.RuleID != 0 {
   171  		var filteredResult GetEvalRulesResponse
   172  		for _, val := range result.Rules {
   173  			if val.ID == params.RuleID {
   174  				filteredResult.Rules = append(filteredResult.Rules, val)
   175  			}
   176  		}
   177  		return &filteredResult, nil
   178  	}
   179  
   180  	return &result, nil
   181  }
   182  
   183  func (p *appsec) UpdateEvalRule(ctx context.Context, params UpdateEvalRuleRequest) (*UpdateEvalRuleResponse, error) {
   184  	logger := p.Log(ctx)
   185  	logger.Debug("UpdateEvalRule")
   186  
   187  	if err := params.Validate(); err != nil {
   188  		return nil, fmt.Errorf("%w: %s", ErrStructValidation, err.Error())
   189  	}
   190  
   191  	uri := fmt.Sprintf(
   192  		"/appsec/v1/configs/%d/versions/%d/security-policies/%s/eval-rules/%d/action-condition-exception",
   193  		params.ConfigID,
   194  		params.Version,
   195  		params.PolicyID,
   196  		params.RuleID,
   197  	)
   198  
   199  	req, err := http.NewRequestWithContext(ctx, http.MethodPut, uri, nil)
   200  	if err != nil {
   201  		return nil, fmt.Errorf("failed to create UpdateEvalRule request: %w", err)
   202  	}
   203  
   204  	var result UpdateEvalRuleResponse
   205  	req.Header.Set("Content-Type", "application/json")
   206  	resp, err := p.Exec(req, &result, params)
   207  	if err != nil {
   208  		return nil, fmt.Errorf("update eval rule request failed: %w", err)
   209  	}
   210  	if resp.StatusCode != http.StatusOK && resp.StatusCode != http.StatusCreated {
   211  		return nil, p.Error(resp)
   212  	}
   213  
   214  	return &result, nil
   215  }