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

     1  package appsec
     2  
     3  import (
     4  	"context"
     5  	"fmt"
     6  	"net/http"
     7  
     8  	"time"
     9  
    10  	validation "github.com/go-ozzo/ozzo-validation/v4"
    11  )
    12  
    13  type (
    14  	// The ConfigurationVersionClone interface supports creating, retrieving, and removing
    15  	// clones of a configuration version.
    16  	ConfigurationVersionClone interface {
    17  		// GetConfigurationVersionClone returns basic detail about a configuration version.
    18  		//
    19  		// See: https://techdocs.akamai.com/application-security/reference/get-version-number
    20  		GetConfigurationVersionClone(ctx context.Context, params GetConfigurationVersionCloneRequest) (*GetConfigurationVersionCloneResponse, error)
    21  
    22  		// CreateConfigurationVersionClone  creates a new version of the specified security configuration.
    23  		//
    24  		// See: https://techdocs.akamai.com/application-security/reference/post-config-versions
    25  		CreateConfigurationVersionClone(ctx context.Context, params CreateConfigurationVersionCloneRequest) (*CreateConfigurationVersionCloneResponse, error)
    26  
    27  		// RemoveConfigurationVersionClone deletes the specified configuration version.
    28  		//
    29  		// See: https://techdocs.akamai.com/application-security/reference/delete-version-number
    30  		RemoveConfigurationVersionClone(ctx context.Context, params RemoveConfigurationVersionCloneRequest) (*RemoveConfigurationVersionCloneResponse, error)
    31  	}
    32  
    33  	// GetConfigurationVersionCloneRequest is used to retrieve information about an existing configuration version.
    34  	GetConfigurationVersionCloneRequest struct {
    35  		ConfigID     int       `json:"configId"`
    36  		ConfigName   string    `json:"configName"`
    37  		Version      int       `json:"version"`
    38  		VersionNotes string    `json:"versionNotes"`
    39  		CreateDate   time.Time `json:"createDate"`
    40  		CreatedBy    string    `json:"createdBy"`
    41  		BasedOn      int       `json:"basedOn"`
    42  		Production   struct {
    43  			Status string    `json:"status"`
    44  			Time   time.Time `json:"time"`
    45  		} `json:"production"`
    46  		Staging struct {
    47  			Status string `json:"status"`
    48  		} `json:"staging"`
    49  	}
    50  
    51  	// GetConfigurationVersionCloneResponse is returned from a call to GetConfigurationVersionClone.
    52  	GetConfigurationVersionCloneResponse struct {
    53  		ConfigID     int       `json:"configId"`
    54  		ConfigName   string    `json:"configName"`
    55  		Version      int       `json:"version"`
    56  		VersionNotes string    `json:"versionNotes"`
    57  		CreateDate   time.Time `json:"createDate"`
    58  		CreatedBy    string    `json:"createdBy"`
    59  		BasedOn      int       `json:"basedOn"`
    60  		Production   struct {
    61  			Status string    `json:"status"`
    62  			Time   time.Time `json:"time"`
    63  		} `json:"production"`
    64  		Staging struct {
    65  			Status string `json:"status"`
    66  		} `json:"staging"`
    67  	}
    68  
    69  	// CreateConfigurationVersionCloneRequest is used to clone an existing configuration version.
    70  	CreateConfigurationVersionCloneRequest struct {
    71  		ConfigID          int  `json:"-"`
    72  		CreateFromVersion int  `json:"createFromVersion"`
    73  		RuleUpdate        bool `json:"ruleUpdate"`
    74  	}
    75  
    76  	// CreateConfigurationVersionCloneResponse is returned from a call to CreateConfigurationVersionClone.
    77  	CreateConfigurationVersionCloneResponse struct {
    78  		ConfigID     int       `json:"configId"`
    79  		ConfigName   string    `json:"configName"`
    80  		Version      int       `json:"version"`
    81  		VersionNotes string    `json:"versionNotes"`
    82  		CreateDate   time.Time `json:"createDate"`
    83  		CreatedBy    string    `json:"createdBy"`
    84  		BasedOn      int       `json:"basedOn"`
    85  		Production   struct {
    86  			Status string    `json:"status"`
    87  			Time   time.Time `json:"time"`
    88  		} `json:"production"`
    89  		Staging struct {
    90  			Status string `json:"status"`
    91  		} `json:"staging"`
    92  	}
    93  
    94  	// RemoveConfigurationVersionCloneRequest is used to remove an existing configuration version.
    95  	RemoveConfigurationVersionCloneRequest struct {
    96  		ConfigID int `json:"-"`
    97  		Version  int `json:"-"`
    98  	}
    99  
   100  	// RemoveConfigurationVersionCloneResponse is returned from a call to RemoveConfigurationVersionClone.
   101  	RemoveConfigurationVersionCloneResponse struct {
   102  		Empty string `json:"-"`
   103  	}
   104  )
   105  
   106  // Validate validates a GetConfigurationCloneRequest.
   107  func (v GetConfigurationVersionCloneRequest) Validate() error {
   108  	return validation.Errors{
   109  		"ConfigID": validation.Validate(v.ConfigID, validation.Required),
   110  		"Version":  validation.Validate(v.Version, validation.Required),
   111  	}.Filter()
   112  }
   113  
   114  // Validate validates a CreateConfigurationCloneRequest.
   115  func (v CreateConfigurationVersionCloneRequest) Validate() error {
   116  	return validation.Errors{
   117  		"ConfigID": validation.Validate(v.ConfigID, validation.Required),
   118  		"Version":  validation.Validate(v.CreateFromVersion, validation.Required),
   119  	}.Filter()
   120  }
   121  
   122  // Validate validates a RemoveConfigurationCloneRequest.
   123  func (v RemoveConfigurationVersionCloneRequest) Validate() error {
   124  	return validation.Errors{
   125  		"ConfigID": validation.Validate(v.ConfigID, validation.Required),
   126  		"Version":  validation.Validate(v.Version, validation.Required),
   127  	}.Filter()
   128  }
   129  
   130  func (p *appsec) GetConfigurationVersionClone(ctx context.Context, params GetConfigurationVersionCloneRequest) (*GetConfigurationVersionCloneResponse, error) {
   131  	logger := p.Log(ctx)
   132  	logger.Debug("GetConfigurationVersionClone")
   133  
   134  	if err := params.Validate(); err != nil {
   135  		return nil, fmt.Errorf("%w: %s", ErrStructValidation, err.Error())
   136  	}
   137  
   138  	uri := fmt.Sprintf(
   139  		"/appsec/v1/configs/%d/versions/%d",
   140  		params.ConfigID,
   141  		params.Version)
   142  
   143  	req, err := http.NewRequestWithContext(ctx, http.MethodGet, uri, nil)
   144  	if err != nil {
   145  		return nil, fmt.Errorf("failed to create GetConfigurationVersionClone request: %w", err)
   146  	}
   147  
   148  	var result GetConfigurationVersionCloneResponse
   149  	resp, err := p.Exec(req, &result)
   150  	if err != nil {
   151  		return nil, fmt.Errorf("get configuration version clone request failed: %w", err)
   152  	}
   153  	if resp.StatusCode != http.StatusOK {
   154  		return nil, p.Error(resp)
   155  	}
   156  
   157  	return &result, nil
   158  }
   159  
   160  func (p *appsec) CreateConfigurationVersionClone(ctx context.Context, params CreateConfigurationVersionCloneRequest) (*CreateConfigurationVersionCloneResponse, error) {
   161  	logger := p.Log(ctx)
   162  	logger.Debug("CreateConfigurationVersionClone")
   163  
   164  	if err := params.Validate(); err != nil {
   165  		return nil, fmt.Errorf("%w: %s", ErrStructValidation, err.Error())
   166  	}
   167  
   168  	uri := fmt.Sprintf("/appsec/v1/configs/%d/versions", params.ConfigID)
   169  
   170  	req, err := http.NewRequestWithContext(ctx, http.MethodPost, uri, nil)
   171  	if err != nil {
   172  		return nil, fmt.Errorf("failed to create CreateConfigurationVersionClone request: %w", err)
   173  	}
   174  
   175  	var result CreateConfigurationVersionCloneResponse
   176  	resp, err := p.Exec(req, &result, params)
   177  	if err != nil {
   178  		return nil, fmt.Errorf("create configuration version clone request failed: %w", err)
   179  	}
   180  	if resp.StatusCode != http.StatusOK && resp.StatusCode != http.StatusCreated {
   181  		return nil, p.Error(resp)
   182  	}
   183  
   184  	return &result, nil
   185  }
   186  
   187  func (p *appsec) RemoveConfigurationVersionClone(ctx context.Context, params RemoveConfigurationVersionCloneRequest) (*RemoveConfigurationVersionCloneResponse, error) {
   188  	logger := p.Log(ctx)
   189  	logger.Debug("RemoveConfigurationVersionClone")
   190  
   191  	if err := params.Validate(); err != nil {
   192  		return nil, fmt.Errorf("%w: %s", ErrStructValidation, err.Error())
   193  	}
   194  
   195  	uri := fmt.Sprintf("/appsec/v1/configs/%d/versions/%d", params.ConfigID, params.Version)
   196  	req, err := http.NewRequestWithContext(ctx, http.MethodDelete, uri, nil)
   197  	if err != nil {
   198  		return nil, fmt.Errorf("failed to create RemoveConfigurationVersionClone request: %w", err)
   199  	}
   200  
   201  	var result RemoveConfigurationVersionCloneResponse
   202  	resp, err := p.Exec(req, &result)
   203  	if err != nil {
   204  		return nil, fmt.Errorf("remove configuration version clone request failed: %w", err)
   205  	}
   206  	if resp.StatusCode != http.StatusNoContent && resp.StatusCode != http.StatusOK {
   207  		return nil, p.Error(resp)
   208  	}
   209  
   210  	return &result, nil
   211  }