Skip to content

Commit

Permalink
Merge pull request #1485 from OrionNebula/otrewin/DLP-1223
Browse files Browse the repository at this point in the history
  • Loading branch information
jacobbednarz authored Jan 24, 2024
2 parents 325729d + 8e92261 commit 06a0b2b
Show file tree
Hide file tree
Showing 3 changed files with 703 additions and 0 deletions.
3 changes: 3 additions & 0 deletions .changelog/1485.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
```release-note:enhancement
dlp: add support for EDM and CWL datasets
```
278 changes: 278 additions & 0 deletions dlp_dataset.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,278 @@
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
}
Loading

0 comments on commit 06a0b2b

Please sign in to comment.