dnscontrol/pkg/cloudflare-go/dlp_dataset.go
Tom Limoncelli 7fd6a74e0c
CLOUDFLAREAPI: CF_REDIRECT/CF_TEMP_REDIRECT should dtrt using Single Redirects (#3002)
Co-authored-by: Josh Zhang <jzhang1@stackoverflow.com>
2024-06-18 17:38:50 -04:00

278 lines
8.2 KiB
Go

package cloudflare
import (
"context"
"errors"
"fmt"
"net/http"
"time"
"github.com/goccy/go-json"
)
var (
ErrMissingDatasetID = errors.New("missing required dataset ID")
)
// DLPDatasetUpload represents a single upload version attached to a DLP dataset.
type DLPDatasetUpload struct {
NumCells int `json:"num_cells"`
Status string `json:"status,omitempty"`
Version int `json:"version"`
}
// DLPDataset represents a DLP Exact Data Match dataset or Custom Word List.
type DLPDataset struct {
CreatedAt *time.Time `json:"created_at,omitempty"`
Description string `json:"description,omitempty"`
ID string `json:"id,omitempty"`
Name string `json:"name,omitempty"`
NumCells int `json:"num_cells"`
Secret *bool `json:"secret,omitempty"`
Status string `json:"status,omitempty"`
UpdatedAt *time.Time `json:"updated_at,omitempty"`
Uploads []DLPDatasetUpload `json:"uploads"`
}
type ListDLPDatasetsParams struct{}
type DLPDatasetListResponse struct {
Result []DLPDataset `json:"result"`
Response
}
// ListDLPDatasets returns all the DLP datasets associated with an account.
//
// API reference: https://developers.cloudflare.com/api/operations/dlp-datasets-read-all
func (api *API) ListDLPDatasets(ctx context.Context, rc *ResourceContainer, params ListDLPDatasetsParams) ([]DLPDataset, error) {
if rc.Identifier == "" {
return nil, nil
}
uri := buildURI(fmt.Sprintf("/%s/%s/dlp/datasets", rc.Level, rc.Identifier), nil)
res, err := api.makeRequestContext(ctx, http.MethodGet, uri, nil)
if err != nil {
return nil, err
}
var dlpDatasetListResponse DLPDatasetListResponse
err = json.Unmarshal(res, &dlpDatasetListResponse)
if err != nil {
return nil, fmt.Errorf("%s: %w", errUnmarshalError, err)
}
return dlpDatasetListResponse.Result, nil
}
type DLPDatasetGetResponse struct {
Result DLPDataset `json:"result"`
Response
}
// GetDLPDataset returns a DLP dataset based on the dataset ID.
//
// API reference: https://developers.cloudflare.com/api/operations/dlp-datasets-read
func (api *API) GetDLPDataset(ctx context.Context, rc *ResourceContainer, datasetID string) (DLPDataset, error) {
if rc.Identifier == "" {
return DLPDataset{}, nil
}
if datasetID == "" {
return DLPDataset{}, ErrMissingDatasetID
}
uri := buildURI(fmt.Sprintf("/%s/%s/dlp/datasets/%s", rc.Level, rc.Identifier, datasetID), nil)
res, err := api.makeRequestContext(ctx, http.MethodGet, uri, nil)
if err != nil {
return DLPDataset{}, err
}
var dlpDatasetGetResponse DLPDatasetGetResponse
err = json.Unmarshal(res, &dlpDatasetGetResponse)
if err != nil {
return DLPDataset{}, fmt.Errorf("%s: %w", errUnmarshalError, err)
}
return dlpDatasetGetResponse.Result, nil
}
type CreateDLPDatasetParams struct {
Description string `json:"description,omitempty"`
Name string `json:"name"`
Secret *bool `json:"secret,omitempty"`
}
type CreateDLPDatasetResult struct {
MaxCells int `json:"max_cells"`
Secret string `json:"secret"`
Version int `json:"version"`
Dataset DLPDataset `json:"dataset"`
}
type CreateDLPDatasetResponse struct {
Result CreateDLPDatasetResult `json:"result"`
Response
}
// CreateDLPDataset creates a DLP dataset.
//
// API reference: https://developers.cloudflare.com/api/operations/dlp-datasets-create
func (api *API) CreateDLPDataset(ctx context.Context, rc *ResourceContainer, params CreateDLPDatasetParams) (CreateDLPDatasetResult, error) {
if rc.Identifier == "" {
return CreateDLPDatasetResult{}, nil
}
uri := buildURI(fmt.Sprintf("/%s/%s/dlp/datasets", rc.Level, rc.Identifier), nil)
res, err := api.makeRequestContext(ctx, http.MethodPost, uri, params)
if err != nil {
return CreateDLPDatasetResult{}, err
}
var CreateDLPDatasetResponse CreateDLPDatasetResponse
err = json.Unmarshal(res, &CreateDLPDatasetResponse)
if err != nil {
return CreateDLPDatasetResult{}, fmt.Errorf("%s: %w", errUnmarshalError, err)
}
return CreateDLPDatasetResponse.Result, nil
}
// DeleteDLPDataset deletes a DLP dataset.
//
// API reference: https://developers.cloudflare.com/api/operations/dlp-datasets-delete
func (api *API) DeleteDLPDataset(ctx context.Context, rc *ResourceContainer, datasetID string) error {
if rc.Identifier == "" {
return ErrMissingResourceIdentifier
}
if datasetID == "" {
return ErrMissingDatasetID
}
uri := buildURI(fmt.Sprintf("/%s/%s/dlp/datasets/%s", rc.Level, rc.Identifier, datasetID), nil)
_, err := api.makeRequestContext(ctx, http.MethodDelete, uri, nil)
return err
}
type UpdateDLPDatasetParams struct {
DatasetID string
Description *string `json:"description,omitempty"` // nil to leave descrption as-is
Name *string `json:"name,omitempty"` // nil to leave name as-is
}
type UpdateDLPDatasetResponse struct {
Result DLPDataset `json:"result"`
Response
}
// UpdateDLPDataset updates the details of a DLP dataset.
//
// API reference: https://developers.cloudflare.com/api/operations/dlp-datasets-update
func (api *API) UpdateDLPDataset(ctx context.Context, rc *ResourceContainer, params UpdateDLPDatasetParams) (DLPDataset, error) {
if rc.Identifier == "" {
return DLPDataset{}, nil
}
if params.DatasetID == "" {
return DLPDataset{}, ErrMissingDatasetID
}
uri := buildURI(fmt.Sprintf("/%s/%s/dlp/datasets/%s", rc.Level, rc.Identifier, params.DatasetID), nil)
res, err := api.makeRequestContext(ctx, http.MethodPut, uri, params)
if err != nil {
return DLPDataset{}, err
}
var updateDLPDatasetResponse UpdateDLPDatasetResponse
err = json.Unmarshal(res, &updateDLPDatasetResponse)
if err != nil {
return DLPDataset{}, fmt.Errorf("%s: %w", errUnmarshalError, err)
}
return updateDLPDatasetResponse.Result, nil
}
type CreateDLPDatasetUploadResult struct {
MaxCells int `json:"max_cells"`
Secret string `json:"secret"`
Version int `json:"version"`
}
type CreateDLPDatasetUploadResponse struct {
Result CreateDLPDatasetUploadResult `json:"result"`
Response
}
type CreateDLPDatasetUploadParams struct {
DatasetID string
}
// CreateDLPDatasetUpload creates a new upload version for the specified DLP dataset.
//
// API reference: https://developers.cloudflare.com/api/operations/dlp-datasets-create-version
func (api *API) CreateDLPDatasetUpload(ctx context.Context, rc *ResourceContainer, params CreateDLPDatasetUploadParams) (CreateDLPDatasetUploadResult, error) {
if rc.Identifier == "" {
return CreateDLPDatasetUploadResult{}, nil
}
if params.DatasetID == "" {
return CreateDLPDatasetUploadResult{}, ErrMissingDatasetID
}
uri := buildURI(fmt.Sprintf("/%s/%s/dlp/datasets/%s/upload", rc.Level, rc.Identifier, params.DatasetID), nil)
res, err := api.makeRequestContext(ctx, http.MethodPost, uri, nil)
if err != nil {
return CreateDLPDatasetUploadResult{}, err
}
var dlpDatasetCreateUploadResponse CreateDLPDatasetUploadResponse
err = json.Unmarshal(res, &dlpDatasetCreateUploadResponse)
if err != nil {
return CreateDLPDatasetUploadResult{}, fmt.Errorf("%s: %w", errUnmarshalError, err)
}
return dlpDatasetCreateUploadResponse.Result, nil
}
type UploadDLPDatasetVersionParams struct {
DatasetID string
Version int
Body interface{}
}
type UploadDLPDatasetVersionResponse struct {
Result DLPDataset `json:"result"`
Response
}
// UploadDLPDatasetVersion uploads a new version of the specified DLP dataset.
//
// API reference: https://developers.cloudflare.com/api/operations/dlp-datasets-upload-version
func (api *API) UploadDLPDatasetVersion(ctx context.Context, rc *ResourceContainer, params UploadDLPDatasetVersionParams) (DLPDataset, error) {
if rc.Identifier == "" {
return DLPDataset{}, nil
}
if params.DatasetID == "" {
return DLPDataset{}, ErrMissingDatasetID
}
uri := buildURI(fmt.Sprintf("/%s/%s/dlp/datasets/%s/upload/%d", rc.Level, rc.Identifier, params.DatasetID, params.Version), nil)
res, err := api.makeRequestContext(ctx, http.MethodPost, uri, params.Body)
if err != nil {
return DLPDataset{}, err
}
var dlpDatasetUploadVersionResponse UploadDLPDatasetVersionResponse
err = json.Unmarshal(res, &dlpDatasetUploadVersionResponse)
if err != nil {
return DLPDataset{}, fmt.Errorf("%s: %w", errUnmarshalError, err)
}
return dlpDatasetUploadVersionResponse.Result, nil
}