github.com/akamai/AkamaiOPEN-edgegrid-golang/v8@v8.1.0/pkg/appsec/reputation_profile_action.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 ReputationProfileAction interface supports retrieving and modifying the action associated with
    13  	// a specified reputation profile, or with all reputation profiles in a security policy.
    14  	ReputationProfileAction interface {
    15  		// GetReputationProfileActions returns a list of reputation profiles with their associated actions.
    16  		//
    17  		// See: https://techdocs.akamai.com/application-security/reference/get-reputation-profiles-actions
    18  		GetReputationProfileActions(ctx context.Context, params GetReputationProfileActionsRequest) (*GetReputationProfileActionsResponse, error)
    19  
    20  		// GetReputationProfileAction returns the action a reputation profile takes when triggered.
    21  		//
    22  		// See: https://techdocs.akamai.com/application-security/reference/get-reputation-profile-action
    23  		GetReputationProfileAction(ctx context.Context, params GetReputationProfileActionRequest) (*GetReputationProfileActionResponse, error)
    24  
    25  		// UpdateReputationProfileAction updates what action to take when reputation profile's rule triggers.
    26  		//
    27  		// See: https://techdocs.akamai.com/application-security/reference/put-reputation-profile-action
    28  		UpdateReputationProfileAction(ctx context.Context, params UpdateReputationProfileActionRequest) (*UpdateReputationProfileActionResponse, error)
    29  	}
    30  
    31  	// GetReputationProfileActionsRequest is used to retrieve the list of reputation profiles and their associated actions.
    32  	GetReputationProfileActionsRequest struct {
    33  		ConfigID            int    `json:"configId"`
    34  		Version             int    `json:"version"`
    35  		PolicyID            string `json:"policyId"`
    36  		ReputationProfileID int    `json:"id"`
    37  		Action              string `json:"action"`
    38  	}
    39  
    40  	// GetReputationProfileActionsResponse is returned from a call to GetReputationProfileActions.
    41  	GetReputationProfileActionsResponse struct {
    42  		ReputationProfiles []struct {
    43  			Action string `json:"action,omitempty"`
    44  			ID     int    `json:"id,omitempty"`
    45  		} `json:"reputationProfiles,omitempty"`
    46  	}
    47  
    48  	// GetReputationProfileActionRequest is used to retrieve the details for a specific reputation profile.
    49  	GetReputationProfileActionRequest struct {
    50  		ConfigID            int    `json:"configId"`
    51  		Version             int    `json:"version"`
    52  		PolicyID            string `json:"policyId"`
    53  		ReputationProfileID int    `json:"id"`
    54  		Action              string `json:"action"`
    55  	}
    56  
    57  	// GetReputationProfileActionResponse is returned from a call to GetReputationProfileAction.
    58  	GetReputationProfileActionResponse struct {
    59  		Action string `json:"action,omitempty"`
    60  	}
    61  
    62  	// UpdateReputationProfileActionRequest is used to modify the details for a specific reputation profile.
    63  	UpdateReputationProfileActionRequest struct {
    64  		ConfigID            int    `json:"-"`
    65  		Version             int    `json:"-"`
    66  		PolicyID            string `json:"-"`
    67  		ReputationProfileID int    `json:"-"`
    68  		Action              string `json:"action"`
    69  	}
    70  
    71  	// UpdateReputationProfileActionResponse is returned from a call to UpdateReputationProfileAction.
    72  	UpdateReputationProfileActionResponse struct {
    73  		Action string `json:"action"`
    74  	}
    75  
    76  	// ReputationProfileActionPost is currently unused.
    77  	ReputationProfileActionPost struct {
    78  		Action string `json:"action"`
    79  	}
    80  )
    81  
    82  // Validate validates a GetReputationProfileActionRequest.
    83  func (v GetReputationProfileActionRequest) Validate() error {
    84  	return validation.Errors{
    85  		"ConfigID": validation.Validate(v.ConfigID, validation.Required),
    86  		"Version":  validation.Validate(v.Version, validation.Required),
    87  		"PolicyID": validation.Validate(v.PolicyID, validation.Required),
    88  	}.Filter()
    89  }
    90  
    91  // Validate validates a GetReputationProfileActionsRequest.
    92  func (v GetReputationProfileActionsRequest) 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 UpdateReputationProfileActionRequest.
   101  func (v UpdateReputationProfileActionRequest) 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  		"ReputationProfileID": validation.Validate(v.ReputationProfileID, validation.Required),
   107  	}.Filter()
   108  }
   109  
   110  func (p *appsec) GetReputationProfileAction(ctx context.Context, params GetReputationProfileActionRequest) (*GetReputationProfileActionResponse, error) {
   111  	logger := p.Log(ctx)
   112  	logger.Debug("GetReputationProfileAction")
   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/reputation-profiles/%d",
   120  		params.ConfigID,
   121  		params.Version,
   122  		params.PolicyID,
   123  		params.ReputationProfileID)
   124  
   125  	req, err := http.NewRequestWithContext(ctx, http.MethodGet, uri, nil)
   126  	if err != nil {
   127  		return nil, fmt.Errorf("failed to create GetReputationProfileAction request: %w", err)
   128  	}
   129  
   130  	var result GetReputationProfileActionResponse
   131  	resp, err := p.Exec(req, &result)
   132  	if err != nil {
   133  		return nil, fmt.Errorf("get reputation profile action 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) GetReputationProfileActions(ctx context.Context, params GetReputationProfileActionsRequest) (*GetReputationProfileActionsResponse, error) {
   143  	logger := p.Log(ctx)
   144  	logger.Debug("GetReputationProfileActions")
   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/reputation-profiles",
   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 GetReputationProfileActions request: %w", err)
   159  	}
   160  
   161  	var result GetReputationProfileActionsResponse
   162  	resp, err := p.Exec(req, &result)
   163  	if err != nil {
   164  		return nil, fmt.Errorf("get reputation profile actions request failed: %w", err)
   165  	}
   166  	if resp.StatusCode != http.StatusOK {
   167  		return nil, p.Error(resp)
   168  	}
   169  
   170  	if params.ReputationProfileID != 0 {
   171  		var filteredResult GetReputationProfileActionsResponse
   172  		for _, val := range result.ReputationProfiles {
   173  			if val.ID == params.ReputationProfileID {
   174  				filteredResult.ReputationProfiles = append(filteredResult.ReputationProfiles, val)
   175  			}
   176  		}
   177  		return &filteredResult, nil
   178  	}
   179  
   180  	return &result, nil
   181  }
   182  
   183  func (p *appsec) UpdateReputationProfileAction(ctx context.Context, params UpdateReputationProfileActionRequest) (*UpdateReputationProfileActionResponse, error) {
   184  	logger := p.Log(ctx)
   185  	logger.Debug("UpdateReputationProfileAction")
   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/reputation-profiles/%d",
   193  		params.ConfigID,
   194  		params.Version,
   195  		params.PolicyID,
   196  		params.ReputationProfileID,
   197  	)
   198  
   199  	req, err := http.NewRequestWithContext(ctx, http.MethodPut, uri, nil)
   200  	if err != nil {
   201  		return nil, fmt.Errorf("failed to create UpdateReputationProfileAction request: %w", err)
   202  	}
   203  
   204  	var result UpdateReputationProfileActionResponse
   205  	resp, err := p.Exec(req, &result, params)
   206  	if err != nil {
   207  		return nil, fmt.Errorf("update reputation profile action request failed: %w", err)
   208  	}
   209  	if resp.StatusCode != http.StatusOK && resp.StatusCode != http.StatusCreated {
   210  		return nil, p.Error(resp)
   211  	}
   212  
   213  	return &result, nil
   214  }