github.com/akamai/AkamaiOPEN-edgegrid-golang/v8@v8.1.0/pkg/botman/akamai_bot_category_action.go (about)

     1  package botman
     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 AkamaiBotCategoryAction interface supports retrieving and updating the actions for the akamai bot categories of
    14  	// a configuration
    15  	AkamaiBotCategoryAction interface {
    16  		// GetAkamaiBotCategoryActionList https://techdocs.akamai.com/bot-manager/reference/get-akamai-bot-category-actions
    17  		GetAkamaiBotCategoryActionList(ctx context.Context, params GetAkamaiBotCategoryActionListRequest) (*GetAkamaiBotCategoryActionListResponse, error)
    18  
    19  		// GetAkamaiBotCategoryAction https://techdocs.akamai.com/bot-manager/reference/get-akamai-bot-category-action
    20  		GetAkamaiBotCategoryAction(ctx context.Context, params GetAkamaiBotCategoryActionRequest) (map[string]interface{}, error)
    21  
    22  		// UpdateAkamaiBotCategoryAction https://techdocs.akamai.com/bot-manager/reference/put-akamai-bot-category-action
    23  		UpdateAkamaiBotCategoryAction(ctx context.Context, params UpdateAkamaiBotCategoryActionRequest) (map[string]interface{}, error)
    24  	}
    25  
    26  	// GetAkamaiBotCategoryActionListRequest is used to retrieve the akamai bot category actions for a policy.
    27  	GetAkamaiBotCategoryActionListRequest struct {
    28  		ConfigID         int64
    29  		Version          int64
    30  		SecurityPolicyID string
    31  		CategoryID       string
    32  	}
    33  
    34  	// GetAkamaiBotCategoryActionListResponse is returned from a call to GetAkamaiBotCategoryActionList.
    35  	GetAkamaiBotCategoryActionListResponse struct {
    36  		Actions []map[string]interface{} `json:"actions"`
    37  	}
    38  
    39  	// GetAkamaiBotCategoryActionRequest is used to retrieve the action for an akamai bot category.
    40  	GetAkamaiBotCategoryActionRequest struct {
    41  		ConfigID         int64
    42  		Version          int64
    43  		SecurityPolicyID string
    44  		CategoryID       string
    45  	}
    46  
    47  	// UpdateAkamaiBotCategoryActionRequest is used to modify an akamai bot category action.
    48  	UpdateAkamaiBotCategoryActionRequest struct {
    49  		ConfigID         int64
    50  		Version          int64
    51  		SecurityPolicyID string
    52  		CategoryID       string
    53  		JsonPayload      json.RawMessage
    54  	}
    55  )
    56  
    57  // Validate validates a GetAkamaiBotCategoryActionRequest.
    58  func (v GetAkamaiBotCategoryActionRequest) Validate() error {
    59  	return validation.Errors{
    60  		"ConfigID":         validation.Validate(v.ConfigID, validation.Required),
    61  		"Version":          validation.Validate(v.Version, validation.Required),
    62  		"SecurityPolicyID": validation.Validate(v.SecurityPolicyID, validation.Required),
    63  		"CategoryID":       validation.Validate(v.CategoryID, validation.Required),
    64  	}.Filter()
    65  }
    66  
    67  // Validate validates a GetAkamaiBotCategoryActionListRequest.
    68  func (v GetAkamaiBotCategoryActionListRequest) Validate() error {
    69  	return validation.Errors{
    70  		"ConfigID":         validation.Validate(v.ConfigID, validation.Required),
    71  		"Version":          validation.Validate(v.Version, validation.Required),
    72  		"SecurityPolicyID": validation.Validate(v.SecurityPolicyID, validation.Required),
    73  	}.Filter()
    74  }
    75  
    76  // Validate validates an UpdateAkamaiBotCategoryActionRequest.
    77  func (v UpdateAkamaiBotCategoryActionRequest) Validate() error {
    78  	return validation.Errors{
    79  		"ConfigID":         validation.Validate(v.ConfigID, validation.Required),
    80  		"Version":          validation.Validate(v.Version, validation.Required),
    81  		"SecurityPolicyID": validation.Validate(v.SecurityPolicyID, validation.Required),
    82  		"CategoryID":       validation.Validate(v.CategoryID, validation.Required),
    83  		"JsonPayload":      validation.Validate(v.JsonPayload, validation.Required),
    84  	}.Filter()
    85  }
    86  
    87  func (b *botman) GetAkamaiBotCategoryAction(ctx context.Context, params GetAkamaiBotCategoryActionRequest) (map[string]interface{}, error) {
    88  	logger := b.Log(ctx)
    89  	logger.Debug("GetAkamaiBotCategoryAction")
    90  
    91  	if err := params.Validate(); err != nil {
    92  		return nil, fmt.Errorf("%w: %s", ErrStructValidation, err.Error())
    93  	}
    94  
    95  	uri := fmt.Sprintf(
    96  		"/appsec/v1/configs/%d/versions/%d/security-policies/%s/akamai-bot-category-actions/%s",
    97  		params.ConfigID,
    98  		params.Version,
    99  		params.SecurityPolicyID,
   100  		params.CategoryID)
   101  
   102  	req, err := http.NewRequestWithContext(ctx, http.MethodGet, uri, nil)
   103  	if err != nil {
   104  		return nil, fmt.Errorf("failed to create GetAkamaiBotCategoryAction request: %w", err)
   105  	}
   106  
   107  	var result map[string]interface{}
   108  	resp, err := b.Exec(req, &result)
   109  	if err != nil {
   110  		return nil, fmt.Errorf("GetAkamaiBotCategoryAction request failed: %w", err)
   111  	}
   112  
   113  	if resp.StatusCode != http.StatusOK {
   114  		return nil, b.Error(resp)
   115  	}
   116  
   117  	return result, nil
   118  }
   119  
   120  func (b *botman) GetAkamaiBotCategoryActionList(ctx context.Context, params GetAkamaiBotCategoryActionListRequest) (*GetAkamaiBotCategoryActionListResponse, error) {
   121  	logger := b.Log(ctx)
   122  	logger.Debug("GetAkamaiBotCategoryActionList")
   123  
   124  	if err := params.Validate(); err != nil {
   125  		return nil, fmt.Errorf("%w: %s", ErrStructValidation, err.Error())
   126  	}
   127  
   128  	uri := fmt.Sprintf(
   129  		"/appsec/v1/configs/%d/versions/%d/security-policies/%s/akamai-bot-category-actions",
   130  		params.ConfigID,
   131  		params.Version,
   132  		params.SecurityPolicyID)
   133  
   134  	req, err := http.NewRequestWithContext(ctx, http.MethodGet, uri, nil)
   135  	if err != nil {
   136  		return nil, fmt.Errorf("failed to create GetAkamaiBotCategoryActionList request: %w", err)
   137  	}
   138  
   139  	var result GetAkamaiBotCategoryActionListResponse
   140  	resp, err := b.Exec(req, &result)
   141  	if err != nil {
   142  		return nil, fmt.Errorf("GetAkamaiBotCategoryActionList request failed: %w", err)
   143  	}
   144  
   145  	if resp.StatusCode != http.StatusOK {
   146  		return nil, b.Error(resp)
   147  	}
   148  
   149  	var filteredResult GetAkamaiBotCategoryActionListResponse
   150  	if params.CategoryID != "" {
   151  		for _, val := range result.Actions {
   152  			if val["categoryId"].(string) == params.CategoryID {
   153  				filteredResult.Actions = append(filteredResult.Actions, val)
   154  			}
   155  		}
   156  	} else {
   157  		filteredResult = result
   158  	}
   159  	return &filteredResult, nil
   160  }
   161  
   162  func (b *botman) UpdateAkamaiBotCategoryAction(ctx context.Context, params UpdateAkamaiBotCategoryActionRequest) (map[string]interface{}, error) {
   163  	logger := b.Log(ctx)
   164  	logger.Debug("UpdateAkamaiBotCategoryAction")
   165  
   166  	if err := params.Validate(); err != nil {
   167  		return nil, fmt.Errorf("%w: %s", ErrStructValidation, err.Error())
   168  	}
   169  
   170  	putURL := fmt.Sprintf(
   171  		"/appsec/v1/configs/%d/versions/%d/security-policies/%s/akamai-bot-category-actions/%s",
   172  		params.ConfigID,
   173  		params.Version,
   174  		params.SecurityPolicyID,
   175  		params.CategoryID,
   176  	)
   177  
   178  	req, err := http.NewRequestWithContext(ctx, http.MethodPut, putURL, nil)
   179  	if err != nil {
   180  		return nil, fmt.Errorf("failed to create UpdateAkamaiBotCategoryAction request: %w", err)
   181  	}
   182  
   183  	var result map[string]interface{}
   184  	resp, err := b.Exec(req, &result, params.JsonPayload)
   185  	if err != nil {
   186  		return nil, fmt.Errorf("UpdateAkamaiBotCategoryAction request failed: %w", err)
   187  	}
   188  
   189  	if resp.StatusCode != http.StatusOK {
   190  		return nil, b.Error(resp)
   191  	}
   192  
   193  	return result, nil
   194  }