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