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 }