github.com/akamai/AkamaiOPEN-edgegrid-golang/v8@v8.1.0/pkg/botman/custom_defined_bot.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 CustomDefinedBot interface supports creating, retrieving, modifying and removing custom defined bots for a 14 // configuration. 15 CustomDefinedBot interface { 16 // GetCustomDefinedBotList https://techdocs.akamai.com/bot-manager/reference/get-custom-defined-bots 17 GetCustomDefinedBotList(ctx context.Context, params GetCustomDefinedBotListRequest) (*GetCustomDefinedBotListResponse, error) 18 19 // GetCustomDefinedBot https://techdocs.akamai.com/bot-manager/reference/get-custom-defined-bot 20 GetCustomDefinedBot(ctx context.Context, params GetCustomDefinedBotRequest) (map[string]interface{}, error) 21 22 // CreateCustomDefinedBot https://techdocs.akamai.com/bot-manager/reference/post-custom-defined-bot 23 CreateCustomDefinedBot(ctx context.Context, params CreateCustomDefinedBotRequest) (map[string]interface{}, error) 24 25 // UpdateCustomDefinedBot https://techdocs.akamai.com/bot-manager/reference/put-custom-defined-bot 26 UpdateCustomDefinedBot(ctx context.Context, params UpdateCustomDefinedBotRequest) (map[string]interface{}, error) 27 28 // RemoveCustomDefinedBot https://techdocs.akamai.com/bot-manager/reference/delete-custom-defined-bot 29 RemoveCustomDefinedBot(ctx context.Context, params RemoveCustomDefinedBotRequest) error 30 } 31 32 // GetCustomDefinedBotListRequest is used to retrieve the custom defined bots for a configuration. 33 GetCustomDefinedBotListRequest struct { 34 ConfigID int64 35 Version int64 36 BotID string 37 } 38 39 // GetCustomDefinedBotListResponse is used to retrieve the custom defined bots for a configuration. 40 GetCustomDefinedBotListResponse struct { 41 Bots []map[string]interface{} `json:"bots"` 42 } 43 44 // GetCustomDefinedBotRequest is used to retrieve a specific custom defined bot. 45 GetCustomDefinedBotRequest struct { 46 ConfigID int64 47 Version int64 48 BotID string 49 } 50 51 // CreateCustomDefinedBotRequest is used to create a new custom defined bot for a specific configuration. 52 CreateCustomDefinedBotRequest struct { 53 ConfigID int64 54 Version int64 55 JsonPayload json.RawMessage 56 } 57 58 // UpdateCustomDefinedBotRequest is used to update details for a specific custom defined bot. 59 UpdateCustomDefinedBotRequest struct { 60 ConfigID int64 61 Version int64 62 BotID string 63 JsonPayload json.RawMessage 64 } 65 66 // RemoveCustomDefinedBotRequest is used to remove an existing custom defined bot. 67 RemoveCustomDefinedBotRequest struct { 68 ConfigID int64 69 Version int64 70 BotID string 71 } 72 ) 73 74 // Validate validates a GetCustomDefinedBotRequest. 75 func (v GetCustomDefinedBotRequest) Validate() error { 76 return validation.Errors{ 77 "ConfigID": validation.Validate(v.ConfigID, validation.Required), 78 "Version": validation.Validate(v.Version, validation.Required), 79 "BotID": validation.Validate(v.BotID, validation.Required), 80 }.Filter() 81 } 82 83 // Validate validates a GetCustomDefinedBotsRequest. 84 func (v GetCustomDefinedBotListRequest) 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 CreateCustomDefinedBotRequest. 92 func (v CreateCustomDefinedBotRequest) 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 UpdateCustomDefinedBotRequest. 101 func (v UpdateCustomDefinedBotRequest) Validate() error { 102 return validation.Errors{ 103 "ConfigID": validation.Validate(v.ConfigID, validation.Required), 104 "Version": validation.Validate(v.Version, validation.Required), 105 "BotID": validation.Validate(v.BotID, validation.Required), 106 "JsonPayload": validation.Validate(v.JsonPayload, validation.Required), 107 }.Filter() 108 } 109 110 // Validate validates a RemoveCustomDefinedBotRequest. 111 func (v RemoveCustomDefinedBotRequest) Validate() error { 112 return validation.Errors{ 113 "ConfigID": validation.Validate(v.ConfigID, validation.Required), 114 "Version": validation.Validate(v.Version, validation.Required), 115 "BotID": validation.Validate(v.BotID, validation.Required), 116 }.Filter() 117 } 118 119 func (b *botman) GetCustomDefinedBot(ctx context.Context, params GetCustomDefinedBotRequest) (map[string]interface{}, error) { 120 logger := b.Log(ctx) 121 logger.Debug("GetCustomDefinedBot") 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/custom-defined-bots/%s", 129 params.ConfigID, 130 params.Version, 131 params.BotID) 132 133 req, err := http.NewRequestWithContext(ctx, http.MethodGet, uri, nil) 134 if err != nil { 135 return nil, fmt.Errorf("failed to create GetCustomDefinedBot 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("GetCustomDefinedBot 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) GetCustomDefinedBotList(ctx context.Context, params GetCustomDefinedBotListRequest) (*GetCustomDefinedBotListResponse, error) { 152 logger := b.Log(ctx) 153 logger.Debug("GetCustomDefinedBotList") 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/custom-defined-bots", 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 GetCustomDefinedBotListResponse 171 resp, err := b.Exec(req, &result) 172 if err != nil { 173 return nil, fmt.Errorf("GetCustomDefinedBotList request failed: %w", err) 174 } 175 176 if resp.StatusCode != http.StatusOK { 177 return nil, b.Error(resp) 178 } 179 180 var filteredResult GetCustomDefinedBotListResponse 181 if params.BotID != "" { 182 for _, val := range result.Bots { 183 if val["botId"].(string) == params.BotID { 184 filteredResult.Bots = append(filteredResult.Bots, val) 185 } 186 } 187 } else { 188 filteredResult = result 189 } 190 return &filteredResult, nil 191 } 192 193 func (b *botman) UpdateCustomDefinedBot(ctx context.Context, params UpdateCustomDefinedBotRequest) (map[string]interface{}, error) { 194 logger := b.Log(ctx) 195 logger.Debug("UpdateCustomDefinedBot") 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/custom-defined-bots/%s", 203 params.ConfigID, 204 params.Version, 205 params.BotID, 206 ) 207 208 req, err := http.NewRequestWithContext(ctx, http.MethodPut, putURL, nil) 209 if err != nil { 210 return nil, fmt.Errorf("failed to create UpdateCustomDefinedBot 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("UpdateCustomDefinedBot 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) CreateCustomDefinedBot(ctx context.Context, params CreateCustomDefinedBotRequest) (map[string]interface{}, error) { 227 logger := b.Log(ctx) 228 logger.Debug("CreateCustomDefinedBot") 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/custom-defined-bots", 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 CreateCustomDefinedBot 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("CreateCustomDefinedBot 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) RemoveCustomDefinedBot(ctx context.Context, params RemoveCustomDefinedBotRequest) error { 259 logger := b.Log(ctx) 260 logger.Debug("RemoveCustomDefinedBot") 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/custom-defined-bots/%s", 267 params.ConfigID, 268 params.Version, 269 params.BotID) 270 271 req, err := http.NewRequestWithContext(ctx, http.MethodDelete, uri, nil) 272 if err != nil { 273 return fmt.Errorf("failed to create RemoveCustomDefinedBot 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("RemoveCustomDefinedBot request failed: %w", err) 280 } 281 282 if resp.StatusCode != http.StatusNoContent { 283 return b.Error(resp) 284 } 285 286 return nil 287 }