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  }