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