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