mirror of
https://github.com/StackExchange/dnscontrol.git
synced 2024-09-20 14:56:20 +08:00
7fd6a74e0c
Co-authored-by: Josh Zhang <jzhang1@stackoverflow.com>
186 lines
7.2 KiB
Go
186 lines
7.2 KiB
Go
package cloudflare
|
|
|
|
import (
|
|
"context"
|
|
"fmt"
|
|
"net/http"
|
|
"time"
|
|
|
|
"github.com/goccy/go-json"
|
|
)
|
|
|
|
// APIShieldOperation represents an operation stored in API Shield Endpoint Management.
|
|
type APIShieldOperation struct {
|
|
APIShieldBasicOperation
|
|
ID string `json:"operation_id"`
|
|
LastUpdated *time.Time `json:"last_updated"`
|
|
Features map[string]any `json:"features,omitempty"`
|
|
}
|
|
|
|
// GetAPIShieldOperationParams represents the parameters to pass when retrieving an operation.
|
|
//
|
|
// API documentation: https://developers.cloudflare.com/api/operations/api-shield-endpoint-management-retrieve-information-about-an-operation
|
|
type GetAPIShieldOperationParams struct {
|
|
// The Operation ID to retrieve
|
|
OperationID string `url:"-"`
|
|
// Features represents a set of features to return in `features` object when
|
|
// performing making read requests against an Operation or listing operations.
|
|
Features []string `url:"feature,omitempty"`
|
|
}
|
|
|
|
// CreateAPIShieldOperationsParams represents the parameters to pass when adding one or more operations.
|
|
//
|
|
// API documentation: https://developers.cloudflare.com/api/operations/api-shield-endpoint-management-add-operations-to-a-zone
|
|
type CreateAPIShieldOperationsParams struct {
|
|
// Operations are a slice of operations to be created in API Shield Endpoint Management
|
|
Operations []APIShieldBasicOperation `url:"-"`
|
|
}
|
|
|
|
// APIShieldBasicOperation should be used when creating an operation in API Shield Endpoint Management.
|
|
type APIShieldBasicOperation struct {
|
|
Method string `json:"method"`
|
|
Host string `json:"host"`
|
|
Endpoint string `json:"endpoint"`
|
|
}
|
|
|
|
// DeleteAPIShieldOperationParams represents the parameters to pass to delete an operation.
|
|
//
|
|
// API documentation: https://developers.cloudflare.com/api/operations/api-shield-endpoint-management-delete-an-operation
|
|
type DeleteAPIShieldOperationParams struct {
|
|
// OperationID is the operation to be deleted
|
|
OperationID string `url:"-"`
|
|
}
|
|
|
|
// ListAPIShieldOperationsParams represents the parameters to pass when retrieving operations
|
|
//
|
|
// API documentation: https://developers.cloudflare.com/api/operations/api-shield-endpoint-management-retrieve-information-about-all-operations-on-a-zone
|
|
type ListAPIShieldOperationsParams struct {
|
|
// Features represents a set of features to return in `features` object when
|
|
// performing making read requests against an Operation or listing operations.
|
|
Features []string `url:"feature,omitempty"`
|
|
// Direction to order results.
|
|
Direction string `url:"direction,omitempty"`
|
|
// OrderBy when requesting a feature, the feature keys are available for ordering as well, e.g., thresholds.suggested_threshold.
|
|
OrderBy string `url:"order,omitempty"`
|
|
// Filters to only return operations that match filtering criteria, see APIShieldGetOperationsFilters
|
|
APIShieldListOperationsFilters
|
|
// Pagination options to apply to the request.
|
|
PaginationOptions
|
|
}
|
|
|
|
// APIShieldListOperationsFilters represents the filtering query parameters to set when retrieving operations
|
|
//
|
|
// API documentation: https://developers.cloudflare.com/api/operations/api-shield-endpoint-management-retrieve-information-about-all-operations-on-a-zone
|
|
type APIShieldListOperationsFilters struct {
|
|
// Hosts filters results to only include the specified hosts.
|
|
Hosts []string `url:"host,omitempty"`
|
|
// Methods filters results to only include the specified methods.
|
|
Methods []string `url:"method,omitempty"`
|
|
// Endpoint filter results to only include endpoints containing this pattern.
|
|
Endpoint string `url:"endpoint,omitempty"`
|
|
}
|
|
|
|
// APIShieldGetOperationResponse represents the response from the api_gateway/operations/{id} endpoint.
|
|
type APIShieldGetOperationResponse struct {
|
|
Result APIShieldOperation `json:"result"`
|
|
Response
|
|
}
|
|
|
|
// APIShieldGetOperationsResponse represents the response from the api_gateway/operations endpoint.
|
|
type APIShieldGetOperationsResponse struct {
|
|
Result []APIShieldOperation `json:"result"`
|
|
ResultInfo `json:"result_info"`
|
|
Response
|
|
}
|
|
|
|
// APIShieldDeleteOperationResponse represents the response from the api_gateway/operations/{id} endpoint (DELETE).
|
|
type APIShieldDeleteOperationResponse struct {
|
|
Result interface{} `json:"result"`
|
|
Response
|
|
}
|
|
|
|
// GetAPIShieldOperation returns information about an operation
|
|
//
|
|
// API documentation https://developers.cloudflare.com/api/operations/api-shield-endpoint-management-retrieve-information-about-an-operation
|
|
func (api *API) GetAPIShieldOperation(ctx context.Context, rc *ResourceContainer, params GetAPIShieldOperationParams) (*APIShieldOperation, error) {
|
|
path := fmt.Sprintf("/zones/%s/api_gateway/operations/%s", rc.Identifier, params.OperationID)
|
|
|
|
uri := buildURI(path, params)
|
|
|
|
res, err := api.makeRequestContext(ctx, http.MethodGet, uri, nil)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
var asResponse APIShieldGetOperationResponse
|
|
err = json.Unmarshal(res, &asResponse)
|
|
if err != nil {
|
|
return nil, fmt.Errorf("%s: %w", errUnmarshalError, err)
|
|
}
|
|
|
|
return &asResponse.Result, nil
|
|
}
|
|
|
|
// ListAPIShieldOperations retrieve information about all operations on a zone
|
|
//
|
|
// API documentation https://developers.cloudflare.com/api/operations/api-shield-endpoint-management-retrieve-information-about-all-operations-on-a-zone
|
|
func (api *API) ListAPIShieldOperations(ctx context.Context, rc *ResourceContainer, params ListAPIShieldOperationsParams) ([]APIShieldOperation, ResultInfo, error) {
|
|
path := fmt.Sprintf("/zones/%s/api_gateway/operations", rc.Identifier)
|
|
|
|
uri := buildURI(path, params)
|
|
|
|
res, err := api.makeRequestContext(ctx, http.MethodGet, uri, nil)
|
|
if err != nil {
|
|
return nil, ResultInfo{}, err
|
|
}
|
|
|
|
var asResponse APIShieldGetOperationsResponse
|
|
err = json.Unmarshal(res, &asResponse)
|
|
if err != nil {
|
|
return nil, ResultInfo{}, fmt.Errorf("%s: %w", errUnmarshalError, err)
|
|
}
|
|
|
|
return asResponse.Result, asResponse.ResultInfo, nil
|
|
}
|
|
|
|
// CreateAPIShieldOperations add one or more operations to a zone.
|
|
//
|
|
// API documentation https://developers.cloudflare.com/api/operations/api-shield-endpoint-management-add-operations-to-a-zone
|
|
func (api *API) CreateAPIShieldOperations(ctx context.Context, rc *ResourceContainer, params CreateAPIShieldOperationsParams) ([]APIShieldOperation, error) {
|
|
uri := fmt.Sprintf("/zones/%s/api_gateway/operations", rc.Identifier)
|
|
|
|
res, err := api.makeRequestContext(ctx, http.MethodPost, uri, params.Operations)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
// Result should be all the operations added to the zone, similar to doing GetAPIShieldOperations
|
|
var asResponse APIShieldGetOperationsResponse
|
|
err = json.Unmarshal(res, &asResponse)
|
|
if err != nil {
|
|
return nil, fmt.Errorf("%s: %w", errUnmarshalError, err)
|
|
}
|
|
|
|
return asResponse.Result, nil
|
|
}
|
|
|
|
// DeleteAPIShieldOperation deletes a single operation
|
|
//
|
|
// API documentation https://developers.cloudflare.com/api/operations/api-shield-endpoint-management-delete-an-operation
|
|
func (api *API) DeleteAPIShieldOperation(ctx context.Context, rc *ResourceContainer, params DeleteAPIShieldOperationParams) error {
|
|
uri := fmt.Sprintf("/zones/%s/api_gateway/operations/%s", rc.Identifier, params.OperationID)
|
|
|
|
res, err := api.makeRequestContext(ctx, http.MethodDelete, uri, nil)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
var asResponse APIShieldDeleteOperationResponse
|
|
err = json.Unmarshal(res, &asResponse)
|
|
if err != nil {
|
|
return fmt.Errorf("%s: %w", errUnmarshalError, err)
|
|
}
|
|
|
|
return nil
|
|
}
|