github.com/akamai/AkamaiOPEN-edgegrid-golang/v8@v8.1.0/pkg/botman/custom_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 CustomBotCategoryAction interface supports retrieving and updating the actions for the custom bot categories of
    14  	// a configuration
    15  	CustomBotCategoryAction interface {
    16  		// GetCustomBotCategoryActionList https://techdocs.akamai.com/bot-manager/reference/get-custom-bot-category-actions
    17  		GetCustomBotCategoryActionList(ctx context.Context, params GetCustomBotCategoryActionListRequest) (*GetCustomBotCategoryActionListResponse, error)
    18  
    19  		// GetCustomBotCategoryAction https://techdocs.akamai.com/bot-manager/reference/get-custom-bot-category-action
    20  		GetCustomBotCategoryAction(ctx context.Context, params GetCustomBotCategoryActionRequest) (map[string]interface{}, error)
    21  
    22  		// UpdateCustomBotCategoryAction https://techdocs.akamai.com/bot-manager/reference/put-custom-bot-category-action
    23  		UpdateCustomBotCategoryAction(ctx context.Context, params UpdateCustomBotCategoryActionRequest) (map[string]interface{}, error)
    24  	}
    25  
    26  	// GetCustomBotCategoryActionListRequest is used to retrieve the custom bot category actions for a policy.
    27  	GetCustomBotCategoryActionListRequest struct {
    28  		ConfigID         int64
    29  		Version          int64
    30  		SecurityPolicyID string
    31  		CategoryID       string
    32  	}
    33  
    34  	// GetCustomBotCategoryActionListResponse is returned from a call to GetCustomBotCategoryActionList.
    35  	GetCustomBotCategoryActionListResponse struct {
    36  		Actions []map[string]interface{} `json:"actions"`
    37  	}
    38  
    39  	// GetCustomBotCategoryActionRequest is used to retrieve the action for a custom bot category
    40  	GetCustomBotCategoryActionRequest struct {
    41  		ConfigID         int64
    42  		Version          int64
    43  		SecurityPolicyID string
    44  		CategoryID       string
    45  	}
    46  
    47  	// UpdateCustomBotCategoryActionRequest is used to modify an existing custom bot category action
    48  	UpdateCustomBotCategoryActionRequest struct {
    49  		ConfigID         int64
    50  		Version          int64
    51  		SecurityPolicyID string
    52  		CategoryID       string
    53  		JsonPayload      json.RawMessage
    54  	}
    55  )
    56  
    57  // Validate validates a GetCustomBotCategoryActionRequest.
    58  func (v GetCustomBotCategoryActionRequest) 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 GetCustomBotCategoryActionListRequest.
    68  func (v GetCustomBotCategoryActionListRequest) 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 UpdateCustomBotCategoryActionRequest.
    77  func (v UpdateCustomBotCategoryActionRequest) 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) GetCustomBotCategoryAction(ctx context.Context, params GetCustomBotCategoryActionRequest) (map[string]interface{}, error) {
    88  	logger := b.Log(ctx)
    89  	logger.Debug("GetCustomBotCategoryAction")
    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/custom-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 GetCustomBotCategoryAction 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("GetCustomBotCategoryAction 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) GetCustomBotCategoryActionList(ctx context.Context, params GetCustomBotCategoryActionListRequest) (*GetCustomBotCategoryActionListResponse, error) {
   121  	logger := b.Log(ctx)
   122  	logger.Debug("GetCustomBotCategoryActionList")
   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/custom-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 GetCustomBotCategoryActionList request: %w", err)
   137  	}
   138  
   139  	var result GetCustomBotCategoryActionListResponse
   140  	resp, err := b.Exec(req, &result)
   141  	if err != nil {
   142  		return nil, fmt.Errorf("GetCustomBotCategoryActionList request failed: %w", err)
   143  	}
   144  
   145  	if resp.StatusCode != http.StatusOK {
   146  		return nil, b.Error(resp)
   147  	}
   148  
   149  	var filteredResult GetCustomBotCategoryActionListResponse
   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) UpdateCustomBotCategoryAction(ctx context.Context, params UpdateCustomBotCategoryActionRequest) (map[string]interface{}, error) {
   163  	logger := b.Log(ctx)
   164  	logger.Debug("UpdateCustomBotCategoryAction")
   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/custom-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 UpdateCustomBotCategoryAction 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("UpdateCustomBotCategoryAction 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  }