github.com/akamai/AkamaiOPEN-edgegrid-golang/v8@v8.1.0/pkg/appsec/configuration.go (about) 1 package appsec 2 3 import ( 4 "context" 5 "fmt" 6 "net/http" 7 8 validation "github.com/go-ozzo/ozzo-validation/v4" 9 ) 10 11 type ( 12 // The Configuration interface supports creating, retrieving, updating and deleting security configurations. 13 Configuration interface { 14 // GetConfigurations lists available security configurations. 15 // 16 // See: https://techdocs.akamai.com/application-security/reference/get-configs 17 GetConfigurations(ctx context.Context, params GetConfigurationsRequest) (*GetConfigurationsResponse, error) 18 19 // GetConfiguration retrieves the configuration details. 20 // 21 // See: https://techdocs.akamai.com/application-security/reference/get-config 22 GetConfiguration(ctx context.Context, params GetConfigurationRequest) (*GetConfigurationResponse, error) 23 24 // CreateConfiguration creates a new WAP or KSD security configuration. 25 // 26 // See: https://techdocs.akamai.com/application-security/reference/post-config 27 CreateConfiguration(ctx context.Context, params CreateConfigurationRequest) (*CreateConfigurationResponse, error) 28 29 // UpdateConfiguration updates the name of your security configuration. 30 // 31 // See: https://techdocs.akamai.com/application-security/reference/put-config 32 UpdateConfiguration(ctx context.Context, params UpdateConfigurationRequest) (*UpdateConfigurationResponse, error) 33 34 // RemoveConfiguration deletes the specified security configuration. 35 // 36 // See: https://techdocs.akamai.com/application-security/reference/delete-config 37 RemoveConfiguration(ctx context.Context, params RemoveConfigurationRequest) (*RemoveConfigurationResponse, error) 38 } 39 40 // GetConfigurationsRequest is used to list the available security configurations. 41 GetConfigurationsRequest struct { 42 ConfigID int `json:"configId"` 43 Name string `json:"-"` 44 } 45 46 // GetConfigurationsResponse is returned from a call to GetConfigurations. 47 GetConfigurationsResponse struct { 48 Configurations []struct { 49 Description string `json:"description,omitempty"` 50 FileType string `json:"fileType,omitempty"` 51 ID int `json:"id,omitempty"` 52 LatestVersion int `json:"latestVersion,omitempty"` 53 Name string `json:"name,omitempty"` 54 StagingVersion int `json:"stagingVersion,omitempty"` 55 TargetProduct string `json:"targetProduct,omitempty"` 56 ProductionHostnames []string `json:"productionHostnames,omitempty"` 57 ProductionVersion int `json:"productionVersion,omitempty"` 58 } `json:"configurations,omitempty"` 59 } 60 61 // GetConfigurationRequest GetConfigurationRequest is used to retrieve information about a specific configuration. 62 GetConfigurationRequest struct { 63 ConfigID int `json:"configId"` 64 } 65 66 // GetConfigurationResponse is returned from a call to GetConfiguration. 67 GetConfigurationResponse struct { 68 Description string `json:"description,omitempty"` 69 FileType string `json:"fileType,omitempty"` 70 ID int `json:"id,omitempty"` 71 LatestVersion int `json:"latestVersion,omitempty"` 72 Name string `json:"name,omitempty"` 73 StagingVersion int `json:"stagingVersion,omitempty"` 74 TargetProduct string `json:"targetProduct,omitempty"` 75 ProductionHostnames []string `json:"productionHostnames,omitempty"` 76 ProductionVersion int `json:"productionVersion,omitempty"` 77 } 78 79 // CreateConfigurationRequest is used to create a new WAP or KSD security configuration. 80 CreateConfigurationRequest struct { 81 Name string `json:"name"` 82 Description string `json:"description"` 83 ContractID string `json:"contractId"` 84 GroupID int `json:"groupId"` 85 Hostnames []string `json:"hostnames"` 86 } 87 88 // CreateConfigurationResponse is returned from a call to CreateConfiguration. 89 CreateConfigurationResponse struct { 90 ConfigID int `json:"configId"` 91 Version int `json:"version"` 92 Description string `json:"description"` 93 Name string `json:"name"` 94 } 95 96 // UpdateConfigurationRequest is used tdo modify the name or description of an existing security configuration. 97 UpdateConfigurationRequest struct { 98 ConfigID int `json:"-"` 99 Name string `json:"name"` 100 Description string `json:"description"` 101 } 102 103 // UpdateConfigurationResponse is returned from a call to UpdateConfiguration. 104 UpdateConfigurationResponse struct { 105 Name string `json:"name"` 106 Description string `json:"description"` 107 } 108 109 // RemoveConfigurationRequest is used to remove an existing security configuration. 110 RemoveConfigurationRequest struct { 111 ConfigID int `json:"configId"` 112 } 113 114 // RemoveConfigurationResponse is returned from a call to RemoveConfiguration. 115 RemoveConfigurationResponse struct { 116 Empty int `json:"-"` 117 } 118 ) 119 120 // Validate validates a GetConfigurationRequest. 121 func (v GetConfigurationRequest) Validate() error { 122 return validation.Errors{ 123 "ConfigID": validation.Validate(v.ConfigID, validation.Required), 124 }.Filter() 125 } 126 127 // Validate validates a GetConfigurationsRequest. 128 func (v GetConfigurationsRequest) Validate() error { 129 return validation.Errors{ 130 "ConfigID": validation.Validate(v.ConfigID, validation.Required), 131 }.Filter() 132 } 133 134 // Validate validates an UpdateConfigurationRequest. 135 func (v UpdateConfigurationRequest) Validate() error { 136 return validation.Errors{ 137 "ConfigID": validation.Validate(v.ConfigID, validation.Required), 138 }.Filter() 139 } 140 141 // Validate validates a RemoveConfigurationRequest. 142 func (v RemoveConfigurationRequest) Validate() error { 143 return validation.Errors{ 144 "ConfigID": validation.Validate(v.ConfigID, validation.Required), 145 }.Filter() 146 } 147 148 func (p *appsec) GetConfiguration(ctx context.Context, params GetConfigurationRequest) (*GetConfigurationResponse, error) { 149 logger := p.Log(ctx) 150 logger.Debug("GetConfiguration") 151 152 if err := params.Validate(); err != nil { 153 return nil, fmt.Errorf("%w: %s", ErrStructValidation, err.Error()) 154 } 155 156 var getConfigurationResponse GetConfigurationResponse 157 158 configid := params.ConfigID 159 uri := fmt.Sprintf("/appsec/v1/configs/%d", configid) 160 161 req, err := http.NewRequestWithContext(ctx, http.MethodGet, uri, nil) 162 if err != nil { 163 return nil, fmt.Errorf("failed to create GetConfiguration request: %w", err) 164 } 165 166 resp, err := p.Exec(req, &getConfigurationResponse) 167 if err != nil { 168 return nil, fmt.Errorf("get configuration request failed: %w", err) 169 } 170 171 if resp.StatusCode != http.StatusOK { 172 return nil, p.Error(resp) 173 } 174 175 return &getConfigurationResponse, nil 176 177 } 178 179 func (p *appsec) GetConfigurations(ctx context.Context, _ GetConfigurationsRequest) (*GetConfigurationsResponse, error) { 180 logger := p.Log(ctx) 181 logger.Debug("GetConfigurations") 182 183 var result GetConfigurationsResponse 184 185 uri := "/appsec/v1/configs" 186 187 req, err := http.NewRequestWithContext(ctx, http.MethodGet, uri, nil) 188 if err != nil { 189 return nil, fmt.Errorf("failed to create GetConfigurations request: %w", err) 190 } 191 192 resp, err := p.Exec(req, &result) 193 if err != nil { 194 return nil, fmt.Errorf("get configurations request failed: %w", err) 195 } 196 197 if resp.StatusCode != http.StatusOK { 198 return nil, p.Error(resp) 199 } 200 201 return &result, nil 202 } 203 204 func (p *appsec) UpdateConfiguration(ctx context.Context, params UpdateConfigurationRequest) (*UpdateConfigurationResponse, error) { 205 logger := p.Log(ctx) 206 logger.Debug("UpdateConfiguration") 207 208 if err := params.Validate(); err != nil { 209 return nil, fmt.Errorf("%w: %s", ErrStructValidation, err.Error()) 210 } 211 212 uri := fmt.Sprintf( 213 "/appsec/v1/configs/%d", 214 params.ConfigID, 215 ) 216 217 req, err := http.NewRequestWithContext(ctx, http.MethodPut, uri, nil) 218 if err != nil { 219 return nil, fmt.Errorf("failed to create UpdateConfiguration request: %w", err) 220 } 221 222 var result UpdateConfigurationResponse 223 resp, err := p.Exec(req, &result, params) 224 if err != nil { 225 return nil, fmt.Errorf("update configuration request failed: %w", err) 226 } 227 228 if resp.StatusCode != http.StatusOK && resp.StatusCode != http.StatusCreated { 229 return nil, p.Error(resp) 230 } 231 232 return &result, nil 233 } 234 235 func (p *appsec) CreateConfiguration(ctx context.Context, params CreateConfigurationRequest) (*CreateConfigurationResponse, error) { 236 logger := p.Log(ctx) 237 logger.Debug("CreateConfiguration") 238 239 uri := 240 "/appsec/v1/configs" 241 242 req, err := http.NewRequestWithContext(ctx, http.MethodPost, uri, nil) 243 if err != nil { 244 return nil, fmt.Errorf("failed to create CreateConfiguration request: %w", err) 245 } 246 247 var result CreateConfigurationResponse 248 resp, err := p.Exec(req, &result, params) 249 if err != nil { 250 return nil, fmt.Errorf("create configuration request failed: %w", err) 251 } 252 253 if resp.StatusCode != http.StatusOK && resp.StatusCode != http.StatusCreated { 254 return nil, p.Error(resp) 255 } 256 257 return &result, nil 258 } 259 260 func (p *appsec) RemoveConfiguration(ctx context.Context, params RemoveConfigurationRequest) (*RemoveConfigurationResponse, error) { 261 logger := p.Log(ctx) 262 logger.Debug("RemoveConfiguration") 263 264 if err := params.Validate(); err != nil { 265 return nil, fmt.Errorf("%w: %s", ErrStructValidation, err.Error()) 266 } 267 268 uri := fmt.Sprintf("/appsec/v1/configs/%d", params.ConfigID) 269 req, err := http.NewRequestWithContext(ctx, http.MethodDelete, uri, nil) 270 if err != nil { 271 return nil, fmt.Errorf("failed to create RemoveConfiguration request: %w", err) 272 } 273 274 var result RemoveConfigurationResponse 275 resp, err := p.Exec(req, &result) 276 if err != nil { 277 return nil, fmt.Errorf("remove configuration request failed: %w", err) 278 } 279 280 if resp.StatusCode != http.StatusNoContent && resp.StatusCode != http.StatusOK { 281 return nil, p.Error(resp) 282 } 283 284 return &result, nil 285 }