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

     1  package botman
     2  
     3  import (
     4  	"context"
     5  	"fmt"
     6  	"net/http"
     7  
     8  	"github.com/akamai/AkamaiOPEN-edgegrid-golang/v8/pkg/edgegriderr"
     9  	validation "github.com/go-ozzo/ozzo-validation/v4"
    10  )
    11  
    12  type (
    13  	// The CustomClientSequence interface supports retrieving and updating the custom client sequence for a configuration
    14  	CustomClientSequence interface {
    15  		// GetCustomClientSequence is used to retrieve the custom client sequence for a config version
    16  		// See https://techdocs.akamai.com/bot-manager/reference/get-custom-client-sequence
    17  		GetCustomClientSequence(ctx context.Context, params GetCustomClientSequenceRequest) (*CustomClientSequenceResponse, error)
    18  
    19  		// UpdateCustomClientSequence is used to update the existing custom client sequence for a config version
    20  		// See https://techdocs.akamai.com/bot-manager/reference/put-custom-client-sequence
    21  		UpdateCustomClientSequence(ctx context.Context, params UpdateCustomClientSequenceRequest) (*CustomClientSequenceResponse, error)
    22  	}
    23  
    24  	// GetCustomClientSequenceRequest is used to retrieve custom client sequence
    25  	GetCustomClientSequenceRequest struct {
    26  		ConfigID int64
    27  		Version  int64
    28  	}
    29  
    30  	// UpdateCustomClientSequenceRequest is used to modify custom client sequence
    31  	UpdateCustomClientSequenceRequest struct {
    32  		ConfigID int64    `json:"-"`
    33  		Version  int64    `json:"-"`
    34  		Sequence []string `json:"sequence"`
    35  	}
    36  
    37  	// CustomClientSequenceResponse is used to represent custom client sequence
    38  	CustomClientSequenceResponse struct {
    39  		Sequence   []string           `json:"sequence"`
    40  		Validation ValidationResponse `json:"validation"`
    41  	}
    42  )
    43  
    44  // Validate validates a GetCustomClientSequenceRequest.
    45  func (v GetCustomClientSequenceRequest) Validate() error {
    46  	return edgegriderr.ParseValidationErrors(validation.Errors{
    47  		"ConfigID": validation.Validate(v.ConfigID, validation.Required),
    48  		"Version":  validation.Validate(v.Version, validation.Required),
    49  	})
    50  }
    51  
    52  // Validate validates an UpdateCustomClientSequenceRequest.
    53  func (v UpdateCustomClientSequenceRequest) Validate() error {
    54  	return edgegriderr.ParseValidationErrors(validation.Errors{
    55  		"ConfigID": validation.Validate(v.ConfigID, validation.Required),
    56  		"Version":  validation.Validate(v.Version, validation.Required),
    57  		"Sequence": validation.Validate(v.Sequence, validation.Required),
    58  	})
    59  }
    60  
    61  func (b *botman) GetCustomClientSequence(ctx context.Context, params GetCustomClientSequenceRequest) (*CustomClientSequenceResponse, error) {
    62  	logger := b.Log(ctx)
    63  	logger.Debug("GetCustomClientSequence")
    64  
    65  	if err := params.Validate(); err != nil {
    66  		return nil, fmt.Errorf("%w: %s", ErrStructValidation, err.Error())
    67  	}
    68  
    69  	uri := fmt.Sprintf(
    70  		"/appsec/v1/configs/%d/versions/%d/custom-client-sequence",
    71  		params.ConfigID,
    72  		params.Version)
    73  
    74  	req, err := http.NewRequestWithContext(ctx, http.MethodGet, uri, nil)
    75  	if err != nil {
    76  		return nil, fmt.Errorf("failed to create GetCustomClientSequence request: %w", err)
    77  	}
    78  
    79  	var result CustomClientSequenceResponse
    80  	resp, err := b.Exec(req, &result)
    81  	if err != nil {
    82  		return nil, fmt.Errorf("GetCustomClientSequence request failed: %w", err)
    83  	}
    84  
    85  	if resp.StatusCode != http.StatusOK {
    86  		return nil, b.Error(resp)
    87  	}
    88  
    89  	return &result, nil
    90  }
    91  
    92  func (b *botman) UpdateCustomClientSequence(ctx context.Context, params UpdateCustomClientSequenceRequest) (*CustomClientSequenceResponse, error) {
    93  	logger := b.Log(ctx)
    94  	logger.Debug("UpdateCustomClientSequence")
    95  
    96  	if err := params.Validate(); err != nil {
    97  		return nil, fmt.Errorf("%w: %s", ErrStructValidation, err.Error())
    98  	}
    99  
   100  	uri := fmt.Sprintf(
   101  		"/appsec/v1/configs/%d/versions/%d/custom-client-sequence",
   102  		params.ConfigID,
   103  		params.Version)
   104  
   105  	req, err := http.NewRequestWithContext(ctx, http.MethodPut, uri, nil)
   106  	if err != nil {
   107  		return nil, fmt.Errorf("failed to create UpdateCustomClientSequence request: %w", err)
   108  	}
   109  
   110  	var result CustomClientSequenceResponse
   111  	resp, err := b.Exec(req, &result, params)
   112  	if err != nil {
   113  		return nil, fmt.Errorf("UpdateCustomClientSequence request failed: %w", err)
   114  	}
   115  
   116  	if resp.StatusCode != http.StatusOK {
   117  		return nil, b.Error(resp)
   118  	}
   119  
   120  	return &result, nil
   121  }