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