github.com/akamai/AkamaiOPEN-edgegrid-golang/v8@v8.1.0/pkg/appsec/reputation_profile_action.go (about) 1 package appsec 2 3 import ( 4 "context" 5 "fmt" 6 "net/http" 7 8 validation "github.com/go-ozzo/ozzo-validation/v4" 9 ) 10 11 type ( 12 // The ReputationProfileAction interface supports retrieving and modifying the action associated with 13 // a specified reputation profile, or with all reputation profiles in a security policy. 14 ReputationProfileAction interface { 15 // GetReputationProfileActions returns a list of reputation profiles with their associated actions. 16 // 17 // See: https://techdocs.akamai.com/application-security/reference/get-reputation-profiles-actions 18 GetReputationProfileActions(ctx context.Context, params GetReputationProfileActionsRequest) (*GetReputationProfileActionsResponse, error) 19 20 // GetReputationProfileAction returns the action a reputation profile takes when triggered. 21 // 22 // See: https://techdocs.akamai.com/application-security/reference/get-reputation-profile-action 23 GetReputationProfileAction(ctx context.Context, params GetReputationProfileActionRequest) (*GetReputationProfileActionResponse, error) 24 25 // UpdateReputationProfileAction updates what action to take when reputation profile's rule triggers. 26 // 27 // See: https://techdocs.akamai.com/application-security/reference/put-reputation-profile-action 28 UpdateReputationProfileAction(ctx context.Context, params UpdateReputationProfileActionRequest) (*UpdateReputationProfileActionResponse, error) 29 } 30 31 // GetReputationProfileActionsRequest is used to retrieve the list of reputation profiles and their associated actions. 32 GetReputationProfileActionsRequest struct { 33 ConfigID int `json:"configId"` 34 Version int `json:"version"` 35 PolicyID string `json:"policyId"` 36 ReputationProfileID int `json:"id"` 37 Action string `json:"action"` 38 } 39 40 // GetReputationProfileActionsResponse is returned from a call to GetReputationProfileActions. 41 GetReputationProfileActionsResponse struct { 42 ReputationProfiles []struct { 43 Action string `json:"action,omitempty"` 44 ID int `json:"id,omitempty"` 45 } `json:"reputationProfiles,omitempty"` 46 } 47 48 // GetReputationProfileActionRequest is used to retrieve the details for a specific reputation profile. 49 GetReputationProfileActionRequest struct { 50 ConfigID int `json:"configId"` 51 Version int `json:"version"` 52 PolicyID string `json:"policyId"` 53 ReputationProfileID int `json:"id"` 54 Action string `json:"action"` 55 } 56 57 // GetReputationProfileActionResponse is returned from a call to GetReputationProfileAction. 58 GetReputationProfileActionResponse struct { 59 Action string `json:"action,omitempty"` 60 } 61 62 // UpdateReputationProfileActionRequest is used to modify the details for a specific reputation profile. 63 UpdateReputationProfileActionRequest struct { 64 ConfigID int `json:"-"` 65 Version int `json:"-"` 66 PolicyID string `json:"-"` 67 ReputationProfileID int `json:"-"` 68 Action string `json:"action"` 69 } 70 71 // UpdateReputationProfileActionResponse is returned from a call to UpdateReputationProfileAction. 72 UpdateReputationProfileActionResponse struct { 73 Action string `json:"action"` 74 } 75 76 // ReputationProfileActionPost is currently unused. 77 ReputationProfileActionPost struct { 78 Action string `json:"action"` 79 } 80 ) 81 82 // Validate validates a GetReputationProfileActionRequest. 83 func (v GetReputationProfileActionRequest) Validate() error { 84 return validation.Errors{ 85 "ConfigID": validation.Validate(v.ConfigID, validation.Required), 86 "Version": validation.Validate(v.Version, validation.Required), 87 "PolicyID": validation.Validate(v.PolicyID, validation.Required), 88 }.Filter() 89 } 90 91 // Validate validates a GetReputationProfileActionsRequest. 92 func (v GetReputationProfileActionsRequest) Validate() error { 93 return validation.Errors{ 94 "ConfigID": validation.Validate(v.ConfigID, validation.Required), 95 "Version": validation.Validate(v.Version, validation.Required), 96 "PolicyID": validation.Validate(v.PolicyID, validation.Required), 97 }.Filter() 98 } 99 100 // Validate validates an UpdateReputationProfileActionRequest. 101 func (v UpdateReputationProfileActionRequest) Validate() error { 102 return validation.Errors{ 103 "ConfigID": validation.Validate(v.ConfigID, validation.Required), 104 "Version": validation.Validate(v.Version, validation.Required), 105 "PolicyID": validation.Validate(v.PolicyID, validation.Required), 106 "ReputationProfileID": validation.Validate(v.ReputationProfileID, validation.Required), 107 }.Filter() 108 } 109 110 func (p *appsec) GetReputationProfileAction(ctx context.Context, params GetReputationProfileActionRequest) (*GetReputationProfileActionResponse, error) { 111 logger := p.Log(ctx) 112 logger.Debug("GetReputationProfileAction") 113 114 if err := params.Validate(); err != nil { 115 return nil, fmt.Errorf("%w: %s", ErrStructValidation, err.Error()) 116 } 117 118 uri := fmt.Sprintf( 119 "/appsec/v1/configs/%d/versions/%d/security-policies/%s/reputation-profiles/%d", 120 params.ConfigID, 121 params.Version, 122 params.PolicyID, 123 params.ReputationProfileID) 124 125 req, err := http.NewRequestWithContext(ctx, http.MethodGet, uri, nil) 126 if err != nil { 127 return nil, fmt.Errorf("failed to create GetReputationProfileAction request: %w", err) 128 } 129 130 var result GetReputationProfileActionResponse 131 resp, err := p.Exec(req, &result) 132 if err != nil { 133 return nil, fmt.Errorf("get reputation profile action request failed: %w", err) 134 } 135 if resp.StatusCode != http.StatusOK { 136 return nil, p.Error(resp) 137 } 138 139 return &result, nil 140 } 141 142 func (p *appsec) GetReputationProfileActions(ctx context.Context, params GetReputationProfileActionsRequest) (*GetReputationProfileActionsResponse, error) { 143 logger := p.Log(ctx) 144 logger.Debug("GetReputationProfileActions") 145 146 if err := params.Validate(); err != nil { 147 return nil, fmt.Errorf("%w: %s", ErrStructValidation, err.Error()) 148 } 149 150 uri := fmt.Sprintf( 151 "/appsec/v1/configs/%d/versions/%d/security-policies/%s/reputation-profiles", 152 params.ConfigID, 153 params.Version, 154 params.PolicyID) 155 156 req, err := http.NewRequestWithContext(ctx, http.MethodGet, uri, nil) 157 if err != nil { 158 return nil, fmt.Errorf("failed to create GetReputationProfileActions request: %w", err) 159 } 160 161 var result GetReputationProfileActionsResponse 162 resp, err := p.Exec(req, &result) 163 if err != nil { 164 return nil, fmt.Errorf("get reputation profile actions request failed: %w", err) 165 } 166 if resp.StatusCode != http.StatusOK { 167 return nil, p.Error(resp) 168 } 169 170 if params.ReputationProfileID != 0 { 171 var filteredResult GetReputationProfileActionsResponse 172 for _, val := range result.ReputationProfiles { 173 if val.ID == params.ReputationProfileID { 174 filteredResult.ReputationProfiles = append(filteredResult.ReputationProfiles, val) 175 } 176 } 177 return &filteredResult, nil 178 } 179 180 return &result, nil 181 } 182 183 func (p *appsec) UpdateReputationProfileAction(ctx context.Context, params UpdateReputationProfileActionRequest) (*UpdateReputationProfileActionResponse, error) { 184 logger := p.Log(ctx) 185 logger.Debug("UpdateReputationProfileAction") 186 187 if err := params.Validate(); err != nil { 188 return nil, fmt.Errorf("%w: %s", ErrStructValidation, err.Error()) 189 } 190 191 uri := fmt.Sprintf( 192 "/appsec/v1/configs/%d/versions/%d/security-policies/%s/reputation-profiles/%d", 193 params.ConfigID, 194 params.Version, 195 params.PolicyID, 196 params.ReputationProfileID, 197 ) 198 199 req, err := http.NewRequestWithContext(ctx, http.MethodPut, uri, nil) 200 if err != nil { 201 return nil, fmt.Errorf("failed to create UpdateReputationProfileAction request: %w", err) 202 } 203 204 var result UpdateReputationProfileActionResponse 205 resp, err := p.Exec(req, &result, params) 206 if err != nil { 207 return nil, fmt.Errorf("update reputation profile action request failed: %w", err) 208 } 209 if resp.StatusCode != http.StatusOK && resp.StatusCode != http.StatusCreated { 210 return nil, p.Error(resp) 211 } 212 213 return &result, nil 214 }