github.com/akamai/AkamaiOPEN-edgegrid-golang/v2@v2.17.0/pkg/appsec/api_request_constraints.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 ApiRequestConstraints interface supports retrieving, modifying, or removing the action 13 // taken when any API request constraint is triggered, or when a specific API request constraint 14 // is triggered. 15 // 16 // https://developer.akamai.com/api/cloud_security/application_security/v1.html#apirequestconstraintsgroup 17 ApiRequestConstraints interface { 18 // https://developer.akamai.com/api/cloud_security/application_security/v1.html#getapirequestconstraints 19 GetApiRequestConstraints(ctx context.Context, params GetApiRequestConstraintsRequest) (*GetApiRequestConstraintsResponse, error) 20 21 // https://developer.akamai.com/api/cloud_security/application_security/v1.html#putapirequestconstraints 22 // https://developer.akamai.com/api/cloud_security/application_security/v1.html#putactionsperapi 23 UpdateApiRequestConstraints(ctx context.Context, params UpdateApiRequestConstraintsRequest) (*UpdateApiRequestConstraintsResponse, error) 24 25 // https://developer.akamai.com/api/cloud_security/application_security/v1.html#putapirequestconstraints 26 // https://developer.akamai.com/api/cloud_security/application_security/v1.html#putactionsperapi 27 RemoveApiRequestConstraints(ctx context.Context, params RemoveApiRequestConstraintsRequest) (*RemoveApiRequestConstraintsResponse, error) 28 } 29 30 // GetApiRequestConstraintsRequest is used to retrieve the list of APIs with their constraints and associated actions. 31 GetApiRequestConstraintsRequest struct { 32 ConfigID int `json:"-"` 33 Version int `json:"-"` 34 PolicyID string `json:"-"` 35 ApiID int `json:"-"` 36 } 37 38 // GetApiRequestConstraintsResponse is returned from a call to GetApiRequestConstraints. 39 GetApiRequestConstraintsResponse struct { 40 APIEndpoints []ApiEndpoint `json:"apiEndpoints,omitempty"` 41 } 42 43 // ApiEndpoint describes an API endpoint and its associated action. 44 ApiEndpoint struct { 45 ID int `json:"id"` 46 Action string `json:"action"` 47 } 48 49 // UpdateApiRequestConstraintsRequest is used to modify the action taken when an API request contraint is triggered. 50 UpdateApiRequestConstraintsRequest struct { 51 ConfigID int `json:"-"` 52 Version int `json:"-"` 53 PolicyID string `json:"-"` 54 ApiID int `json:"-"` 55 Action string `json:"action"` 56 } 57 58 // UpdateApiRequestConstraintsResponse is returned from a call to UpdateApiRequestConstraints. 59 UpdateApiRequestConstraintsResponse struct { 60 Action string `json:"action"` 61 } 62 63 // RemoveApiRequestConstraintsRequest is used to remove an API request constraint's action. 64 RemoveApiRequestConstraintsRequest struct { 65 ConfigID int `json:"-"` 66 Version int `json:"-"` 67 PolicyID string `json:"-"` 68 ApiID int `json:"-"` 69 Action string `json:"action"` 70 } 71 72 // RemoveApiRequestConstraintsResponse is returned from a call to RemoveApiRequestConstraints. 73 RemoveApiRequestConstraintsResponse struct { 74 Action string `json:"action"` 75 } 76 ) 77 78 // Validate validates a GetApiRequestConstraintsRequest. 79 func (v GetApiRequestConstraintsRequest) Validate() error { 80 return validation.Errors{ 81 "ConfigID": validation.Validate(v.ConfigID, validation.Required), 82 "Version": validation.Validate(v.Version, validation.Required), 83 "PolicyID": validation.Validate(v.PolicyID, validation.Required), 84 }.Filter() 85 } 86 87 // Validate validates an UpdateApiRequestConstraintsRequest. 88 func (v UpdateApiRequestConstraintsRequest) Validate() error { 89 return validation.Errors{ 90 "ConfigID": validation.Validate(v.ConfigID, validation.Required), 91 "Version": validation.Validate(v.Version, validation.Required), 92 "PolicyID": validation.Validate(v.PolicyID, validation.Required), 93 }.Filter() 94 } 95 96 // Validate validates a RemoveApiRequestConstraintsRequest. 97 func (v RemoveApiRequestConstraintsRequest) Validate() error { 98 return validation.Errors{ 99 "ConfigID": validation.Validate(v.ConfigID, validation.Required), 100 "Version": validation.Validate(v.Version, validation.Required), 101 "PolicyID": validation.Validate(v.PolicyID, validation.Required), 102 }.Filter() 103 } 104 105 func (p *appsec) GetApiRequestConstraints(ctx context.Context, params GetApiRequestConstraintsRequest) (*GetApiRequestConstraintsResponse, error) { 106 logger := p.Log(ctx) 107 logger.Debug("GetApiRequestConstraints") 108 109 if err := params.Validate(); err != nil { 110 return nil, fmt.Errorf("%w: %s", ErrStructValidation, err.Error()) 111 } 112 113 uri := fmt.Sprintf( 114 "/appsec/v1/configs/%d/versions/%d/security-policies/%s/api-request-constraints", 115 params.ConfigID, 116 params.Version, 117 params.PolicyID) 118 119 req, err := http.NewRequestWithContext(ctx, http.MethodGet, uri, nil) 120 if err != nil { 121 return nil, fmt.Errorf("failed to create GetApiRequestConstraints request: %w", err) 122 } 123 124 var result GetApiRequestConstraintsResponse 125 resp, err := p.Exec(req, &result) 126 if err != nil { 127 return nil, fmt.Errorf("get API request constraints request failed: %w", err) 128 } 129 if resp.StatusCode != http.StatusOK { 130 return nil, p.Error(resp) 131 } 132 133 if params.ApiID != 0 { 134 var filteredResult GetApiRequestConstraintsResponse 135 for _, val := range result.APIEndpoints { 136 if val.ID == params.ApiID { 137 filteredResult.APIEndpoints = append(filteredResult.APIEndpoints, val) 138 } 139 } 140 return &filteredResult, nil 141 } 142 143 return &result, nil 144 } 145 146 func (p *appsec) UpdateApiRequestConstraints(ctx context.Context, params UpdateApiRequestConstraintsRequest) (*UpdateApiRequestConstraintsResponse, error) { 147 logger := p.Log(ctx) 148 logger.Debug("UpdateApiRequestConstraints") 149 150 if err := params.Validate(); err != nil { 151 return nil, fmt.Errorf("%w: %s", ErrStructValidation, err.Error()) 152 } 153 154 var uri string 155 if params.ApiID != 0 { 156 uri = fmt.Sprintf( 157 "/appsec/v1/configs/%d/versions/%d/security-policies/%s/api-request-constraints/%d", 158 params.ConfigID, 159 params.Version, 160 params.PolicyID, 161 params.ApiID, 162 ) 163 } else { 164 uri = fmt.Sprintf( 165 "/appsec/v1/configs/%d/versions/%d/security-policies/%s/api-request-constraints", 166 params.ConfigID, 167 params.Version, 168 params.PolicyID, 169 ) 170 } 171 172 req, err := http.NewRequestWithContext(ctx, http.MethodPut, uri, nil) 173 if err != nil { 174 return nil, fmt.Errorf("failed to create UpdateApiRequestConstraints request: %w", err) 175 } 176 177 var result UpdateApiRequestConstraintsResponse 178 resp, err := p.Exec(req, &result, params) 179 if err != nil { 180 return nil, fmt.Errorf("update API request constraints request failed: %w", err) 181 } 182 183 if resp.StatusCode != http.StatusOK && resp.StatusCode != http.StatusCreated { 184 return nil, p.Error(resp) 185 } 186 187 return &result, nil 188 } 189 190 func (p *appsec) RemoveApiRequestConstraints(ctx context.Context, params RemoveApiRequestConstraintsRequest) (*RemoveApiRequestConstraintsResponse, error) { 191 logger := p.Log(ctx) 192 logger.Debug("RemoveApiRequestConstraints") 193 194 if err := params.Validate(); err != nil { 195 return nil, fmt.Errorf("%w: %s", ErrStructValidation, err.Error()) 196 } 197 198 var uri string 199 if params.ApiID != 0 { 200 uri = fmt.Sprintf( 201 "/appsec/v1/configs/%d/versions/%d/security-policies/%s/api-request-constraints/%d", 202 params.ConfigID, 203 params.Version, 204 params.PolicyID, 205 params.ApiID, 206 ) 207 } else { 208 uri = fmt.Sprintf( 209 "/appsec/v1/configs/%d/versions/%d/security-policies/%s/api-request-constraints", 210 params.ConfigID, 211 params.Version, 212 params.PolicyID, 213 ) 214 } 215 216 req, err := http.NewRequestWithContext(ctx, http.MethodPut, uri, nil) 217 if err != nil { 218 return nil, fmt.Errorf("failed to create RemoveApiRequestConstraints request: %w", err) 219 } 220 221 var result RemoveApiRequestConstraintsResponse 222 resp, err := p.Exec(req, &result, params) 223 if err != nil { 224 return nil, fmt.Errorf("remove API request constraints request failed: %w", err) 225 } 226 227 if resp.StatusCode != http.StatusOK && resp.StatusCode != http.StatusCreated { 228 return nil, p.Error(resp) 229 } 230 231 return &result, nil 232 }