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 }