github.com/akamai/AkamaiOPEN-edgegrid-golang/v8@v8.1.0/pkg/networklists/network_list.go (about) 1 package networklists 2 3 import ( 4 "context" 5 "fmt" 6 "net/http" 7 "net/url" 8 9 validation "github.com/go-ozzo/ozzo-validation/v4" 10 ) 11 12 type ( 13 // The NetworkList interface supports creating, retrieving, modifying and removing network lists. 14 NetworkList interface { 15 // GetNetworkLists lists all network lists available for an authenticated user. 16 // 17 // See: https://techdocs.akamai.com/network-lists/reference/get-network-lists 18 GetNetworkLists(ctx context.Context, params GetNetworkListsRequest) (*GetNetworkListsResponse, error) 19 20 // GetNetworkList retrieves network list with specific network list id. 21 // 22 // See: https://techdocs.akamai.com/network-lists/reference/get-network-list 23 GetNetworkList(ctx context.Context, params GetNetworkListRequest) (*GetNetworkListResponse, error) 24 25 // CreateNetworkList creates a new network list. 26 // 27 // See: https://techdocs.akamai.com/network-lists/reference/post-network-lists 28 CreateNetworkList(ctx context.Context, params CreateNetworkListRequest) (*CreateNetworkListResponse, error) 29 30 // UpdateNetworkList modifies the network list. 31 // 32 //See: https://techdocs.akamai.com/network-lists/reference/put-network-list 33 UpdateNetworkList(ctx context.Context, params UpdateNetworkListRequest) (*UpdateNetworkListResponse, error) 34 35 // RemoveNetworkList removes a network list. 36 // 37 // See: https://techdocs.akamai.com/network-lists/reference/delete-network-list 38 RemoveNetworkList(ctx context.Context, params RemoveNetworkListRequest) (*RemoveNetworkListResponse, error) 39 } 40 41 // GetNetworkListRequest contains request parameters for GetNetworkList method 42 GetNetworkListRequest struct { 43 UniqueID string `json:"-"` 44 } 45 46 // GetNetworkListsRequest contains request parameters for GetNetworkLists method 47 GetNetworkListsRequest struct { 48 Name string `json:"name"` 49 Type string `json:"type"` 50 } 51 52 // GetNetworkListsResponse contains response from GetNetworkLists method 53 GetNetworkListsResponse struct { 54 Links *NetworkListsResponseLinks `json:"links,omitempty"` 55 NetworkLists []GetNetworkListsResponseListElement `json:"networkLists"` 56 } 57 58 // GetNetworkListsResponseListElement contains information about a single network list 59 GetNetworkListsResponseListElement struct { 60 ElementCount int `json:"elementCount"` 61 Links *NetworkListsLinks `json:"links,omitempty"` 62 Name string `json:"name"` 63 NetworkListType string `json:"networkListType"` 64 ReadOnly bool `json:"readOnly"` 65 Shared bool `json:"shared"` 66 SyncPoint int `json:"syncPoint"` 67 Type string `json:"type"` 68 UniqueID string `json:"uniqueId"` 69 AccessControlGroup string `json:"accessControlGroup,omitempty"` 70 Description string `json:"description,omitempty"` 71 } 72 73 // GetNetworkListResponse contains response from GetNetworkList method 74 GetNetworkListResponse struct { 75 Name string `json:"name"` 76 UniqueID string `json:"uniqueId"` 77 ContractID string `json:"contractId"` 78 GroupID int `json:"groupId"` 79 SyncPoint int `json:"syncPoint"` 80 Type string `json:"type"` 81 Description string `json:"description,omitempty"` 82 NetworkListType string `json:"networkListType"` 83 ElementCount int `json:"elementCount"` 84 ReadOnly bool `json:"readOnly"` 85 Shared bool `json:"shared"` 86 List []string `json:"list"` 87 Links struct { 88 ActivateInProduction struct { 89 Href string `json:"href"` 90 Method string `json:"method"` 91 } `json:"activateInProduction"` 92 ActivateInStaging struct { 93 Href string `json:"href"` 94 Method string `json:"method"` 95 } `json:"activateInStaging"` 96 AppendItems struct { 97 Href string `json:"href"` 98 Method string `json:"method"` 99 } `json:"appendItems"` 100 Retrieve struct { 101 Href string `json:"href"` 102 } `json:"retrieve"` 103 StatusInProduction struct { 104 Href string `json:"href"` 105 } `json:"statusInProduction"` 106 StatusInStaging struct { 107 Href string `json:"href"` 108 } `json:"statusInStaging"` 109 Update struct { 110 Href string `json:"href"` 111 Method string `json:"method"` 112 } `json:"update"` 113 } `json:"links"` 114 } 115 116 // CreateNetworkListRequest contains request parameters for CreateNetworkList method 117 CreateNetworkListRequest struct { 118 Name string `json:"name"` 119 Type string `json:"type"` 120 Description string `json:"description"` 121 ContractID string `json:"contractId,omitempty"` 122 GroupID int `json:"groupId,omitempty"` 123 List []string `json:"list"` 124 } 125 126 // UpdateNetworkListRequest contains request parameters for CreateNetworkLists method 127 UpdateNetworkListRequest struct { 128 Name string `json:"name"` 129 Type string `json:"type"` 130 Description string `json:"description"` 131 ContractID string `json:"contractId,omitempty"` 132 GroupID int `json:"groupId,omitempty"` 133 SyncPoint int `json:"syncPoint"` 134 List []string `json:"list"` 135 UniqueID string `json:"uniqueId"` 136 } 137 138 // UpdateNetworkListResponse contains response from CreateNetworkList method 139 UpdateNetworkListResponse struct { 140 Links struct { 141 Create struct { 142 Href string `json:"href"` 143 Method string `json:"method"` 144 } `json:"create"` 145 } `json:"links"` 146 NetworkLists []struct { 147 ElementCount int `json:"elementCount"` 148 Links struct { 149 ActivateInProduction struct { 150 Href string `json:"href"` 151 Method string `json:"method"` 152 } `json:"activateInProduction"` 153 ActivateInStaging struct { 154 Href string `json:"href"` 155 Method string `json:"method"` 156 } `json:"activateInStaging"` 157 AppendItems struct { 158 Href string `json:"href"` 159 Method string `json:"method"` 160 } `json:"appendItems"` 161 Retrieve struct { 162 Href string `json:"href"` 163 } `json:"retrieve"` 164 StatusInProduction struct { 165 Href string `json:"href"` 166 } `json:"statusInProduction"` 167 StatusInStaging struct { 168 Href string `json:"href"` 169 } `json:"statusInStaging"` 170 Update struct { 171 Href string `json:"href"` 172 Method string `json:"method"` 173 } `json:"update"` 174 } `json:"links"` 175 Name string `json:"name"` 176 NetworkListType string `json:"networkListType"` 177 ReadOnly bool `json:"readOnly"` 178 Shared bool `json:"shared"` 179 SyncPoint int `json:"syncPoint"` 180 Type string `json:"type"` 181 UniqueID string `json:"uniqueId"` 182 AccessControlGroup string `json:"accessControlGroup,omitempty"` 183 Description string `json:"description,omitempty"` 184 } `json:"networkLists"` 185 } 186 187 // RemoveNetworkListRequest contains request parameters for RemoveNetworkList method 188 RemoveNetworkListRequest struct { 189 UniqueID string `json:"-"` 190 } 191 192 // RemoveNetworkListResponse contains response from RemoveNetworkList method 193 RemoveNetworkListResponse struct { 194 Status int `json:"status"` 195 UniqueID string `json:"uniqueId"` 196 SyncPoint int `json:"syncPoint"` 197 } 198 199 // CreateNetworkListResponse contains response from CreateNetworkList method 200 CreateNetworkListResponse struct { 201 Name string `json:"name"` 202 Description string `json:"description,omitempty"` 203 UniqueID string `json:"uniqueId"` 204 SyncPoint int `json:"syncPoint"` 205 Type string `json:"type"` 206 NetworkListType string `json:"networkListType"` 207 ElementCount int `json:"elementCount"` 208 ReadOnly bool `json:"readOnly"` 209 Shared bool `json:"shared"` 210 List []string `json:"list"` 211 Links struct { 212 ActivateInProduction struct { 213 Href string `json:"href"` 214 Method string `json:"method"` 215 } `json:"activateInProduction"` 216 ActivateInStaging struct { 217 Href string `json:"href"` 218 Method string `json:"method"` 219 } `json:"activateInStaging"` 220 AppendItems struct { 221 Href string `json:"href"` 222 Method string `json:"method"` 223 } `json:"appendItems"` 224 Retrieve struct { 225 Href string `json:"href"` 226 } `json:"retrieve"` 227 StatusInProduction struct { 228 Href string `json:"href"` 229 } `json:"statusInProduction"` 230 StatusInStaging struct { 231 Href string `json:"href"` 232 } `json:"statusInStaging"` 233 Update struct { 234 Href string `json:"href"` 235 Method string `json:"method"` 236 } `json:"update"` 237 } `json:"links"` 238 } 239 240 // LinkInfo contains hypermedia link 241 LinkInfo struct { 242 Href string `json:"href,omitempty"` 243 Method string `json:"method,omitempty"` 244 } 245 246 // nolint:revive 247 // NetworkListsResponseLinks contains LinkInfo 248 NetworkListsResponseLinks struct { 249 Create *LinkInfo `json:"create,omitempty"` 250 } 251 252 // nolint:revive 253 // NetworkListsLinks encapsulates the set of API hypermedia 254 NetworkListsLinks struct { 255 ActivateInProduction *LinkInfo `json:"activateInProduction,omitempty"` 256 ActivateInStaging *LinkInfo `json:"activateInStaging,omitempty"` 257 AppendItems *LinkInfo `json:"appendItems,omitempty"` 258 Retrieve *LinkInfo `json:"retrieve,omitempty"` 259 StatusInProduction *LinkInfo `json:"statusInProduction,omitempty"` 260 StatusInStaging *LinkInfo `json:"statusInStaging,omitempty"` 261 Update *LinkInfo `json:"update,omitempty"` 262 } 263 ) 264 265 // Validate validates GetNetworkListRequest 266 func (v GetNetworkListRequest) Validate() error { 267 return validation.Errors{ 268 "UniqueID": validation.Validate(v.UniqueID, validation.Required), 269 }.Filter() 270 } 271 272 // Validate validates CreateNetworkListRequest 273 func (v CreateNetworkListRequest) Validate() error { 274 return validation.Errors{ 275 "Name": validation.Validate(v.Name, validation.Required), 276 }.Filter() 277 } 278 279 // Validate validates UpdateNetworkListRequest 280 func (v UpdateNetworkListRequest) Validate() error { 281 return validation.Errors{ 282 "Name": validation.Validate(v.Name, validation.Required), 283 }.Filter() 284 } 285 286 // Validate validates RemoveNetworkListRequest 287 func (v RemoveNetworkListRequest) Validate() error { 288 return validation.Errors{ 289 "UniqueID": validation.Validate(v.UniqueID, validation.Required), 290 }.Filter() 291 } 292 293 func (p *networklists) GetNetworkList(ctx context.Context, params GetNetworkListRequest) (*GetNetworkListResponse, error) { 294 if err := params.Validate(); err != nil { 295 return nil, fmt.Errorf("%w: %s", ErrStructValidation, err.Error()) 296 } 297 298 logger := p.Log(ctx) 299 logger.Debug("GetNetworkList") 300 301 var rval GetNetworkListResponse 302 303 uri := fmt.Sprintf( 304 "/network-list/v2/network-lists/%s", 305 params.UniqueID) 306 307 req, err := http.NewRequestWithContext(ctx, http.MethodGet, uri, nil) 308 if err != nil { 309 return nil, fmt.Errorf("failed to create getnetworklist request: %s", err.Error()) 310 } 311 312 resp, err := p.Exec(req, &rval) 313 if err != nil { 314 return nil, fmt.Errorf("getnetworklist request failed: %s", err.Error()) 315 } 316 317 if resp.StatusCode != http.StatusOK { 318 return nil, p.Error(resp) 319 } 320 321 return &rval, nil 322 323 } 324 325 func (p *networklists) GetNetworkLists(ctx context.Context, params GetNetworkListsRequest) (*GetNetworkListsResponse, error) { 326 327 logger := p.Log(ctx) 328 logger.Debug("GetNetworkLists") 329 330 var rval GetNetworkListsResponse 331 var rvalfiltered GetNetworkListsResponse 332 333 uri := 334 "/network-list/v2/network-lists" 335 336 req, err := http.NewRequestWithContext(ctx, http.MethodGet, uri, nil) 337 if err != nil { 338 return nil, fmt.Errorf("failed to create getnetworklists request: %s", err.Error()) 339 } 340 341 resp, err := p.Exec(req, &rval) 342 if err != nil { 343 return nil, fmt.Errorf("getnetworklists request failed: %s", err.Error()) 344 } 345 346 if resp.StatusCode != http.StatusOK { 347 return nil, p.Error(resp) 348 } 349 350 if params.Name == "" && params.Type == "" { 351 return &rval, nil 352 } 353 354 rvalfiltered.Links = rval.Links 355 for _, val := range rval.NetworkLists { 356 if (params.Name == "" || params.Name == val.Name) && (params.Type == "" || params.Type == val.Type) { 357 rvalfiltered.NetworkLists = append(rvalfiltered.NetworkLists, val) 358 } 359 } 360 361 return &rvalfiltered, nil 362 } 363 364 func (p *networklists) UpdateNetworkList(ctx context.Context, params UpdateNetworkListRequest) (*UpdateNetworkListResponse, error) { 365 if err := params.Validate(); err != nil { 366 return nil, fmt.Errorf("%w: %s", ErrStructValidation, err.Error()) 367 } 368 369 logger := p.Log(ctx) 370 logger.Debug("UpdateNetworkList") 371 372 putURL := fmt.Sprintf( 373 "/network-list/v2/network-lists/%s", 374 params.UniqueID, 375 ) 376 377 req, err := http.NewRequestWithContext(ctx, http.MethodPut, putURL, nil) 378 if err != nil { 379 return nil, fmt.Errorf("failed to create update NetworkListrequest: %s", err.Error()) 380 } 381 382 var rval UpdateNetworkListResponse 383 resp, err := p.Exec(req, &rval, params) 384 if err != nil { 385 return nil, fmt.Errorf("update NetworkList request failed: %s", err.Error()) 386 } 387 388 if resp.StatusCode != http.StatusOK && resp.StatusCode != http.StatusCreated { 389 return nil, p.Error(resp) 390 } 391 392 return &rval, nil 393 } 394 395 func (p *networklists) CreateNetworkList(ctx context.Context, params CreateNetworkListRequest) (*CreateNetworkListResponse, error) { 396 if err := params.Validate(); err != nil { 397 return nil, fmt.Errorf("%w: %s", ErrStructValidation, err.Error()) 398 } 399 400 logger := p.Log(ctx) 401 logger.Debug("CreateNetworkList") 402 403 uri := 404 "/network-list/v2/network-lists" 405 406 req, err := http.NewRequestWithContext(ctx, http.MethodPost, uri, nil) 407 if err != nil { 408 return nil, fmt.Errorf("failed to create create networklist request: %s", err.Error()) 409 } 410 411 var rval CreateNetworkListResponse 412 413 resp, err := p.Exec(req, &rval, params) 414 if err != nil { 415 return nil, fmt.Errorf("create networklistrequest failed: %s", err.Error()) 416 } 417 418 if resp.StatusCode != http.StatusOK && resp.StatusCode != http.StatusCreated { 419 return nil, p.Error(resp) 420 } 421 422 return &rval, nil 423 424 } 425 426 func (p *networklists) RemoveNetworkList(ctx context.Context, params RemoveNetworkListRequest) (*RemoveNetworkListResponse, error) { 427 if err := params.Validate(); err != nil { 428 return nil, fmt.Errorf("%w: %s", ErrStructValidation, err.Error()) 429 } 430 431 var rval RemoveNetworkListResponse 432 433 logger := p.Log(ctx) 434 logger.Debug("RemoveNetworkList") 435 436 uri, err := url.Parse(fmt.Sprintf( 437 "/network-list/v2/network-lists/%s", 438 params.UniqueID), 439 ) 440 if err != nil { 441 return nil, fmt.Errorf("failed to parse url: %s", err.Error()) 442 } 443 444 req, err := http.NewRequestWithContext(ctx, http.MethodDelete, uri.String(), nil) 445 if err != nil { 446 return nil, fmt.Errorf("failed to create RemoveNetworkList request: %s", err.Error()) 447 } 448 449 resp, err := p.Exec(req, &rval) 450 if err != nil { 451 return nil, fmt.Errorf("RemoveNetworkList request failed: %s", err.Error()) 452 } 453 454 if resp.StatusCode != http.StatusNoContent && resp.StatusCode != http.StatusOK { 455 return nil, p.Error(resp) 456 } 457 458 return &rval, nil 459 }