github.com/akamai/AkamaiOPEN-edgegrid-golang/v8@v8.1.0/pkg/botman/custom_deny_action.go (about) 1 package botman 2 3 import ( 4 "context" 5 "encoding/json" 6 "fmt" 7 "net/http" 8 9 validation "github.com/go-ozzo/ozzo-validation/v4" 10 ) 11 12 type ( 13 // The CustomDenyAction interface supports creating, retrieving, modifying and removing custom deny action for a 14 // configuration. 15 CustomDenyAction interface { 16 // GetCustomDenyActionList https://techdocs.akamai.com/bot-manager/reference/get-custom-deny-actions 17 GetCustomDenyActionList(ctx context.Context, params GetCustomDenyActionListRequest) (*GetCustomDenyActionListResponse, error) 18 19 // GetCustomDenyAction https://techdocs.akamai.com/bot-manager/reference/get-custom-deny-action 20 GetCustomDenyAction(ctx context.Context, params GetCustomDenyActionRequest) (map[string]interface{}, error) 21 22 // CreateCustomDenyAction https://techdocs.akamai.com/bot-manager/reference/post-custom-deny-action 23 CreateCustomDenyAction(ctx context.Context, params CreateCustomDenyActionRequest) (map[string]interface{}, error) 24 25 // UpdateCustomDenyAction https://techdocs.akamai.com/bot-manager/reference/put-custom-deny-action 26 UpdateCustomDenyAction(ctx context.Context, params UpdateCustomDenyActionRequest) (map[string]interface{}, error) 27 28 // RemoveCustomDenyAction https://techdocs.akamai.com/bot-manager/reference/delete-custom-deny-action 29 RemoveCustomDenyAction(ctx context.Context, params RemoveCustomDenyActionRequest) error 30 } 31 32 // GetCustomDenyActionListRequest is used to retrieve custom deny actions for a configuration. 33 GetCustomDenyActionListRequest struct { 34 ConfigID int64 35 Version int64 36 ActionID string 37 } 38 39 // GetCustomDenyActionListResponse is used to retrieve custom deny actions for a configuration. 40 GetCustomDenyActionListResponse struct { 41 CustomDenyActions []map[string]interface{} `json:"customDenyActions"` 42 } 43 44 // GetCustomDenyActionRequest is used to retrieve a specific custom deny action 45 GetCustomDenyActionRequest struct { 46 ConfigID int64 47 Version int64 48 ActionID string 49 } 50 51 // CreateCustomDenyActionRequest is used to create a new custom deny action for a specific configuration. 52 CreateCustomDenyActionRequest struct { 53 ConfigID int64 54 Version int64 55 JsonPayload json.RawMessage 56 } 57 58 // UpdateCustomDenyActionRequest is used to update an existing custom deny action 59 UpdateCustomDenyActionRequest struct { 60 ConfigID int64 61 Version int64 62 ActionID string 63 JsonPayload json.RawMessage 64 } 65 66 // RemoveCustomDenyActionRequest is used to remove an existing custom deny action 67 RemoveCustomDenyActionRequest struct { 68 ConfigID int64 69 Version int64 70 ActionID string 71 } 72 ) 73 74 // Validate validates a GetCustomDenyActionRequest. 75 func (v GetCustomDenyActionRequest) Validate() error { 76 return validation.Errors{ 77 "ConfigID": validation.Validate(v.ConfigID, validation.Required), 78 "Version": validation.Validate(v.Version, validation.Required), 79 "ActionID": validation.Validate(v.ActionID, validation.Required), 80 }.Filter() 81 } 82 83 // Validate validates a GetCustomDenyActionListRequest. 84 func (v GetCustomDenyActionListRequest) Validate() error { 85 return validation.Errors{ 86 "ConfigID": validation.Validate(v.ConfigID, validation.Required), 87 "Version": validation.Validate(v.Version, validation.Required), 88 }.Filter() 89 } 90 91 // Validate validates a CreateCustomDenyActionRequest. 92 func (v CreateCustomDenyActionRequest) Validate() error { 93 return validation.Errors{ 94 "ConfigID": validation.Validate(v.ConfigID, validation.Required), 95 "Version": validation.Validate(v.Version, validation.Required), 96 "JsonPayload": validation.Validate(v.JsonPayload, validation.Required), 97 }.Filter() 98 } 99 100 // Validate validates an UpdateCustomDenyActionRequest. 101 func (v UpdateCustomDenyActionRequest) Validate() error { 102 return validation.Errors{ 103 "ConfigID": validation.Validate(v.ConfigID, validation.Required), 104 "Version": validation.Validate(v.Version, validation.Required), 105 "ActionID": validation.Validate(v.ActionID, validation.Required), 106 "JsonPayload": validation.Validate(v.JsonPayload, validation.Required), 107 }.Filter() 108 } 109 110 // Validate validates a RemoveCustomDenyActionRequest. 111 func (v RemoveCustomDenyActionRequest) Validate() error { 112 return validation.Errors{ 113 "ConfigID": validation.Validate(v.ConfigID, validation.Required), 114 "Version": validation.Validate(v.Version, validation.Required), 115 "ActionID": validation.Validate(v.ActionID, validation.Required), 116 }.Filter() 117 } 118 119 func (b *botman) GetCustomDenyAction(ctx context.Context, params GetCustomDenyActionRequest) (map[string]interface{}, error) { 120 logger := b.Log(ctx) 121 logger.Debug("GetCustomDenyAction") 122 123 if err := params.Validate(); err != nil { 124 return nil, fmt.Errorf("%w: %s", ErrStructValidation, err.Error()) 125 } 126 127 uri := fmt.Sprintf( 128 "/appsec/v1/configs/%d/versions/%d/response-actions/custom-deny-actions/%s", 129 params.ConfigID, 130 params.Version, 131 params.ActionID) 132 133 req, err := http.NewRequestWithContext(ctx, http.MethodGet, uri, nil) 134 if err != nil { 135 return nil, fmt.Errorf("failed to create GetCustomDenyAction request: %w", err) 136 } 137 138 var result map[string]interface{} 139 resp, err := b.Exec(req, &result) 140 if err != nil { 141 return nil, fmt.Errorf("GetCustomDenyAction request failed: %w", err) 142 } 143 144 if resp.StatusCode != http.StatusOK { 145 return nil, b.Error(resp) 146 } 147 148 return result, nil 149 } 150 151 func (b *botman) GetCustomDenyActionList(ctx context.Context, params GetCustomDenyActionListRequest) (*GetCustomDenyActionListResponse, error) { 152 logger := b.Log(ctx) 153 logger.Debug("GetCustomDenyActionList") 154 155 if err := params.Validate(); err != nil { 156 return nil, fmt.Errorf("%w: %s", ErrStructValidation, err.Error()) 157 } 158 159 uri := fmt.Sprintf( 160 "/appsec/v1/configs/%d/versions/%d/response-actions/custom-deny-actions", 161 params.ConfigID, 162 params.Version, 163 ) 164 165 req, err := http.NewRequestWithContext(ctx, http.MethodGet, uri, nil) 166 if err != nil { 167 return nil, fmt.Errorf("failed to create GetlustomDenyList request: %w", err) 168 } 169 170 var result GetCustomDenyActionListResponse 171 resp, err := b.Exec(req, &result) 172 if err != nil { 173 return nil, fmt.Errorf("GetCustomDenyActionList request failed: %w", err) 174 } 175 176 if resp.StatusCode != http.StatusOK { 177 return nil, b.Error(resp) 178 } 179 180 var filteredResult GetCustomDenyActionListResponse 181 if params.ActionID != "" { 182 for _, val := range result.CustomDenyActions { 183 if val["actionId"].(string) == params.ActionID { 184 filteredResult.CustomDenyActions = append(filteredResult.CustomDenyActions, val) 185 } 186 } 187 } else { 188 filteredResult = result 189 } 190 return &filteredResult, nil 191 } 192 193 func (b *botman) UpdateCustomDenyAction(ctx context.Context, params UpdateCustomDenyActionRequest) (map[string]interface{}, error) { 194 logger := b.Log(ctx) 195 logger.Debug("UpdateCustomDenyAction") 196 197 if err := params.Validate(); err != nil { 198 return nil, fmt.Errorf("%w: %s", ErrStructValidation, err.Error()) 199 } 200 201 putURL := fmt.Sprintf( 202 "/appsec/v1/configs/%d/versions/%d/response-actions/custom-deny-actions/%s", 203 params.ConfigID, 204 params.Version, 205 params.ActionID, 206 ) 207 208 req, err := http.NewRequestWithContext(ctx, http.MethodPut, putURL, nil) 209 if err != nil { 210 return nil, fmt.Errorf("failed to create UpdateCustomDenyAction request: %w", err) 211 } 212 213 var result map[string]interface{} 214 resp, err := b.Exec(req, &result, params.JsonPayload) 215 if err != nil { 216 return nil, fmt.Errorf("UpdateCustomDenyAction request failed: %w", err) 217 } 218 219 if resp.StatusCode != http.StatusOK { 220 return nil, b.Error(resp) 221 } 222 223 return result, nil 224 } 225 226 func (b *botman) CreateCustomDenyAction(ctx context.Context, params CreateCustomDenyActionRequest) (map[string]interface{}, error) { 227 logger := b.Log(ctx) 228 logger.Debug("CreateCustomDenyAction") 229 230 if err := params.Validate(); err != nil { 231 return nil, fmt.Errorf("%w: %s", ErrStructValidation, err.Error()) 232 } 233 234 uri := fmt.Sprintf( 235 "/appsec/v1/configs/%d/versions/%d/response-actions/custom-deny-actions", 236 params.ConfigID, 237 params.Version, 238 ) 239 240 req, err := http.NewRequestWithContext(ctx, http.MethodPost, uri, nil) 241 if err != nil { 242 return nil, fmt.Errorf("failed to create CreateCustomDenyAction request: %w", err) 243 } 244 245 var result map[string]interface{} 246 resp, err := b.Exec(req, &result, params.JsonPayload) 247 if err != nil { 248 return nil, fmt.Errorf("CreateCustomDenyAction request failed: %w", err) 249 } 250 251 if resp.StatusCode != http.StatusCreated { 252 return nil, b.Error(resp) 253 } 254 255 return result, nil 256 } 257 258 func (b *botman) RemoveCustomDenyAction(ctx context.Context, params RemoveCustomDenyActionRequest) error { 259 logger := b.Log(ctx) 260 logger.Debug("RemoveCustomDenyAction") 261 262 if err := params.Validate(); err != nil { 263 return fmt.Errorf("%w: %s", ErrStructValidation, err.Error()) 264 } 265 266 uri := fmt.Sprintf( 267 "/appsec/v1/configs/%d/versions/%d/response-actions/custom-deny-actions/%s", 268 params.ConfigID, 269 params.Version, 270 params.ActionID) 271 272 req, err := http.NewRequestWithContext(ctx, http.MethodDelete, uri, nil) 273 if err != nil { 274 return fmt.Errorf("failed to create RemoveCustomDenyAction request: %w", err) 275 } 276 277 var result map[string]interface{} 278 resp, err := b.Exec(req, &result) 279 if err != nil { 280 return fmt.Errorf("RemoveCustomDenyAction request failed: %w", err) 281 } 282 283 if resp.StatusCode != http.StatusNoContent { 284 return b.Error(resp) 285 } 286 287 return nil 288 }