github.com/akamai/AkamaiOPEN-edgegrid-golang/v8@v8.1.0/pkg/botman/conditional_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 ConditionalAction interface supports creating, retrieving, modifying and removing conditional action for a
    14  	// configuration.
    15  	ConditionalAction interface {
    16  		// GetConditionalActionList https://techdocs.akamai.com/bot-manager/reference/get-conditional-actions
    17  		GetConditionalActionList(ctx context.Context, params GetConditionalActionListRequest) (*GetConditionalActionListResponse, error)
    18  
    19  		// GetConditionalAction https://techdocs.akamai.com/bot-manager/reference/get-conditional-action
    20  		GetConditionalAction(ctx context.Context, params GetConditionalActionRequest) (map[string]interface{}, error)
    21  
    22  		// CreateConditionalAction https://techdocs.akamai.com/bot-manager/reference/post-conditional-action
    23  		CreateConditionalAction(ctx context.Context, params CreateConditionalActionRequest) (map[string]interface{}, error)
    24  
    25  		// UpdateConditionalAction https://techdocs.akamai.com/bot-manager/reference/put-conditional-action
    26  		UpdateConditionalAction(ctx context.Context, params UpdateConditionalActionRequest) (map[string]interface{}, error)
    27  
    28  		// RemoveConditionalAction https://techdocs.akamai.com/bot-manager/reference/delete-conditional-action
    29  		RemoveConditionalAction(ctx context.Context, params RemoveConditionalActionRequest) error
    30  	}
    31  
    32  	// GetConditionalActionListRequest is used to retrieve conditional actions for a configuration.
    33  	GetConditionalActionListRequest struct {
    34  		ConfigID int64
    35  		Version  int64
    36  		ActionID string
    37  	}
    38  
    39  	// GetConditionalActionListResponse is used to retrieve conditional actions for a configuration.
    40  	GetConditionalActionListResponse struct {
    41  		ConditionalActions []map[string]interface{} `json:"conditionalActions"`
    42  	}
    43  
    44  	// GetConditionalActionRequest is used to retrieve a specific conditional action
    45  	GetConditionalActionRequest struct {
    46  		ConfigID int64
    47  		Version  int64
    48  		ActionID string
    49  	}
    50  
    51  	// CreateConditionalActionRequest is used to create a new conditional action for a specific configuration.
    52  	CreateConditionalActionRequest struct {
    53  		ConfigID    int64
    54  		Version     int64
    55  		JsonPayload json.RawMessage
    56  	}
    57  
    58  	// UpdateConditionalActionRequest is used to update an existing conditional action
    59  	UpdateConditionalActionRequest struct {
    60  		ConfigID    int64
    61  		Version     int64
    62  		ActionID    string
    63  		JsonPayload json.RawMessage
    64  	}
    65  
    66  	// RemoveConditionalActionRequest is used to remove an existing conditional action
    67  	RemoveConditionalActionRequest struct {
    68  		ConfigID int64
    69  		Version  int64
    70  		ActionID string
    71  	}
    72  )
    73  
    74  // Validate validates a GetConditionalActionRequest.
    75  func (v GetConditionalActionRequest) 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 GetConditionalActionListRequest.
    84  func (v GetConditionalActionListRequest) 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 CreateConditionalActionRequest.
    92  func (v CreateConditionalActionRequest) 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 UpdateConditionalActionRequest.
   101  func (v UpdateConditionalActionRequest) 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 RemoveConditionalActionRequest.
   111  func (v RemoveConditionalActionRequest) 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) GetConditionalAction(ctx context.Context, params GetConditionalActionRequest) (map[string]interface{}, error) {
   120  	logger := b.Log(ctx)
   121  	logger.Debug("GetConditionalAction")
   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/conditional-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 GetConditionalAction 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("GetConditionalAction 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) GetConditionalActionList(ctx context.Context, params GetConditionalActionListRequest) (*GetConditionalActionListResponse, error) {
   152  	logger := b.Log(ctx)
   153  	logger.Debug("GetConditionalActionList")
   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/conditional-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 GetConditionalActionListResponse
   171  	resp, err := b.Exec(req, &result)
   172  	if err != nil {
   173  		return nil, fmt.Errorf("GetConditionalActionList request failed: %w", err)
   174  	}
   175  
   176  	if resp.StatusCode != http.StatusOK {
   177  		return nil, b.Error(resp)
   178  	}
   179  
   180  	var filteredResult GetConditionalActionListResponse
   181  	if params.ActionID != "" {
   182  		for _, val := range result.ConditionalActions {
   183  			if val["actionId"].(string) == params.ActionID {
   184  				filteredResult.ConditionalActions = append(filteredResult.ConditionalActions, val)
   185  			}
   186  		}
   187  	} else {
   188  		filteredResult = result
   189  	}
   190  	return &filteredResult, nil
   191  }
   192  
   193  func (b *botman) UpdateConditionalAction(ctx context.Context, params UpdateConditionalActionRequest) (map[string]interface{}, error) {
   194  	logger := b.Log(ctx)
   195  	logger.Debug("UpdateConditionalAction")
   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/conditional-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 UpdateConditionalAction 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("UpdateConditionalAction 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) CreateConditionalAction(ctx context.Context, params CreateConditionalActionRequest) (map[string]interface{}, error) {
   227  	logger := b.Log(ctx)
   228  	logger.Debug("CreateConditionalAction")
   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/conditional-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 CreateConditionalAction 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("CreateConditionalAction 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) RemoveConditionalAction(ctx context.Context, params RemoveConditionalActionRequest) error {
   259  	logger := b.Log(ctx)
   260  	logger.Debug("RemoveConditionalAction")
   261  
   262  	if err := params.Validate(); err != nil {
   263  		return fmt.Errorf("%w: %s", ErrStructValidation, err.Error())
   264  	}
   265  
   266  	uri := fmt.Sprintf("/appsec/v1/configs/%d/versions/%d/response-actions/conditional-actions/%s",
   267  		params.ConfigID,
   268  		params.Version,
   269  		params.ActionID)
   270  
   271  	req, err := http.NewRequestWithContext(ctx, http.MethodDelete, uri, nil)
   272  	if err != nil {
   273  		return fmt.Errorf("failed to create RemoveConditionalAction request: %w", err)
   274  	}
   275  
   276  	var result map[string]interface{}
   277  	resp, err := b.Exec(req, &result)
   278  	if err != nil {
   279  		return fmt.Errorf("RemoveConditionalAction request failed: %w", err)
   280  	}
   281  
   282  	if resp.StatusCode != http.StatusNoContent {
   283  		return b.Error(resp)
   284  	}
   285  
   286  	return nil
   287  }