github.com/akamai/AkamaiOPEN-edgegrid-golang/v8@v8.1.0/pkg/appsec/penalty_box_conditions.go (about) 1 package appsec 2 3 import ( 4 "context" 5 "fmt" 6 "net/http" 7 8 "github.com/akamai/AkamaiOPEN-edgegrid-golang/v8/pkg/edgegriderr" 9 validation "github.com/go-ozzo/ozzo-validation/v4" 10 ) 11 12 type ( 13 // PenaltyBoxConditions interface supports retrieving or modifying the penalty box conditions for 14 // a specified security policy 15 PenaltyBoxConditions interface { 16 // GetPenaltyBoxConditions retrieves the penalty box conditions 17 GetPenaltyBoxConditions(ctx context.Context, params GetPenaltyBoxConditionsRequest) (*GetPenaltyBoxConditionsResponse, error) 18 19 // UpdatePenaltyBoxConditions modifies the penalty box conditions for a security policy. 20 UpdatePenaltyBoxConditions(ctx context.Context, params UpdatePenaltyBoxConditionsRequest) (*UpdatePenaltyBoxConditionsResponse, error) 21 } 22 23 // GetPenaltyBoxConditionsRequest describes the GET request for penalty box conditions. 24 GetPenaltyBoxConditionsRequest struct { 25 ConfigID int 26 Version int 27 PolicyID string 28 } 29 30 // UpdatePenaltyBoxConditionsRequest describes the PUT request to modify the penalty box conditions. 31 UpdatePenaltyBoxConditionsRequest struct { 32 ConfigID int 33 Version int 34 PolicyID string 35 ConditionsPayload PenaltyBoxConditionsPayload 36 } 37 38 // PenaltyBoxConditionsPayload describes the penalty box conditions with operator 39 PenaltyBoxConditionsPayload struct { 40 ConditionOperator string `json:"conditionOperator"` 41 Conditions *RuleConditions `json:"conditions"` 42 } 43 44 // GetPenaltyBoxConditionsResponse describes the response with the penalty box conditions. 45 GetPenaltyBoxConditionsResponse PenaltyBoxConditionsPayload 46 47 // UpdatePenaltyBoxConditionsResponse describes the response with the update of penalty box conditions. 48 UpdatePenaltyBoxConditionsResponse PenaltyBoxConditionsPayload 49 ) 50 51 // Validate validates a GetPenaltyBoxConditionsRequest. 52 func (v GetPenaltyBoxConditionsRequest) Validate() error { 53 return edgegriderr.ParseValidationErrors(validation.Errors{ 54 "ConfigID": validation.Validate(v.ConfigID, validation.Required), 55 "Version": validation.Validate(v.Version, validation.Required), 56 "PolicyID": validation.Validate(v.PolicyID, validation.Required), 57 }) 58 } 59 60 // Validate validates an UpdatePenaltyBoxConditionsRequest. 61 func (v UpdatePenaltyBoxConditionsRequest) Validate() error { 62 return edgegriderr.ParseValidationErrors(validation.Errors{ 63 "ConfigID": validation.Validate(v.ConfigID, validation.Required), 64 "Version": validation.Validate(v.Version, validation.Required), 65 "PolicyID": validation.Validate(v.PolicyID, validation.Required), 66 "ConditionsPayload": validation.Validate(v.ConditionsPayload, validation.Required), 67 }) 68 } 69 70 // Validate validates an ConditionsPayload 71 func (v PenaltyBoxConditionsPayload) Validate() error { 72 return validation.Errors{ 73 "ConditionOperator": validation.Validate(v.ConditionOperator, validation.Required), 74 "Conditions": validation.Validate(v.Conditions, validation.NotNil), 75 }.Filter() 76 } 77 78 func (p *appsec) GetPenaltyBoxConditions(ctx context.Context, params GetPenaltyBoxConditionsRequest) (*GetPenaltyBoxConditionsResponse, error) { 79 logger := p.Log(ctx) 80 logger.Debug("GetPenaltyBoxConditions") 81 82 if err := params.Validate(); err != nil { 83 return nil, fmt.Errorf("%w: %s", ErrStructValidation, err.Error()) 84 } 85 86 uri := fmt.Sprintf( 87 "/appsec/v1/configs/%d/versions/%d/security-policies/%s/penalty-box/conditions", 88 params.ConfigID, 89 params.Version, 90 params.PolicyID) 91 92 req, err := http.NewRequestWithContext(ctx, http.MethodGet, uri, nil) 93 if err != nil { 94 return nil, fmt.Errorf("failed to create GetPenaltyBoxCondition request: %w", err) 95 } 96 97 var result GetPenaltyBoxConditionsResponse 98 resp, err := p.Exec(req, &result) 99 if err != nil { 100 return nil, fmt.Errorf("get penalty box condition request failed: %w", err) 101 } 102 if resp.StatusCode != http.StatusOK { 103 return nil, p.Error(resp) 104 } 105 106 return &result, nil 107 } 108 109 func (p *appsec) UpdatePenaltyBoxConditions(ctx context.Context, params UpdatePenaltyBoxConditionsRequest) (*UpdatePenaltyBoxConditionsResponse, error) { 110 logger := p.Log(ctx) 111 logger.Debug("UpdatePenaltyBoxConditions") 112 113 if err := params.Validate(); err != nil { 114 return nil, fmt.Errorf("%w: %s", ErrStructValidation, err.Error()) 115 } 116 117 uri := fmt.Sprintf( 118 "/appsec/v1/configs/%d/versions/%d/security-policies/%s/penalty-box/conditions", 119 params.ConfigID, 120 params.Version, 121 params.PolicyID, 122 ) 123 124 req, err := http.NewRequestWithContext(ctx, http.MethodPut, uri, nil) 125 if err != nil { 126 return nil, fmt.Errorf("failed update penalty box condition request: %w", err) 127 } 128 129 var result UpdatePenaltyBoxConditionsResponse 130 resp, err := p.Exec(req, &result, params.ConditionsPayload) 131 if err != nil { 132 return nil, fmt.Errorf("update penalty box condition request failed: %w", err) 133 } 134 if resp.StatusCode != http.StatusOK && resp.StatusCode != http.StatusCreated { 135 return nil, p.Error(resp) 136 } 137 138 return &result, nil 139 }