github.com/akamai/AkamaiOPEN-edgegrid-golang/v8@v8.1.0/pkg/botman/akamai_bot_category_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 AkamaiBotCategoryAction interface supports retrieving and updating the actions for the akamai bot categories of 14 // a configuration 15 AkamaiBotCategoryAction interface { 16 // GetAkamaiBotCategoryActionList https://techdocs.akamai.com/bot-manager/reference/get-akamai-bot-category-actions 17 GetAkamaiBotCategoryActionList(ctx context.Context, params GetAkamaiBotCategoryActionListRequest) (*GetAkamaiBotCategoryActionListResponse, error) 18 19 // GetAkamaiBotCategoryAction https://techdocs.akamai.com/bot-manager/reference/get-akamai-bot-category-action 20 GetAkamaiBotCategoryAction(ctx context.Context, params GetAkamaiBotCategoryActionRequest) (map[string]interface{}, error) 21 22 // UpdateAkamaiBotCategoryAction https://techdocs.akamai.com/bot-manager/reference/put-akamai-bot-category-action 23 UpdateAkamaiBotCategoryAction(ctx context.Context, params UpdateAkamaiBotCategoryActionRequest) (map[string]interface{}, error) 24 } 25 26 // GetAkamaiBotCategoryActionListRequest is used to retrieve the akamai bot category actions for a policy. 27 GetAkamaiBotCategoryActionListRequest struct { 28 ConfigID int64 29 Version int64 30 SecurityPolicyID string 31 CategoryID string 32 } 33 34 // GetAkamaiBotCategoryActionListResponse is returned from a call to GetAkamaiBotCategoryActionList. 35 GetAkamaiBotCategoryActionListResponse struct { 36 Actions []map[string]interface{} `json:"actions"` 37 } 38 39 // GetAkamaiBotCategoryActionRequest is used to retrieve the action for an akamai bot category. 40 GetAkamaiBotCategoryActionRequest struct { 41 ConfigID int64 42 Version int64 43 SecurityPolicyID string 44 CategoryID string 45 } 46 47 // UpdateAkamaiBotCategoryActionRequest is used to modify an akamai bot category action. 48 UpdateAkamaiBotCategoryActionRequest struct { 49 ConfigID int64 50 Version int64 51 SecurityPolicyID string 52 CategoryID string 53 JsonPayload json.RawMessage 54 } 55 ) 56 57 // Validate validates a GetAkamaiBotCategoryActionRequest. 58 func (v GetAkamaiBotCategoryActionRequest) Validate() error { 59 return validation.Errors{ 60 "ConfigID": validation.Validate(v.ConfigID, validation.Required), 61 "Version": validation.Validate(v.Version, validation.Required), 62 "SecurityPolicyID": validation.Validate(v.SecurityPolicyID, validation.Required), 63 "CategoryID": validation.Validate(v.CategoryID, validation.Required), 64 }.Filter() 65 } 66 67 // Validate validates a GetAkamaiBotCategoryActionListRequest. 68 func (v GetAkamaiBotCategoryActionListRequest) Validate() error { 69 return validation.Errors{ 70 "ConfigID": validation.Validate(v.ConfigID, validation.Required), 71 "Version": validation.Validate(v.Version, validation.Required), 72 "SecurityPolicyID": validation.Validate(v.SecurityPolicyID, validation.Required), 73 }.Filter() 74 } 75 76 // Validate validates an UpdateAkamaiBotCategoryActionRequest. 77 func (v UpdateAkamaiBotCategoryActionRequest) Validate() error { 78 return validation.Errors{ 79 "ConfigID": validation.Validate(v.ConfigID, validation.Required), 80 "Version": validation.Validate(v.Version, validation.Required), 81 "SecurityPolicyID": validation.Validate(v.SecurityPolicyID, validation.Required), 82 "CategoryID": validation.Validate(v.CategoryID, validation.Required), 83 "JsonPayload": validation.Validate(v.JsonPayload, validation.Required), 84 }.Filter() 85 } 86 87 func (b *botman) GetAkamaiBotCategoryAction(ctx context.Context, params GetAkamaiBotCategoryActionRequest) (map[string]interface{}, error) { 88 logger := b.Log(ctx) 89 logger.Debug("GetAkamaiBotCategoryAction") 90 91 if err := params.Validate(); err != nil { 92 return nil, fmt.Errorf("%w: %s", ErrStructValidation, err.Error()) 93 } 94 95 uri := fmt.Sprintf( 96 "/appsec/v1/configs/%d/versions/%d/security-policies/%s/akamai-bot-category-actions/%s", 97 params.ConfigID, 98 params.Version, 99 params.SecurityPolicyID, 100 params.CategoryID) 101 102 req, err := http.NewRequestWithContext(ctx, http.MethodGet, uri, nil) 103 if err != nil { 104 return nil, fmt.Errorf("failed to create GetAkamaiBotCategoryAction request: %w", err) 105 } 106 107 var result map[string]interface{} 108 resp, err := b.Exec(req, &result) 109 if err != nil { 110 return nil, fmt.Errorf("GetAkamaiBotCategoryAction request failed: %w", err) 111 } 112 113 if resp.StatusCode != http.StatusOK { 114 return nil, b.Error(resp) 115 } 116 117 return result, nil 118 } 119 120 func (b *botman) GetAkamaiBotCategoryActionList(ctx context.Context, params GetAkamaiBotCategoryActionListRequest) (*GetAkamaiBotCategoryActionListResponse, error) { 121 logger := b.Log(ctx) 122 logger.Debug("GetAkamaiBotCategoryActionList") 123 124 if err := params.Validate(); err != nil { 125 return nil, fmt.Errorf("%w: %s", ErrStructValidation, err.Error()) 126 } 127 128 uri := fmt.Sprintf( 129 "/appsec/v1/configs/%d/versions/%d/security-policies/%s/akamai-bot-category-actions", 130 params.ConfigID, 131 params.Version, 132 params.SecurityPolicyID) 133 134 req, err := http.NewRequestWithContext(ctx, http.MethodGet, uri, nil) 135 if err != nil { 136 return nil, fmt.Errorf("failed to create GetAkamaiBotCategoryActionList request: %w", err) 137 } 138 139 var result GetAkamaiBotCategoryActionListResponse 140 resp, err := b.Exec(req, &result) 141 if err != nil { 142 return nil, fmt.Errorf("GetAkamaiBotCategoryActionList request failed: %w", err) 143 } 144 145 if resp.StatusCode != http.StatusOK { 146 return nil, b.Error(resp) 147 } 148 149 var filteredResult GetAkamaiBotCategoryActionListResponse 150 if params.CategoryID != "" { 151 for _, val := range result.Actions { 152 if val["categoryId"].(string) == params.CategoryID { 153 filteredResult.Actions = append(filteredResult.Actions, val) 154 } 155 } 156 } else { 157 filteredResult = result 158 } 159 return &filteredResult, nil 160 } 161 162 func (b *botman) UpdateAkamaiBotCategoryAction(ctx context.Context, params UpdateAkamaiBotCategoryActionRequest) (map[string]interface{}, error) { 163 logger := b.Log(ctx) 164 logger.Debug("UpdateAkamaiBotCategoryAction") 165 166 if err := params.Validate(); err != nil { 167 return nil, fmt.Errorf("%w: %s", ErrStructValidation, err.Error()) 168 } 169 170 putURL := fmt.Sprintf( 171 "/appsec/v1/configs/%d/versions/%d/security-policies/%s/akamai-bot-category-actions/%s", 172 params.ConfigID, 173 params.Version, 174 params.SecurityPolicyID, 175 params.CategoryID, 176 ) 177 178 req, err := http.NewRequestWithContext(ctx, http.MethodPut, putURL, nil) 179 if err != nil { 180 return nil, fmt.Errorf("failed to create UpdateAkamaiBotCategoryAction request: %w", err) 181 } 182 183 var result map[string]interface{} 184 resp, err := b.Exec(req, &result, params.JsonPayload) 185 if err != nil { 186 return nil, fmt.Errorf("UpdateAkamaiBotCategoryAction request failed: %w", err) 187 } 188 189 if resp.StatusCode != http.StatusOK { 190 return nil, b.Error(resp) 191 } 192 193 return result, nil 194 }