Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

DLP-1223: Add support for DLP EDM and CWL datasets #1485

Merged
merged 2 commits into from
Jan 24, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
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
Loading