github.com/akamai/AkamaiOPEN-edgegrid-golang/v8@v8.1.0/pkg/botman/custom_deny_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 CustomDenyAction interface supports creating, retrieving, modifying and removing custom deny action for a
    14  	// configuration.
    15  	CustomDenyAction interface {
    16  		// GetCustomDenyActionList https://techdocs.akamai.com/bot-manager/reference/get-custom-deny-actions
    17  		GetCustomDenyActionList(ctx context.Context, params GetCustomDenyActionListRequest) (*GetCustomDenyActionListResponse, error)
    18  
    19  		// GetCustomDenyAction https://techdocs.akamai.com/bot-manager/reference/get-custom-deny-action
    20  		GetCustomDenyAction(ctx context.Context, params GetCustomDenyActionRequest) (map[string]interface{}, error)
    21  
    22  		// CreateCustomDenyAction https://techdocs.akamai.com/bot-manager/reference/post-custom-deny-action
    23  		CreateCustomDenyAction(ctx context.Context, params CreateCustomDenyActionRequest) (map[string]interface{}, error)
    24  
    25  		// UpdateCustomDenyAction https://techdocs.akamai.com/bot-manager/reference/put-custom-deny-action
    26  		UpdateCustomDenyAction(ctx context.Context, params UpdateCustomDenyActionRequest) (map[string]interface{}, error)
    27  
    28  		// RemoveCustomDenyAction https://techdocs.akamai.com/bot-manager/reference/delete-custom-deny-action
    29  		RemoveCustomDenyAction(ctx context.Context, params RemoveCustomDenyActionRequest) error
    30  	}
    31  
    32  	// GetCustomDenyActionListRequest is used to retrieve custom deny actions for a configuration.
    33  	GetCustomDenyActionListRequest struct {
    34  		ConfigID int64
    35  		Version  int64
    36  		ActionID string
    37  	}
    38  
    39  	// GetCustomDenyActionListResponse is used to retrieve custom deny actions for a configuration.
    40  	GetCustomDenyActionListResponse struct {
    41  		CustomDenyActions []map[string]interface{} `json:"customDenyActions"`
    42  	}
    43  
    44  	// GetCustomDenyActionRequest is used to retrieve a specific custom deny action
    45  	GetCustomDenyActionRequest struct {
    46  		ConfigID int64
    47  		Version  int64
    48  		ActionID string
    49  	}
    50  
    51  	// CreateCustomDenyActionRequest is used to create a new custom deny action for a specific configuration.
    52  	CreateCustomDenyActionRequest struct {
    53  		ConfigID    int64
    54  		Version     int64
    55  		JsonPayload json.RawMessage
    56  	}
    57  
    58  	// UpdateCustomDenyActionRequest is used to update an existing custom deny action
    59  	UpdateCustomDenyActionRequest struct {
    60  		ConfigID    int64
    61  		Version     int64
    62  		ActionID    string
    63  		JsonPayload json.RawMessage
    64  	}
    65  
    66  	// RemoveCustomDenyActionRequest is used to remove an existing custom deny action
    67  	RemoveCustomDenyActionRequest struct {
    68  		ConfigID int64
    69  		Version  int64
    70  		ActionID string
    71  	}
    72  )
    73  
    74  // Validate validates a GetCustomDenyActionRequest.
    75  func (v GetCustomDenyActionRequest) Validate() error {
    76  	return validation.Errors{
    77  		"ConfigID": validation.Validate(v.ConfigID, validation.Required),
    78  		"Version":  validation.Validate(v.Version, validation.Required),
    79  		"ActionID": validation.Validate(v.ActionID, validation.Required),
    80  	}.Filter()
    81  }
    82  
    83  // Validate validates a GetCustomDenyActionListRequest.
    84  func (v GetCustomDenyActionListRequest) Validate() error {
    85  	return validation.Errors{
    86  		"ConfigID": validation.Validate(v.ConfigID, validation.Required),
    87  		"Version":  validation.Validate(v.Version, validation.Required),
    88  	}.Filter()
    89  }
    90  
    91  // Validate validates a CreateCustomDenyActionRequest.
    92  func (v CreateCustomDenyActionRequest) Validate() error {
    93  	return validation.Errors{
    94  		"ConfigID":    validation.Validate(v.ConfigID, validation.Required),
    95  		"Version":     validation.Validate(v.Version, validation.Required),
    96  		"JsonPayload": validation.Validate(v.JsonPayload, validation.Required),
    97  	}.Filter()
    98  }
    99  
   100  // Validate validates an UpdateCustomDenyActionRequest.
   101  func (v UpdateCustomDenyActionRequest) Validate() error {
   102  	return validation.Errors{
   103  		"ConfigID":    validation.Validate(v.ConfigID, validation.Required),
   104  		"Version":     validation.Validate(v.Version, validation.Required),
   105  		"ActionID":    validation.Validate(v.ActionID, validation.Required),
   106  		"JsonPayload": validation.Validate(v.JsonPayload, validation.Required),
   107  	}.Filter()
   108  }
   109  
   110  // Validate validates a RemoveCustomDenyActionRequest.
   111  func (v RemoveCustomDenyActionRequest) Validate() error {
   112  	return validation.Errors{
   113  		"ConfigID": validation.Validate(v.ConfigID, validation.Required),
   114  		"Version":  validation.Validate(v.Version, validation.Required),
   115  		"ActionID": validation.Validate(v.ActionID, validation.Required),
   116  	}.Filter()
   117  }
   118  
   119  func (b *botman) GetCustomDenyAction(ctx context.Context, params GetCustomDenyActionRequest) (map[string]interface{}, error) {
   120  	logger := b.Log(ctx)
   121  	logger.Debug("GetCustomDenyAction")
   122  
   123  	if err := params.Validate(); err != nil {
   124  		return nil, fmt.Errorf("%w: %s", ErrStructValidation, err.Error())
   125  	}
   126  
   127  	uri := fmt.Sprintf(
   128  		"/appsec/v1/configs/%d/versions/%d/response-actions/custom-deny-actions/%s",
   129  		params.ConfigID,
   130  		params.Version,
   131  		params.ActionID)
   132  
   133  	req, err := http.NewRequestWithContext(ctx, http.MethodGet, uri, nil)
   134  	if err != nil {
   135  		return nil, fmt.Errorf("failed to create GetCustomDenyAction request: %w", err)
   136  	}
   137  
   138  	var result map[string]interface{}
   139  	resp, err := b.Exec(req, &result)
   140  	if err != nil {
   141  		return nil, fmt.Errorf("GetCustomDenyAction request failed: %w", err)
   142  	}
   143  
   144  	if resp.StatusCode != http.StatusOK {
   145  		return nil, b.Error(resp)
   146  	}
   147  
   148  	return result, nil
   149  }
   150  
   151  func (b *botman) GetCustomDenyActionList(ctx context.Context, params GetCustomDenyActionListRequest) (*GetCustomDenyActionListResponse, error) {
   152  	logger := b.Log(ctx)
   153  	logger.Debug("GetCustomDenyActionList")
   154  
   155  	if err := params.Validate(); err != nil {
   156  		return nil, fmt.Errorf("%w: %s", ErrStructValidation, err.Error())
   157  	}
   158  
   159  	uri := fmt.Sprintf(
   160  		"/appsec/v1/configs/%d/versions/%d/response-actions/custom-deny-actions",
   161  		params.ConfigID,
   162  		params.Version,
   163  	)
   164  
   165  	req, err := http.NewRequestWithContext(ctx, http.MethodGet, uri, nil)
   166  	if err != nil {
   167  		return nil, fmt.Errorf("failed to create GetlustomDenyList request: %w", err)
   168  	}
   169  
   170  	var result GetCustomDenyActionListResponse
   171  	resp, err := b.Exec(req, &result)
   172  	if err != nil {
   173  		return nil, fmt.Errorf("GetCustomDenyActionList request failed: %w", err)
   174  	}
   175  
   176  	if resp.StatusCode != http.StatusOK {
   177  		return nil, b.Error(resp)
   178  	}
   179  
   180  	var filteredResult GetCustomDenyActionListResponse
   181  	if params.ActionID != "" {
   182  		for _, val := range result.CustomDenyActions {
   183  			if val["actionId"].(string) == params.ActionID {
   184  				filteredResult.CustomDenyActions = append(filteredResult.CustomDenyActions, val)
   185  			}
   186  		}
   187  	} else {
   188  		filteredResult = result
   189  	}
   190  	return &filteredResult, nil
   191  }
   192  
   193  func (b *botman) UpdateCustomDenyAction(ctx context.Context, params UpdateCustomDenyActionRequest) (map[string]interface{}, error) {
   194  	logger := b.Log(ctx)
   195  	logger.Debug("UpdateCustomDenyAction")
   196  
   197  	if err := params.Validate(); err != nil {
   198  		return nil, fmt.Errorf("%w: %s", ErrStructValidation, err.Error())
   199  	}
   200  
   201  	putURL := fmt.Sprintf(
   202  		"/appsec/v1/configs/%d/versions/%d/response-actions/custom-deny-actions/%s",
   203  		params.ConfigID,
   204  		params.Version,
   205  		params.ActionID,
   206  	)
   207  
   208  	req, err := http.NewRequestWithContext(ctx, http.MethodPut, putURL, nil)
   209  	if err != nil {
   210  		return nil, fmt.Errorf("failed to create UpdateCustomDenyAction request: %w", err)
   211  	}
   212  
   213  	var result map[string]interface{}
   214  	resp, err := b.Exec(req, &result, params.JsonPayload)
   215  	if err != nil {
   216  		return nil, fmt.Errorf("UpdateCustomDenyAction request failed: %w", err)
   217  	}
   218  
   219  	if resp.StatusCode != http.StatusOK {
   220  		return nil, b.Error(resp)
   221  	}
   222  
   223  	return result, nil
   224  }
   225  
   226  func (b *botman) CreateCustomDenyAction(ctx context.Context, params CreateCustomDenyActionRequest) (map[string]interface{}, error) {
   227  	logger := b.Log(ctx)
   228  	logger.Debug("CreateCustomDenyAction")
   229  
   230  	if err := params.Validate(); err != nil {
   231  		return nil, fmt.Errorf("%w: %s", ErrStructValidation, err.Error())
   232  	}
   233  
   234  	uri := fmt.Sprintf(
   235  		"/appsec/v1/configs/%d/versions/%d/response-actions/custom-deny-actions",
   236  		params.ConfigID,
   237  		params.Version,
   238  	)
   239  
   240  	req, err := http.NewRequestWithContext(ctx, http.MethodPost, uri, nil)
   241  	if err != nil {
   242  		return nil, fmt.Errorf("failed to create CreateCustomDenyAction request: %w", err)
   243  	}
   244  
   245  	var result map[string]interface{}
   246  	resp, err := b.Exec(req, &result, params.JsonPayload)
   247  	if err != nil {
   248  		return nil, fmt.Errorf("CreateCustomDenyAction request failed: %w", err)
   249  	}
   250  
   251  	if resp.StatusCode != http.StatusCreated {
   252  		return nil, b.Error(resp)
   253  	}
   254  
   255  	return result, nil
   256  }
   257  
   258  func (b *botman) RemoveCustomDenyAction(ctx context.Context, params RemoveCustomDenyActionRequest) error {
   259  	logger := b.Log(ctx)
   260  	logger.Debug("RemoveCustomDenyAction")
   261  
   262  	if err := params.Validate(); err != nil {
   263  		return fmt.Errorf("%w: %s", ErrStructValidation, err.Error())
   264  	}
   265  
   266  	uri := fmt.Sprintf(
   267  		"/appsec/v1/configs/%d/versions/%d/response-actions/custom-deny-actions/%s",
   268  		params.ConfigID,
   269  		params.Version,
   270  		params.ActionID)
   271  
   272  	req, err := http.NewRequestWithContext(ctx, http.MethodDelete, uri, nil)
   273  	if err != nil {
   274  		return fmt.Errorf("failed to create RemoveCustomDenyAction request: %w", err)
   275  	}
   276  
   277  	var result map[string]interface{}
   278  	resp, err := b.Exec(req, &result)
   279  	if err != nil {
   280  		return fmt.Errorf("RemoveCustomDenyAction request failed: %w", err)
   281  	}
   282  
   283  	if resp.StatusCode != http.StatusNoContent {
   284  		return b.Error(resp)
   285  	}
   286  
   287  	return nil
   288  }