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