github.com/akamai/AkamaiOPEN-edgegrid-golang/v8@v8.1.0/pkg/cloudlets/v3/policy_version.go (about) 1 package v3 2 3 import ( 4 "context" 5 "errors" 6 "fmt" 7 "net/http" 8 "net/url" 9 "time" 10 11 "github.com/akamai/AkamaiOPEN-edgegrid-golang/v8/pkg/edgegriderr" 12 13 validation "github.com/go-ozzo/ozzo-validation/v4" 14 ) 15 16 type ( 17 // ListPolicyVersions is response returned by ListPolicyVersions 18 ListPolicyVersions struct { 19 PolicyVersions []ListPolicyVersionsItem `json:"content"` 20 Links []Link `json:"links"` 21 Page Page `json:"page"` 22 } 23 24 // ListPolicyVersionsItem is a content struct of ListPolicyVersion response 25 ListPolicyVersionsItem struct { 26 CreatedBy string `json:"createdBy"` 27 CreatedDate time.Time `json:"createdDate"` 28 Description *string `json:"description"` 29 ID int64 `json:"id"` 30 Immutable bool `json:"immutable"` 31 Links []Link `json:"links"` 32 ModifiedBy string `json:"modifiedBy"` 33 ModifiedDate *time.Time `json:"modifiedDate,omitempty"` 34 PolicyID int64 `json:"policyId"` 35 PolicyVersion int64 `json:"version"` 36 } 37 38 // PolicyVersion is response returned by GetPolicyVersion, CreatePolicyVersion or UpdatePolicyVersion 39 PolicyVersion struct { 40 CreatedBy string `json:"createdBy"` 41 CreatedDate time.Time `json:"createdDate"` 42 Description *string `json:"description"` 43 ID int64 `json:"id"` 44 Immutable bool `json:"immutable"` 45 MatchRules MatchRules `json:"matchRules"` 46 MatchRulesWarnings []MatchRulesWarning `json:"matchRulesWarnings"` 47 ModifiedBy string `json:"modifiedBy"` 48 ModifiedDate *time.Time `json:"modifiedDate,omitempty"` 49 PolicyID int64 `json:"policyId"` 50 PolicyVersion int64 `json:"version"` 51 } 52 53 // MatchRulesWarning describes the warnings struct 54 MatchRulesWarning struct { 55 Detail string `json:"detail"` 56 JSONPointer string `json:"jsonPointer,omitempty"` 57 Title string `json:"title"` 58 Type string `json:"type"` 59 } 60 61 // ListPolicyVersionsRequest describes the parameters needed to list policy versions 62 ListPolicyVersionsRequest struct { 63 PolicyID int64 64 Page int 65 Size int 66 } 67 68 // GetPolicyVersionRequest describes the parameters needed to get policy version 69 GetPolicyVersionRequest struct { 70 PolicyID int64 71 PolicyVersion int64 72 } 73 74 // CreatePolicyVersionRequest describes the body of the create policy request 75 CreatePolicyVersionRequest struct { 76 CreatePolicyVersion 77 PolicyID int64 78 } 79 80 // CreatePolicyVersion describes the body of the create policy request 81 CreatePolicyVersion struct { 82 Description *string `json:"description,omitempty"` 83 MatchRules MatchRules `json:"matchRules"` 84 } 85 86 // UpdatePolicyVersion describes the body of the update policy version request 87 UpdatePolicyVersion struct { 88 Description *string `json:"description,omitempty"` 89 MatchRules MatchRules `json:"matchRules"` 90 } 91 92 // DeletePolicyVersionRequest describes the parameters of the delete policy version request 93 DeletePolicyVersionRequest struct { 94 PolicyID int64 95 PolicyVersion int64 96 } 97 98 // UpdatePolicyVersionRequest describes the parameters of the update policy version request 99 UpdatePolicyVersionRequest struct { 100 UpdatePolicyVersion 101 PolicyID int64 102 PolicyVersion int64 103 } 104 ) 105 106 // Validate validates ListPolicyVersionsRequest 107 func (c ListPolicyVersionsRequest) Validate() error { 108 errs := validation.Errors{ 109 "PolicyID": validation.Validate(c.PolicyID, validation.Required), 110 "Size": validation.Validate(c.Size, validation.Min(10)), 111 "Page": validation.Validate(c.Page, validation.Min(0)), 112 } 113 return edgegriderr.ParseValidationErrors(errs) 114 } 115 116 // Validate validates CreatePolicyVersionRequest 117 func (c CreatePolicyVersionRequest) Validate() error { 118 return edgegriderr.ParseValidationErrors(validation.Errors{ 119 "PolicyID": validation.Validate(c.PolicyID, validation.Required), 120 "Description": validation.Validate(c.Description, validation.Length(0, 255)), 121 "MatchRules": validation.Validate(c.MatchRules, validation.Length(0, 5000)), 122 }) 123 } 124 125 // Validate validates UpdatePolicyVersionRequest 126 func (c UpdatePolicyVersionRequest) Validate() error { 127 return edgegriderr.ParseValidationErrors(validation.Errors{ 128 "PolicyID": validation.Validate(c.PolicyID, validation.Required), 129 "PolicyVersion": validation.Validate(c.PolicyVersion, validation.Required), 130 "Description": validation.Validate(c.Description, validation.Length(0, 255)), 131 "MatchRules": validation.Validate(c.MatchRules, validation.Length(0, 5000)), 132 }) 133 } 134 135 // Validate validates DeletePolicyVersionRequest 136 func (c DeletePolicyVersionRequest) Validate() error { 137 return edgegriderr.ParseValidationErrors(validation.Errors{ 138 "PolicyID": validation.Validate(c.PolicyID, validation.Required), 139 "PolicyVersion": validation.Validate(c.PolicyVersion, validation.Required), 140 }) 141 } 142 143 var ( 144 // ErrListPolicyVersions is returned when ListPolicyVersions fails 145 ErrListPolicyVersions = errors.New("list policy versions") 146 // ErrGetPolicyVersion is returned when GetPolicyVersion fails 147 ErrGetPolicyVersion = errors.New("get policy versions") 148 // ErrCreatePolicyVersion is returned when CreatePolicyVersion fails 149 ErrCreatePolicyVersion = errors.New("create policy versions") 150 // ErrDeletePolicyVersion is returned when DeletePolicyVersion fails 151 ErrDeletePolicyVersion = errors.New("delete policy versions") 152 // ErrUpdatePolicyVersion is returned when UpdatePolicyVersion fails 153 ErrUpdatePolicyVersion = errors.New("update policy versions") 154 ) 155 156 func (c *cloudlets) ListPolicyVersions(ctx context.Context, params ListPolicyVersionsRequest) (*ListPolicyVersions, error) { 157 logger := c.Log(ctx) 158 logger.Debug("ListPolicyVersions") 159 160 if err := params.Validate(); err != nil { 161 return nil, fmt.Errorf("%s: %w:\n%s", ErrListPolicyVersions, ErrStructValidation, err) 162 } 163 164 uri, err := url.Parse(fmt.Sprintf("/cloudlets/v3/policies/%d/versions", params.PolicyID)) 165 if err != nil { 166 return nil, fmt.Errorf("%w: failed to parse url: %s", ErrListPolicyVersions, err) 167 } 168 169 q := uri.Query() 170 q.Add("page", fmt.Sprintf("%d", params.Page)) 171 if params.Size != 0 { 172 q.Add("size", fmt.Sprintf("%d", params.Size)) 173 } 174 uri.RawQuery = q.Encode() 175 176 req, err := http.NewRequestWithContext(ctx, http.MethodGet, uri.String(), nil) 177 if err != nil { 178 return nil, fmt.Errorf("%w: failed to create request: %s", ErrListPolicyVersions, err) 179 } 180 181 var result *ListPolicyVersions 182 resp, err := c.Exec(req, &result) 183 if err != nil { 184 return nil, fmt.Errorf("%w: request failed: %s", ErrListPolicyVersions, err) 185 } 186 187 if resp.StatusCode != http.StatusOK { 188 return nil, fmt.Errorf("%s: %w", ErrListPolicyVersions, c.Error(resp)) 189 } 190 191 return result, nil 192 } 193 194 func (c *cloudlets) GetPolicyVersion(ctx context.Context, params GetPolicyVersionRequest) (*PolicyVersion, error) { 195 logger := c.Log(ctx) 196 logger.Debug("GetPolicyVersion") 197 198 uri := fmt.Sprintf("/cloudlets/v3/policies/%d/versions/%d", params.PolicyID, params.PolicyVersion) 199 200 req, err := http.NewRequestWithContext(ctx, http.MethodGet, uri, nil) 201 if err != nil { 202 return nil, fmt.Errorf("%w: failed to create request: %s", ErrGetPolicyVersion, err) 203 } 204 205 var result PolicyVersion 206 207 resp, err := c.Exec(req, &result) 208 if err != nil { 209 return nil, fmt.Errorf("%w: request failed: %s", ErrGetPolicyVersion, err) 210 } 211 212 if resp.StatusCode != http.StatusOK { 213 return nil, fmt.Errorf("%s: %w", ErrGetPolicyVersion, c.Error(resp)) 214 } 215 216 return &result, nil 217 } 218 219 func (c *cloudlets) CreatePolicyVersion(ctx context.Context, params CreatePolicyVersionRequest) (*PolicyVersion, error) { 220 logger := c.Log(ctx) 221 logger.Debug("CreatePolicyVersion") 222 223 if err := params.Validate(); err != nil { 224 return nil, fmt.Errorf("%s: %w:\n%s", ErrCreatePolicyVersion, ErrStructValidation, err) 225 } 226 227 uri := fmt.Sprintf("/cloudlets/v3/policies/%d/versions", params.PolicyID) 228 229 req, err := http.NewRequestWithContext(ctx, http.MethodPost, uri, nil) 230 if err != nil { 231 return nil, fmt.Errorf("%w: failed to create request: %s", ErrCreatePolicyVersion, err) 232 } 233 234 var result PolicyVersion 235 236 resp, err := c.Exec(req, &result, params.CreatePolicyVersion) 237 if err != nil { 238 return nil, fmt.Errorf("%w: request failed: %s", ErrCreatePolicyVersion, err) 239 } 240 241 if resp.StatusCode != http.StatusCreated { 242 return nil, fmt.Errorf("%s: %w", ErrCreatePolicyVersion, c.Error(resp)) 243 } 244 245 return &result, nil 246 } 247 248 func (c *cloudlets) DeletePolicyVersion(ctx context.Context, params DeletePolicyVersionRequest) error { 249 logger := c.Log(ctx) 250 logger.Debug("DeletePolicyVersion") 251 252 if err := params.Validate(); err != nil { 253 return fmt.Errorf("%s: %w:\n%s", ErrDeletePolicyVersion, ErrStructValidation, err) 254 } 255 256 uri := fmt.Sprintf("/cloudlets/v3/policies/%d/versions/%d", params.PolicyID, params.PolicyVersion) 257 258 req, err := http.NewRequestWithContext(ctx, http.MethodDelete, uri, nil) 259 if err != nil { 260 return fmt.Errorf("%w: failed to create request: %s", ErrDeletePolicyVersion, err) 261 } 262 263 resp, err := c.Exec(req, nil) 264 if err != nil { 265 return fmt.Errorf("%w: request failed: %s", ErrDeletePolicyVersion, err) 266 } 267 268 if resp.StatusCode != http.StatusNoContent { 269 return fmt.Errorf("%s: %w", ErrDeletePolicyVersion, c.Error(resp)) 270 } 271 272 return nil 273 } 274 275 func (c *cloudlets) UpdatePolicyVersion(ctx context.Context, params UpdatePolicyVersionRequest) (*PolicyVersion, error) { 276 logger := c.Log(ctx) 277 logger.Debug("UpdatePolicyVersion") 278 279 if err := params.Validate(); err != nil { 280 return nil, fmt.Errorf("%s: %w:\n%s", ErrUpdatePolicyVersion, ErrStructValidation, err) 281 } 282 283 uri := fmt.Sprintf("/cloudlets/v3/policies/%d/versions/%d", params.PolicyID, params.PolicyVersion) 284 285 req, err := http.NewRequestWithContext(ctx, http.MethodPut, uri, nil) 286 if err != nil { 287 return nil, fmt.Errorf("%w: failed to create request: %s", ErrUpdatePolicyVersion, err) 288 } 289 290 var result PolicyVersion 291 292 resp, err := c.Exec(req, &result, params.UpdatePolicyVersion) 293 if err != nil { 294 return nil, fmt.Errorf("%w: request failed: %s", ErrUpdatePolicyVersion, err) 295 } 296 297 if resp.StatusCode != http.StatusOK { 298 return nil, fmt.Errorf("%s: %w", ErrUpdatePolicyVersion, c.Error(resp)) 299 } 300 301 return &result, nil 302 }