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 }