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  }