github.com/akamai/AkamaiOPEN-edgegrid-golang/v8@v8.1.0/pkg/papi/include_versions.go (about) 1 package papi 2 3 import ( 4 "context" 5 "errors" 6 "fmt" 7 "net/http" 8 "net/url" 9 "strconv" 10 11 "github.com/akamai/AkamaiOPEN-edgegrid-golang/v8/pkg/edgegriderr" 12 validation "github.com/go-ozzo/ozzo-validation/v4" 13 ) 14 15 type ( 16 // IncludeVersions contains operations available on IncludeVersion resource 17 IncludeVersions interface { 18 // CreateIncludeVersion creates a new include version based on any previous version 19 // 20 // See: https://techdocs.akamai.com/property-mgr/reference/post-include-versions 21 CreateIncludeVersion(context.Context, CreateIncludeVersionRequest) (*CreateIncludeVersionResponse, error) 22 23 // GetIncludeVersion polls the state of a specific include version, for example to check its activation status 24 // 25 // See: https://techdocs.akamai.com/property-mgr/reference/get-include-version 26 GetIncludeVersion(context.Context, GetIncludeVersionRequest) (*GetIncludeVersionResponse, error) 27 28 // ListIncludeVersions lists the include versions, with results limited to the 500 most recent versions 29 // 30 // See: https://techdocs.akamai.com/property-mgr/reference/get-include-versions 31 ListIncludeVersions(context.Context, ListIncludeVersionsRequest) (*ListIncludeVersionsResponse, error) 32 33 // ListIncludeVersionAvailableCriteria lists available criteria for the include version 34 // 35 // See: https://techdocs.akamai.com/property-mgr/reference/get-include-available-criteria 36 ListIncludeVersionAvailableCriteria(context.Context, ListAvailableCriteriaRequest) (*AvailableCriteriaResponse, error) 37 38 // ListIncludeVersionAvailableBehaviors lists available behaviors for the include version 39 // 40 // See: https://techdocs.akamai.com/property-mgr/reference/get-include-available-behaviors 41 ListIncludeVersionAvailableBehaviors(context.Context, ListAvailableBehaviorsRequest) (*AvailableBehaviorsResponse, error) 42 } 43 44 // CreateIncludeVersionRequest contains parameters used to create a new include version 45 CreateIncludeVersionRequest struct { 46 IncludeID string 47 IncludeVersionRequest 48 } 49 50 // IncludeVersionRequest contains body parameters used to create a new include version 51 IncludeVersionRequest struct { 52 CreateFromVersion int `json:"createFromVersion"` 53 CreateFromVersionEtag string `json:"createFromVersionEtag,omitempty"` 54 } 55 56 // CreateIncludeVersionResponse represents a response object returned by CreateIncludeVersion 57 CreateIncludeVersionResponse struct { 58 VersionLink string 59 Version int 60 } 61 62 // GetIncludeVersionRequest contains parameters used to get the include version 63 GetIncludeVersionRequest struct { 64 IncludeID string 65 Version int 66 ContractID string 67 GroupID string 68 } 69 70 // ListIncludeVersionsRequest contains parameters used to list the include versions 71 ListIncludeVersionsRequest struct { 72 IncludeID string 73 ContractID string 74 GroupID string 75 } 76 77 // GetIncludeVersionResponse represents a response object returned by GetIncludeVersion 78 GetIncludeVersionResponse struct { 79 IncludeID string `json:"includeId"` 80 IncludeName string `json:"includeName"` 81 AccountID string `json:"accountId"` 82 ContractID string `json:"contractId"` 83 GroupID string `json:"groupId"` 84 AssetID string `json:"assetId"` 85 IncludeType IncludeType `json:"includeType"` 86 IncludeVersions Versions `json:"versions"` 87 IncludeVersion IncludeVersion `json:"-"` 88 } 89 90 // ListIncludeVersionsResponse represents a response object returned by ListIncludeVersions 91 ListIncludeVersionsResponse struct { 92 IncludeID string `json:"includeId"` 93 IncludeName string `json:"includeName"` 94 AccountID string `json:"accountId"` 95 ContractID string `json:"contractId"` 96 GroupID string `json:"groupId"` 97 AssetID string `json:"assetId"` 98 IncludeType IncludeType `json:"includeType"` 99 IncludeVersions Versions `json:"versions"` 100 } 101 102 // Versions represents IncludeVersions object 103 Versions struct { 104 Items []IncludeVersion `json:"items"` 105 } 106 107 // IncludeVersion represents an include version object 108 IncludeVersion struct { 109 UpdatedByUser string `json:"updatedByUser"` 110 UpdatedDate string `json:"updatedDate"` 111 ProductionStatus VersionStatus `json:"productionStatus"` 112 Etag string `json:"etag"` 113 ProductID string `json:"productId"` 114 Note string `json:"note,omitempty"` 115 RuleFormat string `json:"ruleFormat,omitempty"` 116 IncludeVersion int `json:"includeVersion"` 117 StagingStatus VersionStatus `json:"stagingStatus"` 118 } 119 120 // ListAvailableCriteriaRequest contains parameters used to get available include version criteria 121 ListAvailableCriteriaRequest struct { 122 IncludeID string 123 Version int 124 } 125 126 // AvailableCriteriaResponse represents a response object returned by ListIncludeVersionAvailableCriteria 127 AvailableCriteriaResponse struct { 128 ContractID string `json:"contractId"` 129 GroupID string `json:"groupId"` 130 ProductID string `json:"productId"` 131 RuleFormat string `json:"ruleFormat"` 132 AvailableCriteria AvailableCriteria `json:"criteria"` 133 } 134 135 // AvailableCriteria represents list of available criteria for the include version 136 AvailableCriteria struct { 137 Items []Criteria `json:"items"` 138 } 139 140 // Criteria represents available criteria object 141 Criteria struct { 142 Name string `json:"name"` 143 SchemaLink string `json:"schemaLink"` 144 } 145 146 // ListAvailableBehaviorsRequest contains parameters used to get available include version behaviors 147 ListAvailableBehaviorsRequest struct { 148 IncludeID string 149 Version int 150 } 151 152 // AvailableBehaviorsResponse represents a response object returned by GetIncludeVersionAvailableBehavior 153 AvailableBehaviorsResponse struct { 154 ContractID string `json:"contractId"` 155 GroupID string `json:"groupId"` 156 ProductID string `json:"productId"` 157 RuleFormat string `json:"ruleFormat"` 158 AvailableBehaviors AvailableBehaviors `json:"behaviors"` 159 } 160 161 // AvailableBehaviors represents list of available behaviors for the include version 162 AvailableBehaviors struct { 163 Items []Behavior `json:"items"` 164 } 165 166 // Behavior represents available behavior object 167 Behavior struct { 168 Name string `json:"name"` 169 SchemaLink string `json:"schemaLink"` 170 } 171 ) 172 173 // Validate validates CreateIncludeVersionRequest 174 func (i CreateIncludeVersionRequest) Validate() error { 175 return edgegriderr.ParseValidationErrors(validation.Errors{ 176 "IncludeID": validation.Validate(i.IncludeID, validation.Required), 177 "CreateFromVersion": validation.Validate(i.CreateFromVersion, validation.Required), 178 }) 179 } 180 181 // Validate validates GetIncludeVersionRequest 182 func (i GetIncludeVersionRequest) Validate() error { 183 return edgegriderr.ParseValidationErrors(validation.Errors{ 184 "IncludeID": validation.Validate(i.IncludeID, validation.Required), 185 "Version": validation.Validate(i.Version, validation.Required), 186 "ContractID": validation.Validate(i.ContractID, validation.Required), 187 "GroupID": validation.Validate(i.GroupID, validation.Required), 188 }) 189 } 190 191 // Validate validates ListIncludeVersionsRequest 192 func (i ListIncludeVersionsRequest) Validate() error { 193 return edgegriderr.ParseValidationErrors(validation.Errors{ 194 "IncludeID": validation.Validate(i.IncludeID, validation.Required), 195 "ContractID": validation.Validate(i.ContractID, validation.Required), 196 "GroupID": validation.Validate(i.GroupID, validation.Required), 197 }) 198 } 199 200 // Validate validates ListAvailableCriteriaRequest 201 func (i ListAvailableCriteriaRequest) Validate() error { 202 return edgegriderr.ParseValidationErrors(validation.Errors{ 203 "IncludeID": validation.Validate(i.IncludeID, validation.Required), 204 "Version": validation.Validate(i.Version, validation.Required), 205 }) 206 } 207 208 // Validate validates ListAvailableBehaviorsRequest 209 func (i ListAvailableBehaviorsRequest) Validate() error { 210 return edgegriderr.ParseValidationErrors(validation.Errors{ 211 "IncludeID": validation.Validate(i.IncludeID, validation.Required), 212 "Version": validation.Validate(i.Version, validation.Required), 213 }) 214 } 215 216 var ( 217 // ErrCreateIncludeVersion is returned in case an error occurs on CreateIncludeVersion operation 218 ErrCreateIncludeVersion = errors.New("create an include version") 219 // ErrGetIncludeVersion is returned in case an error occurs on GetIncludeVersion operation 220 ErrGetIncludeVersion = errors.New("get an include version") 221 // ErrListIncludeVersions is returned in case an error occurs on ListIncludeVersions operation 222 ErrListIncludeVersions = errors.New("list include versions") 223 // ErrListIncludeVersionAvailableCriteria is returned in case an error occurs on ListIncludeVersionAvailableCriteria operation 224 ErrListIncludeVersionAvailableCriteria = errors.New("list include version available criteria") 225 // ErrListIncludeVersionAvailableBehaviors is returned in case an error occurs on ListIncludeVersionAvailableBehaviors operation 226 ErrListIncludeVersionAvailableBehaviors = errors.New("list include version available behaviors") 227 ) 228 229 func (p *papi) CreateIncludeVersion(ctx context.Context, params CreateIncludeVersionRequest) (*CreateIncludeVersionResponse, error) { 230 logger := p.Log(ctx) 231 logger.Debug("CreateIncludeVersion") 232 233 if err := params.Validate(); err != nil { 234 return nil, fmt.Errorf("%s: %w: %s", ErrCreateIncludeVersion, ErrStructValidation, err) 235 } 236 237 uri := fmt.Sprintf("/papi/v1/includes/%s/versions", params.IncludeID) 238 239 req, err := http.NewRequestWithContext(ctx, http.MethodPost, uri, nil) 240 if err != nil { 241 return nil, fmt.Errorf("%w: failed to create request: %s", ErrCreateIncludeVersion, err) 242 } 243 244 var result CreateIncludeVersionResponse 245 resp, err := p.Exec(req, &result, params.IncludeVersionRequest) 246 if err != nil { 247 return nil, fmt.Errorf("%w: request failed: %s", ErrCreateIncludeVersion, err) 248 } 249 250 if resp.StatusCode != http.StatusCreated { 251 return nil, fmt.Errorf("%s: %w", ErrCreateIncludeVersion, p.Error(resp)) 252 } 253 254 id, err := ResponseLinkParse(result.VersionLink) 255 if err != nil { 256 return nil, fmt.Errorf("%s: %w: %s", ErrCreateIncludeVersion, ErrInvalidResponseLink, err) 257 } 258 result.Version, err = strconv.Atoi(id) 259 if err != nil { 260 return nil, fmt.Errorf("%s: %w: %s", ErrCreateIncludeVersion, ErrInvalidResponseLink, err) 261 } 262 263 return &result, nil 264 } 265 266 func (p *papi) GetIncludeVersion(ctx context.Context, params GetIncludeVersionRequest) (*GetIncludeVersionResponse, error) { 267 logger := p.Log(ctx) 268 logger.Debug("GetIncludeVersion") 269 270 if err := params.Validate(); err != nil { 271 return nil, fmt.Errorf("%s: %w: %s", ErrGetIncludeVersion, ErrStructValidation, err) 272 } 273 274 uri, err := url.Parse(fmt.Sprintf("/papi/v1/includes/%s/versions/%d", params.IncludeID, params.Version)) 275 if err != nil { 276 return nil, fmt.Errorf("%w: failed to parse url: %s", ErrGetIncludeVersion, err) 277 } 278 279 q := uri.Query() 280 q.Add("contractId", params.ContractID) 281 q.Add("groupId", params.GroupID) 282 uri.RawQuery = q.Encode() 283 284 req, err := http.NewRequestWithContext(ctx, http.MethodGet, uri.String(), nil) 285 if err != nil { 286 return nil, fmt.Errorf("%w: failed to create request: %s", ErrGetIncludeVersion, err) 287 } 288 289 var result GetIncludeVersionResponse 290 resp, err := p.Exec(req, &result) 291 if err != nil { 292 return nil, fmt.Errorf("%w: request failed: %s", ErrGetIncludeVersion, err) 293 } 294 295 if resp.StatusCode != http.StatusOK { 296 return nil, fmt.Errorf("%s: %w", ErrGetIncludeVersion, p.Error(resp)) 297 } 298 299 if len(result.IncludeVersions.Items) == 0 { 300 return nil, fmt.Errorf("%s: %w: IncludeID: %s", ErrGetIncludeVersion, ErrNotFound, params.IncludeID) 301 } 302 result.IncludeVersion = result.IncludeVersions.Items[0] 303 304 return &result, nil 305 } 306 307 func (p *papi) ListIncludeVersions(ctx context.Context, params ListIncludeVersionsRequest) (*ListIncludeVersionsResponse, error) { 308 logger := p.Log(ctx) 309 logger.Debug("ListIncludeVersions") 310 311 if err := params.Validate(); err != nil { 312 return nil, fmt.Errorf("%s: %w: %s", ErrListIncludeVersions, ErrStructValidation, err) 313 } 314 315 uri, err := url.Parse(fmt.Sprintf("/papi/v1/includes/%s/versions", params.IncludeID)) 316 if err != nil { 317 return nil, fmt.Errorf("%w: failed to parse url: %s", ErrListIncludeVersions, err) 318 } 319 320 q := uri.Query() 321 q.Add("contractId", params.ContractID) 322 q.Add("groupId", params.GroupID) 323 uri.RawQuery = q.Encode() 324 325 req, err := http.NewRequestWithContext(ctx, http.MethodGet, uri.String(), nil) 326 if err != nil { 327 return nil, fmt.Errorf("%w: failed to create request: %s", ErrListIncludeVersions, err) 328 } 329 330 var result ListIncludeVersionsResponse 331 resp, err := p.Exec(req, &result) 332 if err != nil { 333 return nil, fmt.Errorf("%w: request failed: %s", ErrListIncludeVersions, err) 334 } 335 336 if resp.StatusCode != http.StatusOK { 337 return nil, fmt.Errorf("%s: %w", ErrListIncludeVersions, p.Error(resp)) 338 } 339 340 return &result, nil 341 } 342 343 func (p *papi) ListIncludeVersionAvailableCriteria(ctx context.Context, params ListAvailableCriteriaRequest) (*AvailableCriteriaResponse, error) { 344 logger := p.Log(ctx) 345 logger.Debug("ListIncludeVersionAvailableCriteria") 346 347 if err := params.Validate(); err != nil { 348 return nil, fmt.Errorf("%s: %w: %s", ErrListIncludeVersionAvailableCriteria, ErrStructValidation, err) 349 } 350 351 uri := fmt.Sprintf("/papi/v1/includes/%s/versions/%d/available-criteria", params.IncludeID, params.Version) 352 353 req, err := http.NewRequestWithContext(ctx, http.MethodGet, uri, nil) 354 if err != nil { 355 return nil, fmt.Errorf("%w: failed to create request: %s", ErrListIncludeVersionAvailableCriteria, err) 356 } 357 358 var result AvailableCriteriaResponse 359 resp, err := p.Exec(req, &result) 360 if err != nil { 361 return nil, fmt.Errorf("%w: request failed: %s", ErrListIncludeVersionAvailableCriteria, err) 362 } 363 364 if resp.StatusCode != http.StatusOK { 365 return nil, fmt.Errorf("%s: %w", ErrListIncludeVersionAvailableCriteria, p.Error(resp)) 366 } 367 368 return &result, nil 369 } 370 371 func (p *papi) ListIncludeVersionAvailableBehaviors(ctx context.Context, params ListAvailableBehaviorsRequest) (*AvailableBehaviorsResponse, error) { 372 logger := p.Log(ctx) 373 logger.Debug("ListIncludeVersionAvailableBehaviors") 374 375 if err := params.Validate(); err != nil { 376 return nil, fmt.Errorf("%s: %w: %s", ErrListIncludeVersionAvailableBehaviors, ErrStructValidation, err) 377 } 378 379 uri := fmt.Sprintf("/papi/v1/includes/%s/versions/%d/available-behaviors", params.IncludeID, params.Version) 380 381 req, err := http.NewRequestWithContext(ctx, http.MethodGet, uri, nil) 382 if err != nil { 383 return nil, fmt.Errorf("%w: failed to create request: %s", ErrListIncludeVersionAvailableBehaviors, err) 384 } 385 386 var result AvailableBehaviorsResponse 387 resp, err := p.Exec(req, &result) 388 if err != nil { 389 return nil, fmt.Errorf("%w: request failed: %s", ErrListIncludeVersionAvailableBehaviors, err) 390 } 391 392 if resp.StatusCode != http.StatusOK { 393 return nil, fmt.Errorf("%s: %w", ErrListIncludeVersionAvailableBehaviors, p.Error(resp)) 394 } 395 396 return &result, nil 397 }