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