github.com/akamai/AkamaiOPEN-edgegrid-golang/v2@v2.17.0/pkg/appsec/configuration.go (about)

     1  package appsec
     2  
     3  import (
     4  	"context"
     5  	"fmt"
     6  	"net/http"
     7  
     8  	validation "github.com/go-ozzo/ozzo-validation/v4"
     9  )
    10  
    11  type (
    12  	// The Configuration interface supports creating, retrieving, updating and deleting security configurations.
    13  	//
    14  	// https://developer.akamai.com/api/cloud_security/application_security/v1.html#configuration
    15  	Configuration interface {
    16  		// https://developer.akamai.com/api/cloud_security/application_security/v1.html#getconfigurations
    17  		GetConfigurations(ctx context.Context, params GetConfigurationsRequest) (*GetConfigurationsResponse, error)
    18  
    19  		// https://developer.akamai.com/api/cloud_security/application_security/v1.html#getconfigurations
    20  		GetConfiguration(ctx context.Context, params GetConfigurationRequest) (*GetConfigurationResponse, error)
    21  
    22  		// https://developer.akamai.com/api/cloud_security/application_security/v1.html#postconfigurations
    23  		CreateConfiguration(ctx context.Context, params CreateConfigurationRequest) (*CreateConfigurationResponse, error)
    24  
    25  		UpdateConfiguration(ctx context.Context, params UpdateConfigurationRequest) (*UpdateConfigurationResponse, error)
    26  
    27  		RemoveConfiguration(ctx context.Context, params RemoveConfigurationRequest) (*RemoveConfigurationResponse, error)
    28  	}
    29  
    30  	// GetConfigurationsRequest is used to list the available security configurations.
    31  	GetConfigurationsRequest struct {
    32  		ConfigID int    `json:"configId"`
    33  		Name     string `json:"-"`
    34  	}
    35  
    36  	// GetConfigurationsResponse is returned from a call to GetConfigurations.
    37  	GetConfigurationsResponse struct {
    38  		Configurations []struct {
    39  			Description         string   `json:"description,omitempty"`
    40  			FileType            string   `json:"fileType,omitempty"`
    41  			ID                  int      `json:"id,omitempty"`
    42  			LatestVersion       int      `json:"latestVersion,omitempty"`
    43  			Name                string   `json:"name,omitempty"`
    44  			StagingVersion      int      `json:"stagingVersion,omitempty"`
    45  			TargetProduct       string   `json:"targetProduct,omitempty"`
    46  			ProductionHostnames []string `json:"productionHostnames,omitempty"`
    47  			ProductionVersion   int      `json:"productionVersion,omitempty"`
    48  		} `json:"configurations,omitempty"`
    49  	}
    50  
    51  	// GetConfigurationRequest GetConfigurationRequest is used to retrieve information about a specific configuration.
    52  	GetConfigurationRequest struct {
    53  		ConfigID int `json:"configId"`
    54  	}
    55  
    56  	// GetConfigurationResponse is returned from a call to GetConfiguration.
    57  	GetConfigurationResponse struct {
    58  		Description         string   `json:"description,omitempty"`
    59  		FileType            string   `json:"fileType,omitempty"`
    60  		ID                  int      `json:"id,omitempty"`
    61  		LatestVersion       int      `json:"latestVersion,omitempty"`
    62  		Name                string   `json:"name,omitempty"`
    63  		StagingVersion      int      `json:"stagingVersion,omitempty"`
    64  		TargetProduct       string   `json:"targetProduct,omitempty"`
    65  		ProductionHostnames []string `json:"productionHostnames,omitempty"`
    66  		ProductionVersion   int      `json:"productionVersion,omitempty"`
    67  	}
    68  
    69  	// CreateConfigurationRequest is used to create a new WAP or KSD security configuration.
    70  	CreateConfigurationRequest struct {
    71  		Name        string   `json:"name"`
    72  		Description string   `json:"description"`
    73  		ContractID  string   `json:"contractId"`
    74  		GroupID     int      `json:"groupId"`
    75  		Hostnames   []string `json:"hostnames"`
    76  	}
    77  
    78  	// CreateConfigurationResponse is returned from a call to CreateConfiguration.
    79  	CreateConfigurationResponse struct {
    80  		ConfigID    int    `json:"configId"`
    81  		Version     int    `json:"version"`
    82  		Description string `json:"description"`
    83  		Name        string `json:"name"`
    84  	}
    85  
    86  	// UpdateConfigurationRequest is used tdo modify the name or description of an existing security configuration.
    87  	UpdateConfigurationRequest struct {
    88  		ConfigID    int    `json:"-"`
    89  		Name        string `json:"name"`
    90  		Description string `json:"description"`
    91  	}
    92  
    93  	// UpdateConfigurationResponse  is returned from a call to UpdateConfiguration.
    94  	UpdateConfigurationResponse struct {
    95  		Name        string `json:"name"`
    96  		Description string `json:"description"`
    97  	}
    98  
    99  	// RemoveConfigurationRequest is used to remove an existing security configuration.
   100  	RemoveConfigurationRequest struct {
   101  		ConfigID int `json:"configId"`
   102  	}
   103  
   104  	// RemoveConfigurationResponse is returned from a call to RemoveConfiguration.
   105  	RemoveConfigurationResponse struct {
   106  		Empty int `json:"-"`
   107  	}
   108  )
   109  
   110  // Validate validates a GetConfigurationRequest.
   111  func (v GetConfigurationRequest) Validate() error {
   112  	return validation.Errors{
   113  		"ConfigID": validation.Validate(v.ConfigID, validation.Required),
   114  	}.Filter()
   115  }
   116  
   117  // Validate validates a GetConfigurationsRequest.
   118  func (v GetConfigurationsRequest) Validate() error {
   119  	return validation.Errors{
   120  		"ConfigID": validation.Validate(v.ConfigID, validation.Required),
   121  	}.Filter()
   122  }
   123  
   124  // Validate validates an UpdateConfigurationRequest.
   125  func (v UpdateConfigurationRequest) Validate() error {
   126  	return validation.Errors{
   127  		"ConfigID": validation.Validate(v.ConfigID, validation.Required),
   128  	}.Filter()
   129  }
   130  
   131  // Validate validates a RemoveConfigurationRequest.
   132  func (v RemoveConfigurationRequest) Validate() error {
   133  	return validation.Errors{
   134  		"ConfigID": validation.Validate(v.ConfigID, validation.Required),
   135  	}.Filter()
   136  }
   137  
   138  func (p *appsec) GetConfiguration(ctx context.Context, params GetConfigurationRequest) (*GetConfigurationResponse, error) {
   139  	logger := p.Log(ctx)
   140  	logger.Debug("GetConfiguration")
   141  
   142  	if err := params.Validate(); err != nil {
   143  		return nil, fmt.Errorf("%w: %s", ErrStructValidation, err.Error())
   144  	}
   145  
   146  	var getConfigurationResponse GetConfigurationResponse
   147  
   148  	configid := params.ConfigID
   149  	uri := fmt.Sprintf("/appsec/v1/configs/%d", configid)
   150  
   151  	req, err := http.NewRequestWithContext(ctx, http.MethodGet, uri, nil)
   152  	if err != nil {
   153  		return nil, fmt.Errorf("failed to create GetConfiguration request: %w", err)
   154  	}
   155  
   156  	resp, err := p.Exec(req, &getConfigurationResponse)
   157  	if err != nil {
   158  		return nil, fmt.Errorf("get configuration request failed: %w", err)
   159  	}
   160  
   161  	if resp.StatusCode != http.StatusOK {
   162  		return nil, p.Error(resp)
   163  	}
   164  
   165  	return &getConfigurationResponse, nil
   166  
   167  }
   168  
   169  func (p *appsec) GetConfigurations(ctx context.Context, _ GetConfigurationsRequest) (*GetConfigurationsResponse, error) {
   170  	logger := p.Log(ctx)
   171  	logger.Debug("GetConfigurations")
   172  
   173  	var result GetConfigurationsResponse
   174  
   175  	uri := "/appsec/v1/configs"
   176  
   177  	req, err := http.NewRequestWithContext(ctx, http.MethodGet, uri, nil)
   178  	if err != nil {
   179  		return nil, fmt.Errorf("failed to create GetConfigurations request: %w", err)
   180  	}
   181  
   182  	resp, err := p.Exec(req, &result)
   183  	if err != nil {
   184  		return nil, fmt.Errorf("get configurations request failed: %w", err)
   185  	}
   186  
   187  	if resp.StatusCode != http.StatusOK {
   188  		return nil, p.Error(resp)
   189  	}
   190  
   191  	return &result, nil
   192  }
   193  
   194  func (p *appsec) UpdateConfiguration(ctx context.Context, params UpdateConfigurationRequest) (*UpdateConfigurationResponse, error) {
   195  	logger := p.Log(ctx)
   196  	logger.Debug("UpdateConfiguration")
   197  
   198  	if err := params.Validate(); err != nil {
   199  		return nil, fmt.Errorf("%w: %s", ErrStructValidation, err.Error())
   200  	}
   201  
   202  	uri := fmt.Sprintf(
   203  		"/appsec/v1/configs/%d",
   204  		params.ConfigID,
   205  	)
   206  
   207  	req, err := http.NewRequestWithContext(ctx, http.MethodPut, uri, nil)
   208  	if err != nil {
   209  		return nil, fmt.Errorf("failed to create UpdateConfiguration request: %w", err)
   210  	}
   211  
   212  	var result UpdateConfigurationResponse
   213  	resp, err := p.Exec(req, &result, params)
   214  	if err != nil {
   215  		return nil, fmt.Errorf("update configuration request failed: %w", err)
   216  	}
   217  
   218  	if resp.StatusCode != http.StatusOK && resp.StatusCode != http.StatusCreated {
   219  		return nil, p.Error(resp)
   220  	}
   221  
   222  	return &result, nil
   223  }
   224  
   225  func (p *appsec) CreateConfiguration(ctx context.Context, params CreateConfigurationRequest) (*CreateConfigurationResponse, error) {
   226  	logger := p.Log(ctx)
   227  	logger.Debug("CreateConfiguration")
   228  
   229  	uri :=
   230  		"/appsec/v1/configs"
   231  
   232  	req, err := http.NewRequestWithContext(ctx, http.MethodPost, uri, nil)
   233  	if err != nil {
   234  		return nil, fmt.Errorf("failed to create CreateConfiguration request: %w", err)
   235  	}
   236  
   237  	var result CreateConfigurationResponse
   238  	resp, err := p.Exec(req, &result, params)
   239  	if err != nil {
   240  		return nil, fmt.Errorf("create configuration request failed: %w", err)
   241  	}
   242  
   243  	if resp.StatusCode != http.StatusOK && resp.StatusCode != http.StatusCreated {
   244  		return nil, p.Error(resp)
   245  	}
   246  
   247  	return &result, nil
   248  }
   249  
   250  func (p *appsec) RemoveConfiguration(ctx context.Context, params RemoveConfigurationRequest) (*RemoveConfigurationResponse, error) {
   251  	logger := p.Log(ctx)
   252  	logger.Debug("RemoveConfiguration")
   253  
   254  	if err := params.Validate(); err != nil {
   255  		return nil, fmt.Errorf("%w: %s", ErrStructValidation, err.Error())
   256  	}
   257  
   258  	uri := fmt.Sprintf("/appsec/v1/configs/%d", params.ConfigID)
   259  	req, err := http.NewRequestWithContext(ctx, http.MethodDelete, uri, nil)
   260  	if err != nil {
   261  		return nil, fmt.Errorf("failed to create RemoveConfiguration request: %w", err)
   262  	}
   263  
   264  	var result RemoveConfigurationResponse
   265  	resp, err := p.Exec(req, &result)
   266  	if err != nil {
   267  		return nil, fmt.Errorf("remove configuration request failed: %w", err)
   268  	}
   269  
   270  	if resp.StatusCode != http.StatusNoContent && resp.StatusCode != http.StatusOK {
   271  		return nil, p.Error(resp)
   272  	}
   273  
   274  	return &result, nil
   275  }