github.com/akamai/AkamaiOPEN-edgegrid-golang/v8@v8.1.0/pkg/botman/conditional_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 ConditionalAction interface supports creating, retrieving, modifying and removing conditional action for a 14 // configuration. 15 ConditionalAction interface { 16 // GetConditionalActionList https://techdocs.akamai.com/bot-manager/reference/get-conditional-actions 17 GetConditionalActionList(ctx context.Context, params GetConditionalActionListRequest) (*GetConditionalActionListResponse, error) 18 19 // GetConditionalAction https://techdocs.akamai.com/bot-manager/reference/get-conditional-action 20 GetConditionalAction(ctx context.Context, params GetConditionalActionRequest) (map[string]interface{}, error) 21 22 // CreateConditionalAction https://techdocs.akamai.com/bot-manager/reference/post-conditional-action 23 CreateConditionalAction(ctx context.Context, params CreateConditionalActionRequest) (map[string]interface{}, error) 24 25 // UpdateConditionalAction https://techdocs.akamai.com/bot-manager/reference/put-conditional-action 26 UpdateConditionalAction(ctx context.Context, params UpdateConditionalActionRequest) (map[string]interface{}, error) 27 28 // RemoveConditionalAction https://techdocs.akamai.com/bot-manager/reference/delete-conditional-action 29 RemoveConditionalAction(ctx context.Context, params RemoveConditionalActionRequest) error 30 } 31 32 // GetConditionalActionListRequest is used to retrieve conditional actions for a configuration. 33 GetConditionalActionListRequest struct { 34 ConfigID int64 35 Version int64 36 ActionID string 37 } 38 39 // GetConditionalActionListResponse is used to retrieve conditional actions for a configuration. 40 GetConditionalActionListResponse struct { 41 ConditionalActions []map[string]interface{} `json:"conditionalActions"` 42 } 43 44 // GetConditionalActionRequest is used to retrieve a specific conditional action 45 GetConditionalActionRequest struct { 46 ConfigID int64 47 Version int64 48 ActionID string 49 } 50 51 // CreateConditionalActionRequest is used to create a new conditional action for a specific configuration. 52 CreateConditionalActionRequest struct { 53 ConfigID int64 54 Version int64 55 JsonPayload json.RawMessage 56 } 57 58 // UpdateConditionalActionRequest is used to update an existing conditional action 59 UpdateConditionalActionRequest struct { 60 ConfigID int64 61 Version int64 62 ActionID string 63 JsonPayload json.RawMessage 64 } 65 66 // RemoveConditionalActionRequest is used to remove an existing conditional action 67 RemoveConditionalActionRequest struct { 68 ConfigID int64 69 Version int64 70 ActionID string 71 } 72 ) 73 74 // Validate validates a GetConditionalActionRequest. 75 func (v GetConditionalActionRequest) 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 GetConditionalActionListRequest. 84 func (v GetConditionalActionListRequest) 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 CreateConditionalActionRequest. 92 func (v CreateConditionalActionRequest) 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 UpdateConditionalActionRequest. 101 func (v UpdateConditionalActionRequest) 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 RemoveConditionalActionRequest. 111 func (v RemoveConditionalActionRequest) 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) GetConditionalAction(ctx context.Context, params GetConditionalActionRequest) (map[string]interface{}, error) { 120 logger := b.Log(ctx) 121 logger.Debug("GetConditionalAction") 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/conditional-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 GetConditionalAction 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("GetConditionalAction 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) GetConditionalActionList(ctx context.Context, params GetConditionalActionListRequest) (*GetConditionalActionListResponse, error) { 152 logger := b.Log(ctx) 153 logger.Debug("GetConditionalActionList") 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/conditional-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 GetConditionalActionListResponse 171 resp, err := b.Exec(req, &result) 172 if err != nil { 173 return nil, fmt.Errorf("GetConditionalActionList request failed: %w", err) 174 } 175 176 if resp.StatusCode != http.StatusOK { 177 return nil, b.Error(resp) 178 } 179 180 var filteredResult GetConditionalActionListResponse 181 if params.ActionID != "" { 182 for _, val := range result.ConditionalActions { 183 if val["actionId"].(string) == params.ActionID { 184 filteredResult.ConditionalActions = append(filteredResult.ConditionalActions, val) 185 } 186 } 187 } else { 188 filteredResult = result 189 } 190 return &filteredResult, nil 191 } 192 193 func (b *botman) UpdateConditionalAction(ctx context.Context, params UpdateConditionalActionRequest) (map[string]interface{}, error) { 194 logger := b.Log(ctx) 195 logger.Debug("UpdateConditionalAction") 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/conditional-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 UpdateConditionalAction 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("UpdateConditionalAction 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) CreateConditionalAction(ctx context.Context, params CreateConditionalActionRequest) (map[string]interface{}, error) { 227 logger := b.Log(ctx) 228 logger.Debug("CreateConditionalAction") 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/conditional-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 CreateConditionalAction 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("CreateConditionalAction 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) RemoveConditionalAction(ctx context.Context, params RemoveConditionalActionRequest) error { 259 logger := b.Log(ctx) 260 logger.Debug("RemoveConditionalAction") 261 262 if err := params.Validate(); err != nil { 263 return fmt.Errorf("%w: %s", ErrStructValidation, err.Error()) 264 } 265 266 uri := fmt.Sprintf("/appsec/v1/configs/%d/versions/%d/response-actions/conditional-actions/%s", 267 params.ConfigID, 268 params.Version, 269 params.ActionID) 270 271 req, err := http.NewRequestWithContext(ctx, http.MethodDelete, uri, nil) 272 if err != nil { 273 return fmt.Errorf("failed to create RemoveConditionalAction request: %w", err) 274 } 275 276 var result map[string]interface{} 277 resp, err := b.Exec(req, &result) 278 if err != nil { 279 return fmt.Errorf("RemoveConditionalAction request failed: %w", err) 280 } 281 282 if resp.StatusCode != http.StatusNoContent { 283 return b.Error(resp) 284 } 285 286 return nil 287 }