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